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, #E1D9B7

response2list=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 模块中的类型。

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

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

相关文章

docker安装MySQL8:docker离线安装MySQL、docker在线安装MySQL、MySQL镜像下载、MySQL配置、MySQL命令

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull mysql:8.0.41 2、离线包下载 两种方式&#xff1a; 方式一&#xff1a; -&#xff09;在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -&#xff09;导出 # 导出镜…

【MySQL】语言连接

语言连接 一、下载二、mysql_get_client_info1、函数2、介绍3、示例 三、其他函数1、mysql_init2、mysql_real_connect3、mysql_query4、mysql_store_result5、mysql_free_result6、mysql_num_fields7、mysql_num_rows8、mysql_fetch_fields9、mysql_fetch_row10、mysql_close …

建表注意事项(2):表约束,主键自增,序列[oracle]

没有明确写明数据库时,默认基于oracle 约束的分类 用于确保数据的完整性和一致性。约束可以分为 表级约束 和 列级约束&#xff0c;区别在于定义的位置和作用范围 复合主键约束: 主键约束中有2个或以上的字段 复合主键的列顺序会影响索引的使用&#xff0c;需谨慎设计 添加…

本地缓存~

前言 Caffeine是使用Java8对Guava缓存的重写版本&#xff0c;在Spring Boot 2.0中取而代之&#xff0c;基于LRU算法实现&#xff0c;支持多种缓存过期策略。 以下摘抄于https://github.com/ben-manes/caffeine/wiki/Benchmarks-zh-CN 基准测试通过使用Java microbenchmark ha…

视觉状态空间模型(VMamba)的解读

在计算机视觉领域&#xff0c;设计计算高效的网络架构一直是研究的热点。今天&#xff0c;我想和大家分享一篇发表在 NIPS 2024 上的论文——VMamba&#xff1a;Visual State Space Model&#xff0c;这篇论文提出了一种新的视觉骨干网络&#xff0c;具有线性时间复杂度&#x…

Kanass基础教程-创建项目

Kanass是一款国产开源免费的项目管理工具&#xff0c;工具简洁易用&#xff0c;开源免费&#xff0c;之前介绍过kanass的一些产品简介及安装配置方法&#xff0c;本文就从如何创建第一个项目来开始kanass上手之旅吧。 1. 创建项目 点击项目->项目添加 按钮进入项目添加页面…

问题的价值 ( Value of Question ) 公式

一、什么是问题的价值 我们的人生、工作的期间、瞬息万变的商业环境中&#xff0c;我们必然会面对很多问题&#xff0c;也会提出很多问题。 但这些问题是否具有回答的 价值&#xff0c;应该如何 衡量 呢&#xff1f; 简单如&#xff0c;女朋友问今晚应该吃什么、世界如何才能…

Zemax 中带有体素探测器的激光谐振腔

激光谐振腔是激光系统的基本组成部分&#xff0c;在光的放大和相干激光辐射的产生中起着至关重要的作用。 激光腔由两个放置在光学谐振器两端的镜子组成。一个镜子反射率高&#xff08;后镜&#xff09;&#xff0c;而另一个镜子部分透明&#xff08;输出耦合器&#xff09;。…

在GPIO控制器中,配置通用输入,读取IO口电平时,上拉和下拉起到什么作用

上下拉电阻作用 在通用输入的时候&#xff0c;也就是在读某个IO的电平的时候 一定要让IO口先保持一个电平状态&#xff0c;这样才能检测到不同电平状态。 如何保持电平状态&#xff1f; 1. 可以通过芯片内部的上下拉电阻&#xff0c;由于是弱上下拉一般不用 2. 硬件外界一个…

如何使用 DeepSeek 和 Dexscreener 构建免费的 AI 加密交易机器人?

我使用DeepSeek AI和Dexscreener API构建的一个简单的 AI 加密交易机器人实现了这一目标。在本文中&#xff0c;我将逐步指导您如何构建像我一样的机器人。 DeepSeek 最近发布了R1&#xff0c;这是一种先进的 AI 模型。您可以将其视为 ChatGPT 的免费开源版本&#xff0c;但增加…

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

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

python-leetcode-二叉树的右视图

199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solut…

冲刺一区!挑战7天完成一篇趋势性分析GBD DAY1-7

Day1. 公开数据库的挖掘太火热了,其中GBD数据库的挖掘又十分的火爆.那我就来挑战一篇GBD、一篇关于趋势性分析的GBD&#xff01; GBD数据库挖掘是目前的四大刊常客&#xff0c;经常出现在顶级期刊上面。这个数据库亮点就是&#xff1a;可视化&#xff0c;统计学简单、而数据可…

Maven全解析:从基础到精通的实战指南

概念&#xff1a; Maven 是跨平台的项目管理工具。主要服务基于 Java 平台的构建&#xff0c;依赖管理和项目信息管理项目构建&#xff1a;高度自动化&#xff0c;跨平台&#xff0c;可重用的组件&#xff0c;标准化的流程 依赖管理&#xff1a; 对第三方依赖包的管理&#xf…

使用LLaMA-Factory对AI进行认知的微调

使用LLaMA-Factory对AI进行认知的微调 引言1. 安装LLaMA-Factory1.1. 克隆仓库1.2. 创建虚拟环境1.3. 安装LLaMA-Factory1.4. 验证 2. 准备数据2.1. 创建数据集2.2. 更新数据集信息 3. 启动LLaMA-Factory4. 进行微调4.1. 设置模型4.2. 预览数据集4.3. 设置学习率等参数4.4. 预览…

复制粘贴小工具——Ditto

在日常工作中&#xff0c;复制粘贴是常见的操作&#xff0c;但Windows系统自带的剪贴板功能较为有限&#xff0c;只能保存最近一次的复制记录&#xff0c;这对于需要频繁复制粘贴的用户来说不太方便。今天&#xff0c;我们介绍一款开源、免费且功能强大的剪贴板增强工具——Dit…

无人机图传模块 wfb-ng openipc-fpv,4G

openipc 的定位是为各种模块提供底层的驱动和linux最小系统&#xff0c;openipc 是采用buildroot系统编译而成&#xff0c;因此二次开发能力有点麻烦。为啥openipc 会用于无人机图传呢&#xff1f;因为openipc可以将现有的网络摄像头ip-camera模块直接利用起来&#xff0c;从而…

Redis代金卷(优惠卷)秒杀案例-多应用版

Redis代金卷(优惠卷)秒杀案例-单应用版-CSDN博客 上面这种方案,在多应用时候会出现问题,原因是你通过用户ID加锁 但是在多应用情况下,会出现两个应用的用户都有机会进去 让多个JVM使用同一把锁 这样就需要使用分布式锁 每个JVM都会有一个锁监视器,多个JVM就会有多个锁监视器…

国产之光DeepSeek架构理解与应用分析

目录 初步探索DeepSeek的设计 一、核心架构设计 二、核心原理与优化 三、关键创新点 四、典型应用场景 五、与同类模型的对比优势 六、未来演进方向 从投入行业生产的角度看 一、DeepSeek的核心功能扩展 二、机械电子工程产业中的具体案例 1. 预测性维护&#xff08;Predictive…

基于微信小程序的医院预约挂号系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…