【LangChain 开发】LangChain——输出解析器

🚀 欢迎来到我的CSDN博客:Optimistic _ chen

一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏 内容特色 适合人群
🔥C语言从入门到精通 系统讲解基础语法、指针、内存管理、项目实战 零基础新手、考研党、复习
🔥Java基础语法 系统解释了基础语法、类与对象、继承 Java初学者
🔥Java核心技术 面向对象、集合框架、多线程、网络编程、新特性解析 有一定语法基础的开发者
🔥Java EE 进阶实战 Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 想快速入门Java Web开发的同学
🔥Java数据结构与算法 图解数据结构、LeetCode刷题解析、大厂面试算法题 面试备战、算法爱好者、计算机专业学生
🔥Redis系列 从数据类型到核心特性解析 项目必备

🚀我的承诺:

✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

文章目录

什么是输出解析器output parsers

  LLM的输出本质上是非结构化 的文本,但在构建应用程序时,我们希望获取到结构化、机器可读的数据 。因此输出解析器的作⽤就是架起这座桥梁,负责获取模型的输出,并将输出转化为更结构化的格式。将LLM的交互从"模糊的⽂本对话"变成了"精确的数据API调⽤",是构建可靠、⾼效LLM应用重要组件。

  看到这里,我想起了之前在聊天模型系列中介绍过的with_structured_output() 方法。从功能上看,输出解析器与with_structured_output() 似乎都能实现结构化输出,但二者在定位和使用方式上存在本质区别。

  输出解析器是 LangChain 中的一个独立功能组件,它可以被集成到链(Chain)中,作为数据处理流程的一环。而 with_structured_output() 是聊天模型对象的一个方法,调用后会返回一个具备结构化输出能力的 Runnable 对象,通常需要手动调用。

简单来说,输出解析器更偏向于"组件化"的链式集成,而 with_structured_output() 则是模型层面的能力封装。

解析文本输出

使用StrOutputParser输出解析器输出文本,是基础且常用的输出解析器。

核心作用,是将大语言模型(LLM)生成的、结构复杂的输出对象(如 AIMessage),解析并提取为纯文本字符串(string),以便于后续的处理、展示或存储。

LangChain 中的模型(特别是聊天模型)与用户交互时,返回的通常是 AIMessage 这样的对象,它包含了内容、额外元数据等多种信息 。如果直接使用这个对象,下游程序可能无法处理。StrOutputParser 就像一个"翻译官",专门从这些复杂的对象中提取出最核心的文本内容(content 字段),让输出变得简单、通用.

python 复制代码
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

# 1. 定义模型和提示模板
model = ChatOpenAI()
prompt = ChatPromptTemplate.from_template("给我讲一个关于{topic}的笑话。")

# 2. 构建处理链:提示模板 -> 模型 -> 字符串解析器
# 使用管道符 | 将各个组件串联起来
chain = prompt | model | StrOutputParser()

# 3. 调用链,直接得到字符串结果
result = chain.invoke({"topic": "猫"})
print(result)  # 输出直接就是一段纯文本笑话,而非复杂的消息对象[reference:10]

解析结构化对象输出

回想结构化输出的内容,返回Pydantic对象。在LangChain中要结构化输出对象,需要用到的解析器是PydanticOutputParser

PydanticOutputParser 是 LangChain 中用于将大模型输出解析为结构化数据 的强大工具。与仅提取纯文本的StrOutputParser不同,它通过 Pydantic 模型定义数据的"蓝图",引导模型生成符合特定格式(如 JSON)的输出,并将其直接转换为 Python 对象。 使得LLM的输出能无缝对接到后续的代码逻辑中,非常适合需要提取特定信息或生成 API 数据的场景。

使用步骤:

  1. 定义 Pydantic 模型
  2. 创建解析器实例
  3. 获取格式指令:调用 parser.get_format_instructions(),它会生成一段指导 LLM 如何格式化输出的文本,你需要将其整合到提示词(Prompt)中。
  4. 解析模型输出
python 复制代码
from langchain.output_parsers import PydanticOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
from typing import List

# 1. 定义你的数据模型
class Person(BaseModel):
    """关于某个人的信息"""
    name: str = Field(description="此人的姓名")
    age: int = Field(description="此人的年龄")
    hobbies: List[str] = Field(description="此人的爱好列表")

class People(BaseModel):
    """文本中所有人的信息"""
    people: List[Person]
# 2. 创建解析器
parser = PydanticOutputParser(pydantic_object=People)

# 3. 构建提示词,注入格式指令
prompt = ChatPromptTemplate.from_messages([
    ("system", "回答用户的问题。将输出包裹在```json```标签中。\n{format_instructions}"),
    ("human", "{query}")
]).partial(format_instructions=parser.get_format_instructions())

# 4. 构建并执行链
model = ChatOpenAI(model="你的LLM")
chain = prompt | model | parser

# 调用链,直接得到 People 对象
result = chain.invoke({"query": "Anna is 23 years old and she likes reading and swimming."})
print(result)

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen

📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中......