from pydantic import BaseModel, Field class LearningAssistantChatRequest(BaseModel): """学习助手请求:普通用户面向机构知识库提出医学学习问题。""" question: str = Field(..., min_length=2, max_length=1000, description="用户问题") top_k: int | None = Field(default=None, ge=1, le=10, description="最终返回给 LLM 的来源片段数") score_threshold: float | None = Field(default=None, ge=0, le=1, description="向量相似度过滤阈值") class LearningAssistantSource(BaseModel): """学习助手来源:记录 PDF 文档、页码和引用片段。""" document_id: int document_title: str | None = None file_name: str page_start: int page_end: int chunk_uid: str score: float quote: str class LearningAssistantChatResponse(BaseModel): """学习助手回答:返回答案、知识库命中状态、循证来源和耗时。""" answer: str retrieval_hit: bool sources: list[LearningAssistantSource] = Field(default_factory=list) retrieval_error: str | None = None model: str | None = None embedding_latency_ms: int | None = None search_latency_ms: int | None = None llm_latency_ms: int | None = None total_latency_ms: int | None = None