🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏:https://blog.csdn.net/qinjh_/category_13137010.html

  9efbcbc3d25747719da38c01b3fa9b4f.gif​​​

目录

输出解析器(Output parsers)

概念

与with_structured_output() 的区别

解析文本输出

解析结构化对象输出

解析 JSON 输出


前言

    💬 hello! 各位铁子们大家好哇。

             今日更新了LangChain相关内容
    🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

输出解析器(Output parsers)

概念

负责获取模型的输出,并将输出转换为更结构化的格式。当使用 LLM 生成结构化数据或规范化聊天模 型和 LLM 的输出时,这很有用。

大型语言模型(LLM)的输出本质上是非结构化的文本。但在构建应用程序时,我们通常希望得到结 构化的、机器可读的数据,这样可以将其转换为更适合下游任务的格式,比如:

  • JSON 对象
  • Python 字典或列表
  • 一个特定的 Pydantic 模型实例
  • 一个简单的布尔值或字符串枚举

输出解析器的作用就是架起这座桥梁:它们将 LLM 的非结构化文本输出转换为结构化格式。这使得与 LLM 的交互从“模糊的文本对话”变成了“精确的数据 API 调用”,是构建可靠、高效 LLM 应用不可 或缺的组件。

与with_structured_output() 的区别

他们都实现了相同的功能,但

  • 维度不同:输出解析器是 LangChain 中的一个功能性组件, with_structured_output() 是 聊天模型的一个方法。
  • 用法不同:输出解析器的工作流程可以是链式的,可以将 Prompt、LLM 和 Parser 像管道一样连接 起来: chain = prompt | llm | parser 。而with_structured_output(schema) 却不行,只能手动调用,返回一个新的、具备了结构 化输出能力的 Runnable(可运行对象)

可以根据自己的使用场景选择,如果想使用链式就选择输出解析器。

解析文本输出

其实对于使用 StrOutputParser 输出解析器输出文本,我们已经使用过多次了。对于 StrOutputParser ,它也实现了标准的 Runnable 接口。示例如下:

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 字段获取。

解析结构化对象输出

要输出结构化对象,需要用到的输出解析器是 PydanticOutputParser 。

class langchain_core.output_parsers.pydantic.PydanticOutputParser 类,其 参数如下:

  • pydantic_object :要解析的 pydantic 模型

内置方法:

invoke() :将单个输入转换为输出。

get_format_instructions() → str :重要!!

  • 作用:生成一个指令字符串,这个字符串会被添加到发送给 LLM 的提示(Prompt)的末尾。
  • 目的:告诉 LLM 应该以什么样的格式返回它的响应。例如,“请将你的回复封装在 XML 标签 中”或“请以 JSON 格式输出,包含 ‘name’ 和 ‘age’ 两个字段”。

代码示例如下:

# 定义聊天模型
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="回复用户问题。\n返回结构说明:{format_instructions}\n用户问题:{query}\n",
    # partial_variables:提示模板携带的部分变量的字典,无需在每次调用提示时都传入它们。
    # 类型为 Mapping[str, Any],传入template携带的部分变量的字典
    partial_variables={"format_instructions": parser.get_format_instructions()},  # 将返回的结构作为提示词发送给大模型
    input_variables=["query"],
)

# 定义链
chain = prompt | model | parser
result = chain.invoke({"query": "讲一个关于跳舞的笑话"})
print(result)

解析 JSON 输出

要输出 JSON 格式,需要用到的输出解析器是 JsonOutputParser 。

class langchain_core.output_parsers.json.JsonOutputParser 类,其参数如下:

  • pydantic_object :用于验证的 Pydantic 对象。如果为空,则不执行任何验证。

内置方法:

invoke() :将单个输入转换为输出。

get_format_instructions() → str :重要!!

  • 作用:生成一个指令字符串,这个字符串会被添加到发送给 LLM 的提示(Prompt)的末尾。
  • 目的:告诉 LLM 应该以什么样的格式返回它的响应。例如,“请将你的回复封装在 XML 标签 中”或“请以 JSON 格式输出,包含 ‘name’ 和 ‘age’ 两个字段”。
# 定义聊天模型
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 = JsonOutputParser(pydantic_object=Joke)

# 提示模板
prompt = PromptTemplate(
    template="回复用户问题。\n返回结构说明:{format_instructions}\n用户问题:{query}\n",
    # partial_variables:提示模板携带的部分变量的字典,无需在每次调用提示时都传入它们。
    # 类型为 Mapping[str, Any],传入template携带的部分变量的字典
    partial_variables={"format_instructions": parser.get_format_instructions()},  # 将返回的结构作为提示词发送给大模型
    input_variables=["query"],
)

# 定义链
chain = prompt | model | parser
result = chain.invoke({"query": "讲一个关于跳舞的笑话"})
print(result)

除了上面讲的文本、对象、JSON解析器,其实 LangChain 官方还提供了更多类型的解析器,如:

  • XML 解析器: XMLOutputParser
  • Yaml 解析器: YamlOutputParser
  • CSV 解析器: CommaSeparatedListOutputParser
  • 枚举解析器: EnumOutputParser
  • 日期解析器: DatetimeOutputParser 等等

除此之外,LangChain 还支持我们自定义输出解析器,以将模型输出结构化为自定义格式

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐