这是一篇关于从语言模型(LLM)获取结构化输出的框架比较的文章,主要内容如下:
- 更新信息:11 月 26 日添加了一些提供程序的细节,6 月 18 日推荐查看Hacker News和/r/LocalLLaMA的讨论,感谢反馈和评论。
- 对读者的意义:如果正在尝试从 LLM 获取结构化输出,尝试过
response_format: "json"
和函数调用但结果令人失望,厌倦了用正则表达式提取 JSON,或想了解有哪些选择,这篇文章会很有趣。 - 问题阐述:在生产中使用 LLM 迟早会遇到想要一个能返回所需格式 JSON 的神奇黑盒,但 LLM 通常返回英语,将英语转换为 JSON 很困难。
框架比较:
- BAML:支持 Python、TypeScript、Ruby 等语言,能处理或防止畸形 JSON,可通过 Jinja 模板构建提示,完全控制提示,有 VSCode 扩展,支持多种模型提供程序和 API 风格,通过 BAML 模式定义输出类型,有 VSCode 扩展和 CLI 测试框架。
- Instructor:支持 Python,通过
messages
数组构建提示,无支持机制查看最终提示,支持多种模型提供程序和 API 风格,通过 Parea 平台测试。 - TypeChat:支持 Python、TypeScript、C#/.NET,通过不同方式构建提示,无支持机制查看最终提示,通过 Pydantic、Zod 定义输出类型,无单独测试框架。
- Marvin:支持 Python,通过 Jinja 模板构建提示,无支持机制查看最终提示,支持 OpenAI 模型。
- Outlines:支持 Python,通过传递字符串构建提示,可完全控制提示,支持多种模型提供程序和 API 风格,通过 Pydantic、JSON 模式、EBNF 语法定义输出类型,无单独测试框架。
- Guidance:支持 Python,通过传递字符串构建提示,无支持机制查看最终提示,支持多种模型提供程序,通过多种方式定义输出类型,无单独测试框架。
- LMQL:支持 Python,通过传递字符串构建提示,可完全控制提示,支持多种模型提供程序和 API 风格,通过 LMQL 约束定义输出类型,无单独测试框架。
- JSONformer:支持 Python,通过传递字符串构建提示,可完全控制提示,支持 Transformers 模型,无异步和流式支持,通过 JSON 模式定义输出类型,无单独测试框架。
- Firebase Genkit:支持 TypeScript,待提供示例,暂不支持某些模型,待确定提示相关内容,暂不支持某些模型。
- SGLang:支持 Python,待提供示例,暂不支持某些模型,待确定提示相关内容,暂不支持某些模型。
- lm-format-enforcer:支持 Python,待提供示例,暂不支持某些模型,待确定提示相关内容,暂不支持某些模型。
比较标准:
- 处理或防止畸形 JSON:有解析畸形 JSON 和约束 LLM 令牌生成两种技术,解析更优但有局限性,约束生成仅适用于自托管模型。
- 查看实际提示和完全控制提示:大多数框架有硬编码模板,阻碍查看和尝试不同提示,这很重要以获取结构化数据。
- 示例代码:为每个框架提供了从其文档中获取的示例代码,展示如何使用框架。
最后提到这是一个活文档,会随着对其他框架的了解而更新,如有问题可在 Discord 或 Twitter 上联系。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。