使用 Google Cloud Vertex AI
家庭作业活动,如果你在家完成,请自行进行,不会在动手实验中涵盖。
Google Cloud 现在提供了一系列基于 Vertex AI 的 AI 平台服务。这些服务旨在帮助您构建、部署和管理机器学习模型。
为了创建嵌入,他们提供了多种服务将文本、图像或两者转换为嵌入。在我们的应用中,我们将使用 multimodal
嵌入模型通过封面图像的描述搜索书籍。
创建 Google Cloud 账号
第一步是创建一个 Google Cloud 账号。使用以下链接开始并获得一些免费积分。
创建新项目
在欢迎屏幕上,创建一个新项目。你可以随意命名。
确保选择一个活跃的结算账户。
填写完字段后,点击 创建
按钮。
打开 Cloud Shell
项目创建完成后,在屏幕右上角寻找 激活 Cloud Shell
按钮。
这将在浏览器中打开一个类似终端的窗口。这是一个完全功能的终端,连接 到云中的虚拟机。你可以使用这个终端在虚拟机上运行命令。
启用 AI Platform API
你需要为项目启用 AI Platform API。你可以通过在 Cloud Shell 中运行以下命令来实现。
gcloud services enable aiplatform.googleapis.com
创建认证文件
要使用 AI Platform API 进行身份验证,你需要创建一个包含应用凭据的文件。你可以通过在 Cloud Shell 中运行以下命令来实现。
gcloud auth application-default login
按照终端中的指示使用 Google Cloud 账号进行身份验证。身份验证完成后,你会看到类似以下的信息。
Credentials saved to file: [/tmp/tmp.n0HdRFDDv8/application_default_credentials.json]
将凭据文件保存到你的主目录。
mv /tmp/tmp.n0HdRFDDv8/application_default_credentials.json ~/credentials.json
创建一些文本的嵌入
为了创建一些文本的嵌入,你将首先创建一个 request.json
文件。这个文件将包含你要转换为嵌入的文本。在 Cloud Shell 中运行以下命令来创建这个文件。
echo '{
"instances": [
{
"text": "picture of a cat"
}
]
}' >> request.json
现在运行以下 curl 命令以获取文本的嵌入。
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/multimodalembedding@001:predict"
确保将 $PROJECT_ID
变量更改为你的项目 ID。
你将收到类似以下的响应
{
"predictions": [
{
"textEmbedding": [
-0.00566103263,
0.0202014241,
-0.00677233562,
0.0180264488,
0.0265100803,
...
0.00116232142,
0.0134601779,
-0.00257002981
]
}
],
"deployedModelId": "5595742328217141248"
}
你会注意到 textEmbeddings
字段包含一个 1408 个数字的数组。这些是你提供的文本的嵌入。
为书籍创建嵌入
为了为你的书籍集合创建嵌入,你应该为每本书运行这个 curl 命令。这个过程有点耗时,所以我们已经为你创建好了。
你可以在导入的新书籍集合的 embeddings
字段中找到 1408 维的向量。
因为我们已经有了这些书籍的向量,我们可以使用它们进行向量搜索。
使用向量进行查询
为了查询数据,向量搜索需要计算查询向量与集合中文档向量之间的距离。
为此,你需要将查询向量化。你可以使用相同的函数来向量化你的查询。
在图书馆应用程序中,我们已经创建了一个函数来为你向量化查询。你可以在 server/embeddings/googleVertex.mjs
文件中找到它。
import aiplatform from '@google-cloud/aiplatform';
const project = process.env.PROJECT_ID;
const location = process.env.PROJECT_LOCATION;
const {PredictionServiceClient} = aiplatform.v1;
const {helpers} = aiplatform;
const predictionServiceClient = new PredictionServiceClient({
apiEndpoint: 'us-central1-aiplatform.googleapis.com'
});
const getTermEmbeddings = async (text) => {
const publisher = "google";
const model = 'multimodalembedding@001';
// 配置父资源
const endpoint = `projects/${project}/locations/${location}/publishers/${publisher}/models/${model}`;
const instance = { text };
const instanceValue = helpers.toValue(instance);
const instances = [instanceValue];
const request = {
endpoint,
instances
};
// 预测请求
const [response] = await predictionServiceClient.predict(request);
const embeddings = response.predictions[0].structValue.fields.textEmbedding.listValue.values.map(e => e.numberValue);
return embeddings;
};
export default getTermEmbeddings;
配置应用程序
在你的 server/.env
文件中,你会找到几个变量,用于配置应用程序。
第一个是 EMBEDDINGS_SOURCE
。它告诉应用程序从哪里获取嵌入。你可以将其设置为 googleVertex
。
然后将 EMBEDDING_KEY
设置为你的 credentials.json
文件。
最后,将 PROJECT_ID
和 PROJECT_LOCATION
设置为你的项目的值。
EMBEDDINGS_SOURCE=googleVertex
EMBEDDING_KEY="./credentials.json"
PROJECT_ID=projectphoenix-verteximage
PROJECT_LOCATION=us-central1
你的应用程序现在有一个 getTermEmbeddings
函数,它将返回给定文本的嵌入。你可以在 server/src/embeddings/googleVertex.js
文件中查看此文件的详细信息。