组件 | 说明 |
增量任务(Incremental Task) | 通过触发器自动捕获 INSERT / UPDATE,实时生成向量。 |
存量任务(Backfill Task) | 基于主键游标批量扫描已有数据,一次性补齐历史向量。 |
后台工作进程(Bgworker) | 常驻后台进程,异步消费消息队列,调用嵌入模型并写回结果。 |
参数 | 类型 | 默认值 | 说明 |
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) |
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 | 嵌入模型名称,如 'kinfra-text-embedding-0.6b' |
target_column | NAME | 目标向量列名,默认 {source_columns[1]}_embedding |
index_method | TEXT | 向量索引方法,支持 'none' 'hnsw' 'ivfflat',默认 'hnsw'(当前版本仅记录该配置,不自动创建索引) |
options | JSONB | 扩展选项,支持 vector_dim 覆盖默认维度 |
-- 单列嵌入:对 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}');
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 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 | 扩展选项,必须与增量任务配置一致 |
-- 先创建增量任务(自动创建向量列 + 触发器)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);
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);
tencentdb_ai.run_backfill_autoembedding_task(task_id BIGINT, -- 存量任务 IDbatch_size INT DEFAULT 8192 -- 后台工作进程每轮扫描入队的最大行数) RETURNS VOID
-- 手动启动存量回填SELECT tencentdb_ai.run_backfill_autoembedding_task(1);
列名 | 类型 | 说明 |
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;
列名 | 类型 | 说明 |
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;
-- 安装扩展(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';
-- 创建知识库表CREATE TABLE kb_articles (id bigserial PRIMARY KEY,title text,content text);-- 插入测试数据INSERT INTO kb_articles (title, content) VALUES('PostgreSQL 简介', 'PostgreSQL 是一个功能强大的开源对象关系数据库系统...'),('向量数据库', '向量数据库是一种专门用于存储和检索高维向量的数据库系统...'),('RAG 技术', '检索增强生成(RAG)是一种结合检索和生成能力的 AI 技术...');
-- 创建增量任务:自动添加 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;
-- 等待后台进程处理(默认每 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 | 10242 | 向量数据库 | t | 10243 | RAG 技术 | t | 1024(3 rows)
-- 查看任务状态SELECT * FROM tencentdb_ai.autoembedding_status;
-- 插入新数据,触发器自动入队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 简介 | t2 | 向量数据库 | t3 | RAG 技术 | t4 | 嵌入模型 | t(4 rows)
状态 | 含义 |
enabled | 任务已注册,数据写入自动入队 |
error | 任务级别异常,检查 last_error 字段排查 |
状态 | 含义 | 操作 |
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 | 确保同一列的增量和存量任务配置一致 |
维度写回不匹配 | 嵌入模型返回的向量维度与任务 vector_dim 不一致,消息归档并记录到 autoembedding_error | 检查 model_list.embedding_dim 或 options.vector_dim 配置是否与模型实际维度一致 |
返回向量数不足 | 无报错,任务 pending 长期不下降、无写回 | 嵌入模型单次调用返回的向量数少于输入行数时,整批消息退避重试;确认模型服务状态正常后等待恢复 |
工作进程未运行 | 创建任务时报 autoembedding worker was never registered;或任务 pending 持续不下降、无写回 | 核对前提条件中的 shared_preload_libraries 与 autoembedding_database 配置,修改后重启实例生效 |
-- 检查队列积压SELECT task_kind, task_id, pendingFROM tencentdb_ai.autoembedding_statusWHERE pending > 0;-- 查看错误详情SELECT * FROM tencentdb_ai.autoembedding_errorORDER BY created_at DESC LIMIT 20;
文档反馈