欢迎光临
我们一直在努力

AI Agent白手起家36: LangChain 输出解析器概览与实战

纲要

  • 输出解析器的作用与定位
    • 将大模型的自然语言输出转换为结构化数据
    • 在 LangChain I/O 系统中的位置
  • 常见输出解析器类型
    • StrOutputParser:纯文本,无格式要求
    • JsonOutputParser:JSON 对象,要求指定格式
    • XMLOutputParser:输出字典,需成对标签
    • CsvOutputParser:返回列表
    • PydanticOutputParser:基于 Python 数据模型
    • YamlOutputParser:YAML 格式
  • 格式要求与提示词协作
  • 模型结构化输出支持情况
  • 动手实践:StrOutputParser 与 JsonOutputParser 完整示例

引言

在构建 LLM 应用时,模型输出的本质是自然语言文本。然而,下游系统(API、数据库、前端界面)往往需要结构化的数据,如 JSON 对象、列表或特定格式的字段。LangChain 的输出解析器(Output Parsers)正是为此而生:它定义了一套标准化的机制,将模型生成的文本自动转换为程序可直接消费的数据结构,让文本生成与业务逻辑无缝衔接。

输出解析器在 LangChain 中的定位

LangChain 的经典 I/O 模型由三部分组成:提示词模板(将用户输入与模板结合,生成最终提示)、大模型(处理提示并输出文本)、输出解析器(将文本转换为结构化数据)。三者形成一条数据处理管道:

#mermaid-svg-sicVteGugYHaslOk{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sicVteGugYHaslOk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sicVteGugYHaslOk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sicVteGugYHaslOk .error-icon{fill:#552222;}#mermaid-svg-sicVteGugYHaslOk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sicVteGugYHaslOk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sicVteGugYHaslOk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sicVteGugYHaslOk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sicVteGugYHaslOk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sicVteGugYHaslOk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sicVteGugYHaslOk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sicVteGugYHaslOk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sicVteGugYHaslOk .marker.cross{stroke:#333333;}#mermaid-svg-sicVteGugYHaslOk svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sicVteGugYHaslOk p{margin:0;}#mermaid-svg-sicVteGugYHaslOk .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-sicVteGugYHaslOk .cluster-label text{fill:#333;}#mermaid-svg-sicVteGugYHaslOk .cluster-label span{color:#333;}#mermaid-svg-sicVteGugYHaslOk .cluster-label span p{background-color:transparent;}#mermaid-svg-sicVteGugYHaslOk .label text,#mermaid-svg-sicVteGugYHaslOk span{fill:#333;color:#333;}#mermaid-svg-sicVteGugYHaslOk .node rect,#mermaid-svg-sicVteGugYHaslOk .node circle,#mermaid-svg-sicVteGugYHaslOk .node ellipse,#mermaid-svg-sicVteGugYHaslOk .node polygon,#mermaid-svg-sicVteGugYHaslOk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sicVteGugYHaslOk .rough-node .label text,#mermaid-svg-sicVteGugYHaslOk .node .label text,#mermaid-svg-sicVteGugYHaslOk .image-shape .label,#mermaid-svg-sicVteGugYHaslOk .icon-shape .label{text-anchor:middle;}#mermaid-svg-sicVteGugYHaslOk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sicVteGugYHaslOk .rough-node .label,#mermaid-svg-sicVteGugYHaslOk .node .label,#mermaid-svg-sicVteGugYHaslOk .image-shape .label,#mermaid-svg-sicVteGugYHaslOk .icon-shape .label{text-align:center;}#mermaid-svg-sicVteGugYHaslOk .node.clickable{cursor:pointer;}#mermaid-svg-sicVteGugYHaslOk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sicVteGugYHaslOk .arrowheadPath{fill:#333333;}#mermaid-svg-sicVteGugYHaslOk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sicVteGugYHaslOk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sicVteGugYHaslOk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sicVteGugYHaslOk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sicVteGugYHaslOk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sicVteGugYHaslOk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sicVteGugYHaslOk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sicVteGugYHaslOk .cluster text{fill:#333;}#mermaid-svg-sicVteGugYHaslOk .cluster span{color:#333;}#mermaid-svg-sicVteGugYHaslOk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sicVteGugYHaslOk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sicVteGugYHaslOk rect.text{fill:none;stroke-width:0;}#mermaid-svg-sicVteGugYHaslOk .icon-shape,#mermaid-svg-sicVteGugYHaslOk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sicVteGugYHaslOk .icon-shape p,#mermaid-svg-sicVteGugYHaslOk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sicVteGugYHaslOk .icon-shape .label rect,#mermaid-svg-sicVteGugYHaslOk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sicVteGugYHaslOk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sicVteGugYHaslOk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sicVteGugYHaslOk :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

用户输入

提示词模板

大模型

输出解析器

结构化数据

下游应用

输出解析器的核心任务,就是把模型“说的人话”变成“机器能懂的语言”。早期方法依赖正则表达式从自由文本中抽取信息,但模型输出的随机性导致匹配不稳定。随着模型能力的提升(如支持原生 JSON 模式),解析器可以与模型配合,在生成阶段就要求模型遵循特定格式,从而大幅提高可靠性。

常见的输出解析器一览

LangChain 提供了多种内置解析器,覆盖了主流的数据交换格式。它们的能力和限制可通过下表快速了解:

解析器输出类型是否支持流式格式要求
StrOutputParser 字符串
JsonOutputParser JSON 对象(dict) 需包含 {},符合 JSON 语法
XMLOutputParser 字典(dict) 成对标签
CsvOutputParser 字符串列表 逗号分隔
PydanticOutputParser Pydantic BaseModel 实例 遵循模型字段定义
YamlOutputParser Pydantic BaseModel 实例 YAML 语法

使用这些解析器时有两个关键点:

  • 将格式要求注入提示词:解析器通过 get_format_instructions() 方法生成一段说明文字,必须将其拼接到提示词中,以指导模型按约定格式输出。
  • 注意下游数据类型匹配:不同的解析器产出的数据类型不同,下游处理时必须对应使用,否则会引发类型错误。
  • 模型结构化输出支持情况

    并非所有模型都原生支持结构化输出。LangChain 对常见模型的能力进行了标注,部分示例如下:

    模型支持结构化输出支持工具调用支持流式
    OpenAI (gpt-4o, gpt-3.5-turbo)
    DeepSeek (v3, r1) 是(但非原生 JSON 模式) 部分版本支持
    Anthropic Claude
    社区模型(如 Ollama 本地) 取决于具体模型 取决于具体模型 取决于具体模型

    因此,在选定模型后,务必验证其能力与解析器的兼容性。例如,若模型不支持工具调用,强行使用 PydanticOutputParser 可能无法得到预期结果。

    动手实践:StrOutputParser 与 JsonOutputParser

    下面通过一个完整可运行的示例,演示两种最常用的解析器。示例使用 ChatOpenAI 作为模型(需自行配置 API Key),但也可替换为其他兼容模型。

    环境准备

    安装依赖:

    pip install langchain langchain-core langchain-openai

    设置 API Key(以 OpenAI 为例):

    export OPENAI_API_KEY="你的OpenAI密钥"

    代码

    from langchain_core.prompts import ChatPromptTemplate
    from langchain_openai import ChatOpenAI
    from langchain_core.output_parsers import StrOutputParser, JsonOutputParser

    # 初始化模型(使用 gpt-3.5-turbo 以保证兼容性)
    model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

    # ========== 1. 字符串解析器 ==========
    str_prompt = ChatPromptTemplate.from_template(
    "用一句话介绍{subject}。"
    )
    str_chain = str_prompt | model | StrOutputParser()
    str_result = str_chain.invoke({"subject": "LangChain"})
    print("字符串输出:", str_result)
    print()

    # ========== 2. JSON 解析器 ==========
    # 定义期望的 JSON 格式
    json_parser = JsonOutputParser()
    # 获取格式指令并注入提示词
    format_instructions = json_parser.get_format_instructions()
    json_prompt = ChatPromptTemplate.from_template(
    "请以 JSON 对象的形式返回以下信息,包含 name 和 age 两个字段。\\n"
    "{format_instructions}\\n"
    "用户输入:{input}"
    )
    json_chain = json_prompt | model | json_parser
    json_result = json_chain.invoke({
    "input": "我叫小明,今年25岁。",
    "format_instructions": format_instructions
    })
    print("JSON 输出:", json_result)
    print("类型:", type(json_result))
    print("姓名:", json_result.get("name"))

    输出示例

    字符串输出: LangChain 是一个用于构建大语言模型应用的开源框架。
    JSON 输出: {'name': '小明', 'age': 25}
    类型: <class 'dict'>
    姓名: 小明

    通过 StrOutputParser 可以直接获得干净字符串;而 JsonOutputParser 则确保了返回的是一个符合 JSON 规范的 Python 字典,可直接用于后续逻辑。

    注意事项与最佳实践

    • 始终注入格式说明:除 StrOutputParser 外,其他解析器必须通过 get_format_instructions() 获取要求并加入提示词。
    • 测试模型兼容性:在切换模型时,先用简单示例验证解析器是否能正常工作,特别是 PydanticOutputParser 等依赖模型较强的结构化输出能力的解析器。
    • 错误处理:解析失败时(如 JSON 格式错误),LangChain 提供了 OutputFixingParser 等容错机制,可以自动尝试修复,后续文章将深入介绍。
    • 结合 Chain 使用:解析器可以作为 LangChain Expression Language (LCEL) 管道的一部分,通过 | 符号与提示词、模型串联,构建清晰的数据流。

    总结

    输出解析器是连接大模型“模糊输出”与“精确业务”之间的桥梁。

    通过合理选用字符串、JSON、Pydantic 等解析器,并配合提示词注入格式指令,我们可以让模型的回答变得可预测、可结构化,从而显著提升 LLM 应用的工程化水平。

    初学者可以从 StrOutputParser 和 JsonOutputParser 入手,逐步扩展到更复杂的自定义解析场景。

    赞(0)
    未经允许不得转载:171主机测评 » AI Agent白手起家36: LangChain 输出解析器概览与实战
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址