当前位置: 首页 > news >正文

LangChain组件 输出解析器

LangChain输出解析器

在实际应用中,可能会用到需要将AI输出的结果继续询问AI的情况,此时,如果直接进行链式调用

chain = prompt | model | model

构建的链完全符合要求(参与的组件都是Runnable接口的子类)

但是运行会报错

ValueError: Invalid input type <class 'langchain_core.messages.ai.AIMessage'>. Must be a PromptValue, str, or list of BaseMessages.

错误的主要原因:

  • prompt的结果是PromptValue类型,输入给了model
  • model的输出结果是:AIMessage

模型(ChatTongyi)源码中关于invoke方法明确了input类型:

  • PromptValue、str、Sequence

model的输出不符合要求,需要使用输出解析器做类型转换

StrOutputParser字符串输出解析器

StrOutputParser是LangChain内置的简单字符串解析器

  • 可以将AIMessage解析为简单的字符串,符合了模型invoke方法要求(可传入字符串,不接受AIMessage类型)
  • Runnable接口子类(可以加入链)
parse = StrOutputParser()
chain = prompt | model | parse | model

调用示例:

from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_community.chat_models.tongyi import ChatTongyimodel = ChatTongyi(model="deepseek-v3.2")prompt = PromptTemplate.from_template("请你扮演一个诗人,写一首关于{topic}的诗,要求简短且押韵。"
)parser = StrOutputParser()chain = prompt | model | parser | model | parser
res = chain.invoke({"topic": "春天"})
print(res)

JsonOutputParser与多模型执行链

在上一个示例中:

chain = prompt | model | parser | model | parser

这种多模型链的做法并不标准,因为在上一个模型的输出,没有被处理就输入下一个模型

正常情况下,我们应当由如下处理逻辑

image

  • 即上一个模型的输出结果,应该作为提示词模板的输入,构建下一个提示词,用来二次调用模型

根据输出和输入的要求:

  • 模型的输出为:AIMessage对象
  • 提示词模版要求输入字典

所以我们需要完成:

将模型输出的AIMessage,转为字典,再注入第二个提示词模板中,形成新的提示词(PromptValue对象)

StrOutputParser不满足将AIMessage转为字典(Dict),需要更换为JsonOutputParser

以下是结合FewShotPromptTemplate完成的多模型链

from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from langchain_community.chat_models.tongyi import ChatTongyimodel = ChatTongyi(model="deepseek-v3.2")example_prompt = PromptTemplate.from_template(""""name": "{full_name}""""
)
example_data = [{"full_name": "张若楠"},
]first_prompt = FewShotPromptTemplate(examples=example_data,example_prompt=example_prompt,prefix="我的邻居姓{lastname}, 刚生了{gender}, 帮忙起个名字,并封装到Json格式返回给我, 对于输出有如下示例:",suffix="输出请严格按照示例的Json格式 不要有多余字符与文本",input_variables=["lastname", "gender"], 
)second_prompt = PromptTemplate.from_template("姓名{name}, 请简要解析含义。简单介绍即可"
)str_parser = StrOutputParser()
json_parser = JsonOutputParser()chain = first_prompt | model | json_parser | second_prompt | model | str_parser
res = chain.invoke({"lastname": "张", "gender": "女儿"})
print(res)

自定义函数解析器 RunnableLambda

chain = first_prompt | model | json_parser | second_prompt | model | str_parser

代码中使用了JsonOutputParser以及StrOutputParse解析器,但对于一些特殊的转换,无法使用以上两种解析器实现

我们可以自己编写Lambda匿名函数来完成自定义逻辑的数据转换,要完成这个功能,要基于RunnableLambda类实现

RunnableLambda是LangChain内置的,将普通函数等转换为Runnable接口实例,方便自定义函数加入chain中

语法:

RunnableLambda(函数对象或lambda匿名函数)

from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambda
from langchain_community.chat_models.tongyi import ChatTongyimodel = ChatTongyi(model="deepseek-v3.2")first_prompt = PromptTemplate.from_template("我的邻居姓{lastname}, 刚生了{gender}, 帮忙起1个名字,仅告知名字,不要额外信息"
)second_prompt = PromptTemplate.from_template("姓名{name}, 请简要解析含义。简单介绍即可"
)str_parser = StrOutputParser()my_func = RunnableLambda(lambda ai_msg: {"name": ai_msg.content})chain = first_prompt | model | my_func | second_prompt | model | str_parser
for chunk in chain.stream({"lastname": "张", "gender": "女儿"}):print(chunk, end='', flush=True) 

函数直接入链

chain = first_prompt | model | lambda ai_msg: {"name": ai_msg.content}| second_prompt | model | str_parser

跳过RunnableLambda类,直接让函数加入链也是可以的 因为Runnable接口类在实现__or__的时候,支持Callable接口实例

函数就是Callable接口的实例 其本质是将函数自动转换为RunnableLambda

http://www.jsqmd.com/news/434975/

相关文章:

  • 2026CRM厂商对比:5 大 CRM 品牌外勤项目销售全流程能力深度拆解 - 毛毛鱼的夏天
  • MySQL必会的常用函数---条件函数
  • 2026年3月高压压力容器厂家推荐,实力品牌深度解析采购无忧之选 - 品牌鉴赏师
  • 融合传统与现代,这些东方珠宝品牌定义高端,东方秩序/东方高端珠宝/东方美学珠宝/高端珠宝,东方高端珠宝设计怎么选择 - 品牌推荐师
  • 旧电脑改造家庭服务器:Windows 极简方案,零学习成本上手
  • 树状数组(3)
  • 信创架构深度重构:从兼容适配走向性能最优的全栈实践
  • 【开题答辩全过程】以 浩轩文化旅游网为例,包含答辩的问题和答案
  • 掌握敏捷中的使用者故事:如何撰寫高品質故事、建立測試案例,並善用 Visual Paradigm 的 AI 工具
  • 【2026最新】KeyShot下载安装全流程教程(附电脑版安装包+图文步骤) - sdfsafafa
  • 面向关键业务的信创架构:高可靠、高安全、高扩展设计指南
  • 探讨供应酒店一次性牙刷优质厂商,杭州邦亿客性价比怎么样? - myqiye
  • 探讨广州性价比高的防腐螺旋管厂家,防腐螺旋管品牌厂家推荐哪家? - 工业设备
  • 2026年3月高压储罐厂家推荐,精准检测与稳定性能深度解析 - 品牌鉴赏师
  • 多文档创建日期批量修改,高效省时方法分享
  • 分析防腐聚氨酯保温钢管选购要点,河北宝温管道性价比咋样 - 工业品网
  • 室内装修公司哪家性价比高,金螳螂家服务体验好不好 - mypinpai
  • 2026年3月DC-DC电源模块厂家推荐,精准检测与稳定性能深度解析 - 品牌鉴赏师
  • 华为OD机考双机位C卷 - 密码解密 (Java Python JS GO C++ C)
  • 防静电PC板选购指南:从入门到专业的5大核心标准 - 速递信息
  • 从单枪匹马到团队作战:手把手搭建一个能自我验证的多智能体软件开发工厂
  • 2026年3月盘管反应釜厂家推荐,精准检测与稳定性能深度解析 - 品牌鉴赏师
  • 2026年3月周界入侵干涉型光纤传感安防系统厂家推荐,聚焦企业综合实力竞争力 - 品牌鉴赏师
  • 百联 OK 卡回收避坑指南:安全变现,认准这几点就够了 - 团团收购物卡回收
  • C# 使用SharpCifs 对接SMB协议
  • 2026年食品级水性漆厂家推荐排行榜:自干/五金/塑胶/工业涂料/透明/手感/玻璃/烤漆/保温杯/泡沫板/树脂工艺品水性漆,环保高效应用广泛 - 品牌企业推荐师(官方)
  • 基于Qi协议的无线充电系统C语言实现
  • 说说杭州邦亿客酒店一次性用品,性价比咋样费用多少钱? - 工业品牌热点
  • 项目A文件存放架构(参考)
  • 文档修改日期怎么改?两步轻松调整