Pydantic 数据校验
Written: 2026.061. 为什么需要这讲
Pydantic 在本项目中被五处关键位置使用,但主讲义从未系统讲解它是什么、怎么工作:| 使用位置 | 作用 | 代码 |
|---|---|---|
| 全局配置 | 从 .env 加载并校验配置 | Settings(BaseSettings) |
| API 请求校验 | 自动校验 JSON 请求体的字段和类型 | RetrievalDebugRequest(BaseModel) |
| LLM 结构化输出 | 限制 LLM 只返回枚举字段 | IntentLLMDecision(BaseModel) |
| 检索计划 | 序列化检索参数供诊断使用 | RetrievalPlan dataclass |
| 数据隔离 | 封装多租户参数 | DataScope dataclass |
2. Pydantic 是什么
Pydantic 是 Python 最流行的数据校验库。它的核心思想:用 Python 类型注解定义数据结构,运行时自动校验类型。3. BaseModel 核心能力
3.1 基础类型校验
query是str✅tenant_id是int但期望str❌ → 返回 422 错误,附带清晰描述
3.2 Field 约束
| 约束 | 说明 |
|---|---|
min_length / max_length | 字符串长度范围 |
ge / le / gt / lt | 数值范围(≥/≤/>/<) |
pattern | 正则表达式匹配 |
description | OpenAPI 文档描述 |
examples | OpenAPI 示例值 |
3.3 嵌套模型
4. BaseSettings — 环境变量管理
这是 Pydantic 的一个特殊子类,专门用于管理配置:Settings 从进程环境变量和项目根目录 .env 读取;Docker Compose 部署时,Compose 读取 .env.compose 并注入到 API 容器的进程环境变量里。因此不要把 .env.compose 复制成 .env 使用,也不要把 .env 里的 localhost 配置拿去跑 API 容器。
本项目中的 Settings 实例被 @lru_cache 缓存为全局单例:
5. with_structured_output — LLM 输出约束
这是本项目中 Pydantic 最高级的用法:让 LLM 按指定结构返回结果。{"intent": "INVALID_TYPE"},Pydantic 会报错。
6. 在本项目中的使用速查
| Pydantic 类 | 定义位置 | 作用 |
|---|---|---|
Settings(BaseSettings) | qa_core/config/settings.py | 读取运行时配置:本机 .env 或 Compose 注入的环境变量 |
RetrievalDebugRequest(BaseModel) | qa_core/schemas.py | /api/retrieval/debug 请求体校验 |
FeedbackRequest(BaseModel) | qa_core/schemas.py | 反馈请求校验 |
IntentLLMDecision(BaseModel) | qa_core/intent/classifier.py | LLM 意图输出约束 |
7. 小结
- BaseModel = 类型注解 + 自动校验,替代手写 if/else 校验
- Field = 为字段附加约束(长度、范围、正则)
- BaseSettings = 自动从环境变量和本机
.env加载配置;Docker Compose 模式由.env.compose注入环境变量 - with_structured_output = 用 Pydantic Schema 约束 LLM 输出格式

