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

langchain基础(二)

一、输出解析器(Output Parser)

作用:(1)让模型按照指定的格式输出;

(2)解析模型输出,提取所需的信息

1、逗号分隔列表

CommaSeparatedListOutputParser:规定模型输出为以逗号分隔的字符串形式(它是自然语言意义上的列表,不是 Python 意义上的列表),解析时再将逗号分隔的字符串转成列表。

#使用CommaSeparatedListOutputParser限制模型输出格式,并对输出进行解析,将其转换为列表形式。from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatOpenAI# 初始化模型
model=ChatOpenAI(model="gpt-3.5-turbo",base_url="https://api.gptsapi.net/v1",)#构建消息列表
prompt = ChatPromptTemplate.from_messages([ #构建提示模板("system", "{parser_instructions}"),("human", "列出5个{subject}色系的十六进制颜色码。")
])output_parser=CommaSeparatedListOutputParser() #创建输出解析器(以逗号分隔的列表)
parser_instructions=output_parser.get_format_instructions() #获取解析器的指令
print(parser_instructions) #Your response should be a list of comma separated values, eg: `foo, bar, baz` or `foo,bar,baz`final_prompt=prompt.invoke( #将变量填充,生成最终提示{"parser_instructions":parser_instructions,"subject":"莫兰迪"}
)# 调用模型并输出结果
response=model.invoke(final_prompt)
print(type(response)) #<class 'langchain_core.messages.ai.AIMessage'>
print(response.content) # #F0A202, #FFCD75, #F8E6A0, #EAE0C8, #E1D9B7response2list=output_parser.invoke(response) #使用output_parser的invoke方法对模型的响应response进行解析
print(response2list) #['#F0A202', '#FFCD75', '#F8E6A0', '#EAE0C8', '#E1D9B7']

系统消息("{parser_instructions}"),此消息位置用于传递输出解析器的指令,告诉模型如何格式化输出。

创建CommaSeparatedListOutputParser实例output_parser,用于解析模型输出。

通过output_parser.get_format_instructions()获取输出格式指令,这些指令会告诉模型应以逗号分隔的列表形式输出结果。打印这些指令可查看具体内容,例如:“你的回答应该是一个逗号分隔的列表,不包含任何其他解释或说明。”

使用output_parserinvoke方法对模型的响应response进行解析。output_parser会按照之前定义的格式指令,将模型输出转换为 Python 列表。

对于output_parser的invoke函数,

Union[str, BaseMessage] 是 Python typing 模块中的类型注解,表示 input 参数可以是 str 类型(字符串类型)或者 BaseMessage 类型。Union 用于指定一个参数可以是多种类型中的任意一种。 

 2、JSON

# 从给定的书籍概述中提取书名、作者以及书籍体裁等信息,并将提取结果解析为 Pydantic 模型对象from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import ChatPromptTemplate
from pydantic import BaseModel,Field
from typing import List
from langchain_community.chat_models import ChatOpenAI# 初始化模型
model=ChatOpenAI(model="gpt-3.5-turbo",base_url="https://api.gptsapi.net/v1",)# 消息列表
## 定义数据输出和解析格式,获取parser_instructions
class BookInfo(BaseModel):book_name:str=Field(description="书籍的名字",example="百年孤独")author_name:str=Field(description="书籍的作者",example="加西亚·马尔克斯")genres:List[str]=Field(description="书籍的体裁",example=["小说","文学"])output_parser=PydanticOutputParser(pydantic_object=BookInfo) #将BookInfo类作为参数传递,用于将模型输出解析为BookInfo对象
parser_instructions=output_parser.get_format_instructions()
print(parser_instructions)## 构建提示模板
prompt=ChatPromptTemplate.from_messages([("system","{parser_instructions}。你输出的结果请使用中文。"),("human","请你帮我从书籍概述中,提取书名、作者,以及书籍的体裁。书籍概述会被三个#符号包围。\n###{book_introduction}###")]
)book_introduction="""
《明朝那些事儿》,作者是当年明月。2006 年 3 月在天涯社区首次发表,
2009 年 3 月 21 日连载完毕,边写作边集结成书出版发行,一共 7 本。
《明朝那些事儿》主要讲述的是从 1344 年到 1644 年这三百年间关于明朝的一些故事。
以史料为基础,以年代和具体人物为主线,并加入了小说的笔法,语言幽默风趣。
对明朝十六帝和其他王公权贵和小人物的命运进行全景展示,
尤其对官场政治、战争、帝王心术着墨最多,并加入对当时政治经济制度、人伦道德的演义。
它以一种网络语言向读者娓娓道出三百多年关于明朝的历史故事、人物。
其中原本在历史中陌生、模糊的历史人物在书中一个个变得鲜活起来。
《明朝那些事儿》为读者解读历史中的另一面,让历史变成一部活生生的生活故事。"""## 将格式指令和书籍概述填充到提示模板中,生成最终的提示
final_prompt=prompt.invoke({"parser_instructions":parser_instructions,"book_introduction":book_introduction}
)# 调用模型并输出结果
response=model.invoke(final_prompt)
print(response.content)response2bookinfo=output_parser.invoke(response) #将模型的响应response解析为BookInfo对象response2bookinfo
print(response2bookinfo)
print(response2bookinfo.book_name)
print(response2bookinfo.author_name)
print(response2bookinfo.genres)

1、pydantic是一个功能强大的python库,主要用于数据验证、数据解析和数据序列化。

数据验证:

(1)类型检查:对输入的数据进行严格的类型检查,确保数据符合模型定义的类型。例如,在定义一个用户模型时,可以指定用户的年龄为整数类型,如果传入的数据不是整数,pydantic 会抛出验证错误。

(2)范围和约束检查:为字段设置范围和约束条件,如最大长度、最小长度、最大值、最小值等。

数据解析:

自动类型转换: 可以自动将输入的数据转换为模型定义的类型。例如,输入的字符串形式的数字可以自动转换为整数或浮点数。

数据序列化:

模型实例可以方便地转换为字典(.dict)或 JSON 字符串(.json),便于数据的存储和传输。

补充:dict和json的区别

如果你只在 Python 内部处理数据,字典可能更合适;而如果涉及到数据的传输或存储,尤其是跨系统的交互,JSON 字符串通常是更好的选择。

2、BaseModelField来自pydantic库,它们具有以下作用:

BaseModel是一个基类,用于创建数据模型类。通过继承BaseModel,可以快速定义具有数据验证、序列化和反序列化等功能的数据模型。

比如BookInfo类继承自BaseModel,这使得BookInfo类可以利用pydantic提供的自动验证功能,确保数据符合定义的类型和约束条件。

Field是用于定义模型字段的函数。它为模型中的字段(book_nameauthor_namegenres)提供额外的元数据和配置选项,如字段的描述(descripton)、示例(example)等。

这些信息在生成文档、进行数据验证以及帮助开发者、AI理解代码逻辑等方面都非常有帮助。

3、打印指令print(parser_instructions)

开头部分说明了输出应该被格式化为一个符合给定 JSON 模式的 JSON 实例,并通过一个示例展示了什么样的输出是符合模式的,什么样的输出是不符合模式的。

 JSON Schema(schema模式,用于规范实际存储的书籍信息的结构和规则):“说明书”

输出json:

 4、输出的json本质上是字符串,将其转为类实例更容易提取对应信息

result.book_name就可以直接得到书名了。

5、from typing import List

在 Python 3.9 之前需要引入 List 来实现更精确的类型提示,而 Python 3.9 及以后可以直接使用内置的 list 完成类似功能。不过,为了保持代码在不同 Python 版本之间的兼容性,很多项目仍然会使用 typing 模块中的类型。

相关文章:

langchain基础(二)

一、输出解析器&#xff08;Output Parser&#xff09; 作用&#xff1a;&#xff08;1&#xff09;让模型按照指定的格式输出&#xff1b; &#xff08;2&#xff09;解析模型输出&#xff0c;提取所需的信息 1、逗号分隔列表 CommaSeparatedListOutputParser&#xff1a;…...

数据库安全管理中的权限控制:保护数据资产的关键措施

title: 数据库安全管理中的权限控制:保护数据资产的关键措施 date: 2025/2/2 updated: 2025/2/2 author: cmdragon excerpt: 在信息化迅速发展的今天,数据库作为关键的数据存储和管理中心,已经成为了企业营运和决策的核心所在。然而,伴随着数据规模的不断扩大和数据价值…...

Leetcode598:区间加法 II

题目描述&#xff1a; 给你一个 m x n 的矩阵 M 和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时&#xff0c; M[x][y] 应该加 1。 在 执行完所有操作后 &#xff0c;计算并返回 矩阵中最大…...

【Proteus】NE555纯硬件实现LED呼吸灯效果,附源文件,效果展示

本文通过NE555定时器芯片和简单的电容充放电电路,设计了一种纯硬件实现的呼吸灯方案,并借助Proteus仿真软件验证其功能。方案无需编程,成本低且易于实现,适合电子爱好者学习PWM(脉宽调制)和定时器电路原理。 一、呼吸灯原理与NE555功能分析 1. 呼吸灯核心原理 呼吸灯的…...

SAP HCM insufficient authorization, no.skipped personnel 总结归纳

导读 权限:HCM模块中有普通权限和结构化权限。普通权限就是PFCG的权限&#xff0c;结构化权限就是按照部门ID授权&#xff0c;颗粒度更细&#xff0c;对分工明细化的单位尤其重要&#xff0c;今天遇到的问题就是结构化权限的问题。 作者&#xff1a;vivi&#xff0c;来源&…...

五. Redis 配置内容(详细配置说明)

五. Redis 配置内容(详细配置说明) 文章目录 五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置…...

4 [危机13小时追踪一场GitHub投毒事件]

事件概要 自北京时间 2024.12.4 晚间6点起&#xff0c; GitHub 上不断出现“幽灵仓库”&#xff0c;仓库中没有任何代码&#xff0c;只有诱导性的病毒文件。当天&#xff0c;他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒&#xff0c;等待不…...

Shadow DOM举例

这东西具有隔离效果&#xff0c;对于一些插件需要append一些div倒是不错的选择 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"utf-8"> <title>演示例子</title> </head> <body> <style&g…...

力扣动态规划-18【算法学习day.112】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&#xff01;&#xff01;&#xff01; 习题 1.下降路径最小和 题目链接:931. …...

网络基础

协议 协议就是约定 网络协议是协议中的一种 协议分层 协议本身也是软件&#xff0c;在设计上为了更好的模块化&#xff0c;解耦合&#xff0c;也是设计成为层状结构的 两个视角&#xff1a; 小白&#xff1a;同层协议&#xff0c;直接通信 工程师&#xff1a;同层协议&…...

使用 EXISTS 解决 SQL 中 IN 查询数量过多的问题

在 SQL 查询中&#xff0c;当我们面对需要在 IN 子句中列举大量数据的场景时&#xff0c;查询的性能往往会受到显著影响。这时候&#xff0c;使用 EXISTS 可以成为一种优化的良方。 问题的来源 假设我们有两个表&#xff0c;orders 和 customers&#xff0c;我们需要查询所有…...

使用SpringBoot发送邮件|解决了部署时连接超时的bug|网易163|2025

使用SpringBoot发送邮件 文章目录 使用SpringBoot发送邮件1. 获取网易邮箱服务的授权码2. 初始化项目maven部分web部分 3. 发送邮件填写配置EmailSendService [已解决]部署时连接超时附&#xff1a;Docker脚本Dockerfile创建镜像启动容器 1. 获取网易邮箱服务的授权码 温馨提示…...

Ruby Dir 类和方法详解

Ruby Dir 类和方法详解 引言 在 Ruby 中&#xff0c;Dir 是一个非常有用的类&#xff0c;用于处理文件系统中的目录。它提供了许多方便的方法来列出目录内容、搜索文件、以及处理文件系统的其他相关操作。本文将详细介绍 Ruby 的 Dir 类及其常用方法。 一、Dir 类概述 Dir …...

克隆OpenAI(基于openai API和streamlit)

utils.py&#xff1a; from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationChain import osdef get_chat_response(api_key,prompt,memory): # memory不能是函数的内部局部变量&…...

位运算算法题

一.判断字符是否唯一 法一&#xff1a; 我们直接借助一个字符数组来模拟哈希表统计字符串即可&#xff0c;并且我们没有必要先将所有字符都放入字符数组中&#xff0c;边插入边判断&#xff0c;当我们要插入某个字符的时候&#xff0c;发现其已经出现了&#xff0c;此时必然重复…...

12 向量结构模块(vector.rs)

一vector.rs源码 // Copyright 2013 The Servo Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE…...

Android车机DIY开发之学习篇(六)编译讯为3568开发板安卓

Android车机DIY开发之学习篇(六)编译讯为3568开发板安卓 1.SDK解压到家目录下的 rk3588_android_sdk 目录 一. 全部编译 ###安装所需环境 sudo apt-get update sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g…...

Codeforces Round 863 (Div. 3) E. Living Sequence

题目链接 头一回用不是正解的方法做出来&#xff0c;也是比较极限&#xff0c;直接说做法就是二分数位dp 数位 d p dp dp 求 1 − n 1-n 1−n出现多少含 4 4 4的数字个数 这纯纯板子了 \sout{这纯纯板子了} 这纯纯板子了 设 f ( x ) f(x) f(x) 为 1 − x 1-x 1−x 中含有4的…...

一文讲解HashMap线程安全相关问题(上)

HashMap不是线程安全的&#xff0c;主要有以下几个问题&#xff1a; ①、多线程下扩容会死循环。JDK1.7 中的 HashMap 使用的是头插法插入元素&#xff0c;在多线程的环境下&#xff0c;扩容的时候就有可能导致出现环形链表&#xff0c;造成死循环。 JDK 8 时已经修复了这个问…...

MFC 创建Ribbon样式窗口

然后点击下一步直到完成即可...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...