Vercel Postgres
LangChain.js 支持使用 @vercel/postgres
包将通用 Postgres 数据库用作向量存储,前提是这些数据库支持 pgvector
Postgres 扩展。
¥LangChain.js supports using the @vercel/postgres
package to use generic Postgres databases
as vector stores, provided they support the pgvector
Postgres extension.
这种集成在 Edge Functions 等 Web 环境中尤其有用。
¥This integration is particularly useful from web environments like Edge functions.
设置
¥Setup
要使用 Vercel Postgres,你需要安装 @vercel/postgres
包:
¥To work with Vercel Postgres, you need to install the @vercel/postgres
package:
- npm
- Yarn
- pnpm
npm install @vercel/postgres
yarn add @vercel/postgres
pnpm add @vercel/postgres
- npm
- Yarn
- pnpm
npm install @langchain/community @langchain/core
yarn add @langchain/community @langchain/core
pnpm add @langchain/community @langchain/core
此集成使用 process.env.POSTGRES_URL
下设置的连接字符串自动连接。你也可以像这样手动传递连接字符串:
¥This integration automatically connects using the connection string set under process.env.POSTGRES_URL
.
You can also pass a connection string manually like this:
const vectorstore = await VercelPostgres.initialize(new OpenAIEmbeddings(), {
postgresConnectionOptions: {
connectionString:
"postgres://<username>:<password>@<hostname>:<port>/<dbname>",
},
});
连接到 Vercel Postgres
¥Connecting to Vercel Postgres
一个简单的入门方法是创建一个无服务器 Vercel Postgres 实例。如果你要部署到与 Vercel Postgres 实例关联的 Vercel 项目,则所需的 POSTGRES_URL
环境变量将已在托管环境中填充。
¥A simple way to get started is to create a serverless Vercel Postgres instance.
If you're deploying to a Vercel project with an associated Vercel Postgres instance, the required POSTGRES_URL
environment variable
will already be populated in hosted environments.
连接到其他数据库
¥Connecting to other databases
如果你希望托管自己的 Postgres 实例,则可以使用与 LangChain 的 PGVector 向量存储集成类似的流程,并将连接字符串设置为环境变量或如上所示。
¥If you prefer to host your own Postgres instance, you can use a similar flow to LangChain's PGVector vectorstore integration and set the connection string either as an environment variable or as shown above.
用法
¥Usage
import { CohereEmbeddings } from "@langchain/cohere";
import { VercelPostgres } from "@langchain/community/vectorstores/vercel_postgres";
// Config is only required if you want to override default values.
const config = {
// tableName: "testvercelvectorstorelangchain",
// postgresConnectionOptions: {
// connectionString: "postgres://<username>:<password>@<hostname>:<port>/<dbname>",
// },
// columns: {
// idColumnName: "id",
// vectorColumnName: "vector",
// contentColumnName: "content",
// metadataColumnName: "metadata",
// },
};
const vercelPostgresStore = await VercelPostgres.initialize(
new CohereEmbeddings({ model: "embed-english-v3.0" }),
config
);
const docHello = {
pageContent: "hello",
metadata: { topic: "nonsense" },
};
const docHi = { pageContent: "hi", metadata: { topic: "nonsense" } };
const docMitochondria = {
pageContent: "Mitochondria is the powerhouse of the cell",
metadata: { topic: "science" },
};
const ids = await vercelPostgresStore.addDocuments([
docHello,
docHi,
docMitochondria,
]);
const results = await vercelPostgresStore.similaritySearch("hello", 2);
console.log(results);
/*
[
Document { pageContent: 'hello', metadata: { topic: 'nonsense' } },
Document { pageContent: 'hi', metadata: { topic: 'nonsense' } }
]
*/
// Metadata filtering
const results2 = await vercelPostgresStore.similaritySearch(
"Irrelevant query, metadata filtering",
2,
{
topic: "science",
}
);
console.log(results2);
/*
[
Document {
pageContent: 'Mitochondria is the powerhouse of the cell',
metadata: { topic: 'science' }
}
]
*/
// Metadata filtering with IN-filters works as well
const results3 = await vercelPostgresStore.similaritySearch(
"Irrelevant query, metadata filtering",
3,
{
topic: { in: ["science", "nonsense"] },
}
);
console.log(results3);
/*
[
Document {
pageContent: 'hello',
metadata: { topic: 'nonsense' }
},
Document {
pageContent: 'hi',
metadata: { topic: 'nonsense' }
},
Document {
pageContent: 'Mitochondria is the powerhouse of the cell',
metadata: { topic: 'science' }
}
]
*/
// Upserting is supported as well
await vercelPostgresStore.addDocuments(
[
{
pageContent: "ATP is the powerhouse of the cell",
metadata: { topic: "science" },
},
],
{ ids: [ids[2]] }
);
const results4 = await vercelPostgresStore.similaritySearch(
"What is the powerhouse of the cell?",
1
);
console.log(results4);
/*
[
Document {
pageContent: 'ATP is the powerhouse of the cell',
metadata: { topic: 'science' }
}
]
*/
await vercelPostgresStore.delete({ ids: [ids[2]] });
const results5 = await vercelPostgresStore.similaritySearch(
"No more metadata",
2,
{
topic: "science",
}
);
console.log(results5);
/*
[]
*/
// Remember to call .end() to close the connection!
await vercelPostgresStore.end();
API Reference:
- CohereEmbeddings from
@langchain/cohere
- VercelPostgres from
@langchain/community/vectorstores/vercel_postgres
相关
¥Related
向量存储 概念指南
¥Vector store conceptual guide
向量存储 操作指南
¥Vector store how-to guides