企业级语义搜索完整实现相关问题答疑讨论

unsetunset1、问题1:关于评分?unsetunset

针对之前两篇文章的读者留言问题:

从关键词匹配到语义理解——电商搜索引擎的智能化改造实战

不依赖外部API!基于 Ollama 的企业级语义搜索完整实现

问题描述:1.混合搜索中,向量评分区间在0-2之间,而关键词评分理论上在0-无穷,如何保障向量、关键词评分纬度一致,报文中 boost 才有意义?

向量评分区间确实通常在 0-1 之间(取决于相似度算法)。

关键词评分理论上确实可以到很大值(TF-IDF、BM25等算法无上界)。

读者的核心问题:不同评分体系的量纲不统一,直接加权没有意义。

而 RRF(未开源,2023年7月25日 Elasticsearch 8.9 版本新上的付费功能) 的出现,通过"排名民主投票"机制,优雅地解决了混合搜索中评分标准化这一技术难题。

参见官网:

https://www.elastic.co/docs/reference/elasticsearch/rest-apis/reciprocal-rank-fusion

1.1 RRF 的本质价值

官方文档:"RRF requires no tuning, and the different relevance indicators do not have to be related to each other to achieve high-quality results."

这句话揭示了RRF解决混合搜索核心痛点的精髓。

1.2 传统混合搜索的困境

需要复杂调优,举例:关键词搜索(BM25)评分可能是15.6,向量搜索评分是0.85。

评分量纲不统一,需要人工设置 boost 权重,如keyword_boost=1.5, vector_boost=1.0。

权重难以确定,不同业务场景最优权重不同,需要大量A/B测试。

1.3 RRF的革命性突破

相比传统加权融合,RRF通过"排名民主投票"机制带来显著优势:

首先是更稳定的结果,因为基于排名而非原始评分,无需针对不同查询类型或业务场景反复调整boost参数;

其次是更好的相关性表现,RRF能够充分利用 BM25、向量检索、ELSER 等多种检索算法的互补优势,通过倒数衰减公式自然平衡各算法贡献度,通常在相关性评估中优于单一检索方法;

最后是更简单的工程实现,RRF开箱即用,完全避开了评分标准化、权重调优等复杂工程问题,开发者无需深入理解各检索算法的评分机制即可获得高质量的混合搜索效果。

论文地址:

https://plg.uwaterloo.ca/%7Egvcormac/cormacksigir09-rrf.pdf

unsetunset2、问题2:关于召回数据量?unsetunset

问题描述:2、向量搜索的返回的 total 是全量数据,如何限制向量搜索返回的数量或者仅返回评分前10的索引?

回复:

  • 查询设置了 "size": 10,期望只返回前10条结果。

  • 但在 semantic 查询中设置了 "candidates": 50。

这会导致向量搜索阶段检索 50 个候选文档,然后与传统搜索结果合并,可能返回超过 10 条的结果。

candidates vs size: candidates 控制向量搜索阶段的候选数量,size 控制最终返回结果数量。

将 candidates 设置为接近 size 的值可以提高查询效率。

如果需要更高质量的结果,可以适当增加 candidates 但保持 size 不变。

unsetunset3、问题3:关于 LSH 算法unsetunset

向您咨询下,LSH算法的 L 和 k 参数设置生产环境最佳实践,或者有具体的参考资料或链接吗?

官方文档说明如下:

  • L:哈希表的数量。一般来说,增加此值会增加召回率。

  • k:用于形成单个哈希值的哈希函数的数量。一般来说,增加此值会增加精度。

     https://docs.infinilabs.com/easysearch/main/docs/references/search/knn_api/

参数权衡关系,精度 vs 召回率权衡:

  • 增加k: 提高精度,但降低召回率,增加计算成本。

  • 增加L: 提高召回率,但增加存储成本和查询时间。

unsetunset4、问题4:关于如何进行分块向量化?unsetunset

文中的向量化源字段内容比较短,针对源字段内容长的,如何进行分块向量化、分块向量化结果存储及搜索?

回复:在 AI 搜索中处理大型文本文档时,通常需要将其分割成较小的段落,因为大多数嵌入模型都有令牌长度限制。这个过程称为文本分块,通过确保每个嵌入表示适合模型约束的重点内容片段,有助于保持向量搜索结果的质量和相关性。

传统向量化面临的两个核心问题:

  • 1.准确性问题:大文档整体向量化会导致准确性下降。

  • 2.模型限制:推理模型对输入大小有限制。

解决方案:通过分块(chunking)技术将大文档分解为更小、更易管理的子部分,对每个块单独进行推理操作。

图片来自:Elastic 官方刘晓国老师博客

两种分块策略详解,供参考,可以自己代码层面实现。

4.1. 基于词汇的分块策略(Word-based Chunking)

配置参数:

  • max_chunk_size:块中的最大词数(必需)

  • overlap:块间重叠词数(必需,不能超过max_chunk_size的一半)

工作机制:

  • 总是将块填充到最大尺寸后再构建下一个块

  • 每个块(除第一个)都会与前一个块有指定数量的词汇重叠

  • 重叠的目的是防止有用的推理上下文被分割

4.2. 基于句子的分块策略(Sentence-based Chunking)

配置参数:
  • max_chunk_size:块中的最大词数(必需)

  • sentence_overlap:块间重叠句子数(必需,只能是0或1)

工作机制:
  • 分割输入数据为包含完整句子的块

  • 块只包含完整句子(除非单个句子超过max_chunk_size)

  • 优先保持句子完整性而非最大化填充每个块

默认配置变化

8.16版本后的默认设置:
  • 策略:句子分块

  • max_chunk_size:250

  • sentence_overlap:1

8.16 版本前的默认设置:
  • 策略:词汇分块

  • max_chunk_size:250

  • overlap:1

参考:

  1. https://www.elastic.co/search-labs/blog/elasticsearch-chunking-inference-api-endpoints

  2. https://medium.com/@sarthakjoshi_9398/understanding-locality-sensitive-hashing-lsh-a-powerful-technique-for-similarity-search-a95b090bdc4a

  3. https://discuss.elastic.co/t/what-s-new-in-elastic-8-16/370418

unsetunset5、问题5:dims 必须与 embedding 一致吗?unsetunset

nomic-embed-text-v1 和 nomic-embed-text-v1.5:默认嵌入维度为 768。

通过 Matryoshka Representation Learning,这些模型支持灵活调整维度(从 64 到 768),例如可以指定为 256 或 512 以减少存储和计算成本,同时性能损失较小。

参考: 

  1. https://huggingface.co/nomic-ai/nomic-embed-text-v1.5

  2. https://huggingface.co/nomic-ai/nomic-embed-text-v2-moe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铭毅天下

和你一起,死磕Elastic!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值