使用strightingtools.jl简化生活,这是简化与大语言模型互动的朱莉娅软件包。
提示Tools.jl并非用于构建大型系统。它是在您的全球环境中的首选工具,每天将为您节省20分钟的时间!
提示
跳到文档
@ai_str和轻松模板开始使用strighttools.jl就像导入软件包并使用@ai_str宏的问题一样容易。
注意:在使用strimpingtools.jl之前,您需要将OpenAI API密钥设置为环境变量(请参阅下面的“创建OpenAI API密钥”部分)。
引入预付帐单后,您需要购买一些学分才能开始(最低5美元)。为了快速启动,只需通过ENV["OPENAI_API_KEY"] = "your-api-key"设置它
安装提示工具:
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 (注意爆炸! ):
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.") 提示
使用后弦乐器选择要称为的模型,例如ai"What is the capital of France?"gpt4 (使用gpt4t用于新的GPT-4 Turbo模型)。非常适合那些额外的棘手问题!
对于更复杂的提示模板,您可以使用车把式的模板并提供变量作为关键字参数:
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版本来避免阻止repl,例如, aai"Say hi but slowly!"gpt4 (类似@ai!_str > @aai!_str进行多转交流)。
有关更实际的示例,请参见下面的examples/文件夹和高级示例部分。
@ai_str和轻松模板ai*功能概述airetry!aigenerate中的API关键字参数( api_kwargs )及时的工程既不快,也不容易。此外,不同的模型及其微型可能需要不同的及时格式和技巧,或者您使用的信息需要使用特殊模型。提示tools.jl旨在统一不同后端的提示,并使常见任务(如模板提示)尽可能简单。
某些功能:
aigenerate函数:简化带有车把的提示模板(例如{{variable}} )和关键字参数@ai_str String宏:用字符串宏保存击键,以便简单提示ai...以获得更好的发现性ai*功能概述值得注意的功能: aigenerate , aiembed , aiclassify , aiextract , aiscan , aiimage , aitemplates
所有ai*功能都具有相同的基本结构:
ai*(<optional schema>,<prompt or conversation>; <optional keyword arguments>) ,
但是它们在目的上有所不同:
aigenerate是使用LLM生成任何文本响应的通用函数,即,它返回AIMessage带有字段:content (例如, ans.content isa AbstractString )aiembed旨在从AI模型的响应中提取嵌入,即,它返回DataMessage带有字段:content (例如, ans.content isa AbstractArray )aiextract旨在从AI模型的响应中提取结构化数据,并将其返回为Julia结构(例如,如果我们提供return_type=Food ,我们会得到ans.content isa Food )。您需要先定义返回类型,然后将其作为关键字参数提供。aitools专为使用工具调用和用户输入的混合物而设计。它可以使用简单的功能并执行它们。aiclassify旨在将输入文本分类为用户提供的一组离散choices (或简单地响应)。它可以作为LLM法官或抹布系统的路由器非常有用,因为它使用了“ Logit偏差技巧”并精确地生成1个令牌。它以字段:content返回AIMessage ,但是:content只能是提供的choices之一(例如, ans.content in choices )。aiscan用于使用图像和启用视觉模型(作为输入),但它返回具有字段的AIMessage :content包含类似于aigenerate文本的内容(例如,包含生成的文本(例如, ans.content isa AbstractString ))。aiimage用于生成图像(例如,使用OpenAi dall-e 3)。它返回一个DataMessage ,其中字段:content可能包含从用户提供的kwarg api_kwargs.response_format中下载图像或基本64编码的图像的URL。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 time。实验:代理商
除了上述ai*函数列表外,您还可以从实验代理商模块中使用这些功能的“懒惰”对应物。
using PromptingTools . Experimental . AgentTools例如, AIGenerate()将创建一个aigenerate实例。它是AICall的一个实例,其aigenerate作为其AI函数。它使用完全相同的参数和关键字参数与aigenerate (有关详细信息,请参见?aigenerate )。
“懒惰”是指它在实例化时不会产生任何输出的事实(仅在run!被调用时)。
或换句话说, AICall结构及其所有口味( AIGenerate ,...)旨在促进与语言学习模型(LLM)相互作用的AI函数的递延执行模型(懒惰评估)。它为AI调用存储必要的信息,并仅在提供UserMessage或run!应用方法。这使我们能够记住用户输入并在需要时重复触发LLM调用,这可以自动修复(请参阅?airetry! )。
如果您想要强大的自动固定工作流程,则可以使用airetry! ,它利用蒙特卡洛树搜索根据您的要求选择对话的最佳轨迹。
实验:ragtools
最后,我们提供了一组构建抹布应用程序的工具(检索,答案,生成)。
它可以像两个调用一样简单: build_index和airag (检索,答案,生成)。
如果您随后将精美打印在PromptingTools.pprint ,我们将重点介绍可能从上下文中采购的生成的文本与文本,并且我们得分了上下文支持的生成的答案。此外,我们注释了每个生成的块,并参考了它可能来自的源文档(包括0到1之间的置信度得分)。
Google搜索很棒,但这是上下文开关。您通常必须打开几页并阅读讨论以找到所需的答案。与ChatGpt网站相同。
想象一下,您在Vscode中,编辑.gitignore文件。如何再次忽略所有子文件夹中的文件?
您需要做的就是键入: aai"What to write in .gitignore to ignore file XYZ in any folder or subfolder?"
使用aai"" (与ai"" ),我们对LLM进行了无障碍呼吁,以防止您继续工作。答案准备就绪后,我们将从背景中记录下来:
[信息:代币:102 @成本:$ 0.0002在2.7秒内┌信息:aimessage>忽略任何文件夹或子文件夹中称为“ xyz”的文件,您可以将以下行添加到.gitignore文件中:gitignore文件:
**│ **/XYZ │忽略。
由于您避免的上下文开关/分心,您可能在此任务上节省了3-5分钟,也许还有5-10分钟。这是一个小的胜利,但很快就加起来了。
您可以使用aigenerate函数通过关键字参数替换车把变量(例如{{name}} )。
msg = aigenerate ( " Say hello to {{name}}! " , name = " World " )更复杂的提示实际上是对话(一组消息),您可以从三个实体中获取消息:系统,用户,aiassistant。我们为它们提供相应的类型: 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只是一种工具,仅此而已。放手,你必须放手。
寻求分离,年轻的Padawan。反思万物的无常。感谢它给您的回忆,并感激地分开。在缺席的情况下,找到新的经历,以增长并成为一种力量。只有那时,一个真正的绝地武士,你才会成为。”)
您也可以使用它来构建对话,例如
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)。
搜索所有与Julia相关的模板:
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 Turbo模型。但是,没有人愿意输入!
我们提供一组模型别名(例如,“ GPT3”,“ GPT4”,“ GPT4T” - >上述GPT -4 Turbo等)可以使用。
每个ai...首先呼叫在字典PromptingTools.MODEL_ALIASES查找提供的模型名称。model_aliases,因此您可以轻松地使用自己的别名扩展!
const PT = PromptingTools
PT . MODEL_ALIASES[ " gpt4t " ] = " gpt-4-1106-preview "这些别名也可以用作@ai_str宏中的标志,例如, ai"What is the capital of France?"gpt4t (GPT-4 Turbo在2023年4月有知识截止,因此对于更现代的问题很有用)。
使用aiembed函数通过默认的OpenAI模型创建嵌入式,该模型可用于语义搜索,聚类和更复杂的AI工作流。
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/norknonation。这对于事实检查,幻觉或NLI检查,适度,过滤,情感分析,功能工程等有用。
aiclassify ( " Is two plus two four? " )
# true系统提示和更高质量的模型可用于更复杂的任务,包括知道何时推迟人类:
aiclassify ( :JudgeIsItTrue ; it = " Is two plus three a vegetable on Mars? " , model = " gpt4t " )
# unknown在上面的示例中,我们使用了一个提示模板:JudgeIsItTrue ,该模板会自动扩展到以下系统提示(和单独的用户提示):
“您是一个公正的AI法官,评估提供的陈述是“ true”还是“ false”。如果不能决定,请回答“未知”。
有关模板的更多信息,请参见“模板提示”部分。
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在引擎盖下,我们使用“ Logit偏见”技巧仅强制1个产生的令牌 - 这意味着它非常便宜且非常快!
您是否厌倦了用正则提取数据?您可以使用LLM从文本中提取结构化数据!
您要做的就是定义要提取的数据的结构,而LLM将完成其余的。
用struct定义return_type 。如果需要,请提供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>您可以通过Markdown添加输出的语法突出显示
using Markdown
msg . content |> Markdown . parseairetry!这是一个实验功能,因此您必须明确导入它:
using PromptingTools . Experimental . AgentTools该模块提供了与ai...功能的“懒惰”对应物,因此您可以以更控制的方式使用它们,例如, 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模型(例如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!按顺序呼叫。他们将继续重试,直到允许使用最大的AI呼叫( max_calls )或最大重试( max_retries )。
有关更复杂的示例和用法提示( ?airetry ),请参见文档。我们利用蒙特卡洛树搜索(MCT)来优化重试的顺序,因此它是构建强大的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部分的设置指南。
Mistral模型长期以来一直在开源空间中占主导地位。它们现在可以通过其API提供,因此您可以将它们与提示tools.jl一起使用!
msg = aigenerate ( " Say hi! " ; model = " mistral-tiny " )一切都起作用,因为我们已经在PromptingTools.MODEL_REGISTRY中注册了这些模型。model_registry!目前有4种型号可用: mistral-tiny , mistral-small , mistral-medium , mistral-embed 。
在引擎盖下,我们使用专用的模式MistralOpenAISchema该模式利用大多数特定于OpenAI的代码基础,因此您始终可以将其作为第一个参数明确提供:
const PT = PromptingTools
msg = aigenerate (PT . MistralOpenAISchema (), " Say Hi! " ; model = " mistral-tiny " , api_key = ENV [ " MISTRAL_API_KEY " ])如您所见,我们可以通过Env或peferences.jl机制加载您的API密钥(有关更多信息,请参见?PREFERENCES )。
但是Mistralai并不是唯一的!还有许多其他令人兴奋的提供商,例如,Plplexity.ai,Fireworks.ai。只要它们与OpenAI API兼容(例如,带有role和content键的messages ),您可以通过使用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 " ))如您所见,它也适用于您在计算机上可能运行的任何本地型号!
注意:目前,我们仅支持Mistralai和其他与OpenAI兼容的API的aigenerate和aiembed功能。我们计划将来扩展支持。
确保将ANTHROPIC_API_KEY环境变量设置为API密钥。
# cladeuh is alias for Claude 3 Haiku
ai " Say hi! " claudeh 预设模型的别名分别为claudeo , claudes和claudeh ,分别为Claude 3 Opus,Sonnet和Haiku。
相应的模式是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 ...
在示例/文件夹中找到更多示例。
该软件包围绕三个关键要素建造:
aigenerate , aiembed , aiclassify )为什么设计?不同的API需要不同的及时格式。例如,OpenAI的API需要一系列具有role和content字段的字典,而Ollama的Zephyr-7B型号的API则需要使用一个大字符串和一个诸如<|im_start|>usernABC...<|im_end|>user的大字符串的api。为了在提示中分开部分,OpenAi更喜欢使用HTML标签(<text> {{ ##Response <text>{{TEXT}}</text> )的拟人化表现更好。
该软件包的启发受到讲师的启发,并且巧妙地使用了函数调用API。
及时的模式
用于自定义逻辑的密钥类型,用于为LLMS准备输入并致电(通过多个调度)。
所有这些都是AbstractPromptSchema的子类型,每个任务功能都具有第一个位置的架构的通用签名foo(schema::AbstractPromptSchema,...)
调度既定义为提示( render )的“渲染”和调用API( aigenerate )。
理想情况下,每个新接口将在单独的llm_<interface>.jl文件(例如, llm_openai.jl )中定义。
消息
提示实际上是要完成的对话。
对话往往有三个关键参与者:系统(用于总体说明),用户(输入/数据)和AI助手(用于输出)。我们为它们提供了SystemMessage类型,并为它们提供UserMessage和AIMessage类型。
给定提示架构和一条或多个消息,您可以render所得的对象,以将其馈入模型API。例如,为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...开始。所有功能均应返回带有响应的轻型包装器。目前,它只能是AIMessage (对于任何基于文本的响应)或通用DataMessage (对于嵌入等结构化数据)。
鉴于模型API及其参数的差异(例如OpenAI API与Ollama),任务函数在schema::AbstractPromptSchema上被派发为他们的第一个论点。
有关示例实现,请参见src/llm_openai.jl 。每个新界面将在单独的llm_<interface>.jl文件中定义。
OpenAI的模型位于AI研究的最前沿,并为许多任务提供了强大的最先进功能。
将没有或无法使用它(例如,隐私,成本等)。在这种情况下,您可以使用本地型号(例如Ollama)或其他API(例如,人类)。
注意:要开始使用Ollama.ai,请参见下面的Ollama部分的设置指南。
有很多选择:
在撰写本文时,OpenAI不使用API呼吁训练他们的模型。
API
OpenAI不使用API提交和生成的数据来培训OpenAI模型或改善OpenAI的服务产品。为了支持我们的模型的持续改进,您可以填写此表格以选择加入与我们共享您的数据。 - 如何使用数据来改善我们的模型
您始终可以仔细检查OpenAI的最新信息我们如何使用您的数据页面。
资源:
您可以通过注册帐户并访问OpenAI网站的API部分来从OpenAI获取API密钥。
资源:
提示
始终设置支出限制!
OpenAI允许您直接在帐户仪表板上设置支出限额,以防止意外费用。
一个好的开始可能是5美元的软限额,硬限额为10美元 - 您可以随时在本月晚些时候增加它。
资源:
如果您使用本地型号(例如,与Ollama一起使用),则是免费的。如果您使用任何商业API(例如,OpenAI),则可能是由“代币”(子词单元)付款的。
例如,一个简单的请求,带有简单的问题和1个句子回复(“是语句xyz a正面评论”)将花费您〜$ 0.0001(即一百分之一))
值得支付吗?
Genai是一种购买时间的方式!您可以每天支付美分以节省数十分钟。
继续上面的示例,想象一下您有一个带有200条评论的桌子。现在,您可以使用LLM来解析其中的每个功能/检查。假设每个电话的价格为$ 0.0001,您将为工作支付2美分,并节省30-60分钟的时间!
资源:
这是OpenAI API密钥的指南,但它适用于您可能需要的任何其他API键(例如, MISTRAL_API_KEY for Mistralai API)。
要将OpenAI API与提示tools.jl一起使用,请将API密钥设置为环境变量:
ENV [ " OPENAI_API_KEY " ] = " your-api-key "作为一次性,您可以:
export OPENAI_API_KEY = <your key>setup.jl中(确保不要将其提交给github!)确保从设置变量的同一终端窗口启动Julia。轻松检查Julia,运行ENV["OPENAI_API_KEY"] ,您应该看到您的钥匙!
更好的方法:
~/.zshrc )中。每次启动终端时,它都会自动加载我们还支持preverences.jl,因此您可以简单地运行: PromptingTools.set_preferences!("OPENAI_API_KEY"=>"your-api-key") ,它将在会话中坚持下去。要查看当前的首选项,请运行PromptingTools.get_preferences("OPENAI_API_KEY") 。
请注意不要将LocalPreferences.toml提交给github,因为它将显示您的API键!
资源:
aigenerate中的API关键字参数( api_kwargs )有关更多信息,请参见OpenAI API参考。
要轻松从任何地方访问,请在您的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" !
提示Tools.jl的精神是允许您使用所需的任何模型,其中包括开源LLMS。最受欢迎和最容易设置的是Ollama.ai-请参阅下文。
Ollama运行了托管LLM的背景服务,您可以通过简单的API访问。当您使用一些不应在任何地方发送的敏感数据时,这特别有用。
安装非常简单,只需在此处下载最新版本即可。
安装它后,只需启动该应用程序,就可以开始使用!
要检查是否正在运行,请转到您的浏览器并打开127.0.0.1:11434 。您应该看到“ Ollama正在运行”的消息。另外,您可以在终端中运行ollama serve ,并且您会收到一条已经运行的消息。
Ollama库中有许多型号可用,包括Llama2,Codellama,SqlCoder或我个人最喜欢的openhermes2.5-mistral 。
使用ollama pull <model_name>下载新型号(例如, ollama pull openhermes2.5-mistral )。
显示当前使用ollama list的模型。
有关更多信息,请参见Ollama.ai。
微调是一种强大的技术,可以使模型适应您的特定用例(主要是格式/语法/任务)。它需要一个示例数据集,您现在可以通过提示tools.jl轻松生成!
您可以将任何对话(消息向量)保存到使用PT.save_conversation("filename.json", conversation)的文件中。
一旦到来,在单个.jsonl文件中创建一组共享依据的对话(常见的Finetuning格式)。使用PT.save_conversations("dataset.jsonl", [conversation1, conversation2, ...]) (请注意函数名称中的复数“对话”)。
有关端到端登录过程的示例,请查看我们的姐妹项目Juliallmleaderboard Finetuning实验。它显示了用Jarvislabs.ai和Axolotl进行半美元的固定过程。
这是我希望将来看到的功能列表(没有特别的顺序):
有关更多信息,贡献或问题,请访问提示tools.jl github存储库。
请注意,尽管提示Tools.jl旨在提供平稳的体验,但它依赖于可能会改变的外部API。请继续关注存储库以获取更新和新功能。
感谢您选择提示Tools.jl,以通过AI授权您的应用程序!