如何使用 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.rhkb.cn/news/29522.html

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

相关文章

【LTSPCIE】D触发器的搜索和使用

几乎没有D触发器的spice模型&#xff0c;不过LTSPICE里面自带一个D触发器 搜索&#xff1a;DFLOP 如下图&#xff08;这里必须吐槽一下LTSPICE的搜索功能&#xff0c;超级难用&#xff09; 但是接入电路后发现并不工作&#xff01;原因是还需要进行参数的设置。参考该篇文章L…

从零开始实现大语言模型(十四):高阶训练技巧

1. 前言 预训练大语言模型的流程与训练普通神经深度网络模型本质上并没有任何不同。可以使用深度学习实践中已经被证明非常有效的高阶训练技巧&#xff0c;优化大语言模型预训练流程&#xff0c;使大语言模型预训练效率更高&#xff0c;训练过程更稳定。 本文介绍深度学习领域…

鸿蒙HarmonyOS-Navagation基本用法

Navagation基本用法 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏&#xff0c;内容栏和公工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&am…

centos8更换阿里云yum源

1.centos8更换为阿里云yum源 2.更换阿里云Yum-centos8源 mv /etc/yum.repos.d/CentOS-Stream-BaseOS.repo /etc/yum.repos.d/CentOS-Stream-BaseOS.repo.backupcurl -o /etc/yum.repos.d/CentOS-Stream-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-8.repowget -O /et…

springboot-bug

spring boot :3.2.6该版本不与mybatis框架兼容&#xff0c;所以使用该版本时&#xff0c;请注意JDBC框架&#xff0c;要不然你会疑问&#xff0c;明明自己映射是对的&#xff0c;实体类是对的&#xff0c;各种东西都配好了&#xff0c;但就是报错&#xff0c;这是因为SpringBoo…

【HarmonyOS Next之旅】DevEco Studio使用指南(一)

目录 1 -> 工具简介 1.1 -> 概述 1.2 -> HarmonyOS应用/服务开发流程 1.2.1 -> 开发准备 1.2.2 -> 开发应用/服务 1.2.3 -> 运行、调试和测试应用/服务 1.2.4 -> 发布应用/服务 2 -> 工程介绍 2.1 -> APP包结构 2.2 -> 切换工程视图 …

2025网络安全工程师:软考新挑战与职业发展探析

网络安全工程师的崛起 随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;网络安全工程师这一职业逐渐受到社会各界的广泛关注。特别是在2025年&#xff0c;随着各项网络安全法规的完善和实施&#xff0c;网络安全工程师的角色愈发重要。他们不仅是企业信息…

【SpringMVC】深入解析@ RequestMapping 注解的概念及使用和 MVC 介绍

Spring Web MVC入门 1. Spring Web MVC 什么是 Spring Web MVC&#xff1f; MVC官方文档介绍 Spring Web MVC是Spring框架中的一个用来做网站开发的部分&#xff0c;它是基于Servlet技术的。 虽然它的正式名字叫“Spring Web MVC”&#xff0c;但大家一般都简称它“SpringMVC”…

高效编程指南:PyCharm与DeepSeek的完美结合

DeepSeek接入Pycharm 前几天DeepSeek的充值窗口又悄悄的开放了&#xff0c;这也就意味着我们又可以丝滑的使用DeepSeek的API进行各种辅助性工作了。本文我们来聊聊如何在代码编辑器中使用DeepSeek自动生成代码。 注&#xff1a;本文适用于所有的JetBrains开发工具&#xff0c…

deepseek使用记录18——艺术的追问

一 好的&#xff0c;基于前面学习结果&#xff0c;再写一篇有艺术美的文章 《美的起义》 凌晨四点的茶摊在电子支付二维码下苏醒&#xff0c;蒸腾的水汽中浮动着八百年前建盏的釉色。老板娘把栀子花插在共享单车车筐里&#xff0c;花瓣的弧度与北宋汝窑青瓷的冰裂纹暗合&…

Docker参数,以及仓库搭建

一。Docker的构建参数 注释&#xff1a; 1.对于CMD&#xff0c;如果不想显示&#xff0c;而是使用交互界面&#xff1a;docker run -ti --rm --name test2 busybox:v5 sh 2.对于CMD&#xff0c;一个交互界面只可以使用一个&#xff0c;如果想多次使用CMD&#xff0c;则用ENTR…

并发编程——累加器

目录 1 AtomicLong 1.1 核心功能 1.2 实现原理&#xff1a; (1&#xff09;基于 Unsafe 的底层操作 (2) volatile字段的内存可见性 (3&#xff09;CAS 操作与 ABA 问题 1.3 性能分析 1.4 使用场景 2 LongAdder 核心设计原理 1 分段存储 2 分散更新策略 3.处理高竞…

10 【HarmonyOS NEXT】 仿uv-ui组件开发之Avatar头像组件开发教程(一)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 目录 第一篇&#xff1a;Avatar 组件基础概念与设计1. 组件概述2. 接口设计2.1 形状类型定义2.2 尺寸类型定义2.3 组件属性接口 3. 设计原则4. 使用…

天津大学02-深度解读DeepSeek:部署、使用、安全【文末附下载链接】

大模型风险与不当用例——价值观错位 大模型与人类价值观、期望之间的不一致而导致的安全问题&#xff0c;包含&#xff1a;• 社会偏见&#xff08;Social Bias&#xff09;LLM在生成文本时强化对特定社会群体的刻板印象&#xff0c;例如将穆斯林与恐怖主义关联&#xff0c;或…

C#程序加密与解密Demo程序示例

目录 一、加密程序功能介绍 1、加密用途 2、功能 3、程序说明 4、加密过程 5、授权的注册文件保存方式 二、加密程序使用步骤 1、步骤一 ​编辑2、步骤二 3、步骤三 4、步骤四 三、核心代码说明 1、获取电脑CPU 信息 2、获取硬盘卷标号 3、机器码生成 3、 生成…

《Python实战进阶》No14: 使用Dask处理大规模数据集

文章特色&#xff1a; 包含3个核心代码块&#xff0c;覆盖延迟计算、分块策略和云原生集成4个架构图/监控面板示意图的占位说明对比表格清晰展示技术选型差异实战案例包含从数据读取到机器学习的完整流水线扩展思考部分引入最新云原生技术实践 Dask 是一个灵活的开源库&#…

React + React-intl @3.xx + TypeScript

声明&#xff1a;此篇文章使用的版本是 "react-intl": "^3.12.0"。 因为react-intl3.xx版本相较于react-intl2.xx版本差别较大&#xff0c;有些API是break change, 所以这篇文章的实现方式&#xff0c;不适用于react-intl2.xx版本。 一: 安装react-intl np…

TON基金会确认冠名赞助2025香港Web3嘉年华,并将于4月8日重磅呈现“TON生态日”

近日&#xff0c;由万向区块链实验室与HashKey Group联合推出的Web3年度盛典——2025香港Web3嘉年华正式宣布&#xff0c;TON基金会确认成为本届嘉年华的冠名赞助商&#xff0c;并将于4月8日在主会场特别举办“TON生态日”专题Side Event&#xff0c;集中展现TON生态的最新技术…

IDEA 基础配置: maven配置 | 服务窗口配置

文章目录 IDEA版本与MAVEN版本对应关系maven配置镜像源插件idea打开服务工具窗口IDEA中的一些常见问题及其解决方案IDEA版本与MAVEN版本对应关系 查找发布时间在IDEA版本之前的dea2021可以使用maven3.8以及以前的版本 比如我是idea2021.2.2 ,需要将 maven 退到 apache-maven-3.…

Mybatis详解-上

目录 Mybatis概述 快速入门 引入依赖 配置数据库参数 持久层代码 基本介绍 一个参数变量 多个参数变量 新增 将自增主键id赋值到userinfo对象里 参数重命名 删除 修改 查询 sql语句重命名的方法查询 指定结果映射关系 复用结果映射关系 驼峰转换 MyBatis的XM…