知识库检索模块是派聪明这个 RAG 项目的核心功能模块,我们是基于 Elasticsearch 实现的文档混合检索能力,将语义检索和关键词检索结果结合起来,为用户提供更高质量的搜索体验。
该模块依赖于文件上传与解析模块完成的向量化处理,直接使用存储在 Elasticsearch 中的向量数据进行检索。系统目前使用豆包 API 生成文本向量,并将向量存储在 Elasticsearch 中。
模块整体分为两大块:
①、知识库检索
- 混合检索:结合语义检索和关键词检索结果,按权重排序返回搜索结果
- 支持指定返回结果数量:通过 topK 参数控制结果数量
②、权限控制
-
基于组织标签的数据权限:确保用户只能访问有权限的文档
-
支持层级权限验证:父标签权限自动包含所有子标签文档的访问权限
-
默认标签全局可访问:DEFAULT 标签资源对所有用户开放
用到的技术栈包括:
| 功能模块 | 技术选型 | 备注 |
|---|---|---|
| 全文检索 | Elasticsearch | 第一阶段,使用IK分词器 |
| 向量检索 | Elasticsearch | 第一阶段,使用dense_vector类型 |
| 向量检索 | FAISS | 第二阶段,提供更高性能的向量检索 |
| 缓存 | Redis | 缓存热点查询结果 |
| 数据库 | MySQL | 存储元数据 |
| 对象存储 | MinIO | 存储文档文件 |
整体的流程是这样的:
当用户发起一个查询请求时,系统首先会接收用户输入的查询文本,以及一些附带的检索参数,以及需要返回的结果数量(topK)。在这一步,系统会先对这些参数做一轮合法性校验,确保格式正确、数据合理。
接着,系统会把用户的查询文本交给豆包提供的向量化 API,通过这个接口把自然语言的文本转换成可以用于向量检索的向量表示。这是我们后续进行语义匹配的基础。
拿到查询向量后,系统会执行一套混合检索流程,也就是结合语义匹配和关键词匹配。
在这一步,系统会构建一个 Elasticsearch 的查询语句,这个查询不仅包含了向量相似度的计算,还会结合全文搜索的匹配结果。同时,我们还会在查询中加入权限相关的过滤条件,确保用户只能看到自己“有权访问”的内容。
具体来说,权限控制主要分为三条规则:
1. 用户可以访问自己上传的文档;
2. 用户可以访问被标记为公开的文档;
3. 如果某些文档被打上了特定的权限标签(比如部门或层级权限),只要用户拥有这些标签,也可以访问这些文档。
回复