在我之前的文章:
我详细地描述了如何使用 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?