各工具解决的问题
结构化输出需要解决三个相互依存的问题:模式定义、API强制和验证。 不同工具以不同方式解决这些问题。Instructor在Python中用重试处理全部三个。Outlines通过约束解码消除了验证步骤。Pydantic AI为Agent添加类型安全性。LangChain封装Provider API。Marvin优先考虑开发速度。PromptQuorum验证所有模型的一致性。
| 问题 | Instructor | Outlines | Pydantic AI | LangChain | Marvin |
|---|---|---|---|---|---|
| 定义模式 | Pydantic模型 | JSON Schema / GBNF | Pydantic模型 | 工具定义 | Python装饰器 |
| API调用时强制执行 | 重试 + 验证 | Token级约束 | API + 验证 | Provider JSON模式 | Prompt注入 |
| 验证响应 | 自动 | 生成时保证 | 类型检查 | 手动 | 自动 |
Instructor:Pydantic提取
Instructor是采用最广泛的结构化输出库。它封装任何LLM API — OpenAI GPT-4.5、Claude 4.7、Gemini、Ollama、vLLM — 并返回经验证的Pydantic模型而非原始文本。 Instructor在验证失败时自动处理重试,无需额外错误处理即可达到生产级别。
- 兼容20+个LLM Provider(OpenAI、Anthropic、Google、通过Ollama/vLLM的本地模型)
- Pydantic v2模式:类型提示、验证规则、嵌入模式的docstring描述
- 验证失败时自动退避重试 — 无需手动错误处理
- 支持Python和TypeScript(通过Node.js适配器)
- Apache 2.0开源,积极维护
- 定价:免费(除LLM API调用外无额外费用)
import instructor
from pydantic import BaseModel
from openai import OpenAI
class User(BaseModel):
name: str
age: int
client = instructor.from_openai(OpenAI())
user = client.chat.completions.create(
model="gpt-4o",
response_model=User,
messages=[{"role": "user", "content": "Extract: John is 25 years old"}]
)
# user.name == "John", user.age == 25Outlines:约束解码
Outlines通过约束解码在Token生成时强制执行模式合规性。不是生成Token后再验证,而是在每一步将有效Token限制为符合您模式的Token。 这保证了100%的模式合规性,零幻觉风险,非常适合本地模型。
- 支持llama.cpp、vLLM、transformers、NVIDIA NIM和任何HuggingFace模型
- JSON Schema或GBNF(GGML BNF)格式模式定义
- 保证模式合规性 — 无需后处理验证或重试
- 比基于重试的验证更快(减少浪费的Token)
- 免费开源(Apache 2.0)
- 最适合本地部署和对成本敏感的工作流
Pydantic AI:类型安全Agent
Pydantic AI是一个新框架(2025年),将Pydantic模型与多轮Agent对话的一级支持相结合。它在每一轮强制执行结构化输出的同时,为Agent循环添加完整的类型安全性。 专为Python异步工作流设计。
- Pydantic v2类型系统 — 完整的IDE支持和类型检查
- 每个Agent步骤内置结构化输出
- 高吞吐量应用的Async-first设计
- 支持OpenAI GPT、Anthropic Claude、Google Gemini和通过Ollama的本地模型
- 内置工具调用 — 将工具定义为带类型提示的Python函数
- 免费(除LLM API调用外无额外费用)
LangChain:统一API
LangChain 0.1+为所有主要聊天模型添加了with_structured_output()。这将OpenAI、Anthropic、Google和本地模型的结构化输出统一在单一API之下。 如果您的团队已经使用LangChain的链或Agent,这是实现结构化输出的最简单路径。
- 统一API:一个.with_structured_output()方法适用于所有Provider
- 自动将LangChain工具定义转换为Provider特定的模式格式
- 与链、Agent和可运行工作流无缝集成
- 支持Pydantic模型、TypedDict和OpenAI模式定义
- LangChain生态系统的一部分(无额外依赖)
- 最适合已投入LangChain的团队
Marvin:基于装饰器的提取
Marvin使用Python装饰器将函数签名转换为有类型的LLM调用。您定义一个带类型提示的函数签名,用@marvin.fn装饰它,Marvin自动处理Prompt生成和结构化输出验证。 从想法到可工作代码的最快路径。
- 装饰器语法:@marvin.fn将Python签名转换为LLM Prompt
- 支持OpenAI、Anthropic、Google和本地模型
- 类型提示成为模式 — 最少样板代码
- 内置验证和错误处理
- 适合原型开发和中小型工作流
- 免费(截至2026年4月,定价待定)
PromptQuorum:跨模型测试
PromptQuorum本身不是结构化输出库,而是用于验证跨模型结构化输出一致性的测试平台。 同时对GPT-4.5、Claude 4.7 Opus、Gemini 3.1 Pro和20+其他模型运行相同的Prompt。测量每个模型的模式合规性、延迟和成本。
- 单次API调用中的多模型分发 — 对25+模型测试一个Prompt
- 结构化输出合规性指标 — 通过率、延迟、每个模型的成本
- 识别在您的模式上产生幻觉的模型 — 避免部署到不可靠的模型
- 共识模式 — 在独立模型运行之间找到一致性
- 与Instructor、Outlines、Pydantic AI、LangChain或原始LLM API配合使用
- 提供免费层,高容量测试提供企业定价
并排对比
| 工具 | 最佳用途 | 模式格式 | 语言 | 本地模型 | 价格 | 学习曲线 |
|---|---|---|---|---|---|---|
| Instructor | Python API + 重试 | Pydantic模型 | Python/TypeScript | 支持(Ollama) | 免费 | 低 |
| Outlines | 本地模型部署 | JSON Schema/GBNF | Python | 支持(原生) | 免费 | 中 |
| Pydantic AI | 类型安全Agent | Pydantic模型 | Python | 支持(Ollama) | 免费 | 低 |
| LangChain | 链 + Agent | 工具定义 | Python/JS | 支持 | 免费 | 中 |
| Marvin | 快速原型 | 类型提示 | Python | 支持 | 免费 | 非常低 |
| PromptQuorum | 多模型测试 | API无关 | API优先 | 通过OpenAI代理 | 免费 + 企业版 | 低 |
选择合适的工具
从回答三个问题开始:(1) 您已经在使用LangChain吗?(2) 您需要本地模型支持吗?(3) 您的验证复杂度如何?
- 使用Instructor的情况: 构建Python API且需要验证失败时自动重试。最佳通用选择。
- 使用Outlines的情况: 部署本地模型(llama.cpp、vLLM)且希望在生成时保证模式合规性。
- 使用Pydantic AI的情况: 构建所有步骤都有类型安全性的多轮Agent工作流。
- 使用LangChain的情况: 已经使用LangChain链或Agent — with_structured_output()是最简单的添加。
- 使用Marvin的情况: 想要快速原型开发且不需要复杂验证 — 装饰器是最快路径。
- 使用PromptQuorum的情况: 需要在生产前测试GPT、Claude和Gemini的结构化输出一致性。
逐步添加结构化输出
- 1定义输出模式 — 创建描述LLM应返回的字段、类型和约束的Pydantic模型(Python)、TypeScript接口或JSON Schema。
- 2选择库 — Python API选Instructor,本地模型选Outlines,Agent选Pydantic AI,已在使用则选LangChain,速度优先选Marvin。
- 3安装并封装LLM调用 — `pip install instructor`(Python),然后将模式传递给API调用。Instructor处理验证和重试。
- 4使用PromptQuorum测试 — 部署到PromptQuorum,对GPT、Claude和Gemini运行您的Prompt。测量每个模型的模式合规性。
- 5根据失败改进模式 — 如果模型未通过验证,在Prompt中添加示例或调整模式约束。迭代直到所有模型通过。
结构化输出的常见错误
❌ 在没有验证的情况下使用JSON模式
Why it hurts: API JSON模式(OpenAI response_format、Anthropic JSON控制)仅暗示JSON结构 — 它不保证您的模式被遵守。模型仍然会产生字段名和类型的幻觉。
Fix: 始终在上面叠加验证:使用Instructor、Outlines或Pydantic AI。永远不要单独信任JSON模式。使用PromptQuorum测试以发现合规性失败。
❌ 设计过于严格的模式
Why it hurts: 过度约束的模式(小枚举列表、非常具体的正则表达式模式)导致LLM频繁验证失败。高重试次数浪费Token和金钱。
Fix: 使用PromptQuorum测试跨模型的模式严格性。放宽约束以实现95%以上的合规性。尽可能使用可选字段而不是必填字段。
❌ 不测试本地和API模型之间的差异
Why it hurts: llama.cpp上的Outlines与GPT-4.5上的Instructor行为不同。模式合规率因模型而异。只为GPT构建然后在本地部署会导致生产失败。
Fix: 尽早测试所有预期的模型后端。使用PromptQuorum在本地(vLLM)、API(OpenAI、Anthropic)和开源模型(Gemini)上运行相同的Prompt。
❌ 忽略对延迟和Token成本的影响
Why it hurts: 带重试的结构化输出消耗更多Token。Instructor在失败时重试。Outlines的约束解码比自由生成慢。没有测量每个模型的成本。
Fix: 使用PromptQuorum成本追踪。比较模型间的延迟。对于预算敏感的工作流,优先使用Outlines(无重试)。为了精度,接受Instructor的重试成本。
❌ 混用验证方法(缺乏一致性)
Why it hurts: 部分请求使用Instructor,其他使用原始JSON解析。部分模型经过验证,其他没有。这导致生产中出现不一致的错误。
Fix: 在每个代码库中标准化一种验证方法。所有请求使用Instructor,或全部使用Outlines。一致性将调试时间减少10倍。
中国数据安全法与结构化输出合规
在中国大陆部署LLM结构化输出应用时,需要符合《数据安全法》(2021年)、《个人信息保护法》(PIPL)和网络安全法的相关要求。
- 《数据安全法》第36条: 向境外提供重要数据须经国家网信部门安全评估。使用Outlines或llama.cpp的本地模型部署可确保数据不出境,适用于金融、医疗、能源等重要行业数据处理。
- PIPL个人信息跨境规定: 通过LLM API处理个人信息需要满足数据出境安全评估或标准合同要求。本地模型部署绕过了这一合规负担。
- 金融行业合规: 银行、保险、证券机构在使用AI处理客户数据时需符合中国银保监会和证监会规定。Outlines与本地部署的Qwen2.5等国产模型结合,是合规的技术路径。
- 医疗和法律行业: 处理电子病历、法律文书等敏感数据时,推荐使用Outlines与本地部署组合,配合PromptQuorum进行一致性测试后再投入生产。
- 企业级推荐架构: 阿里云、腾讯云、华为云均提供符合等保2.0要求的私有化部署环境。在这些平台上运行Outlines和本地模型,既满足合规要求又保持技术灵活性。
延伸阅读
- 结构化输出与JSON模式 — OpenAI、Anthropic、Google API的JSON模式工作原理;格式强制与模式验证的使用场景。
- Prompt注入与安全 — 在结构化Prompt中接受用户输入的风险;净化策略。
- 如何评估Prompt质量 — 在结构化输出模式上测量准确性、一致性和指令遵循度。
- 如何跨模型测试Prompt — 在GPT、Claude和Gemini上运行相同测试集;比较通过率。
- Prompt工程与微调对比 — 结构化Prompt何时足够,何时需要模型微调。
- 小团队的Prompt工程配置 — 为2至15人团队构建结构化数据输出工作流。
LLM中的结构化输出是什么?
结构化输出将LLM响应限制为特定模式——JSON格式、定义的字段、类型约束。不是自由文本,而是返回代码可以直接解析和验证的数据,无需错误处理。
Python开发者最好的工具是什么?
Instructor是最受欢迎的Python选择。它使用Pydantic模型定义模式,自动处理重试和验证,支持任何LLM API(OpenAI、Anthropic、Google、Ollama)。如果还需要类型安全的多轮Agent对话,Pydantic AI是替代选择。
可以与Llama等本地模型一起使用吗?
可以。Outlines专门用于本地模型约束解码——与llama.cpp、vLLM和transformers库兼容。在Token生成时保证模式合规性,幻觉风险为零。如果将Ollama作为API运行,Instructor也支持。
Instructor和Marvin有什么区别?
Instructor使用Pydantic模型定义模式,用错误恢复处理提取。Marvin使用Python装饰器——装饰函数签名,Marvin自动生成LLM Prompt。Instructor更明确(适合复杂验证),Marvin更简洁(适合快速原型)。
LangChain支持结构化输出吗?
是的。LangChain 0.1+在ChatOpenAI、ChatAnthropic、ChatGoogle等上包含with_structured_output()方法。自动将LangChain工具转换为结构化输出模式。如果已使用LangChain Agent且希望不换库添加模式强制,使用这个方法。
如何测试结构化输出的可靠性?
使用PromptQuorum在多个模型上运行相同的Prompt并测量模式合规性。不同模型(GPT-4.5、Claude 4.7、Gemini 3.1)有不同的结构化输出可靠性。在部署到生产前进行测试。
"约束解码"是什么意思?
约束解码将Token生成限制为仅符合您模式的有效值。Outlines通过计算每一步的有效下一个Token集来实现。这保证了模式合规性,无需后处理验证或重试,比API级别的JSON模式更快更可靠。
可以不用任何库使用结构化输出吗?
从技术上可以——您可以提示模型返回JSON并自己解析。但验证会因幻觉而失败。6个工具都通过重试验证(Instructor、Marvin)、解码时强制(Outlines)或封装Provider API(LangChain、Pydantic AI)来解决。
哪个工具的文档最好?
LangChain和Pydantic AI因企业支持拥有最全面的文档。Instructor虽然是社区维护但有很好的教程和示例。Outlines的文档很技术性但很全面。Marvin有快速入门指南。
需要全部6个工具还是只需要一个?
从一个开始。Python开发者试试Instructor或Pydantic AI。本地模型团队试试Outlines。LangChain用户试试LangChain的with_structured_output()。用PromptQuorum验证跨模型一致性。大多数团队使用一个工具加PromptQuorum进行测试。
在中国部署LLM结构化输出需要符合哪些数据安全要求?
主要需要符合《数据安全法》(2021年)和PIPL。处理个人信息或重要数据的LLM应用应优先考虑本地部署方案,使用Outlines结合Qwen2.5等本地模型可避免数据出境合规问题。金融、医疗等关键行业还需符合行业监管机构的具体要求。
企业级结构化输出合规架构的最佳实践是什么?
推荐使用阿里云、腾讯云或华为云提供的私有化部署环境,在等保2.0合规的基础设施上运行Outlines和本地模型。配合PromptQuorum进行多模型一致性测试,选出最适合业务场景的模型后再推向生产。建立模式验证日志以满足审计要求。
参考来源
- Instructor GitHub仓库 — Instructor库的官方仓库和文档
- Outlines文档 — 保证模式合规性的约束解码
- Pydantic AI — 带结构化输出的类型安全Agent框架
- LangChain with_structured_output() — LangChain统一结构化输出API
- Marvin文档 — 基于装饰器的LLM提取框架