Files
QMDSearch/app/models/document.py
T
kplam dce9e31bde feat: 新增多格式文件上传入库与认证体系
- 新增 JWT 认证模块,支持登录/注册/用户管理
- 新增文件上传接口,支持 .txt/.md/.html/.pdf/.docx 等格式解析入库
- 新增检索结果 AI 总结功能
- 新增文本去重缓存机制
- 新增全局认证夹具简化测试
- 新增配置项与环境变量支持
- 完善文档与测试覆盖
2026-07-30 10:30:15 +08:00

53 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""文档和总结相关的数据模型"""
from enum import StrEnum
from pydantic import BaseModel, Field
class SummaryLevel(StrEnum):
"""总结层级"""
L3 = "L3" # 完整三级:总结 → 大纲 → 内容大纲
L2_HALF = "L2.5" # 2.5 级回退:总结 → 内容大纲(跳过大纲)
class DocumentSummary(BaseModel):
"""文档三级总结结果"""
l1_summary: str = Field(description="L1 总结:一句话高度概括")
l2_outline: str | None = Field(default=None, description="L2 大纲:主要章节和关键主题")
l3_content_outline: str = Field(description="L3/L2.5 内容大纲:详细内容摘要")
level: SummaryLevel = Field(description="实际使用的总结层级")
class DocumentInput(BaseModel):
"""文档入库输入"""
text: str = Field(description="文档纯文本内容")
title: str = Field(default="", description="文档标题")
source: str = Field(default="", description="来源标识(文件路径/URL等)")
metadata: dict[str, str] = Field(default_factory=dict, description="附加元数据")
class ChunkModel(BaseModel):
"""文档分块结果"""
doc_id: str = Field(description="所属文档 ID")
chunk_index: int = Field(description="chunk 在文档内的序号")
text: str = Field(description="chunk 文本内容")
section_path: str = Field(default="", description="chunk 所在的章节路径")
class IngestionResult(BaseModel):
"""文档入库结果"""
document_id: str = Field(description="写入后的文档 ID")
summary: DocumentSummary = Field(description="三级总结结果")
category: str = Field(description="分类标签(主类目)")
collection: str = Field(description="写入的 Qdrant 集合名")
chunks_count: int = Field(default=0, description="写入的 chunk 数量")
tags: list[str] = Field(default_factory=list, description="附加分类标签")
category_confidence: float = Field(default=0.0, description="主类目分类置信度")
deduplicated: bool = Field(default=False, description="是否命中去重复用旧文档(True 时 document_id 为既有文档 ID")