业务逻辑
- 获取用户数据库ID,这里有个兼容性的业务逻辑:传入的 userId 是 String 类型的,把这个类型使用 parseLong() 方法,如果能转换就是数字类型,直接根据 userId 查询看这个用户是否存在返回这个数字格式;如果转换失败说明传进来是 userName, 那么就根据用户名查询再返回 userId.
- 生成文本向量,获得 List<Float[]> 集合。判断该集合是否为空,若为空则向量生成失败,仅仅使用文本匹配进行搜索
- 在 ES 中进行 KNN 召回。召回窗口 tok * 30(300个结果),向量中存储的字段名为 "vector",传入向量集合,设置返回结果和候选结果各300个。
- 对于召回对象进行过滤:首先必须和 query 查询关键词匹配,主要是和 textContent 存储中的关键词进行匹配,ES 对于这个所以使用的是 text 类型,添加了中文分词器;然后进行权限的筛选:用户可以访问自己的文档,公开的文档,自己所在组织标签内的文档。
- 第一阶段是进行 KNN 召回,主要是进行语义的匹配,第二部分是进行关键文本匹配,采用 BM25 算法,要出现我要查询的关键字。然后进行加权,最终评分 = 第一阶段 * 20% + 第二阶段 * 100% 。 如果带权限查询失败就会直接使用纯文本关键词检索
- 主要是针对用户输入的问题,先把用户输入的问题转化成高维向量,然后和已经上传存储到 ES 的向量进行语义相似度比较以及文本关键词对比,返回设置数量的文本块对象。这一操作核心目的是大模型是有上下文限制的,所以说我们给他的必须要是是事先已经处理好了的,与用户提问相关的内容。
posted @
2026-02-07 21:01
Huangyien
阅读(
12)
评论()
收藏
举报