实验场:在几分钟内使用 Elasticsearch 进行 RAG 应用程序实验

news2024/12/25 1:45:15

作者:来自 Elastic Joe McElroy, Serena Chou

什么是 Playground(实验场)?

我们很高兴发布我们的 Playground 体验 —- 一个低代码界面,开发人员可以在几分钟内使用自己的私人数据探索他们选择的 LLM。

在对对话式搜索进行原型设计时,快速迭代和试验 RAG 工作流的关键组件(例如:混合搜索或添加重新排名)的能力非常重要 —- 以便从 LLMs 获得准确且无幻觉的响应。

Elasticsearch 向量数据库和 Search AI 平台为开发人员提供了广泛的功能,例如全面的混合搜索,以及使用来自越来越多的 LLM 提供商的创新。我们在 Playground 体验中的方法允许你使用这些功能的强大功能,而不会增加复杂性。

A/B 测试 LLMs 并选择不同的推理提供商

Playground 的直观界面允许你对来自模型提供商(如 OpenAI 和 Anthropic)的不同 LLM 进行 A/B 测试并改进你的检索机制,以便使用你自己的数据(索引到一个或多个 Elasticsearch 索引中)来获得答案。Playground 体验可以直接在 Elasticsearch 中利用转换器模型,但也可以通过 Elasticsearch Open Inference API 进行扩展,该 API 与越来越多的推理提供商集成,包括 Cohere 和 Azure AI Studio。

带有检索器(retrievers)和混合搜索的最佳上下文窗口

正如 Elasticsearch 开发人员已经知道的那样,最佳上下文窗口是使用混合搜索构建的。你为实现此结果而构建的策略需要访问多种形式的向量化和纯文本数据,这些数据可以分块并分布在多个索引中。

我们正在帮助你使用新引入的 query retrievers 简化查询构建以搜索所有内容!借助三个关键检索器(现已在 8.14 和 Elastic Cloud Serverless 中提供),使用 RRF 规范化分数的混合搜索只需一个统一查询即可完成。使用检索器,playground 可以了解所选数据的形状,并会自动为你生成统一查询。存储向量化数据并探索 kNN 检索器,或者通过选择数据添加元数据和上下文以生成混合搜索查询。即将推出的语义重新排名可以轻松合并到你生成的查询中,以实现更高质量的召回率。

一旦你根据生产标准调整和配置了语义搜索,你就可以导出代码,并使用 Python Elasticsearch 语言客户端或 LangChain Python 集成完成应用程序中的体验。

Playground 现已在 Elastic Cloud Serverless 上可用,并且现已在 Elastic Cloud 8.14 中可用。

使用 Playground

可以从 Kibana(Elasticsearch UI)中访问 Playground,方法是从侧面导航栏导航到 “Playground”。

连接到你的 LLM

Playground 支持聊天完成模型,例如来自 OpenAI、Azure OpenAI 或通过 Amazon Bedrock 的 Anthropic 的 GPT-4o。首先,你需要连接到其中一个模型提供商,以获取你选择的 LLM。

与你的数据聊天

可以使用任何数据,甚至基于 BM25 的索引。你可以选择使用文本嵌入模型(如我们的零样本语义搜索模型 ELSER)转换你的数据字段,但这不是必需的。入门非常简单 - 只需选择你想要用来作为答案依据的索引并开始提问即可。在此示例中,我们将使用 PDF 并从使用 BM25 开始,每个文档代表 PDF 的一页。

使用 Python 使用 BM25 索引 PDF 文档

首先,我们安装依赖项。我们使用 pypdf 库读取 PDF 并请求检索它们。

!pip install -qU pypdf requests elasticsearch

然后我们读取文件,创建一个包含文本的页面数组。

    import PyPDF2
    import requests
    from io import BytesIO

    def download_pdf(url):
        response = requests.get(url)
        if response.status_code == 200:
            return BytesIO(response.content)
        else:
            print("Failed to download PDF")
            return None

    def get_pdf_pages(pdf_file):
        pages = []
        pdf_reader = PyPDF2.PdfReader(pdf_file)
        for page in pdf_reader.pages:
            text = page.extract_text()
            pages.append(text)
        return pages

    pdf_file = download_pdf("https://arxiv.org/pdf/2103.15348.pdf")
    if pdf_file:
        pages = get_pdf_pages(pdf_file)

然后我们将其导入 elasticsearch 的 my_pdf_index_bm25 索引下。

    from elasticsearch import helpers

    client = Elasticsearch(
       "<my-cloud-url>",
       api_key=ELASTIC_API_KEY,
    )

    helpers.bulk(
        client,
        [
            {
                "_index": "my_pdf_index_bm25",
                "_source": {
                    "text": page,
                    "page_number": i,
                },
            }
            for i, page in enumerate(pages)
        ],
        request_timeout=60,
    )

使用 Playground 与你的数据进行对话

一旦我们将 LLM 与连接器连接并选择索引,我们就可以开始询问有关 PDF 的问题。LLM 现在将轻松为你的数据提供答案。

幕后发生了什么?

当我们选择索引时,我们会自动确定最佳检索方法。在这种情况下,仅提供 BM25 关键字搜索,因此我们生成多匹配类型查询来执行检索。

由于我们只有一个字段,因此我们默认搜索该字段。如果你有多个字段,你可以选择要搜索的字段,以改进相关文档的检索。

提出问题

当你提出问题时,Playground 将使用查询执行检索,以查找与你的问题匹配的相关文档。然后,它将以此为上下文并提供提示,为你选择的 LLM 模型返回的答案打下基础。

我们使用文档中的特定字段作为上下文。在此示例中,Playground 选择了名为 “text” 的字段,但可以在 “edit context” 操作中更改此字段。

默认情况下,我们最多检索 3 个文档作为上下文,但你也可以在编辑上下文弹出窗口中调整该数字。

提出后续问题

通常,后续问题与之前的对话有关。考虑到这一点,我们要求 LLM 使用对话将后续问题重写为独立问题,然后将其用于检索。这使我们能够检索更好的文档,以用作帮助回答问题的上下文。

上下文

当根据你的问题找到文档时,我们会将这些文档作为上下文提供给 LLM,以便 LLM 在回答时巩固其知识。我们会自动选择一个我们认为最好的索引字段,但你可以通过编辑上下文弹出窗口来更改此字段。

使用语义搜索和分块改进检索

由于我们的查询是问题形式,因此检索能够根据语义进行匹配非常重要。使用 BM25,我们只能匹配词汇上符合我们问题的文档,因此我们还需要添加语义搜索。

使用 ELSER 进行稀疏向量语义搜索

开始语义搜索的一个简单方法是将 Elastic 的 ELSER 稀疏嵌入模型用于我们的数据。与许多这种规模和架构的模型一样,ELSER 具有典型的 512 个 token 限制,并且需要选择适当的分块策略来适应它。在即将推出的 Elasticsearch 版本中,我们将默认分块作为向量化过程的一部分,但在此版本中,我们将遵循按段落分块的策略作为起点。你的数据形状可能会受益于其他分块策略,我们鼓励进行实验以改进检索。

使用 pyPDF 和 LangChain 对 PDF 进行分块和提取

为了简化示例,我们将使用 LangChain 工具加载页面并将其拆分为段落。LangChain 是一种流行的 RAG 开发工具,可以与我们更新的集成集成,并与 Elasticsearch 向量数据库和语义重新排名功能一起使用。

创建 ELSER 推理端点

可以执行以下 REST API 调用来下载、部署和检查模型的运行状态。你可以使用 Kibana 中的开发工具执行这些操作。

# Starts ELSER Service into Elasticsearch ML node
# This may take a while, depending on ML node autoscaling
PUT _inference/sparse_embedding/my-elser-model
{
  "service": "elser",
  "service_settings": {
    "num_allocations": 1,
    "num_threads": 1
  }
}

# Check to see if trained model status. Look at nodes.routing_state is "started"
GET _ml/trained_models/my-elser-model/_stats

导入 Elasticsearch

接下来,我们将设置一个索引并附加一个管道来为我们处理推理。

# Setup an elser pipeline to embed the contents in text field
# using ELSER into the text_embedding field
PUT /_ingest/pipeline/my-elser-pipeline
{
  "processors": [
    {
      "inference": {
        "model_id": "my-elser-model",
        "input_output": [
          {
            "input_field": "text",
            "output_field": "text_embedding"
          }
        ]
      }
    }
  ]
}

# Setup an index which uses the embedding pipeline
# ready for our documents to be stored in
PUT /elser_index
{
  "mappings": {
    "properties": { 
      "text": {
        "type": "text"
      },
      "text_embedding": {
        "type": "sparse_vector"
      }
    }
  },
  "settings": {
    "index": {
      "default_pipeline": "my-elser-pipeline"
    }
  }
}

将页面拆分成段落并导入 Elasticsearch

现在 ELSER 模型已经部署完毕,我们可以开始将 PDF 页面拆分成段落并导入 Elasticsearch。



    from langchain_community.document_loaders import PyPDFLoader
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    from elasticsearch import helpers

    loader = PyPDFLoader("https://arxiv.org/pdf/2103.15348.pdf")

    data = loader.load()

    text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
        chunk_size=512, chunk_overlap=256
    )
    docs = loader.load_and_split(text_splitter=text_splitter)

    helpers.bulk(
        client,
        [
            {
                "_index": "elser_index",
                "_source": {
                    "text": doc.page_content,
                    "page_number": i,
                },
            }
            for i, doc in enumerate(docs)
        ],
        request_timeout=60,
    )

就这样!我们应该将嵌入 ELSER 的段落导入 Elasticsearch。

在 Playground 上查看实际操作

现在,在选择索引时,我们使用 deployment_id 生成基于 ELSER 的查询来嵌入查询字符串。

当提出问题时,我们现在有一个语义搜索查询,用于检索与问题语义相匹配的文档。

混合搜索变得简单

启用文本字段也可以启用混合搜索。当我们检索文档时,我们现在会搜索关键字匹配和语义含义,并使用 RRF 算法对两个结果集进行排序。

改进 LLM 的答案

使用 Playground,你可以调整提示、调整检索并创建多个索引(分块策略和嵌入模型)以改进和比较你的答案。

将来,我们将提供有关如何充分利用索引的提示,并建议优化检索策略的方法。

System Prompt

默认情况下,我们提供一个简单的系统提示,你可以在模型设置中更改它。它与更广泛的系统提示一起使用。你只需编辑它即可更改简单的系统提示。

优化上下文

良好的响应依赖于良好的上下文。使用诸如对内容进行分块和优化数据分块策略等方法非常重要。除了对数据进行分块外,你还可以尝试不同的文本嵌入模型来改进检索,看看哪种模型能给你带来最佳结果。在上面的例子中,我们使用了 Elastic 自己的 ELSER 模型,但推理服务支持大量嵌入模型,这些模型可能更适合你的需求。

优化上下文的其他好处包括更好的成本效率和速度:成本是根据标记(输入和输出)计算的。在分块和 Elasticsearch 强大的检索功能的帮助下,我们提供的相关文档越多,你的用户的成本就越低,延迟就越快。

如果你注意到,我们在 BM25 示例中使用的输入 token 比 ELSER 示例中的要大。这是因为我们有效地对文档进行了分块,并且只向 LLM 提供了页面上最相关的段落。

最后一步!将 RAG 集成到你的应用程序中

一旦你对响应感到满意,你就可以将此体验集成到你的应用程序中。查看代码提供了如何在你自己的 API 中执行此操作的示例应用程序代码。

目前,我们提供了使用 OpenAI 或 LangChain 的示例,但 Elasticsearch 查询、系统提示以及模型与 Elasticsearch 之间的一般交互相对简单,可供你自行调整使用。

结论

对话式搜索体验的构建可以考虑多种方法,而选择可能会让人不知所措,尤其是随着新的重新排名和检索技术的创新步伐,这两种技术都适用于 RAG 应用程序。

使用我们的 Playground,即使开发人员可以使用多种功能,这些选择也会变得简单直观。我们的方法独特之处在于,可以立即将混合搜索作为构建的主要支柱,直观地了解所选和分块数据的形状,并扩大 LLMs 的多个外部提供商的访问范围。

使用 Playground 构建、测试、享受乐趣

立即前往 Playground 文档开始吧!探索 GitHub 上的搜索实验室,了解 Cohere、Anthropic、Azure OpenAI 等提供商的新手册和集成。

准备好自己尝试一下了吗?开始免费试用。
Elasticsearch 集成了 LangChain、Cohere 等工具。加入我们的高级语义搜索网络研讨会,构建你的下一个 GenAI 应用程序!

原文:Playground: Experiment with RAG applications with Elasticsearch in minutes — Elastic Search Labs

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

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

相关文章

“实时数据大屏2k、4k、8k”这样做【高级前端必备技能之一】

&#x1f525;废话不多先上效果图 &#x1f525;划重点 新手程序员需要注意以下几点&#xff1a; 我们需要进行充分的技术调研&#xff0c;进行技术选型产品&#xff0c;UI&#xff0c;再三确认效果图是否确定&#xff0c;避免后续出现返工的情况 不能拿到效果图之后&#x…

事务的概念-事务的概念、事务的定义(BEGIN TRANSACTION、COMMIT、ROLLBACK)

数据库系统中的事务&#xff0c;是保证系统在发生故障后或存在并发操作的情况下&#xff0c;数据库中的数据与企业业务结果相一致 一、事务的概念 在许多数据库应用系统中&#xff0c;数据库用来存储现实世界中一些企业的状态信息或其管理的数据 1、概念一 &#xff08;1&a…

《昇思25天学习打卡营第3天|张量 Tensor》

文章目录 前言&#xff1a;今日所学&#xff1a;1. 创建张量2. 张量的属性3.张量索引与运算4. NumPy与Tensor的转换5. 稀疏张量 前言&#xff1a; 张量&#xff1f;张亮&#xff1f;张量是什么&#xff1f; 张量是一个可以用来表示在一些矢量、标量和其他张量之间的线性关系的…

博途TIA Portal「集成自动化软件」下载安装,TIA Portal 灵活多变的编程环境

在编程领域&#xff0c;博途TIA Portal以其卓越的编程工具和灵活多变的编程环境&#xff0c;为众多用户提供了前所未有的便利。这款软件不仅支持多种编程语言&#xff0c;如梯形图&#xff08;Ladder Diagram&#xff09;、功能块图&#xff08;Function Block Diagram&#xf…

2024夏促steam商店加载失败、steam无法加载活动怎么办

今年的夏季促销活动终于开始了&#xff0c;一般夏季促销大多是去年和今年的热门游戏&#xff0c;不过也会有不少经典游戏参与活动&#xff0c;都是较低的价格出售。因为最近高考结束&#xff0c;考虑到会有不少新玩家前来入手游戏&#xff0c;为了让大家能顺利找到喜欢的游戏&a…

使用 Elastic ELSER 和 Llama3 的 RAG(使用 Langchain)

在之前的文章 “使用 Llama 3 开源和 Elastic 构建 RAG”&#xff0c;我们讲到了如何使用 Liama3 来结合 Elastic ELSER 来进行 RAG。在今天的文章里&#xff0c;我们来详细使用一个 notebook 来展示如何在本地 Elasticsearch 部署中进行实现。 此交互式 notebook 使用 Langch…

【Linux进程通信】进程间通信介绍、匿名管道原理分析

目录 进程通信是什么&#xff1f; 进程通信的目的 进程通信的本质 匿名管道&#xff1a;基于文件级别的通信方式 站在文件描述符角度-深度理解管道原理 进程通信是什么&#xff1f; 进程通信就是两个或多个进程之间进行数据层面的交互。 进程通信的目的 1.数据传输&#x…

康之味与东兴朱雀桥达成合作,引进40柜越南薇妮她牌NFC果汁饮料

近日&#xff0c;国内知名果汁品牌康之味再次展现其强大的市场影响力与前瞻性的战略眼光&#xff0c;成功与业界佼佼者东兴朱雀桥达成新一轮合作。此次合作的重磅成果&#xff0c;便是康之味顺利拿下40条柜的越南薇妮她VINUT牌NFC人参果汁饮料的进口权。 薇妮她VINUT牌NFC人参果…

msvcr120.dll文件下载的高级教程,修复msvcr120.dll 详细步骤分享

当电脑系统或特定应用程序无法找到或访问到msvcr120.dll文件时&#xff0c;便会导致错误消息的出现&#xff0c;例如“找不到 msvcr120.dll”、“msvcr120.dll丢失”等。这篇文章将大家讨论关于msvcr120.dll文件的内容、msvcr120.dll丢失问题的解决方法&#xff0c;其中最常见的…

【贡献法】2262. 字符串的总引力

本文涉及知识点 贡献法 LeetCode2262. 字符串的总引力 字符串的 引力 定义为&#xff1a;字符串中 不同 字符的数量。 例如&#xff0c;“abbca” 的引力为 3 &#xff0c;因为其中有 3 个不同字符 ‘a’、‘b’ 和 ‘c’ 。 给你一个字符串 s &#xff0c;返回 其所有子字符…

AI智能在Type-C领域的应用

随着科技的飞速发展&#xff0c;Type-C接口凭借其卓越的性能和广泛的应用场景&#xff0c;已成为现代电子设备中不可或缺的一部分。而AI智能技术的兴起&#xff0c;为Type-C领域带来了革命性的变革&#xff0c;推动了其功能的进一步完善和应用领域的拓展。本文将探讨AI智能在Ty…

ZABBIX-7.0LTS在线部署部署教程

ZABBIX-7.0LTS在线部署部署教程 环境&#xff1a; 操作系统&#xff1a; ubuntu 22.04zabbix-server版本&#xff1a; 7.0LTS系统配置[需结合监控的业务量提供配置]&#xff1a; 建议2C(CPU)8G(运行) 100GB(存储)架构&#xff1a;LNMP 第一步&#xff1a; 系统初始化 1.配置…

Python逻辑控制语句 之 判断语句--if else结构

1.if else 的介绍 if else &#xff1a;如果 ... 否则 .... 2.if else 的语法 if 判断条件: 判断条件成立&#xff0c;执行的代码 else: 判断条件不成立&#xff0c;执行的代码 &#xff08;1&#xff09;else 是关键字, 后⾯需要 冒号 &#xff08;2&#xff09;存在冒号…

【网络】计算机网络-基本知识

目录 概念计算机网络功能计算机网络的组成计算机网络的分类 网络地址网络地址的分类 计算机网络相关性能指标速率带宽吞吐量时延时延的种类&#xff1a; 时延带宽积往返时延RTT利用率 概念 计算机网络是指将多台计算机通过通信设备连接起来&#xff0c;实现数据和资源的共享。…

git 代码回退 soft hard区别

一:只是本地修改提交到本地版本库仓库,代码如何回退 git hard 回退 会清除掉 你当前修改的所有文件代码内容 或添加的新文件 把当前文件恢复到没有修改前的状态 git soft 回退 不会清除掉 你当前修改的所有文件代码内容 或添加的新文件 把当前文件恢复到当时修改时的状…

06 Shell编程实战——案例1

脚本编程步骤&#xff1a; 脚本编程一般分为4个步骤&#xff0c;即先确定需求&#xff0c;然后再确定你所要用到的语句&#xff0c; 需求分析&#xff1a;根据系统管理的需求&#xff0c;分析脚本要实现的功能、功能实现的层次、实现的命令与语句等&#xff1b;命令测试&…

K 近邻、K-NN 算法图文详解

1. 为什么学习KNN算法 KNN是监督学习分类算法&#xff0c;主要解决现实生活中分类问题。根据目标的不同将监督学习任务分为了分类学习及回归预测问题。 KNN&#xff08;K-Nearest Neihbor&#xff0c;KNN&#xff09;K近邻是机器学习算法中理论最简单&#xff0c;最好理解的算法…

利用python爬取上证指数股吧评论并保存到mongodb数据库

大家好&#xff0c;我是带我去滑雪&#xff01; 东方财富网是中国领先的金融服务网站之一&#xff0c;以提供全面的金融市场数据、资讯和交易工具而闻名。其受欢迎的“股吧”论坛特别适合爬取股票评论&#xff0c;东方财富网的股吧聚集了大量投资者和金融分析师&#xff0c;他们…

50-2 内网信息收集 - 内网工作环境(域相关知识)

一、工作组 工作组(Work Group)是局域网中最基本的资源管理模式,适用于小规模网络环境。 工作组的定义: 工作组是将不同功能或部门的计算机分组管理的方式。它提供了层次化的网络资源管理,使得组织内的计算机可以按照功能或部门分类。每个工作组有一个自定义的主机名称,…

Java学习【IO流:深入理解与应用(上)】

Java学习【IO流&#xff1a;深入理解与应用&#xff08;上&#xff09;】 &#x1f343;1.IO流体系结构&#x1f343;2.FileOutputStream&#x1f341;2.1FileOutputStream写数据的三种方式&#x1f341;2.2换行和续写 &#x1f343;3.FileInputStream&#x1f341;3.1每次读取…