免费POC, 零成本试错
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


运用 Elasticsearch 进行向量搜索及创建 RAG 应用

发布日期:2025-09-08 17:15:07 浏览次数: 1531
作者:DataFunSummit

微信搜一搜,关注“DataFunSummit”

推荐语

探索Elasticsearch如何通过向量搜索技术突破传统搜索局限,打造更智能的RAG应用。

核心内容:
1. 智能时代下向量搜索的必要性与应用场景
2. Elasticsearch实现向量搜索的技术原理与最新进展
3. 企业级RAG应用案例与实战经验分享

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

导读 Elasticsearch 目前是世界上最大的搜索引擎,在 ToB 业务中应用广泛,携程、抖音、滴滴等平台的搜索引擎都基于此构建。

本文介绍会围绕以下五方面展开:


1. 智能时代的搜索需求

2. Elasticsearch 向量搜索及最新进展

3. RAG 实现原理

4. 使用 Elasticsearch 在企业搜索中的案例分享

5. 附录信息

分享嘉宾|刘晓国 Elastic 首席布道师

编辑整理|王丽燕

内容校对|郭慧敏

出品社区|DataFun


01



智能时代的搜索需求



为什么要做向量搜索?当前智能时代的搜索需求已发生变化,传统搜索多基于词汇匹配,比如搜索某个词,若该词不存在则无法得到结果。但向量搜索能突破这一限制,例如“我爱你”和“我喜欢你”语义相近,通过向量搜索可相互匹配;即便是多语言场景,如“I like you”和“I love you”,借助多语言模型生成的向量也能实现跨语言搜索。

过去的搜索需求多集中在全文搜索、结构化搜索等;而未来向量搜索的需求会愈发凸显。



例如,搜索“how to set up Elasticsearch ML”(ML 即 machine learning,机器学习),由于 Elasticsearch 收购了最早使用其构建机器学习工作的 Prelert 公司,理论上搜索“Prelert”应能关联到机器学习相关内容,而“set up”涉及“安装”或“configuration(配置)” 的含义。但传统词汇搜索的结果可能并不精准,比如第一个结果中“up”和“set”分开出现,无法体现“set up”的完整语义;甚至可能出现相反语义的匹配,比如搜索“我不想吃冰淇淋”,却匹配到“我吃冰淇淋”的文档,虽有较高匹配度,但并非用户所需。



语义搜索则能避免这些问题。例如搜索“how to set up Elasticsearch machine learning”,返回的结果会包含“machine learning settings”“set up machine learning features”等高度相关的内容。



向量搜索的应用场景也扩展到了跨模态领域:通过文字描述如“覆盖雪的山”可搜索到对应的图片;在电商平台,上传一张衣服或鞋子的图片,能找到售卖的相似商品。

02



Elasticsearch 向量搜索及最新进展

Elasticsearch 在向量搜索方面有两类向量:dense Vector(密集向量)和 sparse Vector(稀疏向量)。



密集向量会将文字、图片、声音等信息转化为数字向量。以图像为例,向量可通过卷积神经网络生成。例如对一个人的特征进行数字化描述:身高 1.65 米(相较于1.6 米、1.7 米,1.9 米更符合预期)、黑色头发(特定深浅度为最佳)、硕士学历(分值最高,博士可能分值较低),皮肤颜色、眼睛大小等特征,都转化为数字。当把这些特征整合为一个向量进行搜索时,得到最相似的结果,而非传统搜索中通过 “年龄大于 X 且小于 Y” 等条件过滤出的结果。多维向量搜索能同时从多个维度同时进行匹配,即便某一维度(如身高)不完全符合,但若其他维度(如学历、距离)高度匹配,仍可能成为最相近的结果,这是向量搜索的基本原理。



稀疏向量无需微调,通过文字扩充实现语义搜索效果,且速度比密集向量更快。例如“canoe”可扩展与“船只”相关的词汇:boat”,“hire”可关联“rent(租赁)”,一个词可能扩充到 20 个相关词。基于这些扩充后的词汇,结合传统的 BM25 词汇搜索,即可实现语义搜索,且效率极高。



上图是文本扩展示例,以“droids you're looking for”为例,“droids” 可能关联 “Robot” “Android” “galaxy” 等词,搜索 “do androids dream of electric sheep” 时,每个词都会被扩充,且每个扩充词会被赋予基于统计或学习的分数,最终通过综合分数得出结果,其速度和效率优于密集向量,并且不需要为每个领域进行微调。通过文本扩展,也可以轻松实现语义搜索的目的。



向量搜索的原理分为以下步骤:首先,将文档、图像、声音、视频等通过嵌入模型(embedding model)转化为嵌入向量(embedding),存入 Elasticsearch 数据库;搜索时,使用相同的嵌入模型将查询问题转化为向量,搜索引擎会在向量空间中找出最相近的若干个向量,这是密集向量的工作原理。



向量检索具体实现需两步:一是建立嵌入模型,传入机器学习节点,创建 inference API,通过该 API 将数据转化为向量并存入 Elasticsearch 形成索引;二是搜索时调用 inference API,进行 KNN(最近邻)搜索。



不过这种方式通常不直接用于图像搜索,因为传入机器学习节点的模型有其特定适用范围。目前,若要将图像转化为向量,一般需通过 Python 代码实现,再将生成的向量写入 Elasticsearch 进行存储。我们可通过 eland 工具从 hugging face 等平台获取模型,将其传入 Elasticsearch 的机器学习节点。之后,创建 inference Processor 及对应的 pipeline,即可直接写入文档,完成向量的存储流程。



上图中的 “desc_embedding”,本质上是一个数组。在查询时,存在两种查询方式:一种是传统查询,另一种是 KNN 查询(即向量查询)。将向量填入查询条件中,对索引进行查询,就能得到最相近的结果并返回。按照这种方式,查询需分两步:第一步是计算查询语句(summer clothes)的向量并填入查询条件;第二步是调用查询接口完成查询。



Elasticsearch 在 8.7 及以上版本简化了这一操作,对于全向量索引,只需加入 “query Vector builder” 并直接传入 model _id,一句话即可完成搜索。相较于早期版本,操作流程大幅简化,后续版本也在持续优化,使向量搜索变得更加便捷。



Elasticsearch 支持混合搜索,密集向量的解释性较差,因为神经网络生成的向量难以解释相关性,而传统词汇搜索的相关性(比如是否包含某词)则清晰可见。因此,可将传统的 BM25 文本搜索、稀疏向量搜索及密集向量搜索融合,通过混合打分提高召回率和相关性。



混合打分有两种方式:第一种方式是凸组合(Convex combination),根据应用场景对不同搜索方式赋予权重(如传统搜索 0.9、向量搜索 0.1),比如简单计算公式为“最终分数 = 传统分数 × 权重 1 + 向量分数 × 权重 2”;



第二种方式是 RRF,基于排名而非具体分数计算,通过特定公式可计算出综合分数,该方式支持多路召回,且计算简单。



相似性阈值是一个重要概念,例如,相似性低于 80% 的结果可视为不相关而不返回,在亲子鉴定中类似(95% 以上才可能为真)。在实际应用中,若聊天知识库中已有相似度 99% 的问题已经被问过了,可直接访问本地知识库返回本地结果,无需调用大模型来获取答案(LLM 的访问会产生费用及时延);若相似度仅 80%,则视为新问题,调用大模型查询。



Elasticsearch 的功能不只是向量存储与搜索,它还能通过机器学习节点传入嵌入模型并生成嵌入向量,同时支持传统文本搜索、位置搜索等,且兼容类 SQL 查询(ESQL),对熟悉 SQL 的用户更友好。



此外,Elasticsearch 是基于 Lucene 构建的原生向量搜索引擎,近期版本在性能优化上有诸多突破:



  • 利用 CPU 硬件指令加速向量索引和 计算速度;



  • 通过标量量化压缩向量,能将 字节向量压缩至 字节(节省 75% 内存);



  • 增加单个查询并发;



  • 并发查询间协同,一个查询的多个并发线程间协同共享信息,提前终止一些查询线程;



早期 Elasticsearch 一个分片对应一个线程,现在支持逻辑分段,一个大分片可由多个线程协同处理,且分片间查询可负向通信(如某 segment 的查询距离已短于其他,其他可直接终止进一步的搜索),节省资源与时间。



Elasticsearch 改进后还支持 IO 并发;对稀疏索引的特定字段进行排序优化,查询时可跳过无关范围(如最大值、最小值不在范围内的 segment);支持快速模式,当多次循环查询的结果差异极小时,可直接终止。



搜索的发展阶段有:



  • 文本词汇搜索(textual search);



  • 向量搜索(Vector search);



  • 混合搜索(Hybrid search),混合搜索将文本与向量搜索结合,召回率优于纯向量搜索;



  • 相关性调优(relevance tuning



当前搜索更加关注重排序(re-rank):第一阶段通过 BM25ANN 密集向量或稀疏向量搜索,得到 100K 至 100W 篇文档;随后通过 mid-stage reranker: Learning to Rank 模型(自行训练)对结果打分并重排序;最后可调用 AI base model 进一步优化重排序比如一些厂商提供的重排序接口。若文档数量少,还可通过脚本计算绝对值实现精确打分。这种通过脚步精确计算距离的方法不适合大量文档,因为这种计算非常费算力,但是对少量的文档还是可以的。



learning to rank” 类似 Excel 表格,相关打 1,不相关打 0,再通过 Xgboost 等工具训练模型,上传至机器学习节点,搜索 rescore 训练模型实现业务相关的重排序,相关详细内容可参考博客文章:https://elasticstack.blog.csdn.net/article/details/140464162



重排序的方法多样:可调用阿里、腾讯等厂商的机器学习节点(依托其 GPU 算力),借助大模型 AI 能力重排序;



支持多级排序,如结合 hugging face 的 rerankerElastic rerankercoherent 的接口等。



还支持多级检索器(retrievers),融合 KNN、传统词汇搜索、向量搜索等,形成搜索流水线(pipeline)。

对于长文档(如 800 页的书),需进行分块处理,再将每个块转化为向量(像 OpenAI 里 1563 token 或者单纯一维向量小数据无法代表整本书)。

分块需把握合适的粒度,块过大可能导致重点分散,大模型总结时易出现偏差;块过细则可能影响精度。



分块策略包括:



  • 按句子分块,确保不超过模型 token 限制(如 OpenAI 的 1563 token),且块与块之间重叠 1-2 个句子,避免语义断裂;



  • 按词数分块(如重叠 100 个词),保证块间语义连贯。

Elasticsearch 最新版本中的“Semantic text”字段可自动处理稀疏向量与密集向量,无需人工区分,且支持自动分块,分块后自动转化为向量,简化操作。



搜索操作很简便:定义“sparse_ embedding” 端点,接入 ELSEROpenAI 等厂商的模型;定义“semantic text”字段(可同时支持稀疏与密集向量);写入文档与传统方式一致;搜索时直接使用 query 语句搜索匹配结果。



在 8.18 及以上版本中,可以通过 ESQL 或 DSL 直接去搜索。

Elasticsearch AI 集成了诸多第三方服务(如阿里云),支持向量生成、搜索、重排序(re-rank)、聊天补全(chat completion)等大模型接口。



在 Serverless 架构中,Elasticsearch 实现了“存算分离”:索引数据存入一个节点,搜索任务由搜索层处理,文档数据存储在对象存储中,节点仅需少量硬盘,实时性好,能显著节省成本。

03



RAG 实现原理



如果数据质量不够好,大模型极易产生幻觉,例如询问“2025 年 315 哪些商家被曝光”,若大模型训练数据中无相关信息,可能给出错误答案。



提高大模型准确性的方式有三种:



  • 预训练(Pre-training,需强大资源投入,多数人不具备);



  • 微调(针对医药、法律等专业领域,但数据集规模不足时效果有限,如仅用“青霉素可治感冒”这一条数据微调,无法改变大模型结论);



  • 情境学习(通过 RAG 实现可解决幻觉问题,最有效)



RAG 的工作流程为:用户提问后,通过语义搜索或词汇搜索(多路召回)从数据库中获取相关结果;将用户问题与搜索结果一同传入大模型的上下文窗口(context window);大模型基于这些信息生成答案,避免“幻觉”。



04



使用 Elasticsearch 在企业搜索中的案例分享



另一种 RAG 形式为 Agentic RAG:用户提问后,大模型调用相应工具查询结果,或按顺序调用不同函数,最终完成任务,例如制定从北京到新加坡的旅行计划,包括交通、酒店预订等)。



上图所示询问“Elastic Stack 的最新版本是多少”,DeepSeek 可能回答 8.13(错误),而 OpenAI 会通过搜索网络获取正确答案,其核心在于通过判断现有信息是否满足需求,决定是否调用工具补充信息。



我曾实现过一个案例:无需告知 Elasticsearch 索引信息,直接以自然语言查询,如“从中国到美国的最便宜机票是多少”,系统会自动调用 Kibana 中的 flight 示例索引,返回中文结果 272

上图案例基于 Elasticsearch MCP Server,通过标准协议整合各组件。



提高查询效果的技巧包括:采用“hypothetical document embedding”(假设文档嵌入),将问题生成符合向量维度(如 1563 维)的文字描述,再与分块文档的向量匹配,可提高召回率;还可生成多个相关问题,将其向量与原始问题向量加权平均后再匹配,效果也会提升。

具体做法可参考文章链接详细描述:



https://elasticstack.blog.csdn.net/article/details/141780767,将问题分块,提取关键词,大模型针对每个块生成 5-10 个相关问题,将这些问题与原始问题均转化为向量,加权后存入 Elasticsearch;搜索时,将问题生成对应的 hypothesis 文档及向量,进行匹配。



混合评分(Hybrid scoring)也是有效方式:对问题中的关键词、短语等进行处理,结合元数据(Meta data)、实体(entity)等信息,为每个文档块生成潜在问题并转化为向量,对关键词短语也生成向量,通过加权得到新向量后存入数据库,搜索时将问题转化为对应的 hypothesis 向量进行匹配,可提升搜索精度与召回率


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询