news 2026/5/8 23:33:31

LLM结构化输出实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LLM结构化输出实战

LLM结构化输出实战:PydanticAI vs Instructor vs LangChain完整对比

从JSON混乱到精准数据提取,三大框架深度对比与实战测试

前言:为什么你需要结构化输出

做AI应用开发的朋友一定遇到过这个场景:你让GPT帮你从一段文本中提取信息,结果它返回了一段"看起来像JSON"的文本——少了个引号、多了个逗号、嵌套结构错乱。你花30分钟写正则去解析,然后再花30分钟处理各种边缘情况。

# 你期望的输出{"name":"张三","age":28,"skills":["Python","Go"]}# 实际拿到的Sure! Here's the extracted information:{"name":"张三","age":"28",# 字符串?数字?谁知道呢"skills":["Python","Go"}# 逗号呢?括号呢?

这就是为什么我们需要**结构化输出(Structured Output)**框架。它们的核心目标只有一个:让LLM输出可靠、可解析、类型安全的结构化数据。

2025-2026年,三个主流框架脱颖而出:

  • PydanticAI:Pydantic官方团队出品,类型安全至上
  • Instructor:社区驱动,retry机制强大
  • LangChain with_structured_output:生态完整,一站式方案

本文将从原理到实战,完整对比这三个框架,帮你做出最佳选型。


一、三大框架深度解析

1.1 PydanticAI:类型安全的AI Agent框架

PydanticAI是Pydantic团队专门为AI应用开发的框架,它的核心理念是:用Python类型系统约束LLM输出

frompydanticimportBaseModel,Fieldfrompydantic_aiimportAgent# 定义数据模型classUserProfile(BaseModel):"""用户画像"""name:str=Field(description="用户姓名")age:int=Field(description="年龄,必须是正整数",ge=0,le=150)skills:list[str]=Field(description="技能列表",min_length=1)experience_years:float=Field(description="工作经验年限",ge=0)# 创建Agentagent=Agent('openai:gpt-4o',result_type=UserProfile,system_prompt="从文本中提取用户画像信息,确保数据准确。")# 同步调用result=agent.run_sync("张三,28岁,3年Python开发经验,擅长Python和Go")print(result.data)# UserProfile(name='张三', age=28, skills=['Python', 'Go'], experience_years=3.0)

PydanticAI的核心优势

  1. 原生类型验证:Pydantic的Field约束直接传递给LLM,返回数据自动验证
  2. 依赖注入系统:支持复杂的依赖管理和上下文传递
  3. 流式输出:支持结构化数据的流式生成
  4. 多模型适配:OpenAI、Anthropic、Gemini等统一接口
# 错误写法:不加约束,LLM可能返回任意值classBadModel(BaseModel):age:int# LLM可能返回 "twenty-eight" 或 -5# 正确写法:加上Pydantic约束classGoodModel(BaseModel):age:int=Field(ge=0,le=150,description="年龄必须是0-150的整数")

踩坑经验:PydanticAI的result_type在使用本地模型(如Ollama)时,需要确保模型支持JSON mode,否则解析会频繁失败。建议本地模型配合result_validator使用。

1.2 Instructor:Retry机制的王者

Instructor的核心思路是:包装OpenAI/Anthropic客户端,自动处理JSON解析失败并retry

importinstructorfrompydanticimportBaseModel,FieldfromopenaiimportOpenAI# 包装客户端client=instructor.from_openai(OpenAI())classExtractedTransaction(BaseModel):"""交易信息提取"""amount:float=Field(description="交易金额")currency:str=Field(description="货币代码,如CNY、USD")merchant:str=Field(description="商户名称")category:str=Field(description="消费类别",enum=["餐饮","交通","购物","娱乐","其他"])# 调用方式与OpenAI原生API几乎一致transaction=client.chat.completions.create(model="gpt-4o",response_model=ExtractedTransaction,max_retries=3,# 自动retry,这是Instructor的核心能力messages=[{"role":"user","content":"昨天在星巴克花了38块钱买咖啡"}])print(transaction)# ExtractedTransaction(amount=38.0, currency='CNY', merchant='星巴克', category='餐饮')

Instructor的核心优势

  1. 自动Retry:当LLM输出不符合Pydantic schema时,自动将验证错误反馈给LLM重试
  2. 零入侵:只需instructor.from_openai()包装即可,几乎不改变原有代码
  3. Partial模式:支持流式返回部分结果(streaming structured output)
  4. 多后端支持:OpenAI、Anthropic、Cohere、Mistral等
# Instructor的Partial模式 - 流式返回结构化数据frominstructorimportPartial# 使用create方法并启用partialstream=client.chat.completions.create(model="gpt-4o",response_model=Partial[ExtractedTransaction],stream=True,messages=[{"role":"user","content":"在星巴克消费38元"}])forpartialinstream:print(partial.model_dump())# 逐步输出:先有amount,再有currency,最后有category

踩坑经验:Instructor的max_retries参数不是简单的重试次数,它会把前一次的validation error作为上下文传给LLM,所以retry次数不宜超过3次,否则会消耗过多token。

# 错误写法:retry次数太多,浪费tokenresult=client.chat.completions.create(max_retries=5,# 太多了!...)# 正确写法:2-3次足够result=client.chat.completions.create(max_retries=2,# 如果2次都失败,说明prompt本身有问题...)

1.3 LangChain with_structured_output

LangChain的方案是将结构化输出集成到它的Chain/Agent生态中。

fromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplatefrompydanticimportBaseModel,FieldfromtypingimportOptionalclassCompanyInfo(BaseModel):"""公司信息"""name:str=Field(description="公司名称"
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 23:31:26

MackingJAI:简化AI模型本地部署与集成的开发框架

1. 项目概述与核心价值最近在AI应用开发圈子里,一个名为“MackingJAI”的项目引起了我的注意。这个由开发者0ssamaak0创建的项目,名字本身就很有意思——“Macking”这个词,在俚语里常指“制作”或“构建”,而“JAI”则让人联想到…

作者头像 李华
网站建设 2026/5/8 23:30:04

从硬件抽象到配方引擎:用软件工程思维构建虚拟咖啡吧

1. 项目概述:当咖啡机遇上代码如果你和我一样,是个既离不开咖啡因,又整天和代码打交道的开发者,那么“EspressoBar”这个项目可能会让你会心一笑。它不是一个真正的咖啡吧,而是一个将咖啡制作流程与软件开发理念巧妙结…

作者头像 李华
网站建设 2026/5/8 23:21:32

计算机能效标准下的功耗优化:从芯片到系统的设计实践

1. 项目概述:计算机能效标准化的时代浪潮作为一名在电子工程和电源管理领域摸爬滚打了十几年的从业者,我亲眼见证了计算设备从单纯追求性能到如今性能与能效并重的深刻转变。最近,关于美国加州可能率先推出针对计算机和显示器的强制性能效标准…

作者头像 李华
网站建设 2026/5/8 23:20:34

为什么你背了这么多年单词,英语还是没进步?

很多人学英语都有一个共同的问题:单词背了又忘,忘了又背。早上记住,晚上忘掉。 背了几千个单词,看到英文文章还是读不懂。 甚至有时候一个单词明明“眼熟”,但就是想不起来什么意思。 其实,大多数人不是不努…

作者头像 李华
网站建设 2026/5/8 23:19:33

如何高效捕获网络流媒体资源:猫抓扩展深度技术解析

如何高效捕获网络流媒体资源:猫抓扩展深度技术解析 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在当今数字化内容爆炸的时代&#x…

作者头像 李华