使用Pydantic驾驭大模型

本文介绍Pydantic 库,首先介绍其概念及优势,然后通过基本示例展示如何进行数据验证。后面通过多个示例解释如何在LangChain中通过Pydantic进行数据验证,保证与大模型进行交互过程中数据准确性,并显示清晰的数验证错误信息。

Pydantic 简介

Pydantic 是用于数据验证和设置管理的 Python 库。它主要用于在 Python 程序中对数据进行严格的类型检查和验证,确保数据符合预期的格式和类型。它在处理用户输入、配置文件解析、API 数据交互等场景中非常有用。

Pydantic 基于 Python 的类型提示(type hints)构建。类型提示是 Python 3.5 + 版本引入的一个特性,用于在代码中声明变量、函数参数和返回值的类型,Pydantic 利用这些类型提示来验证数据。
在这里插入图片描述

Pydantic 的优势

  • 数据验证功能强大

    可以验证多种数据类型,包括基本数据类型(如整数、字符串、浮点数等)和复杂数据类型(如列表、字典、自定义对象等)。例如,验证一个包含用户信息的字典,其中年龄字段必须是整数,姓名字段必须是字符串。

    支持嵌套数据结构的验证。如果有一个包含多个子对象的复杂数据结构,Pydantic 可以递归地验证每个子对象的类型和格式。比如一个包含订单信息的对象,其中订单详情是一个列表,每个订单详情对象又包含商品名称、价格等字段,Pydantic 可以验证整个结构的正确性。

  • 易于使用和集成

    基于 Python 的类型提示,代码的可读性非常高。开发人员只需要在定义类或函数时使用类型提示,Pydantic 就能自动进行数据验证。例如:

from pydantic import BaseModel
class User(BaseModel):name: strage: int

​ 可以很方便地与其他 Python 库和框架集成,如 FastAPI。在 FastAPI 中,Pydantic 用于验证 API 请求和响应的数据格式,大大简化了 API 开发过程中的数据验证部分。

  • 提供友好的错误信息

​ 当数据验证失败时,Pydantic 会返回清晰、详细的错误信息。这些错误信息能够帮助开发人员快速定位问题所在。例如,如果一个字符串类型的字段被传入了一个整数,Pydantic 会指出哪个字段不符合预期类型以及正确的类型应该是什么。

简单验证示例

  • 基本数据验证示例
from pydantic import BaseModelclass Item(BaseModel):name: strprice: floatis_available: bool# 正确的数据
item1 = Item(name="Apple", price=0.5, is_available=True)
print(item1)# 错误的数据,会引发验证错误
try:item2 = Item(name="Banana", price="not a float", is_available=True)
except ValueError as e:print(e)

在这个示例中,定义了一个Item类,它有三个字段:name(字符串类型)、price(浮点数类型)和is_available(布尔类型)。当创建item1时,传入的数据符合预期类型,所以能够正确创建对象。而当创建item2时,price字段传入了一个字符串而不是浮点数,Pydantic 会引发一个ValueError,并且可以通过捕获这个异常来处理错误。

  • 嵌套数据验证示例
from pydantic import BaseModelclass OrderDetail(BaseModel):product_name: strquantity: intclass Order(BaseModel):order_id: intcustomer_name: strdetails: list[OrderDetail]order_data = {"order_id": 1,"customer_name": "John","details": [{"product_name": "Book", "quantity": 2},{"product_name": "Pen", "quantity": 3}]
}
order = Order(**order_data)
print(order)

这里定义了两个类,OrderDetail用于表示订单详情,包含product_name(字符串类型)和quantity(整数类型)。Order类用于表示整个订单,包含order_id(整数类型)、customer_name(字符串类型)和detailsOrderDetail对象列表)。通过传入符合结构要求的字典order_data,可以正确创建Order对象。Pydantic 会自动验证order_data中的每个字段和嵌套对象的类型是否正确。

**Pydantic驾驭LangChain **

在 LangChain 中,Pydantic 主要用于数据验证和模型定义。LangChain 通常需要处理各种类型的数据,包括从外部 API 接收的数据、用户输入的数据以及内部组件之间传递的数据。Pydantic 的数据验证功能可以确保这些数据符合预期的结构和类型,从而避免因数据不匹配导致的错误。

同时,Pydantic 的 BaseModel 可以帮助你创建清晰的数据结构,方便在 LangChain 应用程序中进行数据的序列化和反序列化操作。
在这里插入图片描述

简单示例场景

假设你正在构建一个使用 LangChain 的对话机器人,你可能需要处理用户的输入和从语言模型返回的信息。你可以使用 Pydantic 来定义输入和输出的数据模型。

from pydantic import BaseModel
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate# 定义一个 Pydantic 模型来表示用户输入
class UserInput(BaseModel):topic: str# 定义一个 Pydantic 模型来表示语言模型的输出
class LLMOutput(BaseModel):response: str# 定义一个提示模板
prompt = PromptTemplate(input_variables=["topic"],template="请告诉我关于{topic}的一些信息。"
)# 初始化语言模型
llm = OpenAI(temperature=0.9)# 创建一个链
chain = LLMChain(llm=llm, prompt=prompt)# 示例用户输入
user_input = UserInput(topic="人工智能的发展")# 验证用户输入
if not isinstance(user_input, UserInput):raise ValueError("输入必须是 UserInput 类型")# 运行链
response = chain.run(topic=user_input.topic)# 处理语言模型的输出
llm_output = LLMOutput(response=response)print(llm_output)
  • 首先,创建自定义的数据模型。

    UserInput 类是一个 Pydantic 模型,它规定了用户输入必须包含名为 topic 的字符串字段。

    LLMOutput 类是一个 Pydantic 模型,它规定了语言模型的输出必须包含名为 response 的字符串字段。

  • 我们使用 PromptTemplate 来创建一个提示模板,它将根据用户输入的 topic 生成相应的提示。然后,我们使用 OpenAI 初始化一个语言模型,并将其与 LLMChain 结合,创建一个链。

  • 当我们收到用户输入时,我们将其存储在 user_input 变量中,并将其作为 UserInput 类型进行验证。如果输入不符合 UserInput 类型,将引发 ValueError。运行链时,我们将用户输入的 topic 传递给链。

  • 语言模型返回的结果存储在 response 中,我们将其包装在 LLMOutput 类型中,以确保其符合预期的数据结构。

其他组件结合示例

Pydantic 可以与 LangChain 的其他组件如 AgentsMemoryTools 等结合使用。例如,当你使用 Agents 时,你可以定义 Pydantic 模型来表示工具的输入和输出,以确保数据在工具调用和工具响应之间的一致性。

from pydantic import BaseModel
from langchain.agents import Tool# 定义工具输入的 Pydantic 模型
class ToolInput(BaseModel):query: str# 定义工具输出的 Pydantic 模型
class ToolOutput(BaseModel):result: str# 定义简单的工具
def sample_tool(input_data: ToolInput) -> ToolOutput:# 确保输入数据是 ToolInput 类型if not isinstance(input_data, ToolInput):raise ValueError("输入必须是 ToolInput 类型")result = f"你查询的是: {input_data.query}"return ToolOutput(result=result)# 将工具包装为 LangChain 的工具
tool = Tool(name="SampleTool",func=sample_tool,description="一个简单的示例工具,它会重复你的查询。",parameters=ToolInput.schema()
)# 测试工具
input_data = ToolInput(query="测试工具")
output = tool.run(input_data.json())
print(output)
  • 这里我们定义了 ToolInputToolOutput 两个 Pydantic 模型,分别用于表示工具的输入和输出。
  • 我们创建简单的 sample_tool 函数,它接受 ToolInput 类型的输入并返回 ToolOutput 类型的输出。
  • 然后我们使用 Tool 类将这个工具包装起来,并将其作为 LangChain 的工具使用。我们使用 ToolInput.schema() 来提供工具的输入参数的模式信息,方便 LangChain 对输入进行验证。

通过上述示例,你可以看到如何在 LangChain 中使用 Pydantic 来定义清晰的数据结构,并确保数据的一致性和正确性,同时将 Pydantic 与 LangChain 的不同组件进行结合,以增强你的应用程序的稳定性和可维护性。

详细完整示例

from pydantic import BaseModel, ValidationError
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate# 定义 Pydantic 模型用于输入数据的验证
class QueryInput(BaseModel):query: strmax_length: int# 定义 Pydantic 模型用于输出数据的验证
class QueryOutput(BaseModel):answer: str# 定义提示模板
prompt_template = PromptTemplate(input_variables=["query", "max_length"],template="请回答关于 {query} 的问题,回答长度不超过 {max_length} 个字符。"
)# 初始化语言模型
llm = OpenAI(temperature=0.7)# 创建一个 LLMChain
chain = LLMChain(llm=llm, prompt=prompt_template)def process_query(input_data: dict):try:# 使用 Pydantic 模型对输入数据进行验证validated_input = QueryInput(**input_data)except ValidationError as e:print(f"输入数据验证失败: {e}")return None# 运行 LLMChainresult = chain.run(query=validated_input.query, max_length=validated_input.max_length)try:# 使用 Pydantic 模型对输出数据进行验证validated_output = QueryOutput(answer=result)except ValidationError as e:print(f"输出数据验证失败: {e}")return Nonereturn validated_output# 测试数据
test_input = {"query": "什么是人工智能","max_length": 100
}# 调用函数进行处理
output = process_query(test_input)
if output:print(output.answer)

通过这种方式,我们可以在 LangChain 应用中有效地使用 Pydantic 来确保输入和输出数据的一致性和正确性,避免由于数据不匹配或格式错误导致的问题。此外,Pydantic 的 ValidationError 提供了清晰的错误信息,帮助我们快速定位和解决数据验证问题。

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

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

相关文章

物联网网关Web服务器--Boa服务器移植与测试

1、Boa服务器介绍 BOA 服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的、适合于嵌入式系统的单任务的http服务器,源代码开放、性能高。 Boa 嵌入式 web 服务器的官方网站是http://www.boa.org/。 特点 轻量级&#x…

Qt之文件系统操作和读写

Qt creator 6.80 MinGw 64bit 文本文件是指以纯文本格式存储的文件,如cpp和hpp文件。XML文件和JSON文件也是文本文件,只是使用了特定的标记符号定义文本的含义,读取这种文本文件需要先对内容解析再显示。 qt提供了两种读写文本文件的方法。…

学习记录1

[SUCTF 2019]EasyWeb 直接给了源代码&#xff0c;分析一下 <?php function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir "upload/tmp_".md5($_SERVER[REMOTE_ADDR]);if(!file_exists($userdir)){mkdir($userdir);}if…

C语言进阶习题【1】指针和数组(3)——一维指针指向字符数组首元素地址

3.3 一维指针指向数组首元素地址&#xff0c;sizeof和strlen #include<string.h> int main() {char* p "abcdef"; //指针p指向字符串首地址printf("%d\n", sizeof(p));//p是一位指针&#xff0c;求指针的大小&#xff1a;4字节/32位机器 或 8字节…

Linux:磁盘分区

目录 文件 内容 属性 磁盘的物理结构​编辑 磁盘的存储结构 磁盘的逻辑结构 块 磁盘分区 文件 内容 属性 一个文件可以是被打开的文件&#xff0c;也可以是未被打开的文件 被打开的文件就是在内存中&#xff0c;未被打开的文件一般就是放在磁盘上的 为什么要放…

RV1126+FFMPEG推流项目(9)AI和AENC模块绑定,并且开启线程采集

前面两篇已经交代AI和AENC模块的配置&#xff0c;这篇就让这两个模块绑定起来&#xff0c;绑定的原因是&#xff0c;Aenc从Ai模块拿到采集的原始数据进行编码。 使用 RK_MPI_SYS_Bind 把 AI 节点和 AENC 进行绑定&#xff0c;其中 enModId 是模块 ID 号选择的是 RK_ID_AI、s32C…

LabVIEW时域近场天线测试

随着通信技术的飞速发展&#xff0c;特别是在5G及未来通信技术中&#xff0c;天线性能的测试需求日益增加。对于短脉冲天线和宽带天线的时域特性测试&#xff0c;传统的频域测试方法已无法满足其需求。时域测试方法在这些应用中具有明显优势&#xff0c;可以提供更快速和精准的…

AI 大爆发时代,音视频未来路在何方?

AI 大模型突然大火了 回顾2024年&#xff0c;计算机领域最大的变革应该就是大模型进一步火爆了。回顾下大模型的发展历程&#xff1a; 萌芽期&#xff1a;&#xff08;1950-2005&#xff09; 1956年&#xff1a;计算机专家约翰麦卡锡首次提出“人工智能”概念&#xff0c;标志…

【逆境中绽放:万字回顾2024我在挑战中突破自我】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 一、引言二、个人成长与盘点情感与心理成长学习与技能提升其它荣誉 三、年度创作历程回顾创作内容概…

前端小案例——网页井字棋

前言&#xff1a;我们在学习完了HTML、CSS和JavaScript之后&#xff0c;就会想着使用这三个东西去做一些小案例&#xff0c;不过又没有什么好的案例让我们去练手&#xff0c;本篇文章就提供里一个案例——网页井字棋。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可…

FPGA车牌识别

基于FPGA的车牌识别主要包含以下几个步骤&#xff1a;图像采集、颜色空间转换、边缘检测、形态学处理&#xff08;腐蚀和膨胀&#xff09;、特征值提取、模板匹配、结果显示。先用matlab对原理进行仿真&#xff0c;后用vivado和modelsim进行设计和仿真。 一、1.图像采集采用ov…

java使用poi-tl自定义word模板导出

文章目录 概要整体架构流程创建word模板核心代码导出结果 概要 在软件开发领域&#xff0c;自定义Word模板的使用是导出格式化数据的一种常见做法。poi-tl&#xff08;Apache POI Template Language&#xff09;作为一款基于广受认可的Apache POI库的Word模板引擎&#xff0c;…

Java 视频处理:基于 MD5 校验秒传及 ffmpeg 切片合并的实现

本文介绍两种网络技术实现方法。一是 MD5 校验秒传&#xff0c;服务器端用数据库记上传文件 MD5 值及存储路径&#xff0c;Java 代码接收客户端 MD5 值并查询校验&#xff0c;返回状态码。二是用 ffmpeg 切片视频成 m3u8 上传&#xff0c;异步合并文件实现视频按需加载。 1. …

JEL分类号

JEL分类系统&#xff0c;是美国经济学会“经济文献杂志”(《经济文献杂志》)所创立的对经济学文献的主题分类系统&#xff0c;并被现代西方经济学界广泛采用。 该分类方法主要采用开头的一个英文字母与随后的两位阿拉伯数字一起对经济学各部类进行“辞书式”编码分类。 https:…

[Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget

目录 1.多元素控件介绍 2.ListWidget控件 属性 核心方法 核心信号 细节 Demo&#xff1a;编辑日程 3.TableWidget控件 核心方法 QTableWidgetItem核心信号 QTableWidgetItem核心方法 细节 Demo&#xff1a;编辑学生信息 4.TreeWidget控件 核心方法 核心信号…

【王树森搜索引擎技术】概要01:搜索引擎的基本概念

1. 基本名词 query&#xff1a;查询词SUG&#xff1a;搜索建议文档&#xff1a;搜索结果标签/筛选项 文档单列曝光 文档双列曝光 2. 曝光与点击 曝光&#xff1a;用户在搜索结果页上看到文档&#xff0c;就算曝光文档点击&#xff1a;在曝光后&#xff0c;用户点击文档&…

Vulnhub-Tr0ll靶机笔记

Tr0ll靶机笔记 概述 靶机地址&#xff1a;https://www.vulnhub.com/entry/tr0ll-1,100/ 这台靶机比较简单&#xff0c;包含ftp的渗透&#xff0c;pcap流量包的分析&#xff0c;常规的web渗透和系统内核提权。让我们开始吧 Hack it&#xff01; 一、nmap扫描 1、端口扫描 …

uniapp 微信小程序 editor 富文本编辑器

<view class"inp boxsizing"><view class"contentBox"><!-- 富文本编辑器 --><view classwrapper><view classtoolbar tap"format"><view :class"formats.bold ? ql-active : " class"iconfon…

Java定时任务不明原因挂掉(定时任务挂掉)以及建议

在Java企业级开发中&#xff0c;Spring框架的定时任务功能&#xff08;通常通过Scheduled注解实现&#xff09;因其易用性和灵活性而备受青睐。然而&#xff0c;当这些定时任务在生产环境中莫名停止时&#xff0c;往往会让开发者头疼不已。 一、常见原因剖析 1.线程或资源耗尽…

USB 驱动开发 --- Gadget 驱动框架梳理(一)

本文由 Linux 内核文档翻译与总结而来&#xff0c;个人学习笔记仅供参考。 Gadget 框架 在 USB 协议交互过程中&#xff0c;角色定义&#xff1a; the device driver is the master (or “client driver”) Linux 内核中称为 HCD(Host Controller Driver)&#xff0c;负责与 …