Merampingkan hidup Anda menggunakan promptingtools.jl, paket julia yang menyederhanakan berinteraksi dengan model bahasa besar.
Promptingtools.jl tidak dimaksudkan untuk membangun sistem skala besar. Ini dimaksudkan untuk menjadi alat masuk di lingkungan global Anda yang akan menghemat 20 menit setiap hari!
Tip
Melompat ke dokumen
@ai_str dan templating yang mudah Memulai dengan compasingtools.jl semudah mengimpor paket dan menggunakan makro @ai_str untuk pertanyaan Anda.
CATATAN: Anda harus mengatur kunci API OpenAI Anda sebagai variabel lingkungan sebelum menggunakan computedtools.jl (lihat bagian Kunci API Buat OpenAI di bawah).
Setelah pengenalan tagihan prabayar, Anda harus membeli beberapa kredit untuk memulai (minimum $ 5). Untuk awal yang cepat, cukup atur melalui ENV["OPENAI_API_KEY"] = "your-api-key"
Instal PromptingTools:
using Pkg
Pkg . add ( " PromptingTools " )Dan kami siap untuk pergi!
using PromptingTools
ai " What is the capital of France? "
# [ Info: Tokens: 31 @ Cost: $0.0 in 1.5 seconds --> Be in control of your spending!
# AIMessage("The capital of France is Paris.") Objek yang dikembalikan adalah pembungkus cahaya dengan pesan yang dihasilkan di bidang :content (misalnya, ans.content ) untuk pemrosesan hilir tambahan.
Tip
Jika Anda ingin membalas pesan sebelumnya, atau cukup lanjutkan percakapan, gunakan @ai!_str (perhatikan ledakan ! ):
ai! " And what is the population of it? "Anda dapat dengan mudah menyuntikkan variabel apa pun dengan interpolasi string:
country = " Spain "
ai " What is the capital of $ (country)? "
# [ Info: Tokens: 32 @ Cost: $0.0001 in 0.5 seconds
# AIMessage("The capital of Spain is Madrid.") Tip
Gunakan bendera setelah-string untuk memilih model yang akan dipanggil, misalnya, ai"What is the capital of France?"gpt4 (Gunakan gpt4t untuk model Turbo GPT-4 baru). Bagus untuk pertanyaan ekstra sulit itu!
Untuk templat prompt yang lebih kompleks, Anda dapat menggunakan templating gaya setang dan memberikan variabel sebagai argumen kata kunci:
msg = aigenerate ( " What is the capital of {{country}}? Is the population larger than {{population}}? " , country = " Spain " , population = " 1M " )
# [ Info: Tokens: 74 @ Cost: $0.0001 in 1.3 seconds
# AIMessage("The capital of Spain is Madrid. And yes, the population of Madrid is larger than 1 million. As of 2020, the estimated population of Madrid is around 3.3 million people.") Tip
Gunakan asyncmap untuk menjalankan beberapa tugas bertenaga AI secara bersamaan.
Tip
Jika Anda menggunakan model lambat (seperti GPT -4), Anda dapat menggunakan versi async dari @ai_str -> @aai_str untuk menghindari memblokir replikan, misalnya, aai"Say hi but slowly!"gpt4 (Demikian pula @ai!_str -> @aai!_str untuk percakapan multi -turn).
Untuk contoh yang lebih praktis, lihat examples/ folder dan bagian Contoh Lanjutan di bawah ini.
@ai_str dan templating yang mudahai* Fungsi Ikhtisarairetry!aigenerate ( api_kwargs )Teknik yang cepat tidak cepat atau mudah. Selain itu, model yang berbeda dan fine-tune mereka mungkin memerlukan format dan trik cepat yang berbeda, atau mungkin informasi yang Anda kerjakan memerlukan model khusus untuk digunakan. Promptingtools.jl dimaksudkan untuk menyatukan petunjuk untuk backend yang berbeda dan membuat tugas umum (seperti petunjuk templated) sesederhana mungkin.
Beberapa fitur:
aigenerate : Sederhanakan templat prompt dengan setang (misalnya, {{variable}} ) dan argumen kata kunci@ai_str string makro : simpan keystrokes dengan makro string untuk prompt sederhanaai... untuk menemukan kemampuan yang lebih baikai* Fungsi Ikhtisar Fungsi penting aiimage aigenerate , aiembed , aiclassify , aiextract , aiscan , aitemplates
Semua fungsi ai* memiliki struktur dasar yang sama:
ai*(<optional schema>,<prompt or conversation>; <optional keyword arguments>) ,
tetapi mereka berbeda dalam tujuan:
aigenerate adalah fungsi tujuan umum untuk menghasilkan respons teks apa pun dengan LLMS, yaitu, mengembalikan AIMessage dengan bidang :content yang berisi teks yang dihasilkan (misalnya, ans.content isa AbstractString )aiembed dirancang untuk mengekstrak embeddings dari respons model AI, yaitu, mengembalikan DataMessage dengan bidang :content yang mengandung embeddings (misalnya, ans.content isa AbstractArray )aiextract dirancang untuk mengekstrak data terstruktur dari respons model AI dan mengembalikannya sebagai struct Julia (misalnya, jika kami memberikan return_type=Food , kami mendapatkan ans.content isa Food ). Anda perlu mendefinisikan tipe pengembalian terlebih dahulu dan kemudian menyediakannya sebagai argumen kata kunci.aitools dirancang untuk alur kerja agen dengan campuran panggilan alat dan input pengguna. Ini dapat bekerja dengan fungsi sederhana dan melaksanakannya.aiclassify dirancang untuk mengklasifikasikan teks input ke dalam (atau hanya merespons di dalam) seperangkat choices diskrit yang disediakan oleh pengguna. Ini bisa sangat berguna sebagai hakim LLM atau router untuk sistem kain, karena menggunakan "trik bias logit" dan menghasilkan tepat 1 token. Ini mengembalikan AIMessage dengan bidang :content , tetapi konten :content hanya dapat menjadi salah satu choices yang disediakan (misalnya, ans.content in choices )aiscan adalah untuk bekerja dengan gambar dan model yang diaktifkan visi (sebagai input), tetapi mengembalikan AIMessage dengan bidang :content yang mengandung teks yang dihasilkan (misalnya, ans.content isa AbstractString ) mirip dengan aigenerate .aiimage adalah untuk menghasilkan gambar (misalnya, dengan Openai Dall-E 3). Ini mengembalikan DataMessage , di mana bidang :content mungkin berisi URL untuk mengunduh gambar dari atau gambar yang dikodekan base64 tergantung pada kwarg yang disediakan pengguna api_kwargs.response_format .aitemplates adalah fungsi pembantu untuk menemukan templat yang tersedia dan melihat detailnya (misalnya, aitemplates("some keyword") atau aitemplates(:AssistantAsk) ) Jika Anda menggunakan model yang diketahui, Anda tidak perlu memberikan schema (argumen pertama).
Argumen kata kunci opsional dalam ai* cenderung:
model::String - model mana yang ingin Anda gunakanverbose::Bool - Apakah Anda pergi untuk melihat log info di sekitar biaya AIreturn_all::Bool - apakah Anda menginginkan seluruh percakapan atau hanya jawaban AI (yaitu, apakah Anda ingin memasukkan input/prompt Anda dalam output)api_kwargs::NamedTuple - Parameter spesifik untuk model, misalnya, temperature=0.0 menjadi tidak kreatif (dan memiliki output yang lebih mirip dalam setiap proses)http_kwargs::NamedTuple - parameter untuk paket http.jl, misalnya, readtimeout = 120 untuk waktu habis dalam 120 detik jika tidak ada respons yang diterima.Eksperimental: AgenTools
Selain daftar fungsi ai* di atas, Anda juga dapat menggunakan rekan -rekan "malas" dari fungsi -fungsi ini dari modul Experimental AgentTools.
using PromptingTools . Experimental . AgentTools Misalnya, AIGenerate() akan membuat instance malas dari aigenerate . Ini adalah instance dari AICall dengan aigenerate sebagai fungsi AI -nya. Ini menggunakan argumen dan argumen kata kunci yang persis sama seperti aigenerate (lihat ?aigenerate untuk detail).
"Malas" mengacu pada fakta bahwa itu tidak menghasilkan output apa pun saat dipakai (hanya ketika run! Dipanggil).
Atau mengatakan secara berbeda, struct AICall dan semua citarasa ( AIGenerate , ...) dirancang untuk memfasilitasi model eksekusi yang ditangguhkan (evaluasi malas) untuk fungsi AI yang berinteraksi dengan model pembelajaran bahasa (LLM). Ini menyimpan informasi yang diperlukan untuk panggilan AI dan mengeksekusi fungsi AI yang mendasari hanya jika disuplai dengan UserMessage atau saat run! metode diterapkan. Ini memungkinkan kita untuk mengingat input pengguna dan memicu panggilan LLM berulang kali jika diperlukan, yang memungkinkan pemasangan otomatis (lihat ?airetry! ).
Jika Anda ingin alur kerja pengikat otomatis yang kuat, Anda dapat menggunakan airetry! , yang memanfaatkan pencarian pohon Monte-Carlo untuk memilih lintasan percakapan yang optimal berdasarkan kebutuhan Anda.
Eksperimental: Ragtools
Terakhir, kami menyediakan satu set alat untuk membangun aplikasi RAG (mengambil, menjawab, menghasilkan).
Ini bisa sesederhana dua panggilan: build_index dan airag (ambil, jawab, hasilkan).
Jika Anda kemudian menggunakan printing yang cukup dengan PromptingTools.pprint , kami menyoroti teks yang dihasilkan vs teks yang kemungkinan bersumber dari konteks dan kami mencetak seberapa kuat jawaban yang dihasilkan yang didukung oleh konteksnya. Selain itu, kami memberi anotasi masing -masing yang dihasilkan dengan referensi dokumen sumber yang kemungkinan berasal (termasuk skor kepercayaan antara 0 dan 1).
Pencarian Google sangat bagus, tetapi ini adalah saklar konteks. Anda sering harus membuka beberapa halaman dan membaca diskusi untuk menemukan jawaban yang Anda butuhkan. Sama dengan situs web ChatGPT.
Bayangkan Anda berada di vscode, mengedit file .gitignore Anda. Bagaimana cara mengabaikan file di semua subfolder lagi?
Yang perlu Anda lakukan adalah mengetik: aai"What to write in .gitignore to ignore file XYZ in any folder or subfolder?"
Dengan aai"" (sebagai lawan ai"" ), kami membuat panggilan yang tidak memblokir ke LLM untuk tidak mencegah Anda melanjutkan pekerjaan Anda. Ketika jawabannya sudah siap, kami mencatatnya dari latar belakang:
[Info: Token: 102 @ Biaya: $ 0,0002 dalam 2,7 detik ┌ Info: AIMESSAGE> Untuk mengabaikan file yang disebut "xyz" di folder atau subfolder apa pun, Anda dapat menambahkan baris berikut ke file .gitignore Anda: │ │ │
│ **/XYZ ││ │ │ │ │ │ │ │ │ │ │**│ │ │ │
Anda mungkin menghemat 3-5 menit pada tugas ini dan mungkin 5-10 menit lagi, karena saklar konteks/gangguan yang Anda hindari. Ini kemenangan kecil, tetapi bertambah dengan cepat.
Anda dapat menggunakan fungsi aigenerate untuk mengganti variabel stang (misalnya, {{name}} ) melalui argumen kata kunci.
msg = aigenerate ( " Say hello to {{name}}! " , name = " World " ) Prompt yang lebih kompleks adalah percakapan secara efektif (satu set pesan), di mana Anda dapat memiliki pesan dari tiga entitas: sistem, pengguna, aiassistant. Kami menyediakan tipe yang sesuai untuk masing -masing: SystemMessage , UserMessage , AIMessage .
using PromptingTools : SystemMessage, UserMessage
conversation = [
SystemMessage ( " You're master Yoda from Star Wars trying to help the user become a Jedi. " ),
UserMessage ( " I have feelings for my {{object}}. What should I do? " )]
msg = aigenerate (conversation; object = " old iPhone " )AIMESSAGE ("Ah, dilema, Anda memiliki. Keterikatan emosional dapat mengaburkan jalan Anda untuk menjadi Jedi. Untuk melekat pada harta benda, Anda tidak boleh. IPhone hanyalah alat, tidak lebih. Lepaskan, Anda harus.
Mencari detasemen, Padawan muda. Merenungkan ketidakkekalan semua hal. Hargai kenangan yang diberikannya kepada Anda, dan dengan penuh syukur berpisah. Dengan ketidakhadirannya, temukan pengalaman baru untuk tumbuh dan menjadi satu dengan kekuatan. Hanya dengan begitu, Jedi sejati, Anda akan menjadi. ")
Anda juga dapat menggunakannya untuk membangun percakapan, misalnya,
new_conversation = vcat (conversation ... ,msg, UserMessage ( " Thank you, master Yoda! Do you have {{object}} to know what it feels like? " ))
aigenerate (new_conversation; object = " old iPhone " )AIMESSAGE ("hmm, memiliki iPhone lama, saya tidak. Tapi pengalaman dengan lampiran, saya punya. Detasemen, saya belajar. Kekuatan dan kebebasan sejati, itu membawa ...")
Dengan LLMS, kualitas / kekokohan hasil Anda tergantung pada kualitas petunjuk Anda. Tapi prompt menulis itu sulit! Itu sebabnya kami menawarkan sistem templating untuk menghemat waktu dan usaha Anda.
Untuk menggunakan templat tertentu (misalnya, `` untuk menanyakan bahasa Julia):
msg = aigenerate ( :JuliaExpertAsk ; ask = " How do I add packages? " ) Di atas setara dengan versi yang lebih bertele -tele yang secara eksplisit menggunakan pengiriman pada AITemplate :
msg = aigenerate ( AITemplate ( :JuliaExpertAsk ); ask = " How do I add packages? " ) Temukan templat yang tersedia dengan aitemplates :
tmps = aitemplates ( " JuliaExpertAsk " )
# Will surface one specific template
# 1-element Vector{AITemplateMetadata}:
# PromptingTools.AITemplateMetadata
# name: Symbol JuliaExpertAsk
# description: String "For asking questions about Julia language. Placeholders: `ask`"
# version: String "1"
# wordcount: Int64 237
# variables: Array{Symbol}((1,))
# system_preview: String "You are a world-class Julia language programmer with the knowledge of the latest syntax. Your commun"
# user_preview: String "# Questionnn{{ask}}"
# source: String ""Di atas memberi Anda ide bagus tentang apa template itu, apa yang tersedia placeholder, dan berapa biaya untuk menggunakannya (= WordCount).
Cari semua templat terkait Julia:
tmps = aitemplates ( " Julia " )
# 2-element Vector{AITemplateMetadata}... -> more to come later! Jika Anda berada di vscode, Anda dapat memanfaatkan tampilan tabular yang bagus dengan vscodedisplay :
using DataFrames
tmps = aitemplates ( " Julia " ) |> DataFrame |> vscodedisplay Saya memiliki template yang saya pilih, bagaimana cara menggunakannya? Cukup gunakan "nama" dalam aigenerate atau aiclassify seperti yang Anda lihat di contoh pertama!
Anda dapat memeriksa templat apa pun dengan "merender" itu (inilah yang akan dilihat LLM):
julia > AITemplate ( :JudgeIsItTrue ) |> PromptingTools . renderLihat lebih banyak contoh dalam contoh/ folder.
Anda dapat memanfaatkan asyncmap untuk menjalankan beberapa tugas bertenaga AI secara bersamaan, meningkatkan kinerja untuk operasi batch.
prompts = [ aigenerate ( " Translate 'Hello, World!' to {{language}} " ; language) for language in [ " Spanish " , " French " , " Mandarin " ]]
responses = asyncmap (aigenerate, prompts)Tip
Anda dapat membatasi jumlah tugas bersamaan dengan kata kunci asyncmap(...; ntasks=10) .
Tugas tertentu membutuhkan model yang lebih kuat. Semua fungsi yang menghadap pengguna memiliki model argumen kata kunci yang dapat digunakan untuk menentukan model yang akan digunakan. Misalnya, Anda dapat menggunakan model = "gpt-4-1106-preview" untuk menggunakan model Turbo GPT-4 terbaru. Namun, tidak ada yang mau mengetiknya!
Kami menawarkan satu set alias model (misalnya, "GPT3", "GPT4", "GPT4T" -> Turbo GPT -4 di atas, dll.) Yang dapat digunakan sebagai gantinya.
Setiap ai... panggilan pertama mencari nama model yang disediakan di kamus PromptingTools.MODEL_ALIASES , sehingga Anda dapat dengan mudah memperpanjang dengan alias Anda sendiri!
const PT = PromptingTools
PT . MODEL_ALIASES[ " gpt4t " ] = " gpt-4-1106-preview " Alias ini juga dapat digunakan sebagai bendera dalam makro @ai_str , misalnya, ai"What is the capital of France?"gpt4t (GPT-4 Turbo memiliki batas pengetahuan pada bulan April 2023, jadi ini berguna untuk pertanyaan yang lebih kontemporer).
Gunakan fungsi aiembed untuk membuat embeddings melalui model openai default yang dapat digunakan untuk pencarian semantik, pengelompokan, dan alur kerja AI yang lebih kompleks.
text_to_embed = " The concept of artificial intelligence. "
msg = aiembed (text_to_embed)
embedding = msg . content # 1536-element Vector{Float64}Jika Anda berencana untuk menghitung jarak cosinus antara embeddings, Anda dapat menormalkannya terlebih dahulu:
using LinearAlgebra
msg = aiembed ([ " embed me " , " and me too " ], LinearAlgebra . normalize)
# calculate cosine distance between the two normalized embeddings as a simple dot product
msg . content ' * msg . content[:, 1 ] # [1.0, 0.787] Anda dapat menggunakan fungsi aiclassify untuk mengklasifikasikan pernyataan yang disediakan sebagai benar/false/tidak diketahui. Ini berguna untuk pemeriksaan fakta, halusinasi atau pemeriksaan NLI, moderasi, penyaringan, analisis sentimen, rekayasa fitur dan banyak lagi.
aiclassify ( " Is two plus two four? " )
# trueSistem permintaan dan model berkualitas lebih tinggi dapat digunakan untuk tugas yang lebih kompleks, termasuk mengetahui kapan harus tunduk pada manusia:
aiclassify ( :JudgeIsItTrue ; it = " Is two plus three a vegetable on Mars? " , model = " gpt4t " )
# unknown Dalam contoh di atas, kami menggunakan templat prompt :JudgeIsItTrue , yang secara otomatis mengembang ke dalam sistem prompt berikut (dan prompt pengguna terpisah):
"Anda adalah hakim AI yang tidak memihak yang mengevaluasi apakah pernyataan yang diberikan itu" benar "atau" salah ". Jawab" tidak diketahui "jika Anda tidak dapat memutuskan."
Untuk informasi lebih lanjut tentang templat, lihat bagian Prompt yang Templated.
aiclassify juga dapat digunakan untuk klasifikasi ke dalam satu set kategori yang ditentukan (maksimum 20), sehingga kami dapat menggunakannya untuk perutean.
Selain itu, jika Anda memberikan pilihan sebagai tupel ( (label, description) ), model akan menggunakan deskripsi untuk memutuskan, tetapi akan mengembalikan label.
Contoh:
choices = [( " A " , " any animal or creature " ), ( " P " , " for any plant or tree " ), ( " O " , " for everything else " )]
input = " spider "
aiclassify ( :InputClassifier ; choices, input) # -> returns "A" for any animal or creature
# Try also with:
input = " daphodil " # -> returns "P" for any plant or tree
input = " castle " # -> returns "O" for everything elseDi bawah kap, kami menggunakan trik "Logit Bias" untuk hanya memaksa 1 token yang dihasilkan - itu berarti sangat murah dan sangat cepat!
Apakah Anda lelah mengekstraksi data dengan regex? Anda dapat menggunakan LLM untuk mengekstrak data terstruktur dari teks!
Yang harus Anda lakukan adalah menentukan struktur data yang ingin Anda ekstrak dan LLM akan melakukan sisanya.
Tentukan return_type dengan struct. Berikan Docstrings jika diperlukan (meningkatkan hasil dan membantu dokumentasi).
Mari kita mulai dengan tugas yang sulit - mengekstraksi cuaca saat ini di lokasi yang diberikan:
@enum TemperatureUnits celsius fahrenheit
""" Extract the current weather in a given location
# Arguments
- `location`: The city and state, e.g. "San Francisco, CA"
- `unit`: The unit of temperature to return, either `celsius` or `fahrenheit`
"""
struct CurrentWeather
location :: String
unit :: Union{Nothing,TemperatureUnits}
end
# Note that we provide the TYPE itself, not an instance of it!
msg = aiextract ( " What's the weather in Salt Lake City in C? " ; return_type = CurrentWeather)
msg . content
# CurrentWeather("Salt Lake City, UT", celsius)Tetapi Anda dapat menggunakannya bahkan untuk tugas yang lebih kompleks, seperti mengekstraksi banyak entitas dari teks:
" Person's age, height, and weight. "
struct MyMeasurement
age :: Int
height :: Union{Int,Nothing}
weight :: Union{Nothing,Float64}
end
struct ManyMeasurements
measurements :: Vector{MyMeasurement}
end
msg = aiextract ( " James is 30, weighs 80kg. He's 180cm tall. Then Jack is 19 but really tall - over 190! " ; return_type = ManyMeasurements)
msg . content . measurements
# 2-element Vector{MyMeasurement}:
# MyMeasurement(30, 180, 80.0)
# MyMeasurement(19, 190, nothing) Bahkan ada pembungkus untuk membantu Anda menangkap kesalahan bersama dengan penjelasan yang bermanfaat tentang mengapa parsing gagal. Lihat ?PromptingTools.MaybeExtract untuk informasi lebih lanjut.
Dengan fungsi aiscan , Anda dapat berinteraksi dengan gambar seolah -olah mereka adalah teks.
Anda bisa menjelaskan gambar yang disediakan:
msg = aiscan ( " Describe the image " ; image_path = " julia.png " , model = " gpt4v " )
# [ Info: Tokens: 1141 @ Cost: $0.0117 in 2.2 seconds
# AIMessage("The image shows a logo consisting of the word "julia" written in lowercase") Atau Anda dapat melakukan OCR tangkapan layar. Mari Transkripkan beberapa kode SQL dari tangkapan layar (tidak ada lagi mengetik ulang!), Kami menggunakan templat :OCRTask :
# Screenshot of some SQL code
image_url = " https://www.sqlservercentral.com/wp-content/uploads/legacy/8755f69180b7ac7ee76a69ae68ec36872a116ad4/24622.png "
msg = aiscan ( :OCRTask ; image_url, model = " gpt4v " , task = " Transcribe the SQL code in the image. " , api_kwargs = (; max_tokens = 2500 ))
# [ Info: Tokens: 362 @ Cost: $0.0045 in 2.5 seconds
# AIMessage("```sql
# update Orders <continue>Anda dapat menambahkan penyorotan sintaks dari output melalui markdown
using Markdown
msg . content |> Markdown . parseairetry!Ini adalah fitur eksperimental, jadi Anda harus mengimpornya secara eksplisit:
using PromptingTools . Experimental . AgentTools Modul ini menawarkan rekan -rekan "malas" ke ai... , sehingga Anda dapat menggunakannya dengan cara yang lebih terkontrol, misalnya, aigenerate -> AIGenerate (perhatikan unta), yang memiliki argumen yang persis sama kecuali hanya menghasilkan hanya jika run! disebut.
Misalnya:
out = AIGenerate ( " Say hi! " ; model = " gpt4t " )
run! (out) Bagaimana itu berguna? Kita dapat menggunakan "input" yang sama untuk panggilan berulang, misalnya, ketika kita ingin memvalidasi atau meregenerasi beberapa output. Kami memiliki airetry fungsi untuk membantu kami dengan itu.
Tanda Tangan airetry! adalah airetry!(condition_function, aicall::AICall, feedback_function) . Ini mengevaluasi kondisi condition_function pada objek aicall (misalnya, kami mengevaluasi f_cond(aicall) -> Bool ). Jika gagal, kami memanggil feedback_function pada objek aicall untuk memberikan umpan balik untuk model AI (misalnya, f_feedback(aicall) -> String ) dan ulangi prosesnya sampai lewat atau sampai nilai max_retries terlampaui.
Kita dapat menangkap kegagalan API (tidak diperlukan umpan balik, jadi tidak ada yang disediakan)
# API failure because of a non-existent model
# RetryConfig allows us to change the "retry" behaviour of any lazy call
out = AIGenerate ( " say hi! " ; config = RetryConfig (; catch_errors = true ),
model = " NOTEXIST " )
run! (out) # fails
# we ask to wait 2s between retries and retry 2 times (can be set in `config` in aicall as well)
airetry! (isvalid, out; retry_delay = 2 , max_retries = 2 )Atau kita dapat memvalidasi beberapa output (misalnya, formatnya, kontennya, dll.)
Kami akan memainkan permainan menebak warna (saya berpikir "kuning"):
# Notice that we ask for two samples (`n_samples=2`) at each attempt (to improve our chances).
# Both guesses are scored at each time step, and the best one is chosen for the next step.
# And with OpenAI, we can set `api_kwargs = (;n=2)` to get both samples simultaneously (cheaper and faster)!
out = AIGenerate (
" Guess what color I'm thinking. It could be: blue, red, black, white, yellow. Answer with 1 word only " ;
verbose = false ,
config = RetryConfig (; n_samples = 2 ), api_kwargs = (; n = 2 ))
run! (out)
# # Check that the output is 1 word only, third argument is the feedback that will be provided if the condition fails
# # Notice: functions operate on `aicall` as the only argument. We can use utilities like `last_output` and `last_message` to access the last message and output in the conversation.
airetry! (x -> length ( split ( last_output (x), r" | \ . " )) == 1 , out,
" You must answer with 1 word only. " )
# Note: you could also use the do-syntax, eg,
airetry! (out, " You must answer with 1 word only. " ) do aicall
length ( split ( last_output (aicall), r" | \ . " )) == 1
end Anda dapat menempatkan banyak airetry! panggilan dalam urutan. Mereka akan terus mencoba lagi sampai kehabisan panggilan AI maksimum diizinkan ( max_calls ) atau retries maksimum ( max_retries ).
Lihat dokumen untuk contoh dan tips penggunaan yang lebih kompleks ( ?airetry Kami memanfaatkan pencarian pohon Monte Carlo (MCTS) untuk mengoptimalkan urutan retries, jadi ini adalah alat yang sangat kuat untuk membangun alur kerja AI yang kuat (terinspirasi oleh kertas pencarian pohon agen bahasa dan oleh kertas pernyataan DSPY).
Ollama.ai adalah alat yang luar biasa sederhana yang memungkinkan Anda menjalankan beberapa model bahasa besar (LLM) di komputer Anda. Ini sangat cocok ketika Anda bekerja dengan beberapa data sensitif yang tidak boleh dikirim ke mana pun.
Mari kita asumsikan Anda telah menginstal ollama, mengunduh model, dan berjalan di latar belakang.
Kita dapat menggunakannya dengan fungsi aigenerate :
const PT = PromptingTools
schema = PT . OllamaSchema () # notice the different schema!
msg = aigenerate (schema, " Say hi! " ; model = " openhermes2.5-mistral " )
# [ Info: Tokens: 69 in 0.9 seconds
# AIMessage("Hello! How can I assist you today?") Untuk model umum yang telah terdaftar (lihat ?PT.MODEL_REGISTRY ), Anda tidak perlu memberikan skema secara eksplisit:
msg = aigenerate ( " Say hi! " ; model = " openhermes2.5-mistral " ) Dan kita juga dapat menggunakan fungsi aiembed :
msg = aiembed (schema, " Embed me " , copy; model = " openhermes2.5-mistral " )
msg . content # 4096-element JSON3.Array{Float64...
msg = aiembed (schema, [ " Embed me " , " Embed me " ]; model = " openhermes2.5-mistral " )
msg . content # 4096×2 Matrix{Float64}: Anda sekarang juga dapat menggunakan aiscan untuk memberikan gambar ke model Ollama! Lihat dokumen untuk informasi lebih lanjut.
Jika Anda mendapatkan kesalahan, periksa bahwa Ollama sedang berjalan - lihat panduan pengaturan untuk bagian Ollama di bawah ini.
Model Mistral telah lama mendominasi ruang open-source. Mereka sekarang tersedia melalui API mereka, sehingga Anda dapat menggunakannya dengan compakedtools.jl!
msg = aigenerate ( " Say hi! " ; model = " mistral-tiny " ) Semuanya hanya berfungsi, karena kami telah mendaftarkan model di PromptingTools.MODEL_REGISTRY ! Saat ini ada 4 model yang tersedia: mistral-tiny , mistral-small , mistral-medium , mistral-embed .
Di bawah tenda, kami menggunakan skema khusus MistralOpenAISchema yang memanfaatkan sebagian besar basis kode khusus openai, sehingga Anda selalu dapat memberikan itu secara eksplisit sebagai argumen pertama:
const PT = PromptingTools
msg = aigenerate (PT . MistralOpenAISchema (), " Say Hi! " ; model = " mistral-tiny " , api_key = ENV [ " MISTRAL_API_KEY " ]) Seperti yang Anda lihat, kami dapat memuat kunci API Anda baik dari Env atau melalui mekanisme preferensi.jl (lihat ?PREFERENCES untuk informasi lebih lanjut).
Tapi Mistralai bukan satu -satunya! Ada banyak penyedia lain yang menarik, misalnya, kebingsxity.ai, fireworks.ai. Selama mereka kompatibel dengan API OpenAI (misalnya, mengirim messages dengan kunci role dan content ), Anda dapat menggunakannya dengan promptingtools.jl dengan menggunakan schema = CustomOpenAISchema() :
# Set your API key and the necessary base URL for the API
api_key = " ... "
prompt = " Say hi! "
msg = aigenerate (PT . CustomOpenAISchema (), prompt; model = " my_model " , api_key, api_kwargs = (; url = " http://localhost:8081 " ))Seperti yang Anda lihat, ini juga berfungsi untuk model lokal yang mungkin Anda jalankan di komputer Anda!
CATATAN: Saat ini, kami hanya mendukung fungsi-fungsi aigenerate dan aiembed untuk Mistralai dan API yang kompatibel dengan Openai lainnya. Kami berencana untuk memperluas dukungan di masa depan.
Pastikan variabel lingkungan ANTHROPIC_API_KEY diatur ke kunci API Anda.
# cladeuh is alias for Claude 3 Haiku
ai " Say hi! " claudeh Alias model preset adalah claudeo , claudes , dan claudeh , untuk Claude 3 Opus, Sonnet, dan Haiku, masing -masing.
Skema yang sesuai adalah AnthropicSchema .
Ada beberapa templat cepat dengan XML dalam nama, menunjukkan bahwa mereka menggunakan pemformatan XML yang ramah antropik untuk memisahkan bagian. Temukan mereka dengan aitemplates("XML") .
# cladeo is alias for Claude 3 Opus
msg = aigenerate (
:JuliaExpertAskXML , ask = " How to write a function to convert Date to Millisecond? " ,
model = " cladeo " )Tbu ...
Temukan lebih banyak contoh dalam contoh/ folder.
Paket ini dibangun di sekitar tiga elemen kunci:
aigenerate , aiembed , aiclassify ) Mengapa desain ini? API yang berbeda membutuhkan format prompt yang berbeda. Misalnya, API Openai membutuhkan berbagai kamus dengan bidang role dan content , sementara API Ollama untuk model Zephyr-7b memerlukan skema chatml dengan satu string besar dan pemisah seperti <|im_start|>usernABC...<|im_end|>user . Untuk memisahkan bagian dalam prompt Anda, OpenAi lebih suka header markdown ( ##Response ) vs antropik berkinerja lebih baik dengan tag HTML ( <text>{{TEXT}}</text> ).
Paket ini sangat terinspirasi oleh instruktur dan penggunaan yang cerdas dari fungsi panggilan API.
Skema cepat
Jenis kunci yang digunakan untuk kustomisasi logika menyiapkan input untuk LLM dan memanggilnya (melalui beberapa pengiriman).
Semua adalah subtipe AbstractPromptSchema dan setiap fungsi tugas memiliki tanda tangan generik dengan skema di posisi pertama foo(schema::AbstractPromptSchema,...)
Pengiriman didefinisikan baik untuk "rendering" prompts ( render ) dan untuk memanggil API ( aigenerate ).
Idealnya, setiap antarmuka baru akan didefinisikan dalam file llm_<interface>.jl yang terpisah (misalnya, llm_openai.jl ).
Pesan
Prompt secara efektif merupakan percakapan yang harus diselesaikan.
Percakapan cenderung memiliki tiga aktor utama: sistem (untuk instruksi keseluruhan), pengguna (untuk input/data), dan asisten AI (untuk output). Kami menyediakan SystemMessage , UserMessage , dan tipe AIMessage untuk masing -masing.
Diberikan skema yang cepat dan satu atau lebih pesan, Anda dapat render objek yang dihasilkan untuk dimasukkan ke dalam model API. Misalnya, untuk openai
using PromptingTools : render, SystemMessage, UserMessage
PT = PromptingTools
schema = PT . OpenAISchema () # also accessible as the default schema `PT.PROMPT_SCHEMA`
conversation = conversation = [
SystemMessage ( " Act as a helpful AI assistant. Provide only the information that is requested. " ),
UserMessage ( " What is the capital of France? " )]
messages = render (schema, conversation)
# 2-element Vector{Dict{String, String}}:
# Dict("role" => "system", "content" => "Act as a helpful AI assistant. Provide only the information that is requested.")
# Dict("role" => "user", "content" => "What is the capital of France?")Objek ini dapat disediakan langsung ke API OpenAI.
Fungsi berorientasi tugas
Aspirasinya adalah untuk menyediakan serangkaian fungsi yang mudah diingat untuk tugas-tugas umum, karenanya, semua dimulai dengan ai... Semua fungsi harus mengembalikan pembungkus ringan dengan respons yang dihasilkan. Saat ini, hanya dapat AIMessage (untuk respons berbasis teks apa pun) atau DataMessage generik (untuk data terstruktur seperti embeddings).
Mengingat perbedaan dalam model API dan parameternya (misalnya, Openai API vs Ollama), fungsi tugas dikirim pada schema::AbstractPromptSchema sebagai argumen pertama mereka.
Lihat src/llm_openai.jl untuk contoh implementasi. Setiap antarmuka baru akan didefinisikan dalam file llm_<interface>.jl yang terpisah.
Model Openai berada di garis depan penelitian AI dan memberikan kemampuan yang kuat dan canggih untuk banyak tugas.
Akan ada situasi yang tidak atau tidak dapat menggunakannya (misalnya, privasi, biaya, dll.). Dalam hal ini, Anda dapat menggunakan model lokal (misalnya, Ollama) atau API lainnya (misalnya, antropik).
Catatan: Untuk memulai dengan Ollama.ai, lihat Panduan Pengaturan untuk bagian Ollama di bawah ini.
Ada banyak alternatif:
Pada saat penulisan, Openai tidak menggunakan panggilan API untuk melatih model mereka.
API
OpenAI tidak menggunakan data yang dikirimkan dan dihasilkan oleh API kami untuk melatih model OpenAI atau meningkatkan penawaran layanan OpenAI. Untuk mendukung peningkatan model kami yang berkelanjutan, Anda dapat mengisi formulir ini untuk memilih untuk berbagi data dengan kami. - Bagaimana data Anda digunakan untuk meningkatkan model kami
Anda selalu dapat memeriksa ulang informasi terbaru tentang OpenAI's How We menggunakan halaman data Anda.
Sumber daya:
Anda bisa mendapatkan kunci API Anda dari OpenAI dengan mendaftar untuk akun dan mengakses bagian API dari situs web OpenAI.
Sumber daya:
Tip
Selalu atur batas pengeluaran!
Openai memungkinkan Anda untuk menetapkan batas pengeluaran langsung di dasbor akun Anda untuk mencegah biaya yang tidak terduga.
Awal yang baik mungkin merupakan batas lunak c. $ 5 dan batas keras c. $ 10 - Anda selalu dapat meningkatkannya di akhir bulan.
Sumber daya:
Jika Anda menggunakan model lokal (misalnya, dengan Ollama), itu gratis. Jika Anda menggunakan API komersial apa pun (misalnya, OpenAI), Anda kemungkinan akan membayar per "token" (unit sub-kata).
Misalnya, permintaan sederhana dengan pertanyaan sederhana dan 1 tanggapan kalimat sebagai imbalan (”adalah pernyataan xyz komentar positif”) akan dikenakan biaya ~ $ 0,0001 (yaitu, seperseratus sen)
Apakah layak dibayar?
Genai adalah cara untuk membeli waktu! Anda dapat membayar sen untuk menghemat puluhan menit setiap hari.
Melanjutkan contoh di atas, bayangkan Anda memiliki tabel dengan 200 komentar. Sekarang, Anda dapat menguraikan masing -masing dari mereka dengan LLM untuk fitur/cek yang Anda butuhkan. Dengan asumsi harga per panggilan adalah $ 0,0001, Anda akan membayar 2 sen untuk pekerjaan itu dan menghemat 30-60 menit dari waktu Anda!
Sumber daya:
Ini adalah panduan untuk kunci API Openai, tetapi berfungsi untuk kunci API lainnya yang mungkin Anda butuhkan (misalnya, MISTRAL_API_KEY untuk Mistralai API).
Untuk menggunakan API OpenAI dengan promptingTools.jl, atur kunci API Anda sebagai variabel lingkungan:
ENV [ " OPENAI_API_KEY " ] = " your-api-key "Sebagai sekali, Anda bisa:
export OPENAI_API_KEY = <your key>setup.jl Anda (pastikan untuk tidak melakukan hal itu ke GitHub!) Pastikan untuk memulai Julia dari jendela terminal yang sama di mana Anda mengatur variabel. Cek mudah di Julia, jalankan ENV["OPENAI_API_KEY"] dan Anda akan melihat kunci Anda!
Cara yang lebih baik:
~/.zshrc ). Itu akan dimuat secara otomatis setiap kali Anda meluncurkan terminal Kami juga mendukung preferensi.jl, sehingga Anda dapat dengan mudah menjalankan: PromptingTools.set_preferences!("OPENAI_API_KEY"=>"your-api-key") dan itu akan bertahan di seluruh sesi. Untuk melihat preferensi saat ini, jalankan PromptingTools.get_preferences("OPENAI_API_KEY") .
Berhati -hatilah untuk tidak melakukan LocalPreferences.toml ke Github, karena itu akan menunjukkan kunci API Anda ke dunia!
Sumber daya:
aigenerate ( api_kwargs )Lihat Referensi API OpenAI untuk informasi lebih lanjut.
Untuk akses mudah dari mana saja, tambahkan promptingtools ke startup.jl Anda (dapat ditemukan di ~/.julia/config/startup.jl ).
Tambahkan cuplikan berikut:
using PromptingTools
const PT = PromptingTools # to access unexported functions and types
Sekarang, Anda bisa menggunakan ai"Help me do X to achieve Y" dari sesi rep apa!
Etos computedtools.jl adalah untuk memungkinkan Anda menggunakan model apa pun yang Anda inginkan, yang mencakup LLM open source. Yang paling populer dan termudah untuk diatur adalah ollama.ai - lihat di bawah untuk informasi lebih lanjut.
OLLAMA menjalankan LLMS Hosting Layanan Latar Belakang yang dapat Anda akses melalui API sederhana. Ini sangat berguna ketika Anda bekerja dengan beberapa data sensitif yang tidak boleh dikirim ke mana pun.
Instalasi sangat mudah, cukup unduh versi terbaru di sini.
Setelah menginstalnya, cukup luncurkan aplikasi dan Anda siap untuk pergi!
Untuk memeriksa apakah itu berjalan, buka browser Anda dan buka 127.0.0.1:11434 . Anda harus melihat pesan "Ollama sedang berjalan". Atau, Anda dapat menjalankan ollama serve di terminal Anda dan Anda akan mendapatkan pesan yang sudah berjalan.
Ada banyak model yang tersedia di Perpustakaan Ollama, termasuk LLAMA2, Codellama, SQLCoder, atau openhermes2.5-mistral favorit pribadi saya.
Unduh model baru dengan ollama pull <model_name> (misalnya, ollama pull openhermes2.5-mistral ).
Tampilkan model yang tersedia saat ini dengan ollama list .
Lihat Ollama.ai untuk informasi lebih lanjut.
Fine-tuning adalah teknik yang kuat untuk mengadaptasi model dengan kasus penggunaan spesifik Anda (sebagian besar format/sintaks/tugas). Dibutuhkan set data, yang sekarang dapat dengan mudah Anda hasilkan dengan promptingtools.jl!
Anda dapat menyimpan percakapan apa pun (vektor pesan) ke file dengan PT.save_conversation("filename.json", conversation) .
Setelah waktu finetuning tiba, buat sekumpulan percakapan yang diformat Sharegpt (format finetuning umum) dalam satu file .jsonl . Gunakan PT.save_conversations("dataset.jsonl", [conversation1, conversation2, ...]) (perhatikan "percakapan" jamak itu dalam nama fungsi).
Sebagai contoh dari proses finetuning ujung ke ujung, lihat Eksperimen Finetuning Proyek Juliallmleaderboard kami. Ini menunjukkan proses finetuning untuk setengah dolar dengan jarvislabs.ai dan axolotl.
Ini adalah daftar fitur yang ingin saya lihat di masa depan (tanpa urutan tertentu):
Untuk informasi lebih lanjut, kontribusi, atau pertanyaan, silakan kunjungi repositori gitub computedtools.jl.
Harap dicatat bahwa saat compaTingTools.jl bertujuan untuk memberikan pengalaman yang lancar, itu bergantung pada API eksternal yang dapat berubah. Nantikan repositori untuk pembaruan dan fitur baru.
Terima kasih telah memilih compasingtools.jl untuk memberdayakan aplikasi Anda dengan AI!