项目定位
面向企业**私有化部署**的 AI 知识库问答系统(RAG):把企业内部的制度文档、产品手册、技术资料、项目档案统一喂给 AI,员工用自然语言提问,即可获得**带原文出处引用**的可靠答案,替代传统"全文检索 + 人肉翻文档"的低效方式。产品形态为单客户独立部署(非 SaaS),企业内部员工共用一套账号,开箱即用。
核心功能
- 文档管理
单文档 / 整个文件夹上传(保留相对目录结构);按扩展名白名单 + 文件头(magic bytes)双重校验真实格式,伪装扩展名直接拒绝入库。
- 流式问答
SSE 逐字输出回答,右侧实时展示来源片段(可点击预览定位);回答结束后给出 2~3 条相关追问建议,并返回检索/生成耗时等性能指标。
- 混合检索
向量语义召回 + pg_trgm 关键词召回 + RRF 排名融合,兼顾"同义问法"与"碎片简称"两类查询。
- 语义缓存
新问题与近期缓存做余弦相似度比对(≥0.95 直接复用答案,跳过检索与模型调用);知识库任何变更(上传/删除/重建索引)自动失效该用户缓存,杜绝命中过期答案。
- 多轮对话
结合历史对话把"它的优缺点呢"这类指代问句自动改写为独立查询,再去检索。
- 3D知识图谱
文档关系 / 实体关系双模式 three.js 力导向聚类可视化:相干文档自动聚簇、连线粗细颜色映射关联度、UnrealBloom 辉光特效,一眼看清知识库的主题分布。
- RAG 评估看板
维护评估集与评估运行,对检索/回答质量做回归对比,支撑"改了 Prompt 或检索策略后答案有没有变差"的量化验收。
- 用量与成本
全链路记录模型调用事件与 token 成本(usage-event),后台查看调用量与花费统计。
- 文档共享
生成授权分享链接,对外提供受控的文档访问。
- 安全
登录态存 HttpOnly Cookie(前端脚本读不到);知识库文档一律走授权下载接口,不暴露静态直链;模型密钥加密存储。
典型业务价值
- 新人培训 / 客服售后场景下,问答响应从"翻文档 10 分钟"缩短到"开口即答、带来源";
- 私有化部署保证企业资料不出内网;
- 语义缓存 + 限额部署让中小团队的模型调用成本可控可统计。
整体架构(pnpm monorepo 三端分离)
apps/
├── web/ Vue3 + Vite + Element Plus + Pinia:问答工作台、文档管理、图谱、评估、统计
├── server/ NestJS + TypeORM + pgvector:对外 API 网关、鉴权、SSE 转发、文档授权下载、迁移管理
├── ai-service/ NestJS + LangGraph:文档解析分块、向量化、RAG 问答编排、实体三元组抽取
packages/
└── shared/ 前后端共享的纯类型契约(RetrievedChunk / AskResult / AnswerStats),编译期擦除、零运行时依赖
RAG 检索链路(7 步,`apps/ai-service/src/ai/ask.service.ts`)
1. 语义缓存查重:新问题与近期缓存做余弦相似度,≥0.95 直接复用上次结果(`AskResult.cached=true` 前端提示);
2. 多轮记忆增强(`contextualizeQuery`):把含指代的问题改写为独立查询,失败回退原问题;
3. 短查询改写:≤4 字符的碎片输入(如"彭")先由 LLM 扩写(如"彭基良"),避免语义噪声进入向量召回;
4. 多路召回:向量路(pgvector cosine,TOP_K=8,过滤相似度 ≤0.3 噪声)+ 关键词路(pg_trgm `ILIKE`,原始/记忆/改写三路各取 8 条,补齐"认不出字"的短板);两路均排除已删除文档的孤儿分块;
5. RRF 融合:按排名加权融合两路结果(`1/(k+rank+1)`,k=60),不跨路比分数;
6. LLM 重排:候选片段各取前 1200 字符交模型判定相关性(留 5 条),全部不相关时保留最优候选兜底;
7. 分数校准:`relativeSimilarity` 按本次最强匹配归一化(最强固定 0.9),前端展示"相关度 xx%(原始 xx%)"。
关键实现点
- LangGraph 编排:检索 → 改写 → 召回 → 融合 → 重排 → 生成封装为 StateGraph,SSE 事件流(`sources`/`token`/`done`/`error`)经 server 透传到前端;
- 实体知识图谱:文档索引完成后 fire-and-forget 调用 LLM 从文本抽取"实体A—关系—实体B"三元组(类型白名单:人物/组织/地点/概念/项目/产品/事件,单文件抽样 6000 字、三元组上限 24 防爆),先按文件删后插支持重复索引;抽取全程容错。