一、LangChain 中的输出解析器概述
输出解析器(OutputParser)是一种专门设计用于处理和解析语言模型响应的工具,旨在将模型输出的文本转化为结构化信息,以便程序进一步处理。
核心方法
get_format_instructions():提供格式化指令,指导模型输出符合预期的格式。parse():解析模型的输出,转化为特定的数据结构。parse_with_prompt()(可选):结合原始提示解析模型输出,确保结果更加精准。
常见解析器种类
- 列表解析器(List Parser):处理列表格式输出。
- 日期时间解析器(Datetime Parser):处理日期和时间输出。
- 枚举解析器(Enum Parser):输出必须是预定义值时使用。
- 结构化输出解析器(Structured Output Parser):适合复杂的结构化回答。
- Pydantic(JSON)解析器:处理符合 JSON 格式的复杂数据结构。
- 自动修复解析器(Auto-Fixing Parser):自动修正常见的格式错误。
- 重试解析器(RetryWithErrorOutputParser):处理内容缺失或不完整的问题,通过与模型的二次交互生成正确输出。
二、Pydantic(JSON)解析器实战
1. 定义数据格式
利用 Pydantic 创建数据模型(如 FlowerDescription),定义字段及其类型,并自动验证输入数据。
示例代码
from pydantic import BaseModel, Field
class FlowerDescription(BaseModel):
flower_type: str = Field(description="鲜花的种类")
price: int = Field(description="鲜花的价格")
description: str = Field(description="鲜花的描述文案")
reason: str = Field(description="为什么要这样写这个文案")
2. 创建输出解析器
利用 PydanticOutputParser 创建解析器,并获取输出格式指示。
from langchain.output_parsers import PydanticOutputParser
output_parser = PydanticOutputParser(pydantic_object=FlowerDescription)
format_instructions = output_parser.get_format_instructions()
format_instructions:描述输出需要符合的 JSON Schema 结构。- 指定字段名称、类型、描述等。
- 提供示例,说明什么是格式正确的输出。
3. 生成提示模板
定义提示模板,将 format_instructions 格式指示嵌入到提示模板中,确保模型生成的输出符合指定格式。
from langchain import PromptTemplate
prompt_template = """您是一位专业的鲜花店文案撰写员。
对于售价为 {price} 元的 {flower} ,您能提供一个吸引人的简短中文描述吗?
{format_instructions}"""
prompt = PromptTemplate.from_template(prompt_template,
partial_variables={"format_instructions": format_instructions})
4. 解析输出并存储
使用提示生成输入,获取模型输出并解析,最后存储在 DataFrame 中。
for flower, price in zip(flowers, prices):
input = prompt.format(flower=flower, price=price)
output = model(input)
parsed_output = output_parser.parse(output)
df.loc[len(df)] = parsed_output.dict()
输出示例:
{
"flower_type": "玫瑰",
"price": 50,
"description": "玫瑰是最浪漫的花,柔和的粉红色象征浓浓的爱意。",
"reason": "玫瑰代表爱情,是最浪漫的礼物。"
}
三、自动修复解析器(OutputFixingParser)
用于自动修复格式错误的输出,例如 JSON 格式中的单双引号问题。
用法
from langchain.output_parsers import OutputFixingParser
from langchain.chat_models import ChatOpenAI
misformatted = "{'name': '康乃馨', 'colors': ['粉红色','白色']}"
new_parser = OutputFixingParser.from_llm(parser=parser, llm=ChatOpenAI())
result = new_parser.parse(misformatted)
输出结果:
name='康乃馨' colors=['粉红色', '白色']
优点:
- 自动修复小的格式问题。
- 使用 LLM 的推理能力补充细节。
四、重试解析器(RetryWithErrorOutputParser)
适用于输出缺失或不完整的问题,通过重新与模型交互生成正确的结果。
用法
from langchain.output_parsers import RetryWithErrorOutputParser
from langchain.llms import OpenAI
retry_parser = RetryWithErrorOutputParser.from_llm(
parser=parser, llm=OpenAI(temperature=0)
)
parse_result = retry_parser.parse_with_prompt(bad_response, prompt_value)
优点:
- 解决内容缺失问题。
- 根据原始提示生成更贴合预期的结果。
五、对比与总结
| 特性 | Pydantic解析器 | 自动修复解析器 | 重试解析器 |
|---|---|---|---|
| 适用场景 | 复杂数据结构的验证与解析 | 小的格式错误修正 | 缺失内容修复与补充 |
| 实现方式 | 类型验证、格式定义 | 调用LLM修复 | 利用LLM重新生成输出 |
| 优点 | 强类型验证,灵活易用 | 快速修复常见错误 | 输出更完整、准确 |
| 缺点 | 格式错误无法直接修复 | 修复能力有限 | 可能增加调用成本 |
六、应用建议
- 简单场景:直接使用
PydanticOutputParser定义格式。 - 小错误修复:优先选择
OutputFixingParser。 - 高精度需求:在内容缺失或需严格验证时使用
RetryWithErrorOutputParser。
七、个人思考
通过实践LangChain的输出解析器,充分体会到构建复杂数据处理系统的灵活性。自动修复和重试解析器充分展现了LLM的强大潜力,但需合理选择工具以平衡成本与效率。在未来实际应用中,应根据具体需求设计最适合的解析流程,提高系统的鲁棒性与可靠性。