云数据库 PostgreSQL 自动向量化

云数据库 PostgreSQL 提供自动向量化功能,这里说明关于自动向量化功能的说明及使用方法。

相关产品
云数据库 PostgreSQL 产品页,含版本规格、价格与购买入口。

一、概述

tencentdb_ai 提供自动向量化(Auto Embedding)功能,允许用户在数据写入时自动完成文本到向量的转换,无需手动调用嵌入 API 或编写额外的 ETL 流程。只需一行 SQL 注册任务,后续对源表的所有 INSERT 和 UPDATE 操作都会自动触发向量生成,向量结果实时写回目标列,告别“数据写入 → 手动提取 → 调用嵌入 → 写回”的繁琐流程。

二、支持版本

数据库版本为 PostgreSQL 14 – 18,tencentdb_ai 扩展 ≥ 1.5(以实例中实际 extversion 为准)。

三、核心架构

自动向量化功能由三个核心组件协同工作:

组件 说明
增量任务(Incremental Task) 通过触发器自动捕获 INSERT / UPDATE,实时生成向量。
存量任务(Backfill Task) 基于主键游标批量扫描已有数据,一次性补齐历史向量。
后台工作进程(Bgworker) 常驻后台进程,异步消费消息队列,调用嵌入模型并写回结果。

四、适用场景

·RAG 知识库:文档分块入库后自动向量化,配合 tencentdb_ai.retrieve() / rag() 实现智能问答。

·商品搜索:商品描述/标题变更时自动更新向量索引,实现语义搜索。

·用户画像:用户行为文本实时向量化,支持相似用户推荐。

·内容审核:内容入库后自动向量化,配合相似度检索实现去重/审核。

五、前提条件

·数据库版本为 PostgreSQL 14-18,tencentdb_ai 扩展 ≥ 1.5(以实例中实际 extversion 为准)。

·pgvector 扩展(通过 tencentdb_ai CASCADE 自动安装)。

·pgmq 扩展(通过 tencentdb_ai CASCADE 自动安装)。

·已配置嵌入模型(如 kinfra-text-embedding-0.6b),并在 model_list 中设置 embedding_dim,配置方法请参见 tencentdb_ai 插件功能介绍。

·将 tencentdb_ai 加入 shared_preload_libraries 参数,以启用后台工作进程(修改后需重启实例生效)。

·配置 tencentdb_ai.autoembedding_database 指定工作数据库(修改后需重启实例生效)。

六、配置参数

在 postgresql.conf 中可配置以下 GUC 参数(均为 SIGHUP 级别,pg_reload_conf() 生效):

参数 类型 默认值 说明
tencentdb_ai.autoembedding_worker bool on 是否启用后台自动向量化工作进程
tencentdb_ai.autoembedding_database string postgres 工作进程连接的目标数据库
tencentdb_ai.autoembedding_batch_size int 32 每轮处理的最大消息数(1 – 10000)
tencentdb_ai.autoembedding_max_retry int 5 单条消息最大重试次数(0 – 1000)
tencentdb_ai.autoembedding_retry_base_ms int 1000 重试退避基础间隔(毫秒,1 – 600000)
tencentdb_ai.autoembedding_max_input_bytes int 65536 单次嵌入调用的最大输入字节数(1 – 1048576)
tencentdb_ai.autoembedding_naptime_ms int 1000 工作进程空闲休眠间隔(毫秒,10 – 600000)

八、一、add_incr_autoembedding_task() — 创建增量向量化任务

创建增量任务后,系统会自动为目标表添加 vector 类型的嵌入列,并创建 INSERT AFTER 和 UPDATE BEFORE 触发器。每当源列数据发生变化时,触发器自动将变更入队,后台工作进程异步处理。

九、函数签名

tencentdb_ai.add_incr_autoembedding_task( schema_name NAME, — 表所在 schema table_name NAME, — 表名 source_columns NAME[], — 源文本列名数组 model_name NAME, — 嵌入模型名称 target_column NAME DEFAULT NULL, — 目标向量列名 index_method TEXT DEFAULT 'hnsw', — 向量索引方法 options JSONB DEFAULT '{}' — 扩展选项) RETURNS BIGINT

十、参数说明

参数 类型 说明
schema_name NAME 表所在的 schema 名称
table_name NAME 表名(必须有单列主键)
source_columns NAME[] 需要向量化的文本列数组
model_name NAME 嵌入模型名称,如 'kinfra-text-embedding-0.6b'
target_column NAME 目标向量列名,默认 {source_columns[1]}_embedding
index_method TEXT 向量索引方法,支持 'none' 'hnsw' 'ivfflat',默认 'hnsw'(当前版本仅记录该配置,不自动创建索引)
options JSONB 扩展选项,支持 vector_dim 覆盖默认维度

十一、前提条件

·调用者必须是表 owner 或 pg_tencentdb_superuser 角色。

·表必须有单列主键。

·源列必须存在(非文本类型列的值会被转为文本后参与向量化)。

·模型必须在 tencentdb_ai.model_list 中已注册。

·必须在配置的 autoembedding_database 中执行。

十二、行为说明

·向量由后台工作进程异步生成(默认约1秒轮询):新写入或更新的行,其向量列会短暂为 NULL,随后自动写回。

·源列被 UPDATE 时,向量列会先被清空再异步重建(clear_embedding_on_update 选项,默认开启)。

·配置多源列时,按数组顺序将各列值以换行符拼接为一个输入文本(NULL 按空字符串处理)。

·任务存在期间,目标表及源列/目标列受保护:DROP TABLE 或 DROP COLUMN 会被阻止报错,需先删除任务。

十三、使用示例

— 单列嵌入:对 content 列创建嵌入,目标列自动命名为 content_embeddingSELECT tencentdb_ai.add_incr_autoembedding_task( 'public', 'articles', ARRAY['content'], 'kinfra-text-embedding-0.6b');– 多列嵌入:合并 title + body 生成嵌入,显式指定目标列和索引方法SELECT tencentdb_ai.add_incr_autoembedding_task( 'public', 'articles', ARRAY['title', 'body'], 'kinfra-text-embedding-0.6b', target_column => 'doc_embedding', index_method => 'hnsw');– 覆盖向量维度(当 model_list 中未设置 embedding_dim 时)SELECT tencentdb_ai.add_incr_autoembedding_task( 'public', 'articles', ARRAY['content'], 'kinfra-text-embedding-0.6b', options => '{"vector_dim": 1024}');

十四、二、add_backfill_autoembedding_task() — 创建存量向量化任务

存量任务用于对已有历史数据进行批量向量化回填。它不会创建新列或触发器,而是基于主键游标逐批扫描已有数据并入队。通常先创建增量任务(自动创建向量列),再创建存量任务回填历史数据。

十五、函数签名

tencentdb_ai.add_backfill_autoembedding_task( schema_name NAME, — 表所在 schema table_name NAME, — 表名 source_columns NAME[], — 源文本列名数组 model_name NAME, — 嵌入模型名称 target_column NAME DEFAULT NULL, — 目标向量列名 start_now BOOL DEFAULT false, — 是否立即开始回填 options JSONB DEFAULT '{}' — 扩展选项) RETURNS BIGINT

十六、参数说明

参数 类型 说明
schema_name NAME 表所在的 schema 名称
table_name NAME 表名
source_columns NAME[] 需要向量化的文本列数组
model_name NAME 嵌入模型名称
target_column NAME 目标向量列名,默认 {source_columns[1]}_embedding
start_now BOOL 是否立即开始回填,默认 false;为 false 时任务处于 not_started 状态,需调用 run_backfill_autoembedding_task() 启动
options JSONB 扩展选项,必须与增量任务配置一致

十七、前提条件

·目标向量列必须已存在(通常先由 add_incr_autoembedding_task 创建)。

·如果同一列已有增量任务,配置(source_columns model_name vector_dim)必须一致。

·必须在配置的 autoembedding_database 中执行。

十八、使用示例

— 先创建增量任务(自动创建向量列 + 触发器)SELECT tencentdb_ai.add_incr_autoembedding_task( 'public', 'articles', ARRAY['content'], 'kinfra-text-embedding-0.6b');– 再创建存量任务,立即回填历史数据SELECT tencentdb_ai.add_backfill_autoembedding_task( 'public', 'articles', ARRAY['content'], 'kinfra-text-embedding-0.6b', start_now => true);– 也可以先注册任务(默认 start_now 为 false),稍后手动触发SELECT tencentdb_ai.add_backfill_autoembedding_task( 'public', 'articles', ARRAY['content'], 'kinfra-text-embedding-0.6b');– 稍后手动启动SELECT tencentdb_ai.run_backfill_autoembedding_task(1);

十九、三、drop_incr_autoembedding_task() / drop_backfill_autoembedding_task() — 删除任务

删除任务时只清理元数据、触发器和队列中的待处理消息,不会删除已生成的向量列、索引或数据。

20、函数签名

tencentdb_ai.drop_incr_autoembedding_task(task_id BIGINT) RETURNS VOIDtencentdb_ai.drop_backfill_autoembedding_task(task_id BIGINT) RETURNS VOID

21、使用示例

— 删除增量任务SELECT tencentdb_ai.drop_incr_autoembedding_task(1);– 删除存量任务SELECT tencentdb_ai.drop_backfill_autoembedding_task(2);

22、四、run_backfill_autoembedding_task() — 手动触发存量回填

对于 start_now => false 创建的存量任务,或需要重新启动失败的任务,可以使用此函数手动触发。

23、函数签名

tencentdb_ai.run_backfill_autoembedding_task( task_id BIGINT, — 存量任务 ID batch_size INT DEFAULT 8192 — 后台工作进程每轮扫描入队的最大行数) RETURNS VOID

该函数仅将任务置为 running 状态并重置扫描游标,立即返回(无返回值);实际扫描入队由后台工作进程按周期自动推进。任务已完成(done)时报错;任务失败(failed)时重置并重新开始。

24、使用示例

— 手动启动存量回填SELECT tencentdb_ai.run_backfill_autoembedding_task(1);

25、五、autoembedding_status — 任务状态视图

系统视图,实时展示所有自动向量化任务的状态。

26、视图列说明

列名 类型 说明
task_kind TEXT 任务类型:incr(增量)或 backfill(存量)
task_id BIGINT 任务 ID
schema_name NAME 表所在 schema
table_name NAME 表名
source_columns NAME[] 源文本列
target_column NAME 目标向量列
model_name NAME 嵌入模型
status ENUM 增量任务状态:enabled disabled error
backfill_state ENUM 存量任务状态:not_started running done / failed
backfilled_rows BIGINT 存量任务已回填行数
pending BIGINT 队列中待处理消息数
failed_count BIGINT 错误表中记录的错误数
last_error TEXT 最近一次错误信息

27、使用示例

— 查看所有任务状态SELECT task_kind, task_id, schema_name, table_name, target_column, status, backfill_state, pending, backfilled_rows, failed_countFROM tencentdb_ai.autoembedding_statusORDER BY task_id;

28、六、autoembedding_error — 错误记录表

系统自动记录处理失败的详细信息,便于问题排查。

29、表列说明

列名 类型 说明
error_id BIGSERIAL 错误记录 ID
msg_id BIGINT 消息 ID
task_kind TEXT 任务类型:incr 或 backfill
task_id BIGINT 关联任务 ID
row_id JSONB 数据行主键值
error_code TEXT 错误码
error_message TEXT 错误消息
detail TEXT 详细错误信息
created_at TIMESTAMPTZ 错误发生时间

30、使用示例

— 查看最近的错误SELECT task_kind, task_id, row_id, error_message, created_atFROM tencentdb_ai.autoembedding_errorORDER BY created_at DESCLIMIT 10;

31、完整使用示例

以下为你介绍一个端到端的完整示例,涵盖扩展安装、模型注册、增量任务创建、存量回填和数据验证:

32、步骤1:环境准备

— 安装扩展(pgmq / pgvector 通过 CASCADE 自动安装)CREATE EXTENSION IF NOT EXISTS tencentdb_ai CASCADE;– 注册嵌入模型(json_path 必须为 NULL)SELECT tencentdb_ai.add_model('kinfra-text-embedding-0.6b', NULL, NULL, NULL, 'tokenhub');SELECT tencentdb_ai.update_model_attr('kinfra-text-embedding-0.6b', 'api_key', 'your_api_key');– 设置嵌入维度(必须,否则创建任务时需通过 options.vector_dim 指定)UPDATE tencentdb_ai.model_list SET embedding_dim = 1024 WHERE model_name = 'kinfra-text-embedding-0.6b';

注意:说明:

注意:api_key 请在 TokenHub 控制台 获取。

33、步骤2:创建源表并写入数据

— 创建知识库表CREATE TABLE kb_articles ( id bigserial PRIMARY KEY, title text, content text);– 插入测试数据INSERT INTO kb_articles (title, content) VALUES ('PostgreSQL 简介', 'PostgreSQL 是一个功能强大的开源对象关系数据库系统…'), ('向量数据库', '向量数据库是一种专门用于存储和检索高维向量的数据库系统…'), ('RAG 技术', '检索增强生成(RAG)是一种结合检索和生成能力的 AI 技术…');

34、步骤3:创建自动向量化任务

— 创建增量任务:自动添加 content_embedding 列,创建触发器SELECT tencentdb_ai.add_incr_autoembedding_task( 'public', 'kb_articles', ARRAY['content'], 'kinfra-text-embedding-0.6b') AS incr_task_id;– 创建存量任务:立即回填已有的 3 行历史数据SELECT tencentdb_ai.add_backfill_autoembedding_task( 'public', 'kb_articles', ARRAY['content'], 'kinfra-text-embedding-0.6b', start_now => true) AS backfill_task_id;

35、步骤4:验证向量生成

— 等待后台进程处理(默认每 1 秒轮询一次)SELECT pg_sleep(3);– 检查存量回填进度SELECT backfill_state, backfilled_rowsFROM tencentdb_ai.autoembedding_statusWHERE task_kind = 'backfill';

backfill_state | backfilled_rows—————-+—————– done | 3(1 row)

— 验证向量已生成SELECT id, title, content_embedding IS NOT NULL AS has_embedding, vector_dims(content_embedding) AS dimsFROM kb_articlesORDER BY id;

id | title | has_embedding | dims—-+—————–+—————+—— 1 | PostgreSQL 简介 | t | 1024 2 | 向量数据库 | t | 1024 3 | RAG 技术 | t | 1024(3 rows)

— 查看任务状态SELECT * FROM tencentdb_ai.autoembedding_status;

36、步骤5:验证增量写入

— 插入新数据,触发器自动入队INSERT INTO kb_articles (title, content) VALUES ('嵌入模型', '嵌入模型是将文本转换为向量表示的机器学习模型…');– 等待后台进程处理SELECT pg_sleep(2);– 验证新数据向量已生成SELECT id, title, content_embedding IS NOT NULL AS has_embeddingFROM kb_articlesORDER BY id;

id | title | has_embedding—-+—————–+————— 1 | PostgreSQL 简介 | t 2 | 向量数据库 | t 3 | RAG 技术 | t 4 | 嵌入模型 | t(4 rows)

38、增量任务状态

状态 含义
enabled 任务已注册,数据写入自动入队
error 任务级别异常,检查 last_error 字段排查

注意:说明:

39、存量任务状态

状态 含义 操作
not_started 已创建但未启动 调用 run_backfill_autoembedding_task()
running 正在回填中 后台进程自动推进
done 回填完成 所有历史数据已处理
failed 回填失败 检查 last_error,可调用 run_backfill_autoembedding_task() 重试

41、常见错误场景

错误场景 错误信息 解决方案
非配置数据库 can only use tencentdb_ai autoembedding in database 检查 tencentdb_ai.autoembedding_database 配置
缺少主键 表没有单列主键 为表添加单列主键
源列不存在 source column X does not exist 确认源列名正确且未被删除
模型未注册 model X not found 先通过 add_model 注册模型
缺少向量维度 embedding_dim 未设置 设置 model_list.embedding_dim 或通过 options.vector_dim 指定
向量列不存在 target column X does not exist 先运行 add_incr_autoembedding_task 创建列
配置冲突 config conflicts with existing task 确保同一列的增量和存量任务配置一致
维度写回不匹配 嵌入模型返回的向量维度与任务 vector_dim 不一致,消息归档并记录到 autoembedding_error 检查 model_list.embedding_dim 或 options.vector_dim 配置是否与模型实际维度一致
返回向量数不足 无报错,任务 pending 长期不下降、无写回 嵌入模型单次调用返回的向量数少于输入行数时,整批消息退避重试;确认模型服务状态正常后等待恢复
工作进程未运行 创建任务时报 autoembedding worker was never registered;或任务 pending 持续不下降、无写回 核对前提条件中的 shared_preload_libraries 与 autoembedding_database 配置,修改后重启实例生效

42、监控任务状态

— 检查队列积压SELECT task_kind, task_id, pendingFROM tencentdb_ai.autoembedding_statusWHERE pending > 0;– 查看错误详情SELECT * FROM tencentdb_ai.autoembedding_errorORDER BY created_at DESC LIMIT 20;

43、实践教程

1. 先增量后存量:先创建增量任务(自动创建向量列),再创建存量任务回填历史数据,确保新写入的数据不会遗漏。

2. 合理设置 batch_size:根据嵌入模型的 QPS 限制和单次最大输入 token 数,适当调整 autoembedding_batch_size。

3. 配置 embedding_dim:在 model_list 中设置 embedding_dim,避免每次创建任务时手动指定。

4. 监控错误表:定期检查 autoembedding_error 表,及时发现和处理失败的嵌入请求。

5. 控制存量回填速率:对于大表存量回填,可通过减小 batch_size 或增大 naptime_ms 控制速率,避免对在线业务造成影响。

6. 删除任务前先验证:drop_*_autoembedding_task 不删除向量列和数据,如需完全清理需手动 DROP COLUMN。

7. 大批量数据导入:大事务批量写入会逐行入队并触发模型调用,建议先完成数据导入,再创建增量任务并配套存量任务回填历史数据,避免导入过程产生大量队列积压。

赞 (0)
上一篇 4天前
下一篇 4天前