Elasticsearch 作为 GenAI 缓存层
作者:JEFF VESTAL,BAHA AZARMI
探索如何将 Elasticsearch 集成为缓存层,通过降低 token 成本和响应时间来优化生成式 AI 性能,这已通过实际测试和实际实施进行了证明。

随着生成式人工智能 (GenAI) 不断革新从客户服务到数据分析等各个领域,它也面临着一系列挑战,包括计算成本和响应时间。 通过使用 Elasticsearch 作为缓存层,我们可以正面解决这些问题,优化效率和效果。 让我们了解一下这种组合如何为部署生成式人工智能模型的固有复杂性提供真正的解决方案。
RAG 概述
检索器增强生成(Retriever-Augmented Generation),俗称 RAG,是自然语言处理中的一种高效机制。 它通过接受给定的提示或问题并从大型数据集中检索相关信息来进行操作。 对于 Elasticsearch,通常使用语义搜索来检索此结果。 然后,相关文档和提示会发送到生成式大语言模型 (LLM),以创建易于人类使用的响应。 理想的最终结果是更准确但上下文更丰富的响应,比简单的基于关键字的答案提供更多深度。
大规模 GenAI 的问题
首先,存在每个生成调用的 token 成本问题。 token 是转换为模型可以理解的输入文本。 它们可以短至单个字符,也可以长至单词。 这很重要,因为你需要根据处理的 token 数量进行计费。 现在,想象一个场景,多个用户询问完全相同的问题或向模型提供类似的提示。 每个调用都需要花费 token,因此如果处理两个相同的提示,则成本实际上会加倍。
然后是响应时间的问题。 生成模型需要时间来接收数据、处理数据,然后生成响应。 根据模型大小、提示的复杂性、运行位置以及其他因素,此响应时间可能会增长到数秒。 这就像等待网页加载一样; 几秒钟的时间感觉就像是永恒,并可能阻止用户进一步参与。
Token 成本和响应时间这两个问题尤其重要,因为它们不仅影响运营效率,而且对用户体验和整体系统性能有直接影响。 随着对更新的实时、智能响应的需求不断增长,这些挑战不容忽视。 因此,我们发现自己正处于一个迫切需要寻找可扩展且高效的解决方案的时刻。
Elastic 作为缓存层

Elasticsearch 是一个向量数据库。 这意味着 Elasticsearch 不仅可以存储问题和答案的原始文本,还可以以数值向量格式存储它们的语义或 “基于含义” 的表示形式。 然后可以快速比较这些向量的相似性,从而提供一种稳健且有效的方法来识别已回答的相关问题。
实现这种智能匹配的一个关键方面是 k 最近邻 (kNN) 相似性参数。 借助 kNN,Elasticsearch 可以快速识别与新传入提示最相似的提示。 结果是一个快速而高效的检索过程,如果已经回答了足够相似的问题,则可以绕过资源密集的生成模型。 这会带来更快的响应时间,而无需支付 token 成本。 Elasticsearch 通过 similarity 参数在 knn 查询中启用了此功能。
要将 Elasticsearch 集成为缓存层,工作流程可以如下进行:出现新提示并查询 Elasticsearch,包括对提示进行向量化,以查找任何紧密匹配的现有向量。 如果找到匹配项,则返回先前生成的针对先前提示的答案。 如果没有,问题将经历通常的 RAG 流程,新生成的答案将存储回 Elasticsearch 以供将来使用。 你甚至可以为用户提供坚持要求 “新鲜” 答案的选项,从而在他们愿意的情况下绕过缓存。
Elasticsearch 可以被配置为类似于其他缓存系统中的 TTL 一样,自动清除旧数据。这确保缓存保持最新且有用。类似地,可以使用 Elasticsearch 的 Frozen Searchable Snapshot 功能来采用分层的方法。这将允许你构建一个庞大的缓存层,成本较低,用于不经常访问的数据,同时仍然比生成新响应更快。
还可以实施质量保证措施,例如某些响应的 “approved” 标志。 这允许人工审核员在向最终用户提供缓存的响应之前进行审查,从而增加了额外的可靠性。
通过将 Elasticsearch 实现为缓存层,你可以实现更具可扩展性、更高效且在许多方面更智能的系统,解决部署 RAG 等生成式 AI 模型时常见的限制。
评估语义相似性:容忍与抵抗 - Tolerance vs. Resistance
在利用 Elasticsearch 作为缓存层时,一个关键方面在于评估新提出的问题和之前存储的问题之间的语义相似性。 我们的缓存机制的有效性很大程度上取决于我们将新查询与现有查询匹配的程度。 该评估的核心有两个截然不同的概念:语义容忍和语义抵抗。
语义抵抗通常指系统或模型对语义相似性的严格度或抵抗力。在信息检索或自然语言处理的语境中,语义抵抗表示系统对于确定两段文本或查询是否在语义上相似的标准更为严格。
语义容忍度
语义容忍度(Semantic Tolerance),反映了召回率(Recall),是一个用更广泛的视角评估相似性函数的概念,允许问题之间更广泛的语义相似性。 这种宽大处理可以带来更多匹配,从而有可能减少 LLM 的计算负载。 然而,它也可能导致匹配不太精确,从而影响生成响应的准确性和相关性。
语义抵抗
另一方面,与精确性相一致的语义抵抗采用更严格的相似性函数,缩小了被视为 “匹配” 的范围。这种严格性往往会在可能更高的计算成本的情况下产生更准确和相关的匹配,因为较少的存储问题可能符合严格的相似性标准。
与语义宽容性和语义抵抗之间的平衡,类似于召回和精确性之间的权衡,对于优化 Elasticsearch 缓存层的性能和效果至关重要。通过微调 KNN 搜索中的 similarity 参数,可以在特定的操作需求和用户期望方面找到这种权衡,使缓存机制达到最佳状态。
用 HR 示例说明语义相似性
为了更好地理解语义相似性的细微差别,让我们考虑一下公司环境中的一个常见场景:员工询问有关家庭活动(例如孩子的婚礼)的带薪休假 (PTO) 政策。 这里有两个这样的查询:
- [A]:“I have a wedding in the family, my son is getting married. Am I eligible for some PTO?(我家里要举行婚礼,我的儿子要结婚了。我有资格获得一些 PTO 吗?”
- [B] : “My child is getting married soon, can I take some PTO for the event? (我的孩子即将结婚,我可以请 PTO 参加婚礼吗?)”
乍一看,很明显这两个查询都在寻求相同的信息,尽管措辞不同。 我们的目标是确保系统能够识别这些查询的语义接近度,并提供一致且准确的响应,而不管措辞有何差异。
相似度参数对语义容忍度和抵抗的影响
在这种情况下,语义匹配的有效性受 Elasticsearch 中 KNN 搜索中 similarirty 参数的选择的影响。该参数确定被视为匹配所需的最小相似度。我们可以通过检查两个具有不同相似性阈值的假设情景来说明该参数的影响:
- 情景 A(高阈值 - 抵抗力):设置严格的相似度参数,比如说 0.95,封装语义抵抗力。这只允许具有高度相似性的查询检索缓存的答案,以提高精确度为代价来牺牲召回率。
- 情景 B(低阈值 - 容忍度):设置更宽松的相似度参数,比如说 0.75,封装语义容忍度。这允许更广泛的语义相关查询检索缓存的答案,有利于召回而不是精确度。
通过比较这些情景,我们可以观察相似度参数如何影响语义抵抗和语义容忍之间的平衡,以及随后召回率和精确率之间的权衡。下表说明了在这些情景下,根据查询与有关孩子婚礼 PTO 的原始查询的假设相似度分数,不同查询可能如何处理:
| Query | Hypothetical Similarity Score | Retrieved in Scenario A (High Threshold - 0.95) | Retrieved in Scenario B (Low Threshold - 0.75) |
|---|---|---|---|
| Can I take PTO for my son's wedding? | 0.94 | No | Yes |
| Is there a leave policy for family events? | 0.80 | No | Yes |
| I need time off for my daughter's marriage, is that possible? | 0.97 | Yes | Yes |
| How do I apply for leave for personal family occasions? | 0.72 | No | No |
| What's the process to get time off for family ceremonies? | 0.78 | No | Yes |
| Can I get some days off for my sibling's wedding? | 0.85 | No | Yes |
该表演示了不同的相似性阈值如何影响缓存答案的检索,显示了响应准确性(场景 A)和计算效率(场景 B)之间的权衡。
用例
最简单的应用程序之一是在新查询出现时存储问题和响应。当用户与人工智能模型交互时,他们的问题以及生成的答案都会被缓存。 随着时间的推移,这会构建一个有机缓存,随着每次用户交互而变得更加丰富和多样化。 这是一个双赢的局面。 未来的用户查询不仅可以从这些预先存在的知识财富中受益,而且还可以节省 token 成本并减少延迟。
另一个引人注目的用例是向系统预加载常见问题的答案。 如果你已经在监控用户输入的查询类型,则可以针对常见问题预先生成响应并存储它们以供立即检索。 这有双重目的:它可以实现更快的响应时间,并提供一个评估人工智能响应的质量和一致性的平台。 可以将其视为具有常见问题 (FAQ) 部分,但该部分具有令人难以置信的动态性并针对用户需求不断优化。
从用户问题中识别趋势和常见主题开辟了另一条实用途径。 通过分析问题及其相应的回答,你可以将这些数据反馈到生成模型中以进行摘要报告甚至基于主题的分组。 你还可以对存储的提示使用情绪分析来评估用户交互的语气和情绪。 这提供了一个有价值的分析层,可以为产品开发、客户服务改进甚至营销策略提供信息。
测试一下
虽然特定的应用程序取决于你的最终用例,但可以从此 Github 存储库复制示例设置。
考虑一个涉及查询响应计时指标的场景。 在没有缓存的第一次运行中,假设用户查询需要 300 毫秒才能从 RAG 接收生成的答案。 现在,将该响应存储在 Elasticsearch 中后,会出现第二个类似的查询。这一次,由于我们的智能缓存层,响应时间降至仅 50 毫秒。 这表明系统响应能力得到了切实的改进 —— 这对任何实时应用程序来说都是一个福音,也证明了所获得的成本和时间效率。
在示例项目中,你将找到两个主要文件。
elasticsearch_llm_cache.py 是包含 Python 类 ElasticsearchLLMCache 的示例存储库,你的应用程序将在启动时实例化该类。 该类包含以下方法:
- create_index 这将在 Elasticsearch 中创建一个新的缓存索引(如果不存在)
- query 执行 kNN 搜索,包括对提示进行向量化。 它将返回相似度范围内的前 k 个相似文档。
- add 通过调用 _generate_vector 对提示进行向量化,并以文本形式对提示和生成响应以及向量化提示进行索引
elasticRAG_with_cache.py 是一个利用 elasticsearch_llm_cache 的 Streamlit 应用程序示例。
但这不仅仅与速度有关;还与速度有关。 这也与见解有关。 如果你使用 Elasticsearch 的 Python 应用程序性能监控 (APM) 库,你可以获得有关查询时间、资源利用率甚至错误率的丰富指标。 这些数据对于持续的系统优化非常宝贵,并且可以成为寻求微调性能的数据科学家和工程师的宝库。 监控这些指标不仅可以改善用户体验,还可以更有效地管理资源。
这是一条 APM 跟踪,显示输入新提示(没有匹配的缓存)时所花费的时间。 我们可以看到,在此示例中,示例应用程序中从用户点击提交到应用程序从 GenAI 模式返回响应的总时间花费了 7,150 毫秒,即大约 7 秒。

现在,该提示和响应已缓存在 Elasticsearch 中以供将来使用,下面的 APM 跟踪显示了何时回答类似的提示。 这里我们看到,因为找到了足够接近的提示,所以我们可以直接返回之前生成的响应。 现在,此快捷方式的总时间为 124 毫秒。

通过查看这些示例用例,你可以清楚地看出,将 Elasticsearch 实现为缓存层不仅仅是一项学术练习;它也是一项实践。 它对性能、成本和用户体验具有现实意义。
总结
通过利用 Elasticsearch 作为向量数据库的功能及其相似性参数,我们为响应速度更快、更具成本效益且可扩展的生成 AI 系统打开了大门。 无论是改善查询时间、实现细致的匹配,还是通过人工监督增加另一层可靠性,其好处都是显而易见的。
准备好开始了吗? 查看 Python 库和示例代码并开始免费试用 Elastic Cloud。
原文:https://www.elastic.co/search-labs/elasticsearch-as-a-genai-caching-layer
相关文章:
Elasticsearch 作为 GenAI 缓存层
作者:JEFF VESTAL,BAHA AZARMI 探索如何将 Elasticsearch 集成为缓存层,通过降低 token 成本和响应时间来优化生成式 AI 性能,这已通过实际测试和实际实施进行了证明。 随着生成式人工智能 (GenAI) 不断革新从客户服务到数据分析…...
FPGA与STM32_FSMC总线通信实验
FPGA与STM32_FSMC总线通信实验 内部存储器IP核的参数设置创建IP核FPGA代码STM32标准库的程序 STM32F407 上自带 FSMC 控制器,通过 FSMC 总线的地址复用模式实现STM32 与 FPGA 之间的通信,FPGA 内部建立 RAM 块,FPGA 桥接 STM32 和 RAM 块&…...
maven配置自定义下载路径,以及阿里云下载镜像
1.配置文件 <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org…...
01.单一职责原则
单一职责原则 概述 简单来说就是一个类只描述一件事, 比如我们熟知的 userDao.java 只负责 用户域功能。如果userDao既操作user表又操作order表,这显然不合理。正确的做法是让orderDao.java去操作order表。 对类来说的,一个类应该只负责一项…...
RT-Thread上部署TinyMaix推理框架,使MCU赋予AI能力
概要 当谈到微控制器(MCU)和人工智能(AI)的结合,我们进入了一个激动人心的领域。传统上,AI应用程序需要大型计算机或云服务器的处理能力,但随着技术的发展,现在可以将AI嵌入到微控制器中。这为嵌入式系统、物联网设备、机器人和各种其他应用开启了新的可能性。 MCU A…...
设计模式 -- 策略模式(Strategy Pattern)
策略模式:一种行为型模式,这些设计模式特别关注对象之间的通信。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图:定义一系列的算…...
Spring Boot 集成 ElasticSearch
1 加入依赖 首先创建一个项目,在项目中加入 ES 相关依赖,具体依赖如下所示: <dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.1.0</version&g…...
百度智能云正式上线Python SDK版本并全面开源!
文章目录 1. SDK的优势2. 千帆SDK:快速落地LLM应用3. 如何快速上手千帆SDK3.1 SDK快速启动3.2 SDK进阶指引3.3 通过Langchain接入千帆SDK 4. 开源社区 百度智能云千帆大模型平台再次升级!在原有API基础上,百度智能云正式上线Python SDK&#…...
LeetCode(3)删除有序数组中的重复项【数组/字符串】【简单】
目录 1.题目2.答案3.提交结果截图 链接: 26. 删除有序数组中的重复项 1.题目 给你一个 非严格递增排列 的数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保…...
前端视角中的微信登录
目录 引入 流程介绍 具体实现 引入 本文主要讲解网站应用中微信登录的具体流程是怎么样的,以及作为前端开发人员在这整个流程中的主要任务是什么。 如果想要实现微信登录的功能,需要开发人员到微信开放平台注册相应的账号,进行注册应用&am…...
Python 中使用 Selenium 隐式等待
selenium 包用于使用 Python 脚本进行自动化和测试。 我们可以使用它来访问网页中的各个元素并使用它们。 该包中有许多方法可用于根据不同属性检索元素。 加载页面时,会动态检索一些元素。 与其他元素相比,这些元素的加载速度可能不同。 Python 中使用…...
GEE:基于 Landsat 计算的 kNDVI 应用 APP
作者:CSDN @ _养乐多_ 本文记录了在Google Earth Engine(GEE)平台中,使用 Landsat 遥感数据计算 kNDVI 的应用 APP 链接,并介绍该 APP 的使用方法和步骤。该APP可以为用户展示 NDVI 和 kNDVI 的遥感影像,进行对比分析。该 APP 在 Google Earth Engine(GEE)平台中实现。…...
Spring 缓存注解
Spring Cache 框架给我们提供了 Cacheable 注解用于缓存方法返回内容。但是 Cacheable 注解不能定义缓存有效期。这样的话在一些需要自定义缓存有效期的场景就不太实用。 按照 Spring Cache 框架给我们提供的 RedisCacheManager 实现,只能在全局设置缓存有效期。这…...
微信小程序前端开发
目录 前言: 1. 框架选择和项目搭建 2. 小程序页面开发 3. 数据通信和接口调用 4. 性能优化和调试技巧 5. 小程序发布和上线 前言: 当谈到微信小程序前端开发时,我们指的是使用微信小程序框架进行开发的一种方式。在本文中,我…...
C# OpenCvSharp DNN HybridNets 同时处理车辆检测、可驾驶区域分割、车道线分割
效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Numerics; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_D…...
无需开发,精臣云可轻松连接用户运营、广告推广等行业应用
精臣智慧标识科技有限公司简介 武汉精臣智慧标识科技有限公司,是国内便携式标签打印机创新品牌和实物管理解决方案服务商。在物品标签还处在繁琐的PC打印时代,精臣公司便创造性地从智能便携角度出发,顺应移动互联时代趋势,推出了…...
第三阶段第一章——PySpark实战
学习了这么多python的知识,是时候来搞点真玩意儿了~~ 春风得意马蹄疾,一日看尽长安花 o(* ̄︶ ̄*)o 1.前言介绍 (1)什么是spark Apache Spark是一个开源的分布式计算框架,用于处理大规模数据集的…...
Python数据容器(字符串)
字符串 1.字符串 字符串也是数据容器的一种,字符串是字符的容器,一个字符串可以存放任意数量的字符。 2.字符串的下标索引 从前向后,下标从0开始从后向前,下标从-1开始 # 通过下标索引获取特定位置的字符 name python print(na…...
Python---练习:把8名讲师随机分配到3个教室
案例:把8名讲师随机分配到3个教室 列表嵌套:有3个教室[[],[],[]],8名讲师[A,B,C,D,E,F,G,H],将8名讲师随机分配到3个教室中。 分析: 思考1:我们第一间教室、第二间教室、第三间教室,怎么表示…...
python+requests接口自动化测试
原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自动化框架,使用的是java语言,但对于一个学java&…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
