# -*- coding: utf-8 -*- """智能交互融合数字人答疑模块:问题解析 -> 图谱检索 -> 大模型扩充""" from fastapi import APIRouter, Depends from pydantic import BaseModel from sqlalchemy.orm import Session from backend.database import get_db from backend.models import QASession from backend.services.auth import get_current_user_id from backend.services.knowledge_graph import search_knowledge_graph from backend.services.llm_service import expand_with_llm from backend.services.question_parser import analyze_question router = APIRouter(prefix="/qa", tags=["答疑"]) class AskRequest(BaseModel): question: str @router.post("/ask") def ask( req: AskRequest, db: Session = Depends(get_db), user_id: int = Depends(get_current_user_id), ): """智能答疑:问题解析 -> 图谱检索 -> 大模型扩充 -> 返回文本(供 Live2D 数字人+语音合成展示)""" raw_q = (req.question or "").strip() if not raw_q: return {"ok": False, "error": "请输入问题"} # 1. 问题解析与意图识别 analysis = analyze_question(raw_q) kg_terms = analysis.get("kg_terms") or [analysis.get("clean_text") or raw_q] # 2. 基于核心关键词+扩展词进行知识图谱检索,合并去重 triples = [] seen = set() for term in kg_terms: results = search_knowledge_graph(term, limit=10) for r in results: key = (r.get("subject"), r.get("predicate"), r.get("obj")) if key in seen: continue seen.add(key) triples.append(r) # 3. 知识图谱约束 + 大模型扩展回答 answer = expand_with_llm(raw_q, triples, meta=analysis) # 记录答疑会话 session = QASession(user_id=user_id, question=raw_q, answer=answer) db.add(session) db.commit() return {"ok": True, "answer": answer}