Cloud SQL 是一项完全托管的关系型数据库服务,提供高性能、无缝集成和出色的可扩展性,并提供 PostgreSQL 等数据库引擎。
本指南简要介绍如何使用 Cloud SQL for PostgreSQL 存储向量嵌入 PostgresVectorStore class.
概述
集成详情
| 类 | 包 | Python 支持 | 版本 |
|---|---|---|---|
PostgresVectorStore | @langchain/google-cloud-sql-pg | ✅ | !NPM - 版本 |
准备工作
要使用此软件包,您需要先完成以下步骤:
身份验证
使用以下方式在本地向您的 Google Cloud 账户进行身份验证 gcloud auth login command.
设置您的 Google Cloud 项目
设置您的 Google Cloud 项目 ID 以在本地利用 Google Cloud 资源:
gcloud config set project YOUR-PROJECT-ID
如果您不知道您的项目 ID,请尝试以下操作:
- * 运行
gcloud config list. - * 运行
gcloud projects list. - * 请参阅支持页面: 查找项目 ID.
设置 PostgresVectorStore 实例
要使用 PostgresVectorStore 库,您需要安装 @langchain/google-cloud-sql-pg 软件包,然后按照以下步骤操作。
npm install @langchain/google-cloud-sql-pg @langchain/core
yarn add @langchain/google-cloud-sql-pg @langchain/core
pnpm add @langchain/google-cloud-sql-pg @langchain/core
首先,您需要登录到您的 Google Cloud 账户,并根据您的 Google Cloud 项目设置以下环境变量;这些变量将根据您要配置 PostgresEngine 实例的方式(fromInstance、fromEngine、fromEngineArgs)来定义:
PROJECT_ID="your-project-id"
REGION="your-project-region" // example: "us-central1"
INSTANCE_NAME="your-instance"
DB_NAME="your-database-name"
DB_USER="your-database-user"
PASSWORD="your-database-password"
设置实例
要实例化 PostgresVectorStore,您首先需要通过 PostgresEngine 创建数据库连接,然后初始化向量存储表,最后调用 .initialize() 方法来实例化向量存储。
Column,
PostgresEngine,
PostgresEngineArgs,
PostgresVectorStore,
PostgresVectorStoreArgs,
VectorStoreTableArgs,
} from "@langchain/google-cloud-sql-pg";
dotenv.config();
const peArgs: PostgresEngineArgs = {
user: process.env.DB_USER ?? "",
password: process.env.PASSWORD ?? "",
};
// PostgresEngine instantiation
const engine: PostgresEngine = await PostgresEngine.fromInstance(
process.env.PROJECT_ID ?? "",
process.env.REGION ?? "",
process.env.INSTANCE_NAME ?? "",
process.env.DB_NAME ?? "",
peArgs
);
const vectorStoreArgs: VectorStoreTableArgs = {
metadataColumns: [new Column("page", "TEXT"), new Column("source", "TEXT")],
};
// Vector store table initialization
await engine.initVectorstoreTable("my_vector_store_table", 768, vectorStoreArgs);
const embeddingService = new SyntheticEmbeddings({ vectorSize: 768 });
const pvectorArgs: PostgresVectorStoreArgs = {
metadataColumns: ["page", "source"],
};
// PostgresVectorStore instantiation
const vectorStore = await PostgresVectorStore.initialize(
engine,
embeddingService,
"my_vector_store_table",
pvectorArgs
);
管理向量存储
向向量存储添加文档
要向向量存储添加文档,您可以通过传递或不传递 ID 来实现
const document1: Document = {
pageContent: "The powerhouse of the cell is the mitochondria",
metadata: { page: 0, source: "https://example.com" },
};
const document2: Document = {
pageContent: "Buildings are made out of brick",
metadata: { page: 1, source: "https://example.com" },
};
const document3: Document = {
pageContent: "Mitochondria are made out of lipids",
metadata: { page: 2, source: "https://example.com" },
};
const document4: Document = {
pageContent: "The 2024 Olympics are in Paris",
metadata: { page: 3, source: "https://example.com" },
};
const documents = [document1, document2, document3, document4];
const ids = [crypto.randomUUID(), crypto.randomUUID(), crypto.randomUUID(), crypto.randomUUID()];
await vectorStore.addDocuments(documents, { ids: ids });
从向量存储删除文档
您可以通过传递要删除的 ID 数组来从向量存储中删除一个或多个文档:
// deleting a document
const id1 = ids[0];
await vectorStore.delete({ ids: [id1] });
// deleting more than one document
await vectorStore.delete({ ids: ids });
搜索文档
一旦您的向量存储创建完成并添加了相关文档,您很可能希望在运行链或代理时对其进行查询。
直接查询
执行简单的相似性搜索可以按如下方式进行:
const filter = `"source" = "https://example.com"`;
const results = await vectorStore.similaritySearch("biology", 2, filter);
for (const doc of results) {
console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);
}
如果您想执行相似性搜索并接收相应的分数,可以运行:
const filter = `"source" = "https://example.com"`;
const resultsWithScores = await vectorStore.similaritySearchWithScore(
"biology",
2,
filter
);
for (const [doc, score] of resultsWithScores) {
console.log(
`* [SIM=${score.toFixed(3)}] ${doc.pageContent} [${JSON.stringify(doc.metadata)}]`
);
}
使用最大边际相关性搜索进行查询
最大边际相关性优化查询相似性和所选文档的多样性。
const options = {
k: 4,
filter: `"source" = 'https://example.com'`,
};
const results = await vectorStore.maxMarginalRelevanceSearch("biology", options);
for (const doc of results) {
console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);
}