【大语言模型LangChain】 ModelsIO OutputParsers详解

在这里插入图片描述


【大语言模型LangChain】 ModelsIO OutputParsers详解

  • 一、简介
  • 二、OutputParsers 的优势
  • 三、解析器类型
  • 四、实战示例
    • 1、String 解析器
    • 2、Json 解析器
    • 3、Pydantic 解析器
    • 4、结构化输出解析器
    • 5、OpenAI 函数输出解析器
      • 5.1、JsonOutputFunctionsParser
      • 5.2、JsonKeyOutputFunctionsParser
      • 5.3、PydanticOutputFunctionsParser
      • 5.4、PydanticAttrOutputFunctionsParser

一、简介

基于前边的章节,LangChain 已经可以轻松实现帮用户拿到大语言模型的输出,然而不难发现,前文介绍的模型调用,显示返回的内容通常是一个类(class)的实例,其中包含了 content 以及其他一些额外的参数。

对于模型调用者来说,他们可能只关心 content 的内容,也就是模型对输入内容的回答,或者希望得到一个可操作的数据结构,比如 JSON 格式的数据。

二、OutputParsers 的优势

LangChain 设计的初衷之一,旨在让用户更便捷地使用大模型,所以为了解决输出内容格式化的问题。

通过使用 LangChain 提供的解析器,用户可以更轻松地获取模型的输出,并直接处理或操作所需的内容,而无需进行额外的转换或处理。

三、解析器类型

根据业务需求,开发者通常需要大模型返回一个结构化的数据,方便后续的逻辑可以根据这个数据进行进一步的处理。

然而不同的输入结果可能需要相对应的解析器来做处理,LangChain 同样提供了几种常见的解析器类型:

  • String 解析器
  • Json 解析器
  • Pydantic 解析器
  • 结构化输出解析器
  • OpenAI 函数输出解析器

四、实战示例

1、String 解析器

LangChain 提供了 StrOutputParser,这是一个专门用来处理模型输出内容的解析器。当模型输出的内容是字符串格式的时候,StrOutputParser 能够直接返回模型输出的 content 字符串内容。

这使得用户无需进行复杂的数据解析操作,可以直接获取模型输出的内容字符串,从而更方便地进行后续处理或使用,代码示例如下所示:

# 定义模型
import osfrom langchain_core.messages import SystemMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain_openai import ChatOpenAIos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxxxxxx"  # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxxxxxx"model = ChatOpenAI()
# 提示词模板
messages = ChatPromptTemplate.from_messages([SystemMessage(content="你是一个翻译各种语言的助手"),HumanMessagePromptTemplate.from_template("把 {poetry} 的原文诗翻译为英文")
])
# 输出解析器
parser = StrOutputParser()
# 调用链
chain_with_parser = messages | model | parser  # 使用输出解析器
res_with_parser = chain_with_parser.invoke({"poetry": "静夜思"})
print(res_with_parser)
print(type(res_with_parser))print('---------------------不使用parser---------------------------------')chain_with_parser = messages | model
res_with_parser = chain_with_parser.invoke({"poetry": "静夜思"})
print(res_with_parser)
print(type(res_with_parser))

结果对比:
在这里插入图片描述

2、Json 解析器

当模型输出的内容是一个 JSON 格式时,LangChain 也提供了相应的解析器 JsonOutputParser。该解析器能够根据 JSON 结构的内容,将其转换为 Python 对应的字典格式的数据,使得用户能够更方便地处理和操作模型输出的结果。代码示例如下所示:

import osfrom langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAIos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxxxx"  # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxxxx"# 定义模型
model = ChatOpenAI()
# Json输出解析器
parser = JsonOutputParser()
# 模板提示,输出 json 格式的回答
prompt = PromptTemplate(template="根据用户的输入,给出一段中文宣传语 \n{format_instructions}\n{ads}\n",input_variables=["ads"],partial_variables={"format_instructions": parser.get_format_instructions()},
)
# 调用链 包含json输出解析器
chain_with_parser = prompt | model | parser
res_with_parser = chain_with_parser.invoke({"ads": "音乐节"})
print(res_with_parser)
print(type(res_with_parser))print('------------------------不加json解析器------------------------')# 调用链 包含json输出解析器
chain_with_parser = prompt | model
res_with_parser = chain_with_parser.invoke({"ads": "音乐节"})
print(res_with_parser)
print(type(res_with_parser))

在这里插入图片描述

3、Pydantic 解析器

除了支持解析 JSON 格式外,LangChain 还提供了对 Pydantic 模型的解析器 PydanticOutputParser

LangChain 的 Pydantic 解析器可以将模型输出的内容解析为 Pydantic 模型所定义的数据结构。这使得用户可以更加方便地使用 Pydantic 的功能,例如数据验证、序列化和反序列化等,代码示例如下:

from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
import osos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxx"  # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxx"class Translation(BaseModel):origin_str: str = Field(description="原始输入的值")trans_str: str = Field(description="翻译后的值")# 定义一个模型
model = ChatOpenAI(temperature=0)
# 使用 pydantic 输出解析器解析 Translation 类
parser = PydanticOutputParser(pydantic_object=Translation)
# 提示模板
prompt = PromptTemplate(template="翻译用户输入的内容为英文\n{format_instructions}\n{query}\n",input_variables=["query"],partial_variables={"format_instructions": parser.get_format_instructions()},
)
# 包含解析器的调用链
chain_with_parser = prompt | model | parser
res_parser = chain_with_parser.invoke({"query": "赏花"})
# 输出返回的内容及类型
print(res_parser)
print(type(res_parser))

在这里插入图片描述

4、结构化输出解析器

LangChain 提供了一种自定义解析方案,即使用 schema 结构。用户可以根据需要定义自己的 schema,并使用 LangChain 的 StructuredOutputParser类来解析符合该 schema 的数据。

这种方式让用户能够更灵活地处理各种类型的模型输出数据,而无需依赖特定的数据验证库或框架。StructuredOutputParser 为用户提供了一种通用的解析方式,使他们能够简单地将模型输出的数据转换为符合自定义 schema 的数据对象。
代码示例如下:

from langchain.output_parsers import ResponseSchema, StructuredOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAIimport osos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxxxx"  # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxxxx"response_schemas = [ResponseSchema(name="slogan", description="宣传语内容"),ResponseSchema(name="req", description="宣传语限制在10个字符内"),
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
prompt = PromptTemplate(template="根据用户输入的商品给出宣传语\n{format_instructions}\n{goods}",input_variables=["goods"],partial_variables={"format_instructions": output_parser.get_format_instructions()},
)model = ChatOpenAI(temperature=0)
chain_with_parser = prompt | model | output_parser
res_with_parser = chain_with_parser.invoke({"goods": "音乐节"})
print(res_with_parser)
print(type(res_with_parser))print('-----------------不加解析器-----------------------')model = ChatOpenAI(temperature=0)
chain_with_parser = prompt | model
res_with_parser = chain_with_parser.invoke({"goods": "音乐节"})
print(res_with_parser)
print(type(res_with_parser))

在这里插入图片描述

5、OpenAI 函数输出解析器

LangChain 支持解析 OpenAI 提供的函数调用,并提供了以下四种形式来处理输出结果:

  • JsonOutputFunctionsParser:生成 JSON 格式的结果。
  • JsonKeyOutputFunctionsParser:指定 JSON 中某个 key 对应的 value。
  • PydanticOutputFunctionsParser:解析 Pydantic 模型的结构。
  • PydanticAttrOutputFunctionsParser:直接输出模型中某个参数的值。

5.1、JsonOutputFunctionsParser

# 调用大模型
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers.openai_functions import  JsonOutputFunctionsParserimport osos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxx"  # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxx"model = ChatOpenAI()
# 提示词模板
prompt = ChatPromptTemplate.from_template("出给一个关于 {goods} 的广告宣传语")
# 自定义函数
functions = [{"name": "advertisement","description": "一段广告词","parameters": {"type": "object","properties": {"goods": {"type": "string", "description": "要进行广告的产品"},"ads": {"type": "string", "description": "广告词"},},"required": ["goods", "ads"],},}
]# todo JsonOutputFunctionsParser# 创建调用链 包含输出解析器
chain_json_with_parser = prompt | model.bind(function_call={"name": "advertisement"},functions=functions) | JsonOutputFunctionsParser()
res_json_with_parser = chain_json_with_parser.invoke({"goods": "冰淇淋"})
print(res_json_with_parser)
print(type(res_json_with_parser))print("---------------------------不加JsonOutputFunctionsParser---------------------------")chain_json_with_parser = prompt | model.bind(function_call={"name": "advertisement"},functions=functions)
res_json_with_parser = chain_json_with_parser.invoke({"goods": "冰淇淋"})
print(res_json_with_parser)
print(type(res_json_with_parser))

在这里插入图片描述

5.2、JsonKeyOutputFunctionsParser

# 调用大模型
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers.openai_functions import JsonKeyOutputFunctionsParser
import osos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxx"  # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxx"model = ChatOpenAI()
# 提示词模板
prompt = ChatPromptTemplate.from_template("出给一个关于 {goods} 的广告宣传语")
# 自定义函数
functions = [{"name": "advertisement","description": "一段广告词","parameters": {"type": "object","properties": {"goods": {"type": "string", "description": "要进行广告的产品"},"ads": {"type": "string", "description": "广告词"},},"required": ["goods", "ads"],},}
]# todo JsonOutputFunctionsParser# 创建调用链 包含输出解析器
chain_key_parser = prompt | model.bind(function_call={"name": "advertisement"},functions=functions) | JsonKeyOutputFunctionsParser(key_name='ads')
res_key_parser = chain_key_parser.invoke({"goods": "摩托车"})
print(res_key_parser)
print(type(res_key_parser))print("---------------------------不加JsonKeyOutputFunctionsParser---------------------------")chain_key_parser = prompt | model.bind(function_call={"name": "advertisement"},functions=functions)
res_key_parser = chain_key_parser.invoke({"goods": "摩托车"})
print(res_key_parser)
print(type(res_key_parser))

在这里插入图片描述

5.3、PydanticOutputFunctionsParser

# 调用大模型
from langchain_core.output_parsers.openai_functions import PydanticOutputFunctionsParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.utils.function_calling import convert_to_openai_function
from langchain_openai import ChatOpenAI
import osfrom pydantic import BaseModel,Fieldos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxx"  # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxx"class Advertisement(BaseModel):origin_str: str = Field(description="原始输入的值")trans_str: str = Field(description="翻译后的值")# 自定义函数
functions = [{"name": "advertisement","description": "一段广告词","parameters": {"type": "object","properties": {"goods": {"type": "string", "description": "要进行广告的产品"},"ads": {"type": "string", "description": "广告词"},},"required": ["goods", "ads"],},}
]model = ChatOpenAI()
# 提示词模板
prompt = ChatPromptTemplate.from_template("出给一个关于 {goods} 的广告宣传语")
# 定义解析器
parser = PydanticOutputFunctionsParser(pydantic_schema=Advertisement)
# 调用函数
openai_functions = [convert_to_openai_function(Advertisement)]
# 创建调用链
chain_pydantic_parser = prompt | model.bind(functions=openai_functions) | parser
# 输出大模型执行结果
res_pydantic_parser = chain_pydantic_parser.invoke({"goods": "饮料"})
print(res_pydantic_parser)
print(type(res_pydantic_parser))

5.4、PydanticAttrOutputFunctionsParser

# 调用大模型
from langchain_core.output_parsers.openai_functions import PydanticOutputFunctionsParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.utils.function_calling import convert_to_openai_function
from langchain_openai import ChatOpenAI
import osfrom pydantic import BaseModel,Fieldos.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxx"  # 将个人token替换到这个位置
os.environ["OPENAI_API_BASE"] = "xxxxxxxxxxxxx"class Advertisement(BaseModel):origin_str: str = Field(description="原始输入的值")trans_str: str = Field(description="翻译后的值")# 自定义函数
functions = [{"name": "advertisement","description": "一段广告词","parameters": {"type": "object","properties": {"goods": {"type": "string", "description": "要进行广告的产品"},"ads": {"type": "string", "description": "广告词"},},"required": ["goods", "ads"],},}
]model = ChatOpenAI()
# 提示词模板
prompt = ChatPromptTemplate.from_template("出给一个关于 {goods} 的广告宣传语")print('---------------------------------PydanticAttrOutputFunctionsParser--------------------------------')from langchain_core.output_parsers.openai_functions import PydanticAttrOutputFunctionsParser# 定义 pydantic 参数输出解析器,传入 Pydantic 模型和需要输出的属性名
parser = PydanticAttrOutputFunctionsParser(pydantic_schema=Advertisement, attr_name='trans_str')
# 调用函数
openai_functions = [convert_to_openai_function(Advertisement)]
# 创建调用链 包含输出解析器
chain_pydantic_parser = prompt | model.bind(functions=openai_functions) | parser
# 传入参数执行
res_pydantic_parser = chain_pydantic_parser.invoke({"goods": "饮料"})
print(res_pydantic_parser)
print(type(res_pydantic_parser))

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/488562.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支持自定义离线地图地理区域,查询组件及数据源功能增强,DataEase开源BI工具v2.10.3 LTS发布

2024年12月9日,人人可用的开源BI工具DataEase正式发布v2.10.3 LTS版本。 这一版本的功能变动包括:数据源方面,API数据源和Excel数据源支持对字段类型和长度进行设置;图表方面,离线类地图支持自定义地理区域设置&#…

Vite 打包构建的产物

当我们谈到现代前端工具时,Vite 是一个不可忽视的名字。它以极快的开发速度和高效的生产构建而闻名。不知道朋友们有没有跟我有一样好奇,当 Vite 将你的代码打包时,它究竟会生成什么样的文件?又是如何智能地找到入口文件和资源文件…

【JVM】JVM基础教程(四)

上一章:【JVM】JVM基础教程(三)-CSDN博客 目录 自动垃圾回收 方法区的回收 方法区回收条件 手动触发回收 堆回收 如何判断堆上的对象可以回收? 可以给对象引用赋值null,切断引用 引用计数法 循环引用缺点 查…

rabbitMq的rabbitmqctl status报错

Error: unable to perform an operation on node rabbitASUS-PC. Please see diagnostics information and suggestions below. 遇到上图这个错大部分问题可能是由于 RabbitMQ CLI 工具的 Erlang Cookie 与服务器上的不匹配而导致连接问题。Erlang Cookie 在 RabbitMQ 节点之间…

解读数据资产管理实践白皮书(5.0版)深入学习掌握数据资产管理知识体系。

本文介绍了数据资产管理的重要性及其概述,详细阐述了数据资产管理的活动职能包括数据模型管理、数据标准管理、数据质量管理等,并强调了数据安全管理的重要性。文章还讨论了数据资产管理的保障措施和实践步骤,以及发展趋势和总结展望。 重点内…

玩《剑灵》提示d3dx9_43.dll缺失怎么解决?找不到d3dx9_43.dll文件是什么原因?

《剑灵》d3dx9_43.dll缺失解决方案 在畅游《剑灵》这款深受玩家喜爱的游戏时,有时可能会遇到一些令人头疼的问题,比如提示“d3dx9_43.dll缺失”。这个错误不仅让游戏无法正常启动,还可能让玩家对游戏体验产生挫败感。作为一名软件开发从业者…

linux网络编程 | c | select实现多路IO转接服务器

select实现多路IO转接服务器 基于该视频完成 15-select实现多路IO转接设计思路_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 文章目录 select实现多路IO转接服务器1.思路&功能2.代码实现warp.hwarp.cmulti_select_sever.c运行图 3.代码解释(细节&#xf…

【有啥问啥】大语言模型Prompt中的“System指令”:深入剖析与误区澄清

大语言模型Prompt中的“System指令”:深入剖析与误区澄清 引言 在与大语言模型(LLM)交互时,“prompt”(提示符)这一概念已不再陌生。Prompt是引导模型生成特定类型文本的关键输入,决定了模型的…

【大模型】ChatGPT 创作各类高质量文案使用详解

目录 一、前言 二、ChatGPT文案创作的优势 三、ChatGPT 各类文案创作操作实战 3.1 ChatGPT创作产品文案 3.1.1 ChatGPT创作产品文案基本思路 3.1.2 ChatGPT 创作产品文案案例一 3.1.2.1 操作过程 3.1.3 ChatGPT 创作产品文案案例二 3.2 ChatGPT 创作视频脚本 3.2.1 Ch…

前端自己也能开启HTTPS

目录 前言 使用mkcert 安装 创建证书 利用 mkcert 创建 ca 根据 ca 创建 cert 安装证书 项目开启HTTPS 安装插件 配置 vitecofnig.js 最终效果 前言 今天我发现了一个宝藏,兄弟们!就是前端开发阶段是可以使用https来开发的。对不懂前端的后端兄…

预言机调研

预言机 1. 概述 预言机主要承担两个工作,一是验证信息可靠性,二是传递信息。 如果没有预言机,区块链的信息来源将仅限于其内部数据,其广泛使用的潜力和可能性将会大大降低。 区块链预言机是区块链与外部世界之间的桥梁。它们使区…

Geometric Estimation via Robust Subspace Recovery_译文ECCV2020

目录 摘要: 1 引言 2 相关工作 3 方法 3.1 DLT 简介 3.2 鲁棒泛化 3.3 线性结构的扩展探索 3.4 实现细节 4 实验结果 4.1 线性嵌入的定性分析 4.2 基本和单应性估计 4.3 对离群值率的敏感性 5 结论 摘要: 根据图像点对应关系进行几何估计是许多 …

Linux入门攻坚——41、Linux集群系统入门-lvs(2)

lvs-dr:GATEWAY Director只负责请求报文,响应报文不经过Director,直接由RS返回给Client。 lvs-dr的报文路线如上图,基本思路就是报文不会回送Director,第①种情况是VIP、DIP、RIP位于同一个网段,这样&…

中粮凤凰里共有产权看房记

中粮凤凰里看房是希望而来,失望而归。主要是对如下失望,下述仅个人看房感受: 1. 户型不喜欢:三房的厨房和餐厅位置很奇葩 2. 样板间在25楼:湖景一言难尽和有工厂噪声 3. 精装修的交房质量:阳台的推拉门用料很草率 …

信奥赛CSP-J复赛集训(bfs专题)(5):洛谷P3395:路障

信奥赛CSP-J复赛集训(bfs专题-刷题题单及题解)(5):洛谷P3395:路障 题目描述 B 君站在一个 n n n\times n nn 的棋盘上。最开始,B君站在 ( 1 , 1 ) (1,1) (1,1) 这个点,他要走到 …

OpenCV的图像矫正

一、原理 图像矫正的原理是透视变换,下面来介绍一下透视变换的概念。 透视变换(Perspective Transform)基于一个4对点的映射关系(4个源点到4个目标点),通过这些点之间的映射,可以计算一个变换…

vscode 打开 setting.json

按下Ctrl Shift P(Windows/Linux)或Cmd Shift P(Mac)来打开命令面板。输入open settings,然后选择 Open User Settings(JSON)。打开settings.json文件 ------修改设置-----: 1、 html代码的行长度&am…

打电话玩手机识别-支持YOLO,COCO,VOC格式的标记,超高识别率可检测到手持打电话, 非接触式打电话,玩手机自拍等

打电话玩手机识别-支持YOLO,COCO,VOC格式的标记,超高识别率可检测到手持打电话, 非接触式打电话,玩手机自拍等1275个图片。 手持打电话: 非接触打电话 玩手机 数据集下载 yolov11:https://download.csdn…

外卖开发(八)—— SpringTask(定时任务) 和 WebSocket网络协议

外卖开发(八)—— SpringTask 和 WebSocket 一、利用SpringTask完成定时任务1、cron表达式2、springtask实现 二、使用webSocket实现接单、催单提醒1、代码分析2、催单提醒 一、利用SpringTask完成定时任务 Spring Task是Spring框架提供的任务调度工具&…

嵌入式系统中的并行编程模型:汇总解析与应用

概述:随着嵌入式系统处理能力的不断提升,并行编程在其中的应用愈发广泛。本文深入探讨了多种专门为嵌入式设计的并行编程模型,包括任务队列模型、消息传递模型、数据并行模型、异构多核并行模型、实时任务调度模型以及函数式并行模型。详细阐…