LangChain 13输出解析Output Parsers 自动修复解析器

LangChain系列文章

  1. LangChain 实现给动物取名字,
  2. LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
  3. LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
  4. LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
  5. LangChain 5易速鲜花内部问答系统
  6. LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
  7. LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
  8. LangChain 8 模型Model I/O:输入提示、调用模型、解析输出
  9. LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
  10. LangChain 10思维链Chain of Thought一步一步的思考 think step by step
  11. LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain
  12. LangChain 12调用模型HuggingFace中的Llama2和Google Flan t5
    在这里插入图片描述
    输出解析器
    语言模型输出文本。但很多时候,您可能希望获得比只有文本更结构化的信息。这就是输出解析器的作用。

输出解析器是帮助构建语言模型响应结构的类。输出解析器必须实现两种主要方法:

  1. “Get format instructions获取格式指令”:返回一个包含语言模型输出应该如何格式化的指令的字符串的方法。
  2. “Parse解析”:接受一个字符串(假设是语言模型的响应)并将其解析成某种结构的方法。

然后还有一个可选的方法:

“Parse with prompt带提示解析”:接受一个字符串(假设是语言模型的响应)和一个提示(假设是生成这种响应的提示)并将其解析成某种结构的方法。在事件中,OutputParser希望重试或以某种方式修复输出,并且需要提示中的信息来这样做时,大部分提供提示。

1. 列表输出解析器List parser

这个输出解析器可以在你想要返回逗号分隔的项目列表时使用。

代码文件OutputParsers/text_list_parser.py

# 导入 Langchain 库的 OpenAI 模块,用于与 OpenAI 的 GPT-3 模型进行交互。
from langchain.llms import OpenAI  

# 导入 PromptTemplate 模块,用于创建和管理提示模板。
from langchain.prompts import PromptTemplate  

# 导入输出解析器,用于解析生成文本的格式。
from langchain.output_parsers import CommaSeparatedListOutputParser  

# 导入 dotenv 库,用于从 .env 文件加载环境变量,管理敏感数据,如 API 密钥。
from dotenv import load_dotenv  

# 调用 load_dotenv 函数来加载 .env 文件中的环境变量。
load_dotenv()  

# 创建一个 OpenAI 类的实例,用于生成文本。
# 指定使用的模型是 "text-davinci-003",这是一个高级的 GPT-3 模型。
# 设置 temperature 参数,影响文本生成的随机性和创造性。
# 设置 max_tokens,限制生成文本的最大长度。
llm = OpenAI(
    model="text-davinci-003",
    temperature=0.7,
    max_tokens=600
)

# 创建一个输出解析器实例,专门用于解析逗号分隔的列表。
output_parser = CommaSeparatedListOutputParser()

# 获取格式化指令,用于在提示模板中指定输出格式。
format_instructions = output_parser.get_format_instructions()

# 创建一个提示模板实例。
# 模板包含了生成特定主题列表的指令,例如列出5种水果。
prompt = PromptTemplate(
    template="List 5 {subject}.\n{format_instructions}",
    input_variables=['subject'],
    partial_variables={'format_instructions': format_instructions}
)

# 格式化提示,将主题设置为“fruits”。
_input = prompt.format(subject="fruits")

# 使用 llm 实例生成回应。
output = llm(_input)

# 使用输出解析器解析生成的回应。
response = output_parser.parse(output)

# 打印解析后的回应。
print(response)

输出结果

zgpeace at zgpeaces-MBP in ~/Workspace/LLM/langchain-llm-app (develop●) (.venv) 
$ python OutputParsers/text_list_parser.py
['Apple', 'Banana', 'Orange', 'Strawberry', 'Watermelon']

2. 自动修复解析器 Auto-fixing parser

该输出解析器包装另一个输出解析器,如果第一个解析器失败,它会调用另一个LLM来修复任何错误。

但除了抛出错误之外,我们还可以做其他事情。具体来说,我们可以将格式不正确的输出以及格式化的指令传递给模型,并要求其进行修复。

在这个例子中,我们将使用上面的Pydantic输出解析器。如果我们将一个不符合架构的结果传递给它,会发生什么呢?

# 导入 Langchain 库中的 ChatOpenAI 类,用于与 OpenAI 聊天模型进行交互。
from langchain.chat_models import ChatOpenAI  

# 导入 PydanticOutputParser,用于将输出解析为 Pydantic 模型。
from langchain.output_parsers import PydanticOutputParser

# 导入 Pydantic BaseModel 类和 Field 函数,用于定义数据模型。
from langchain.pydantic_v1 import BaseModel, Field
from typing import List

# 导入 dotenv 库,用于从 .env 文件加载环境变量,管理敏感数据,如 API 密钥。
from dotenv import load_dotenv  

# 调用 load_dotenv 函数来加载 .env 文件中的环境变量。
load_dotenv()  

# 定义一个 Pydantic 数据模型,表示演员和他们参演的电影名称列表。
class Actor(BaseModel):
    name: str = Field(description="The name of the actor")
    film_names: List[str] = Field(description="list of names of films they starred in")

# 定义一个查询字符串,用于生成随机演员的电影作品列表。
actor_query = "Generate the filmography for a random actor."

# 创建一个 PydanticOutputParser 实例,用于解析 Pydantic 模型。
parser = PydanticOutputParser(pydantic_object=Actor)

# 定义一个格式不正确的字符串。
misformatted = "{'name': 'Tom Hanks', 'film_names': ['Forrest Gump']}"

# 打开注释则格式化报错: Expecting property name enclosed in double quotes: line 1 column 2
# parser.parse(misformatted)

# 导入 OutputFixingParser,用于修正输出格式错误。
from langchain.output_parsers import OutputFixingParser

# 创建一个 OutputFixingParser 实例,结合 Pydantic 解析器和 ChatOpenAI 模型。
new_parser = OutputFixingParser.from_llm(parser=parser, llm=ChatOpenAI())

# 使用新解析器解析格式不正确的字符串,并打印结果。
response = new_parser.parse(misformatted)
print(response)

打开 parser.parse(misformatted) 报错

zgpeace at zgpeaces-MBP in ~/Workspace/LLM/langchain-llm-app (develop●) (.venv) 
$ python OutputParsers/chat_auto_fixing_parser.py 
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/langchain/output_parsers/pydantic.py", line 27, in parse
    json_object = json.loads(json_str, strict=False)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/__init__.py", line 359, in loads
    return cls(**kw).decode(s)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/zgpeace/Workspace/LLM/langchain-llm-app/OutputParsers/chat_auto_fixing_parser.py", line 20, in <module>
    parser.parse(misformatted)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/langchain/output_parsers/pydantic.py", line 33, in parse
    raise OutputParserException(msg, llm_output=text)
langchain.schema.output_parser.OutputParserException: Failed to parse Actor from completion {'name': 'Tom Hanks', 'film_names': ['Forrest Gump']}. Got: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

注释掉 #parser.parse(misformatted) 的输出

zgpeace at zgpeaces-MBP in ~/Workspace/LLM/langchain-llm-app (develop●) (.venv) 
$ python OutputParsers/chat_auto_fixing_parser.py
name='Tom Hanks' film_names=['Forrest Gump']

代码
https://github.com/zgpeace/pets-name-langchain/tree/develop

参考

https://python.langchain.com/docs/modules/model_io/output_parsers/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

scanpy 读取mtx文件

import scanpy as sc adata sc.read("./GSE144136_GeneBarcodeMatrix_Annotated.mtx") ##

【bmp文件怎么批量改成JPG?】

操作 在需要修改格式的图片文件夹中新建一个TXT文本文档 文档中输入(ren *.原图片类型 *.需要修改成的图片类型) ren *.bmp *.jpg 输入完成后保存 将刚刚新建的文档重命名 修改为.bat后缀的文件 弹出弹窗&#xff0c;点击是 双击此程序&#xff0c;即可将文件夹中的BMP图…

UniPro集成华为云WeLink 为企业客户构建互为联接的协作平台

华为云WeLink是华为开启数字化办公体验、帮助企业实现数字化转型的实践&#xff0c;类似钉钉。UniPro的客户企业中&#xff0c;有使用WeLink作为协作工具的&#xff0c;基于客户的实际业务需求&#xff0c;UniPro实现了与WeLink集成的能力&#xff0c;以帮助客户企业丰富和扩展…

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

【【Linux下的Petallinux 以及其他的配置】】

Linux下的Petallinux 以及其他的配置 sudo apt-get install iproute2 gawk python3 python build-essential gcc git make net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget git-core diffstat chrpath socat xterm autoconf libtoo…

C语言--每日选择题--Day27

第一题 1. 对于代码段&#xff0c;问下面不可以表示a[1]地址的是&#xff08;&#xff09; int a[10]; A&#xff1a;&a[0] 1 B&#xff1a;a sizeof(int) C&#xff1a;(int*)&a 1 D&#xff1a;(int*)((char*)&a sizeof(int)) 答案及解析 A A&#xff1a;取到…

SpringBoot : ch06 整合 web(二)

前言 SpringBoot作为一款优秀的框架&#xff0c;不仅提供了快速开发的能力&#xff0c;同时也提供了丰富的文档和示例&#xff0c;让开发者更加容易上手。在本博客中&#xff0c;我们将介绍如何使用SpringBoot来整合Web应用程序的相关技术&#xff0c;并通过实例代码来演示如何…

全新爱蜗影视优码双端影视源码v9.1/影视视频APP源码+支持代理/在线支付+支持对应苹果CMS

源码简介&#xff1a; 这个是最新爱蜗影视优码双端影视源码&#xff0c;作为实用方便的影视视频APP源码&#xff0c;它不仅支持代理/在线支付&#xff0c;而且也支持对应苹果CMS。 爱蜗影视优码双端影视支持对应苹果CMS支持代理在线支付 带图文教程&#xff0c;全新美化多功能…

盘点最新的十大地推拉新app推广接单平台,一手接单渠道分享

小编主推&#xff1a;聚量推客 一手官签直营 随着网络的发展&#xff0c;越来越多的app运应而生社交类、购物类、娱乐类、资讯类、教育类、健康类、金融类为了将这些应用程序推广给更多的人使用&#xff0c;地推拉新app推广接单平台应运而生。本文将介绍十大地推拉新app推广接…

几何教学工具 Sketchpad几何画板 mac软件特色

Sketchpad几何画板 for Mac是一款适用于macOS系统的几何教学工具&#xff0c;用户可以在其画板上进行各种几何图形的绘制、演示&#xff0c;帮助教师了解学生的思路和对概念的掌握程度。此外&#xff0c;Sketchpad更深层次的功能则是可以用来进行几何交流、研究和讨论&#xff…

单片机学习11——矩阵键盘

矩阵键盘&#xff1a; 这个矩阵键盘可以接到P0、P1、P2、P3都是可以的。 使用矩阵键盘是能节省单片机的IO口。 P3.0 P3.1 P3.2 P3.3 称之为行号。 P3.4 P3.5 P3.6 P3.7 称之为列号。 矩阵键盘检测原理&#xff1a; 1、检查是否有键按下&#xff1b; 2、键的抖动处理&#xf…

电机工作制

电机工作制 1.什么是电机工作制2.电机工作制的分类 最近在做电机控制器&#xff0c;看到很多电机铭牌上写着工作制&#xff1a;S*&#xff0c;有S1&#xff0c;有S2&#xff0c;查了一下&#xff0c;学习一下是什么意思。 1.什么是电机工作制 根据GBT 755-2019《旋转电机定额…

机器学习的复习笔记4-岭回归与多项式回归

一、岭回归 在简单的线性回归中&#xff0c;一味追求平方误差最小化&#xff0c;R2值尽可能大&#xff0c;可能会受到噪声的严重干扰。噪声&#xff0c;即偶发的错误的值。 如图&#xff0c;若为满足所有点的拟合&#xff08;虚线&#xff09;&#xff0c;表面上看R2值小&…

springboot+vue实现websocket通信实例,进入页面建立连接

springbootvue实现websocket通信实例 进入页面建立连接 前端代码&#xff1a; <template><div class"app-container"><el-form :model"queryParams" ref"queryForm" size"small" :inline"true" v-show&qu…

数据治理:数据交换与数据集成

数据交换 基本概念 数据交换是将符合一个源模式的数据转换为符合目标模式数据的问题&#xff0c;该目标模式尽可能准确并且以与各种依赖性一致的方式反映源数据。 早期数据交换的一个主要方向是在关系模式之间从数据交换的上下文中寻求一阶查询的语义和复杂性。2008 年&…

java选择排序和冒泡排序

1.区别 选择排序和冒泡排序的区别主要在于算法逻辑、稳定性和交换成本。 算法逻辑&#xff1a;选择排序和冒泡排序都属于比较排序&#xff0c;但在具体算法逻辑上有所不同。冒泡排序是通过相邻元素之间的比较和交换&#xff0c;将较大&#xff08;或较小&#xff09;的元素逐…

一起学docker系列之十三使用Dockerfile构建带有Java 8、Vim和Ifconfig功能的CentOS镜像

目录 1 前言2 构建流程3 Dockerfile说明4 解释Dockerfile5 构建Docker镜像6 运行Docker容器7 总结8 参考地址 1 前言 Docker是一个强大的工具&#xff0c;可以创建一致、可移植和隔离的环境。在本指南中&#xff0c;我们将介绍如何创建一个基于CentOS的Docker镜像&#xff0c;…

从容应对高并发:RabbitMQ与消息限流策略的完美结合

在当今互联网时代&#xff0c;高并发访问已成为许多应用系统面临的常见挑战之一。对于需要处理大量请求的系统来说&#xff0c;如何保证系统的稳定性和可靠性是一个关键问题。RabbitMQ作为一种可靠的消息队列中间件&#xff0c;可以帮助解决高并发环境下的消息处理问题。而结合…

好用的基于layui的免费开源后台模版layuimini

发现一个好用的后台模版 基于layui的免费开源后台模版layuimini layuimini - 基于Layui的后台管理系统前端模板 easyadmin开源项目 EasyAdmin是基于ThinkPHP6.0Layui的快速开发的后台管理系统。 演示站点 演示地址&#xff1a;跳转提示&#xff08;账号&#xff1a;admin&a…

最佳软件配置管理工具(16款SCM工具)

配置管理&#xff08;CM&#xff09;是一种系统工程方法&#xff0c;用于在产品的整个生命周期内建立和维持产品的性能&#xff0c;功能和物理属性与其设计&#xff0c;要求和操作信息的一致性。 它们为您的组织带来了成本效益和更好的时间管理。 当今市场充斥着各种配置管理工…