| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- # -*- 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}
|