让模型“按 JSON 回答”不等于输出一定可解析。LangChain 的结构化输出把目标 Schema 交给智能体,并在结果的 structured_response 中返回已校验对象。 示例分类结果来自人为编写的测试文本,不代表真实工单效果,代码未在你的模型版本上实测;ProviderStrategy 或 ToolStrategy 的选择由当前模型能力决定。
本篇验收要点:定义 TicketResult Schema,并在 create_agent 中把它作为 response_format。 调用后读取 structured_response,并用字段类型和枚举规则拒绝缺失、额外或非法值。

定义窄而明确的 Schema
from typing import Literal
from pydantic import BaseModel, Field
from langchain.agents import create_agent
class TicketResult(BaseModel):
category: Literal["refund", "delivery", "other"]
priority: Literal["low", "medium", "high"]
reason: str = Field(min_length=5, max_length=120)
agent = create_agent(
model="YOUR_SUPPORTED_MODEL",
tools=[],
response_format=TicketResult,
system_prompt="Classify only from the user's text.",
)
调用并读取结构化结果
result = agent.invoke({
"messages": [{
"role": "user",
"content": "包裹晚了两天,我明天出差,请优先处理"
}]
})
ticket = result["structured_response"]
print(ticket.category, ticket.priority, ticket.reason)
assert ticket.priority in {"low", "medium", "high"}
不要同时要求一大段自由文本和复杂对象。展示给用户的说明可以由程序根据已校验字段生成,或放在 Schema 的单独短字段中。
处理失败而不是静默降级
如果模型不支持原生结构化输出,LangChain 可能使用工具策略;具体行为以当前文档和模型能力为准。捕获校验异常,记录原始请求 ID 与错误类型,并把工单送入人工队列。不要在解析失败时默认写成 low,也不要把未校验字符串直接入库。
读者下一步是先把业务真正需要的字段缩减到三到五项,并为每项写清类型与允许值。
验证标准是 structured_response 可以作为 TicketResult 访问,priority 只能是 low、medium 或 high,空 reason 会触发校验失败,程序不再从自然语言里用正则猜字段。
常见问题
结构化输出能保证事实正确吗?
不能。它保证形状和类型更可靠,事实仍要通过来源、业务规则或人工审核验证。
字段越多越好吗?
不是。字段越多,缺失和矛盾越多。先保留下游程序真正使用的字段。
官方资料与适用边界
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31161.html