news 2026/6/21 4:35:15

Elasticsearch:一切都与这些分块有关!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Elasticsearch:一切都与这些分块有关!

作者:来自 Elastic Kathleen DeRusso

探索用于 LLMs 的 chunking 和 snippet 提取,重点介绍用于识别并发送给 rerankers 和 LLMs 等模型的最相关 chunks 和 snippets 的增强功能。

Elasticsearch 内置了大量新功能,帮助你为自己的使用场景构建最佳搜索解决方案。欢迎参加我们关于构建现代 Search AI 体验的动手式网络研讨会,学习如何将这些功能付诸实践。你也可以开始免费的 cloud trial,或立即在本地机器上试用 Elastic。

如今,如果你做过语义搜索或上下文工程,可能已经大量接触过 chunks。如果你不熟悉 chunks,chunk 是从较大文档中提取的一小段有意义的内容。这篇博客提供了关于 chunking 的扎实基础概览,解释了它为什么重要,以及不同的 chunking 策略。

在这篇博客中,我们想聚焦于 chunking 主题中的一个具体问题,即定义发送给大语言模型( LLM )或其他模型的最佳上下文。模型能够接收的上下文 token 数量是有限的,但即使在这个限制之内,发送大量内容也可能导致相关性下降,原因包括上下文衰减(context rot)或 “丢失在中间” 等问题,即重要信息被隐藏在大段文本中而被忽略。

这引出了一个问题:我们如何把这件事做得更好?

检索器中的重排序

我们首先从检索器入手,具体是 text_similarity_reranker 检索器。我们知道,许多 cross-encoder 重排序模型在处理长文档时表现不佳。这是因为这些重排序模型会将较长内容截断到模型的 token 窗口内,丢弃其余内容。如果文档中最相关的部分在发送给重排序器之前被截断,这实际上会导致搜索相关性下降。

为了解决这个问题,我们为 text_similarity_reranker 检索器引入了 chunk_rescorer。当指定该参数时,我们不会将整个文档发送给重排序器,而是先对文档进行 chunking,并根据重排序推理文本对每个 chunk 进行评估。我们通过将每个 chunk 索引到一个临时的内存 Lucene 索引中,并对这些 chunks 执行 BM25 文本搜索来实现这一点。然后返回最优的 chunks 供重排序器进一步评估。

chunk rescorer 的使用非常简单,只需对 API 调用做一个小改动即可:

GET books/_search { "retriever": { "text_similarity_reranker": { "retriever": { "standard": { "query": { "match": { "author": "Tolkien" } } } }, "rank_window_size": 10, "field": "semantic_text", "inference_text": "are all who wander lost?", "chunk_rescorer": { "size": 1 } } } }

在评估 chunk rescorer 时,我们发现对于许多会发生截断的模型都有显著提升,包括 Elastic Reranker 和 Cohere 的 rerank-english-v3.0 模型。然而,当我们对 jina-reranker-v2-base-multilingual 进行评估时,效果并不那么显著,因为 Jina 已在内部解决了长文档问题。

我们使用 Multilingual Long-Document Retrieval( MLDR )英文数据集进行了评估。这是一个包含非常长文章内容的数据集,许多重排序模型在该数据集上都会触发文档截断问题。下表展示了在使用 BM25 文本搜索且 rank_window_size 为 32 时的评估结果:

Reranker modelNDCG@10NDCG@10 NDCG@10 with chunk rescoring
jina-reranker-v2-base-multilingual0.7711450.764488
Cohere rerank-english-v3.00.5925880.707842
.rerank-v1-elasticsearch0.4781210.751994

值得注意的是,在不进行重排序的情况下,原始 BM25 结果的 Normalized Discounted Cumulative Gain( NDCG )得分(即相关性得分)接近 0.64。(更多背景可参考这篇论文。)这意味着对于会发生截断的 rerankers,在处理长文档时,重排序后的结果实际上比不进行重排序还要差。需要注意的是,这一问题仅适用于长文档;能够完全放入 token 窗口的较短文档不会受到该问题影响。

在我们评估的 rerankers 中,Jina 是唯一一个开箱即用就能很好处理长文档的 reranker,这得益于其滑动窗口方法。

在使用 Elastic Learned Sparse EncodeR( ELSER )的 semantic_text 字段时,我们看到了更好的基线性能,但整体结果差异与之前相似。

我们认为,对于会发生截断的模型,这些结果足够有前景,因此将 chunk rescorer 作为一个可选特性发布,以便为相关模型带来额外的相关性提升。但我们建议在将其用于生产之前,先针对具体的 rerankers 进行评估。

ES|QL

然而,chunk 提取的真正威力在于 Elasticsearch Query Language( ES|QL )。我们希望让 chunks 和 snippets 成为 ES|QL 中的一等公民,这样就可以轻松地将它们提取出来,并重新用于 reranking、发送到 LLM 上下文或其他用途。

我们首先在 Elasticsearch 9.2 版本中引入了 CHUNK 函数:

FROM books | EVAL chunks = CHUNK(description)

CHUNK 是一个极简原语,它接收一些字符串内容(文本字段、semantic text 字段,或任何其他字符串类型的行内容)并将其进行 chunk。你可以查看并与这些 chunks 交互,还可以尝试使用不同的 chunking 设置:

FROM books | EVAL chunks = CHUNK(description, {"strategy": "sentence", "max_chunk_size": 25, "sentence_overlap": 0})

然后,你可以将 chunk 与现有原语结合使用,例如 MV_SLICE 和 MV_EXPAND,以格式化 chunks 在行输出中的表示方式:

FROM books | WHERE MATCH(author, "Tolkien") | EVAL chunks = CHUNK(semantic_description, {"strategy": "sentence", "max_chunk_size": 25, "sentence_overlap": 0}) | EVAL truncated = MV_SLICE(chunks, 0, 2) | MV_EXPAND truncated | KEEP title, truncated

这很好,但我们真正想要的是获取查询的最匹配 snippets,因此我们在 Elasticsearch 9.3 版本中引入了 TOP_SNIPPETS:

FROM books | EVAL snippets = TOP_SNIPPETS(description, "ring")

我们增加了对返回 snippet 数量和单词长度的控制,使用基于句子的 chunking 策略:

FROM books | EVAL snippets = TOP_SNIPPETS(description, "ring", { "num_snippets": 3, "num_words": 25 }) | MV_EXPAND snippets | KEEP title, snippets

当你加入 COMPLETION 时,这就融入了 LLMs 的更大框架。以下是我们设想 TOP_SNIPPETS 与 LLM 集成的示例:

FROM books METADATA _score | WHERE semantic_description:"what are hobbits?" | SORT _score DESC | LIMIT 10 | FORK ( EVAL snippets = TOP_SNIPPETS(semantic_description, "what are hobbits?", {"num_snippets": 3}) | COMPLETION CONCAT("Answer what are hobbits", snippets) WITH {"inference_id": "my-completion-endpoint"})

在这个示例中,我们执行语义搜索,但对于每个文档,我们识别该文档中的最优 snippets。我们将高度相关的 snippets 发送到 completion 命令,而不是整个文档。这是一个简单文档的示例,但你也可以在此使用 reranking,并且未来当有多个分支可用时,同样格式将支持混合搜索( hybrid search )。

我们还可以在最新版的 RERANK 中利用 snippets:

FROM books | WHERE MATCH(title, "ring") | EVAL snippets = TOP_SNIPPETS(semantic_description, "what are hobbits?", { "num_snippets": 3, "num_words": 25 }) | RERANK "what are hobbits?" ON snippets WITH { "inference_id" : "my-reranker" }

我们的下一步思考

关于 chunking 和 snippet 提取的故事还没有结束,实际上才刚刚开始。

我们正在研究如何将现有的 semantic_text chunks 开箱即用地整合到 chunking 和 snippet 提取策略中。同时,我们也在探索还需要哪些功能,才能让 snippet 提取成为在 Elastic Agent Builder 等产品中值得使用的功能。

总体而言,我们很高兴分享这些工具,并期待在我们不断优化获取 LLM 最佳上下文策略的过程中收到你的反馈!

原文:https://www.elastic.co/search-labs/blog/llm-chunking-snippet-extraction

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/18 19:58:32

高频注入法详细教程:从理论到产品实现

今天讲下高频注入法。 第一部分:引言与基本概念 1.1 为什么需要高频注入法? 在现代电机控制中,无传感器控制是一项关键技术。它消除了物理传感器(如编码器、旋转变压器),降低了系统成本、体积和复杂度,提高了可靠性。传统的无传感器方法(如模型参考自适应、滑模观测器…

作者头像 李华
网站建设 2026/6/18 20:01:05

UEDITOR的ELECTRON版本如何优化WORD图片转存速度?

企业级Word导入与粘贴功能解决方案 作为安徽IT行业集团上市公司的项目负责人,针对文章中提出的需求,我将提供一套完整的解决方案。 一、需求分析与技术评估 核心需求总结 Word粘贴功能:支持从Word复制内容粘贴到编辑器中,自动…

作者头像 李华
网站建设 2026/6/18 20:03:02

终端渲染天花板:技术诗《永恒工具》

基于本质铸代码,囹圄效用展智慧。 笔记模板由python脚本于2026-01-27 12:38:48创建,本篇笔记适合终端渲染学习的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 Python官网&a…

作者头像 李华
网站建设 2026/6/20 0:29:43

springboot的高校安全治安管理系统-vue

目录 系统概述技术架构核心功能模块创新点应用价值 开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 系统概述 基于SpringBoot和Vue的高校安全治安管理系统是一个现代化、模块化的平台,旨在提升校园安全管理效率。系…

作者头像 李华
网站建设 2026/6/18 20:06:49

高频动效引发内存暴涨?

你可能遇到过这种场景: 测试同事说:“我就一直点按钮,点了五分钟,游戏内存从 800M 涨到 1.4G,然后啪一下闪退了。” 你一看代码: 没有疯狂 new 没有静态 List 疯狂堆对象 各种事件也都解绑了 GC 跑起来也正常 更离谱的是:只要人不操作,内存就相当稳定,一猛点就嗖嗖涨。…

作者头像 李华
网站建设 2026/6/18 21:12:43

mfc80d.dll文件丢失找不到 免费下载方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华