结构化输出与重试机制:让 Agent 更稳定
结构化输出与重试机制:让 Agent 更稳定
大模型返回的是自由文本,格式不固定。如果你需要把结果接入 API 或填表单,结构化输出是必须的。同时,网络请求总会偶尔失败,重试和降级机制能让程序更健壮。
结构化输出
用 dataclass 定义输出格式,用 ToolStrategy 包装:
from dataclasses import dataclass
from langchain.agents import create_agent
from langchain.agents.structured_output import ToolStrategy
@dataclass
class ResponseFormat:
role: str
content: str
agent = create_agent(
model=model,
response_format=ToolStrategy(ResponseFormat),
system_prompt="你是一个有结构化输出的助手。",
)
response = agent.invoke({"messages": [{"role": "user", "content": "介绍你自己"}]})
print(response["structured_response"].role)
print(response["structured_response"].content)
模型被强制按 dataclass 的字段返回,你拿到的是类型安全的对象而不是字符串。
重试与降级
API 调用可能因网络问题失败。with_retry 和 with_fallbacks 组合使用:
from langchain.chat_models import init_chat_model
fallback_model = init_chat_model("openai:gpt-4o-mini")
model = (
init_chat_model("openai:gpt-4.1-mini", max_retries=5)
.with_retry(
retry_if_exception_type=(ConnectionError, TimeoutError),
wait_exponential_jitter=True,
stop_after_attempt=3,
)
.with_fallbacks([fallback_model])
)
执行顺序:先试主模型,失败则指数退避重试,重试 3 次还失败就切换到备用模型。wait_exponential_jitter 加了随机抖动,避免所有客户端同时重试压垂服务器。
这套组合拳在生产环境很常用。主模型用质量好但贵的,备用模型用便宜的保底。
小结
结构化输出保证格式可预测,重试加降级保证服务可用性。两者都是从开发走向生产的必备工具。