35 lines
1.3 KiB
Python
35 lines
1.3 KiB
Python
from fastapi import APIRouter, Depends
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.db.session import get_db
|
|
from app.schemas.chat import ChatRequest, ChatResponse
|
|
from app.schemas.retrieval import RetrievalRequest
|
|
from app.services.retrieval import retrieve
|
|
|
|
router = APIRouter(tags=["chat"])
|
|
|
|
|
|
@router.post("/chat", response_model=ChatResponse)
|
|
def chat(payload: ChatRequest, db: Session = Depends(get_db)) -> ChatResponse:
|
|
"""运行可复核的关键词检索;模型未配置时绝不伪造生成式回答。"""
|
|
result = retrieve(db, RetrievalRequest(query=payload.question, top_k=5))
|
|
if result.status == "no_evidence":
|
|
return ChatResponse(
|
|
answer="未检索到可用的已核验知识依据。请补充更具体的关键词,或由管理员补充并审核资料。",
|
|
status="no_evidence",
|
|
sources=[],
|
|
retrieval_run_id=result.run_id,
|
|
)
|
|
return ChatResponse(
|
|
answer=(
|
|
f"已检索到 {result.total_hits} 条已核验知识依据。当前尚未配置大语言模型,"
|
|
"因此系统仅返回可追溯证据,不生成或改写答案。"
|
|
),
|
|
status="retrieval_only",
|
|
sources=[
|
|
{"title": hit.title, "source_url": hit.source_url}
|
|
for hit in result.results
|
|
],
|
|
retrieval_run_id=result.run_id,
|
|
)
|