在现代人工智能应用中,向量数据库如Pinecone,被广泛用于存储文本和图像嵌入,以便在检索增强型生成(RAG)流程中使用。通过向量数据库,可以确定哪些信息候选可以作为上下文包含在大型语言模型(LLM)或大型多模态模型(LMM)的提示中。
本指南将展示如何使用Roboflow Inference计算并加载图像嵌入到Pinecone中。Roboflow Inference是一个快速、可扩展的工具,可以运行包括CLIP在内的最新视觉模型。CLIP模型可以用来计算图像嵌入。完成本指南后,将能够:
- 使用Roboflow Inference计算CLIP嵌入。
- 将图像嵌入加载到Pinecone中。
- 使用嵌入和Pinecone运行向量搜索。
让开始吧!
Pinecone是什么?
Pinecone是一个向量数据库,可以在其中存储数据和嵌入。可以存储来自OpenAI的文本嵌入模型、OpenAI的CLIP模型、Hugging Face模型等的嵌入。Pinecone提供了多种语言的SDK,包括Python,这些SDK提供了与Pinecone向量数据库交互的本地语言方式。
步骤 #1: 安装Roboflow Inference
将使用RoboflowInference来计算CLIP嵌入。Roboflow Inference是一个开源解决方案,用于大规模运行视觉模型。可以使用Inference来运行微调的对象检测、分类和分割模型,以及基础模型,如Segment Anything和CLIP。
可以在自己的设备上使用Inference,也可以通过Roboflow API使用。对于本指南,将在自己的设备上使用Inference,这适合于有计算资源来运行CLIP嵌入计算的情况。还将展示如何使用Roboflow CLIP API,它使用与在自己机器上运行的Inference相同的接口。
首先,安装Docker。参考,了解如何在想要运行Inference的设备上安装Docker。
接下来,安装Roboflow Inference CLI。这个工具可以让用一个命令启动Inference服务器。可以使用以下命令安装Inference CLI:
pip install inference-cli
启动一个推理服务器:
inference server start
此命令将在启动一个Inference服务器。将在下一步中使用这个服务器来计算CLIP嵌入。
步骤 #2: 设置Pinecone数据库
将为一个图像文件夹创建一个搜索引擎。对于本指南,将使用来自COCO 128数据集的图像,该数据集包含各种不同的图像。数据集包含飞机、斑马和西兰花等对象。
可以从下载数据集作为ZIP文件,或者使用自己的图像文件夹。
在能够设置Pinecone向量数据库之前,需要安装Pinecone Python SDK,将使用它与Pinecone交互。可以使用以下命令进行安装:
pip install pinecone-client
接下来,创建一个新的Python文件,并添加以下代码:
from pinecone import Pinecone, PodSpec
import os
pc = Pinecone(api_key=os.environ["PINECONE_API_KEY"])
pc.create_index(
name='images',
dimension=512,
metric="cosine",
spec=PodSpec(environment="gcp-starter", pod_type="starter")
)
创建一个Pinecone账户。创建账户后,从Pinecone控制台的“API密钥”页面检索API密钥和环境。不需要在Pinecone仪表板中创建索引,因为代码片段将执行此操作。
将YOUR_API_KEY替换为Pinecone API密钥,将YOUR_ENVIRONMENT替换为Pinecone API密钥页面上的环境值。
此代码将创建一个名为“images”的索引,将在此索引上工作。
接下来,创建一个新的Python文件,并添加以下代码:
from pinecone import Pinecone
import base64
import requests
import os
import uuid
pc = Pinecone(api_key=os.environ["PINECONE_API_KEY"])
index = pc.Index("images")
IMAGE_DIR = "images/train/images/"
API_KEY = os.environ.get("ROBOFLOW_API_KEY")
SERVER_URL = "http://localhost:9001"
vectors = []
for i, image in enumerate(os.listdir(IMAGE_DIR)):
print(f"Processing image {image}")
infer_clip_payload = {
"image": {
"type": "base64",
"value": base64.b64encode(open(IMAGE_DIR + image, "rb").read()).decode("utf-8"),
},
}
res = requests.post(
f"{SERVER_URL}/clip/embed_image?api_key={API_KEY}",
json=infer_clip_payload,
)
embeddings = res.json()['embeddings']
print(res.status_code)
vectors.append({"id": str(uuid.uuid4()), "values": embeddings[0], "metadata": {"filename": image}})
index.upsert(vectors=vectors)
在上面的代码中,遍历名为“images/train/images/”的文件夹中的所有图像,并使用RoboflowInference为每个图像计算CLIP嵌入。如果想使用托管的Roboflow CLIP API来计算CLIP向量,可以通过将API_URL值替换为https://infer.roboflow.com来实现。
将所有向量保存在名为“images”的向量数据库中。运行上述代码以创建数据库,并为数据集中的每个图像摄取嵌入。
步骤 #3: 运行搜索查询
计算完所有图像嵌入后,现在可以运行搜索查询了。
要查询Pinecone索引,需要一个查询的文本嵌入。可以使用RoboflowInference或托管的Roboflow CLIP API来计算文本嵌入。然后,可以通过Pinecone检索与计算的文本嵌入最相似的图像嵌入。
让搜索“bus”。
infer_clip_payload = {
"text": "bus"
}
res = requests.post(
f"{SERVER_URL}/clip/embed_text?api_key={API_KEY}",
json=infer_clip_payload,
)
embeddings = res.json()['embeddings']
results = index.query(
vector=embeddings[0],
top_k=1,
include_metadata=True
)
print(results["matches"][0]["metadata"]["filename"])
此代码将为查询“broccoli”计算一个CLIP文本嵌入。这个嵌入被用作Pinecone中的搜索查询。检索与文本嵌入最接近的顶部图像。以下是结果:
000000000471_jpg.rf.faa1965b86263f4b92754c0495695c7e.jpg
注意:文件位于之前定义的IMAGE_DIR中。
让打开结果:
代码已成功返回了一张公共汽车的图像作为顶部结果,这表明搜索系统有效。
Pinecone是一个向量数据库,可以在其中存储数据和嵌入,例如使用CLIP计算的嵌入。可以在Pinecone中存储图像和文本嵌入。然后,可以查询向量数据库,以找到与给定查询向量最相似的结果向量。通过利用Pinecone中实现的快速语义搜索界面,搜索可以快速进行。