Pydantic数据验证实战指南:让Python应用更健壮与智能

导读:在日益复杂的数据驱动开发环境中,如何高效、安全地处理和验证数据成为每位Python开发者面临的关键挑战。本文全面解析了Pydantic这一革命性数据验证库,展示了它如何通过声明式API和类型提示系统,彻底改变Python数据处理模式。
从基础的字段验证到复杂的嵌套模型,从传统的错误处理到与大语言模型的深度集成,文章层层深入,为读者揭示了Pydantic的核心优势:自动类型转换、详细的错误报告、基于类型提示的验证以及卓越的性能表现。通过与传统验证方法的对比,您将看到Pydantic如何显著减少样板代码,提高代码可读性。
文章还探讨了一个引人注目的前沿应用:Pydantic与LLM的结合如何构建更可靠的AI应用?PydanticOutputParser如何确保非结构化LLM输出转为可靠的结构化数据?
无论您是构建Web API、处理复杂配置还是开发AI应用,这篇指南都将帮助您掌握现代Python数据验证的最佳实践。

引言:数据验证的重要性

在当今数据驱动的软件开发环境中,处理外部数据已成为每个应用程序的核心挑战。无论是来自API的响应、用户输入还是配置文件,数据验证都是确保系统稳定性和安全性的关键环节。正如开发界的经典格言所言:“永远不要相信用户的输入”。

Pydantic作为Python生态系统中的明星库,彻底改变了我们处理数据验证和解析的方式。本文将深入探讨Pydantic的核心功能、实践应用以及与大语言模型(LLM)结合的高级用例,帮助开发者构建更加健壮、可靠的Python应用。

一、Pydantic基础:重新定义Python数据验证

1.1 Pydantic的本质与价值

Pydantic是Python生态系统中的数据验证与解析库,通过声明式的方式定义数据模型,并结合Python的类型提示系统提供强大的验证功能。它的核心价值在于:

  • 自动类型转换:智能地将输入数据转换为预期类型
  • 详细的错误报告:提供清晰的错误信息,便于调试
  • 基于类型提示:利用Python的类型注解系统,代码即文档
  • 高性能:核心验证逻辑用Rust实现,性能卓越

与传统的数据验证方法相比,Pydantic显著减少了样板代码,提高了代码可读性和可维护性。

1.2 传统验证方法的痛点

在Pydantic出现之前,开发者通常需要编写大量的验证代码。以下对比展示了传统方法与Pydantic的差异:

Java传统方式

public class User {private String name;private int age;// 需要手写校验方法public void validate() throws IllegalArgumentException {if (name == null || name.isEmpty()) {throw new IllegalArgumentException("姓名不能为空");}if (age > 150) {throw new IllegalArgumentException("年龄不合法");}}
}

传统Python方式

class User:def __init__(self, name: str, age: int):if not isinstance(name, str):raise TypeError("name必须是字符串")if not isinstance(age, int):raise TypeError("age必须是整数")if age > 150:raise ValueError("年龄必须在0-150之间")self.name = nameself.age = age

Pydantic方式

from pydantic import BaseModel, Fieldclass User(BaseModel):name: str = Field(min_length=1, max_length=50)  # 内置字符串长度验证age: int = Field(ge=0, le=150)  # 数值范围验证

Pydantic方式不仅代码量减少,更重要的是将验证规则与数据定义紧密结合,提高了代码的表达力和可维护性。

1.3 安装与基本使用

Pydantic V2是当前的生产版本,需要Python 3.10+:

pip install pydantic==2.7.4

基本使用示例:

from pydantic import BaseModelclass UserProfile(BaseModel):username: str  # 必须字段age: int = 18  # 带默认值的字段email: str | None = None  # 可选字段# 创建实例
user1 = UserProfile(username="Alice")
print(user1)  # username='Alice' age=18 email=None# 自动类型转换
user2 = UserProfile(username="Bob", age="20")
print(user2.age)  # 20 (int类型)# 验证失败示例
try:UserProfile(username=123)  # 触发验证错误
except ValueError as e:print(e.errors())

二、深入Pydantic字段验证

2.1 Field函数:字段验证的核心

Field函数是Pydantic中为字段添加元数据和验证规则的主要工具。它提供了丰富的参数来定义字段的特性和约束:

from pydantic import BaseModel, Fieldclass Product(BaseModel):name: str = Field(...,  # 表示必填字段title="产品名称",description="产品的显示名称",min_length=2,max_length=50)price: float = Field(...,gt=0,  # 大于0description="产品价格(元)")tags: list[str] = Field(default_factory=list,  # 默认空列表max_length=10  # 最多10个标签)

Field函数的常用参数包括:

参数描述适用类型
default默认值所有类型
title字段标题所有类型
description详细描述所有类型
min_length/max_length长度限制字符串、列表
gt/ge/lt/le数值范围数值类型
regex正则表达式字符串
example示例值所有类型

2.2 必填与可选字段

在Pydantic中,字段的必填性由是否提供默认值决定:

from pydantic import BaseModel, Fieldclass User(BaseModel):# 必填字段 (使用...)name: str = Field(..., title="用户名", min_length=2)# 可选字段 (有默认值)age: int = Field(18, ge=0, le=150)# 可为None的字段email: str | None = Field(None, title="电子邮箱")

...是Python中的特殊对象,在Pydantic中表示"无默认值",即该字段必须由用户提供。

2.3 复杂验证场景

嵌套模型验证

Pydantic支持模型嵌套,实现复杂数据结构的验证:

from pydantic import BaseModel, Fieldclass Address(BaseModel):city: str = Field(..., min_length=1)street: strpostal_code: str = Field(..., pattern=r'^\d{5,6}$')class User(BaseModel):name: str = Field(...)address: Address  # 嵌套模型# 使用嵌套字典初始化
user = User(name="Alice", address={"city": "Shanghai", "street": "Main St", "postal_code": "200001"}
)
混合类型字段

Pydantic支持联合类型,允许字段接受多种类型的值:

from pydantic import BaseModel
from typing import Unionclass Item(BaseModel):# 可以是整数或字符串id: Union[int, str]  # Python 3.10前的写法# 或使用新语法 (Python 3.10+)quantity: int | float  # 可以是整数或浮点数

三、自定义验证器:超越基本约束

3.1 field_validator装饰器

当Field参数无法满足复杂验证需求时,可以使用field_validator装饰器实现自定义验证逻辑:

from pydantic import BaseModel, Field, field_validatorclass User(BaseModel):username: strpassword: str@field_validator("username")def validate_username(cls, value: str) -> str:if len(value) < 3:raise ValueError("用户名至少需要3个字符")if not value.isalnum():raise ValueError("用户名只能包含字母和数字")return value@field_validator("password")def validate_password(cls, value: str) -> str:errors = []if len(value) < 8:errors.append("密码至少需要8个字符")if not any(c.isupper() for c in value):errors.append("密码需要至少一个大写字母")if not any(c.isdigit() for c in value):errors.append("密码需要至少一个数字")if errors:raise ValueError("; ".join(errors))return value

3.2 多字段验证器

验证器可以同时应用于多个字段:

from pydantic import BaseModel, field_validatorclass Product(BaseModel):price: floatcost: float@field_validator("price", "cost")def check_positive(cls, v):if v <= 0:raise ValueError("金额必须大于0")return v

3.3 高级验证技巧

依赖其他字段的验证

在某些情况下,一个字段的验证可能依赖于其他字段的值:

from pydantic import BaseModel, field_validatorclass Discount(BaseModel):original_price: floatdiscounted_price: float@field_validator("discounted_price")def validate_discount(cls, v, info):# 获取原始价格original = info.data.get("original_price")if original is not None and v > original:raise ValueError("折扣价不能高于原价")return v
格式化与清理数据

验证器不仅可以验证数据,还可以格式化或清理数据:

from pydantic import BaseModel, field_validatorclass User(BaseModel):email: str@field_validator("email")def normalize_email(cls, v):# 转换为小写并去除空白return v.lower().strip()

四、Pydantic与大语言模型的结合:高级解析器

4.1 为什么需要Pydantic解析器

在这里插入图片描述

在与大语言模型(LLM)交互时,我们经常需要将其自然语言输出转换为结构化数据。Pydantic解析器提供了以下优势:

  • 结构化输出:将非结构化文本转换为可编程对象
  • 数据验证:自动验证字段类型和约束条件
  • 开发效率:减少手动解析代码
  • 错误处理:内置异常捕获与修复机制

4.2 PydanticOutputParser实战

PydanticOutputParser是LangChain库中的一个组件,用于将LLM输出解析为Pydantic模型实例:

from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import ChatPromptTemplate# 定义Pydantic模型
class UserInfo(BaseModel):name: str = Field(description="用户姓名")age: int = Field(description="用户年龄", gt=0)hobbies: list[str] = Field(description="兴趣爱好列表")# 创建解析器
parser = PydanticOutputParser(pydantic_object=UserInfo)# 定义大模型
model = ChatOpenAI(model_name="qwen-plus",base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",api_key="YOUR_API_KEY",temperature=0.7
)# 构建提示模板
prompt = ChatPromptTemplate.from_template("""
提取用户信息,严格按格式输出:
{format_instructions}用户信息:{input}
""")# 注入格式指令
prompt = prompt.partial(format_instructions=parser.get_format_instructions()
)# 组合处理链
chain = prompt | model | parser# 执行解析
result = chain.invoke({"input": "我的名称是张三,年龄是18岁。兴趣爱好有打篮球、看电影。"
})print(type(result))  # <class '__main__.UserInfo'>
print(result)  # name='张三' age=18 hobbies=['打篮球', '看电影']

4.3 JsonOutputParser与Pydantic结合

JsonOutputParser是另一个常用的解析器,它与Pydantic结合使用可以实现更灵活的解析:

from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser# 定义JSON结构
class SentimentResult(BaseModel):sentiment: strconfidence: floatkeywords: list[str]# 定义大模型
model = ChatOpenAI(model_name="qwen-plus",base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",api_key="YOUR_API_KEY",temperature=0.7
)# 构建处理链
parser = JsonOutputParser(pydantic_object=SentimentResult)prompt = ChatPromptTemplate.from_template("""
分析评论情感:
{input}
按照JSON格式返回:
{format_instructions}
""")chain = prompt | model | parser# 执行分析
result = chain.invoke({"input": "物流很慢,包装破损严重"})
print(result)
# 输出: sentiment='negative' confidence=0.85 keywords=['物流慢', '包装破损']

JsonOutputParser的一个重要优势是支持流式处理,适用于大型响应:

# 流式调用
for chunk in chain.stream({"input": "物流很慢, 包装破损严重"}):print(chunk)  # 逐步输出结果

五、OutputFixingParser:提升解析鲁棒性

5.1 LLM输出修复机制

大语言模型的输出有时会存在格式问题,如JSON语法错误、字段缺失等。OutputFixingParser提供了自动修复这些问题的机制:

from langchain.output_parsers import OutputFixingParser
from langchain_core.output_parsers import PydanticOutputParser
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
from typing import List# 定义模型
class Actor(BaseModel):name: str = Field(description="演员姓名")film_names: List[str] = Field(description="参演电影列表")# 创建基础解析器
parser = PydanticOutputParser(pydantic_object=Actor)# 定义LLM
model = ChatOpenAI(model_name="qwen-plus",base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",api_key="YOUR_API_KEY",temperature=0.7
)# 包装为修复解析器
fixing_parser = OutputFixingParser.from_llm(parser=parser, llm=model)

5.2 修复常见格式错误

以下示例展示了如何修复常见的JSON格式错误:

# 模拟格式错误的输出 (使用单引号而非双引号)
misformatted_output = "{'name': '成龙', 'film_names': ['宝贝计划','十二生肖','警察故事']}"# 直接解析会失败
try:parsed_data = parser.parse(misformatted_output)
except Exception as e:print(f"解析失败: {e}")  # 输出: 解析失败: JSONDecodeError...# 使用修复解析器
fixed_data = fixing_parser.parse(misformatted_output)
print(type(fixed_data))  # <class '__main__.Actor'>
print(fixed_data.model_dump())  # {'name': '成龙', 'film_names': ['宝贝计划', '十二生肖', '警察故事']}

OutputFixingParser的工作原理是:

  1. 检测到错误后,将错误信息与原始输入传递给LLM
  2. LLM根据提示生成符合Pydantic模型的修正结果
  3. 返回修正后的结构化数据

5.3 提高解析成功率的最佳实践

为了最大限度地提高解析成功率,可以采取以下措施:

  1. 明确的格式说明:在提示中提供详细的输出格式指南
  2. 示例驱动:提供正确格式的示例,帮助模型理解期望输出
  3. 降低模型温度:对于结构化输出,使用较低的temperature值(0.0-0.3)
  4. 多次重试:设置适当的重试次数
  5. 错误处理:实现优雅的错误处理机制
# 增强修复解析器配置
enhanced_fixing_parser = OutputFixingParser.from_llm(parser=parser,llm=model,max_retries=2  # 最多重试2次
)# 错误处理示例
try:result = enhanced_fixing_parser.parse(problematic_output)# 成功解析process_valid_data(result)
except Exception as e:# 即使修复也失败handle_parsing_failure(e, problematic_output)

六、实际应用场景与最佳实践

6.1 API请求/响应验证

Pydantic在FastAPI等现代Web框架中广泛用于API请求和响应验证:

from fastapi import FastAPI
from pydantic import BaseModel, Fieldapp = FastAPI()class CreateUserRequest(BaseModel):username: str = Field(..., min_length=3)email: strpassword: str = Field(..., min_length=8)class UserResponse(BaseModel):id: intusername: stremail: str@app.post("/users/", response_model=UserResponse)
async def create_user(user: CreateUserRequest):# FastAPI自动验证请求体# 并将响应序列化为UserResponse格式db_user = await database.create_user(user.username, user.email, user.password)return db_user

6.2 配置管理

Pydantic非常适合处理应用程序配置:

from pydantic import BaseModel, Field
from pydantic_settings import BaseSettings
import osclass DatabaseSettings(BaseModel):host: str = "localhost"port: int = 5432username: strpassword: strdatabase: strclass AppSettings(BaseSettings):app_name: str = "MyApp"debug: bool = Field(default=False, description="启用调试模式")database: DatabaseSettings# 从环境变量加载配置class Config:env_prefix = "MYAPP_"env_nested_delimiter = "__"# 使用
settings = AppSettings(database=DatabaseSettings(username=os.getenv("DB_USER"),password=os.getenv("DB_PASS"),database="myapp")
)

6.3 LLM应用中的结构化输出

在构建LLM应用时,Pydantic可以确保输出符合预期格式:

from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field, field_validator
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import ChatPromptTemplate# 定义产品推荐模型
class ProductRecommendation(BaseModel):product_name: str = Field(description="推荐产品名称")price_range: str = Field(description="价格范围,例如'100-200元'")reasons: list[str] = Field(description="推荐理由列表,至少3条")@field_validator("reasons")def validate_reasons(cls, v):if len(v) < 3:raise ValueError("推荐理由至少需要3条")return v# 创建解析器和链
parser = PydanticOutputParser(pydantic_object=ProductRecommendation)
model = ChatOpenAI(temperature=0.2)prompt = ChatPromptTemplate.from_template("""
根据用户需求推荐一款产品:
{user_needs}{format_instructions}
""")chain = (prompt.partial(format_instructions=parser.get_format_instructions())| model| parser
)# 使用
recommendation = chain.invoke({"user_needs": "我需要一款性价比高的笔记本电脑,主要用于办公和轻度设计"
})print(f"推荐产品: {recommendation.product_name}")
print(f"价格范围: {recommendation.price_range}")
print("推荐理由:")
for i, reason in enumerate(recommendation.reasons, 1):print(f"{i}. {reason}")

6.4 性能优化建议

在处理大量数据时,可以考虑以下性能优化建议:

  1. 使用model_construct:对于已知有效的数据,使用model_construct跳过验证
  2. 延迟验证:使用validate=False创建模型,在需要时手动调用model_validate
  3. 自定义验证器优化:避免在验证器中执行耗时操作
  4. 批量处理:处理大量数据时使用批量验证
# 性能优化示例
from pydantic import BaseModel
import timeclass Item(BaseModel):name: strprice: float# 标准方法
start = time.time()
items1 = [Item(name=f"item{i}", price=i*1.5) for i in range(10000)]
print(f"标准方法: {time.time() - start:.4f}秒")# 优化方法 - 使用model_construct
start = time.time()
items2 = [Item.model_construct(name=f"item{i}", price=i*1.5) for i in range(10000)]
print(f"使用model_construct: {time.time() - start:.4f}秒")

七、Pydantic V2的新特性与迁移指南

7.1 V1与V2的主要区别

Pydantic V2是对库的重大重写,带来了许多改进和API变化:

功能Pydantic V1Pydantic V2
性能纯Python实现核心验证逻辑用Rust实现,性能提升5-50倍
类型系统有限支持更全面的类型支持,包括TypedDict
API原始API更一致的命名约定
验证器@validator@field_validator@model_validator
序列化dict()model_dump()
JSON解析parse_raw()model_validate_json()

7.2 API变更对照表

以下是V1到V2的主要API变更:

Pydantic V1Pydantic V2
fieldsmodel_fields
private_attributespydantic_private
validatorspydantic_validator
construct()model_construct()
copy()model_copy()
dict()model_dump()
json_schema()model_json_schema()
json()model_dump_json()
parse_obj()model_validate()
update_forward_refs()model_rebuild()

7.3 迁移策略

从V1迁移到V2的建议步骤:

  1. 更新依赖:确保Python版本≥3.10,更新pydantic到最新版本
  2. API调整:使用新的方法名称(如model_dump替代dict
  3. 验证器更新:将@validator替换为@field_validator
  4. 类型注解检查:确保类型注解与V2兼容
  5. 测试覆盖:确保充分的测试覆盖,验证迁移后的功能正确性
# Pydantic V1
from pydantic import BaseModel, validatorclass UserV1(BaseModel):name: strage: int@validator('age')def check_age(cls, v):if v < 0:raise ValueError('年龄不能为负数')return vdef to_dict(self):return self.dict()# Pydantic V2
from pydantic import BaseModel, field_validatorclass UserV2(BaseModel):name: strage: int@field_validator('age')def check_age(cls, v):if v < 0:raise ValueError('年龄不能为负数')return vdef to_dict(self):return self.model_dump()

八、结论与展望

Pydantic已经成为Python生态系统中数据验证和解析的标准工具,其声明式API和强大的验证功能使其在Web开发、数据处理和AI应用中不可或缺。

随着AI和大语言模型的兴起,Pydantic与LangChain等框架的结合为构建可靠的AI应用提供了坚实基础。通过PydanticOutputParser和OutputFixingParser等工具,开发者可以轻松地将非结构化的LLM输出转换为结构化数据,实现更复杂的应用场景。

未来,随着Pydantic继续发展,我们可以期待:

  1. 更深入的AI集成:与更多AI框架的无缝集成
  2. 更高的性能:进一步优化Rust核心,提供更快的验证速度
  3. 更丰富的生态系统:更多基于Pydantic的工具和扩展

对于Python开发者来说,掌握Pydantic不仅能提高日常开发效率,还能为构建下一代AI应用打下坚实基础。无论是构建API、处理配置还是与大语言模型交互,Pydantic都是不可或缺的工具。

参考资源

  1. Pydantic官方文档
  2. LangChain文档
  3. FastAPI与Pydantic
  4. Pydantic V2迁移指南

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

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

相关文章

3、ubantu系统 | 通过vscode远程安装并配置anaconda

1、vscode登录 登录后通过pwd可以发现目前位于wangqinag账号下&#xff0c;左侧为属于该账号的文件夹及文件。 通过cd ..可以回到上一级目录&#xff0c;通过ls可以查看当前目录下的文件夹及文件。 2、安装 2.1、下载anaconda 通过wget和curl下载未成功&#xff0c;使用手动…

Python 与 Java 在 Web 开发中的深度对比:从语言特性到生态选型

在 Web 开发领域&#xff0c;Python 和 Java 作为两大主流技术栈&#xff0c;始终是开发者技术选型时的核心考量。本文将从语言本质、框架生态、性能工程、工程实践等多个维度展开深度对比&#xff0c;结合具体技术场景解析两者的适用边界与融合方案&#xff0c;为开发者提供系…

【OpenGL学习】(一)创建窗口

文章目录 【OpenGL学习】&#xff08;一&#xff09;创建窗口 【OpenGL学习】&#xff08;一&#xff09;创建窗口 GLFW OpenGL 本身只是一套图形渲染 API&#xff0c;不提供窗口创建、上下文管理或输入处理的功能。 GLFW 是一个支持创建窗口、处理键盘鼠标输入和管理 OpenGL…

电脑闪屏可能的原因

1. 显示器 / 屏幕故障 屏幕排线接触不良&#xff1a;笔记本电脑屏幕排线&#xff08;屏线&#xff09;松动或磨损&#xff0c;导致信号传输不稳定&#xff0c;常见于频繁开合屏幕的设备。屏幕面板损坏&#xff1a;液晶屏内部灯管老化、背光模块故障或面板本身损坏&#xff0c;…

docker容器知识

一、docker与docker compose区别&#xff1a; 1、docker是创建和管理单个容器的工具&#xff0c;适合简单的应用或服务&#xff1b; 2、docker compose是管理多容器应用的工具&#xff0c;适合复杂的、多服务的应用程序&#xff1b; 3、docker与docker compose对比&#xff…

什么是Rootfs

Rootfs (Root Filesystem) 详解 buildroot工具构建了一个名为"rootfs.tar"的根文件系统压缩包。 什么是rootfs Rootfs&#xff08;Root Filesystem&#xff0c;根文件系统&#xff09;是操作系统启动后挂载的第一个文件系统&#xff0c;它包含系统正常运行所需的基…

关于NLP自然语言处理的简单总结

参考&#xff1a; 什么是自然语言处理&#xff1f;看这篇文章就够了&#xff01; - 知乎 (zhihu.com) 所谓自然语言理解&#xff0c;就是研究如何让机器能够理解我们人类的语言并给出一些回应。 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff0…

Linux下载国外软件镜像的加速方法(以下载Python-3.8.0.tgz为例)

0 前言 使用linux经常会通过国外服务器下载软件镜像&#xff0c;有些软件的下载速度奇慢&#xff0c;本文介绍一种加速国外软件镜像下载速度的方法&#xff0c;需要准备下载工具&#xff1a;迅雷。 1 以下载Python-3.8.0.tgz为例 找到Python官网的Python-3.8.0.tgz镜像下载地…

没有公网ip怎么端口映射外网访问?使用内网穿透可以解决

无公网IP时本地搭建的网络端口服务怎么映射外网远程访问&#xff1f;较为简单通用的方案就是使用nat123内网穿透&#xff0c;下面详细内网映射外网实现教程。​ 一、了解内网公网区别&#xff0c;及无公网IP外网访问方案 内网IP默认只能在同局域网内连接互通&#xff0c;而公…

Word2Vec详解

目录 Word2Vec 一、Word2Vec 模型架构 &#xff08;一&#xff09;Word2Vec 的核心理念 &#xff08;二&#xff09;Word2Vec 的两种架构 &#xff08;三&#xff09;负采样与层次 Softmax &#xff08;四&#xff09;Word2Vec 的优势与局限 二、Word2Vec 预训练及数据集…

ShardingSphere:查询报错:Actual table `数据源名称.表名` is not in table rule configuration

目录 简介异常信息排查原因解决 简介 1、使用ShardingSphere框架&#xff0c;版本为5.2.1 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>5.2.1</version>…

MongoDB聚合查询:从入门到精通

文章目录 前言一、工具一般聚合查询分为四步 二、使用步骤1.MongoDB Compass2.Studio 3T 二、举个栗子总结 前言 Mongo 聚合查询 一般用mongo做数据库,涉及到关联查询情况不多,但是还有些情况要使用到,今天就讲下如何通过工具做关联查询,最终聚合结果,得到最终的查询结果集; …

codeup添加流水线docker自动化部署

在项目根目录下增加Dockerfile文件 # 使用基础镜像 FROM maven:3.8.4-openjdk-17-slim AS build # 设置工作目录 WORKDIR /app # 复制项目源代码 COPY . . # 构建项目 RUN mvn clean package -DskipTests # 验证JAR包是否生成 RUN ls -l target/your-project.jar # 使用合适的…

从 Word2Vec 到 BERT:AI 不止是词向量,更是语言理解

一、前言 在上篇文章中&#xff0c;我们介绍了Word2Vec以及它的作用&#xff0c;总的来说&#xff1a; Word2Vec是我们理解NLP的第一站 Word2Vec将词变成了“向量”—— 终于可以用机器理解词语的相似度 我们获得了例如“国王 - 男人 女人 ≈ 女王” 的类比能力 我们可以将…

镜像管理(2)Dockerfile总结

一、docker镜像构建方法 commoit :使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑 箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根 本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具…

机器学习第十七讲:PCA → 把100维数据压缩成3D视图仍保持主要特征

机器学习第十七讲&#xff1a;PCA → 把100维数据压缩成3D视图仍保持主要特征 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 主…

【Linux庖丁解牛】——进程等待!

1. 进程退出场景 进程退出一般有三种场景&#xff1a; 。代码运行完毕&#xff0c;结果正确 。代码运行完毕&#xff0c;结果错误【比如&#xff0c;我们要对某个文件进行写入&#xff0c;但写入的文件路径出错&#xff0c;代码运行完毕&#xff0c;可是结果出错】 。代码异…

鸿蒙OSUniApp 制作简洁高效的标签云组件#三方框架 #Uniapp

UniApp 制作简洁高效的标签云组件 在移动端应用中&#xff0c;标签云&#xff08;Tag Cloud&#xff09;是一种常见的UI组件&#xff0c;它以视觉化的方式展示关键词或分类&#xff0c;帮助用户快速浏览和选择感兴趣的内容。本文将详细讲解如何在UniApp框架中实现一个简洁高效的…

ubuntu14.04/16.06 安装vscode(实测可以用)

地址&#xff1a;https://code.visualstudio.com/updates/v1_38 选择deb 这个版本还支持ubuntu14.04和16.06 sudo dpkg -i code_1.38.1-1568209190_amd64.deb sudo apt-get install -f安装成功&#xff0c;正常使用

WebRTC技术EasyRTC音视频实时通话驱动智能摄像头迈向多场景应用

一、方案背景​ 在物联网蓬勃发展的当下&#xff0c;智能摄像头广泛应用于安防、家居、工业等领域。但传统智能摄像头存在视频传输延迟高、设备兼容性差、网络波动时传输不稳定等问题&#xff0c;难以满足用户对实时流畅交互视频的需求。EasyRTC凭借低延迟、高可靠、跨平台特性…