作者:来自 Elastic Alessandro Brofferio

学习如何使用 Elasticsearch 构建 RAG 应用,轻松排查你的家电问题。

想要获得 Elastic 认证吗?来看看下一次 Elasticsearch 工程师培训什么时候开始吧!

Elasticsearch 拥有大量新功能,可以帮助你根据使用场景构建最佳搜索解决方案。深入学习我们的示例笔记本,了解更多信息,开启免费的云试用,或者现在就在本地机器上尝试 Elastic。


RAG(Retrieval Augmented Generation)通过使用外部知识库来丰富生成的答案,从而增强了 LLM 的能力。这篇博客详细介绍了一个基于 Elasticsearch 构建的简单 RAG 应用的实现。该应用旨在帮助用户排查家电问题,回答常见问题,比如 “如何将我的洗碗机恢复到出厂设置?”

我们将一步步指导你,涵盖以下内容:

  • 使用 Eland 库上传嵌入模型,并在 Elastic 中设置推理 API 来使用上传的模型进行文本嵌入

  • 创建一个使用 semantic_text 类型来存储 PDF 正文内容的 Elasticsearch 索引

  • 设置一个 LLM completion 推理端点,用来与所选的 LLM 交互

  • 使用 semantic_text 查询类型,根据用户查询检索相关文档

  • 将所有内容结合在一起,构建一个出色的原型

你需要:

  • 一个至少更新到 Elastic 8.18.x 的 Elastic Cloud 部署

  • 一个 LLM API 服务(我使用的是 OpenAI Azure)

该应用基于一个简单的 Flask 应用构建,可以无缝集成 Elasticsearch API 来执行 RAG。同时配有一个简单的前端,允许用户上传用户手册进行处理。完整代码在这里可以获取。

这个 RAG 应用接收你选择的家电 PDF 手册。上传后,它会智能地逐页解析 PDF 文档,并将每一页提取的文本内容发送到 Elasticsearch。在那里,会依靠导入 Elasticsearch 的推理模型为内容创建文本嵌入,并将其存储为 dense_vectors。一旦手册处理完成,用户就可以输入查询,利用这些知识快速找到家电问题的解决方案。

数据收集

如上所述,我们在 Elastic Cloud 部署上运行了一个 Elasticsearch 实例。Elasticsearch 集群请求受配置设置控制,包括 http:max_content_length。这个网络 HTTP 设置会限制 HTTP 请求体的最大大小,默认值为 100MB,在 Elastic Cloud 中目前不可配置。

为了绕过这一限制来处理更大的文档,我实现了一个简单的 Python 函数,将提供的 PDF 拆分为单独的页面,并存储在一个单独的文件夹中。

下面是该函数的部分代码示例:

def split_pdf(input_pdf_path, output_folder, filename_prefix=''):"""Splits a PDF file into individual pages and saves them to an output folder.Args:input_pdf_path (str): The full path to the input PDF file.output_folder (str): The directory where split pages will be saved.filename_prefix (str): A prefix to use for the output filenames (e.g., "manual_")."""logging.info(f"[{time.strftime('%H:%M:%S')}] Splitting PDF: {input_pdf_path}")try:# Open the PDF filewith open(input_pdf_path, 'rb') as file:pdf_reader = PdfReader(file)# Iterate through each pagefor page_num in range(len(pdf_reader.pages)):pdf_writer = PdfWriter()pdf_writer.add_page(pdf_reader.pages[page_num])# Generate the output file name# Uses the original filename (without extension) as part of the prefixoriginal_filename_base = os.path.splitext(os.path.basename(input_pdf_path))[0]output_filename = f'{filename_prefix}{original_filename_base}_pg_{page_num + 1}.pdf'output_path = os.path.join(output_folder, output_filename)# Save the page as a new PDFwith open(output_path, 'wb') as output_file:pdf_writer.write(output_file)logging.info(f'[{time.strftime("%H:%M:%S")}] Saved split page: {output_filename}')logging.info(f"[{time.strftime('%H:%M:%S')}] Finished splitting PDF: {input_pdf_path}")except Exception as e:logging.error(f"[{time.strftime('%H:%M:%S')}] Error during PDF splitting for {input_pdf_path}: {e}")

为你的 PDF 内容创建嵌入

文本嵌入是指将文本(或其他数据类型)转换为数值向量表示的过程 —— 具体来说,就是稠密向量。这是现代搜索和机器学习应用中的关键技术,特别适用于语义搜索、相似性搜索和生成式 AI。

Elastic 提供了多种依赖文本嵌入模型的方式:

  • 内置模型:这些模型在 Elasticsearch 中即可使用,开箱即用并已预训练,这意味着你不需要在自己的数据上进行微调,使它们能够适应各种使用场景。例如,你可以使用:

    • ELSER:生成文本的稀疏向量表示,仅支持英文文档。

    • E5:通过稠密向量表示实现多语言语义搜索。

  • 导入 HuggingFace 模型:用户可以从 HuggingFace 等平台导入预训练模型。这个过程依赖 Eland,它是一个 Python 客户端,提供与 Pandas 兼容的 API,用于在 Elasticsearch 中进行数据探索和分析。

在本项目中,我们将上传一个 HuggingFace 模型。你可以通过以下方式安装 Eland:

python -m pip install eland

现在,打开 Bash 编辑器并创建一个 .sh 脚本,正确填写每个参数:

MODEL_ID="sentence-transformers/all-MiniLM-L6-v2"
CLOUD_URL='<<YOUR_CLOUD_URL>>'
ELASTIC_API_KEY='<<YOUR_API_KEY>>'
eland_import_hub_model \--url "$CLOUD_URL" \--es-api-key "$ELASTIC_API_KEY" \--hub-model-id "$MODEL_ID" \--insecure \--task-type text_embedding\--start

MODEL_ID 指的是从 HuggingFace 获取的模型。我们将使用 all-MiniLM-L6-v2,因为它体积小,可以轻松在 CPU 上运行,并且性能优异,尤其适合本次演示。

运行这个 Bash 脚本后,你的模型会出现在 Elastic 部署中的 Machine Learning -> Model Management -> Trained Models 下。

创建推理端点

从 8.11 版本开始,Elastic 已经普遍提供了推理 API 服务(inference API service)。该功能允许用户创建推理端点,使用 Elastic 服务执行各种推理任务。

在本次演示中,我们将创建一个名为 minilm-l6 的端点,用来使用通过 Eland 上传的模型。这个端点会传递与刚刚上传模型对应的正确 model_id

PUT _inference/text_embedding/minilm-l6
{"service": "elasticsearch","service_settings": {"num_allocations": 1,"num_threads": 1,"model_id": "sentence-transformers__all-minilm-l6-v2" }
}

创建存储 PDF 内容的索引

接下来,我们将创建一个索引,并使用默认映射,其中包含 semantic_text 字段。此设置需要你指定之前创建的端点 ID。该端点定义了在摄取过程中为 body 字段内容生成嵌入的推理服务。

作为背景说明,semantic_text 是在 Elasticsearch 8.15 中引入的,它简化了语义搜索。若要深入了解我们的方法,建议查看我们的原始博客文章和 Elasticsearch 文档。

PUT pdf-documentation-reader
{"mappings": {"properties": {"body": {"type": "semantic_text","inference_id": "minilm-l6"}}}
}

设置 completion 端点

在生成主要组件后,一个关键步骤是创建 Elasticsearch 中的推理完成端点(inference completion endpoint)。该端点可以通过生成提示与所选的 Large Language Model (LLM) 进行交互,并提供必要的认证密钥。

具体来说,你将使用名为 completion 的 completion 任务类型(更多细节请参考 Elasticsearch 文档)。

PUT _inference/completion/openai_chat_completions
{"service": "openai","service_settings": {"api_key": "<<Your API KEY>>","model_id": "<<Chosen Model>>","url": "<<Your Service URL>>"}
}

创建完成后,你可以通过发送一个简单问题来测试 LLM 集成,如下面的示例所示。

POST _inference/completion/openai_chat_completions
{"input": "When Elasticsearch was created ?"
}

输出:

{"completion": [{"result": "**Elasticsearch** was first released in **2010**. It was created by Shay Banon, who began working on the project in 2009, and released the first version (0.4) in February **2010**. Elasticsearch is a distributed, open-source search and analytics engine built on top of Apache Lucene."}]
}

搜索你的数据

当用户通过界面提交查询时,它会在现有内容中启动语义搜索,以识别相关的 PDF 段落。与用户输入语义相似的段落随后会被整合到提示中,由 LLM 生成最终答案。语义查询使用之前介绍的 semantic_text 字段来简化处理。

"query": {"semantic": {"field": "body","query": "How long does the ECO program last ?"}}

虽然我们的示例提供了一个简化的方法,但关于查询 semantic_text 字段的更多细节可以在这里找到。对于需要增强相关性和精确度的高级应用,可以实现一种混合搜索方法,将经典词汇搜索(BM25)与语义搜索结合起来。

整合所有内容:基于 Elasticsearch 的家电手册 RAG 应用

构建故障排查应用的最后一步是将文档检索过程与 LLM 无缝集成,以提供智能、具上下文感知的响应。

下图的系统概览展示了各个组件的交互,并对所涉及的步骤进行了高层次的回顾。

1)PDF 摄取、嵌入与存储

  • 该过程从原始 PDF 家电手册开始,这些手册包含大量文本、图像和复杂布局。每个 PDF 手册被拆分为单独的页面,然后将每页提取的文本摄取到 Elasticsearch 中。使用解析库提取文本内容和元数据(如型号、制造商和文档类型),并识别关键章节或图表。
  • 从每页 PDF 提取的文本被仔细划分为较小的、语义连贯的 “块”。这些块作为 dense_vectors 存储在 Elasticsearch 索引中,利用 semantic_text 字段类型,并依赖为 text_embedding 任务创建的 inference_endpoint

2)用户查询与上下文检索

当用户提出故障排查问题(例如,“How long does the ECO Program last?”)时,这作为起点。用户的查询使用与摄取的文档块相同的嵌入模型转换为稠密向量嵌入。这确保查询向量与文档块向量处于相同语义空间,从而允许进行有意义的相似性比较。然后使用嵌入的用户查询在 Elasticsearch 文档存储中执行相似性搜索。这些文档块最可能包含回答问题所需的相关信息。

3)提示构建与 LLM 输入

  • 上下文化:检索到的文档块(原始文本)被动态插入到一个构建好的提示中,该提示将发送给 LLM。提示通常包括:
    • LLM 的指令:关于如何使用提供的信息、期望的输出格式以及任何约束的明确指南。

    • 用户的原始查询:用户实际提出的问题。

    • 检索到的上下文:最相关块的文本内容,通常明确标注为 “Context” 或 “Relevant Documents”。

  • 示例提示结构
You are an expert appliance troubleshooter. Using *only* the following context, answer the user's question. If the information is not in the context, state that you cannot answer based on the provided information.**Context:**
[Retrieved Chunk 1 Text]
[Retrieved Chunk 2 Text]
[Retrieved Chunk 3 Text]
...**User Question:** [User's Original Query]

4)LLM 生成

  • 答案综合:完整构建的提示,包括用户查询和相关检索到的上下文,然后发送给 LLM。LLM 处理该输入,并基于提供的信息生成连贯、上下文准确且类人化的响应。它综合检索到的文档块中的信息,为用户的问题提供直接答案。

以下是对我们之前问题 How long does the ECO program last?” 的输出示例:

结论

在本文中,我们演示了如何利用 Elasticsearch 构建 RAG 应用,通过使用 semantic_text 映射等功能。这简化了数据摄取过程,使你可以轻松开始使用语义搜索,同时提供合理的默认设置。它还让你专注于搜索,而不必担心如何索引、生成或查询嵌入。

此外,我们还展示了如何利用最新的 inference_API,它简化了在数据上使用机器学习模型的过程。例如,你可以用它执行推理操作(如为语义搜索生成嵌入),并将其与 LLM 集成进行提示回答。

希望这个应用也能帮助你解决技术问题,而不必额外花钱请技术人员上门。

在本文中,我们可能使用了第三方生成式 AI 工具,这些工具由各自的所有者拥有和运营。Elastic 对这些第三方工具没有控制权,也不对其内容、操作或使用承担任何责任,也不对你使用这些工具可能产生的任何损失或损害负责。在使用 AI 工具处理个人、敏感或机密信息时,请谨慎操作。你提交的任何数据可能会被用于 AI 训练或其他用途。无法保证你提供的信息会被安全或保密地保存。使用前,你应熟悉任何生成式 AI 工具的隐私政策和使用条款。

原文:Turbocharge your troubleshooting: Building a RAG application for appliance manuals with Elasticsearch - Elasticsearch Labs

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

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

相关文章

6.Shell脚本修炼手册---grep命令使用指南

grep 命令&#xff1a;从文本中精准筛选信息的实用指南 文章目录grep 命令&#xff1a;从文本中精准筛选信息的实用指南一、什么是 grep&#xff1f;为什么要用它&#xff1f;二、grep 基本语法三、常用选项详解&#xff08;附实例&#xff09;&#xff08;一&#xff09;模式选…

Python day51

浙大疏锦行 Python day51 复习日&#xff0c;DDPM class DenoiseDiffusion():def __init__(self, eps_model: nn.Module, n_steps: int, device: torch.device):super().__init__()self.eps_model eps_modelself.n_steps n_stepsself.device deviceself.beta torch.linsp…

数据结构:生成 (Generating) 一棵 AVL 树

目录 搭建“创世”的舞台 注入序列&#xff0c;观察演化 注入 10 注入 20 注入 30 注入 40 注入 50 注入 25 再次审视 上一讲&#xff0c;我们已经从最根本的逻辑出发&#xff0c;推导出了 AVL 树失衡时所必需的修复操作——旋转 (Rotation)。 现在&#xff0c;我们将…

github 上传代码步骤

登录GitHub → 点击右上角 ​​ → New Repository​​。填写仓库名称&#xff08;建议与本地项目同名&#xff09;&#xff0c;选择 ​​Public/Private​​。​​关键&#xff1a;不要勾选​​ “Initialize with README”&#xff08;避免与本地仓库冲突&#xff09;。点击 …

陪诊小程序系统开发:开启智慧就医新时代

在数字化浪潮的推动下&#xff0c;智慧医疗正逐渐成为现实。陪诊小程序系统的开发&#xff0c;作为智慧医疗领域的一次重要创新&#xff0c;正以其独特的魅力与优势&#xff0c;引领着就医新时代的到来。它不仅改变了传统就医模式&#xff0c;更以科技的力量&#xff0c;让医疗…

朝花夕拾(七)--------从混淆矩阵到分类报告全面解析​

目录 ​​机器学习模型评估指南&#xff1a;从混淆矩阵到分类报告全面解析​​ ​​1. 引言​​ ​​2. 混淆矩阵&#xff1a;模型评估的基石​​ ​​2.1 什么是混淆矩阵&#xff1f;​​ 2.2二分类问题的混淆矩阵 ​​二分类场景下的具体案例​ ​分析案例: 1.​​案例…

Python读取和设置PNG图片的像素值

在Python中&#xff0c;可以使用Pillow库或OpenCV库来读取和写入PNG图片的像素值。以下是两种方法的详细说明&#xff1a;1. 使用Pillow库Pillow是Python中常用的图像处理库&#xff0c;支持多种图像格式&#xff0c;包括PNG。读取像素值from PIL import Imageimg Image.open(…

SkyWalking + Elasticsearch8 容器化部署指南:国内镜像加速与生产级调优

SkyWalking Elasticsearch8 Docker 部署文档本文提供在 Ubuntu 服务器上&#xff0c;使用 Docker Compose 部署 SkyWalking&#xff08;OAPUI&#xff09;与 Elasticsearch 8 的完整步骤&#xff0c;数据/日志落地到 /media/disk2 前置条件 Ubuntu&#xff0c;已具备 sudo 权限…

有符号和无符号的区别

有符号&#xff08;Signed&#xff09;和无符号&#xff08;Unsigned&#xff09;是计算机编程中用来描述整数数据类型能否表示负数的两个概念。它们的主要区别在于能否表示负数以及数值的表示范围。以下是它们的核心区别&#xff1a;1. 能否表示负数有符号&#xff08;Signed&…

8月21日作业

1、Makefile中头文件发生过修改的解决&#xff1a; 处插入*.h依赖&#xff0c;对.h文件打的时间戳进行检查2、头删和输出//五、头删 void delete_head(seq_p s) {empty(s);for(int i1;i<s->len;i){s->data[i-1]s->data[i];}s->len--; }//六、输出 void output(s…

Lucene 8.5.0 的 `.pos` 文件**逻辑结构**

Lucene 8.5.0 的 .pos 文件**逻辑结构**&#xff08;按真实实现重新整理&#xff09; .pos 文件 ├─ Header (CodecHeader) ├─ TermPositions TermCount ← 每个 term 一段&#xff0c;顺序由词典隐式决定 │ ├─ PackedPosDeltaBlock N ← 仅当 **无 payl…

基于Matlab多技术融合的红外图像增强方法研究

红外图像在低照度、强干扰和复杂环境下具有较强的成像能力&#xff0c;但受传感器噪声、成像条件及大气衰减等因素影响&#xff0c;原始红外图像往往存在对比度低、细节模糊及光照不均等问题。本文针对红外图像质量退化的特点&#xff0c;提出了一种基于多算法融合的红外图像增…

【时时三省】集成测试 简介

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 目录 1,集成测试含义 2,集成测试 验证方法 3,集成测试 用例设计方法 4,集成测试输出物 5,集成测试注意点 1,集成测试含义 单元测试在以V模型的流程中,对应的是架构设计阶段。在 单元测试 和 架构设计…

leetcode 76 最小覆盖子串

一、题目描述二、解题思路整体思路&#xff1a;模拟寻找最小覆盖子集的过程&#xff0c;由于可借助同向双指针且可以做到指针不回退&#xff0c;所以可以用滑动窗口的思想来解决这个问题。具体思路&#xff1a;(1)数组hash1用于统计t中每一个字符出现的频次&#xff0c;变量kin…

阿里云ECS服务器的公网IP地址

文章目录环境背景查询公网IP地址阿里云控制台阿里云客户端工具&#xff08;图形界面&#xff09;阿里云CLI工具&#xff08;命令行&#xff09;其它方法元数据服务器ipinfo.io参考注&#xff1a;本文介绍了如何获取阿里云ECS服务器的公网IP地址&#xff0c;可以顺便了解一下和阿…

IPSec 与 IKE 核心知识点总结

一、IPSec 安全基础IPSec 是保障 IP 数据传输安全的核心协议&#xff0c;其核心围绕密钥管理和安全策略约定展开&#xff0c;具体包括以下关键内容&#xff1a;1. 对称密钥的作用与要求对称密钥是 IPSec 实现加密、验证的基础&#xff0c;主要用于三个场景&#xff1a;加密 / 解…

C2ComponentStore

1. C2ComponentStore这是 Codec 2.0 HAL 的抽象接口&#xff08;frameworks/av/media/codec2/core/include/C2ComponentStore.h&#xff09;。代表一个「组件工厂」&#xff0c;负责&#xff1a;枚举当前可用的 Codec2 组件&#xff08;解码器、编码器&#xff09;。创建组件&a…

AI 在医疗领域的应用与挑战

引言介绍 AI 技术迅猛发展的大背景&#xff0c;引出其在医疗领域的重要应用。阐述研究 AI 医疗应用及挑战对推动医疗行业进步的重要意义。AI 在医疗领域的应用现状疾病诊断辅助&#xff1a;描述 AI 影像识别技术在识别 X 光、CT、MRI 影像中疾病特征的应用&#xff0c;如对肺癌…

【GPT入门】第51课 Conda环境迁移教程:将xxzh环境从默认路径迁移到指定目录

【GPT入门】第51课 Conda环境迁移教程&#xff1a;将xxzh环境从默认路径迁移到指定目录步骤1&#xff1a;创建目标目录&#xff08;若不存在&#xff09;步骤2&#xff1a;克隆环境到新路径步骤3&#xff1a;验证新环境可用性步骤4&#xff1a;删除旧环境&#xff08;可选&…

应急响应-模拟服务器挂马后的应急相关操作

工具&#xff1a;攻击机&#xff1a; kail:192.168.108.131 kail下载地址&#xff1a;https://mirrors.aliyun.com/kali-images/kali-2021.3/kali-linux-2021.3-live-i386.iso靶机&#xff1a;windows 7: 192.168.108.1321、在kali中制作木马文件&#xff1a;vhost.exe&#xf…