第 6 章:结构化输出与模型配置
结构化输出能将模型的自由文本能力转化为可控、可验证的数据接口,是工程化的基础。
结构化输出的必要性:保证可预测的格式
在许多应用场景中,仅仅获得大语言模型(LLM, Large Language Model)生成的自然语言文本是不够的。例如,当需要提取特定字段、将数据传递给下游系统(如数据库或 API)或执行复杂的验证时,需要模型提供特定、可预测的格式化数据。
结构化输出(Structured Output) 允许智能体返回特定格式(如 JSON 对象、Pydantic 模型或 dataclass)的数据。
- 保证可预测性:结构化输出将非结构化文本转换为经过验证的结构化数据。
- 应用集成:应用程序可以直接解析和使用结构化数据,无需处理自然语言解析的复杂性和不确定性。
LangChain 的 create_agent 函数自动处理结构化输出:用户设置所需模式,智能体捕捉、验证并返回结构化数据,这些数据存储在智能体状态的 structured_response 键中。
响应格式的定义与要求:使用 dataclass 或 Pydantic
为了指导模型生成结构化输出,开发者必须定义一个清晰的模式(Schema),包括字段名称、类型和描述。
推荐在 Python 中使用 dataclass 或 Pydantic 模型来定义响应模式。Pydantic 模型提供了丰富的功能集,包括字段验证、描述和嵌套结构。
在实际案例中,响应模式可定义为 ResponseFormat,使用 dataclass 保证输出包含固定的 punny_response 字段和可选的 weather_conditions 字段。
模式定义必须清晰,字段名称、类型和描述需指定输出应遵守的精确格式。
结构化输出策略
LangChain 提供多种结构化输出策略,通过 response_format 参数进行控制。当提供一个模式类型(type[StructuredResponseT])时,LangChain 会根据模型能力自动选择最佳策略。
下表对比了两种主流结构化输出策略及其适用场景:
| 策略类型 | 机制与优势 | 适用场景 |
|---|---|---|
| ProviderStrategy | 利用模型提供商原生结构化输出能力,API 层强制模式验证,可靠性高 | 支持原生结构化输出的模型 |
| ToolStrategy | 通过工具调用模拟结构化输出,兼容所有支持工具调用的模型 | 不支持原生结构化输出的模型 |
- ProviderStrategy:当模型支持原生结构化输出时,LangChain 会自动选择此策略,API 层强制执行模式,可靠性高。
- ToolStrategy:适用于不支持原生结构化输出的模型,通过工具调用实现结构化输出,可用
tool_message_content参数自定义工具消息内容。
结构化输出的错误处理与重试机制
模型在通过工具调用生成结构化输出时可能会犯错,如输出格式不匹配或调用了错误的工具。LangChain 提供智能重试机制自动处理这些错误。
常见错误类型包括:
- Schema Validation Error:生成输出不匹配预期模式时,智能体会提供特定错误反馈。
- Multiple Structured Outputs Error:模型错误地调用了多个结构化输出工具。
错误处理策略可通过 handle_errors 参数自定义:
- 自定义错误消息:设置为字符串时,智能体始终提示模型使用固定工具消息重试。
- 处理特定异常:指定异常类型或元组,智能体仅在抛出指定异常时重试,否则抛出异常。
- 自定义错误处理函数:可提供自定义函数处理特定验证错误或其他异常。
系统提示(System Prompt)的设计与动态调整
系统提示是控制智能体行为和能力的关键模型上下文组成部分,设定模型角色、语气和响应指南。
静态配置:最常见方法是提供字符串作为 system_prompt 参数。未提供时,智能体会从消息中推断任务。
实际案例中,可定义详细系统提示,将智能体设定为“以双关语发言的专业天气预报员”,并指导其在用户询问天气时必须先使用工具获取位置。
动态系统提示:高级用例可根据运行时上下文或智能体状态修改系统提示。通过中间件实现动态系统提示,@dynamic_prompt 装饰器用于创建可根据模型请求动态生成系统提示的中间件。使用 @wrap_model_call 或 @dynamic_prompt 进行的修改是瞬态的,仅影响单次模型调用,不改变状态中保存内容。
总结
结构化输出与严格的解析流程,是从原型到生产化的重要一环,能显著提升可用性与自动化程度。