PromptingTools.jlを使用して、大規模な言語モデルとの対話を簡素化するJuliaパッケージを使用して、人生を合理化します。
PromptingTools.jlは、大規模なシステムを構築するためのものではありません。それはあなたのグローバル環境の頼りになるツールであることを意図しており、毎日20分節約できます!
ヒント
ドキュメントにジャンプします
@ai_strと簡単なテンプレートでクイックスタートPromptingTools.jlを開始することは、パッケージをインポートし、質問に@ai_strマクロを使用するのと同じくらい簡単です。
注:empriskTools.jlを使用する前に、OpenAI APIキーを環境変数として設定する必要があります(以下のOpenAI APIの作成セクションを参照)。
プリペイド請求の導入後、開始するためにいくつかのクレジットを購入する必要があります(最低5ドル)。クイックスタートのために、 ENV["OPENAI_API_KEY"] = "your-api-key"を介してそれを設定するだけです
empriskToolsをインストールする:
using Pkg
Pkg . add ( " PromptingTools " )そして、私たちは行く準備ができています!
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.")返されたオブジェクトは、追加のダウンストリーム処理のためのフィールドに生成されたメッセージ:content ( ans.content )を備えた軽いラッパーです。
ヒント
前のメッセージに返信する場合、または単に会話を続行する場合は、 @ai!_strを使用します(Bang ! ):
ai! " And what is the population of it? "文字列補間で変数を簡単に注入できます。
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.") ヒント
After-String-Flags gpt4t使用して、呼び出されるモデルを選択します。たとえば、 ai"What is the capital of France?"gpt4それらの余分な難しい質問に最適です!
より複雑なプロンプトテンプレートについては、ハンドルバースタイルのテンプレートを使用して、キーワード引数として変数を提供できます。
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.") ヒント
asyncmapを使用して、複数のAI搭載タスクを同時に実行します。
ヒント
スローモデル(GPT -4など)を使用する場合は、 @ai_str > @aai_strのAsync @ai!_strを使用して、REPLのaai"Say hi but slowly!"gpt4 @aai!_str避けます。
より実用的な例については、 examples/フォルダーと以下の高度な例を参照してください。
@ai_strと簡単なテンプレートでクイックスタートai*関数の概要airetry!aigenerateのAPIキーワード引数を理解する( api_kwargs )迅速なエンジニアリングは、高速でも簡単でもありません。さらに、異なるモデルとその微調整は、異なる迅速な形式とトリックを必要とする場合があります。または、おそらくあなたが扱う情報には、特別なモデルを使用する必要があります。 PromptingTools.jlは、さまざまなバックエンドのプロンプトを統合し、共通のタスク(テンプレートプロンプトなど)を可能な限り簡単にすることを目的としています。
いくつかの機能:
aigenerate関数:ハンドルバーを使用してプロンプトテンプレートを簡素化( {{variable}} )およびキーワード引数@ai_str文字列マクロ:シンプルなプロンプトのために文字列マクロでキーストロークを保存ai...より良い発見のためにai*関数の概要注目すべき機能: aigenerate 、 aiembed 、 aiclassify 、 aiextract 、 aiscan 、 aiimage 、 aitemplates
すべてのai*関数には同じ基本構造があります。
ai*(<optional schema>,<prompt or conversation>; <optional keyword arguments>) 、
しかし、それらは目的が異なります:
aigenerate ans.content isa AbstractString LLMSでテキスト応答を生成する汎用関数です。つまり、フィールドでAIMessageを返します:contentaiembed 、AIモデルの応答から埋め込みを抽出するように設計されています。つまり、埋め込みを含むコンテンツ(例: ans.content isa AbstractArray )を使用してDataMessageを返します:contentaiextract 、AIモデルの応答から構造化されたデータを抽出し、ジュリア構造としてそれらを返すように設計されています(たとえば、 return_type=Foodを提供する場合、 ans.content isa Foodを取得します)。最初に返品タイプを定義し、キーワード引数として提供する必要があります。aitools 、ツールコールとユーザー入力が組み合わされたエージェントワークフロー用に設計されています。単純な関数で動作し、実行できます。aiclassify 、ユーザーが提供する一連の離散choicesに入力テキストを分類する(または単に応答する)ように設計されています。 「ロジットバイアストリック」を使用し、正確に1つのトークンを生成するため、LLMジャッジまたはRAGシステム用のルーターとして非常に便利です。フィールド:contentでAIMessageを返しますが、 :content 、提供されたchoicesの1つにすぎないことができます(例えば、 ans.content in choices )aiscan 、画像とビジョン対応モデル(入力として)を操作するためのものですが、 aigenerateと同様に、フィールド:生成されたテキスト( ans.content isa AbstractStringなど)を含む:contentを使用してAIMessageを返します。aiimage 、画像を生成するためのものです(例:Openai Dall-E 3を使用)。 DataMessageを返します。フィールド:contentには、ユーザーが提供するKWARG api_kwargs.response_formatに応じて、画像をダウンロードするURLまたはBase64エンコード画像をダウンロードする場合があります。aitemplates 、利用可能なテンプレートを発見して詳細を確認するヘルパー関数です(例、 aitemplates("some keyword")またはaitemplates(:AssistantAsk) )既知のmodelを使用している場合、 schema (最初の引数)を提供する必要はありません。
ai*のオプションのキーワード引数は次の傾向があります。
model::String - 使用するモデルverbose::Bool AIのコストに関する情報ログを見に行ったかどうかreturn_all::Bool会話全体が必要なのか、AIの回答が必要か(つまり、出力に入力/プロンプトを含めるかどうか)api_kwargs::NamedTupleモデルの特定のパラメーター、例えば、 temperature=0.0クリエイティブではありません(そして、各実行でより類似した出力を持っています)http_kwargs::NamedTuple http.jlパッケージのパラメーター、例えば、 readtimeout = 120秒で、応答がない場合は120秒でタイムアウトします。実験:AgentTools
上記のai*関数のリストに加えて、実験的なAgentToolsモジュールのこれらの関数の「怠zy」な対応物を使用することもできます。
using PromptingTools . Experimental . AgentToolsたとえば、 AIGenerate() 、 aigenerateの怠zyなインスタンスを作成します。これは、AI関数としてaigenerateを持つAICallのインスタンスです。これは、まったく同じ引数とキーワード引数をaigenerateと使用します(詳細については?aigenerate参照)。
「怠zy」とは、インスタンス化されたときに出力を生成しないという事実を指します( run!た場合のみ)。
または別の言い方をすれば、 AICall structとそのすべてのフレーバー( AIGenerate 、...)は、言語学習モデル(LLM)と相互作用するAI関数の繰延実行モデル(怠zyな評価)を促進するように設計されています。 AI呼び出しに必要な情報を保存し、 UserMessage済みのAI関数を使用した場合のみ、またはrun!メソッドが適用されます。これにより、ユーザーの入力を思い出し、必要に応じてLLMコールを繰り返しトリガーすることができます。これにより、自動固定が可能になります( ?airetry!参照!)
強力な自動固定ワークフローが必要な場合は、 airetry! 、モンテカルロツリー検索を活用して、要件に基づいて会話の最適な軌跡を選択します。
実験:ragtools
最後に、RAGアプリケーションを構築するための一連のツールを提供します(取得、回答、生成)。
build_indexとairag (取得、回答、生成)の2つの呼び出しと同じくらい簡単です。
その後、 PromptingTools.pprintでプリティプリントを使用する場合、コンテキストから供給される可能性が高い生成されたテキストとテキストを強調表示し、コンテキストでサポートされている生成された回答がどれほど強くなっているかを獲得します。さらに、生成された各チャンクに、ソースドキュメントが生まれた可能性のある参照(0〜1の間の信頼性スコアを含む)に注釈を付けます。
Googleの検索は素晴らしいですが、コンテキストスイッチです。多くの場合、数ページを開けてディスカッションを読んで、必要な答えを見つける必要があります。 ChatGptのWebサイトでも同じです。
.gitignoreファイルを編集して、vscodeにいると想像してください。すべてのサブフォルダーのファイルを再び無視するにはどうすればよいですか?
あなたがする必要があるのは、次のように入力することだけです: aai"What to write in .gitignore to ignore file XYZ in any folder or subfolder?"
aai"" ( ai"" )を使用して、LLMに非ブロッキングコールを行い、作業を継続できないようにします。答えの準備ができたら、背景からログを記録します。
[情報:トークン:102 @コスト
│ **/XYZ │2.7**で0.0002 $ 0.0002無視したい。
あなたが避けたコンテキストの切り替え/気晴らしのために、おそらくこのタスクで3〜5分、おそらくさらに5〜10分節約しました。それは小さな勝利ですが、それはすぐに合計されます。
aigenerate関数を使用して、キーワード引数を介してハンドルバー変数( {{name}} )を置き換えることができます。
msg = aigenerate ( " Say hello to {{name}}! " , name = " World " )より複雑なプロンプトは、事実上会話(メッセージのセット)であり、システム、ユーザー、AIASSITANTの3つのエンティティからのメッセージを持つことができます。それらのそれぞれに対応するタイプを提供します: 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(「ああ、ジレンマ、あなたは持っています。感情的な愛着は、ジェダイになるための道を曇らせることができます。物質的な所有物に執着するためには、そうではありません。iPhoneは、それ以上のツールではありません。
若いパダワン、孤立を求めてください。すべてのものの非永続性を振り返ります。それがあなたに与えた思い出に感謝し、感謝して別れます。その不在下で、成長し、力と一体になるための新しい経験を見つけてください。その場合にのみ、真のジェダイ、あなたはなります。」
また、会話を構築するために使用することもできます。
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(「うーん、古いiPhoneを所有している、私はそうではない。しかし、添付ファイルの経験、私は持っている。私は学んだ。真の力と自由、それはもたらす...」)
LLMSを使用すると、結果の品質 /堅牢性はプロンプトの品質に依存します。しかし、プロンプトを書くのは難しいです!そのため、時間と労力を節約するためのテンプレートシステムを提供しています。
特定のテンプレートを使用するには(例えば、「ジュリア語を尋ねる):
msg = aigenerate ( :JuliaExpertAsk ; ask = " How do I add packages? " )上記は、 AITemplateでディスパッチを明示的に使用する、より冗長なバージョンに相当します。
msg = aigenerate ( AITemplate ( :JuliaExpertAsk ); ask = " How do I add packages? " ) 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 ""上記は、テンプレートが何であるか、プレースホルダーが利用できるもの、使用するのにどれだけの費用がかかるかについての良いアイデアを提供します(= wordcount)。
ジュリア関連のすべてのテンプレートを検索します。
tmps = aitemplates ( " Julia " )
# 2-element Vector{AITemplateMetadata}... -> more to come later! VSCODEを使用している場合は、 vscodedisplayを使用して素敵な表形式ディスプレイを活用できます。
using DataFrames
tmps = aitemplates ( " Julia " ) |> DataFrame |> vscodedisplay選択したテンプレートを持っていますが、どのように使用できますか?最初の例で見られるように、 aigenerateまたはaiclassifyで「名前」を使用してください!
「レンダリング」してテンプレートを検査できます(これはLLMが表示するものです):
julia > AITemplate ( :JudgeIsItTrue ) |> PromptingTools . render例/フォルダーのより多くの例を参照してください。
asyncmapを活用して、複数のAI駆動型タスクを同時に実行し、バッチ操作のパフォーマンスを向上させることができます。
prompts = [ aigenerate ( " Translate 'Hello, World!' to {{language}} " ; language) for language in [ " Spanish " , " French " , " Mandarin " ]]
responses = asyncmap (aigenerate, prompts)ヒント
キーワードasyncmap(...; ntasks=10)を使用して、同時タスクの数を制限できます。
特定のタスクには、より強力なモデルが必要です。すべてのユーザー向け関数には、使用するモデルを指定するために使用できるキーワード引数modelがあります。たとえば、 model = "gpt-4-1106-preview"を使用して、最新のGPT-4ターボモデルを使用できます。しかし、誰もそれを入力したくありません!
代わりに使用できるモデルエイリアスのセット(「GPT3」、「GPT4」、「GPT4T」 - >上記のGPT -4ターボなど)を提供します。
各ai...最初に呼び出してください辞書PromptingTools.MODEL_ALIASESで提供されたモデル名を調べてください。そうすれば、独自のエイリアスで簡単に拡張できます!
const PT = PromptingTools
PT . MODEL_ALIASES[ " gpt4t " ] = " gpt-4-1106-preview "これらのエイリアスは、 @ai_strマクロのフラグとしても使用できます。たとえば、 ai"What is the capital of France?"gpt4t
aiembed関数を使用して、セマンティック検索、クラスタリング、およびより複雑なAIワークフローに使用できるデフォルトのOpenAIモデルを介して埋め込みを作成します。
text_to_embed = " The concept of artificial intelligence. "
msg = aiembed (text_to_embed)
embedding = msg . content # 1536-element Vector{Float64}埋め込み間のコサイン距離を計算する予定がある場合は、最初にそれらを正規化できます。
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]aiclassify関数を使用して、提供されたステートメントをtrue/false/unknownとして分類できます。これは、ファクトチェック、幻覚またはNLIチェック、緩和、フィルタリング、センチメント分析、機能エンジニアリングなどに役立ちます。
aiclassify ( " Is two plus two four? " )
# trueシステムプロンプトと高品質のモデルは、より複雑なタスクに使用できます。
aiclassify ( :JudgeIsItTrue ; it = " Is two plus three a vegetable on Mars? " , model = " gpt4t " )
# unknown上記の例では、プロンプトテンプレートを使用しました:JudgeIsItTrueは、次のシステムプロンプト(および個別のユーザープロンプト)に自動的に拡張されます。
「あなたは、提供されたステートメントが「真」か「偽」かを評価する公平なAI裁判官です。決定できない場合は「不明」と答えます。」
テンプレートの詳細については、テンプレートプロンプトセクションを参照してください。
aiclassify 、定義されたカテゴリのセット(最大20)への分類にも使用できるため、ルーティングに使用できます。
さらに、タプル( (label, description) )として選択肢を提供する場合、モデルは説明を使用して決定しますが、ラベルを返します。
例:
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 elseフードの下では、「ロジットバイアス」トリックを使用して、生成されたトークンが1つしか強制されていません。つまり、非常に安くて非常に高速です。
Regexでデータを抽出するのにうんざりしていませんか? LLMSを使用して、テキストから構造化されたデータを抽出できます!
あなたがしなければならないのは、抽出するデータの構造を定義することだけで、LLMは残りを行います。
return_type structで定義します。必要に応じてdocstringsを提供します(結果を改善し、ドキュメントに役立ちます)。
ハードタスクから始めましょう - 特定の場所で現在の天気を抽出します。
@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)ただし、テキストから多くのエンティティを抽出するなど、より複雑なタスクにも使用できます。
" 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)解析が失敗した理由についての役立つ説明と一緒にエラーをキャッチするのに役立つラッパーさえあります。詳細については?PromptingTools.MaybeExtract参照してください。
aiscan関数を使用すると、画像がテキストであるかのように対話できます。
提供された画像を簡単に説明できます。
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")または、スクリーンショットのOCRを実行することもできます。スクリーンショットからいくつかのSQLコードを転写しましょう(これ以上再タイピングはありません!)、テンプレートを使用します: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>マークダウンを介して出力の構文強調表示を追加できます
using Markdown
msg . content |> Markdown . parseairetry!これは実験機能なので、明示的にインポートする必要があります。
using PromptingTools . Experimental . AgentToolsこのモジュールは、 ai...関数に対して「怠zy AIGenerate 」カウンターパートを提供するため、より制御されaigenerate方法で使用できますrun!呼ばれています。
例えば:
out = AIGenerate ( " Say hi! " ; model = " gpt4t " )
run! (out)どのように役立ちますか?いくつかの出力を検証または再生する場合、繰り返し呼び出しに同じ「入力」を使用できます。私たちはそれを助けるための関数airetryを持っています。
airetry! airetry!(condition_function, aicall::AICall, feedback_function)です。 aicallオブジェクトの条件condition_functionを評価します(たとえば、 f_cond(aicall) -> Boolを評価します)。失敗した場合、 aicallオブジェクトのfeedback_functionを呼び出して、AIモデルのフィードバック(eg、 f_feedback(aicall) -> String )を提供し、通過またはmax_retries値が超えるまでプロセスを繰り返します。
APIの障害をキャッチできます(フィードバックは必要ありませんので、提供されません)
# 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 )または、いくつかの出力(その形式、そのコンテンツなど)を検証することもできます。
カラー推測ゲームをプレイします(「黄色」と思っています):
# 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複数のairetry!シーケンスで呼び出します。彼らは、許容( max_calls )または最大レトリ( max_retries )を最大AI呼び出しがなくなるまで、再試行を続けます。
より複雑な例と使用のヒント( ?airetry )については、ドキュメントを参照してください。モンテカルロツリー検索(MCTS)を活用してレトリのシーケンスを最適化するため、これは堅牢なAIワークフローを構築するための非常に強力なツールです(言語エージェントツリー検索ペーパーとDSPYアサーションペーパーに触発されています)。
Ollama.aiは、コンピューターでいくつかの大きな言語モデル(LLM)を実行できる驚くほどシンプルなツールです。どこにも送信されるべきではない機密データを使用している場合、特に適しています。
Ollamaをインストールし、モデルをダウンロードし、バックグラウンドで実行されていると仮定しましょう。
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?")登録されている一般的なモデルの場合( ?PT.MODEL_REGISTRY参照)、スキーマを明示的に提供する必要はありません。
msg = aigenerate ( " Say hi! " ; model = " openhermes2.5-mistral " )また、 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}: aiscanを使用してOllamaモデルに画像を提供することもできます。詳細については、ドキュメントを参照してください。
エラーが発生している場合は、Ollamaが実行中であることを確認してください。以下のOllamaセクションのセットアップガイドを参照してください。
ミストラルモデルは、長い間オープンソーススペースを支配してきました。現在、APIを介して利用できるようになったため、PromptingTools.jlで使用できます。
msg = aigenerate ( " Say hi! " ; model = " mistral-tiny " )私たちはPromptingTools.MODEL_REGISTRYにモデルを登録したため、すべてが機能します!現在、4つのモデルが利用可能です。 mistral-tiny 、 mistral-small 、 mistral-medium 、 mistral-embed 。
ボンネットの下では、OpenAI固有のコードベースのほとんどを活用する専用のスキーマMistralOpenAISchemaを使用しているため、最初の引数として明示的に明示的に提供できます。
const PT = PromptingTools
msg = aigenerate (PT . MistralOpenAISchema (), " Say Hi! " ; model = " mistral-tiny " , api_key = ENV [ " MISTRAL_API_KEY " ])ご覧のとおり、ENVまたはfeprences.jlメカニズムを介してAPIキーをロードできます(詳細については?PREFERENCES
しかし、ミストラライだけではありません!他にも多くのエキサイティングなプロバイダーがあります。 Openai API(例: roleおよびcontentキーを使用してmessagesを送信する)と互換性がある限り、 schema = CustomOpenAISchema()を使用して、emprisktools.jlでそれらを使用できます。
# 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 " ))ご覧のとおり、コンピューターで実行している可能性のあるローカルモデルでも機能します。
注:現時点では、Mistralaiおよびその他のOpenai互換APIのaigenerate and aiembed関数のみをサポートしています。将来、サポートを拡大する予定です。
ANTHROPIC_API_KEY環境変数がAPIキーに設定されていることを確認してください。
# cladeuh is alias for Claude 3 Haiku
ai " Say hi! " claudeh プリセットモデルのエイリアスは、それぞれClaude 3 Opus、Sonnet、およびHaikuのclaudeo 、 claudes 、およびclaudehです。
対応するスキーマはAnthropicSchemaです。
名前にXMLを含むいくつかのプロンプトテンプレートがあり、セクションを分離するために人類に優しいXMLフォーマットを使用することを示唆しています。 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 ...
例/フォルダーでより多くの例を見つけてください。
パッケージは、3つの重要な要素を中心に構築されています。
aigenerate 、 aiembed 、 aiclassify )なぜこのデザイン?異なるAPIには、異なるプロンプト形式が必要です。たとえば、OpenaiのAPIにはroleとcontentフィールドを備えた一連の辞書が必要ですが、Zephyr-7BモデルのOllamaのAPIには<|im_start|>usernABC...<|im_end|>userような1つの大きな文字列とセパレーターを備えたchatmlスキーマが必要です。プロンプトのセクションを分離するために、OpenaiはMarkdownヘッダー( ##Response )vs Anthropicは、HTMLタグ( <text>{{TEXT}}</text> )でより良くパフォーマンスを発揮します。
このパッケージは、インストラクターから大きなインスピレーションを受けており、APIを呼び出す機能の巧妙な使用です。
プロンプトスキーマ
LLMSの入力の準備と呼び出しのロジックのカスタマイズに使用されるキータイプ(複数のディスパッチを介して)。
すべてはAbstractPromptSchemaのサブタイプであり、各タスク関数には、最初の位置foo(schema::AbstractPromptSchema,...)にスキーマを備えた一般的な署名があります。
ディスパッチは、プロンプト( render )の「レンダリング」とAPI( aigenerate )の呼び出しの両方で定義されています。
理想的には、各新しいインターフェイスは、別のllm_<interface>.jlファイル( llm_openai.jlなど)で定義されます。
メッセージ
プロンプトは、事実上会話を完了するための会話です。
会話には、システム(全体的な指示用)、ユーザー(入力/データ用)、およびAIアシスタント(出力用)の3つの重要なアクターがいる傾向があります。それぞれにSystemMessage 、 UserMessage 、 AIMessageタイプを提供します。
迅速なスキーマと1つ以上のメッセージが与えられている場合、結果のオブジェクトをモデルAPIに供給するオブジェクトrenderできます。たとえば、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?")このオブジェクトは、OpenAI APIに直接提供できます。
タスク指向の関数
願望は、一般的なタスクに対して一連の覚えやすい関数を提供することです。したがって、すべてai...から始まります。すべての関数は、結果の応答で軽いラッパーを返す必要があります。現時点では、目的(テキストベースの応答に対して)または一般的なDataMessage AIMessage (埋め込みなどの構造データ用)のみである可能性があります。
モデルAPIとそのパラメーター(Openai API対Ollamaなど)の違いを考えると、タスク関数はschema::AbstractPromptSchemaに最初の引数として発送されます。
実装の例についてはsrc/llm_openai.jlを参照してください。各新しいインターフェイスは、別のllm_<interface>.jlファイルで定義されます。
Openaiのモデルは、AIの研究の最前線にあり、多くのタスクに堅牢で最先端の機能を提供します。
状況はありません、または使用できません(プライバシー、コストなど)。その場合、ローカルモデル(オラマなど)または他のAPI(例えば、人類学)を使用できます。
注:Ollama.aiを開始するには、以下のOllamaセクションのセットアップガイドを参照してください。
多くの選択肢があります:
執筆時点では、OpenaiはモデルをトレーニングするためにAPI呼び出しを使用していません。
API
Openaiは、Openaiモデルをトレーニングしたり、Openaiのサービスサービスを改善するために、APIに提出され、生成されたデータを使用せず、APIによって生成されます。モデルの継続的な改善をサポートするために、このフォームに記入してオプトインしてデータを共有できます。 - モデルを改善するためにデータをどのように使用するか
Openaiのデータページの使用方法に関する最新情報をいつでも再確認できます。
リソース:
アカウントにサインアップし、Openai WebサイトのAPIセクションにアクセスすることにより、OpenAIからAPIキーを取得できます。
リソース:
ヒント
常に支出制限を設定してください!
OpenAIを使用すると、予期しないコストを防ぐために、アカウントダッシュボードに支出制限を直接設定できます。
良いスタートは、C。5ドルのソフトリミットであり、C。10ドルの厳しい制限です - あなたはいつでもその月の後半にそれを増やすことができます。
リソース:
ローカルモデルを使用する場合(たとえば、Ollamaを使用)、無料です。市販のAPI(Openaiなど)を使用すると、「トークン」(サブワードユニット)ごとに支払う可能性があります。
たとえば、単純な質問と1文の回答が見返りの簡単な要求(「声明xyzは肯定的なコメントです」)には〜$ 0.0001(つまり、100分の1セント)の費用がかかります。
支払う価値はありますか?
genaiは時間を購入する方法です!毎日数分節約するためにセントを支払うことができます。
上記の例を続けて、200のコメントがあるテーブルがあると想像してください。これで、必要な機能/チェックのために、それらのそれぞれをLLMで解析できます。通話ごとの価格が0.0001ドルであると仮定すると、仕事に2セントを支払い、30〜60分間の時間を節約できます!
リソース:
これはOpenaiのAPIキーのガイドですが、必要な他のAPIキー(Mistralai APIのMISTRAL_API_KEY )で機能します。
emprompingTools.jlでOpenAI APIを使用するには、APIキーを環境変数として設定します。
ENV [ " OPENAI_API_KEY " ] = " your-api-key "一回限りのこととして、あなたは:
export OPENAI_API_KEY = <your key>を起動する前にターミナルに設定します>setup.jlに設定します(githubにコミットしないようにしてください!)変数を設定した同じターミナルウィンドウからジュリアを必ず開始してください。ジュリアで簡単にチェックして、 ENV["OPENAI_API_KEY"]を実行してください。キーが表示されます!
より良い方法:
~/.zshrcなど)に構成ラインを追加します。ターミナルを起動するたびに自動的にロードされますまた、firemens.jlをサポートするため、単純に実行できます: PromptingTools.set_preferences!("OPENAI_API_KEY"=>"your-api-key")とセッション全体で持続します。現在の設定を確認するには、 PromptingTools.get_preferences("OPENAI_API_KEY")を実行します。
APIキーを世界に表示するので、 LocalPreferences.tomlをgithubにコミットしないように注意してください!
リソース:
aigenerateのAPIキーワード引数を理解する( api_kwargs )詳細については、OpenAI APIリファレンスを参照してください。
どこからでも簡単にアクセスできるようにするには、promptingtoolsをstartup.jlに追加します( ~/.julia/config/startup.jlにあります)。
次のスニペットを追加します。
using PromptingTools
const PT = PromptingTools # to access unexported functions and types
これで、任意のREPLセッションからai"Help me do X to achieve Y"を使用できます!
prospingtools.jlの精神は、オープンソースLLMを含む、必要なモデルを使用できるようにすることです。最も人気があり、セットアップが最も簡単なのはollama.ai-詳細については以下を参照してください。
Ollamaは、単純なAPIを介してアクセスできるLLMをホストするバックグラウンドサービスを実行します。どこにも送信されない機密データを使用している場合に特に便利です。
インストールは非常に簡単です。最新バージョンをこちらからダウンロードしてください。
インストールしたら、アプリを起動するだけで準備ができています!
実行中かどうかを確認するには、ブラウザに移動して127.0.0.1:11434を開きます。 「Ollamaが実行されている」というメッセージが表示されます。または、ターミナルでollama serveを実行して、すでに実行されているというメッセージが表示されます。
Ollama Libraryには、Llama2、Codellama、SQLCoder、または私のお気に入りのopenhermes2.5-mistralなど、多くのモデルがあります。
ollama pull <model_name> (例えば、 ollama pull openhermes2.5-mistral )を使用して新しいモデルをダウンロードします。
ollama listを備えた現在利用可能なモデルを表示します。
詳細については、Ollama.aiを参照してください。
微調整は、モデルを特定のユースケース(主にフォーマット/構文/タスク)に適応させる強力な手法です。これには、例のデータセットが必要です。これは、prospingtools.jlで簡単に生成できるようになりました。
会話(メッセージのベクトル) PT.save_conversation("filename.json", conversation)を使用してファイルに保存できます。
Finetuning時間が来たら、単一の.jsonlファイルにShareGPTフォーマットの会話(一般的なFinetuning形式)のバンドルを作成します。 PT.save_conversations("dataset.jsonl", [conversation1, conversation2, ...])を使用します(関数名で複数の「会話」に注意してください)。
エンドツーエンドの微調整プロセスの例については、姉妹プロジェクトJuliallmleaderboard Finetuning実験をご覧ください。 jarvislabs.aiとaxolotlを使用して、0.5ドルの微調整のプロセスを示しています。
これは、将来見たい機能のリストです(順不同):
詳細、貢献、または質問については、promptingtools.jl githubリポジトリをご覧ください。
PromptingTools.jlはスムーズな体験を提供することを目指していますが、変化する可能性のある外部APIに依存していることに注意してください。更新と新機能については、リポジトリにご注目ください。
AIを使用してアプリケーションを強化するために、empriveTools.jlを選択していただきありがとうございます!