Files
law-kb/app/models.py
T
freedak 641e33b834 feat: QYLAW 法律法规知识库
- 语义检索(FAISS + embedding)+ 精确查找(法规名+条号)
- RAG 问答(SSE 流式,支持 thinking 折叠显示)
- 法规浏览(原文阅读)
- 历史记录(检索+对话持久化到 SQLite)
- 设置页(系统提示词/模板/LLM 参数可配置)
- 检索质量评估脚本

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-07 14:55:25 +08:00

108 lines
3.0 KiB
Python

"""Pydantic 请求/响应模型"""
from typing import Optional, List
from pydantic import BaseModel, Field
# ===== 统一响应壳 =====
class ApiResponse(BaseModel):
"""统一 API 响应壳"""
code: int = 0
message: str = "ok"
data: Optional[dict] = None
trace_id: Optional[str] = None
# ===== 检索 =====
class SearchRequest(BaseModel):
"""检索请求"""
query: str = Field(..., min_length=1, max_length=1000, description="查询文本")
category: Optional[str] = Field(None, description="法规类别过滤")
province: Optional[str] = Field(None, description="省份过滤(仅地方性法规)")
city: Optional[str] = Field(None, description="市级过滤(仅地方性法规)")
top_k: int = Field(20, ge=1, le=100, description="返回数量")
page: int = Field(1, ge=1, description="页码")
page_size: int = Field(20, ge=1, le=100, description="每页数量")
class SearchResultItem(BaseModel):
"""单条检索结果"""
law_id: int
law_name: str
category: str
chapter: Optional[str] = None
clause_no: Optional[str] = None
content: str
score: float
file_path: str
province: Optional[str] = None
city: Optional[str] = None
publish_date: Optional[str] = None
class SearchResponseData(BaseModel):
"""检索响应数据"""
results: List[SearchResultItem]
total: int
page: int
page_size: int
# ===== RAG 问答 =====
class RagRequest(BaseModel):
"""RAG 问答请求"""
question: str = Field(..., min_length=1, max_length=1000, description="用户问题")
template: str = Field("simple", description="prompt 模板: simple/professional/compare")
category: Optional[str] = Field(None, description="法规类别过滤")
province: Optional[str] = Field(None, description="省份过滤")
system_prompt: Optional[str] = Field(None, description="自定义系统提示词,覆盖默认")
template_text: Optional[str] = Field(None, description="自定义模板正文,覆盖预设模板。需含 {context}{question} 占位符")
class CitationItem(BaseModel):
"""RAG 引用条文"""
law_id: int
law_name: str
category: str
chapter: Optional[str] = None
clause_no: Optional[str] = None
content: str
score: float
file_path: str
province: Optional[str] = None
# ===== 法规浏览 =====
class LawListItem(BaseModel):
"""法规列表项"""
law_id: int
name: str
category: str
publish_date: Optional[str] = None
province: Optional[str] = None
city: Optional[str] = None
clause_count: int
file_path: str
class LawDetail(BaseModel):
"""法规详情"""
law_id: int
name: str
category: str
publish_date: Optional[str] = None
province: Optional[str] = None
city: Optional[str] = None
content: str
file_path: str
clauses: List[dict] = []
# ===== 统计 =====
class StatsResponse(BaseModel):
"""索引统计"""
total_laws: int
total_clauses: int
category_stats: dict
index_built_at: Optional[str] = None
faiss_dim: Optional[int] = None