"""文档和总结相关的数据模型""" 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="主类目分类置信度")