1 个不稳定版本

0.12.0-beta2024年4月24日

#261 in 机器学习

自定义许可

86KB
1.5K SLoC

transprompt

Rust中开发LLM应用的中心化提示框架

注意:transprompt尚未稳定,因此API可能会更改。

用法

目前,transprompt处于测试版,因此尚未在crates.io上发布。要使用它,请在Cargo.toml中添加依赖项。

transprompt = { git = "https://github.com/ifsheldon/transprompt.git", branch = "main", version = "0.10" }

文档

运行以下命令以生成文档,并在浏览器中打开。

cargo doc --open

为什么是transprompt

因为我已经厌倦了那些混合了继承层次结构和从无中生有的重载和重写方法的面向对象抽象层。

LLM编程,即提示工程的美妙名称,从提示开始,因此应该是以提示为中心的(如果你来自软件开发,则可能是数据驱动的)。

概念和设计

transprompt的整体设计遵循数据驱动设计。API被设计得尽可能明确,因此用户应该能够轻松跟踪构成提示的每个步骤。API层次结构的目标也是尽可能扁平。循环速度不是首要任务,因为LLM可能需要数万亿个周期来响应用户请求。

提示模板和占位符

正如其名所示,它是一个提示模板。

例如,一个模板看起来像这样

You are a friendly and helpful assistant. Today is {{date}}.

现在,{{date}}是一个占位符,一个要填充的槽位,在这个模板中,它的名称为"date"

命名占位符的格式很简单,即{{你喜欢的任何名称}}。名称可以是任何字符串,但不能包含换行符"\n""\r\n"

为什么是这个格式?

因为KISS(保持简单,保持愚蠢)和我的有限的正则表达式技能。

部分提示

提示模板是一个蓝图,而部分提示是模板的不完整构建,这意味着它有空白槽位(也称为占位符)。

一个 PartialPrompt 只来自 PromptTemplate::construct_prompt

PartialPrompt 记录哪些占位符被什么值填充以及未填充的占位符。

PartialPrompt 中的所有占位符都被填充时,它就是完整的,因此可以转换为具体的提示。这很简单,只需通过 PartialPrompt::complete 完成。

填充物

任何填充部分提示中一个或多个占位符的东西。

在 Rust 中,这意味着任何实现了 FillPlaceholders 并至少实现了 FillFillMutFillWith<CTX>FillWithMut<CTX> 之一的类型。

填充物填充占位符。占位符通过 PartialPrompt::fillPartialPrompt::try_fill 来填充。

一个简单的例子是日期填充物,它填充了一个名为 date 的占位符,该占位符在模板中表示为 {{date}}

填充物也可以是多个填充物的组合。因此,在复杂的工作流程中,PartialPrompt 可以在多个阶段由并发填充物填充。

端点或 LLM

PromptTemplate -> PartialPrompt -> complete prompt (a String) 管道的端点是 LLM,它消费一个提示并产生一个回复。

您可以对回复进行任何后处理,但我们将将其留到实用工具中。

或者,您甚至可以启动另一个管道,将填充物的提示模板转换为新的起点!

应用程序或代理或任何东西

LLM 应用程序只是一个有序的提示模板、填充物(和中间部分提示)以及后处理阶段的集合。

  • 提示模板
  • 填充物(以及中间部分提示)
  • 后处理阶段

TODOs

按重要性从上到下排序

  • 向量数据库连接:目前是简单的 Qdrant DB
  • LLM 集成:OpenAI ChatGPT 的基本集成
    • 其他 LLM 支持
  • 文档:目前是基本文档
  • guidance 的集成
    • 我不知道如何做,但这个库真的很厉害,尽管它的算法很简单。
    • 由于 OpenAI 函数调用而没有紧急需求
  • 包括以下内容的实用工具
    • 简单的 JSON 后处理:目前只从字符串中提取有效的 JSON 内容
      • 添加 Jsonformer 支持 由于 OpenAI 函数调用而没有紧急需求
    • 常用的应用程序/代理
      • 生成式代理
    • 令牌计数实用工具:目前只支持基本的 tiktoken
  • 示例
  • 未来的工程改进,如高级编译时检查或类型系统舞蹈
  • Python 对应物?
    • 我喜欢 Python 的动态性,就像我喜欢 Rust 的静态性一样,所以我希望在 Python 中看到一个以提示为中心的对等物。
    • 看起来 Semantic Kernel 很相似?

贡献

贡献总是受欢迎。请参阅 TODOs。

许可

transprompt 将始终在 Apache 许可下免费提供。

归属

  • async_openai:代码库 transprompt 从本包中复制了内容,具体为 transprompt::utils::llm::openai::ConversationConfig
  • tiktoken-rs:在 transprompt::utils::token::tiktoken 中,我们重新导出 tiktoken-rs 包。

依赖项

~18–36MB
~396K SLoC