使用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(字符串类型)和details(OrderDetail对象列表)。通过传入符合结构要求的字典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 的其他组件如 Agents、Memory 和 Tools 等结合使用。例如,当你使用 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)
- 这里我们定义了
ToolInput和ToolOutput两个 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 提供了清晰的错误信息,帮助我们快速定位和解决数据验证问题。
相关文章:
使用Pydantic驾驭大模型
本文介绍Pydantic 库,首先介绍其概念及优势,然后通过基本示例展示如何进行数据验证。后面通过多个示例解释如何在LangChain中通过Pydantic进行数据验证,保证与大模型进行交互过程中数据准确性,并显示清晰的数验证错误信息。 Pydan…...
【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发之常见布局
目录 1 -> 自适应布局 1.1 -> 线性布局 1.1.1 -> 线性布局的排列 1.1.2 -> 自适应拉伸 1.1.3 -> 自适应缩放 1.1.4 -> 定位能力 1.1.5 -> 自适应延伸 1.2 -> 层叠布局 1.2.1 -> 对齐方式 1.2.2 -> Z序控制 1.3 -> 弹性布局 1.3.1…...
【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界
目录 前言 一、Python—— 网络爬虫的绝佳拍档 二、网络爬虫基础:揭开神秘面纱 (一)工作原理:步步为营的数据狩猎 (二)分类:各显神通的爬虫家族 三、Python 网络爬虫核心库深度剖析 &…...
队列的基本用法
以下是关于 C 语言中队列的详细知识,包括队列的生成、相关函数使用以及其他重要概念: 一、队列的概念 队列是一种线性数据结构,它遵循先进先出(First In First Out,FIFO)的原则,就像日常生活中…...
网络安全VS数据安全
关于网络安全和数据安全,我们常听到如下两种不同声音: 观点一:网络安全是数据安全的基础,把当年做网络安全的那一套用数据安全再做一遍。 观点二:数据安全如今普遍以为是网络安全的延伸,实际情况是忽略数据…...
Linux(NFS服务)
赛题拓扑: 题目: NFS: 共享/webdata/目录。用于存储AppSrv主机的WEB数据。仅允许AppSrv主机访问该共享。 [rootstoragesrv ~]# yum install nfs-utils -y [rootstoragesrv ~]# mkdir /webdata [rootstoragesrv ~]# chmod -R ow /webdata …...
python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)边缘检测
OpenCV中边缘检测四种常用算子: (1)Sobel算子 Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度,并将梯度的大小作为边缘的强度。它使用两个3x3的卷积核,分别用于计…...
SSM课设-学生管理系统
【课设者】SSM课设-学生管理系统 技术栈: 后端: SpringSpringMVCMybatisMySQLJSP 前端: HtmlCssJavaScriptEasyUIAjax 功能: 学生端: 登陆 学生信息管理 个人信息管理 老师端: 多了教师信息管理 管理员端: 多了班级信息管理 多了年级信息管理 多了系统用户管理...
【Pytorch实用教程】TCN(Temporal Convolutional Network,时序卷积网络)简介
文章目录 TCN的基本特点TCN的优点TCN的应用场景典型的TCN架构总结TCN(Temporal Convolutional Network,时序卷积网络)是一种用于处理序列数据的深度学习模型,尤其适用于时间序列预测、语音识别、自然语言处理等任务。它利用卷积神经网络(CNN)来处理时序数据,相比于传统的…...
网络安全 | 什么是正向代理和反向代理?
关注:CodingTechWork 引言 在现代网络架构中,代理服务器扮演着重要的角色。它们在客户端和服务器之间充当中介,帮助管理、保护和优化数据流。根据代理的工作方向和用途,代理服务器可分为正向代理和反向代理。本文将深入探讨这两种…...
3 前端(中):JavaScript
文章目录 前言:JavaScript简介一、ECMAscript(JavaScript基本语法)1 JavaScript与html结合方式(快速入门)2 基本知识(1)JavaScript注释(和Java注释一样)(2&am…...
VIT论文阅读与理解
transform网络结构 vision transform网络结构 图1:模型概述。我们将图像分割成固定大小的补丁,线性嵌入每个补丁,添加位置嵌入,并将结果向量序列馈送到标准Transformer编码器。为了执行分类,我们使用标准方法向序列中添…...
JavaScript笔记APIs篇01——DOM获取与属性操作
黑马程序员视频地址:黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p78https://www.bilibili.com/video/BV1Y84y1L7Nn?…...
SQL表间关联查询详解
简介 本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(left join)、右连接(right join)、全连接(full join)、内连接(inner join)、交叉连接&…...
select函数
系统调用 select()可用于执行 I/O 多路复用操作,调用 select()会一直阻塞,直到某一个或多个文件描述符成为就绪态(可以读或写)。其函数原型如下所示: #include <sys/select.h> int select(int nfds, fd_set *re…...
建造者模式(或者称为生成器(构建器)模式)
一、什么是建造者模式? 将复杂对象的构建与表示进行分离,使得统一的构建过程,可以创建出不同的对象表现模式 就是将复杂对象里面的成员变量,设置不同的值,使得生成出来的对象拥有不同的属性值; 二、特点…...
【深度学习】Huber Loss详解
文章目录 1. Huber Loss 原理详解2. Pytorch 代码详解3.与 MSELoss、MAELoss 区别及各自优缺点3.1 MSELoss 均方误差损失3.2 MAELoss 平均绝对误差损失3.3 Huber Loss 4. 总结4.1 优化平滑4.2 梯度较好4.3 为什么说 MSE 是平滑的 1. Huber Loss 原理详解 Huber Loss 是一种结合…...
A5.Springboot-LLama3.2服务自动化构建(二)——Jenkins流水线构建配置初始化设置
下面我们接着上一篇文章《A4.Springboot-LLama3.2服务自动化构建(一)——构建docker镜像配置》继续往下分析,在自动化流水线构建过程当中的相关初始化设置和脚本编写。 一、首先需要先安装Jenkins 主部分请参考我前面写的一篇文章《Jenkins持续集成与交付安装配置》 二、…...
李宏毅机器学习HW1: COVID-19 Cases Prediction
Kaggle数据集和提交链接 特征选择(主要修改地方) 在sample code的基础上主要修改了Select_feat选择特征函数。 首先,因为数据集中的第一列是id,先在raw_x_train,raw_x_valid,raw_x_test中都去掉这一列。其…...
MySQL下载安装DataGrip可视化工具
目录 WinMySQL下载安装步骤MySQL配置添加环境变量 Mac下载安装配置环境变量 DataGrip可视化工具以Win为例了。Mac忘记截图了。步骤都一样 Win MySQL下载 官网: https://www.mysql.com/ 直接进下载界面: https://downloads.mysql.com/archives/installe…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
