Elasticsearch:使用 OpenAI 生成嵌入并进行向量搜索 - nodejs

在我之前的文章:

  • Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation ()()()(

我详细地描述了如何使用 LangChain 及 OpenAI 进行向量搜索及 RAG。在那篇文章中,它没有用户界面。在今天的文章中,我将展示如何使用 OpenAI 来把数据进行向量化(不是使用 Elastic Stack 提供的 eland 上传模型的方式。这种方案是完全免费的),并写入到 Elasticsearch。我们使用 Web UI 来对向量进行搜索。我们可以在如下的地址下载代码:

bash 复制代码
git clone https://github.com/liu-xiao-guo/elasticsearch-labs

我们将使用其中的一个例子:

bash 复制代码
1.  $ pwd
2.  /Users/liuxg/python/elasticsearch-labs/example-apps/openai-embeddings

安装

安装 Elasticsearch 及 Kibana

如果你还没有安装好自己的 Elasticsearch 及 Kibana,那么请参考一下的文章来进行安装:

在安装的时候,请选择 Elastic Stack 8.x 进行安装。在我下面的练习中,我将使用 Elastic Stack 8.11 来进行展示。

运行应用

在运行之前,我们在自己的 terminal 中打入如下的命令:

ini 复制代码
1.  export ELASTICSEARCH_URL=https://localhost:9200
2.  export ELASTIC_USERNAME=elastic
3.  export ELASTIC_PASSWORD=o6G_pvRL=8P*7on+o6XH
4.  export OPENAI_API_KEY=YourOpenAIKey

在我的设置中,我使用自签名证书的 Elasticsearch 集群。在上面,你需要根据自己的 Elasticsearch 超级用户及密码进行配置。你也需要在 OpenAI 的网站中申请开发者 key。你可以在地址 platform.openai.com/api-keys 进行申请。

另外,我们需要拷贝 Elasticsearch 的证书到当前的目录中:

bash 复制代码
1.  $ pwd
2.  /Users/liuxg/python/elasticsearch-labs/example-apps/openai-embeddings
3.  $ cp ~/elastic/elasticsearch-8.11.0/config/certs/http_ca.crt .
4.  $ ls
5.  LICENSE                http_ca.crt            package.json           utils.js
6.  README.md              images                 sample_data            views
7.  generate_embeddings.js package-lock.json      search_app.js

如上所示,generate_embeddings.js 这个文件是用来使用 OpenAI 来生产 embeddings 的。关于如何使用证书及签名连接到 Elasticsearch,请参阅之前的文章 "Elasticsearch:使用最新的 Nodejs client 8.x 来创建索引并搜索"。有关如何连接到 Elasticsearch 的部分代码,请参阅上面的 utils.js。

在运动代码之前,我们使用如下的命令来安装相应的包:

复制代码
npm install
markdown 复制代码
1.  $ vi package.json 
2.  $ npm install

4.  removed 10 packages, and audited 110 packages in 1s

6.  10 packages are looking for funding
7.    run `npm fund` for details

9.  found 0 vulnerabilities

我们可以查看当前的 nodejs 版本:

markdown 复制代码
1.  $ node --version
2.  v19.0.1

我们也可以查看 openai 的版本:

markdown 复制代码
1.  $ npm list | grep openai
2.  openai-integration-example-javascript@1.0.0 /Users/liuxg/python/elasticsearch-labs/example-apps/openai-embeddings
3.  └── openai@4.20.1

在这里需要强调的是 openai 的版本不同,调用的 API 的接口会有区别。

perl 复制代码
1.  $ npm list | grep elasticsearch
2.  openai-integration-example-javascript@1.0.0 /Users/liuxg/python/elasticsearch-labs/example-apps/openai-embeddings
3.  ├── @elastic/elasticsearch@8.8.0

生成向量

我们可以查看 package.json 的文档定义:

package.json

perl 复制代码
1.  {
2.    "name": "openai-integration-example-javascript",
3.    "version": "1.0.0",
4.    "description": "OpenAI integration example",
5.    "main": "search_app.js",
6.    "scripts": {
7.      "app": "node search_app.js",
8.      "generate": "node generate_embeddings.js"
9.    },
10.    "author": "Elastic",
11.    "license": "MIT",
12.    "dependencies": {
13.      "@elastic/elasticsearch": "^8.8.0",
14.      "express": "^4.18.2",
15.      "hbs": "^4.2.0",
16.      "openai": "^4.20.1"
17.    }
18.  }

我们使用如下的命令来生成 embeddings:

arduino 复制代码
npm run generate
markdown 复制代码
1.  $ npm run generate

3.  > openai-integration-example-javascript@1.0.0 generate
4.  > node generate_embeddings.js

6.  Connecting to Elasticsearch: https://localhost:9200
7.  connection success true
8.  Creating index openai-integration...
9.  Reading from file sample_data/medicare.json
10.  Processing 12 documents...
11.  Processing batch of 10 documents...
12.  docsBatch size: 10
13.  Calling OpenAI API for 10 embeddings with model text-embedding-ada-002
14.  Indexing 10 documents to index openai-integration...
15.  Processing batch of 2 documents...
16.  docsBatch size: 2
17.  Calling OpenAI API for 2 embeddings with model text-embedding-ada-002
18.  Indexing 2 documents to index openai-integration...
19.  Processing complete

在运行上面的命令时,一定要在 terminal 中设置上面的变量。在上面,我们可以看到有12个文档已经被摄入到 Elasticsearch 中。它使用的是 OpenAI 的接口来进行向量化的。我们可以使用如下的命令在 Kibana 中进行查看:

bash 复制代码
GET openai-integration/_search

启动 web 应用

我们可以使用如下的命令来启动 web 应用:

arduino 复制代码
npm run app
css 复制代码
1.  $ npm run app

3.  > openai-integration-example-javascript@1.0.0 app
4.  > node search_app.js

6.  Connecting to Elasticsearch: https://localhost:9200
7.  Express app listening on port 3000
8.  connection success true

如上所示,我们的 web 应用在 localhost:3000 的端口上运行。我们可以在浏览器中进行打开:

在 web 应用中进行语义搜索

我们的数据结构如下:

less 复制代码
1.  {
2.      "url": "https://faq.ssa.gov/en-us/Topic/article/KA-01735",
3.      "title": "How do I get a replacement Medicare card?",
4.      "content": "If your Medicare card was lost, stolen, or destroyed, you can request a replacement online at Medicare.gov. You can print an official copy of your card from your online Medicare account or call 1-800-MEDICARE (1-800-633-4227 TTY 1-877-486-2048) to order a replacement card to be sent in the mail."
5.    },
6.    {
7.      "url": "https://faq.ssa.gov/en-us/Topic/article/KA-02713",
8.      "title": "How do I terminate my Medicare Part B (medical insurance)?",
9.      "content": "You can voluntarily terminate your Medicare Part B (Medical Insurance). However, you may need to have a personal interview with Social Security to review the risks of dropping coverage and to assist you with your request. To find out more about how to terminate Medicare Part B or to schedule a personal interview, contact us at 1-800-772-1213 (TTY: 1-800-325-0778) or visit your nearest Social Security office."
10.    },

在我们的实现中,我们是针对 content 这个 text 字段进行向量化的,也就是说我们可以针对这个字段进行语义搜索。

我们尝试进行如下的搜索:

复制代码
how much does Medicare cost?

我们还可以进行如下的搜索:

c 复制代码
how can I terminate my Medicare?
css 复制代码
How can I tell whether I am eligible for Medicare?
相关推荐
启明真纳1 分钟前
Elasticsearch分词
大数据·elasticsearch
Elastic 中国社区官方博客12 小时前
让我们把这个 expense 工具从 n8n 迁移到 Elastic One Workflow
大数据·运维·elasticsearch·搜索引擎·ai·信息可视化·全文检索
Elasticsearch15 小时前
通过将 OpenTelemetry Collector 用作框架,释放其强大功能
elasticsearch
risc12345616 小时前
【Elasticsearch】如何读源码
elasticsearch
Mr-Apple18 小时前
记录一次git commit --amend的误操作
大数据·git·elasticsearch
牛奔21 小时前
git本地提交后,解决push被拒绝 error: failed to push some refs to
大数据·git·elasticsearch·搜索引擎·全文检索
武子康1 天前
大数据-191 Elasticsearch 集群规划与调优:节点角色、分片副本、写入与搜索优化清单
大数据·后端·elasticsearch
云和数据.ChenGuang1 天前
openEuler安装elasticSearch
大数据·elasticsearch·搜索引擎·全文检索·jenkins
光仔December1 天前
【Elasticsearch入门到落地】19、ElasticSearch深度分页问题解决方案:search_after技术详解
elasticsearch·scroll·search_after·from+size·pit
2401_878820471 天前
ES知识点二
大数据·elasticsearch·搜索引擎