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 还⽀持我们⾃定义输出解析器,以将模型输出结构化为⾃定义格式,详细情况 参考 这⾥

相关推荐
To_OC4 小时前
搞懂 Token 和 Embedding 后,我终于明白大模型是怎么 "读" 文字的
人工智能·llm·agent
Hyyy7 小时前
Temperature 与 Top-p:控制模型输出的两个参数
llm·ai编程
Darling噜啦啦9 小时前
LLM 无状态本质与上下文工程:从 Prompt 到 Context 的进化——为什么 AI 总是"失忆"?
llm
星始流年9 小时前
从 Tool 到 Skill——基于 LangChain 的服务端Skill实现
前端·langchain·agent
智泊AI10 小时前
AI大模型到底是怎么训练出来的?完整预训练过程一次性讲明白!
llm
嘻嘻仙人17 小时前
Python 开发者的性能革命:为什么你应该从 pip 转向 uv?
llm·agent
universeplayer17 小时前
我给 AI Agent 装了个飞机黑匣子:录下每一次 LLM 调用,崩了能确定性回放
llm·agent
JieE21217 小时前
从"无状态"到"懂你":深入理解 LLM 对话的本质,以及 Prompt/Context/Loop 三层工程进化之路
人工智能·llm·ai编程
Lkstar18 小时前
Function Calling 原理深度拆解:让 LLM 调用外部工具的机制与工具设计原则
人工智能·llm
codedx19 小时前
LangChain 和 LangGraph 构建的 Agent 项目模版
后端·langchain·agent