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.pswp.cn/news/36260.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36260.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36260.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp動態底部tab欄

實現思路&#xff1a; 創建一個js文件用來存放所有的tabbar,不同的數組表示不同的tabbar組合。 創建一個vue文件用來制作底部tabbar組件。 使用vuex存儲用戶的身份信息,根據身份信息切換tabbar組合。 具體步驟&#xff1a; 新建一個tabbar.js文件&#xff0c;將…

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 表示擁有的資金&…

MySQL事務:確保數據完整性與并發性的關鍵

MySQL事務&#xff1a;確保數據完整性與并發性的關鍵 MySQL作為一種廣泛使用的開源關系型數據庫管理系統&#xff0c;具備強大的事務支持&#xff0c;以確保數據庫操作的一致性、隔離性和持久性。本文將深入探討MySQL中的事務概念、事務隔離級別以及事務的應用場景&#xff0c…

leetcode 516. 最長回文子序列(JAVA)題解

題目鏈接https://leetcode.cn/problems/longest-palindromic-subsequence/description/?utm_sourceLCUS&utm_mediumip_redirect&utm_campaigntransfer2china 目錄 題目描述&#xff1a; 暴力遞歸&#xff1a; 動態規劃&#xff1a; 題目描述&#xff1a; 給你一個…

Python學習過程筆記:主模塊(main) 異常處理 命令行參數解析 日志記錄 socket模塊 類的私有方法 字節字符串

文章目錄 1.Python中的主程序2.Python中的異常處理3.Python中的命令行參數解析4.Python中的日志記錄5.網絡編程socket模塊6.Python中的私有方法7.Python中的字節字符串 1.Python中的主程序 if __name__ __main__在Python中&#xff0c;if __name__ __main__ 是一個常見的代碼…

百日筑基篇——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;彈出對話框輸入路徑…

Android 簡單的視頻、圖片壓縮工具

首頁需要壓縮的工具包 1.Gradle implementation com.iceteck.silicompressorr:silicompressor:2.2.3 2.添加相關權限&#xff08;手機得動態申請權限&#xff09; <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/> <uses-p…

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;這些對象都被保…

Vue 目錄結構 vite 項目

Vue3 項目常用的目錄結構和每個文件的作用【通過 vite 創建的項目】 vite目錄結構&#xff1a; dist // 打包后生成的文件目錄 node_modules // 環境依賴 public // 公共資源目錄 favicon.ico …

深入探析設計模式:工廠模式的三種姿態

深入探析設計模式&#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代理服務端。最后&#…

英語詞法——代詞

代詞是用來代替名詞、起名詞作用的短語、分句和句子的詞。英語中代詞根據其意義和作用可分為九類:人稱代詞、物主代詞、反身代詞、相互代詞、指示代詞、疑問代詞、不定代詞、關系代詞和連接代詞。 第一節 人稱代詞 一、人稱代詞的形式和用法 人稱代詞單數復數第一人稱第二人…

【ARM 嵌入式 編譯系列 4 -- GCC 編譯屬性 __read_mostly 詳細介紹】

文章目錄 __read_mostly 介紹__read_mostly 在 linux 中的使用.data.read_mostly 介紹 __read_mostly 介紹 __read_mostly 是一個在Linux內核編程中用到的宏定義&#xff0c;這是一個gcc編譯器的屬性&#xff0c;用于告訴編譯器此變量主要用于讀取&#xff0c;很少進行寫入&am…

MYSQL中用字符串2022-07去匹配Date類型大于2022-07-01并小于2022-07-31

正文 需求上&#xff0c;是有個日期字符串&#xff0c;例如2022-07&#xff0c;代表著年月。數據庫中表對于這個字段存的是年月日&#xff0c;例如&#xff1a;2022-07-15。 我希望的是&#xff1a;獲取到2022-07-01到2022-07-31&#xff0c;之間的數據&#xff0c;條件是&…

21款美規奔馳GLS450更換中規高配主機,漢化操作更簡單

很多平行進口的奔馳GLS都有這么一個問題&#xff0c;原車的地圖在國內定位不了&#xff0c;語音交互功能也識別不了中文&#xff0c;原廠記錄儀也減少了&#xff0c;使用起來也是很不方便的。 可以實現以下功能&#xff1a; ①中國地圖 ②語音小助手&#xff08;你好&#xf…