跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI

LangChain 输出解析器与 LCEL 链构建详解

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

BigDataPan发布于 2025/2/7更新于 2026/9/856 浏览
LangChain 输出解析器与 LCEL 链构建详解

LangChain 输出解析器与 LCEL 链构建详解

1. 输出解析器 OutputParser

1.1 为什么需要 OutputParser

在常规使用 LangChain 构建大语言模型(LLM)应用的流程中,通常包含三个核心步骤:Prompt 输入、调用 LLM、LLM 输出。然而,在实际业务场景中,我们往往期望 LLM 返回的数据是结构化的格式,以便后续程序进行精确处理或存入数据库。

此时就需要引入输出解析器(OutputParser)。其工作流程是在 Prompt 中预设好数据格式要求,LLM 生成内容后,将原始文本传递给输出解析器。解析器会根据预定义的规则对内容进行清洗和校验,最终将其转换为预期的结构化数据(如列表、JSON 对象等)。

LangChain 输出解析器流程图

*注:上图仅为概念示意,实际开发中请根据具体架构调整。

1.2 代码实践

调用系统自带的输出解析器

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 实现强类型校验。

使用步骤:

  1. 定义数据结构类,继承 pydantic.BaseModel。
  2. 使用 PydanticOutputParser 包装该模型。
  3. 生成 Prompt、调用 LLM、最后通过 Parser 解析并验证。

场景:从书籍介绍中提取书名、作者及体裁,并强制校验字段完整性。

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 的定义,解析器会抛出异常,从而确保数据的准确性。

2. 利用 LCEL 构建链

2.1 LCEL 简介

LCEL(LangChain Expression Language)是 LangChain 表达式语言的简称。它提供了一种声明式的方式来组合不同的组件,使得构建复杂的 AI 应用链路变得更加直观和高效。

在 LangChain 中,只要实现了 Runnable 接口并且拥有 invoke 方法的对象,都可以被视为一个可运行的单元(Runnable)。这意味着它们可以接收上一个单元的输入,并产生下一个单元需要的输出。

例如,ChatPromptTemplate、ChatOpenAI、PydanticOutputParser 等核心组件都实现了 Runnable 接口。

LCEL 提供了多种组合方式,其中最常用的是管道符 |。这种方式不仅书写简洁,而且具有强大的表达力,能够清晰地展示数据流向。

2.2 使用区别对比

不使用 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 时,可以通过管道符将多个组件串联起来,形成一条完整的链。这不仅减少了样板代码,还让数据流转的逻辑一目了然。

# LCEL 方式
chain = prompt | model | output_parser
ret = chain.invoke({
    "book_introduction": book_introduction,
    "parser_instructions": output_parser.get_format_instructions()
})

2.3 最佳实践与注意事项

  1. 错误处理:在使用 LCEL 构建链时,建议在外层包裹 try-except 块,以捕获解析失败或 API 调用异常。
  2. 异步支持:LCEL 原生支持异步操作,可以将 invoke 替换为 ainvoke 以提升高并发场景下的性能。
  3. 状态管理:对于长对话或多轮交互场景,需结合 Memory 机制维护上下文状态。
  4. 依赖版本:确保安装的 langchain-core 和 langchain-openai 版本兼容,避免因接口变更导致运行错误。

3. 总结

本文详细讲解了 LangChain 中输出解析器(OutputParser)的使用方法及基于 LCEL 构建链的技术方案。通过内置解析器和自定义 Pydantic 模型,开发者可以轻松实现非结构化文本到结构化数据的转换。同时,利用 LCEL 的管道符特性,能够显著简化代码结构,提升开发效率和维护性。在实际项目中,合理运用这些工具可以帮助构建更稳定、高效的 AI 应用。

目录

  1. LangChain 输出解析器与 LCEL 链构建详解
  2. 1. 输出解析器 OutputParser
  3. 1.1 为什么需要 OutputParser
  4. 1.2 代码实践
  5. 调用系统自带的输出解析器
  6. 1. 初始化提示词模板
  7. 2. 初始化解析器并获取格式指令
  8. 3. 组装最终提示词
  9. 4. 调用 LLM 模型
  10. 5. 解析结果
  11. 自定义格式的输出解析器
  12. 1. 定义数据结构
  13. 2. 初始化解析器
  14. 3. 构建提示词
  15. 4. 执行流程
  16. 2. 利用 LCEL 构建链
  17. 2.1 LCEL 简介
  18. 2.2 使用区别对比
  19. 不使用 LCEL
  20. 传统方式
  21. 使用 LCEL
  22. LCEL 方式
  23. 2.3 最佳实践与注意事项
  24. 3. 总结

更多推荐文章

查看全部
  • Adaptive RAG 系统搭建:LangGraph、FastAPI 与 Streamlit 实战
  • OpenClaw 多 Agent 系统对接飞书机器人指南
  • 医疗 AI 场景下的逻辑回归:原理、应用与实战
  • 大模型算法二次开发:核心思路与流程详解
  • 理想、小鹏争相发力汽车机器人,为啥都抢着做?
  • Spring MVC 请求处理流程与 DispatcherServlet 核心源码解析
  • 港大提出SparseVideoNav:基于稀疏视频生成的机器人超视野导航技术
  • 大模型核心组件解析:激活函数与 FFN 块详解
  • AI 绘画关键词网站效率提升实战:从数据预处理到模型加速
  • 前端 GraphQL 客户端:优雅地获取数据
  • LangChain 向量存储与检索器使用指南
  • 深入理解 Linux 环境变量
  • AI + 鸿蒙游戏:会是下一个爆点吗?
  • 大模型落地:追求极致的务实主义
  • 机械臂关节空间轨迹规划的 B 样条算法实现
  • Java Swing 自定义组件实现文字滚动效果
  • C++ 多线程同步之条件变量(condition_variable)实战
  • AI 产品经理面试核心考点与实战指南
  • Minecraft Forge 模组开发框架搭建指南
  • C++ 红黑树实现详解:STL map 底层数据结构解析

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online