在 Elastic 8.15 中使用最少的代码快速构建 RAG

news2024/10/16 16:19:49

作者:来自 Elastic Han Xiang Choong

Elastic 8.15 已经发布,语义搜索比以往任何时候都更容易实现。

我们将介绍如何在 15 分钟内完成所有这些任务:

  1. 将你的文档存储在某些数据存储服务中,例如 AWS S3 Bucket
  2. 设置 Elastic Search 数据连接器
  3. 使用 eland 库上传嵌入模型,在 Elastic 中设置推理 API
  4. 将其连接到使用 semantic_text 数据类型的索引
  5. 将你的 inference API 添加到该索引
  6. 同步数据连接器
  7. 立即使用 Elastic Playground

你将需要:

  1. 更新到 Elastic 8.15 的 Elastic Cloud Deployment
  2. S3 bucket
  3. LLM API 服务(Anthropic、Azure、OpenAI、Gemini)

就这样!让我们完成它。

收集数据

为了跟进这个特定的演示,我上传了一个包含此处使用的数据的 zip 文件。它是《精灵宝钻》的前 60 页左右,每页都是单独的 pdf 文件。我现在正在经历《指环王》的冲击。请随意下载并上传到你的 S3 存储桶!

对于大型文档,有时需要将文档拆分为单独的页面,因为 Elastic S3 数据连接器不会提取超过 10MB 的文件的内容。

我使用这个 Python 脚本将 PDF 拆分为单独的页面:

import os
from PyPDF2 import PdfReader, PdfWriter

def split_pdf(input_pdf_path, output_folder, filename=''):
    # Create the output folder if it doesn't exist
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # Open the PDF file
    with open(input_pdf_path, 'rb') as file:
        pdf_reader = PdfReader(file)
        
        # Iterate through each page
        for 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
            output_filename = f'{filename}pg_{page_num + 1}.pdf'
            output_path = os.path.join(output_folder, output_filename)
            
            # Save the page as a new PDF
            with open(output_path, 'wb') as output_file:
                pdf_writer.write(output_file)
            
            print(f'Saved {output_filename}')

# Example usage
input_pdf = 'The Silmarillion (Illustrated) - J. R. R. Tolkien; Ted Nasmith;.pdf'
output_folder = './silmarillion_pages/'

split_pdf(input_pdf, output_folder, "Silmarillion_")

设置 S3 连接器

数据连接器可以接收各种类型的数据。在这里,我们坚持使用装有 pdf 页面的 S3 存储桶。

我的 S3 存储桶

我只需跳转到我的 Elastic Cloud 部署,转到 Search -> Content -> Connectors,然后使用所有默认设置创建一个名为 aws-connector 的新连接器。然后,我将打开配置并添加我的存储桶的名称以及标记到我的 AWS 用户的密钥和访问密钥。

Elastic Cloud S3 连接器配置

运行快速同步以验证一切是否正常。同步将提取数据源中每个未提取的文件,提取其内容,并将其作为唯一文档存储在索引中。每个文档都将包含其原始文件名。与现有索引文档具有相同文件名的数据源文档不会被重新提取,所以不用担心!同步也可以定期安排。该方法在文档中描述。如果一切正常,假设我的 AWS 凭证和权限都正确无误,数据将进入名为 aws-connector 的索引。

我们的 S3 连接器首次成功同步

看起来一切都很好。让我们抓住我们的嵌入模型!

上传嵌入模型

Eland 是一个 Python Elasticsearch 客户端,它可以轻松地将 numpy、pandas 和 scikit-learn 函数转换为 Elasticsearch 支持的等效函数。就我们的目的而言,它将是我们上传 HuggingFace 模型的方法,以便在我们的 Elasticsearch 集群中进行部署。你可以像这样安装 eland:

python -m pip install eland

现在使用 bash 编辑器并制作这个小 .sh 脚本,适当地填写每个参数:

MODEL_ID="sentence-transformers/all-MiniLM-L6-v2"
ELASTIC_USERNAME="<YOUR ELASTIC DEPLOYMENT USERNAME>"
ELASTIC_PASSWORD="<YOUR ELASTIC DEPLOYMENT PASSWORD>"
CLOUD_ID="<YOUR CLOUD ID>"

eland_import_hub_model \
    --cloud-id $CLOUD_ID \
    --es-username $ELASTIC_USERNAME \
    --es-password $ELASTIC_PASSWORD \
    --hub-model-id $MODEL_ID \
    --task-type text_embedding \
    --start

MODEL_ID 指的是从 huggingface 中获取的模型。我选择 all-MiniLM-L6-v2 主要是因为它非常好,而且非常小,并且易于在 CPU 上运行。运行 bash 脚本,完成后,你的模型应该出现在 Elastic 部署中的 Machine Learning -> Model Management -> Trained Models

使用 eland 部署刚刚上传的模型

只需单击带圆圈的播放按钮即可部署模型,就完成了。

设置语义文本索引

是时候设置语义搜索了。导航到 Management -> Dev Tools,然后删除索引,因为它没有启用语义文本数据类型。

DELETE aws-connector

使用以下命令检查你上传的模型的 model_id:

GET _ml/trained_models

现在创建一个名为 minilm-l6 的推理端点,并向其传递正确的 model_id。我们不必担心 num_allocations 和 num_threads,因为这不是生产环境,而且 minilm-l6 也不是大问题。

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

现在重新创建 aws-connector 索引。将 body 属性设置为 semantic_text 类型,并添加新推理端点的 ID。

PUT aws-connector
{
  "mappings": {
    "properties": {
      "body": {
        "type": "semantic_text",
        "inference_id": "minilm-l6"
      }
    }
  }
}

返回连接器并运行另一次全内容同步(这次是真的!)。传入的文档将自动分块为 250 个单词的块,重叠部分为 100 个单词。你无需明确执行任何操作。现在很方便!

这次真正同步你的 S3 连接器!

就完成了。检查你的 aws-connector 索引,里面会有 140 个文档,每个文档现在都是一个嵌入块:

索引中充满分块文档

使用 Elastic Playground 进行 RAG

快速转到 Search -> Build -> Playground 并添加你选择的 LLM 连接器。我使用的是 Azure OpenAI:

设置端点和 API 密钥

现在让我们设置聊天体验。单击 Add Data Sources 并选择 aws-connector

查看新聊天体验的查询选项卡。假设所有设置均正确,它将自动设置为此混合搜索查询,model_id 为 minilm-l6。

默认混合搜索查询

让我们问一个问题!我们将采用三份文件作为背景,并添加我的特殊 RAG 提示:

添加提示并选择上下文的搜索结果数量

查询:Describe the fall from Grace of Melkor

我们将使用相对开放的 RAG 查询。要得到令人满意的回答,需要从文本的多个部分提取信息。这将很好地表明 RAG 是否按预期工作。

Summary
The fall from grace of Melkor is a central theme in the mythology of J.R.R. Tolkien's legendarium. According to the provided context, Melkor's descent into discord and rebellion can be summarized as follows:

1. **Initial Greatness and Ambition**:
   - Melkor was one of the Ainur, the powerful spirits created by Ilúvatar. He was endowed with the greatest gifts of power and knowledge among the Ainur, having a share in all the gifts of his brethren [2].
   - His ambition led him to seek the Imperishable Flame, desiring to bring into Being things of his own. However, he did not find the Flame, as it was with Ilúvatar [2].

2. **Introduction of Discord**:
   - During the Great Music, which was the Ainur's act of creation through song, Melkor began to interweave his own themes that were not in accord with Ilúvatar's original theme. This caused discord and disrupted the harmony of the music [2].
   - Melkor's discord spread, and many Ainur attuned their music to his, leading to a turbulent and chaotic sound. Despite this, Ilúvatar introduced new themes to counter Melkor's discord, but Melkor's influence continued to cause strife [2].

3. **Conflict and Rebellion**:
   - When the Ainur entered the World (Eä), Melkor continued to meddle in their work, turning it to his own desires and purposes. He kindled great fires and sought to claim the Earth as his own kingdom [3].
   - Manwë, who was the chief instrument of Ilúvatar's second theme, opposed Melkor and called upon other spirits to aid him in preventing Melkor from hindering their labor. This led to strife between Melkor and the other Valar [3].

4. **Continued Strife and Withdrawal**:
   - Despite being opposed by Manwë and the other Valar, Melkor did not abandon his desire for dominion over Arda (the Earth). He withdrew to other regions but continued to harbor the desire to rule [3].

In summary, Melkor's fall from grace was marked by his initial ambition and desire for power, his introduction of discord into the Great Music, his continued rebellion and meddling in the creation of the World, and his persistent desire to claim dominion over Arda despite opposition from the other Valar. His actions led to ongoing conflict and strife, setting the stage for much of the subsequent history and mythology of Middle-earth.

好吧,我深信不疑。它甚至有引文!再来一句祝你好运:

查询:Who were the greatest students of Aule the Smith?

这个特定的查询并不太难,我只是在寻找对文本中非常具体的引用的引用。让我们看看它是如何做到的!

According to the provided context, the greatest students of Aulë the Smith were the Noldor. The text states, "The Noldor learned most of him, and he was ever their friend" [1]. This indicates that the Noldor, one of the clans of the Elves, were particularly skilled in crafts and knowledge due to their learning from Aulë.

Aulë, being a master of all crafts and a smith, imparted his knowledge and skills to the Noldor, making them renowned for their craftsmanship and artistry in Middle-earth. This relationship between Aulë and the Noldor is significant in the lore, as it highlights the transmission of knowledge and skill from a Vala to the Elves.

嗯,没错。看起来 RAG 运行良好。

结论

这真是太方便了,而且毫不费力 —— 太棒了!我们真的生活在未来。我绝对可以用这个。我希望你和我一样兴奋地尝试它,想要展示它。

准备好自己尝试一下了吗?开始免费试用。
想要获得 Elastic 认证吗?了解下一次 Elasticsearch 工程师培训何时举行!

原文:https://search-labs.elastic.co/search-labs/blog/rag-minimal-code-in-815

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java项目docker部署时进行热部署

本文需要pontwiner进行配合操作 1.上传文件到对应服务器&#xff0c;可以通过xftp等文件上传工具进行文件上传 2.获取docker imagId XX为项目部署名称 例如&#xff1a;test-server docker ps -a |grep XX 3.复制文件到docker容器的/tmp目录下 docker cp XXXX.class im…

做seo要注意的各种细节,你都注意到了吗

在实施seo时&#xff0c;关注各种细节是至关重要的。 这些细节始于网站的初始设计&#xff0c;包括选择合适的主机、规划网站结构、优化网站内容&#xff0c;以及建立内部和外部链接的策略等。此外&#xff0c;确保网站对搜索引擎友好&#xff0c;涵盖从URL的设计到内容的优化…

kafka的安装和启动

一、kafka介绍 1&#xff0c;kafka简单介绍 kafka是一款分布式、支持分区的、多副本&#xff0c;基于zookeeper协调的分布式消息系统。最大的特性就是可以实时处理大量数据来满足需求。 2&#xff0c;kafka使用场景 1&#xff0c;日志收集&#xff1a;可以用kafka收集各种服务…

使用 Docker 部署和运行 RabbitMQ

使用 Docker 部署和运行 RabbitMQ 在本篇博客中&#xff0c;我将介绍如何通过 Docker 来运行 RabbitMQ 并使用其管理界面。还会讨论我在操作过程中遇到的常见问题及其解决方案。RabbitMQ 是一个开源的消息代理&#xff0c;用于跨应用程序发送、接收消息。在容器化环境中运行 R…

使用sysbench 简单测试io

sysbench最新版本地址 GitHub - akopytov/sysbench: Scriptable database and system performance benchmark centos在线安装 curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash sudo yum -y install sysbench 查看sysben…

vue3+ts封装类似于微信消息的组件

组件代码如下&#xff1a; <!--聊天页面-播放语言组件--> <template><div:class"[voice-message, { sent: isSent, received: !isSent }]":style"{ backgroundColor: backgroundColor }"click"togglePlayback"><!-- isSen…

解析查看elf文件的构成

x86下用clang编译一段c代码&#xff0c;编译成elf文件&#xff0c;读elf文件&#xff0c;dump出里面的所有段&#xff0c;并打印出段中的数据和含义以及汇编的内容 编写C代码 首先&#xff0c;编写一个简单的C程序&#xff0c;例如命名为example.c&#xff1a; 使用Clang编…

【YOLOv5模型部署】——TensorRT推理引擎安装与使用基于Flask的项目部署

声明&#xff1a;笔记是做项目时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 温馨提示&#xff1a;对于我的电脑没有Nvidia的独显&#xff0c;只有Intel的集显&#xff0c;最后导出时无法识别Nvidia显卡设备&#xff01;&#xff01;就没成功&#xf…

Java小白一文讲清Java中集合相关的知识点(四)

LinkedList底层结构 LinkedList底层实现了双向链表和双向队列特点可以添加任意元素&#xff0c;包括null,元素可以重复线程不安全&#xff0c;没有实现同步 LinkedList底层操作机制 LinkedList底层维护了一个双向链表LinkedList中维护了两个属性first和last分别指向首结点和…

如何启动vue ui,快速创建vue项目

1.查看自己是否已经安装了vue3.0脚手架版本&#xff0c;打开cmd命令框输入vue -V(大写为查看&#xff0c;此处查看的是脚手架的版本)。如果没有提示版本&#xff0c;而是命令不存在...则要进行下面的1.1操作 1.1安装Vue CIL&#xff0c;如果已安装&#xff0c;此步忽略。安装完…

计算机毕业设计选题推荐-中华诗词文化交流平台-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

快速搭建和运行Spring Boot项目的简易指南

对于非Java开发的后端开发人员而言&#xff0c;即便未曾接触过Java&#xff0c;也可能听说过Spring Boot这一框架。若想要快速搭建并运行一个Spring Boot项目&#xff0c;可以遵循以下步骤&#xff1a; 环境准备 **安装Java JDK&#xff1a;**确保您的开发环境中安装了Java J…

Android Studio编译时各类型网络超时优化方案

我们国家有很多长城&#xff0c;我觉得最重要的除了大家耳熟能详的西起嘉峪关&#xff0c;东至山海关的万里长城&#xff0c;还有一个叫GFW的国家长城防火墙&#xff0c;这个防火墙起初仅是为了禁止用户访问政治敏感信息&#xff0c;后来逐渐强大。。。目前最新进展是我们已和世…

142.环形链表二-力扣

142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; struct ListNode *detectCycle(struct ListNode *head) {struct ListNode *fasthead;struct ListNode *slowhead;while(fast && fast->next){fast fast->next->next;slow slow->next;if(fasts…

Python 使用中点查找矩形的角(Find Corners of Rectangle using mid points)

考虑一个矩形 ABCD&#xff0c;我们给出了边 AD 和 BC 中点&#xff08;分别为 p 和 q&#xff09;的坐标以及它们的长度 L&#xff08;AD BC L&#xff09;。现在给定参数&#xff0c;我们需要打印 4 个点 A、B、C 和 D 的坐标。 例子&#xff1a; 输入&#xff1a;p (1,…

人工智能在病理组学和精准医疗中的最新研究进展|顶刊速递·24-09-05

小罗碎碎念 本期推文主题&#xff1a;AI病理精准医疗 这段时间一直在尝试不同的学习道路&#xff0c;兜兜转转还是觉得&#xff0c;每天跟踪最新文献其实是很有必要的&#xff0c;并且这些最新的文献不一定非要与自己专业完全匹配&#xff0c;不然就会把自己困住。 这期推文和…

文章润色太费时?试试这5款ai写作工具

你是否曾梦想拥有一个私人编辑&#xff0c;随时随地帮你打磨文字&#xff0c;让写作变得既轻松又专业&#xff1f; 告诉你一个好消息&#xff0c;现在有5款AI写作工具&#xff0c;它们就拥有这样的能力&#xff01;这些AI助手擅长润色文章&#xff0c;优化语法&#xff0c;甚至…

微信小程序使用nfc读取

** 微信小程序开发nfc读取 ** &#xff08;注释微信官方api&#xff0c;仅支持安卓&#xff0c;不支持苹果ios&#xff09;官方文档 上代demo <template><div class"nfc"><u-navbar leftIcon"arrow-leftward" bgColor"#ffffff&qu…

网络安全服务基础Windows--第12节-域与活动目录

工作组 在Windows环境中配置⼯作组相对简单&#xff0c;适合⼩型⽹络环境&#xff0c;如家庭或⼩型办公室⽹络。⼯作组通过简单的⽹络共享和本地管理来实现资源共享&#xff0c;⽽不依赖于中央控制的服务器。 ● 定义&#xff1a;⼯作组是⼀种对等⽹络模型&#xff0c;在这种…

ASP源码 发布站改制最终版 原来3000ok网通大站的源程序

ASP源码 新服发布站改制最终版 原来3000ok网通大站的源程序 这个是非常完整 兼容性很强的。 后台地址&#xff1a;http://你的域名/admin 账号&#xff1a;admin 密码&#xff1a;admin 会员发布地址&#xff1a;http://你的域名/gamevip 源码下载&#xff1a;https://downlo…