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?
相关推荐
ACGkaka_5 小时前
ES 学习(九)从文本到词元:分词器如何“拆解“你的数据
大数据·学习·elasticsearch
Elastic 中国社区官方博客5 小时前
如何使用 LogsDB 降低 Elasticsearch 日志存储成本
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索·可用性测试
A__tao5 小时前
一键实现 SQL 转 Elasticsearch Mapping(支持字段注释 + meta 描述)
数据库·sql·elasticsearch
老纪的技术唠嗑局1 天前
告别OpenClaw配置丢失——Mindkeeper内测版邀测
大数据·elasticsearch·搜索引擎
Elasticsearch1 天前
使用 Elasticsearch + Jina embeddings 进行无监督文档聚类
elasticsearch
勇哥的编程江湖1 天前
flinkcdc streaming 同步数据到es记录过程
大数据·elasticsearch·flink·flinkcdc
曾阿伦1 天前
Elasticsearch 7.x 常用命令备忘录
大数据·elasticsearch·搜索引擎
斯特凡今天也很帅1 天前
Elasticsearch数据库专栏(二)DSL语句总结(更新中)
大数据·elasticsearch·搜索引擎
要记得喝水1 天前
适用于 Git Bash 的脚本,批量提交和推送多个仓库的修改
git·elasticsearch·bash
二十七剑1 天前
Elasticsearch的索引问题
大数据·elasticsearch·搜索引擎