使用 Elasticsearch 作为 Azure OpenAI On Your Data 的向量数据库

作者:来自 Elastic Paul Oremland

背景介绍

最近,微软通过 Azure OpenAI 服务 "On Your Data" 将 Elasticsearch 直接集成到 Azure 中。"On Your Data" 使组织能够利用强大的 AI 模型(如 GPT-4 和 RAG 模型)构建最先进的对话体验。这样可以让大型语言模型基于你的私有数据,从而确保对话内容的知情性和准确性。

在本文中,我想展示如何轻松启动一个 Elasticsearch 集群,使用 Elasticsearch 连接器来摄取数据,然后通过新的 Azure OpenAI 服务 "On Your Data" 集成来与这些数据进行对话。我们将在本文中使用的一个工具是最近新增的 Connectors API 和 CLI,这使我们能够完全通过编程方式与 Elasticsearch 进行交互,而无需在开发环境和 Kibana 之间来回切换。

先决条件

在本示例中,我将使用 https://openlibrary.org 中的 OpenLibrary 数据集。 为了使用此数据集,你需要做一些前期工作,让数据准备好摄取到 Elasticsearch 中。 具体来说,你需要:

  1. 从 https://openlibrary.org/developers/dumps 下载最新的数据转储
  2. 将数据转储导入 PostgreSQL。 我使用了 https://github.com/LibrariesHacked/openlibrary-search 中列出的开源工具和步骤

虽然步骤 2 并不是绝对必要的,因为你可以编写自定义摄取脚本,但出于几个原因,我喜欢将数据暂存在 PostgreSQL 中。 首先,Elasticsearch 开箱即用地支持通过连接器从 PostgreSQL 获取数据。 连接器已经针对吞吐量进行了优化,并且内置了一些很好的弹性,我讨厌重新发明轮子。 其次,我可以编写自定义 SQL 查询以与连接器一起使用。 这意味着我有很大的灵活性,可以从数据集中仅提取我想要的数据,并且可以将 “book” 的高度规范化的数据表示为单个文档,而无需编写自定义代码来从原始参考数据转储中执行此操作。 因此,我不必花几天时间编写和调整自定义脚本来创建代表书籍的版本、作者和作品的单个文档,而是只需花费几分钟将数据导入 PostgreSQL 并设置连接器将数据提取到 Elasticsearch 中。

启动 Elasticsearch 集群

现在我已经准备好所有要摄取的数据,我将创建一个 Elasticsearch 部署。我选择使用 Elastic Cloud,因为我不想担心或管理任何基础设施。

注意,我将主要通过命令行和 curl 来完成大部分操作。我会使用一些需要在命令行中导出的 shell 变量,具体包括:

  • ES_URL:你的 Elasticsearch 部署的 URL
  • API_KEY:我们在后续步骤中创建的密钥
  • CONNECTOR_ID:在后续步骤中创建的连接器 ID

第一步是在 . https://cloud.elastic.co/deployments/create 或者通过 API 创建一个部署。因为我知道我会对数百万文档生成嵌入并在查询中执行文本扩展,所以我要将机器学习实例的最小大小增加到 4GB。

展开 "Advanced settings" 部分。

向下滚动到机器学习实例并将 “Minimum size per zone” 更新为 4GB

现在你可以单击 “Create deployment” 按钮。 稍后你的部署就会完成。

接下来,让我们创建一个 API 密钥。 请记住将其保存在安全的地方,因为我们会经常使用它。 请注意,为了使这个示例简单,我使用了过于宽松的访问权限。 在实践中(和在生产中),你可能希望使用角色和/或限制来设置更细粒度的权限。

curl --user elastic -X PUT "${ES_URL}/_security/api_key?pretty" \
-H "Content-Type: application/json" \
-d'
{"name": "books-api-key","role_descriptors": {"role-name": {"cluster": ["all"],"index": [ { "names": ["*"], "privileges": ["all"] } ]}}
}
'

接下来,你需要创建索引并为 title 和 descriptions 字段设置 dense_vector 映射。 此步骤假设你知道文档架构,这会产生一种“先有鸡还是先有蛋”的问题,因为直到摄取数据之后你才知道该架构。 为了简单起见,我使用下面列出的相同步骤设置了一个临时索引,创建了一个连接器,并提取了一个文档(将 SQL 查询的限制设置为 1)。 这使我能够知道文档 schema 是什么样子,这样我就可以在开始时生成我想要的映射。 这是我们团队正在努力在未来版本中解决的已知尖锐问题。

curl -X PUT "${ES_URL}/books-index?pretty" \
-H "Authorization: ApiKey "${API_KEY}"" \
-H "Content-Type: application/json" \
-d'
{"mappings": {"properties": {"public_author_works_authors_edition_isbns_editions_works_description": {"type": "text","copy_to": ["description"]},"public_author_works_authors_edition_isbns_editions_works_title": {"type": "text","copy_to": ["title"]},"description": { "type": "text" },"title": { "type": "text" },"title_embedding": { "type": "dense_vector" },"description_embedding": { "type": "dense_vector" }}}
}
'

现在我们已经创建了索引并设置了映射,让我们下载 E5 模型并将输入字段名称设置为我们刚刚创建的密集向量映射。

curl -X PUT "${ES_URL}/_ml/trained_models/.multilingual-e5-small_linux-x86_64?pretty" \
-H "Authorization: ApiKey "${API_KEY}"" \
-H "Content-Type: application/json" \
-d'
{"input": {"field_names": ["title_embedding", "description_embedding"]}
}
'

接下来我们要部署模型。 如果你收到 408,则需要在执行上一个命令后等待一分钟,以便首先完成下载。

curl -X POST "${ES_URL}/_ml/trained_models/.multilingual-e5-small_linux-x86_64/deployment/_start?wait_for=started&deployment_id=for_search&pretty" -H "Authorization: ApiKey "${API_KEY}""

最后,我们需要创建一个推理管道,当我们从连接器获取数据时,该管道将在 title 和 decription 字段上创建嵌入。

curl -X PUT "${ES_URL}/_ingest/pipeline/e5-small-books?pretty" \
-H "Authorization: ApiKey "${API_KEY}"" \
-H "Content-Type: application/json" \
-d'
{"processors": [{"inference": {"model_id": "for_search","input_output": [{"input_field": "public_author_works_authors_edition_isbns_editions_works_title","output_field": "title_embedding"},{"input_field": "public_author_works_authors_edition_isbns_editions_works_description","output_field": "description_embedding"}]}}]
}
'

摄取数据

现在我们已经创建、配置了集群并准备使用,让我们开始提取数据。 为此,我们将使用 Elasticsearch PostgreSQL 连接器。 我将从源代码中执行此操作,因为为什么不呢,但如果你想要更多开箱即用的东西,你可以从 Docker 安装。

首先,让我们克隆 GitHub 存储库并安装所有依赖项。

git clone git@github.com:elastic/connectors.git
cd connectors && make clean install

接下来,我将使用神奇的连接器 CLI 对我的 Elasticsearch 实例进行身份验证,并让它处理基本的连接器配置。 第一步是通过 CLI 登录 Elasticsearch,并在出现提示时输入你的 Elasticsearch 实例 URL 和 API 密钥。

./bin/connectors login --method apikey

接下来,创建连接器并在出现提示时输入 PostgreSQL 连接信息。

./bin/connectors connector create \
--from-index \
--index-name books-index \
--service-type postgresql \
--index-language en \
--update-config? Connector name: books-postgresql-connector
? Host []: localhost
? Port []: 5432
? Username []: \<USERNAME>
? Password []: \<PASSWORD>
? Database []: openlibrary
? Schema []: public
? Comma-separated list of tables []: *
? Rows fetched per request []:
? Retries per request []:
? Enable SSL verification [False]:

因为我们的数据源有大量标准化数据,所以我们需要创建一个自定义 SQL 语句,我们可以将连接器配置为与其高级同步规则功能一起使用。   我们将使用以下 SQL 语句来帮助我们从高度相关的数据创建单个文档。 请注意,由于此 SQL 将通过 curl 命令发送,因此我们需要使用 '\'' 转义 '。

SELECT DISTINCT ON (author_works.work_key, editions.data->>'\''publish_date'\'') author_works.author_key, editions.key, author_works.author_key, author_works.work_key, edition_isbns.edition_key, edition_isbns.isbn, authors.key, works.key, works.data->>'\''title'\'' AS title, authors.data->>'\''name'\'' AS author_name, COALESCE(works.data->'\''description'\''->>'\''value'\'', '\'''\'') AS description, edition_isbns.isbn AS isbn, editions.data->>'\''publish_date'\'' as publish_date 
FROM editions JOIN edition_isbns on edition_isbns.edition_key = editions.key JOIN works on works.key = editions.work_key JOIN author_works on author_works.work_key = works.key JOIN authors on author_works.author_key = authors.key 
WHERE EXISTS (SELECT 1 FROM jsonb_array_elements(editions.data->'\''languages'\'') AS elem WHERE elem->>'\''key'\'' = '\''/languages/eng'\'') 
ORDER BY editions.data->>'\''publish_date'\'' desc

起草高级同步规则。 连接器运行后,被创建的同步规则将在通过验证后激活。

注意:此 API 调用当前在 Elasticsearch Serverless 中可用,并将包含在 Elasticsearch 8.14 版本中。

curl -X PUT "${ES_URL}/_connector/${CONNECTOR_ID}/_filtering?pretty" \
-H "Authorization: ApiKey "${API_KEY}"" \
-H "Content-Type: application/json" \
-d'
{"advanced_snippet": {"value": [{"tables": [ "editions", "works", "author_works", "authors", "edition_isbns" ],"query": "\<SQL FROM ABOVE>"}]}
}
'

我们还希望将连接器连接到我们之前创建的推理管道,以便在摄取文档时自动生成嵌入。

curl -X PUT "${ES_URL}/_connector/${CONNECTOR_ID}/_pipeline?pretty" \
-H "Authorization: ApiKey "${API_KEY}"" \
-H "Content-Type: application/json" \
-d'
{"pipeline": {"extract_binary_content": true,"name": "e5-small-books","reduce_whitespace": true,"run_ml_inference": true}
}
'

接下来,我们将使用 API 启动同步,将数据提取到 Elasticsearch 中。

curl -X POST "${ES_URL}/_connector/_sync_job?pretty" \
-H "Authorization: ApiKey "${API_KEY}"" \
-H "Content-Type: application/json" \
-d'
{"id": $CONNECTOR_ID,"job_type": "full"
}
'

最后,是时候运行连接器了:

make run

你可以使用以下命令检查摄取了多少文档:

curl -X POST "${ES_URL}/books-index/_count&pretty" -H "Authorization: ApiKey "${API_KEY}""

将 Azure OpenAI On Your Data 连接到 Elasticsearch

现在我们已经部署了 Elasticsearch 并提取了所有数据,让我们使用 Azure OpenAI 服务的 “On Your Data” 与索引进行对话。 为此,我将使用 Azure OpenAI 控制台。

我们需要做的第一件事是打开 Azure AI Studio 的 Web 界面并:

  1. 打开 “Chat” 游乐场
  2. 选择 “Add your data” 选项卡
  3. 单击 “Add your data source” 按钮

接下来,选择 Elasticsearch 作为你的数据源,然后:

  1. 输入你的 Elasticsearch 端点 URL(上面的 $ES_URL)
  2. 输入你的 API 密钥(上面的 $API_KEY)
  3. 单击 “Verify connection” 按钮
  4. 选择你的 books-index
  5. 选中 “Use custom field mapping” 按钮
  6. 单击 “Next” 按钮

接下来,我们将通过以下方式设置搜索类型和嵌入模型:

  1. 从 Search type 下拉列表中选择 “Vector”
  2. 选择 “Elasticsearch - .multilingual-e5-small_linux-x86_64” 作为嵌入模型
  3. 单击 “Next” 按钮

接下来,我们将通过以下方式配置数据字段:

  1. 从 “Content data” 下拉列表中选择包含相关内容的所有字段(例如 “author_name” 和 “description”)
  2. 保留 “title” 和 “Vector fields” 的默认值

在下一个屏幕上,检查你的 data source 设置,然后单击 “Save and close” 按钮,你就可以开始聊天了。

现在你已准备好与你的数据聊天。 这就是语义搜索真正发挥作用的地方。 我能够提出一个初始问题,然后使用聊天历史记录的语义和上下文,能够以自然语言询问我的数据的后续问题。

最棒的是我可以看到与弹出窗口中提供的上下文一致的引文。

接下来该怎么做?

与索引对话只是你能做的众多强大功能之一。在 Azure OpenAI On Your Data 集成之外,一旦你将数据导入 Elasticsearch,还有许多其他尝试,例如使用我们支持的众多第三方嵌入模型之一来部署文本嵌入模型。

可以尝试以下内容:

  1. 使用由 Elastic 训练的稀疏向量检索模型 ELSER。
  2. 使用 Cohere、HuggingFace 或 OpenAI 的嵌入模型设置语义搜索。
  3. 一般来说,任何支持架构的训练模型都可以使用 eland 部署到 Elasticsearch 中。

Elasticsearch 还提供了以下功能:

  1. 使用搜索模板,这是一种存储的搜索,你可以使用不同的变量来运行搜索,而不需要向用户公开 Elasticsearch 的查询语法。搜索模板允许你在不修改应用程序代码的情况下更改搜索。
  2. 使用混合搜索,将词法(BM25)搜索与近似最近邻(kNN)搜索的强大功能结合起来。
  3. 使用学习排序(Learn To Rank)或查询重评分阶段重新排序,以及使用 Cohere 的重新排序 API。

并非所有搜索用例都是语义搜索用例。如果词法搜索(BM25)更适合你的搜索用例,Elasticsearch 提供了几个功能来帮助你获得最相关的搜索结果:

  1. 同义词可以帮助你找到包含类似词语的文档,纠正常见拼写错误,或使特定领域的语言更易于用户理解。你可以使用 synonym API 在内部系统索引中定义和管理同义词,或将相关同义词分组到 “同义词集” 中。
  2. Query Rules 允许为符合指定条件的查询自定义搜索结果。这可以更好地控制结果,例如确保符合定义条件的推广文档出现在结果列表的顶部。

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

原文:Azure OpenAI On Your Data: How to use Elasticsearch as the Vector Database — Elastic Search Labs

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

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

相关文章

想知道期权的交易方式有哪些吗?新手必看!

今天期权懂带你了解想知道期权的交易方式有哪些吗&#xff1f;新手必看&#xff01;期权指投资者在支付了一定的权利金之后&#xff0c;将拥有未来某个时间协定价格买入或者卖出的权利。 期权的交易策略方式有哪些&#xff1f; 买入看涨期权&#xff1a; 使用场景&#xff1a…

C# WPF入门学习主线篇(四)—— Button的常用属性

本期来详细介绍一下WPF中Button组件的属性都有哪些 一、准备阶段 首先&#xff0c;打开我们之前创建好的工程。 这是我们之前几期一起做过的工程&#xff0c;现在重新创建一个button&#xff0c;来熟悉一下他的属性。 选中创建的button&#xff0c;点击属性栏 二、接下来介绍…

layui扩展件(xm-select)实现下拉框

layui扩展件&#xff08;xm-select&#xff09;实现下拉框 扩展组件 xm-select 效果图 html代码 <div class"layui-inline"><label class"layui-form-label">职位</label><div class"layui-input-inline" style"wid…

小皮面板中访问不了本地的sqli网站---解决方法

今天想在sqli-labs中做题&#xff0c;却发现自己访问不了网站 1、具体的错误原因如下 2、查了一下&#xff0c;可能是因为自己访问的域名不对 3、修改了域名为&#xff1a;http://sqli-labs:81/Less-2/便可以访问了 4、然后接下来我有遇到一个错误&#xff0c;这个问题是php版…

【onnx问题解决】关键词:found at least two devices、torch.onnx.export

关键词&#xff1a;Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! 报错&#xff1a; [34m[1mONNX:[0m export failure ❌ 3.8s: Expected all tensors to be on the same device, but found at least two devices, cpu an…

Amazon云计算AWS之[7]内容推送服务CloudFront

文章目录 CDNCDN简介CDN网络技术 CloudFrontCloudFront基本概念 CDN CDN简介 用户在发出服务请求后&#xff0c;需要经过DNS服务器进行域名解析后得到所访问网站的真实IP&#xff0c;然后利用该IP访问网站。在这种模式中&#xff0c;世界各地的访问者都必须直接和网站服务器连…

openflow协议抓包分析

1、准备实验拓扑&#xff1a; 在Mininet环境中创建一个简单的SDN拓扑&#xff0c;包括控制器、交换机、主机等。 确保拓扑能够正常运行&#xff0c;SDN交换机与控制器建立连接。 采用主机Ubuntu22.04主机&#xff0c;IP地址是192.168.87.130&#xff0c;安装opendaylight控制…

Git标签管理

文章目录 1. 什么是标签2. 创建标签3. 标签删除4. 本地标签推送至远程5. 标签远程删除 1. 什么是标签 标签tag &#xff0c;可以简单的理解为是对某次commit的⼀个标识&#xff0c;相当于起了⼀个别名。 例如&#xff0c;在项目发布某个版本的时候&#xff0c;针对最后一次co…

PG实践|PostgreSQL的安装和配置

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注…

代码随想录算法训练营第20天 |● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

文章目录 前言654.最大二叉树思路方法一 递归法方法一2 老师的优化递归法 617.合并二叉树思路方法一 递归法方法二 迭代法 700.二叉搜索树中的搜索思路方法一 递归法方法二 迭代法 98.验证二叉搜索树思路方法一 使用数组方法二 不使用数组代码注意点&#xff1a; 方法二 使用双…

攻击者常用的五个数据中转网站

近来&#xff0c;各种数据中转网站被攻击者广泛用于传播代码片段、配置文件和各种文本数据&#xff0c;尽管这为研究人员提供了观察的窗口&#xff0c;但敏感信息被上传到互联网上时&#xff0c;也会对受害者构成巨大威胁。 这些网站通常并不需要注册或者身份验证&#xff0c;…

深入了解Linux中的环境变量

在Linux系统中&#xff0c;环境变量&#xff08;Environment Variables&#xff09;是用于配置操作系统和应用程序运行环境的一种机制。它们储存在键值对中&#xff0c;可以控制程序的行为、路径查找和系统配置。本文将深入探讨环境变量的基本概念、常见类型、设置和管理方法&a…

Latex公式编辑:在矩阵内画横线与竖线

在LaTeX中&#xff0c;要在矩阵内绘制横线和竖线&#xff0c;我们通常使用array或matrix环境&#xff0c;并结合\hline&#xff08;用于横线&#xff09;和|&#xff08;用于竖线&#xff09;来实现。但需要注意的是&#xff0c;\hline通常用于表格环境中。 LaTeX中绘制分块矩阵…

idea配置ssh、sftp连接服务器,docker插件使用,极其方便,无需再开第三方软件去操作服务器了,集成用于Idea一体

目录 配置SSH连接服务器 配置SFTP文件传输 Docker插件使用 配置SSH连接服务器 Setting>Tools>SSHConfigurations,点击加号新建一个连接&#xff0c;认证形式选key pair 打开终端&#xff0c;连接服务器&#xff0c;就可以终端操作服务器了 配置SFTP文件传输 文件浏览窗…

ThreadLocal简介

Thread类中&#xff0c;有个ThreadLocal.ThreadLocalMap 的成员变量。 ThreadLocalMap内部维护了Entry数组&#xff0c;每个Entry代表一个完整的对象&#xff0c;key是ThreadLocal本身&#xff0c;value是ThreadLocal的泛型对象值 public void set(T value) {Thread t Thread…

装机必备——WinRAR安装教程

装机必备——WinRAR安装教程 软件下载 软件名称&#xff1a;WinRAR 软件语言&#xff1a;简体中文 软件大小&#xff1a;3.38M 系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM4G或更高 下载通道①迅雷云盘丨下…

Linux线程:线程控制

目录 一、线程的退出与等待 1.1pthread_join线程等待 1.2线程异常 1.3线程如何退出和结束 ​编辑 二、线程切换 三、线程的优缺点 3.1优点 3.2缺点 3.3线程vs进程 四、多线程的使用及实操 4.1堆空间共享 一、线程的退出与等待 在Linux中线程具有如下的特点&#xf…

postman教程-4-发送post请求

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了postman发送get请求的方法&#xff0c;本小节我们讲解一下postman发送post请求的方法。 POST请求通常用于向服务器提交数据以创建新资源或执行某些操作。与GET请求不同&#xff0c;POST请求可…

景源畅信电商:做抖店的成本高吗?

在当今数字化时代&#xff0c;抖音不仅仅是一个分享短视频的平台&#xff0c;更是一个充满商机的市场。随着抖音用户量的激增&#xff0c;越来越多的商家和个人开始关注在抖音上开设店铺&#xff0c;即所谓的“抖店”。那么&#xff0c;做抖店的成本高吗?这个问题困扰着许多初…

【鱼眼镜头11】Kannala-Brandt模型和Scaramuzza多项式模型区别,哪个更好?

Kannala-Brandt模型和Scaramuzza多项式模型在描述鱼眼相机畸变时都有其特定的数学表示和应用&#xff0c;但它们之间存在一些区别。以下是对两者区别的分点表示和归纳&#xff1a; 数学表示&#xff1a; Kannala-Brandt模型&#xff1a;它假设图像光心到投影点的距离和角度的多…