Observability:识别生成式 AI 搜索体验中的慢速查询

作者:Philipp Kahr

Elasticsearch Service 用户的重要注意事项:目前,本文中描述的 Kibana 设置更改仅限于 Cloud 控制台,如果没有我们支持团队的手动干预,则无法进行配置。 我们的工程团队正在努力消除对这些设置的限制,以便我们的所有用户都可以启用内部 APM。 本地部署不受此问题的影响。 

不久前,我们在 Elasticsearch® 中引入了检测,让你能够识别它在幕后所做的事情。 通过在 Elasticsearch 中进行追踪,我们获得了前所未有的见解。

当我们想要利用 Elastic 的学习稀疏编码器模型进行语义搜索时,本博客将引导你了解各种 API 和 transaction。 该博客本身可以应用于 Elasticsearch 内运行的任何机器学习模型- 你只需相应地更改命令和搜索即可。 本指南中的说明使用我们的稀疏编码器模型(请参阅文档)。

对于以下测试,我们的数据语料库是 OpenWebText,它提供大约 40GB 的纯文本和大约 800 万个单独的文档。 此设置在具有 32GB RAM 的 M1 Max Macbook 上本地运行。 以下任何交易持续时间、查询时间和其他参数仅适用于本博文。 不应对生产用途或你的安装进行任何推断。

让我们动手吧!

在 Elasticsearch 中激活跟踪是通过静态设置(在 elasticsearch.yml 中配置)和动态设置来完成的,动态设置可以在运行时使用 PUT _cluster/settings 命令进行切换(动态设置之一是采样率)。 某些设置可以在 runtime 时切换,例如采样率。 在elasticsearch.yml中,我们要设置以下内容:

tracing.apm.enabled: true
tracing.apm.agent.server_url: "url of the APM server"

秘密令牌(或 API 密钥)必须位于 Elasticsearch 密钥库中。 使用以下命令 elasticsearch-keystore add Tracing.apm.secret_token 或 tracing.apm.api_key ,密钥库工具应该可以在 <你的 elasticsearch 安装目录>/bin/elasticsearch-keystore 中使用。 之后,你需要重新启动 Elasticsearch。 有关跟踪的更多信息可以在我们的跟踪文档中找到。

激活后,我们可以在 APM 视图中看到 Elasticsearch 自动捕获各种 API 端点。 GET、POST、PUT、DELETE 调用。 整理好之后,让我们创建索引:

PUT openwebtext-analyzed
{"settings": {"number_of_replicas": 0,"number_of_shards": 1,"index": {"default_pipeline": "openwebtext"}},"mappings": {"properties": {"ml.tokens": {"type": "rank_features"},"text": {"type": "text","analyzer": "english"}}}
}

这应该给我们一个名为 PUT /{index} 的单个 transaction。 正如我们所看到的,当我们创建索引时发生了很多事情。 我们有创建调用,我们需要将其发布到集群状态并启动分片。

我们需要做的下一件事是创建一个摄取管道 —— 我们称之为 openwebtext。 管道名称必须在上面的索引创建调用中引用,因为我们将其设置为默认管道。 这可确保如果请求中未指定其他管道,则针对索引发送的每个文档都将自动通过此管道运行。

PUT _ingest/pipeline/openwebtext
{"description": "Elser","processors": [{"inference": {"model_id": ".elser_model_1","target_field": "ml","field_map": {"text": "text_field"},"inference_config": {"text_expansion": {"results_field": "tokens"}}}}]
}

我们得到一个 PUT /_ingest/pipeline/{id} transaction。 我们看到集群状态更新和一些内部调用。 至此,所有准备工作都已完成,我们可以开始使用 openwebtext 数据集运行批量索引。

在开始批量摄入之前,我们需要启动 ELSER 模型。 转到 “Maching Learning(机器学习)”、“Trained Models(训练模型)”,然后单击 “Play(播放)”。 你可以在此处选择分配和线程的数量。

模型启动被捕获为 POST /_ml/trained_models/{model_id}/deployment/_start。 它包含一些内部调用,可能不如其他事务那么有趣。

现在,我们想通过运行以下命令来验证一切是否正常。 Kibana 开发工具有一个很酷的小技巧,你可以在文本的开头和结尾使用三引号(如”””),告诉 Kibana® 将其视为字符串并在必要时转义。 不再需要手动转义 JSON 或处理换行符。 只需输入你的文字即可。 这应该返回一个文本和一个显示所有令牌的 ml.tokens 字段。 

POST _ingest/pipeline/openwebtext/_simulate
{"docs": [{"_source": {"text": """This is a sample text"""}}]
}

此调用也被捕获为 transaction POST _ingest/pipeline/{id}/_simulate。 有趣的是,我们看到推理调用花费了 338 毫秒。 这是模型创建向量所需的时间。

Bulk 摄入

openwebtext 数据集有一个文本文件,代表 Elasticsearch 中的单个文档。 这个相当 hack 的 Python 代码读取所有文件并使用简单的批量助手将它们发送到 Elasticsearch。 请注意,你不想在生产中使用它,因为它以序列化方式运行,因此速度相对较慢。 我们有并行批量帮助程序,允许你一次运行多个批量请求。

import os
from elasticsearch import Elasticsearch, helpers# Elasticsearch connection settings
ES_HOST = 'https://localhost:9200'  # Replace with your Elasticsearch host
ES_INDEX = 'openwebtext-analyzed'  # Replace with the desired Elasticsearch index name# Path to the folder containing your text files
TEXT_FILES_FOLDER = 'openwebtext'# Elasticsearch client
es = Elasticsearch(hosts=ES_HOST, basic_auth=('elastic', 'password'))def read_text_files(folder_path):for root, _, files in os.walk(folder_path):for filename in files:if filename.endswith('.txt'):file_path = os.path.join(root, filename)with open(file_path, 'r', encoding='utf-8') as file:content = file.read()yield {'_index': ES_INDEX,'_source': {'text': content,}}def index_to_elasticsearch():try:helpers.bulk(es, read_text_files(TEXT_FILES_FOLDER), chunk_size=25)print("Indexing to Elasticsearch completed successfully.")except Exception as e:print(f"Error occurred while indexing to Elasticsearch: {e}")if __name__ == "__main__":index_to_elasticsearch()

我们看到这 25 个文档需要 11 秒才能被索引。 每次摄取管道调用推理处理器(进而调用机器学习模型)时,我们都会看到该特定处理器需要多长时间。 在本例中,大约需要 500 毫秒 — 25 个文档,每个文档约 500 毫秒,总共需约 12.5 秒来完成处理。 一般来说,这是一个有趣的观点,因为较长的文件可能会花费更多的时间,因为与较短的文件相比,需要分析的内容更多。 总体而言,整个批量请求持续时间还包括返回给 Python 代理的答案以及 “确定” 索引。 现在,我们可以创建一个仪表板并计算平均批量请求持续时间。 我们将在 Lens 中使用一些小技巧来计算每个文档的平均时间。 我会告诉你如何做。

首先,在事务中捕获了一个有趣的元数据 - 该字段称为 labels.http_request_headers_content_length。 该字段可能被映射为关键字,因此不允许我们运行求和、求平均值和除法等数学运算。 但由于运行时字段,我们不介意这一点。 我们可以将其转换为 Double。 在 Kibana 中,转到包含 traces-apm 数据流的数据视图,并执行以下操作作为值:

emit(Double.parseDouble($('labels.http_request_headers_content_length','0.0')))

如果该字段不存在和/或丢失,则将现有值作为 Double 发出(emit),并将报告为 0.0。 此外,将格式设置为 Bytes。 这将使它自动美化! 它应该看起来像这样:

创建一个新的仪表板,并从新的可视化开始。 我们想要选择指标可视化并使用此 KQL 过滤器:data_stream.type: "traces" AND service.name: "elasticsearch" AND transaction.name: "PUT /_bulk"。 在数据视图中,选择包含 traces-apm 的那个,与我们在上面添加字段的位置基本相同。 单击 Prmary metricfomula: 

sum(labels.http_request_headers_content_length_double)/(count()*25)

由于我们知道每个批量请求包含 25 个文档,因此我们只需将记录数(transaction 数)乘以 25,然后除以字节总和即可确定单个文档有多大。 但有一些注意事项 - 首先,批量请求会产生开销。 批量看起来像这样:

{ "index": { "_index": "openwebtext" }
{ "_source": { "text": "this is a sample" } }

对于要索引的每个文档,你都会获得 JSON 中的第二行,该行会影响总体大小。 更重要的是,第二个警告是压缩。 当使用任何压缩时,我们只能说 “这批文档的大小为 x”,因为压缩的工作方式会根据批量内容而有所不同。 当使用高压缩值时,我们发送 500 个文档时可能会得到与现在发送 25 个文档相同的大小。 尽管如此,这是一个有趣的指标。

 

我们可以使用 transaction.duration.us 提示! 将 Kibana 数据视图中的格式更改为 Duration 并选择 microseconds,确保其渲染良好。 很快,我们可以看到,批量请求的平均大小约为 125kb,每个文档约为 5kb,耗时 9.6 秒,其中 95% 的批量请求在 11.8 秒内完成。

 

查询时间!

现在,我们已经对许多文档建立了索引,终于准备好对其进行查询了。 让我们执行以下查询:

GET /openwebtext/_search
{"query":{"text_expansion":{"ml.tokens":{"model_id":".elser_model_1","model_text":"How can I give my cat medication?"}}}
}

我正在向 openwebtext 数据集询问有关给我的猫喂药的文章。 我的 REST 客户端告诉我,整个搜索(从开始到解析响应)花费了:94.4 毫秒。 响应中的语句为 91 毫秒,这意味着在 Elasticsearch 上的搜索花费了 91 毫秒(不包括一些内容)。 现在让我们看看 GET /{index}/_search transaction。

我们可以发现,机器学习(基本上是动态创建令牌)的影响占总请求的 74 毫秒。 是的,这大约占整个交易持续时间的 3/4。 有了这些信息,我们就可以就如何扩展机器学习节点以缩短查询时间做出明智的决策。

结论

这篇博文向你展示了将 Elasticsearch 作为仪表化应用程序并更轻松地识别瓶颈是多么重要。 此外,你还可以使用事务持续时间作为异常检测的指标,为你的应用程序进行 A/B 测试,并且再也不用怀疑 Elasticsearch 现在是否感觉更快了。 你有数据支持这一点。 此外,这广泛地关注了机器学习方面的问题。 查看一般慢日志查询调查博客文章以获取更多想法。

仪表板和数据视图可以从我的 Github 存储库导入。

原文:Identify slow queries in generative AI search experiences | Elastic Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 整合MyBatis

整合MyBatis 官方文档&#xff1a;http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/ Maven仓库地址&#xff1a;https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter/2.1.3 整合测试 导入 MyBatis 所需要的…

数据结构笔记--优先队列(大小根堆)经典题型

1--项目的最大利润 题目描述&#xff1a; 输入&#xff1a;正数数组 costs&#xff0c;costs[i] 表示项目 i 的花费&#xff1b;正数数组 profits&#xff0c;profits[i] 表示项目 i 的花费&#xff1b;正数 k 表示只能串行完成最多 k 个项目&#xff1b;m 表示拥有的资金&…

leetcode 516. 最长回文子序列(JAVA)题解

题目链接https://leetcode.cn/problems/longest-palindromic-subsequence/description/?utm_sourceLCUS&utm_mediumip_redirect&utm_campaigntransfer2china 目录 题目描述&#xff1a; 暴力递归&#xff1a; 动态规划&#xff1a; 题目描述&#xff1a; 给你一个…

百日筑基篇——python爬虫学习(一)

百日筑基篇——python爬虫学习&#xff08;一&#xff09; 文章目录 前言一、python爬虫介绍二、URL管理器三、所需基础模块的介绍1. requests2. BeautifulSoup1. HTML介绍2. 网页解析器 四、实操1. 代码展示2. 代码解释1. 将大文件划分为小的文件&#xff08;根据AA的ID数量划…

简单认识Zabbix监控系统及配置

文章目录 一、zabbix概述1、定义2、zabbix监控原理3、监控对象4、zabbix的3种架构&#xff08;1&#xff09; C/S架构&#xff08;2&#xff09;分布式架构&#xff1a;zabbix-proxy-client架构&#xff08;3&#xff09; master-node-client架构 5、zabbix监控模式 二、部署za…

项目实战 — 消息队列(8){网络通信设计①}

目录 一、自定义应用层协议 &#x1f345; 1、格式定义 &#x1f345; 2、准备工作 &#x1f384;定义请求和响应 &#x1f384; 定义BasicArguments &#x1f384; 定义BasicReturns &#x1f345; 2、创建参数类 &#x1f384; 交换机 &#x1f384; 队列 &#x1f38…

【网络】传输层——TCP(滑动窗口流量控制拥塞控制延迟应答捎带应答)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 上篇文章对TCP可靠性机制讲解了一部分&#xff0c;这篇文章接着继续讲解。 &#x1f3a8;滑动窗口 在…

Springboot 实践(2)MyEclipse2019创建项目修改pom文件,加载springboot 及swagger-ui jar包

MyEclipse2019创建工程之后&#xff0c;需要添加Springboot启动函数、添加application.yml配置文件、修改pom文件添加项目使用的jar包。 添加Springboot启动函数 创建文件存储路径 &#xff08;1&#xff09;右键单击“src/main/java”文件夹&#xff0c;弹出对话框输入路径…

05 - 研究 .git 目录

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 1. HEAD2. config3. refs4. objects 1. HEAD 2. config 3. refs 4. objects Git对象一共有三种&#xff1a;数据对象 blob、树对象 tree以及提交对象 commit&#xff0c;这些对象都被保…

深入探析设计模式:工厂模式的三种姿态

深入探析设计模式&#xff1a;工厂模式的三种姿态 1. 简单工厂模式1.1 概念1.2 案例1.3 优缺点 2. 抽象工厂模式2.1 概念2.2 案例&#xff1a;跨品牌手机生产2.3 优缺点 3. 超级工厂模式3.1 概念3.2 案例&#xff1a;动物园游览3.3 优缺点 4. 总结 欢迎阅读本文&#xff0c;今天…

go入门实践四-go实现一个简单的tcp-socks5代理服务

文章目录 前言socks协议简介go实现一个简单的socks5代理运行与压测抓包验证 前言 SOCKS是一种网络传输协议&#xff0c;主要用于客户端与外网服务器之间通讯的中间传递。协议在应用层和传输层之间。 本文使用先了解socks协议。然后实现一个socks5的tcp代理服务端。最后&#…

21款美规奔驰GLS450更换中规高配主机,汉化操作更简单

很多平行进口的奔驰GLS都有这么一个问题&#xff0c;原车的地图在国内定位不了&#xff0c;语音交互功能也识别不了中文&#xff0c;原厂记录仪也减少了&#xff0c;使用起来也是很不方便的。 可以实现以下功能&#xff1a; ①中国地图 ②语音小助手&#xff08;你好&#xf…

运维监控学习笔记8

在服务器端&#xff0c;我们添加了nginx-server的主机&#xff1a; 在解决Error问题的过程中&#xff0c;我还通过zabbix_get这个命令进行了测试&#xff0c;发现是没有的&#xff0c;后来确认是在web页面配置的过程中&#xff0c;我输错了密码。 yum install zabbix-getzabbi…

uniapp-原生地图截屏返回base64-进行画板编辑功能

一、场景 vue写uniapp打包安卓包&#xff0c;实现原生地图截屏&#xff08;andirod同事做的&#xff09;-画板编辑功能 实现效果&#xff1a; 二、逻辑步骤简略 1. 由 原生地图nvue部分&#xff0c;回调返回 地图截屏生成的base64 数据&#xff0c; 2. 通过 uni插件市场 im…

《图解HTTP》——HTTP协议详解

一、HTTP协议概述 HTTP是一个属于应用层的面向对象协议&#xff0c;由于其简捷、快速的方式&#xff0c;适用于分布式超媒体信息系统。它于1990年提出&#xff0c;经过几年的使用与发展&#xff0c;得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版&#xff0c;HTTP…

SQL 语句解析过程详解

SQL 语句解析过程详解&#xff1a; 1&#xff0e;输入SQL语句 2&#xff0e;词法分析------flex 使用词法分析器&#xff08;由Flex生成&#xff09;将 SQL 语句分解为一个个单词&#xff0c;这些单词被称为“标记“。标记包括关键字、标识符、运算符、分隔符等。 2.1 flex 原…

20个互联网用户Python数据分析项目

这篇文章给大家整理了20个互联网用户数据分析的项目。所有收录的项目&#xff0c;进行了严格的筛选&#xff0c;标准有二&#xff1a; 1.有解说性文字&#xff0c;大家能知道每一步在干嘛&#xff0c;新手友好 2.数据集公开&#xff0c;保证大家可以在原文的基础上自行探索 更…

[保研/考研机试] KY96 Fibonacci 上海交通大学复试上机题 C++实现

题目链接&#xff1a; KY96 Fibonacci https://www.nowcoder.com/share/jump/437195121692000803047 描述 The Fibonacci Numbers{0,1,1,2,3,5,8,13,21,34,55...} are defined by the recurrence: F00 F11 FnFn-1Fn-2,n>2 Write a program to calculate the Fibon…

【STM32】FreeRTOS互斥量学习

互斥量&#xff08;Mutex&#xff09; 互斥量又称互斥信号量&#xff08;本质也是一种信号量&#xff0c;不具备传递数据功能&#xff09;&#xff0c;是一种特殊的二值信号量&#xff0c;它和信号量不同的是&#xff0c;它支持互斥量所有权、递归访问以及防止优先级翻转的特性…

人文景区有必要做VR云游吗?如何满足游客出行需求?

VR云游在旅游行业中的应用正在快速增长&#xff0c;为游客带来沉浸式体验的同时&#xff0c;也为文旅景区提供了新的营销方式。很多人说VR全景展示是虚假的&#xff0c;比不上真实的景区触感&#xff0c;人文景区真的有必要做VR云游吗&#xff1f;我的答案是很有必要。 如果你认…