使用 Qdrant Edge 和 FastEmbed 进行设备端嵌入
在使用 Python 时,你可以利用 FastEmbed 库来生成用于 Qdrant Edge 的嵌入。FastEmbed 提供了多模态模型,能够在边缘设备上高效运行,从而从文本和图像中生成向量嵌入。
设备配置
假设你运行 Qdrant Edge 的设备可能存在网络连接不稳定或完全断开的情况,你需要提前为设备配置必要的依赖项和模型文件。首先,安装 FastEmbed 和 Qdrant Edge 的 Python 绑定:
pip install fastembed qdrant-edge-py
接下来,下载嵌入模型并将其保存在设备的本地。实例化 ImageEmbedding 和 TextEmbedding 对象,并将 cache_dir 参数设置为本地目录:
from fastembed import ImageEmbedding, TextEmbedding
TEXT_MODEL_NAME='Qdrant/clip-ViT-B-32-text'
VISION_MODEL_NAME='Qdrant/clip-ViT-B-32-vision'
MODELS_DIR="./qdrant-edge-directory/models"
ImageEmbedding(
model_name=VISION_MODEL_NAME,
cache_dir=MODELS_DIR
)
TextEmbedding(
model_name=TEXT_MODEL_NAME,
cache_dir=MODELS_DIR
)
模型将被下载并缓存到指定的 MODELS_DIR 目录中,之后你可以从该目录使用它们来生成嵌入。
生成图像嵌入
首先,按照 Qdrant Edge 快速入门指南中的描述初始化一个边缘分片(Edge Shard)。
详细信息
from pathlib import Path
from qdrant_edge import (
Distance,
EdgeConfig,
EdgeShard,
EdgeVectorParams,
)
SHARD_DIRECTORY = "./qdrant-edge-directory"
VECTOR_DIMENSION = 512
VECTOR_NAME="my-vector"
Path(SHARD_DIRECTORY).mkdir(parents=True, exist_ok=True)
config = EdgeConfig(
vectors={
VECTOR_NAME: EdgeVectorParams(
size=VECTOR_DIMENSION,
distance=Distance.Cosine,
)
}
)
edge_shard = EdgeShard.create(SHARD_DIRECTORY, config)
假设你有一个图像文件 temp.jpg,你可以使用 FastEmbed 的 ImageEmbedding 类为其生成嵌入,然后将其存储到边缘分片中:
from pathlib import Path
from qdrant_edge import Point, UpdateOperation
import uuid
IMAGES_DIR = "images"
image_model = ImageEmbedding(
model_name=VISION_MODEL_NAME,
cache_dir=MODELS_DIR,
local_files_only=True
)
embeddings = list(image_model.embed([Path(IMAGES_DIR) / "temp.jpg"]))[0]
point = Point(
id=str(uuid.uuid4()),
vector={VECTOR_NAME: embeddings.tolist()}
)
edge_shard.update(UpdateOperation.upsert_points([point]))
请注意使用 cache_dir=MODELS_DIR 和 local_files_only=True,以确保从预先下载的本地目录中加载图像嵌入模型。
生成文本嵌入
在查询时,你可以使用 FastEmbed 的 TextEmbedding 类生成文本嵌入。例如,要查询边缘分片:
from qdrant_edge import Query, QueryRequest
text_model = TextEmbedding(
model_name=TEXT_MODEL_NAME,
cache_dir=MODELS_DIR,
local_files_only=True
)
embeddings = list(text_model.embed(["<search terms>"]))[0]
results = edge_shard.query(
QueryRequest(
query=Query.Nearest(embeddings.tolist(),using=VECTOR_NAME),
limit=10,
with_vector=False,
with_payload=True
)
)
同样,使用 cache_dir=MODELS_DIR 和 local_files_only=True 可以确保从本地目录加载文本嵌入模型。