在上一篇里,我们解决了“怎么调模型”:初始化、消息格式、同步异步、流式、批量。但模型返回的始终是一段自由文本,而真实的程序需要的是能直接使用的数据结构;并且一个稍复杂的任务往往要经过“拼提示词 → 调模型 → 解析结果”好几步。这一篇就解决这两个问题:让输出结构化,以及把步骤编排成链。
一、为什么需要输出解析#
上一篇里所有的调用都是这样收尾的:
response = model.invoke("...")
print(response.content) # 一段自由文本
打印出来给人看没问题,但程序没法消费自由文本。想象一个场景:让模型从一段话里提取日程信息,你希望拿到的是 event.name、event.date 这样能直接访问的字段,而不是“好的!这段话中提到的日程是……”这样一段话,还得自己写正则去抠。
让模型输出结构化数据,主流有两条路:
- 提示词约束:在提示词里明确要求模型“只输出 JSON,格式如下”,拿到文本后再解析成字典——对任何模型都有效;
- 厂商原生结构化输出:利用厂商 API 自带的结构化能力,由服务端保证输出符合给定 schema——更可靠,但要求模型支持。
下面分别看这两种。
二、方式一:JsonOutputParser——提示词约束 JSON#
自己在提示词里手写“请输出 JSON,包含 xx 字段……”当然可以,但格式说明写得不严谨,模型就容易跑偏。JsonOutputParser 帮你把这段提示词生成出来:先用 Pydantic 类描述目标结构,解析器会据此生成一份严格的格式说明。
from typing import List
from pydantic import BaseModel
from langchain_core.output_parsers import JsonOutputParser
# 1. 用 Pydantic 类描述你想要的结构
class Star(BaseModel):
name: str
age: int
class StarList(BaseModel):
stars: List[Star]
# 2. 创建解析器,并让它生成格式说明提示词
parser = JsonOutputParser(pydantic_object=StarList)
format_instructions = parser.get_format_instructions()
# 内容大意:输出必须是符合以下 JSON schema 的实例……(附上完整 schema)
# 3. 把格式说明放进 system 消息,正常提问
messages = [
{: , : format_instructions},
{: , : },
]
response = model.invoke(messages)
result = parser.parse(response.content)
names = [star[] star result[]]
(names)



还没有公开留言,成为第一个写下回声的人。