使用 Qdrant Edge 和 FastEmbed 进行设备端嵌入

在使用 Python 时,你可以利用 FastEmbed 库来生成用于 Qdrant Edge 的嵌入。FastEmbed 提供了多模态模型,能够在边缘设备上高效运行,从而从文本和图像中生成向量嵌入。

设备配置

假设你运行 Qdrant Edge 的设备可能存在网络连接不稳定或完全断开的情况,你需要提前为设备配置必要的依赖项和模型文件。首先,安装 FastEmbed 和 Qdrant Edge 的 Python 绑定:

pip install fastembed qdrant-edge-py

接下来,下载嵌入模型并将其保存在设备的本地。实例化 ImageEmbeddingTextEmbedding 对象,并将 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_DIRlocal_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_DIRlocal_files_only=True 可以确保从本地目录加载文本嵌入模型。

此页面有用吗?

感谢您的反馈!🙏

很遗憾听到这个消息。😔 你可以在 GitHub 上编辑此页面,或创建一个 GitHub Issue。