一个面向企业知识问答的通用 RAG Agent。它不在后端维护固定意图、槽位、实体别名或行业关键词;语义理解交给模型,后端只负责通用的输入边界、候选 ID、证据来源、数字一致性和错误处理。
用户问题与聊天历史
-> 分析问题(上下文处理 + AI问题改写)
-> 知识检索(混合检索 + RRF粗排 + AI精排 + 证据决策)
-> 组织答案(证据校验 + 未覆盖/追问分支 + 答案和图表 + 回答校验)
-> 返回已验证回答
问答流程由三个高内聚 Application Service 实现,LangGraph 只负责编排三个稳定大节点。每个大节点把内部小节点作为受控执行详情返回前端。知识上传、删除和动态提示由独立的 KnowledgeManagementService 负责。
- 前端:React、TypeScript、Vite
- API:FastAPI、Pydantic
- 编排:LangGraph
- 语言模型:DeepSeek Chat Completions
- 权威知识库:MySQL
- 全文索引:Elasticsearch BM25
- 向量索引:PostgreSQL + pgvector
- Embedding:本地 Qwen3-Embedding-0.6B
- 文档解析:openpyxl、python-docx
knowledge_documents:上传来源和文档级元数据knowledge_chunks:可检索原文知识块knowledge_assets:图片标题、路径、OCR/说明元数据knowledge_facts:模型从原文抽取并经后端原文校验的可选通用事实knowledge_vector_index:chunk、fact、asset 的语义向量索引,不是事实来源- Elasticsearch
enterprise_knowledge:可从MySQL重建的BM25全文索引 knowledge/uploads:Word、Excel 原文件knowledge/assets:图片原文件
Elasticsearch与pgvector独立召回,混合检索阶段严格使用配置的Top-K,并保留原始 BM25分数、向量余弦相似度和各自排名。查询过程不再全量同步索引;上传和删除知识时 负责更新索引。应用层粗排序只读取排名执行RRF,不直接相加两种量纲不同的原始分数。 所有向量Top-K都会进入RRF,不再根据相似度阈值提前删除知识。
RRF融合分只决定候选先后,不代表真实相关度,也不再作为删除门槛。同一父知识的文档 和事实重复表示在粗排阶段合并,最多30条进入现有DeepSeek精排;精排逻辑本次未调整。
前端执行路径按文档、事实、图片三类证据展示混合检索结果。同一知识的全文排名/BM25 分数与向量排名/相似度并排显示;独立 Top-K 中未召回的一侧明确显示“未召回”。
.\.venv\Scripts\python.exe -m uvicorn app.main:app --app-dir backend --host 127.0.0.1 --port 8000另开一个 PowerShell:
cd frontend
npm run dev访问:
- Agent:
http://127.0.0.1:5173/ - 独立架构查看器:
http://127.0.0.1:5173/architecture/ - API 健康检查:
http://127.0.0.1:8000/api/health
.\.venv\Scripts\python.exe -m pytest -q
cd frontend
npm run build项目公开仓库不包含个人、客户或版权受限的知识文件。接入自己的知识库后, 可以在本地另行配置真实依赖回归场景,再验证多轮问答、图表续问和知识库外拒答。
- 本项目使用 MIT License,详见 LICENSE。
backend/.env、上传文档、图片、日志、虚拟环境和本地评测数据不会进入仓库。- 使用前请复制
backend/.env.example为backend/.env,再填写自己的模型和数据库配置。 - 不要把企业内部知识、客户资料或任何密钥提交到公开仓库。