跳到主要内容
为了通过向量搜索增强 PostgreSQL 数据库中的现有模型,LangChain 支持将 Prisma 与 PostgreSQL 和 pgvector Postgres 扩展结合使用。

设置

使用 Supabase 设置数据库实例

请参阅 Prisma 和 Supabase 集成指南,以使用 Supabase 和 Prisma 设置新的数据库实例。

安装 Prisma

npm
npm install prisma

使用 docker-compose 设置 pgvector 自托管实例

pgvector 提供了一个预构建的 Docker 镜像,可用于快速设置自托管的 Postgres 实例。
services:
  db:
    image: ankane/pgvector
    ports:
      - 5432:5432
    volumes:
      - db:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=
      - POSTGRES_USER=
      - POSTGRES_DB=

volumes:
  db:

创建新模式

假设您尚未创建模式,请创建一个新模型,其中包含一个类型为 Unsupported("vector")vector 字段
model Document {
  id      String                 @id @default(cuid())
  content String
  vector  Unsupported("vector")?
}
然后,使用 --create-only 创建一个新的迁移,以避免直接运行迁移。
npm
npx prisma migrate dev --create-only
将以下行添加到新创建的迁移中,以启用 pgvector 扩展(如果尚未启用)
CREATE EXTENSION IF NOT EXISTS vector;
然后运行迁移
npm
npx prisma migrate dev

用法

有关安装 LangChain 软件包的一般说明,请参阅此部分
npm
npm install @langchain/openai @langchain/community @langchain/core
表名和列名(在 tableNamevectorColumnNamecolumnsfilter 等字段中)直接传递到 SQL 查询中,而无需参数化。这些字段必须事先进行清理以避免 SQL 注入。
import { PrismaVectorStore } from "@langchain/community/vectorstores/prisma";
import { OpenAIEmbeddings } from "@langchain/openai";
import { PrismaClient, Prisma, Document } from "@prisma/client";

export const run = async () => {
  const db = new PrismaClient();

  // Use the `withModel` method to get proper type hints for `metadata` field:
  const vectorStore = PrismaVectorStore.withModel<Document>(db).create(
    new OpenAIEmbeddings(),
    {
      prisma: Prisma,
      tableName: "Document",
      vectorColumnName: "vector",
      columns: {
        id: PrismaVectorStore.IdColumn,
        content: PrismaVectorStore.ContentColumn,
      },
    }
  );

  const texts = ["Hello world", "Bye bye", "What's this?"];
  await vectorStore.addModels(
    await db.$transaction(
      texts.map((content) => db.document.create({ data: { content } }))
    )
  );

  const resultOne = await vectorStore.similaritySearch("Hello world", 1);
  console.log(resultOne);

  // create an instance with default filter
  const vectorStore2 = PrismaVectorStore.withModel<Document>(db).create(
    new OpenAIEmbeddings(),
    {
      prisma: Prisma,
      tableName: "Document",
      vectorColumnName: "vector",
      columns: {
        id: PrismaVectorStore.IdColumn,
        content: PrismaVectorStore.ContentColumn,
      },
      filter: {
        content: {
          equals: "default",
        },
      },
    }
  );

  await vectorStore2.addModels(
    await db.$transaction(
      texts.map((content) => db.document.create({ data: { content } }))
    )
  );

  // Use the default filter a.k.a {"content": "default"}
  const resultTwo = await vectorStore.similaritySearch("Hello world", 1);
  console.log(resultTwo);
};
以下 SQL 运算符可用作过滤器:equalsinisNullisNotNulllikeltltegtgtenot 上述示例使用以下模式: 如果您不需要 namespace,可以将其删除。
以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。
© . This site is unofficial and not affiliated with LangChain, Inc.