跳到主要内容
版本:Next
pgvectorINPUTBUFFERPROCESSOROUTPUT

pgvector

pgvector 输出(Output)将每个批次(Batch)的行 UPSERT 到启用了 pgvector 扩展的 PostgreSQL 表中。它与 embedding 处理器配合使用,让现有的 Postgres 直接充当向量存储——无需单独部署向量数据库。

配置​

FieldTypeRequiredDefault描述
typestringyes—pgvector
urlstringyes—Postgres 连接字符串。支持 secret 引用。
tablestringyes—目标表(必须已存在)。
vector_fieldstringnoembedding存放向量的列(Float32 组成的 FixedSizeList/List)。
id_fieldstringno—用作 UPSERT 冲突键的列(整数或字符串)。省略时写入普通 INSERT。
payload_fieldstringnopayload接收其余所有列(按行打包为 JSON 对象)的 jsonb 列。设为 "" 可禁用。
max_connectionsintegerno4连接池(connection pool)大小。
timeout_msintegerno30000连接池获取/连接超时。

表与 SQL 形态​

表结构由你自行管理。对于下面的示例:

CREATE TABLE documents (
doc_id BIGINT PRIMARY KEY,
embedding vector(768),
payload jsonb
);

批次产生参数化 INSERT 语句并按块发送,保证每条语句不超过 Postgres 的 65,535 绑定上限;向量以文本形式绑定并显式 ::vector 转换,payload 则以 ::jsonb 转换:

INSERT INTO "documents" ("doc_id", "embedding", "payload")
VALUES ($1, $2::vector, $3::jsonb)
ON CONFLICT ("doc_id") DO UPDATE
SET "embedding" = EXCLUDED."embedding", "payload" = EXCLUDED."payload"
备注

设置了 id_field 时,目标列必须带有唯一/PK 约束——重新投递会覆盖同一行,对至少一次(at-least-once)语义友好。未设置时,每次尝试都会追加新行。流与表的 vector(n) 列之间维度不匹配会失败,并暴露 Postgres 的错误信息。

示例​

output:
type: "pgvector"
url: "postgres://postgres:${env:PG_PASSWORD:-}@localhost:5432/vectors"
table: "documents"
vector_field: "embedding"
id_field: "doc_id"

完整流水线示例​

logging:
level: info

streams:
- id: docs-to-postgres
input:
type: memory
pipeline:
thread_num: 4
processors:
- type: json_to_arrow
- type: embedding
api_base: "http://localhost:9997/v1"
model: "text-embedding-3-small"
api_key: "${env:OPENAI_API_KEY:-}"
field: "text"
output:
type: pgvector
url: "postgres://postgres:${env:PG_PASSWORD:-}@localhost:5432/vectors"
table: "documents"
vector_field: "embedding"
id_field: "doc_id"

针对真实数据库测试​

工作区测试套件中包含一个默认忽略(ignored)的集成测试,需要带有 pgvector 扩展的真实 Postgres:

docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=postgres pgvector/pgvector:pg16
cargo test -p arkflow-plugin --lib output::pgvector -- --ignored