qa_router.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # -*- coding: utf-8 -*-
  2. """智能交互融合数字人答疑模块:问题解析 -> 图谱检索 -> 大模型扩充"""
  3. from fastapi import APIRouter, Depends
  4. from pydantic import BaseModel
  5. from sqlalchemy.orm import Session
  6. from backend.database import get_db
  7. from backend.models import QASession
  8. from backend.services.auth import get_current_user_id
  9. from backend.services.knowledge_graph import search_knowledge_graph
  10. from backend.services.llm_service import expand_with_llm
  11. from backend.services.question_parser import analyze_question
  12. router = APIRouter(prefix="/qa", tags=["答疑"])
  13. class AskRequest(BaseModel):
  14. question: str
  15. @router.post("/ask")
  16. def ask(
  17. req: AskRequest,
  18. db: Session = Depends(get_db),
  19. user_id: int = Depends(get_current_user_id),
  20. ):
  21. """智能答疑:问题解析 -> 图谱检索 -> 大模型扩充 -> 返回文本(供 Live2D 数字人+语音合成展示)"""
  22. raw_q = (req.question or "").strip()
  23. if not raw_q:
  24. return {"ok": False, "error": "请输入问题"}
  25. # 1. 问题解析与意图识别
  26. analysis = analyze_question(raw_q)
  27. kg_terms = analysis.get("kg_terms") or [analysis.get("clean_text") or raw_q]
  28. # 2. 基于核心关键词+扩展词进行知识图谱检索,合并去重
  29. triples = []
  30. seen = set()
  31. for term in kg_terms:
  32. results = search_knowledge_graph(term, limit=10)
  33. for r in results:
  34. key = (r.get("subject"), r.get("predicate"), r.get("obj"))
  35. if key in seen:
  36. continue
  37. seen.add(key)
  38. triples.append(r)
  39. # 3. 知识图谱约束 + 大模型扩展回答
  40. answer = expand_with_llm(raw_q, triples, meta=analysis)
  41. # 记录答疑会话
  42. session = QASession(user_id=user_id, question=raw_q, answer=answer)
  43. db.add(session)
  44. db.commit()
  45. return {"ok": True, "answer": answer}