如何使用 LLM 生成的術語自動在搜索應用程序上構建 autocomplete 功能

作者:來自 Elastic?Michael Supangkat

了解如何在 Elastic Cloud 中,通過使用 LLM 生成的詞匯,為搜索應用增強自動補全功能,實現更智能、更動態的搜索建議。

自動補全是搜索應用中的一項關鍵功能,它通過在用戶輸入時實時提供建議,顯著提升用戶體驗。傳統上,Elasticsearch 的自動補全功能是通過補全建議器(completion suggester)實現的,它依賴于預定義的詞匯。這種方式需要人工整理建議詞匯,且往往缺乏上下文的相關性。通過調用 OpenAI 的 completion 接口生成 LLM 詞匯,我們可以構建一個更加智能、可擴展且自動化的自動補全功能。

用 LLM 強化你的搜索自動補全功能

在本文中,我們將探討:

  • 在 Elasticsearch 中實現自動補全的傳統方法
  • 如何通過集成 OpenAI 的 LLM 提升補全建議的質量
  • 如何結合 Elastic Cloud 的 Ingest PipelineInference Endpoint 實現可擴展的方案

Elasticsearch 傳統的自動補全方式

在 Elasticsearch 中構建自動補全的常見做法是,在索引映射中定義一個補全字段(completion field)。這樣 Elasticsearch 就可以基于預定義的詞匯提供建議。
這種方法實現起來非常直接,尤其是當你的數據集相對靜態,并且已經準備好了完整的建議詞列表時。

實現步驟

  1. 創建一個包含 completion 字段的索引。
  2. 手動整理并維護建議詞列表,并將其存儲到索引中。
  3. 使用補全建議器(completion suggester)查詢,獲取相關建議。

示例:傳統自動補全設置

首先,創建一個名為 products_test 的索引。在這個索引中,我們定義一個名為 suggest 的字段,類型為 completion,該字段專門用于快速自動補全建議。

PUT /products_test
{"mappings": {"properties": {"suggest": { "type": "completion" }}}
}

products_test 索引中插入一個測試文檔。suggest 字段存儲多個補全建議詞。

PUT /products_test/_doc/1
{"suggest": ["MacBook Air M2", "Apple Laptop", "Lightweight Laptop"]
}

最后,我們使用?completion suggester?查詢來搜索以 “MacB” 開頭的建議詞。

前綴 “MacB” 將匹配到 “MacBook Air M2”。

POST /products_test/_search
{"suggest": {"search-suggestion": {"prefix": "MacB","completion": { "field": "suggest" }}}
}

suggest 部分包含匹配到的建議詞。

options 包含一個匹配建議的數組,其中 "text": "MacBook Air M2" 是最優先的建議結果。

  "took": 2,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 0,"relation": "eq"},"max_score": null,"hits": []},"suggest": {"search-suggestion": [{"text": "MacB","offset": 0,"length": 4,"options": [{"text": "MacBook Air M2","_index": "products_test","_id": "1","_score": 1,"_source": {"suggest": ["MacBook Air M2","Apple Laptop","Lightweight Laptop"]}}]}]}
}

雖然這種方法有效,但它依賴于手動整理不斷更新建議詞匯,且無法動態適應新產品或描述的變化。

更多有個 autocomplete 的文章,請在 “Elastic:開發者上手指南”?里查找 “autocomplete"。

用 OpenAI LLM 增強自動補全功能

在某些場景中,數據集會頻繁變化,這就需要你不斷更新有效的建議詞列表。當出現新的產品、名稱或術語時,你必須手動將它們添加到建議列表中。

這正是 LLM 發揮作用的地方 —— 它可以基于真實世界的知識最新數據,動態生成相關補全詞匯。

通過調用 OpenAI 的?completion?接口,我們可以基于產品名稱和描述動態生成自動補全建議。這帶來的好處包括:

  • 自動生成同義詞和相關術語
  • 基于產品描述的上下文感知建議
  • 無需手動維護詞表,系統更加可擴展

基于 LLM 的自動補全實現步驟

  1. 使用 OpenAI 的 completion API 創建一個推理端點(Inference Endpoint)。
  2. 配置一個 Elasticsearch ingest pipeline,在 pipeline 中使用腳本處理器(script processor),調用 OpenAI 接口并使用預定義 prompt 獲取補全建議。
  3. 將生成的建議詞存儲到帶有?completion?字段的 Elasticsearch 索引中。
  4. 使用搜索請求獲取動態補全結果。

以上所有步驟都可以通過在?Kibana Dev Tools?中逐步復制粘貼 API 請求完成。

在本示例中,我們使用的是?gpt-4o-mini?模型。你需要提前獲取你的 OpenAI API 密鑰。登錄你的 OpenAI 賬號,然后訪問 https://platform.openai.com/api-keys,創建一個新的密鑰或使用已有密鑰。

創建推理端點(Inference Endpoint)

首先,我們需要創建一個推理端點

這個端點讓我們可以通過 API 與機器學習模型(這里是 OpenAI)無縫交互,同時還能保持在 Elastic 的界面中進行操作。

PUT _inference/completion/openai-completion
{"service": "openai","service_settings": {"api_key": "<insert_your_api_key>","model_id": "gpt-4o-mini"}
}

設置 Elasticsearch Ingest Pipeline

通過設置一個 ingest pipeline,我們可以在數據索引時進行處理。在這個案例中,pipeline 被命名為 autocomplete-LLM-pipeline,并包含以下內容:

  1. 腳本處理器(script processor):定義我們發送給 OpenAI 的 prompt,以獲取建議詞列表。產品名稱和產品描述作為動態值包含在 prompt 中。
  2. 推理處理器(inference processor):引用我們之前創建的 OpenAI 推理端點。該處理器接收來自腳本處理器的 prompt 作為輸入,將其發送到 LLM 模型,并將結果存儲在一個名為 results 的輸出字段中。
  3. 分割處理器(split processor):將 LLM 輸出的文本結果分割成逗號分隔的數組,以適應 suggest 類型字段的格式。
  4. 2 個刪除處理器(remove processors):在填充 suggest 字段后,刪除 promptresults 字段。
PUT _ingest/pipeline/autocomplete-LLM-pipeline
{"processors": [{"script": {"source": "\n    ctx.prompt = 'Based on the following product name and product description, create relevant autocomplete suggestion terms from the following product, including the exact product name itself as the first term, synonyms of the product category, and keywords which might commonly be used when searching the following product:' + '\\\\n Product Name:\\\\n' + ctx.ProductName + '\\\\nProduct Description:\\\\n' + ctx.Description + '\\\\nJust include the suggestion terms in the response, as an array encapsulated in double quotes and separated by commas without any prefix or numbering'\n    "}},{"inference": {"model_id": "openai-completion","input_output": {"input_field": "prompt","output_field": "results"}}},{"split": {"field": "results","separator": ",","target_field": "suggest"}},{"remove": {"field": "prompt"}},{"remove": {"field": "results"}}]
}

為了能讓讓大家把上面的 prompt 看得更清楚,我們在下面重新粘貼:

ctx.prompt = 'Based on the following product name and product description, create relevant autocomplete suggestion terms from the following product, including the exact product name itself as the first term, synonyms of the product category, and keywords which might commonly be used when searching the following product:' + '\\\\n Product Name:\\\\n' + ctx.ProductName + '\\\\nProduct Description:\\\\n' + ctx.Description + '\\\\nJust include the suggestion terms in the response, as an array encapsulated in double quotes and separated by commas without any prefix or numbering'\n

更多有關在 ingest pipeline 里調用 LLM 的示例,我們可以閱讀 “分面搜索:利用人工智能改善搜索范圍和結果”。

索引示例文檔

在這個示例中,我們使用 documents API 通過開發工具手動將文檔索引到一個臨時索引中,名為 'products'
需要注意的是,這并不是我們最終用于自動補全的索引。

PUT products/_doc/1
{"ProductName": "MacBook Air M2","Description": "The MacBook Air M2 is a powerful, ultra-portable laptop designed to deliver exceptional performance, all while maintaining an ultra-slim profile. Powered by Apple’s latest M2 chip, this lightweight machine is perfect for both work and play, combining top-tier performance with impressive battery life"
}

創建帶有 Completion 類型映射的索引

現在,我們將創建實際用于自動補全的索引,該索引包含一個名為 suggestcompletion 類型字段

PUT products_with_suggestion
{"mappings": {"properties": {"suggest": { "type": "completion" } }}
}

通過 Ingest Pipeline 重新索引文檔到指定索引

在這一步中,我們將之前創建的 products 索引中的數據重新索引到實際的自動補全索引 products_with_suggestion,并通過 autocomplete-LLM-pipeline 進行處理。

該 pipeline 將處理來自原始索引的示例文檔,并將結果填充到目標索引中的 suggest 自動補全字段。

POST _reindex?slices=auto&wait_for_completion=false
{"source": {"index": "products"},"dest": {"index": "products_with_suggestion","pipeline": "autocomplete-LLM-pipeline"}
}

展示自動補全建議

如下所示,新的索引 products_with_suggestion 現在包含一個名為 suggest 的新字段,該字段包含由 OpenAI LLM 生成的詞匯或同義詞數組。

你可以運行以下請求來檢查:

GET products_with_suggestion/_search

結果:

{"hits": [{"ProductName": "MacBook Air M2","Description": "The MacBook Air M2 is a powerful, ultra-portable laptop designed to deliver exceptional performance, all while maintaining an ultra-slim profile. Powered by Apple’s latest M2 chip, this lightweight machine is perfect for both work and play, combining top-tier performance with impressive battery life","suggest": ["MacBook Air M2","ultra-portable laptop","lightweight laptop","performance laptop","Apple laptop","M2 chip laptop","thin laptop","best laptop for work","laptop with long battery life","powerful lightweight laptop","Apple MacBook","MacBook Air","laptop for students","portable computer","laptop for professionals"]},{"ProductName": "DKNY Unisex Black & Grey Printed Medium Trolley Bag","Description": "Black and grey printed medium trolley bag, secured with a TSA lockOne handle on the top and one on the side, has a trolley with a retractable handle on the top and four corner mounted inline skate wheelsOne main zip compartment, zip lining, two compression straps with click clasps, one zip compartment on the flap with three zip pocketsWarranty: 5 yearsWarranty provided by Brand Owner / Manufacturer","suggest": ["DKNY Unisex Black & Grey Printed Medium Trolley Bag","medium trolley bag","travel bag","luggage","roller bag","printed suitcase","black and grey suitcase","trolley luggage","travel trolley","carry-on trolley","retractable handle bag","inline skate wheels bag","TSA lock luggage","zip compartment suitcase","compression straps bag","soft sided luggage","durable travel bag","wheeled duffel bag","luggage with warranty","brand name luggage"]}]
}

請注意,即使使用相同的 prompt,LLM 生成的詞匯也不總是相同的。你可以檢查生成的詞匯,看看它們是否適合你的搜索用例。如果不符合需求,你可以選擇修改腳本處理器中的 prompt,以獲得更可預測和一致的建議詞匯。

測試自動補全搜索

現在,我們可以使用 completion suggester 查詢來測試自動補全功能。下面的示例還包括一個 fuzzy 參數,通過處理搜索查詢中的小拼寫錯誤來提升用戶體驗。你可以在開發工具中執行以下查詢,并查看建議結果。

POST /products_with_suggestion/_search
{"suggest": {"search-suggestion": {"prefix": "lugg","completion": {"field": "suggest","fuzzy": { "fuzziness": 1 }}}}
}

為了可視化自動補全結果,我實現了一個簡單的搜索欄,它通過客戶端在 Elastic Cloud 中針對自動補全索引執行查詢。隨著用戶輸入,搜索會基于 LLM 生成的建議列表中的詞匯返回結果。

通過 OpenAI 推理集成進行擴展

通過在 Elastic Cloud 中將 OpenAI 的 completion API 作為推理端點,我們可以高效地擴展這個解決方案:

  • 推理端點 允許自動化和可擴展的 LLM 建議生成,而無需手動創建和維護建議詞匯列表。
  • Ingest Pipeline 確保在索引過程中實時豐富數據。
  • 腳本處理器(Script Processor)在 ingest pipeline 中允許輕松編輯 prompt,以便在需要時更具體地定制建議列表的內容。
  • Pipeline 執行 還可以直接配置為索引模板,以進一步實現自動化。這使得隨著新產品的添加,建議列表可以動態生成。

在成本效率方面,模型只在索引過程中調用,這意味著它的使用隨著處理的文檔數量而擴展,而不是搜索量。因此,預計用戶增長或搜索活動增加時,這種方法比在搜索時運行模型節省更多的成本。

結論

傳統的自動補全依賴于手動定義的詞匯,這既有限制又勞動密集。通過利用 OpenAI 生成的 LLM 建議,我們可以選擇自動化并增強自動補全功能,提升搜索相關性和用戶體驗。此外,使用 Elastic 的 ingest pipeline 和推理端點集成,確保了自動化和可擴展的自動補全系統。

總的來說,如果你的搜索用例需要一套非常具體的建議,且是從一個經過精心維護和整理的列表中提取的,按照本文第一部分的描述,通過 API 批量導入建議詞匯仍然是一個很好的高效選擇。如果管理和更新建議列表是一個痛點,那么基于 LLM 的補全系統通過自動生成上下文相關的建議,省去了手動輸入的麻煩。

Elasticsearch 提供了與行業領先的生成 AI 工具和供應商的本地集成。可以查看我們的網絡研討會,了解如何超越 RAG 基礎,或構建適合生產的 Elastic 向量數據庫應用。

為了為你的用例構建最佳的搜索解決方案,立即開始免費云試用,或嘗試在本地機器上運行 Elastic。

原文:How to build autocomplete feature on search application automatically using LLM generated terms - Elasticsearch Labs

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72603.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72603.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72603.shtml

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

相關文章

MAVEN手動配置(阿里云)全教程

介于網上各種各樣的MAVEN配置過程中方法大致相同卻細節參差不齊&#xff0c;我總結了我遇見的一些問題&#xff0c;來完全的解決MAVEN手動配置的全過程&#xff0c;以及分享解決小毛病的經驗。 所需材料&#xff1a; MAVEN3.9.9&#xff08;下載適合自己的版本即可&#xff09…

DeepSeek 3FS:端到端無緩存的存儲新范式

在 2025 年 2 月 28 日&#xff0c;DeepSeek 正式開源了其高性能分布式文件系統 3FS【1】&#xff0c;作為其開源周的壓軸項目&#xff0c;3FS 一經發布便引發了技術圈的熱烈討論。它不僅繼承了分布式存儲的經典設計&#xff0c;還通過極簡卻高效的架構&#xff0c;展現了存儲技…

HarmonyOS:如何將圖片轉為PixelMap并進行圖片緩存策略

前言&#xff1a;在HarmonyOS項目開發中&#xff0c;我們使用Ark-Ts語言開發項目。我們有個功能是拍照&#xff0c;除了正常顯示出來&#xff0c;并且上傳服務器。我在開發過程中&#xff0c;遇到的問題是&#xff0c;如果離開這個頁面再回到當前頁面仍要顯示圖片&#xff0c;那…

2025.3.9機器學習筆記:文獻閱讀

2025.3.9周報 一、文獻閱讀題目信息摘要Abstract創新點網絡架構實驗結論不足以及展望 一、文獻閱讀 題目信息 題目&#xff1a; Time-series generative adversarial networks for flood forecasting期刊&#xff1a; Journal of Hydrology作者&#xff1a; Peiyao Weng, Yu …

linux固定IP并解決虛擬機無法ping其他電腦問題

linux固定IP并解決虛擬機無法ping其他電腦問題 1.找到網卡文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 2.編輯文件信息 BOOTPROTO 這個dhcp改為static#添加以下內容IPADDR<你的IP地址>NETMASK<子網掩碼>&#xff0c;例如255.255.255.0。GATEWAY<網…

Spring實戰spring-ai運行

目錄 1. 配置 2 .搭建項目 3. 查看對應依賴 3.1 OpenAI 依賴 3.2 配置 OpenAI API 密鑰 application.properties application.yml 4. openai實戰 5. 運行和測試 6. 高級配置 示例&#xff1a;配置模型和參數 解釋&#xff1a; 7. 處理異常和錯誤 示例&#xff1a;…

docker:配置 Docker 鏡像加速器

1 鏡像加速器介紹 默認情況下&#xff0c;將來從docker hub&#xff08;https://hub.docker.com/&#xff09;上下載docker鏡像&#xff0c;太慢。一般都會配置鏡像加速器&#xff1a; USTC&#xff1a;中科大鏡像加速器&#xff08;https://docker.mirrors.ustc.edu.cn&…

[內網安全] Windows 本地認證 — NTLM 哈希和 LM 哈希

關注這個專欄的其他相關筆記&#xff1a;[內網安全] 內網滲透 - 學習手冊-CSDN博客 0x01&#xff1a;SAM 文件 & Windows 本地認證流程 0x0101&#xff1a;SAM 文件簡介 Windows 本地賬戶的登錄密碼是存儲在系統本地的 SAM 文件中的&#xff0c;在登錄 Windows 的時候&am…

算法-圖-dijkstra 最短路徑

理論知識 dijkstra三部曲 樸素版dijkstra 模擬過程 堆優化版dijksra 經典模版例題 Dijkstra求最短路 I 參加科學大會&#xff08;第六期模擬筆試&#xff09;--模版題 網絡延遲 ref 理論知識 最短路是圖論中的經典問題即&#xff1a;給出一個有向圖&#xff0c;一…

Qt添加MySql數據庫驅動

文章目錄 一. 安裝MySql二.編譯mysql動態鏈接庫 Qt版本&#xff1a;5.14.2 MySql版本&#xff1a;8.0.41 一. 安裝MySql 參考這里進行安裝&#xff1a;https://blog.csdn.net/qq_30150579/article/details/146042922 將mysql安裝目錄里的bin&#xff0c;include和lib拷貝出來…

淺論數據庫聚合:合理使用LambdaQueryWrapper和XML

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、數據庫聚合替代內存計算&#xff08;關鍵優化&#xff09;二、批量處理優化四、區域特殊處理解耦五、防御性編程增強 前言 技術認知點&#xff1a;使用 XM…

Ubuntu 22.04安裝NVIDIA A30顯卡驅動

一、安裝前準備 1.禁用Nouveau驅動 Ubuntu默認使用開源Nouveau驅動&#xff0c;需要手動禁用&#xff1a; vim /etc/modprobe.d/blacklist-nouveau.conf # 添加以下內容&#xff1a; blacklist nouveau options nouveau modeset0 # 更新內核并重啟&#xff1a; update-initr…

Docker Desktop 4.38 安裝與配置全流程指南(Windows平臺)

一、軟件定位與特性 Docker Desktop 是容器化應用開發與部署的一體化工具&#xff0c;支持在本地環境創建、管理和運行Docker容器。4.38版本新增GPU加速支持、WSL 2性能優化和Kubernetes 1.28集群管理功能&#xff0c;適用于微服務開發、CI/CD流水線搭建等場景。 二、安裝環境…

音視頻入門基礎:RTP專題(15)——FFmpeg源碼中,獲取RTP的視頻信息的實現

一、引言 通過FFmpeg命令可以獲取到SDP文件描述的RTP流的視頻壓縮編碼格式、色彩格式&#xff08;像素格式&#xff09;、分辨率、幀率信息&#xff1a; ffmpeg -protocol_whitelist "file,rtp,udp" -i XXX.sdp 本文以H.264為例講述FFmpeg到底是從哪個地方獲取到這…

深度學習---卷積神經網絡

一、卷積尺寸計算公式 二、池化 池化分為最大池化和平均池化 最常用的就是最大池化&#xff0c;可以認為最大池化不需要引入計算&#xff0c;而平均池化需要引出計算&#xff08;計算平均數&#xff09; 每種池化還分為Pooling和AdaptiveAvgPool Pooling(2)就是每2*2個格子…

netty中Future和ChannelHandler

netty中的Future&#xff0c;繼承自 jdk中的Future&#xff0c;&#xff0c; jdk中的Future&#xff0c;很垃圾&#xff0c;只能同步阻塞獲取結果&#xff0c;&#xff0c;&#xff0c; netty中的Future進行了升級&#xff0c;&#xff0c;可以addListener()異步獲取結果&…

java 初學知識點總結

自己總結著玩 1.基本框架 public class HelloWorld{ public static void main(String[] args){ }//類名用大寫字母開頭 } 2.輸入&#xff1a; (1)Scanner:可讀取各種類型&#xff0c;字符串相當于cin>>; Scanner anew Scanner(System.in); Scan…

質量屬性場景描述

為了精確描述軟件系統的質量屬性&#xff0c;通常采用質量屬性場景&#xff08;Quality Attribute Scenario&#xff09;作為描述質量屬性的手段。質量屬性場景是一個具體的質量屬性需求&#xff0c;使利益相關者與系統的交互的簡短陳述。 質量屬性場景是一種用于描述系統如何…

數據可攜帶權的多重價值與實踐思考

文章目錄 前言一、數據可攜帶權的提出與立法二、數據可攜帶權的多重價值1、推動數據要素市場化配置2、促進市場競爭與創新3、強化個人數據權益 三、數據可攜帶權的實踐挑戰1、數據安全與隱私保護面臨風險2、接口差異導致數據遷移成本高昂3、可攜帶的數據范圍尚存爭議 數據可攜帶…

藍橋每日打卡--分考場

#藍橋#JAVA#分考場 題目描述 n個人參加某項特殊考試。 為了公平&#xff0c;要求任何兩個認識的人不能分在同一個考場。 求是少需要分幾個考場才能滿足條件。 輸入描述 輸入格式&#xff1a; 第一行&#xff0c;一個整數n(1≤n≤100)&#xff0c;表示參加考試的人數。 …