LangChain输出解析器

大型语言模型(或 LLM)生成文本,当你构建应用程序时,有时需要使用结构化数据而不是字符串。 LangChain 提供了输出解析器,可以帮助我们做到这一点。

我们将回顾 LangChain 提供的 Pydantic (JSON) 解析器。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包

1、为什么要解析数据?

这是显而易见的,但我们无论如何都会回答它。 解析数据可以帮助我们将其转换为更可读的格式,从而提高数据的整体质量。

假设你想在两个整数之间进行简单的算术运算,需要将给定的字符串转换为整数。 拥有干净且结构化的数据还有其他好处。 最明显的是数据如何轻松地融入你现有的模型和数据库。

2、餐厅预订用例

早在 2023 年 5 月,我发表了一篇关于使用自然语言与计算机交互的文章,其中我要求 ChatGPT 为我在一家餐厅进行虚构的预订,并使用 JSON 对象而不是纯旧文本进行响应。

长话短说,这是该帖子的输出:

{"intent": "book_reservation","parameters": {"date": "2023-05-05","time": "18:00:00","party_size": 2,"cuisine": "any"}
}

虽然我们可以要求 LLM 返回 JSON 并明确指定格式(就像我们在上一篇文章中所做的那样),但重要的是要认识到这在某些情况下可能不起作用,因为模型可能会产生幻觉(hallucinate)。

3、准备我们的查询模板

好的,让我们使用上一篇文章中的相同查询,但我们不会请求响应采用 JSON 格式,而是添加一个 {format_instructions} 占位符,如下所示:

reservation_template = '''Book us a nice table for two this Friday at 6:00 PM. Choose any cuisine, it doesn't matter. Send the confirmation by email.Our location is: {query}Format instructions:{format_instructions}
'''

好了,我们有了漂亮的查询。 下面,我们将看到 LangChain 如何自动填充 {format_instructions} 占位符。

4、Pydantic (JSON) 解析器

为了告诉 LangChain 我们需要将文本转换为 Pydantic 对象,我们需要首先定义 Reservation 对象。 那么,让我们直接进入:

from pydantic import BaseModelclass Reservation(BaseModel):date: str = Field(description="reservation date")time: str = Field(description="reservation time")party_size: int = Field(description="number of people")cuisine: str = Field(description="preferred cuisine")

很好,我们现在有了 Reservation 对象及其参数。 让我们告诉 LangChain,我们需要一个解析器来将给定的输入转换为 Reservation 对象:

parser = PydanticOutputParser(pydantic_object=Reservation)

5、设置提示模板

我们现在要设置提示模板:

prompt = PromptTemplate(template=reservation_template,input_variables=["query"],partial_variables={"format_instructions": parser.get_format_instructions()},
) 

注意到 partial_variables={"format_instructions": parser.get_format_instructions()}行了吗? 这告诉 LangChain 将上面模板中的 format_instructions 变量替换为我们创建的Pydantic Reservation 对象的结构。

让我们添加位置查询,看看 LangChain 在我们原始查询的幕后会做什么以及它会是什么样子。

_input = prompt.format_prompt(query="San Francisco, CA")

让我们看看我们的查询现在是什么样子的:

print(_input.to_string())
>> Book us a nice table for two this Friday at 6:00 PM. 
>> Choose any cuisine, it doesn't matter. Send the confirmation by email.
>> 
>> Our location is: San Francisco, CA
>> 
>> Format instructions:
>> The output should be formatted as a JSON instance that conforms to the JSON schema below.
>> 
>> As an example, for the schema {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]}
>> the object {"foo": ["bar", "baz"]} is a well-formatted instance of the schema. The object {"properties": {"foo": ["bar", "baz"]}} is not well-formatted.
>> 
>> Here is the output schema:
>> ```
>> {"properties": {"date": {"title": "Date", "description": "reservation date", "type": "string"}, "time": {"title": "Time", "description": "reservation time", "type": "string"}, "party_size": {"title": "Party Size", "description": "number of people", "type": "integer"}, "cuisine": {"title": "Cuisine", "description": "preferred cuisine", "type": "string"}}, "required": ["date", "time", "party_size", "cuisine"]}
>> ```

太棒了,正如你所看到的,LangChain 为我们做了很多工作。 它自动将我们创建的 Pydantic 对象转换为字符串,用于定义 LLM 响应的结构。

但这还不是全部,在查询模型后,我们可以使用 LangChain 的解析器自动将从模型获得的文本响应转换为 Reservation 对象。

我们是这样做的:

# We query the model first
output = model(_input.to_string())# We parse the output 
reservation = parser.parse(output)

太棒了,让我们通过迭代每个元素来打印 reservation 字段(和数据类型):

for parameter in reservation.__fields__:print(f"{parameter}: {reservation.__dict__[parameter]},  {type(reservation.__dict__[parameter])}")

下面是输出:

>> date: Friday,  <class 'str'>
>> time: 6:00 PM,  <class 'str'>
>> party_size: 2,  <class 'int'>
>> cuisine: Any,  <class 'str'>

请注意, party_size 现在是 int 类型。 显然,我们还可以直接访问 party_size 属性,如下所示: reservation.party_size

6、其他输出解析器

正如我在文章前面提到的,LangChain 提供了更多的输出解析器,可以根据你的具体用例使用它们。 幕后发生的事情的相同逻辑也适用于其中的大多数。

几个有趣的解析器是重试和自动修复解析器。 重试解析器尝试重新查询模型以获取适合解析器参数的答案,并且如果相关输出解析器在尝试修复输出时失败,则自动修复解析器会触发。

以下是 LangChain 输出解析器的完整列表:

  • XML parser
  • Datetime parser
  • Enum parser
  • Retry parser
  • Auto-fixing parser
  • Structured output parser

下面是完整的代码:

from typing import Listfrom dotenv import load_dotenv
from langchain.llms import OpenAI
from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import PromptTemplate
from pydantic import BaseModel, Fieldload_dotenv()model_name = "text-davinci-003"
temperature = 0.0
model = OpenAI(model_name=model_name, temperature=temperature)class Reservation(BaseModel):date: str = Field(description="reservation date")time: str = Field(description="reservation time")party_size: int = Field(description="number of people")cuisine: str = Field(description="preferred cuisine")parser = PydanticOutputParser(pydantic_object=Reservation)reservation_template = '''Book us a nice table for two this Friday at 6:00 PM. Choose any cuisine, it doesn't matter. Send the confirmation by email.Our location is: {query}Format instructions:{format_instructions}
'''prompt = PromptTemplate(template=reservation_template,input_variables=["query"],partial_variables={"format_instructions": parser.get_format_instructions()},
) _input = prompt.format_prompt(query="San Francisco, CA")output = model(_input.to_string())reservation = parser.parse(output)print(_input.to_string())for parameter in reservation.__fields__:print(f"{parameter}: {reservation.__dict__[parameter]},  {type(reservation.__dict__[parameter])}")

7、结束语

简而言之,将 LangChain 的 Pydantic 输出解析器集成到你的 Python 应用程序中,可以轻松地以编程方式处理从大型语言模型返回的文本。

它还可以帮助你以一种可以轻松与现有模型和数据库集成的方式构建数据。


原文链接:LangChain输出解析器 - BimAnt

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

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

相关文章

git merge 和 git pull的区别是什么

git merge 和 git pull 都是 Git 中用于合并代码的命令&#xff0c;但它们的使用场景和功能略有不同。 git merge 是用于合并一个或多个分支的命令。你可以将其他分支的代码合并到当前分支中。通常用于合并开发分支或修复分支到主分支上。 具体步骤&#xff1a; 首先&#xff0…

常用的Qt开源库分享

1. Qwt (https://qwt.sf.net): Qwt是一个基于Qt的数据可视化库&#xff0c;提供了绘制曲线、图表、仪表盘等功能。 2. QJson (https://qjson.sourceforge.net): QJson是一个用于JSON数据解析和生成的库&#xff0c;使Qt应用程序能够方便地处理JSON格式的数据。 3. QCustomP…

超过GPT3.5?Mixtral 8*7B 模型结构分析

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 前言 2023年12月11日&#xff0c;Mistral AI团队发布了一款高质量的稀疏专家混合模型Mixtral 8x7B。 Mistral AI继续致力于向开发者社区提供最优秀的开放模型。在人工智能领域向前发展&#xff0c;需要采取超越…

kali下-MSF-ftp_login模块破解FTP账号及密码

一、环境准备 两台设备在同一个网络内 一台kali系统&#xff1a;192.168.10.128 一台winserver2016&#xff1a;192.168.10.132 二、MSF介绍 metasploit 全称是The Metasploit Framework&#xff0c;又称MSF&#xff0c;是Kali 内置的一款渗透测试框架&#xff0c;也是全球…

Discuz论坛网站登录账号操作慢,必须强制刷新才会显示登录怎么办?

飞飞发现在登录服务器大本营账号时&#xff0c;输入账号密码登录后还是显示的登录框&#xff0c;强制刷新后才知道已经登录了&#xff0c;每次都要刷新才能正常显示&#xff0c;非常影响用户体验&#xff0c;于是在网上找了类似的问题故障解决方法&#xff0c;目前问题已经解决…

部署Sqli-labs靶场:一篇文章解析全过程

部署Sqli-labs靶场&#xff1a;一篇文章解析全过程 0x01 前言 Sqli-labs是一个在线的SQL注入练习平台&#xff0c;提供了一系列关卡供用户练习SQL注入的技巧和防范方法。在这个平台上&#xff0c;用户可以尝试注入攻击&#xff0c;并测试自己的技能和工具&#xff0c;同时也可…

深入理解与应用Flink中的水印机制

在Apache Flink这一现代大数据处理框架中&#xff0c;对实时流数据的高效、准确处理是一个核心诉求。为实现这一目标&#xff0c;Flink引入了一种独特而强大的时间管理机制——水印&#xff08;Watermark&#xff09;&#xff0c;它在处理无界流时起到了关键的作用&#xff0c;…

linux java 8安装

tar -zxf jdk-8u***.tar.gz -C /usr/loacl/ vim /etc/profile i 输入 export JAVA_HOME/usr/local/安装文件名 export PATH${JAVA_HOME}/bin:$PATH ESC :wq 保存退出 source /etc/profile 验证 java -version

暴雨信息与英特尔联合发布全球首个全液冷冷板服务器参考设计

科技之家 1 月 19 日消息&#xff0c;据暴雨服务器官方消息&#xff0c;1 月 18 日&#xff0c;暴雨信息与英特尔联合发布全球首个全液冷冷板服务器参考设计&#xff0c;并面向业界开放&#xff0c;推动全液冷冷板解决方案在全球数据中心的大规模部署应用。 基于该参考设计&am…

Java进阶-Tomcat发布JavaWeb项目

对于云服务器&#xff0c;程序员一般不会陌生&#xff0c;如果项目需要发布到现网&#xff0c;那么服务器是必不可缺的一项硬性条件&#xff0c;那么如何在云服务器上部署一个项目&#xff0c;需要做哪些配置准备&#xff0c;下面就由本文档为大家讲解&#xff0c;本篇以Tomcat…

像操作本地文件一样操作linux文件 centos7环境下samba共享服务搭建详细教程

1.安装dnf yum -y install dnf 2.安装samba dnf install samba -y 3.配置 3.1创建并设置用户信息 #创建用户 useradd -M -s /sbin/nologin samba echo 123|passwd --stdin samba mkdir /home/samba chown -R samba:samba /home/samba smbpasswd -a samba smaba设置密码示…

Ubuntu查看版本

查看版本 法一&#xff1a;cat /proc/version 只能查出大版本号 rootHKSZF-ZW-172-19-146-176:~# cat /proc/version Linux version 4.15.0-112-generic (builddlcy01-amd64-027) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #113-Ubuntu SMP Thu Jul 9 23:41:39 UT…

137基于matlab的面和线接触的滑块润滑

基于matlab的面和线接触的滑块润滑&#xff0c;基于有限差分法求解面接触滑块润滑的油膜厚度、油膜压力&#xff0c;输出三维可视化结果。程序已调通&#xff0c;可直接运行。 137 matlab油膜压力油膜厚度 (xiaohongshu.com)

mybatis-plus批量保存异常及效率优化

最近基于自己公司内部服务维护&#xff0c;发现其中调度中心近期出现不少错误日志&#xff0c;但是该任务却是正常执行&#xff0c;生成的报表数据也是正常的&#xff0c;所以很多天没有发现问题 这就匪夷所思了&#xff0c; 经仔细排查发现&#xff0c;是触发了feign超时hyst…

java常用API异常

1.包装类 1.1 基本类型包装类&#xff08;记忆&#xff09; 基本类型包装类的作用 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据 常用的操作之一&#xff1a;用于基本数据类型与字符串之间的转换 基本类型对应的包装类 基本数据类型包装类by…

司铭宇老师:房地产中介电话销售培训:房地产中介电话销售技巧

房地产中介电话销售培训&#xff1a;房地产中介电话销售技巧 在当今的房地产市场中&#xff0c;电话销售已经成为了房地产中介的重要营销手段。然而&#xff0c;如何才能有效地利用电话销售来吸引客户&#xff0c;提高销售业绩呢&#xff1f;这就需要掌握一些专业的电话销售技巧…

【React基础】– JSX语法

文章目录 认识JSX为什么React选择了JSXJSX的使用 React事件绑定this的绑定问题事件参数传递 React条件渲染React列表渲染列表中的key JSX的本质createElement源码Babel官网查看直接编写jsx代码 虚拟DOM的创建过程jsx – 虚拟DOM – 真实DOM声明式编程 阶段案例练习 认识JSX ◼ …

Elasticsearch(es)中must以及term的基本使用

文章目录 should 和 mustterm 和 range常见的查询方式 should 和 must 在 Elasticsearch&#xff08;ES&#xff09;中&#xff0c;should 和 must 是布尔查询&#xff08;Boolean Query&#xff09;中常用的两个子句。 should 子句&#xff1a;should 表示一个或多个条件之一满…

10个常考的前端手写题,你全都会吗?

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 今天来分享一下10个常见的JavaScript手写功能。 目录 1.实现new 2.call、apply、…

AliyunECS服务器在安装docker服务时一直出现:错误:为仓库 ‘root_n‘ 下载元数据失败

AliyunECS服务器在安装docker服务时一直出现:错误&#xff1a;为仓库 root_n 下载元数据失败 一、AliyunECS服务器在安装docker服务时一直出现:错误&#xff1a;为仓库 root_n 下载元数据失败endl 一、AliyunECS服务器在安装docker服务时一直出现:错误&#xff1a;为仓库 ‘roo…