Knowledge Hub
个人知识库与问答
把文档管理、混合检索与问答放在一起,支持从回答回到原始文档查看来源。
技术栈
- TypeScript
- NestJS
- React
- LangChain
- Elasticsearch
- PostgreSQL
- Redis
- RabbitMQ
- AI SDK
我的工作
这是我负责前后端的个人项目。前端使用 React 与 Ant Design,后端使用 NestJS;我实现了文档管理、发布后的索引处理、混合检索,以及带来源信息的问答界面。
完成文档管理前后端
实现列表、编辑、发布、下架与文件解析入口,并把个人、团队和公开文档的可见性带进页面与接口。
串起文档到检索的处理链路
发布后通过消息队列触发全文索引、分块和向量索引;问答侧组合关键词召回、向量召回、结果融合与重排。
做可追溯的问答体验
前端呈现会话、流式消息、工具状态和来源;后端组织检索与回答,在没有相关资料时返回明确说明,并为引用保留文档与片段信息。
业务背景
我希望把文档管理和知识库问答放在同一个项目里:文档有草稿、发布和权限,问答也要遵守这些边界。重点不仅是让模型回答,还包括文件怎么入库、哪些内容可以被检索、没有足够资料时怎么办。
核心流程
- 01
文档解析与发布
文件先进入文档管理流程。发布后触发后续索引任务,下架或删除时也有对应的索引删除消息。
- 02
按用户范围检索
问题同时进入关键词与向量召回;候选结果按排名融合,再按配置进行相关性重排与过滤。两条召回路径都携带可见性条件。
- 03
回答并保留来源
检索结果交给回答流程,前端展示消息与引用。用户可以从回答回到对应文档;检索无相关内容时明确说明。
回答里的 [2],从哪段原文来?
技术难点
两种检索的分数不能直接相加
关键词搜索擅长精确词,向量检索擅长语义,但两者的分数并不是同一个尺度。只用其中一种会受问题表达影响,直接加分也不合理。
我并行取两路候选,用 RRF 按排名融合,不直接混加原始分数;随后调用可配置的重排服务,按相关性阈值过滤。查询向量化失败时退回关键词检索,重排未配置或调用失败时保留融合结果。
关键词与语义检索共同提供候选内容,融合后再按相关性筛选;向量化或重排服务不可用时,仍有明确的检索路径。
问答不能绕过文档权限
前端把私有文档隐藏,并不能阻止检索把内容送给模型。文档可见范围发生变化后,旧索引也可能继续保留旧条件。
我把公开、作者本人、所在团队的访问范围统一成检索条件,分别带到关键词查询与向量 KNN 查询中。已发布文档调整可见性时同步索引里的权限字段,不为了权限变化重跑向量化;发布与下架通过消息管线连接索引生命周期。
公开、个人与团队的可见范围直接参与检索,文档发布、下架和权限修改也有对应的索引处理。问答与文档管理共用访问规则。
项目成果
连通文档管理与知识问答
完成文档编辑、发布、文件解析、全文搜索和 RAG 问答。用户可以整理资料,再围绕这些资料发起会话。
把回答连接到原始资料
问答界面同时呈现流式回答和来源引用,保留文档与片段信息,方便继续阅读和核对上下文。
让检索遵守文档可见范围
将公开、个人和团队权限带进关键词与向量检索,并处理发布、下架和权限变更后的索引更新。