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
参考:
https://www.elastic.co/search-labs/blog/elasticsearch-chunking-inference-api-endpoints
https://medium.com/@sarthakjoshi_9398/understanding-locality-sensitive-hashing-lsh-a-powerful-technique-for-similarity-search-a95b090bdc4a
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 以减少存储和计算成本,同时性能损失较小。
参考:
https://huggingface.co/nomic-ai/nomic-embed-text-v1.5
https://huggingface.co/nomic-ai/nomic-embed-text-v2-moe