如何为Vertex AI Search生成字典的嵌入?
我想在我的GCS存储桶中生成并存储向量嵌入,这样可以通过Vector AI Search找到最相似的项目。
根据这个官方教程,第一步是生成嵌入,而这可以通过生成文本嵌入来完成。
如果我们看看提到的代码,使用Python可以这样做:
from vertexai.language_models import TextEmbeddingModel
def text_embedding() -> list:
"""Text embedding with a Large Language Model."""
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@001")
embeddings = model.get_embeddings(["What is life?"])
for embedding in embeddings:
vector = embedding.values
print(f"Length of Embedding Vector: {len(vector)}")
return vector
现在还有另一个教程,它基本上是生成和存储向量嵌入,同样使用来自Spanner的textembedding-gecko
模型来进行向量搜索。显然,存储在Spanner中的数据并不是以文本形式存储的,而是以行/列或键/值字典的结构存储。
使用上面的代码,指向生成文本嵌入,但这种格式不被支持。那么,我该如何从字典转换到嵌入呢?
我查看的其他资源:
- 为Stackoverflow数据生成文本嵌入。即使在这里,他们也没有解释如何从列格式生成嵌入,因为他们只使用了“标题”这一列。见:https://github.com/GoogleCloudPlatform/generative-ai/blob/main/embeddings/intro-textemb-vectorsearch.ipynb
其他评论:
- 如果以产品图片作为初始教程所示,确实应该期望对象有多个属性,而不仅仅是文本。
- 未来,我也想探索如果可能的话,如何对某些属性进行加权和减权。
1 个回答
Vertex AI 的文本嵌入 API(也就是 textembedding-gecko@003
)可以接收一段文本作为输入,然后生成一组浮点数(我们称之为嵌入)。这个 REST API 支持以下的输入请求(SDK 也是一样的):
{
"instances": [
{ "content": "TEXT"}
],
"parameters": {
"autoTruncate": AUTO_TRUNCATE
}
}
所以,它需要一个原始文本的数组。如果这些文本是来自数据库表(就像你提到的 StackOverflow 示例),那么它应该为每一列创建嵌入实例(每一行选择一个嵌入,想象一下这是数据实例的一个特定特征)。它不应该把整行作为嵌入输入,因为嵌入 API 无法理解列之间的关系。这一点同样适用于 Spanner 的 ML.predict,因为它在后台使用的是相同的 Vertex AI 嵌入 API。
对于你的第二个问题,我猜你是指输入包含文本和图像的 多个属性
?在这种情况下,可以使用 多模态嵌入 API,它可以接收包含文本、图像和视频的输入对象。它们的目的是为了处理多模态,而不是多个属性。正如在 多模态嵌入请求 中所示:
{
"instances": [
{
"text": "TEXT",
"image": {
"bytesBase64Encoded": "B64_ENCODED_IMG"
}
}
]
}
这将向 POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/multimodalembedding@001:predict
多模态嵌入 API 发送一个包含图像和文本数据的嵌入请求。