云数据库 PostgreSQL 提供 tencentdb_ai 自动向量化功能,本文为您介绍关于 tencentdb_ai 自动向量化功能的说明及使用方法。
概述
tencentdb_ai 1.5版本新增了自动向量化(Auto Embedding)功能,允许用户在数据写入时自动完成文本到向量的转换,无需手动调用嵌入 API 或编写额外的 ETL 流程。只需一行 SQL 注册任务,后续对源表的所有 INSERT 和 UPDATE 操作都会自动触发向量生成,向量结果实时写回目标列,告别“数据写入 → 手动提取 → 调用嵌入 → 写回”的繁琐流程。
支持版本
v17.10_r1.19、v18.4_r1.10及以上的版本。
核心架构
自动向量化功能由三个核心组件协同工作:
组件 | 说明 |
增量任务(Incremental Task) | 通过触发器自动捕获 INSERT/UPDATE,实时生成向量 |
存量任务(Backfill Task) | 基于主键游标批量扫描已有数据,一次性补齐历史向量 |
后台工作进程(Bgworker) | 常驻后台进程,异步消费消息队列,调用嵌入模型并写回结果 |
核心价值
一行 SQL 注册,零代码嵌入:无需编写任何触发器、调度器或 ETL 脚本。
数据写入即向量化:INSERT/UPDATE 触发后自动入队,后台进程异步处理,不影响在线事务。
增量 + 存量双模式:既有实时触发器保证新数据零延迟,也有批量回填覆盖历史数据。
容错与重试:内置指数退避重试、错误记录、幂等去重等生产级特性。
安全隔离:所有内部函数使用 SECURITY DEFINER,权限收敛在扩展内部。
适用场景
RAG 知识库:文档分块入库后自动向量化,配合 tencentdb_ai.retrieve() / rag() 实现智能问答。
商品搜索:商品描述/标题变更时自动更新向量索引,实现语义搜索。
用户画像:用户行为文本实时向量化,支持相似用户推荐。
内容审核:内容入库后自动向量化,配合相似度检索实现去重/审核。
前提条件
数据库版本为 PostgreSQL 17、18。
tencentdb_ai 扩展 ≥ 1.5。
pgvector 扩展(CREATE EXTENSION vector)。
pgmq 扩展(通过 tencentdb_ai CASCADE 自动安装)。
已配置嵌入模型(如 hunyuan-embedding),并在 model_list 中设置 embedding_dim。
在 postgresql.conf 中配置 shared_preload_libraries = 'tencentdb_ai' 以启用后台工作进程。
配置 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, -- 表所在 schematable_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 | 嵌入模型名称,如 'hunyuan-embedding' |
target_column | NAME | 目标向量列名,默认 {source_columns[1]}_embedding |
index_method | TEXT | 向量索引方法,支持 'none' 'hnsw' 'ivfflat',默认 'hnsw' |
options | JSONB | 扩展选项,支持 vector_dim 覆盖默认维度 |
前提条件
调用者必须是表 owner 或 pg_tencentdb_superuser 角色。
表必须有单列主键。
源列必须存在且为文本兼容类型(text/varchar/jsonb 等)。
模型必须在 tencentdb_ai.model_list 中已注册。
必须在配置的 autoembedding_database 中执行。
使用示例
-- 单列嵌入:对 content 列创建嵌入,目标列自动命名为 content_embeddingSELECT tencentdb_ai.add_incr_autoembedding_task('public', 'articles',ARRAY['content'],'hunyuan-embedding');-- 多列嵌入:合并 title + body 生成嵌入,显式指定目标列和索引方法SELECT tencentdb_ai.add_incr_autoembedding_task('public', 'articles',ARRAY['title', 'body'],'hunyuan-embedding',target_column => 'doc_embedding',index_method => 'hnsw');-- 覆盖向量维度(当 model_list 中未设置 embedding_dim 时)SELECT tencentdb_ai.add_incr_autoembedding_task('public', 'articles',ARRAY['content'],'hunyuan-embedding',options => '{"vector_dim": 1024}');
二、add_backfill_autoembedding_task() — 创建存量向量化任务
存量任务用于对已有历史数据进行批量向量化回填。它不会创建新列或触发器,而是基于主键游标逐批扫描已有数据并入队。通常先创建增量任务(自动创建向量列),再创建存量任务回填历史数据。
函数签名
tencentdb_ai.add_backfill_autoembedding_task(schema_name NAME, -- 表所在 schematable_name NAME, -- 表名source_columns NAME[], -- 源文本列名数组model_name NAME, -- 嵌入模型名称target_column NAME DEFAULT NULL, -- 目标向量列名start_now BOOL DEFAULT true, -- 是否立即开始回填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 | 是否立即开始回填,默认 true |
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'],'hunyuan-embedding');-- 再创建存量任务,回填历史数据SELECT tencentdb_ai.add_backfill_autoembedding_task('public', 'articles',ARRAY['content'],'hunyuan-embedding');-- 延迟启动:先注册任务,稍后手动触发SELECT tencentdb_ai.add_backfill_autoembedding_task('public', 'articles',ARRAY['content'],'hunyuan-embedding',start_now => false);-- 稍后手动启动SELECT tencentdb_ai.run_backfill_autoembedding_task(1);
三、drop_incr_autoembedding_task() / drop_backfill_autoembedding_task() — 删除任务
删除任务时只清理元数据、触发器和队列中的待处理消息,不会删除已生成的向量列、索引或数据。
函数签名
tencentdb_ai.drop_incr_autoembedding_task(task_id BIGINT) RETURNS VOIDtencentdb_ai.drop_backfill_autoembedding_task(task_id BIGINT) RETURNS VOID
使用示例
-- 删除增量任务SELECT tencentdb_ai.drop_incr_autoembedding_task(1);-- 删除存量任务SELECT tencentdb_ai.drop_backfill_autoembedding_task(2);
四、run_backfill_autoembedding_task() — 手动触发存量回填
对于 start_now => false 创建的存量任务,或需要重新启动已完成/失败的任务,可以使用此函数手动触发。
函数签名
tencentdb_ai.run_backfill_autoembedding_task(task_id BIGINT, -- 存量任务 IDbatch_limit INT DEFAULT 1000 -- 本批次最大行数) RETURNS BIGINT
返回值:本次调用入队的行数。后续批次由后台工作进程自动推进。
使用示例
-- 手动触发存量回填,每批 500 行SELECT tencentdb_ai.run_backfill_autoembedding_task(1, 500);
五、autoembedding_status — 任务状态视图
系统视图,实时展示所有自动向量化任务的状态。
视图列说明
列名 | 类型 | 说明 |
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 | 最近一次错误信息 |
使用示例
-- 查看所有任务状态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;
六、autoembedding_error — 错误记录表
系统自动记录处理失败的详细信息,便于问题排查。
表列说明
列名 | 类型 | 说明 |
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 | 错误发生时间 |
使用示例
-- 查看最近的错误SELECT task_kind, task_id, row_id, error_message, created_atFROM tencentdb_ai.autoembedding_errorORDER BY created_at DESCLIMIT 10;
完整使用示例
以下为您介绍一个端到端的完整示例,涵盖扩展安装、模型注册、增量任务创建、存量回填和数据验证:
步骤1:环境准备
-- 安装扩展(pgmq / pgvector 通过 CASCADE 自动安装)CREATE EXTENSION IF NOT EXISTS tencentdb_ai CASCADE;-- 注册嵌入模型SELECT tencentdb_ai.add_model('hunyuan-embedding', '2023-09-01', NULL, NULL);SELECT tencentdb_ai.update_model_attr('hunyuan-embedding', 'SecretId', 'your_secret_id');SELECT tencentdb_ai.update_model_attr('hunyuan-embedding', 'SecretKey', 'your_secret_key');-- 设置嵌入维度(必须,否则创建任务时需通过 options.vector_dim 指定)UPDATE tencentdb_ai.model_list SET embedding_dim = 1024 WHERE model_name = 'hunyuan-embedding';
说明:
您需要通过混元 / 知识引擎原子能力,来获取实际的 SecretId、SecretKey。
步骤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 技术...');
步骤3:创建自动向量化任务
-- 创建增量任务:自动添加 content_embedding 列,创建触发器SELECT tencentdb_ai.add_incr_autoembedding_task('public', 'kb_articles',ARRAY['content'],'hunyuan-embedding') AS incr_task_id;-- 创建存量任务:回填已有的 3 行历史数据SELECT tencentdb_ai.add_backfill_autoembedding_task('public', 'kb_articles',ARRAY['content'],'hunyuan-embedding') AS backfill_task_id;
步骤4:验证向量生成
-- 等待后台进程处理(默认每 1 秒轮询一次)SELECT pg_sleep(3);-- 检查存量回填进度SELECT backfill_state, backfilled_rowsFROM tencentdb_ai.autoembedding_statusWHERE task_kind = 'backfill';-- 验证向量已生成SELECT id, title,content_embedding IS NOT NULL AS has_embedding,vector_dims(content_embedding) AS dimsFROM kb_articlesORDER BY id;-- 查看任务状态SELECT * FROM tencentdb_ai.autoembedding_status;
步骤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;
数据处理流程
增量处理流程
用户 INSERT/UPDATE → 触发器入队(pgmq) → 后台工作进程轮询↓读取队列消息(去重)↓重新读取源表当前内容↓批量调用 get_embedding()↓校验向量维度 + 再次确认源内容未变↓批量写回 vector 列
存量处理流程
创建存量任务 → 后台进程扫描运行中的任务↓按主键游标分批扫描源表↓批量入队到回填队列↓消费队列 → get_embedding() → 写回↓推进游标,直到扫描完成↓backfill_state → 'done'
关键设计特性
特性 | 说明 |
消费时重新读取 | 不是将源内容存入队列,而是在消费时重新读取当前行内容,确保向量始终基于最新数据 |
行级去重 | 增量队列按 row_id 去重,同一行的多次变更只保留最新内容 |
写回前确认 | 写回向量前再次比对源内容,若在嵌入调用期间源内容又被修改,则跳过写回(避免过期数据覆盖) |
指数退避重试 | 嵌入调用失败后按指数退避重试,超过 max_retry 次数后记录到 error 表 |
DDL 保护 | 通过事件触发器阻止在有活跃任务的表上执行 DROP TABLE 或 DROP COLUMN |
单数据库约束 | 所有 autoembedding API 限定在 autoembedding_database 指定的数据库中运行 |
任务生命周期管理
增量任务状态
状态 | 含义 | 操作 |
enabled | 正常运行,触发器有效 | 可通过 UPDATE 设置为 disabled |
disabled | 已禁用,触发器仍存在但跳过入队 | 可通过 UPDATE 恢复为 enabled |
error | 任务级别异常 | 检查 last_error 字段排查 |
-- 暂停增量任务UPDATE tencentdb_ai.autoembedding_incr_taskSET status = 'disabled' WHERE task_id = 1;-- 恢复增量任务UPDATE tencentdb_ai.autoembedding_incr_taskSET status = 'enabled' WHERE task_id = 1;
存量任务状态
状态 | 含义 | 操作 |
not_started | 已创建但未启动 | 调用 run_backfill_autoembedding_task() |
running | 正在回填中 | 后台进程自动推进 |
done | 回填完成 | 所有历史数据已处理 |
failed | 回填失败 | 检查 last_error,可调用 run_backfill_autoembedding_task() 重试 |
错误处理与排查
常见错误场景
错误场景 | 错误信息 | 解决方案 |
非配置数据库 | 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 | 确保同一列的增量和存量任务配置一致 |
维度不匹配 | 返回向量维度与预期不符 | 检查 model_list.embedding_dim 配置 |
工作进程未启动 | worker 不存在于 pg_stat_activity | 检查 shared_preload_libraries 和 autoembedding_worker 配置 |
监控工作进程
-- 检查后台工作进程是否运行SELECT backend_type, state, query_startFROM pg_stat_activityWHERE backend_type = 'tencentdb_ai autoembedding worker';-- 检查队列积压SELECT task_kind, task_id, pendingFROM tencentdb_ai.autoembedding_statusWHERE pending > 0;-- 查看错误详情SELECT * FROM tencentdb_ai.autoembedding_errorORDER BY created_at DESC LIMIT 20;
实践教程
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。