如何为Vertex AI Search生成字典的嵌入?

0 投票
1 回答
77 浏览
提问于 2025-04-14 15:27

我想在我的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中的数据并不是以文本形式存储的,而是以行/列或键/值字典的结构存储。

使用上面的代码,指向生成文本嵌入,但这种格式不被支持。那么,我该如何从字典转换到嵌入呢?

我查看的其他资源:

其他评论:

  • 如果以产品图片作为初始教程所示,确实应该期望对象有多个属性,而不仅仅是文本。
  • 未来,我也想探索如果可能的话,如何对某些属性进行加权和减权。

1 个回答

0

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 发送一个包含图像和文本数据的嵌入请求。

撰写回答