跳到主要内容

PGVector

LangChain4j 与 PGVector 无缝集成,允许开发人员直接在 PostgreSQL 中存储和查询向量嵌入。这种集成非常适合语义搜索、RAG 等应用。

Maven 依赖


<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-pgvector</artifactId>
<version>1.0.0-beta3</version>
</dependency>

Gradle 依赖

implementation 'dev.langchain4j:langchain4j-pgvector:1.0.0-beta3'

API

  • PgVectorEmbeddingStore

参数摘要

普通 Java 属性描述默认值必需/可选
datasource用于数据库连接的 DataSource 对象。如果未提供,则必须单独提供 hostportuserpassworddatabase如果未单独提供 hostportuserpassworddatabase,则必需。
hostPostgreSQL 服务器的主机名。如果未提供 DataSource,则必需。如果未提供 DataSource,则必需
portPostgreSQL 服务器的端口号。如果未提供 DataSource,则必需。如果未提供 DataSource,则必需
user数据库认证的用户名。如果未提供 DataSource,则必需。如果未提供 DataSource,则必需
password数据库认证的密码。如果未提供 DataSource,则必需。如果未提供 DataSource,则必需
database要连接的数据库名称。如果未提供 DataSource,则必需。如果未提供 DataSource,则必需
table用于存储嵌入的数据库表名称。必需
dimension嵌入向量的维度。这应该与所使用的嵌入模型匹配。使用 embeddingModel.dimension() 动态设置它。必需
useIndexIVFFlat 索引将向量分为多个列表,然后搜索最接近查询向量的那些列表的子集。它具有更快的构建时间并使用比 HNSW 更少的内存,但查询性能较低(在速度-召回权衡方面)。应使用 IVFFlat 索引。false可选
indexListSizeIVFFlat 索引的列表数量。何时必需:如果 useIndextrue,则必须提供 indexListSize 并且必须大于零。否则,程序将在表初始化期间抛出异常。何时可选:如果 useIndexfalse,则忽略此属性,不需要设置。
createTable指定是否自动创建嵌入表。true可选
dropTableFirst指定是否在重新创建表之前删除表(对测试有用)。false可选
metadataStorageConfig用于处理与嵌入相关的元数据的配置对象。支持三种存储模式:
  • COLUMN_PER_KEY:适用于静态元数据,当您预先知道元数据键时。
  • COMBINED_JSON:适用于动态元数据,当您不预先知道元数据键时。将数据存储为 JSON。(默认)
  • COMBINED_JSONB:类似于 JSON,但以二进制格式存储,用于优化大型数据集的查询。
COMBINED_JSON可选。如果未设置,则使用默认配置 COMBINED_JSON

示例

为了演示 PGVector 的功能,您可以使用 Docker 化的 PostgreSQL 设置。它利用 Testcontainers 运行带有 PGVector 的 PostgreSQL。

使用 Docker 快速入门

要快速设置带有 PGVector 扩展的 PostgreSQL 实例,您可以使用以下 Docker 命令:

docker run --rm --name langchain4j-postgres-test-container -p 5432:5432 -e POSTGRES_USER=my_user -e POSTGRES_PASSWORD=my_password pgvector/pgvector

命令说明:

  • docker run:运行一个新容器。
  • --rm:容器停止后自动删除,确保没有残留数据。
  • --name langchain4j-postgres-test-container:将容器命名为 langchain4j-postgres-test-container,便于识别。
  • -p 5432:5432:将本地机器上的端口 5432 映射到容器中的端口 5432。
  • -e POSTGRES_USER=my_user:将 PostgreSQL 用户名设置为 my_user。
  • -e POSTGRES_PASSWORD=my_password:将 PostgreSQL 密码设置为 my_password。
  • pgvector/pgvector:指定要使用的 Docker 镜像,预先配置了 PGVector 扩展。

以下是两个展示如何创建 PgVectorEmbeddingStore 的代码示例。第一个仅使用必需参数,而第二个配置了所有可用参数。

  1. 仅必需参数
EmbeddingStore<TextSegment> embeddingStore = PgVectorEmbeddingStore.builder()
.host("localhost") // 必需:PostgreSQL 实例的主机
.port(5432) // 必需:PostgreSQL 实例的端口
.database("postgres") // 必需:数据库名称
.user("my_user") // 必需:数据库用户
.password("my_password") // 必需:数据库密码
.table("my_embeddings") // 必需:存储嵌入的表名
.dimension(embeddingModel.dimension()) // 必需:嵌入的维度
.build();
  1. 设置所有参数

在这个变体中,我们包含了所有常用的可选参数,如 DataSource、useIndex、indexListSize、createTable、dropTableFirst 和 metadataStorageConfig。根据需要调整这些值:

DataSource dataSource = ...;                 // 预先配置的 DataSource,如果可用

EmbeddingStore<TextSegment> embeddingStore = PgVectorEmbeddingStore.builder()
// 连接和表参数
.datasource(dataSource) // 可选:如果使用 DataSource 而不是 host/port 凭据
.host("localhost")
.port(5432)
.database("postgres")
.user("my_user")
.password("my_password")
.table("my_embeddings")

// 嵌入维度
.dimension(embeddingModel.dimension()) // 必需:必须匹配嵌入模型的输出维度

// 索引和性能选项
.useIndex(true) // 启用 IVFFlat 索引
.indexListSize(100) // IVFFlat 索引的列表数量

// 表创建选项
.createTable(true) // 如果表不存在,自动创建
.dropTableFirst(false) // 不先删除表(如果您想重新开始,设置为 true)

// 元数据存储格式
.metadataStorageConfig(MetadataStorageConfig.combinedJsonb()) // 将元数据存储为组合 JSONB 列

.build();

如果您只想快速入门,请使用第一个示例的最小配置。 第二个示例展示了如何利用所有可用的构建器参数来获得更多控制和自定义。