如何自动化同义词并使用我们的 Synonyms API 进行上传

作者:来自 Elastic Andre Luiz

了解如何使用 LLM 来自动识别和生成同义词, 使术语可以通过程序方式加载到 Elasticsearch 同义词 API 中。

提高搜索结果的质量对于提供高效的用户体验至关重要。优化搜索的一种方法是通过同义词自动扩展查询词。这样可以更广泛地解释查询内容,覆盖语言变体,从而改进结果匹配。

本博客探讨了如何利用 大语言模型(LLMs) 自动识别和生成同义词,使这些术语可以通过程序方式加载到 Elasticsearch 的 synonym API 中。

何时使用同义词?

使用 同义词 相较于 向量搜索 是一种更快速且更具成本效益的解决方案。它的实现更简单,因为它不需要深入了解 embeddings 或复杂的向量摄取过程。

此外,同义词的 资源消耗更低,因为向量搜索需要更大的存储空间和内存来进行 embedding 索引和检索。

另一个重要方面是 搜索的区域化。通过 同义词,可以根据本地语言和习惯调整术语,这在 embeddings 可能无法匹配地区表达或特定国家术语的情况下非常有用。例如,一些单词或缩写在不同地区可能有不同的含义,但本地用户通常会将它们视为同义词:

  • 巴西,"abacaxi" 和 "ananás" 都指 菠萝(pineapple),但在东北部,第二个词更常见。

  • 在巴西东南部,常见的 "pão francês"(法式面包)在东北部可能被称为 "pão careca"。

这种 区域化 的差异使得 同义词 在搜索优化中发挥关键作用。

如何使用 LLMs 生成同义词?

为了自动获取同义词, 你可以使用 LLMs, 这些模型可以分析术语的上下文并建议合适的变体。 这种方法可以动态扩展同义词, 确保更广泛和更精准的搜索, 而无需依赖固定的词典。

在本示例中, 我们将使用 LLM 来为 电商产品 生成同义词。 许多搜索由于查询词的不同变体而返回较少甚至没有结果。 通过 同义词, 我们可以解决这个问题。 例如, 搜索 "smartphone" 时, 结果可以涵盖不同型号的手机, 确保用户能够找到他们需要的产品。

先决条件

在开始之前, 需要设置环境并定义所需的依赖项。 我们将使用 Elastic 提供的解决方案 在 Docker 中本地运行 Elasticsearch 和 Kibana。 代码将使用 Python v3.9.6 编写,并需要以下依赖项:

pip install openai==1.59.8 elasticsearch==8.15.1

创建产品索引

首先, 我们将创建一个不支持同义词的产品索引。 这将使我们能够验证查询, 然后将其与包含同义词的索引进行比较。

要创建索引, 我们使用以下命令在 Kibana DevTools 中批量加载产品数据集:

POST _bulk
{"index": {"_index": "products", "_id": 10001}}
{"category": "Electronics", "name": "iPhone 14 Pro"}
{"index": {"_index": "products", "_id": 10007}}
{"category": "Electronics", "name": "MacBook Pro 16-inch"}
{"index": {"_index": "products", "_id": 10013}}
{"category": "Electronics", "name": "Samsung Galaxy Tab S8"}
{"index": {"_index": "products", "_id": 10037}}
{"category": "Electronics", "name": "Apple Watch Series 8"}
{"index": {"_index": "products", "_id": 10049}}
{"category": "Electronics", "name": "Kindle Paperwhite"}
{"index": {"_index": "products", "_id": 10067}}
{"category": "Electronics", "name": "Samsung QLED 4K TV"}
{"index": {"_index": "products", "_id": 10073}}
{"category": "Electronics", "name": "HP Spectre x360 Laptop"}
{"index": {"_index": "products", "_id": 10079}}
{"category": "Electronics", "name": "Apple AirPods Pro"}
{"index": {"_index": "products", "_id": 10115}}
{"category": "Electronics", "name": "Amazon Echo Show 10"}
{"index": {"_index": "products", "_id": 10121}}
{"category": "Electronics", "name": "Apple iPad Air"}
{"index": {"_index": "products", "_id": 10127}}
{"category": "Electronics", "name": "Apple AirPods Max"}
{"index": {"_index": "products", "_id": 10151}}
{"category": "Electronics", "name": "Sony WH-1000XM4 Headphones"}
{"index": {"_index": "products", "_id": 10157}}
{"category": "Electronics", "name": "Google Pixel 6 Pro"}
{"index": {"_index": "products", "_id": 10163}}
{"category": "Electronics", "name": "Apple MacBook Air"}
{"index": {"_index": "products", "_id": 10181}}
{"category": "Electronics", "name": "Google Pixelbook Go"}
{"index": {"_index": "products", "_id": 10187}}
{"category": "Electronics", "name": "Sonos Beam Soundbar"}
{"index": {"_index": "products", "_id": 10199}}
{"category": "Electronics", "name": "Apple TV 4K"}
{"index": {"_index": "products", "_id": 10205}}
{"category": "Electronics", "name": "Samsung Galaxy Watch 4"}
{"index": {"_index": "products", "_id": 10211}}
{"category": "Electronics", "name": "Apple MacBook Pro 16-inch"}
{"index": {"_index": "products", "_id": 10223}}
{"category": "Electronics", "name": "Amazon Echo Dot (4th Gen)"}

使用 LLM 生成同义词

在此步骤中, 我们将使用 LLM 动态生成同义词。 为此, 我们将集成 OpenAI API, 定义合适的模型和提示词。 LLM 将接收产品类别和名称, 确保生成的同义词在上下文中具有相关性。

import json
import loggingfrom openai import OpenAIdef call_gpt(prompt, model):try:logging.info("generate synonyms by llm...")response = client.chat.completions.create(model=model,messages=[{"role": "user", "content": prompt}],temperature=0.7,max_tokens=1000)content = response.choices[0].message.content.strip()return contentexcept Exception as e:logging.error(f"Failed to use model: {e}")return Nonedef generate_synonyms(category, products):synonyms = {}for product in products:prompt = f"You are an expert in generating synonyms for products. Based on the category and product name provided, generate synonyms or related terms. Follow these rules:\n"prompt += "1. **Format**: The first word should be the main item (part of the product name, excluding the brand), followed by up to 3 synonyms separated by commas.\n"prompt += "2. **Exclude the brand**: Do not include the brand name in the synonyms.\n"prompt += "3. **Maximum synonyms**: Generate a maximum of 3 synonyms per product.\n\n"prompt += f"The category is: **{category}**, and the product is: **{product}**. Return only the synonyms in the requested format, without additional explanations."response = call_gpt(prompt, "gpt-4o")synonyms[product] = responsereturn synonyms

从创建的产品索引中, 我们将检索 "Electronics"(电子产品) 类别中的所有商品, 并将它们的名称发送到 LLM。 预期的输出将类似于:

{"iPhone 14 Pro": ["iPhone", "smartphone", "mobile", "handset"],"MacBook Pro 16-inch": ["MacBook", "Laptop", "Notebook", "Ultrabook"],"Samsung Galaxy Tab S8": ["Tab", "Tablet", "Slate", "Pad"],"Bose QuietComfort 35 Headphones": ["Headphones", "earphones", "earbuds", "headset"]
}

使用生成的同义词, 我们可以通过 Synonyms API 将它们注册到 Elasticsearch 中。

使用 Synonyms API 管理同义词

Synonyms API 提供了一种有效的方式, 让我们直接在系统中管理同义词集合。 每个同义词集合由同义词规则组成, 在这些规则中,一组词在搜索中被视为等同。

创建同义词集合的示例

PUT _synonyms/my-synonyms-set
{"synonyms_set": [{"id": "rule-1","synonyms": "hello, hi"},{"synonyms": "bye, goodbye"}]
}

​这将创建一个名为 “my-synonyms-set” 的同义词集,其中将 “hello” 和“ hi” 视为同义词,“bye” 和 “goodbye” 也视为同义词。

实现产品目录的同义词创建

以下是负责构建同义词集并将其插入 Elasticsearch 的方法。 同义词规则是基于 LLM 提供的同义词映射生成的。 每条规则都有一个 ID,对应于产品名称的 slug 格式,以及由 LLM 计算得出的同义词列表。

import json
import loggingfrom elasticsearch import Elasticsearch
from slugify import slugifyes = Elasticsearch("http://localhost:9200",api_key="your_api_key"
)def mount_synonyms(results):synonyms_set = [{"id": slugify(product), "synonyms": synonyms} for product, synonyms inresults.items()]try:response = es.synonyms.put_synonym(id="products-synonyms-set",synonyms_set=synonyms_set)logging.info(json.dumps(response.body, indent=4))return response.bodyexcept Exception as e:logging.error(f"Error create synonyms: {str(e)}")return None

以下是创建同义词集的请求负载:

{"synonyms_set":[{"id": "iphone-14-pro","synonyms": "iPhone, smartphone, mobile, handset"},{"id": "macbook-pro-16-inch","synonyms": "MacBook, Laptop, Notebook, Computer"},{"id": "samsung-galaxy-tab-s8","synonyms": "Tablet, Slate, Pad, Device"},{"id": "garmin-forerunner-945","synonyms": "Forerunner, smartwatch, fitness watch, GPS watch"},{"id": "bose-quietcomfort-35-headphones","synonyms": "Headphones, Earphones, Headset, Cans"}]
}

在集群中创建了同义词集后,我们可以进入下一步,即使用定义的同义词集创建一个带有同义词支持的新索引。

下面是使用 LLM 生成的同义词和通过 Synonyms API 定义的同义词集创建的完整 Python 代码:

import json
import loggingfrom elasticsearch import Elasticsearch
from openai import OpenAI
from slugify import slugifylogging.basicConfig(level=logging.INFO)client = OpenAI(api_key="your-key",
)es = Elasticsearch("http://localhost:9200",api_key="your_api_key"
)def call_gpt(prompt, model):try:logging.info("generate synonyms by llm...")response = client.chat.completions.create(model=model,messages=[{"role": "user", "content": prompt}],temperature=0.7,max_tokens=1000)content = response.choices[0].message.content.strip()return contentexcept Exception as e:logging.error(f"Failed to use model: {e}")return Nonedef generate_synonyms(category, products):synonyms = {}for product in products:prompt = f"You are an expert in generating synonyms for products. Based on the category and product name provided, generate synonyms or related terms. Follow these rules:\n"prompt += "1. **Format**: The first word should be the main item (part of the product name, excluding the brand), followed by up to 3 synonyms separated by commas.\n"prompt += "2. **Exclude the brand**: Do not include the brand name in the synonyms.\n"prompt += "3. **Maximum synonyms**: Generate a maximum of 3 synonyms per product.\n\n"prompt += f"The category is: **{category}**, and the product is: **{product}**. Return only the synonyms in the requested format, without additional explanations."response = call_gpt(prompt, "gpt-4o")synonyms[product] = responsereturn synonymsdef get_products(category):query = {"size": 50,"_source": ["name"],"query": {"bool": {"filter": [{"term": {"category.keyword": category}}]}}}response = es.search(index="products", body=query)if response["hits"]["total"]["value"] > 0:product_names = [hit["_source"]["name"] for hit in response["hits"]["hits"]]return product_nameselse:return []def mount_synonyms(results):synonyms_set = [{"id": slugify(product), "synonyms": synonyms} for product, synonyms inresults.items()]try:es_client = get_client_es()response = es_client.synonyms.put_synonym(id="products-synonyms-set",synonyms_set=synonyms_set)logging.info(json.dumps(response.body, indent=4))return response.bodyexcept Exception as e:logging.error(f"Erro update synonyms: {str(e)}")return Noneif __name__ == '__main__':category = "Electronics"products = get_products("Electronics")llm_synonyms = generate_synonyms(category, products)mount_synonyms(llm_synonyms)

创建支持同义词的索引

将创建一个新索引,其中所有来自 products 索引的数据将被重新索引。该索引将使用 synonyms_filter,该过滤器应用之前创建的 products-synonyms-set

下面是配置为使用同义词的索引映射:

PUT products_02
{"settings": {"analysis": {"filter": {"synonyms_filter": {"type": "synonym","synonyms_set": "products-synonyms-set","updateable": true}},"analyzer": {"synonyms_analyzer": {"type": "custom","tokenizer": "standard","filter": ["lowercase","synonyms_filter"]}}}},"mappings": {"properties": {"ID": {"type": "long"},"category": {"type": "keyword"},"name": {"type": "text","analyzer": "standard","search_analyzer": "synonyms_analyzer"}}}
}

重新索引 products 索引

现在,我们将使用 Reindex API 将数据从 products 索引迁移到新的 products_02 索引,该索引包括同义词支持。以下代码在 Kibana DevTools 中执行:

POST _reindex
{"source": {"index": "products"},"dest": {"index": "products_02"}
}

迁移后,products_02 索引将被填充并准备好验证使用配置的同义词集的搜索。

使用同义词验证搜索

让我们比较两个索引之间的搜索结果。我们将在两个索引上执行相同的查询,并验证是否使用同义词来检索结果。

在 products 索引中搜索(没有同义词)

我们将使用 Kibana 执行搜索并分析结果。在 Analytics > Discovery 菜单中,我们将创建一个数据视图来可视化我们创建的索引中的数据。

Discovery 中,点击 Data View 并定义名称和索引模式。对于 "products" 索引,我们将使用 "products" 模式。然后,我们将重复这个过程,为 "products_02" 索引创建一个新的数据视图,使用 "products_02" 模式。

配置好数据视图后,我们可以返回 Analytics > Discovery 并开始验证。

在这里,选择 DataView products 并搜索术语 "tablet" 后,我们没有得到任何结果,尽管我们知道有像 "Kindle Paperwhite""Apple iPad Air" 这样的产品。

products_02 索引中搜索(支持同义词)

在支持同义词的 "products_synonyms" 数据视图上执行相同的查询时,产品成功地被检索到了。这证明了配置的同义词集正常工作,确保搜索词的不同变体返回预期的结果。

我们可以通过直接在 Kibana DevTools 中运行相同的查询来实现相同的结果。只需使用 Elasticsearch Search API 搜索 products_02 索引:

结论

在 Elasticsearch 中实现同义词提高了产品目录搜索的准确性和覆盖面。关键的区别在于使用了 LLM,它自动且上下文相关地生成同义词,消除了预定义列表的需求。该模型分析了产品名称和类别,确保了与电子商务相关的同义词。

此外,Synonyms API 简化了词典管理,允许动态修改同义词集。通过这种方法,搜索变得更加灵活,能够适应不同的用户查询模式。

这一过程可以通过新数据和模型调整不断改进,确保越来越高效的研究体验。

参考资料

在本地运行 Elasticsearch
Run Elasticsearch locally | Elasticsearch Guide [8.17] | Elastic

Synonyms API
Synonyms APIs | Elasticsearch Guide [8.17] | Elastic

想获得 Elastic 认证?了解下次 Elasticsearch 工程师培训的时间!

Elasticsearch 拥有丰富的新功能,帮助你为使用案例构建最佳搜索解决方案。深入了解我们的示例笔记本,了解更多内容,开始免费云试用,或立即在本地机器上尝试 Elastic。

原文:How to automate synonyms and upload using our Synonyms API - Elasticsearch Labs

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

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

相关文章

boost.asio

as(async):异步 同步io: reactor (非阻塞)(需要注册一次,在等待消息时可以干别的事) 阻塞io网络模型 接口:read\accept\connect\write 接口返回时,io完成 异步…

数据库后续

-- 添加作者字段 alter table t_hero add author varchar(100); -- 更新数据 update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id 3; upd…

计算机网络基础:网络流量工程与优化策略

计算机网络基础:网络流量工程与优化策略 一、前言二、网络流量工程基础2.1 网络流量工程的定义与目标2.2 网络流量的测量与分析2.2.1 常用的流量测量方法2.2.2 流量数据分析三、网络流量工程的优化策略3.1 链路负载均衡策略3.1.1 基于目的地址的负载均衡3.1.2 基于流量权重的负…

H5DS编辑器教程——H5页面触发动画实战指南

在 H5 页面设计中,触发动画通过动态交互提升用户体验,成为吸引注意力的关键手段。H5DS 编辑器作为一款高效的可视化工具,提供了丰富的动画制作功能,即使是零基础用户也能轻松实现专业级效果。 使用工具:H5DS编辑器 触…

什么是具身智能

具身智能(Embodied Intelligence)是人工智能与机器人学交叉的前沿领域,强调智能体通过身体与环境的动态交互实现自主学习和进化,其核心在于将感知、行动与认知深度融合‌。通俗地讲,就是机器人或者智能系统在物理环境中…

Java实现pdf中动态插入图片

今天接到一个需求&#xff0c;需要在pdf中的签名处&#xff0c;插入签名照片&#xff0c;但签名位置不固定&#xff0c;话不多说上代码&#xff1a; 1、首先引入itextpdf依赖包&#xff1a; <dependency><groupId>com.itextpdf</groupId><artifactId>…

MySQL8.4 InnoDB Cluster高可用集群使用指南

简介 高可用方案 Orchestrator&#xff1a; 可视化 Web 界面管理 MySQL 拓扑结构&#xff0c;并且兼容多种复制架构&#xff08;异步、半同步、GTID&#xff09;&#xff0c;提供自动和手动的故障转移。但是8.0.21后 MySQL 更新了主从复制相关命令&#xff0c;Orchestrator无…

从泛读到精读:合合信息文档解析如何让大模型更懂复杂文档

从泛读到精读&#xff1a;合合信息文档解析如何让大模型更懂复杂文档 一、引言&#xff1a;破解文档“理解力”瓶颈二、核心功能&#xff1a;合合信息的“破局”亮点功能亮点1&#xff1a;复杂图表的高精度解析图表解析&#xff1a;为大模型装上精准“标尺”表格数据精准还原 功…

git:远程仓库拉取到本地,fork到本地,修改后再上传

讲述仓库成员拉取远程仓库&#xff08;即组长的仓库&#xff0c;里面有成员&#xff09;到本地&#xff0c;修改内容再上传的详细步骤&#xff1a; 1.进入仓库&#xff0c;首先fork &#xff08;如不&#xff0c;所作操作会直接对远程仓库进行&#xff0c;不用管理员审核&…

windows清除电脑开机密码,可保留原本的系统和资料,不重装系统

前言 很久的一台电脑没有使用了&#xff0c;开机密码忘了&#xff0c;进不去系统 方法 1.将一个闲置u盘设置成pe盘&#xff08;注意&#xff0c;这个操作会清空原来u盘的数据&#xff0c;需要在配置前将重要数据转移走&#xff0c;数据无价&#xff0c;别因为配置这个丢了重…

频谱分析仪的最大保持功能

专门应用于例如遥控器之类的&#xff0c;按一下&#xff0c;一瞬间出现的信号的测量。 把仪器连接天线&#xff0c;观测空间中的一些信号&#xff0c;比如WIFI的信号&#xff0c;我们可以看到仪器接收到的信号其实是一直变化的&#xff0c;并不是每一次扫描都能扫到我们想要的这…

智能粉尘监测解决方案|守护工业安全,杜绝爆炸隐患

在厂房轰鸣的生产线上&#xff0c;一粒微小粉尘的聚集可能成为一场灾难的导火索。如何实现粉尘浓度的精准监控与快速响应&#xff1f;我们为您打造了一套"感知-预警-处置"全闭环的智能安全方案&#xff01; 行业痛点&#xff1a;粉尘管理的生死线 在金属加工、化工…

Excel处理控件Aspose.Cells指南:如何在不使用 Microsoft Excel 的情况下解锁 Excel 工作表

Microsoft Excel 允许用户使用密码保护工作表&#xff0c;以防止未经授权的更改。但是&#xff0c;在某些情况下&#xff0c;您可能需要在不使用 Microsoft Excel 的情况下解锁 Excel 工作表。在本指南中&#xff0c;我们将探讨解锁 Excel 工作表的不同方法&#xff0c;例如使用…

音乐webpack(通杀webpack-1)

本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未经许可…

【stm32--HAL库DMA+USART+空闲中断不定长收发数据】

串口通信-Hal库实现不定长度收发&#xff0c;DMAUSART DMA串口STM32CUBEMX配置&#xff08;工程创建&#xff09;基础配置时钟配置工程配置 代码编写现象 DMA 在正式配置之前&#xff0c;我们先来一起简单了解一下DMA。DMA&#xff08;Direct Memory Access&#xff0c;直接内…

爬虫的第三天——爬动态网页

一、基本概念 动态网页是指网页内容可以根据用户的操作或者预设条件而实时发生变化的网页。 特点&#xff1a; 用户交互&#xff1a;动态网页能够根据用户的请求而生成不同的内容。内容动态生成&#xff1a;数据来自数据库、API或用户输入。客户端动态渲染&#xff1a;浏览器…

【MATLAB例程】三维环境,基于TOA的动态轨迹定位,轨迹使用UKF(无迹卡尔曼滤波)进行滤波,模拟TOA/IMU的数据融合

本代码实现了一个基于到达时间&#xff08;TOA&#xff09;测距的三维定位系统&#xff0c;结合无迹卡尔曼滤波&#xff08;UKF&#xff09;对移动目标的轨迹进行优化。代码通过多锚节点&#xff08;>3&#xff09;的TOA测量数据&#xff0c;先进行初步定位解算&#xff0c;…

旋转变换原理

旋转变换原理 旋转是仿射变换的一种&#xff0c;通过变换矩阵实现图像绕指定中心旋转&#xff0c;保持直线和平行性不变。其数学表示为&#xff1a; 其中&#xff1a; ( c x , c y ) (c_x, c_y) (cx​,cy​) 是旋转中心。 θ \theta θ 是旋转角度&#xff08;逆时针为正&…

【计算机网络】DHCP工作原理

DHCP(动态主机配置协议) Dynamic Host Configuration Protocol 基于UDP协议传输 DHCP分配IP地址的过程 &#xff08;1&#xff09;DHCP DISCOVER客户机请求 IP 地址&#xff1a; 当一个 DHCP 客户机启动时&#xff0c;客户机还没有 IP 地址&#xff0c;所以客户机要通过 DHC…

应用于汽车车灯电路中的电感产品选型及质量管控标准

随着汽车的智能化与电动化发展&#xff0c;汽车车灯系统逐渐从单一照明功能向集成化、智能化和高能效方向演进。汽车车灯的性能关系着行车安全和驾驶体验&#xff0c;而车规级电感器作为车灯驱动电源电路中的核心元件&#xff0c;其性能直接决定了汽车车灯的效率、可靠性及环境…