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