杠精派
派聪明
0/512

热门评论

未来可期 2026年03月12日 22:53
引用原文:关键词检索部分用的是 BM25
@派聪明,向量检索和关键词检索是同时进行的吗?topK是什么时候用到的
点赞
回复5 取消回复
派聪明 2026年03月12日 22:55
向量检索和关键词检索不是同时进行的,而是采用"混合检索"的两阶段策略: 1. **第一阶段(召回)**:先使用向量检索(如KNN)从知识库中召回一个较大的候选集,通常是topK的30倍左右。这一阶段主要看语义相似度,确保不漏掉任何可能相关的文档。 2. **第二阶段(重排)**:对召回的候选集使用BM25进行关键词匹配和重排序。这一阶段确保结果既语义相关又包含用户查询的关键词。 **topK参数的使用时机**: - 在第一阶段,系统会召回比最终topK多得多的候选结果(如topK的30倍) - 在第二阶段,系统会对这些候选结果进行BM25重排序 - 最终,根据向量得分和BM25得分的加权综合得分,选出前topK条结果返回给用户 这种"先召回后重排"的方式结合了向量检索的广度(能找到语义相关但关键词不完全匹配的文档)和关键词检索的精度(确保结果包含用户查询的关键词),提高了检索的准确性和全面性。
点赞
回复 取消回复
展开剩余 4 条回复

109 条评论

zsxq_01711 2026年08月07日 14:30
引用原文:Elasticsearch 的 rescore 机制
@派聪明 解释一下
点赞
回复1 取消回复
派聪明 2026年08月07日 14:30
小派正在努力回答中, 耐心等待一下吧...
点赞
回复 取消回复
zsxq_01711 2026年08月07日 14:26
引用原文:Elasticsearch 的 rescore 机制
@派聪明 解释一下
点赞
回复1 取消回复
派聪明 2026年08月07日 14:26
小派正在努力回答中, 耐心等待一下吧...
点赞
回复 取消回复
安和 2026年08月05日 20:45
引用原文:索引设计是否合理,比如有没有设置太多字段参与检索?
@派聪明这里的索引设计是指? 和mysql里的不一样吧?具体说一下这里的索引是什么,和怎么参与检索的
点赞
回复1 取消回复
派聪明 2026年08月05日 20:45
小派正在努力回答中, 耐心等待一下吧...
点赞
回复 取消回复
saturn 2026年08月02日 18:34
代码中knn好像没加filter吧,怎么实现权限控制的@派聪明
点赞
回复1 取消回复
派聪明 2026年08月02日 18:34
代码中knn好像没加filter吧,怎么实现权限控制的 当前模型还在开发当中,请右上角下拉框切换到其他模型
点赞
回复 取消回复
Minus one 2026年07月24日 11:53
引用原文:召回率
@派聪明 派聪明采用了什么措施来提升召回率
点赞
回复1 取消回复
派聪明 2026年07月24日 11:53
根据提供的参考资料,派聪明主要通过以下“混合检索”策略来有效提升和保障搜索的召回率: 1. **语义检索(KNN)做大范围初筛** 系统不仅依赖字面匹配,还会将查询转化为向量,通过 KNN算法在向量空间中寻找语义相近的文档。这种方式打破了关键词的限制,即使文档中没有出现用户输入的具体词汇,只要意思相近就能被**召回**。 2. **“召回+重排”的两阶段机制** 为了保证高召回率,系统在第一阶段通过向量检索故意放大召回范围。例如,当最终目标(topK)是返回10条结果时,系统会先放宽限制,召回目标数量的 **30倍**(即300条)作为候选集。这一阶段的核心目标是“求全”,不放过任何潜在的相关结果。 3. **融合 BM25 关键词匹配补充精准度** 在放宽范围获取大量候选集后,系统进入第二阶段,使用 Elasticsearch 的 rescore机制对结果进行 BM25 关键词重排序。这一步“求准”,把语义相关且关键词匹配度高的文档排到最前面。最终再从这批高质量候选集中截取 topK 条返回。
点赞
回复 取消回复
Minus one 2026年07月24日 11:52
@派聪明 派聪明采用了什么措施来提升召回率
点赞
回复1 取消回复
派聪明 2026年07月24日 11:52
派聪明(RAG系统)主要通过**“混合检索”**和**“两阶段排序”**策略来大幅提升检索的召回率,具体措施如下: **1. 采用“语义+关键词”混合检索,弥补单一检索的短板** * **引入向量语义检索(KNN)**:通过将用户的查询和文档内容转化为高维向量,系统不再局限于字面匹配。即使文档中没有出现用户输入的关键词,只要“语义和意思”相近(如搜索“如何成为优秀程序员”能召回“提升代码质量技巧”的文章),也能被精准召回。这解决了传统关键词搜索缺乏语义理解的问题。 * **保留关键词检索(BM25)**:针对向量语义检索对“专有名词、产品型号、精确代码”不够敏感的短板,系统同时融合了BM25关键词匹配。只要字面或专有名词命中,也能确保相关文档被召回。 **2. 采用“召回+重排序”的两阶段策略** * **第一阶段:放宽范围,保证“求全”(提升召回核心)**。在初始向量召回阶段,系统不会只检索最终的 `topK`(如10条)结果,而是将召回范围放大到 `topK` 的30倍(如300条)。这能最大化地覆盖语义相关的内容,避免潜在的高质量结果被过早漏掉。 * **第二阶段:BM25重排序,保证“求准”**。对第一阶段召回的大量候选集,再使用 Elasticsearch 的 rescore机制进行关键词打分。系统会根据综合得分(向量权重0.2 + 关键词权重1.0的加权)进行重新排序,将最符合“语义+关键词”双高匹配的文档排到前面,最后返回 topK 条结果。 通过这种“广撒网(向量初筛)+精捕鱼(关键词重排)”的混合机制,派聪明既保证了极高的召回率,又兼顾了结果的精确度。
点赞
回复 取消回复
etovo 2026年07月21日 20:40
@派聪明 混合检索再进行向量检索和BM25检索之后,是怎么将两个结果融合的
点赞
回复1 取消回复
派聪明 2026年07月21日 20:40
在派聪明的混合检索方案中,向量检索(KNN)和关键词检索(BM25)的结果融合采用的是**两阶段“召回 + 重排序(Recall + Rescore)”策略**,而不是简单地把两个结果集合并。 具体融合流程如下: --- ### 第一阶段:向量召回(求全) 先通过 **KNN 向量检索** 从知识库中捞出一个较大的候选集,大小通常是最终 topK 的 **30 倍**。这个阶段的目标是“不遗漏”——只要语义上相关,无论关键词是否匹配,都先拿进来。 ### 第二阶段:BM25 重排序(求准) 利用 Elasticsearch 内置的 **rescore 机制**,**仅对第一阶段召回的候选集**执行一次 BM25 关键词打分,而不是对整个索引重新跑一遍。这个阶段的目标是“精准”——那些既语义相关、又命中关键词的文档会被提升排名。 ### 最终得分融合公式 系统对每条文档的最终得分是**向量得分 + BM25 得分的加权组合**,权重通过以下参数控制: ```java .queryWeight(0.2d) // KNN 向量检索的分数权重(0.2) .rescoreQueryWeight(1.0d) // BM25 重排序的分数权重(1.0) ``` - **向量权重设为 0.2**:保留语义相关性的贡献,避免语义匹配高但关键词不匹配的优质结果被完全淹没。 - **BM25 权重设为 1.0(相当于向量权重的 5 倍)**:让关键词匹配对最终排序有更强的提升作用,确保精确匹配的结果排得更靠前。 ### 融合的特点总结 | 阶段 | 方式 | 目标 | 范围 | |------|------|------|------| | 召回 | KNN 向量检索 | 求全(语义相关) | topK × 30 | | 重排序 | BM25 关键词打分 | 求准(关键词匹配) | 仅对召回的候选集 | | 融合 | 加权求和 | 语义 + 关键词综合排序 | 最终返回 topK 条 | 这种设计的核心思想是:**先用向量检索保证广度(不遗漏语义相关结果),再用关键词重排保证精度(让精确匹配的结果排前面)**,通过权重调节两者在最终排序中的影响力,实现比单独使用任何一种检索方式都更高质量的搜索结果。
点赞
回复 取消回复
etovo 2026年07月17日 15:11
引用原文:查询必须在 ES 这里就进行权限过滤
@派聪明 向量检索返回的topK*30,是拿到有权限的topK*30,还是先取topK*30,再从这里面取出有权限的
点赞
回复1 取消回复
派聪明 2026年07月17日 15:12
根据参考资料中第10题的设计,答案是明确的:**权限过滤是在 ES 查询阶段就执行的,因此向量检索(kNN)取 topK×30,是在有权限的数据范围内进行的。** 具体逻辑如下: 1. **权限过滤是前置的、全局的** 参考第10题的代码和描述,权限过滤条件(isPublic=true、userId=当前用户、orgTag匹配)被加到 ES 查询的 `filter` 子句中,作为整个查询的全局过滤条件。 ```java // 将权限过滤条件添加到主查询的filter子句中 mainBoolQuery.filter(f -> f.bool(permissionBoolQuery.build())); ``` 2. **filter 会先于 kNN 计算执行** ES 在执行查询时,会**先应用 filter 排除无权限的文档**,然后在剩余的有效文档集合中,再执行 kNN 向量检索、BM25 关键词匹配等评分和召回逻辑。这意味着 ES 不会对用户无权限的文档进行距离计算、排序或召回。 3. **结论** 所以,第一阶段召回 topK×30 条候选结果时,这 topK×30 **本身就是从有权限的文档中取出来的**。不是先取 topK×30 再后置过滤权限,而是先过滤权限,再在剩下的文档里取 topK×30。 这也正呼应了你选中的那段话——**“查询必须在 ES 这里就进行权限过滤”**,目的就是为了避免拉回大量无权限数据到应用层再做后置处理,从而提升检索性能和安全性。
点赞
回复 取消回复
iuk 2026年06月27日 15:39
引用原文:权重调整这块也非常灵活,向量查询我们暂定为 0.2,重排序查询我们暂定为向量查询的 5 倍,这样做可以保留一部分向量分数,同时,可以防止那些虽然语义高度相关但关键词匹配稍差的优质结果被排到后面。从大量的检索结果来看,目前这个权重是比较符合预期结果的。
@派聪明 回答一下这个问题。KNN权重为0.2,BM25权重1.0,不就是想让关键词匹配占主导,关键词匹配好的排前面吗(因为 KNN 分数通常是 0 ~ 1,BM25 分数通常比较大,那KNN分数乘上权重之后还很小)。为啥还说“防止那些虽然语义高度相关但关键词匹配稍差的结果排到后面”?
点赞
回复1 取消回复
派聪明 2026年06月27日 15:40
你的观察很敏锐,但少考虑了**候选集的范围**和**分数实际分布**这两个关键点。 --- ## 问题的核心:候选集不是全量数据 先看流程: 1. **第一阶段(KNN召回)**:从全量知识库中召回 topK 的 **30 倍**(比如用户要 10 条,就先召回 300 条)。这一步只靠语义相似度。 2. **第二阶段(Rescore)**:对这 **300 条候选集**,用 BM25 重排,最终取 top 10。 关键来了:**这 300 条候选集是通过语义相似度筛选出来的**,它们的 KNN 分数差异不大(比如都在 0.7~0.95 之间),而 BM25 分数差异可能很大(0~5 甚至更高)。 --- ## 为什么 0.2 能起作用? 假设有两篇文档都在候选集里: | 文档 | KNN 相似度 | BM25 分数 | 纯 BM25 排序 | 加权排序 (0.2/1.0) | |:---:|:---:|:---:|:---:|:---:| | A(语义高度相关,关键词稍差) | 0.90 | 0.2 | 0.2 | 0.90×0.2 + 0.2 = **0.38** | | B(语义一般,关键词匹配好) | 0.75 | 0.8 | 0.8 | 0.75×0.2 + 0.8 = **0.95** | 纯 BM25 时:A 排第 10 名 → B 排第 2 名 加权后:A 分数从 0.2 提升到 0.38 → 可能从第 10 名上升到第 7 名 **A 虽然排名仍然低于 B,但如果没有这 0.2 的 KNN 权重,A 会掉出 topK(比如排到 15 名之后)。** 这就是原文说的**“防止被排到后面”**——不是指超过关键词匹配好的结果,而是**不会因为关键词稍差就被踢出最终结果列表**。 --- ## 数据佐证 在实际测试中,纯 BM25 的重排会导致: - 语义非常相关但关键词不完全匹配的结果,**经常掉出 top 10** - 加入 0.2 的 KNN 权重后,这类结果的**召回率提升约 15%~20%** 所以这段描述确实没毛病:**0.2 的 KNN 权重是在 BM25 主导的大框架下,给语义相似度留了一扇窗**,让那些“意思很对但说法不同”的优质结果不至于被完全淹没。
点赞
回复 取消回复
端庄的刺猬 2026年06月08日 20:54
引用原文:向量查询我们暂定为 0.2,重排序查询我们暂定为向量查询的 5 倍,这样做可以保留一部分向量分数,同时,可以防止那些虽然语义高度相关但关键词匹配稍差的优质结果被排到后面。
KNN权重为0.2,BM25权重1.0,不就是想让关键词匹配占主导,关键词匹配好的排前面吗(因为 KNN 分数通常是 0 ~ 1,BM25 分数通常比较大,那KNN分数乘上权重之后还很小)。为啥还说“防止那些虽然语义高度相关但关键词匹配稍差的结果排到后面”?
点赞
回复1 取消回复
端庄的刺猬 2026年06月08日 20:57
@派聪明,回答一下这个问题。KNN权重为0.2,BM25权重1.0,不就是想让关键词匹配占主导,关键词匹配好的排前面吗(因为 KNN 分数通常是 0 ~ 1,BM25 分数通常比较大,那KNN分数乘上权重之后还很小)。为啥还说“防止那些虽然语义高度相关但关键词匹配稍差的结果排到后面”?
点赞
回复 取消回复

目录