如何使用 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI学习有感

和前辈聊天&#xff0c;谈到了现在的ai技术&#xff0c;这里对那天的谈话进行总结&#xff1a; AI是无状态的 我们在使用ai时有时候会有一个错觉&#xff0c;认为和ai聊天久了&#xff0c;ai就会像人与人之间交流一样&#xff0c;会保留一种对聊天对象的认知状态&#xff0c;这…

Java 8 Stream API 详解

目录 引言 一、Stream 简介 1.1 什么是 Stream&#xff1f; 1.2 Stream 与集合的区别 1.3 Stream 的操作分类 二、Stream 的创建 2.1 从集合创建 2.2 从数组创建 2.3 使用 Stream.of 创建 2.4 使用 Stream.generate 或 Stream.iterate 创建 三、Stream 的常…

Ubuntu20.04本地配置IsaacLab 4.2.0的G1训练环境(一)

Ubuntu20.04本地配置IsaacLab的G1训练环境&#xff08;一&#xff09; 配置Omniverse环境配置IsaacSim配置IsaacLab 写在前面&#xff0c;如果Ubuntu剩余空间低于60G&#xff0c;则空间不足&#xff0c;除非你不需要资产包。但资产包中却包含了G1模型、Go2模型等机器人模型和代…

从厨电模范到数字先锋,看永洪科技如何助力方太集团开启数字新征程

在数字化洪流席卷全球的宏大背景下&#xff0c;企业转型升级的紧迫性与重要性日益凸显&#xff0c;成为驱动行业进步的关键引擎。在这一波澜壮阔的转型浪潮中&#xff0c;方太集团——厨电领域的璀璨明珠&#xff0c;以其前瞻性的战略视野和不懈的创新精神&#xff0c;携手数据…

蓝桥杯4T平台(串口打印电压值)

知识点&#xff1a;串口(单片机发送数据)按键ADC 题目 配置 代码 adc.c uint16_t getadc2(void) {uint16_t adc0;HAL_ADC_Start(&hadc2);adcHAL_ADC_GetValue(&hadc2);return adc; } adc.h uint16_t getadc2(void); main.c #include "lcd.h" #include…

[Computer Vision]实验七:图像检索

目录 一、实验内容 二、实验过程 2.1 准备数据集 2.2 SIFT特征提取 2.3 学习“视觉词典”&#xff08;vision vocabulary&#xff09; 2.4 建立图像索引并保存到数据库中 2.5 用一幅图像查询 三、实验小结 一、实验内容 实现基于颜色直方图、bag of word等方法的以图搜…

利用 ArcGIS Pro 快速统计省域各市道路长度的实操指南

在地理信息分析与处理的工作中&#xff0c;ArcGIS Pro 是一款功能强大的 GIS 软件&#xff0c;它能够帮助我们高效地完成各种复杂的空间数据分析任务。 现在&#xff0c;就让我们一起深入学习如何借助 ArcGIS Pro 来统计省下面各市的道路长度&#xff0c;这一技能在城市规划、…

关于后端接口的返回值问题

1、后端接口中&#xff0c;get请求能返回给前端一个整数么&#xff1f; 问题说明&#xff1a; 解释&#xff1a; 在 Spring MVC 项目中&#xff0c;GET 请求的后端接口可以返回一个整数给前端。因为我们在controller层中&#xff0c;设置了RestController注解&#xff0c;这表明…

React Native 实现滑一点点内容区块指示器也滑一点点

效果图如上&#xff0c;内容滑一点点&#xff0c;指示器也按比例话一点点&#xff0c;列表宽度跟数据有关。 实现思路如下&#xff1a; 1.监听列表滑动事件&#xff0c;获取列表横向滑动距离&#xff0c;假设为A&#xff1b; 2.获取列表的宽度&#xff0c;及列表可滑动的宽度…

Cursor + IDEA 双开极速交互

相信很多开发者朋友应该和我一样吧&#xff0c;都是Cursor和IDEA双开的开发模式:在Cursor中快速编写和生成代码&#xff0c;然后在IDEA中进行调试和优化 在这个双开模式的开发过程中&#xff0c;我就遇到一个说大不大说小不小的问题&#xff1a; 得在两个编辑器之间来回切换查…

JS一些小知识点

一、|| 运算符 plain this.ctx.body { type: type || 0, // ||在此处用法用于默认值填充&#xff0c;判断是否传参或该值是否存在&#xff0c;如果不存在就使用||后买你的值作为默认值 code: code || 0, msg: msg || SUCCESS, data: data || {}, ...others }; 二、trim() 方…

【孟德尔随机化】PhenoScanner不能用的,替代方法

https://ldlink.nih.gov/?tabldtrait 目前PhenoScanner数据库限制使用&#xff0c;可选择LDlink数据库替代。 可以在网页下载变异数据 还有就是library(gwasrapidd)包提取 # remotes::install_github("ramiromagno/gwasrapidd") library(gwasrapidd)# 官方文档写单…

ALG(Alloy+Loki+Grafana)轻量级日志系统

ALG(AlloyLokiGrafana)轻量级日志系统 前提要求 GrafanaMinioNginxPrometheus Grafana日志收集系统旧版是PLG(ProtailLokiGrafana), Protail收集日志, Loki存储, Grafana展示, 后续的Protail不维护了, Grafana推出了Alloy代替Pritial, 除了收集日志外, 还集成管理Prometheus各种…

捣鼓180天,我写了一个相册小程序

&#x1f64b;为什么要做土著相册这样一个产品&#xff1f; ➡️在高压工作之余&#xff0c;我喜欢浏览B站上的熊猫幼崽视频来放松心情。有天在家族群里看到了大嫂分享的侄女卖萌照片&#xff0c;同样感到非常解压。于是开始翻阅过去的聊天记录&#xff0c;却发现部分图片和视…

JDK ZOOKEEPER KAFKA安装

JDK17下载安装 mkdir -p /usr/local/develop cd /usr/local/develop 将下载的包上传服务器指定路径 解压文件 tar -zxvf jdk-17.0.14_linux-x64_bin.tar.gz -C /usr/local/develop/ 修改文件夹名 mv /usr/local/develop/jdk-17.0.14 /usr/local/develop/java17 配置环境变量…

5c/c++内存管理

1. C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof(int) * 4);i…

Tomcat-web服务器介绍以及安装部署

一、Tomcat简介 Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用…

国产编辑器EverEdit - 超多样式设置

1 设置-编辑-样式 1.1 设置说明 1.1.1 折叠样式 默认为箭头&#xff0c;折叠样式选项如下&#xff1a; 箭头&#xff1a; 矩形和线条 五边形 圆形图标 1.1.2 光标样式 光标用于指示当前用户输入位置&#xff0c;光标样式选项如下&#xff1a; 默认 纤细 字宽 …

【DeepSeek】5分钟快速实现本地化部署教程

一、快捷部署 &#xff08;1&#xff09;下载ds大模型安装助手&#xff0c;下载后直接点击快速安装即可。 https://file-cdn-deepseek.fanqiesoft.cn/deepseek/deepseek_28348_st.exe &#xff08;2&#xff09;打开软件&#xff0c;点击立即激活 &#xff08;3&#xff09;选…

2025系统架构师(一考就过):(2016-2017)案例+论文历年真题及解析系列二

24、管道-过滤器风格 和 数据仓库风格 对比(2016真题) 比较因素管道-过滤器风格数据仓储风格交互方式顺序结构或有限的循环结构星型数据结构数据流文件或模型控制结构数据流驱动业务功能驱动扩展方法接口适配模型适配25、用例及其关系、类及其关系(2016真题) 用例是对系统…