LangChain 输出解析器与 LCEL 链构建详解
本文讲解 LangChain 中 OutputParser 的用法及 LCEL 链的构建。OutputParser 负责将 LLM 非结构化输出转为格式化数据,支持内置列表解析和自定义 Pydantic 模型。LCEL 通过管道符组合 Runnable 组件,简化代码逻辑。相比传统 invoke 方式,LCEL 提供更简洁高效的链式调用体验,适用于复杂应用开发。

本文讲解 LangChain 中 OutputParser 的用法及 LCEL 链的构建。OutputParser 负责将 LLM 非结构化输出转为格式化数据,支持内置列表解析和自定义 Pydantic 模型。LCEL 通过管道符组合 Runnable 组件,简化代码逻辑。相比传统 invoke 方式,LCEL 提供更简洁高效的链式调用体验,适用于复杂应用开发。

在常规使用 LangChain 构建大语言模型(LLM)应用的流程中,通常包含三个核心步骤:Prompt 输入、调用 LLM、LLM 输出。然而,在实际业务场景中,我们往往期望 LLM 返回的数据是结构化的格式,以便后续程序进行精确处理或存入数据库。
此时就需要引入输出解析器(OutputParser)。其工作流程是在 Prompt 中预设好数据格式要求,LLM 生成内容后,将原始文本传递给输出解析器。解析器会根据预定义的规则对内容进行清洗和校验,最终将其转换为预期的结构化数据(如列表、JSON 对象等)。

*注:上图仅为概念示意,实际开发中请根据具体架构调整。
LangChain 提供了一些内置的解析器,可以直接满足常见的格式化需求。以下示例演示如何将 LLM 的结果解析为逗号分隔的字符串列表。
场景:询问某个城市有 N 个著名景点,并要求以列表形式返回。
from langchain_openai import ChatOpenAI
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import ChatPromptTemplate
# 1. 初始化提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "{parser_instructions}"),
("human", "列出{cityName}的{viewPointNum}个著名景点。")
])
# 2. 初始化解析器并获取格式指令
output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()
print("解析器指令:", parser_instructions)
# 3. 组装最终提示词
final_prompt = prompt.invoke({
"cityName": "南京",
"viewPointNum": 3,
"parser_instructions": parser_instructions
})
# 4. 调用 LLM 模型
model = ChatOpenAI(
model="gpt-3.5-turbo",
openai_api_key="YOUR_OPENAI_API_KEY",
openai_api_base="https://api.aigc369.com/v1"
)
response = model.invoke(final_prompt)
print("LLM 原始输出:", response.content)
# 5. 解析结果
ret = output_parser.invoke(response)
print("解析后结果:", ret)
通过上述代码,我们可以发现 CommaSeparatedListOutputParser 会自动提取 LLM 输出的逗号分隔内容,并将其转换为 Python 列表对象,极大简化了后续的数据处理逻辑。
除了使用内置解析器外,对于复杂的业务数据结构,可以使用 Pydantic 定义自定义模型,配合 PydanticOutputParser 实现强类型校验。
使用步骤:
pydantic.BaseModel。PydanticOutputParser 包装该模型。场景:从书籍介绍中提取书名、作者及体裁,并强制校验字段完整性。
from typing import List
from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import ChatPromptTemplate
from langchain.schema import HumanMessage
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
# 1. 定义数据结构
class BookInfo(BaseModel):
book_name: str = Field(description="书籍的名字")
author_name: str = Field(description="书籍的作者")
genres: List[str] = Field(description="书籍的体裁")
# 2. 初始化解析器
output_parser = PydanticOutputParser(pydantic_object=BookInfo)
print("格式指令:", output_parser.get_format_instructions())
# 3. 构建提示词
prompt = ChatPromptTemplate.from_messages([
("system", "{parser_instructions} 你输出的结果请使用中文。"),
("human", "请你帮我从书籍的概述中,提取书名、作者,以及书籍的体裁。书籍概述会被三个#符号包围。\n###{book_introduction}###")
])
book_introduction = """
《朝花夕拾》原名《旧事重提》,是现代文学家鲁迅的散文集,收录鲁迅于 1926 年创作的 10 篇回忆性散文,现编入《鲁迅全集》第 2 卷。
此文集作为'回忆的记事',多侧面地反映了作者鲁迅青少年时期的生活,形象地反映了他的性格和志趣的形成经过。
文集以记事为主,饱含着浓烈的抒情气息,往往又夹以议论,做到了抒情、叙事和议论融为一体。
"""
# 4. 执行流程
model = ChatOpenAI(
model="gpt-3.5-turbo",
openai_api_key="YOUR_OPENAI_API_KEY",
openai_api_base="https://api.aigc369.com/v1"
)
final_prompt = prompt.invoke({
"book_introduction": book_introduction,
"parser_instructions": output_parser.get_format_instructions()
})
response = model.invoke(final_prompt)
result = output_parser.invoke(response)
print("解析后的对象:", result)
print("书籍名称:", result.book_name)
在此模式下,如果 LLM 输出的内容不符合 BookInfo 的定义,解析器会抛出异常,从而确保数据的准确性。
LCEL(LangChain Expression Language)是 LangChain 表达式语言的简称。它提供了一种声明式的方式来组合不同的组件,使得构建复杂的 AI 应用链路变得更加直观和高效。
在 LangChain 中,只要实现了 Runnable 接口并且拥有 invoke 方法的对象,都可以被视为一个可运行的单元(Runnable)。这意味着它们可以接收上一个单元的输入,并产生下一个单元需要的输出。
例如,ChatPromptTemplate、ChatOpenAI、PydanticOutputParser 等核心组件都实现了 Runnable 接口。
LCEL 提供了多种组合方式,其中最常用的是管道符 |。这种方式不仅书写简洁,而且具有强大的表达力,能够清晰地展示数据流向。
在传统模式下,代码需要显式地调用每个组件的 invoke 方法,并将中间结果手动传递。这种写法虽然逻辑清晰,但在复杂链路中会导致代码嵌套过深,可读性下降。
# 传统方式
final_prompt = prompt.invoke({
"book_introduction": book_introduction,
"parser_instructions": output_parser.get_format_instructions()
})
response = model.invoke(final_prompt)
result = output_parser.invoke(response)
使用 LCEL 时,可以通过管道符将多个组件串联起来,形成一条完整的链。这不仅减少了样板代码,还让数据流转的逻辑一目了然。
# LCEL 方式
chain = prompt | model | output_parser
ret = chain.invoke({
"book_introduction": book_introduction,
"parser_instructions": output_parser.get_format_instructions()
})
invoke 替换为 ainvoke 以提升高并发场景下的性能。langchain-core 和 langchain-openai 版本兼容,避免因接口变更导致运行错误。本文详细讲解了 LangChain 中输出解析器(OutputParser)的使用方法及基于 LCEL 构建链的技术方案。通过内置解析器和自定义 Pydantic 模型,开发者可以轻松实现非结构化文本到结构化数据的转换。同时,利用 LCEL 的管道符特性,能够显著简化代码结构,提升开发效率和维护性。在实际项目中,合理运用这些工具可以帮助构建更稳定、高效的 AI 应用。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online