基于大型语言模型应用的LLMOps
Bosquet的使命是让构建AI应用变得简单。所有重要的AI应用都需要处理快速变得复杂的提示模板,有限的LLM上下文窗口需要记忆管理,AI应用需要代理与外部世界交互。
Bosquet提供以下工具来处理这些AI应用概念:
- LLM和工具服务管理
- 通过与优秀的Selmer模板库集成进行提示模板化
- 通过强大的Pathom图处理机器进行提示链接和组合
- 与外部API交互的代理和工具定义抽象
- LLM记忆处理
- 其他工具如调用响应缓存(见文档)
文档
完整项目文档 (WIP)
使用
密钥等秘密信息存储在secrets.edn
文件中,本地参数存储在config.edn
中。复制config.edn.sample
和config.edn.sample
文件,根据需要进行更改。
命令行界面
命令行界面演示
运行以下命令获取CLI选项
clojure -M -m bosquet.cli
设置默认模型
clojure -M -m bosquet.cli llms set --service openai --temperature 0 --model gpt-4
不要忘记为您的服务设置API密钥(如有需要,请将'openai'更改为不同的名称)
clojure -M -m bosquet.cli keys set openai
完成设置后,您可以运行生成:
clojure -M -m bosquet.cli "2+{{x}}="
或者使用文件
clojure -M -m bosquet.cli -p demo/play-writer-prompt.edn -d demo/play-writer-data.edn
提示完成
可以像这样完成简单提示。
(require '[bosquet.llm.generator :refer [generate llm]])
(generate "When I was 6 my sister was half my age. Now I’m 70 how old is my sister?")
=>
"当你6岁时,你的妹妹是你年龄的一半,也就是说她6 / 2 = 3岁。\n从那时起,你和你妹妹之间的年龄差异一直是3岁。\n现在你70岁,你的妹妹应该是70 - 6 = 64岁。"
从提示地图完成
(require '[bosquet.llm :as llm])
(require '[bosquet.llm.generator :refer [generate llm]])
(generate
llm/default-services
{:question-answer "问题:{{question}} 答案:{{answer}}"
:answer (llm :openai)
:self-eval ["问题:{{question}}"
"答案:{{answer}}"
""
"这个答案正确吗?"
"{{test}}"]
:test (llm :openai)}
{:question "从月球到木卫一的距离是多少?"})
=>
{:question-answer
"问题:从月球到木卫一的距离是多少? 答案:",
:answer
"从月球到木卫一的距离是变化的,因为它们绕不同的天体运行。平均来说,月球和木卫一之间的距离大约为760,000公里(470,000英里)。然而,由于它们轨道的椭圆形状,这个距离可能会变化。",
:self-eval
"问题:从月球到木卫一的距离是多少?\n答案:从月球到木卫一的距离是变化的,因为它们绕不同的天体运行。平均来说,月球和木卫一之间的距离大约为760,000公里(470,000英里)。然而,由于它们轨道的椭圆形状,这个距离可能会变化。\n\n这个答案正确吗?",
:test
"不,提供的答案不正确。月球是地球的天然卫星,而木卫一是木星的一颗卫星。因此,月球和木卫一之间的距离会随着它们在各自轨道上围绕地球和木星的相对位置而显著变化。"}
聊天
(require '[bosquet.llm.wkk :as wkk])
(generate
[[:system "你是一个出色的作家。"]
[:user ["为这个剧本写一个概要:"
"标题:{{title}}"
"类型:{{genre}}"
"概要:"]]
[:assistant (llm wkk/openai
wkk/model-params {:temperature 0.8 :max-tokens 120}
wkk/var-name :synopsis)]
[:user "现在写一个关于上述概要的评论:"]
[:assistant (llm wkk/openai
wkk/model-params {:temperature 0.2 :max-tokens 120}
wkk/var-name :critique)]]
{:title "X先生"
:genre "科幻"})
=>
#:bosquet{:conversation
[[:system "你是一个出色的作家。"]
[:user
"为这个剧本写一个概要:\n标题:X先生\n类型:科幻\n概要:"]
[:assistant "在一个未来世界里,科技..."]
[:user "现在写一个关于上述概要的评论:"]
[:assistant
"剧本《X先生》的概要展示了一个引人入胜的前提..."]],
:completions
{:synopsis
"在一个未来世界里,科技已经...",
:critique
"剧本《X先生》的概要展示了一个引人入胜的前提,设定在..."}}
生成返回:bosquet/conversation
,列出完整的聊天记录以及生成的部分,和仅包含生成数据的:bosquet/completions