你是否希望在Elasticsearch向量数据库之上构建一个RAG应用程序?是否需要对大量数据进行语义搜索?或者你需要在隔离环境中本地运行?这篇文章将告诉你如何实现这些需求。
Elasticsearch提供了多种方式为你的数据创建嵌入进行对称搜索。其中一种流行的方法是使用Elasticsearch开放推理API与OpenAI、Cohere或Hugging Face模型。这些平台支持许多大型、强大的模型,可以在GPU上运行嵌入。然而,第三方嵌入服务并不适用于隔离系统,或者对于有隐私顾虑和法规要求的客户来说是禁用的。
作为替代方案,你可以使用ELSER和E5在本地计算嵌入。这些嵌入模型在CPU上运行,并针对速度和内存使用进行了优化。它们也适用于隔离系统,并且可以在云中使用。然而,这些模型的性能不如运行在GPU上的模型。
如果你能在本地计算数据的嵌入岂不是很棒?使用LocalAI,你可以做到这一点。LocalAI是一个免费且开源的推理服务器,与OpenAI API兼容。它支持使用多个后端进行模型推理,包括用于嵌入的Sentence Transformers和用于文本生成的llama.cpp。LocalAI还支持GPU加速,因此你可以更快地计算嵌入。
这篇文章将向你展示如何使用LocalAI计算数据的嵌入。我们将一步步地指导你如何设置LocalAI,配置它来计算数据的嵌入,并运行它以生成嵌入。你可以在你的笔记本电脑上,在隔离系统中,或者在任何需要计算嵌入的地方运行它。
你感兴趣了吗?让我们开始吧!
要开始使用LocalAI,你需要在你的机器上安装Docker和docker-compose
。根据你的操作系统,你可能还需要安装NVIDIA容器工具包来支持Docker容器中的GPU。
旧版本不支持NVIDIA运行时指令,因此确保你安装了最新版本的docker-compose
:
sudo curl -L https://github.com/docker/compose/releases/download/v2.26.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
检查docker-compose
的版本:
docker-compose --version
你需要使用以下docker-compose.yaml
配置文件:
# file: docker-compose.yaml
services:
localai:
image: localai/localai:latest-aio-gpu-nvidia-cuda-12
container_name: localai
environment:
- MODELS_PATH=/models
- THREADS=8
ports:
- "8080:8080"
volumes:
- $HOME/models:/models
tty: true
stdin_open: true
restart: always
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
注意:
$HOME/models
目录挂载到容器内的/models
目录。这是模型存储的位置。你需要根据你想存储模型的目录调整路径。在本教程中,我们将使用mixedbread-ai/mxbai-embed-large-v1
,它目前在MTEB排行榜上排名第四。然而,任何可以由sentence-transformers
库加载的嵌入模型都可以以相同的方式工作。
创建目录$HOME/models
并创建一个配置文件$HOME/models/mxbai-embed-large-v1.yaml
,内容如下:
# file: mxbai-embed-large-v1.yaml
name: mxbai-embed-large-v1
backend: sentencetransformers
embeddings: true
parameters:
model: mixedbread-ai/mxbai-embed-large-v1
在分离模式下启动Docker容器,运行以下命令:
docker-compose up -d
从你的$HOME
目录运行。
通过运行docker-compose ps
验证容器是否正确启动,检查localai
容器是否处于Up
状态。
你应该看到类似以下的输出:
~$ docker-compose ps
WARN[0000] /home/valeriy/docker-compose.yaml: `version` is obsolete
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
localai localai/localai:latest-aio-gpu-nvidia-cuda-12 "/aio/entrypoint.sh" localai About a minute ago Up About a minute (health: starting) 0.0.0.0:8080->8080/tcp
如果出现问题,请检查日志。你还可以使用日志来验证LocalAI是否能看到GPU。运行以下命令:
docker logs localai
应该能看到类似以下的信息:
$ docker logs localai
===> LocalAI All-in-One (AIO) container starting...
NVIDIA GPU detected
Thu Mar 28 11:15:41 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.10 Driver Version: 535.86.10 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 Tesla T4 Off | 00000000:00:04.0 Off | 0 |
| N/A 59C P0 29W / 70W | 2MiB / 15360MiB | 6% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| No running processes found |
+---------------------------------------------------------------------------------------+
NVIDIA GPU detected. Attempting to find memory size...
Total GPU Memory: 15360 MiB
最后,你可以通过查询已安装的模型列表来验证推理服务器是否正常工作:
curl -k http://localhost:8080/v1/models
应产生如下输出:
{"object":"list","data":[{"id":"tts-1","object":"model"},{"id":"text-embedding-ada-002","object":"model"},{"id":"gpt-4","object":"model"},{"id":"whisper-1","object":"model"},{"id":"stablediffusion","object":"model"},{"id":"gpt-4-vision-preview","object":"model"},{"id":"MODEL_CARD","object":"model"},{"id":"llava-v1.6-7b-mmproj-f16.gguf","object":"model"},{"id":"voice-en-us-amy-low.tar.gz","object":"model"}]}
_inference
服务我们已经创建并配置了LocalAI推理服务器。由于它是OpenAI推理服务器的替代品,我们可以在Elasticsearch中创建一个新的openai
推理服务。此功能在Elasticsearch 8.14中实现。
要创建新的推理服务,请在Kibana中打开开发工具并运行以下命令:
PUT _inference/text_embedding/mxbai-embed-large-v1
{
"service": "openai",
"service_settings": {
"model_id": "mxbai-embed-large-v1",
"url": "http://localhost:8080/embeddings",
"api_key": "ignored"
}
}
注意:
api_key
参数对于openai
服务是必需的,必须设置,但对于我们的LocalAI服务,其具体值并不重要。PUT
请求可能会超时。此时请稍后重试PUT
请求。最后,你可以验证推理服务是否正常工作:
POST _inference/text_embedding/mxbai-embed-large-v1
{
"input": "It takes all the running you can do, to keep in the same place. If you want to get somewhere else, you must run at least twice as fast as that!"
}
应产生如下输出:
{
"text_embedding": [
{
"embedding": [
-0.028375082,
0.6544269,
0.1583663,
0.88167363,
0.5215657,
0.05415681,
0.62085253,
0.069351405,
0.29407632,
0.51018727,
0.8183201,
...
]
}
]
}
通过本文中的步骤,你可以设置LocalAI来使用GPU加速计算数据的嵌入,而无需依赖第三方推理服务。使用LocalAI,Elasticsearch的用户在隔离环境或有隐私顾虑的情况下,可以利用世界一流的向量数据库为他们的RAG应用程序提供服务,而不会牺牲计算性能或选择最佳AI模型的能力。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。