5.LangChain--输出解析器

前面LangChain系列中我们或多或少都在代码中体现过输出解析结构化,今天我们系统总结其中比较常见的。

1.概念

Def

负责获取模型的输出,并将输出转换为更结构化的格式
⼤型语⾔模型(LLM)的输出本质上是⾮结构化的⽂本。但在构建应⽤程序时,我们通常希望得到结构化的、机器可读的数据,这样可以将其转换为更适合下游任务的格式
输出解析器的作⽤就是架起这座桥梁:它们将 LLM 的⾮结构化⽂本输出转换为结构化格式。这使得与 LLM 的交互从"模糊的⽂本对话"变成了"精确的数据 API 调⽤",是构建可靠、⾼效 LLM 应⽤不可 或缺的组件

辨析with_structured_output()

在结构化返回那里我们提到了一个with_structured_output(),其与输出解析器实现的功能相同,但在以下方面存在差异:
(1)维度不同:输出解析器是 LangChain 中的⼀个功能性组件, with_structured_output() 是 聊天模型的⼀个⽅法。
(2**)⽤法不同**: 输出解析器的⼯作流程可以是链式的 ,可以将 Prompt、LLM 和 Parser 像管道⼀样连接 起来: chain = prompt | llm | parser 。⽽ with_structured_output(schema) 却不⾏,只能⼿动调⽤,返回⼀个新的、具备了结构化的输出

2.文本输出 StrOutputParser

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
model = ChatOpenAI(model="gpt-4o-mini")
chain = model | StrOutputParser()
for chunk in chain.stream("写⼀⾸夏天的诗词,50字以内。"):
print(chunk, end="|")

若是不使⽤输出解析器,⽽是直接得到聊天模型返回的 AIMessage,⽂本内容则需要从消息中的content 字段获取

3.结构化对象输出

Pydantic对象 PydanticOutputParser

class langchain_core.output_parsers.pydantic. PydanticOutputParser 类,
其参数如下:
pydantic_object :要解析的 pydantic 模型。
内置⽅法:
invoke() :将单个输⼊转换为输出。
get_format_instructions() str :重要!!
作⽤:⽣成⼀个指令字符串,这个字符串会被添加到发送给 LLM 的提⽰(Prompt)的末尾。
⽬的:告诉 LLM 应该以什么样的格式返回它的响应。例如,"请将你的回复封装在 XML 标签
中"或"请以 JSON 格式输出,包含 'name' 和 'age' 两个字段"。

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import PromptTemplate
from typing import Optional
from pydantic import BaseModel, Field

# 定义⼤模型
model = ChatOpenAI(model="gpt-4o-mini")

# 定义输出结构:Pydantic 类
class Joke(BaseModel):
    """给⽤⼾讲⼀个笑话。"""
    setup: str = Field(description="这个笑话的开头")
    punchline: str = Field(description="这个笑话的妙语")
    rating: Optional[int] = Field(
    default=None, description="从1到10分,给这个笑话评分")

# 设置解析器
parser = PydanticOutputParser(pydantic_object=Joke)

# 提⽰词模板
prompt = PromptTemplate(
    template="Answer the user query.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    # partial_variables:提⽰模板携带的部分变量的字典,⽆需在每次调⽤提⽰时都传⼊它们。
    # 类型为 Mapping[str, Any],传⼊template携带的部分变量的字典。
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model | parser
for chunk in chain.stream({"query": "给我讲⼀个关于唱歌的笑话"}):
print(chunk, end="|")

JSON对象 JsonOutputParser

在结构化输出那里我们通过手动定义JSON schema来结构化输出,但那样过于复杂并存在误差,所以我们可以使用JsonOutputParser来定义输出解析器
class langchain_core.output_parsers.json. JsonOutputParser 类,
其参数如下:
pydantic_object :⽤于验证的 Pydantic 对象。如果为空,则不执⾏任何验证。
内置⽅法:
invoke() :将单个输⼊转换为输出。
get_format_instructions() str :重要!!
作⽤:⽣成⼀个指令字符串,这个字符串会被添加到发送给 LLM 的提⽰(Prompt)的末尾。
⽬的:告诉 LLM 应该以什么样的格式返回它的响应。例如,"请将你的回复封装在 XML 标签
中"或"请以 JSON 格式输出,包含 'name' 和 'age' 两个字段"。

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
# 定义⼤模型
model = ChatOpenAI(model="gpt-4o-mini")
# 设置解析器
parser = JsonOutputParser()
# 提⽰词模板
prompt = PromptTemplate(
    template="Answer the user query.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model | parser
print(chain.invoke({"query": "给我讲⼀个关于唱歌的笑话"}))

4.其余输出

除了上⾯讲的⽂本、对象、JSON解析器,其实 LangChain 官⽅还提供了更多类型的解析器,如:
XML 解析器: XMLOutputParser
Yaml 解析器: YamlOutputParser
CSV 解析器: CommaSeparatedListOutputParser
枚举解析器: EnumOutputParser
⽇期解析器: DatetimeOutputParser 等等,更多类型参考 这⾥
除此之外,LangChain 还⽀持我们⾃定义输出解析器,以将模型输出结构化为⾃定义格式,详细情况 参考 这⾥

相关推荐
SuniaWang2 小时前
《AgentX 专栏》07-全链路可观测:用OpenTelemetry+Jaeger让每次AI对话都可追踪可复盘
java·人工智能·spring·架构·langchain·opentelemetry·agenx
糖果店的幽灵2 小时前
LangChain 1.3 完全教程:从入门到精通-Part 9: RAG(检索增强生成)
人工智能·langchain
花花少年3 小时前
Ubuntu系统下安装Claude Code
llm·agent·claude code
星浩AI16 小时前
项目实战:合同智能审批 · LangGraph + HITL 人机协同方案 [有源码]
后端·langchain·agent
兆。17 小时前
LangChain大模型服务集成指南:面向AI应用开发者
人工智能·langchain
格桑阿sir18 小时前
09-大模型智能体开发工程师:结构化输出与JSON Schema
ai·大模型·llm·agent·json schema·智能体·结构化
wuhen_n19 小时前
LangChain 核心:Chain 链式调用实现复杂 AI 任务
前端·langchain·ai编程
百度智能云技术站19 小时前
训练周期减半:LoongForge 全链路优化 GR00T N1.6 训练,吞吐提升至 2.3 倍
机器人·llm