帮你快速理解、总结文档立即下载
文档中心>云数据库 PostgreSQL>操作指南>插件管理>tencentdb_ai 1.6 Auto Embedding 功能说明

tencentdb_ai 1.6 Auto Embedding 功能说明

最近更新时间:2026-08-14 18:00:03
我的收藏
说明:
环境:本文所使用数据库版本为 PostgreSQL 17.10,插件为 tencentdb_ai 1.6。

概述

tencentdb_ai 1.6 支持两种方式注册嵌入模型来实现自动向量化:

方式一:直接注册混元模型
方式二:通过 TokenHub 注册
认证方式
SecretId + SecretKey(TC3 签名)
api_key(Bearer Token)
后端类型
backend_type = 'hunyuan'
backend_type = 'tokenhub'
适用场景
已有混元模型的 SecretId/SecretKey
已迁移到 TokenHub 平台,统一 API Key 管理
模型示例
hunyuan-embedding(1024 维)
kinfra-text-embedding-0.6b(1024 维)
是否需要申请凭证
需要混元密钥
需要 TokenHub API Key
当前环境实测
通过
通过
注意:
环境预装的 auto 模型(backend_type=tokenhub)用于 ChatCompletions(LLM 对话),不支持 Embedding。如需使用 TokenHub 做自动向量化,须按方式二单独注册嵌入模型。

方式一:直接注册混元 Embedding 模型

环境检查

检查扩展是否可用

SELECT name, default_version, comment
FROM pg_available_extensions
WHERE name IN ('tencentdb_ai', 'pgvector', 'pgmq', 'vector');
数据库原始返回:
name | default_version | installed_version | comment
--------------+-----------------+-------------------+----------------------------------------------------------------
tencentdb_ai | 1.6 | | tencentdb_ai is an ai extension that allows your database to integrate AI capabilities, such as promt, embedding, etc.
pgmq | 1.11.1 | | A lightweight message queue. Like AWS SQS and RSMQ but on Postgres.
vector | 0.8.2 | | vector data type and ivfflat and hnsw access methods
(3 rows)
结果说明:tencentdb_ai 1.6 / pgmq 1.11.1 / vector 0.8.2 均可用。

检查 shared_preload_libraries

SHOW shared_preload_libraries;
数据库原始返回:
shared_preload_libraries
-----------------------------------------------------------------------------------------------------------------------------------------
pg_stat_statements,pg_stat_log,wal2json,decoderbufs,decoder_raw,pg_hint_plan,rds_server_handler,tencentdb_pwdcheck,auto_explain,pgaudit,tencentdb_ai
(1 row)
结果说明:tencentdb_ai 已在 shared_preload_libraries 中,最后一个位置。

检查 autoembedding 相关 GUC 参数

SELECT name, setting, context
FROM pg_settings
WHERE name LIKE 'tencentdb_ai.autoembedding%'
ORDER BY name;
数据库原始返回:
name | setting | context
--------------------------------------------------+----------+---------
tencentdb_ai.autoembedding_batch_size | 32 | sighup
tencentdb_ai.autoembedding_database | postgres | sighup
tencentdb_ai.autoembedding_max_input_bytes | 65536 | sighup
tencentdb_ai.autoembedding_max_retry | 5 | sighup
tencentdb_ai.autoembedding_naptime_ms | 5000 | sighup
tencentdb_ai.autoembedding_retry_base_ms | 1000 | sighup
tencentdb_ai.autoembedding_task_launch_jitter_ms | 10 | sighup
tencentdb_ai.autoembedding_worker | on | sighup
(8 rows)
结果说明:autoembedding_database = postgresautoembedding_worker = on,全部默认值合理。

安装扩展

-- 会自动安装 pgcrypto、vector、pgmq
CREATE EXTENSION IF NOT EXISTS tencentdb_ai CASCADE;
数据库原始返回:
NOTICE: installing required extension "pgcrypto"
NOTICE: installing required extension "vector"
NOTICE: installing required extension "pgmq"
WARNING: change unlogged table to logged table, If you want to use unlogged tables, please set tencentdb_log_unlogged_table to false.
CREATE EXTENSION
结果说明:扩展安装成功,CASCADE 自动安装了 pgcrypto、vector、pgmq 三个依赖扩展。

检查 pgmq 队列

SELECT * FROM pgmq.list_queues();
数据库原始返回:
queue_name | is_partitioned | is_unlogged | created_at
-------------------------------------+----------------+-------------+-------------------------------
tencentdb_ai_autoembedding_incr | f | f | 2026-08-05 22:36:41.689961+08
tencentdb_ai_autoembedding_backfill | f | f | 2026-08-05 22:36:41.689961+08
(2 rows)
结果说明:pgmq 自动创建了两个队列:tencentdb_ai_autoembedding_incr(增量)和 tencentdb_ai_autoembedding_backfill(存量)。

注册混元 Embedding 模型

说明:
这里填入 SecretId 和 SecretKey。

查看已注册模型

-- 查看 model_list 表结构
SELECT column_name, data_type FROM information_schema.columns
WHERE table_schema = 'tencentdb_ai' AND table_name = 'model_list'
ORDER BY ordinal_position;

-- 查看已有模型
SELECT * FROM tencentdb_ai.model_list;
数据库原始返回:
column_name | data_type
-----------------+-----------
model_name | name
json_path | jsonpath
secretid | bytea
secretkey | bytea
version | text
region | text
id_random | integer
key_random | integer
backend_type | text
real_model_name | name
api_key | bytea
api_key_random | integer
embedding_dim | integer
(13 rows)

model_name | json_path | secretid | secretkey | version | region | id_random | key_random | backend_type | real_model_name | api_key | api_key_random | embedding_dim
------------+------------------------------------+----------+-----------+---------+--------+-----------+------------+--------------+-----------------+---------+----------------+---------------
auto | $."choices"[0]."message"."content" | | | | | | | tokenhub | auto | | |
(1 row)
结果说明:初始只有 auto 模型(tokenhub 后端,用于 ChatCompletions,非 Embedding)。需要注册混元嵌入专用模型。

注册 hunyuan-embedding 模型

-- 注册模型(最后一个参数 backend_type 默认值为 'hunyuan',可不传)
SELECT tencentdb_ai.add_model('hunyuan-embedding', '2023-09-01', NULL, NULL);

-- 【在这里填入 SecretId】
SELECT tencentdb_ai.update_model_attr(
'hunyuan-embedding',
'SecretId',
'<你的SecretId>' -- 替换为你的 SecretId
);

-- 【在这里填入 SecretKey】
SELECT tencentdb_ai.update_model_attr(
'hunyuan-embedding',
'SecretKey',
'<你的SecretKey>' -- 替换为你的 SecretKey
);

-- 设置嵌入向量维度
UPDATE tencentdb_ai.model_list
SET embedding_dim = 1024
WHERE model_name = 'hunyuan-embedding';

-- 验证模型配置
SELECT model_name, backend_type, embedding_dim
FROM tencentdb_ai.model_list
WHERE model_name = 'hunyuan-embedding';
数据库原始返回:
add_model
-----------

(1 row)

update_model_attr
-------------------

(1 row)

update_model_attr
-------------------

(1 row)

UPDATE 1

model_name | backend_type | embedding_dim
-------------------+--------------+---------------
hunyuan-embedding | hunyuan | 1024
(1 row)
结果说明:混元 embedding 模型注册成功,backend_type = hunyuanembedding_dim = 1024

创建测试表和数据

-- 建表(必须有单列主键)
DROP TABLE IF EXISTS kb_articles CASCADE;
CREATE TABLE kb_articles (
id bigserial PRIMARY KEY,
title text,
content text
);

-- 插入测试数据
INSERT INTO kb_articles (title, content) VALUES
('PostgreSQL 简介',
'PostgreSQL 是一个功能强大的开源对象关系数据库系统,经过30多年的积极开发,在可靠性、功能稳健性和性能方面赢得了良好的声誉。'),
('向量数据库',
'向量数据库是一种专门用于存储和检索高维向量的数据库系统,通过向量相似度计算实现语义搜索、推荐系统和RAG等AI应用。'),
('RAG 技术',
'检索增强生成(RAG)是一种结合检索和生成能力的 AI 技术,通过从知识库中检索相关信息来增强大语言模型的回答质量。');

-- 验证写入
SELECT 'Test data inserted: ' || count(*)::text FROM kb_articles;
数据库原始返回:
NOTICE: table "kb_articles" does not exist, skipping
DROP TABLE
CREATE TABLE
INSERT 0 3
?column?
-----------------------
Test data inserted: 3
(1 row)
结果说明:表创建成功,3 行测试数据写入。

创建自动向量化任务

-- 5.1 创建增量任务
-- 自动创建 content_embedding vector(1024) 列
-- 自动创建 INSERT AFTER + UPDATE BEFORE 触发器
SELECT tencentdb_ai.add_incr_autoembedding_task(
'public', 'kb_articles',
ARRAY['content'],
'hunyuan-embedding'
) AS incr_task_id;

-- 5.2 创建存量任务(回填历史数据)
SELECT tencentdb_ai.add_backfill_autoembedding_task(
'public', 'kb_articles',
ARRAY['content'],
'hunyuan-embedding'
) AS backfill_task_id;
数据库原始返回:
incr_task_id
--------------
1
(1 row)

backfill_task_id
------------------
1
(1 row)
结果说明:增量和存量任务均创建成功,task_id 均为 1。

验证表结构和触发器

查看表结构

\\d kb_articles
数据库原始返回:
Table "public.kb_articles"
Column | Type | Collation | Nullable | Default
-------------------+--------------+-----------+----------+-----------------------------------------
id | bigint | | not null | nextval('kb_articles_id_seq'::regclass)
title | text | | |
content | text | | |
content_embedding | vector(1024) | | |
Indexes:
"kb_articles_pkey" PRIMARY KEY, btree (id)
Triggers:
tencentdb_ai_autoemb_ins_1 AFTER INSERT ON kb_articles FOR EACH ROW
EXECUTE FUNCTION tencentdb_ai._autoembedding_enqueue_trigger(...)
tencentdb_ai_autoemb_upd_1 BEFORE UPDATE OF content ON kb_articles FOR EACH ROW
EXECUTE FUNCTION tencentdb_ai._autoembedding_enqueue_trigger(...)
结果说明:add_incr_autoembedding_task 自动创建了 content_embedding vector(1024) 列和两个触发器。

查看触发器详情

SELECT trigger_name, event_manipulation, action_statement
FROM information_schema.triggers
WHERE event_object_table = 'kb_articles';
数据库原始返回:
trigger_name | event_manipulation | action_statement
----------------------------+--------------------+------------------------------------------------------------------------------------------------------------------------
tencentdb_ai_autoemb_ins_1 | INSERT | EXECUTE FUNCTION tencentdb_ai._autoembedding_enqueue_trigger('1', '17136', 'content_embedding', 'content', '{}', 'id')
tencentdb_ai_autoemb_upd_1 | UPDATE | EXECUTE FUNCTION tencentdb_ai._autoembedding_enqueue_trigger('1', '17136', 'content_embedding', 'content', '{}', 'id')
(2 rows)
结果说明:INSERT AFTER 触发器 + UPDATE BEFORE OF content 触发器均已生效。

查看任务状态

SELECT task_kind, task_id, table_name, target_column, status, backfill_state, pending, failed_count
FROM tencentdb_ai.autoembedding_status
ORDER BY task_id;
数据库原始返回:
task_kind | task_id | table_name | target_column | status | backfill_state | pending | failed_count
-----------+---------+-------------+-------------------+---------+----------------+---------+--------------
incr | 1 | kb_articles | content_embedding | enabled | | 0 | 0
backfill | 1 | kb_articles | content_embedding | | not_started | 0 | 0
(2 rows)
结果说明:视图可正常查询。⚠️ 存量任务 backfill_state = not_started,未自动开始(见 Bug 章节)。

查看增量任务详情

SELECT table_name, relid, status FROM tencentdb_ai.autoembedding_incr_task;
数据库原始返回:
table_name | relid | status
-------------+-------+---------
kb_articles | 17136 | enabled
(1 row)
结果说明:增量任务状态为 enabled,relid = 17136。

测试增量路径

INSERT 触发

-- 插入新数据(在增量任务创建之后再插入)
INSERT INTO kb_articles (title, content) VALUES
('嵌入模型', '嵌入模型是将文本转换为向量表示的机器学习模型,常见的嵌入模型包括BERT、GPT和混元嵌入等。');
数据库原始返回:
INSERT 0 1
验证步骤:
-- 立即查 pending(应看到 pending = 1,表示已入队)
SELECT task_kind, pending FROM tencentdb_ai.autoembedding_status;
数据库原始返回:
task_kind | pending
-----------+---------
incr | 1
backfill | 0
(2 rows)
结果说明:INSERT 触发后 pending = 1,消息已入队。
-- 等待后台 worker 处理
SELECT pg_sleep(5);
数据库原始返回:
pg_sleep
----------

(1 row)
-- 检查向量是否生成(注意:前3行在任务创建前已存在,不会自动回填)
SELECT id, title,
content_embedding IS NOT NULL AS has_embedding,
CASE WHEN content_embedding IS NOT NULL
THEN vector_dims(content_embedding) ELSE NULL END AS dims
FROM kb_articles
ORDER BY id;
数据库原始返回:
id | title | has_embedding | dims
----+-----------------+---------------+------
1 | PostgreSQL 简介 | f |
2 | 向量数据库 | f |
3 | RAG 技术 | f |
4 | 嵌入模型 | t |
(4 rows)
结果说明:id=4(任务创建后 INSERT 的行)向量生成成功。id=1~3 因在任务创建前已存在,未被增量触发器捕获,需要存量回填。

再次 INSERT 验证持续入队

INSERT INTO kb_articles (title, content) VALUES
('混元大模型', '腾讯混元大模型是腾讯自研的通用大语言模型,具备强大的自然语言理解和生成能力。');
数据库原始返回:
INSERT 0 1
-- 立即查 pending
SELECT task_kind, pending FROM tencentdb_ai.autoembedding_status;
数据库原始返回:
task_kind | pending
-----------+---------
incr | 1
backfill | 0
(2 rows)
第二次 INSERT 也成功入队。
SELECT pg_sleep(5);

SELECT task_kind, pending, failed_count FROM tencentdb_ai.autoembedding_status;

SELECT id, title, content_embedding IS NOT NULL AS has_embedding
FROM kb_articles ORDER BY id;

-- 错误表
SELECT * FROM tencentdb_ai.autoembedding_error ORDER BY created_at DESC LIMIT 5;
数据库原始返回:
pg_sleep
----------

(1 row)

task_kind | pending | failed_count
-----------+---------+--------------
incr | 0 | 0
backfill | 0 | 0
(2 rows)

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

error_id | msg_id | task_kind | task_id | row_id | error_code | error_message | detail | created_at
----------+--------+-----------+---------+--------+------------+---------------+--------+------------
(0 rows)
结果说明:id=4、5 的 INSERT 路径全部成功,pending = 0failed_count = 0、无错误记录。id=1~3 仍为 null(因缺少存量回填)。

向量维度验证

SELECT id, title,
vector_dims(content_embedding) AS dims,
length(content_embedding::text) AS text_len
FROM kb_articles
WHERE content_embedding IS NOT NULL;
数据库原始返回:
id | title | dims | text_len
----+------------+------+----------
4 | 嵌入模型 | 1024 | 12727
5 | 混元大模型 | 1024 | 12779
(2 rows)
结果说明:向量均为 1024 维,与模型配置一致。

UPDATE 触发(同时绕过存量回填 Bug,为 id=1~3 生成向量)

-- 更新已有行,即使内容不变也会触发 UPDATE 触发器
UPDATE kb_articles SET content = content WHERE id IN (1,2,3);
数据库原始返回:
UPDATE 3
-- 立即查 pending(应为 3)
SELECT task_kind, pending FROM tencentdb_ai.autoembedding_status;
数据库原始返回:
task_kind | pending
-----------+---------
incr | 3
backfill | 0
(2 rows)
pending = 3,三行均已入队。
SELECT pg_sleep(5);

-- 全量验证
SELECT id, title, content_embedding IS NOT NULL AS has_embedding
FROM kb_articles ORDER BY id;
数据库原始返回:
pg_sleep
----------

(1 row)

id | title | has_embedding
----+-----------------+---------------
1 | PostgreSQL 简介 | t
2 | 向量数据库 | t
3 | RAG 技术 | t
4 | 嵌入模型 | t
5 | 混元大模型 | t
(5 rows)
结果说明:UPDATE 触发路径正常工作,id=1~3 通过 UPDATE 成功生成向量。全部 5 行 has_embedding = t

向量相似度检索

仅两行时的相似度

SELECT id, title,
content_embedding <=> (
SELECT content_embedding FROM kb_articles WHERE id = 4
) AS distance
FROM kb_articles
WHERE content_embedding IS NOT NULL
ORDER BY distance;
数据库原始返回:
id | title | distance
----+------------+---------------------
4 | 嵌入模型 | 0
5 | 混元大模型 | 0.28689392595353047
(2 rows)
结果说明:「嵌入模型」到自身的余弦距离为 0,到「混元大模型」的距离约 0.287,两者语义相近(都关于 AI 模型),符合预期。

全量相似度检索

SELECT id, title,
content_embedding <=> (
SELECT content_embedding FROM kb_articles WHERE id = 1
) AS distance
FROM kb_articles
WHERE content_embedding IS NOT NULL
ORDER BY distance;
数据库原始返回:
id | title | distance
----+-----------------+---------------------
1 | PostgreSQL 简介 | 0
2 | 向量数据库 | 0.2789466068930575
3 | RAG 技术 | 0.3563481692751316
4 | 嵌入模型 | 0.3840361738420558
5 | 混元大模型 | 0.40611747180705204
(5 rows)
结果说明:「PostgreSQL 简介」与「向量数据库」语义距离最近(0.279,都是数据库领域),与「混元大模型」最远(0.406),排序合理。

方式二:通过 TokenHub 注册 Embedding 模型

什么是 TokenHub

TokenHub 是腾讯云统一的 AI 模型网关平台,提供统一的 API Key 管理和计费。在 tencentdb_ai 1.6 版本中,TokenHub 已支持 Embedding 接口(此前仅支持 ChatCompletions)。
使用 TokenHub 的优势:
统一凭证管理:一个 API Key 管理所有模型(聊天 + 嵌入),无需分别管理 SecretId/SecretKey。
认证方式简单:Bearer Token 认证,直接传 api_key 即可。

TokenHub Embedding 模型全览

TokenHub 平台共提供 4 款 Embedding 模型,分为文本向量多模态向量两大类。所有模型均兼容 OpenAI Embeddings API 格式,接口地址:
文本向量:POST https://tokenhub.tencentmaas.com/v1/embeddings
多模态向量:POST https://tokenhub.tencentmaas.com/v1/embeddings/multimodal
认证方式:Authorization: Bearer <api_key>

文本向量模型(Text Embedding)

属性
kinfra-text-embedding-0.6b
kinfra-text-embedding-4b
参数量
0.6B(6 亿)
4B(40 亿)
输出维度
1024 维
2560 维
上下文长度
32k tokens
32k tokens
支持语言
30+ 种:中、英、日、韩、法、德、俄、葡、西等
同左
推荐场景
大规模文本召回、延迟敏感、成本敏感
高质量文本检索、深层语义理解
典型任务
语义检索、相似度计算、文本聚类、文本分类、FAQ 匹配、智能问答、知识库检索
同左,精度更高
CMTEB 评测对比(数值越高越好):
评测指标
0.6b
4b
提升
Mean(Task) 综合得分
66.64
72.63
+9.0%
检索(Retrieval)
71.01
77.02
+8.5%
聚类(Clustering)
68.60
78.15
+13.9%
语义相似度(STS)
54.88
61.41
+11.9%
分类(Classification)
71.46
75.55
+5.7%
重排(Reranking)
64.16
68.26
+6.4%

多模态向量模型(Multimodal Embedding)

支持文本(text)、图片(image_url)、视频(video_url)三种模态的向量化。
属性
kinfra-vl-embedding-2b
kinfra-vl-embedding-8b
参数量
2B(20 亿)
8B(80 亿)
输出维度
2048 维
4096 维
上下文长度
32k tokens
32k tokens
支持模态
文本 + 图片 + 视频
文本 + 图片 + 视频
支持语言
30+ 种主流语言
同左
推荐场景
多模态在线检索、视频检索、响应速度优先
高精度多模态检索、精度优先
典型任务
图文检索、视频检索、多模态语义匹配、图文互搜
同左,精度更高
多模态评测对比(数值越高越好):
评测任务
2b
8b
提升
MSCOCO 图搜文
0.70
0.76
+8.6%
VisualNews 图搜文
0.60
0.67
+11.7%
WebQA
0.87
0.90
+3.4%
VisDial
0.69
0.87
+26.1%
图文检索 mean
0.698
0.795
+13.9%
MMEB-V2 综合
69.82
75.26
+7.8%
多模态输入限制
限制项
说明
图片格式
JPEG、PNG、WEBP、BMP、TIFF
图片像素范围
4,096(~64×64)~ 1,843,200(~1280×1440)
视频格式
MP4、AVI、MOV
视频总像素上限
7,864,320
视频最大采样帧数
64 帧
视频默认 fps
1.0
向量归一化
默认 L2 归一化
编码格式
仅支持 float

选型速查:什么场景用什么模型

你的需求
推荐模型
理由
中文知识库 / FAQ 检索,成本敏感,高并发
kinfra-text-embedding-0.6b
1024 维,轻量快速
多语言检索,需要深层语义理解,精度要求高
kinfra-text-embedding-4b
2560 维,CMTEB 综合 72.63
图文互搜(按文字搜图片、按图片搜文字)
kinfra-vl-embedding-2b
2048 维,响应速度快
视频检索、高精度多模态匹配
kinfra-vl-embedding-8b
4096 维,MMEB-V2 综合 75.26
纯文本 + 未来可能扩展多模态
先注册 -0.6b-4b,后续加多模态模型
一个表可绑定一个模型,多表可混用

注册 TokenHub Embedding 模型

说明:
与方式一的关键区别
add_model() 的第 5 个参数显式指定 backend_type = 'tokenhub'(默认值是 'hunyuan')。
认证用 api_key(Bearer Token),而不是 SecretId / SecretKey
real_model_name 指向 TokenHub 上的实际模型名(如 kinfra-text-embedding-0.6b)。

查看 model_list 表结构

SELECT column_name, data_type FROM information_schema.columns
WHERE table_schema = 'tencentdb_ai' AND table_name = 'model_list'
ORDER BY ordinal_position;
数据库原始返回:
column_name | data_type
-----------------+-----------
model_name | name
json_path | jsonpath
secretid | bytea
secretkey | bytea
version | text
region | text
id_random | integer
key_random | integer
backend_type | text
real_model_name | name
api_key | bytea
api_key_random | integer
embedding_dim | integer
(13 rows)
结果说明:TokenHub 需要的 api_key 列(bytea 加密存储)、backend_type 列、real_model_name 列均存在。

注册文本向量模型

-- ===== 文本向量模型注册模板 =====
-- 关键参数:第5个参数 p_backend_type 必须显式传 'tokenhub'(默认值是 'hunyuan')
-- 第6个参数 real_model_name 为 TokenHub 上的实际模型名
-- 根据实际需求选择以下一个即可

-- 模型 A:轻量文本向量(1024 维,成本低,速度快)
-- 场景:中文知识库检索、FAQ 匹配、文本聚类分类
SELECT tencentdb_ai.add_model(
'my-text-embed-0.6b', -- 模型别名(自定义)
NULL, NULL, NULL, -- version, region, json_path(不需要)
'tokenhub', -- backend_type:必须显式指定为 'tokenhub'
'kinfra-text-embedding-0.6b' -- real_model_name
);
SELECT tencentdb_ai.update_model_attr('my-text-embed-0.6b', 'api_key', 'sk-tp-你的APIKey');
UPDATE tencentdb_ai.model_list SET embedding_dim = 1024 WHERE model_name = 'my-text-embed-0.6b';

-- 模型 B:高精度文本向量(2560 维,精度高)
-- 场景:多语言深度语义检索、跨语言匹配、高质量语义理解
SELECT tencentdb_ai.add_model(
'my-text-embed-4b', -- 模型别名(自定义)
NULL, NULL, NULL,
'tokenhub',
'kinfra-text-embedding-4b'
);
SELECT tencentdb_ai.update_model_attr('my-text-embed-4b', 'api_key', 'sk-tp-你的APIKey');
UPDATE tencentdb_ai.model_list SET embedding_dim = 2560 WHERE model_name = 'my-text-embed-4b';

注册多模态向量模型

-- ===== 多模态向量模型注册模板 =====
-- 多模态模型支持 text(文本)、image_url(图片)、video_url(视频)三种输入
-- 用于图文互搜、视频语义检索等场景

-- 模型 C:轻量多模态(2048 维,响应速度快)
-- 场景:图文互搜、在线多模态检索
SELECT tencentdb_ai.add_model(
'my-vl-embed-2b', -- 模型别名(自定义)
NULL, NULL, NULL,
'tokenhub',
'kinfra-vl-embedding-2b' -- VL = Vision-Language(视觉-语言)
);
SELECT tencentdb_ai.update_model_attr('my-vl-embed-2b', 'api_key', 'sk-tp-你的APIKey');
UPDATE tencentdb_ai.model_list SET embedding_dim = 2048 WHERE model_name = 'my-vl-embed-2b';

-- 模型 D:高精度多模态(4096 维,精度最高)
-- 场景:视频检索、高精度多模态语义匹配
SELECT tencentdb_ai.add_model(
'my-vl-embed-8b', -- 模型别名(自定义)
NULL, NULL, NULL,
'tokenhub',
'kinfra-vl-embedding-8b'
);
SELECT tencentdb_ai.update_model_attr('my-vl-embed-8b', 'api_key', 'sk-tp-你的APIKey');
UPDATE tencentdb_ai.model_list SET embedding_dim = 4096 WHERE model_name = 'my-vl-embed-8b';

注册验证(以 0.6b 文本模型为例)

-- 验证注册结果
SELECT model_name, backend_type, real_model_name, embedding_dim FROM tencentdb_ai.model_list;
数据库原始返回(已注册 tokenhub-embedding,别名指向 kinfra-text-embedding-0.6b):
model_name | backend_type | real_model_name | embedding_dim
---------------------+--------------+----------------------------+---------------
auto | tokenhub | | -1
hunyuan-embedding | hunyuan | | 1024
tokenhub-embedding | tokenhub | kinfra-text-embedding-0.6b | 1024
(3 rows)
结果说明:TokenHub 嵌入模型注册成功:
backend_type = tokenhub(与方式一的 hunyuan 明显不同)
real_model_name = kinfra-text-embedding-0.6b(TokenHub 上的实际模型)
embedding_dim = 1024
四种模型注册速查
模型别名(自定义)
real_model_name
embedding_dim
类型
my-text-embed-0.6b
kinfra-text-embedding-0.6b
1024
轻量文本
my-text-embed-4b
kinfra-text-embedding-4b
2560
高精度文本
my-vl-embed-2b
kinfra-vl-embedding-2b
2048
轻量多模态
my-vl-embed-8b
kinfra-vl-embedding-8b
4096
高精度多模态

创建测试表和自动向量化任务

建表并插入数据

DROP TABLE IF EXISTS kb_articles_tokenhub CASCADE;
CREATE TABLE kb_articles_tokenhub (
id bigserial PRIMARY KEY,
title text,
content text
);

INSERT INTO kb_articles_tokenhub (title, content) VALUES
('PostgreSQL 简介', 'PostgreSQL 是一个功能强大的开源对象关系数据库系统,经过30多年的积极开发。'),
('向量数据库', '向量数据库是一种专门用于存储和检索高维向量的数据库系统。'),
('AI 技术趋势', '人工智能技术在2026年迎来了新的发展浪潮,多模态大模型成为主流。');
数据库原始返回:
DROP TABLE
CREATE TABLE
INSERT 0 3

创建增量任务

-- 注意:model_name 使用的是注册时的别名 'tokenhub-embedding'
SELECT tencentdb_ai.add_incr_autoembedding_task(
'public', 'kb_articles_tokenhub',
ARRAY['content'],
'tokenhub-embedding' -- 使用 TokenHub 注册的模型
) AS incr_task_id;
数据库原始返回:
incr_task_id
--------------
4
(1 row)
结果说明:增量任务创建成功,task_id = 4(与方式一完全相同的接口)。

验证表结构和触发器

\\d kb_articles_tokenhub
数据库原始返回:
Table "public.kb_articles_tokenhub"
Column | Type | Collation | Nullable | Default
-------------------+--------------+-----------+----------+--------------------------------------------------
id | bigint | | not null | nextval('kb_articles_tokenhub_id_seq'::regclass)
title | text | | |
content | text | | |
content_embedding | vector(1024) | | |
Indexes:
"kb_articles_tokenhub_pkey" PRIMARY KEY, btree (id)
Triggers:
tencentdb_ai_autoemb_ins_4 AFTER INSERT ON kb_articles_tokenhub FOR EACH ROW
EXECUTE FUNCTION tencentdb_ai._autoembedding_enqueue_trigger('4', '17167', ...)
tencentdb_ai_autoemb_upd_4 BEFORE UPDATE OF content ON kb_articles_tokenhub FOR EACH ROW
EXECUTE FUNCTION tencentdb_ai._autoembedding_enqueue_trigger('4', '17167', ...)
结果说明:表结构和触发器与方式一完全一致,content_embedding vector(1024) 列 + INSERT/UDPATE 触发器均自动创建。

查看任务状态

SELECT task_kind, task_id, table_name, model_name, status
FROM tencentdb_ai.autoembedding_status
ORDER BY task_id;
数据库原始返回:
task_kind | task_id | table_name | model_name | status
-----------+---------+----------------------+---------------------+---------
incr | 1 | kb_articles | hunyuan-embedding | enabled
backfill | 1 | kb_articles | hunyuan-embedding |
incr | 4 | kb_articles_tokenhub | tokenhub-embedding | enabled
(3 rows)
结果说明:TokenHub 任务(task_id=4)与混元任务(task_id=1)并存,两种方式可同时使用。

测试增量路径

INSERT 触发入队

-- 插入新数据,触发器自动入队
INSERT INTO kb_articles_tokenhub (title, content) VALUES
('混元大模型', '腾讯混元大模型是腾讯自研的通用大语言模型,具备强大的自然语言理解和生成能力。');
数据库原始返回:
INSERT 0 1
-- 查看 pending
SELECT task_kind, task_id, table_name, model_name, pending
FROM tencentdb_ai.autoembedding_status ORDER BY task_id;
数据库原始返回:
task_kind | task_id | table_name | model_name | pending
-----------+---------+----------------------+-------------------+---------
incr | 1 | kb_articles | hunyuan-embedding | 0
backfill | 1 | kb_articles | hunyuan-embedding | 0
incr | 5 | kb_articles_tokenhub | tokenhub-embed | 1
(3 rows)
结果说明:INSERT 触发成功,pending = 1,消息已入队。

Worker 消费并生成向量

-- 等待 worker 处理
SELECT pg_sleep(10);

-- pending 状态
SELECT task_kind, task_id, pending, failed_count
FROM tencentdb_ai.autoembedding_status ORDER BY task_id;

-- 向量结果
SELECT id, title,
content_embedding IS NOT NULL AS has_embedding,
CASE WHEN content_embedding IS NOT NULL THEN vector_dims(content_embedding)::text ELSE 'NULL' END AS dims
FROM kb_articles_tokenhub ORDER BY id;

-- 错误记录
SELECT * FROM tencentdb_ai.autoembedding_error WHERE task_id = 5 ORDER BY created_at DESC LIMIT 5;
数据库原始返回:
pg_sleep
----------

(1 row)

task_kind | task_id | pending | failed_count
-----------+---------+---------+--------------
incr | 1 | 0 | 0
backfill | 1 | 0 | 0
incr | 5 | 0 | 0
(3 rows)

id | title | has_embedding | dims
----+-----------------+---------------+------
1 | PostgreSQL 简介 | f | NULL
2 | 向量数据库 | f | NULL
3 | RAG 技术 | f | NULL
4 | 混元大模型 | t | 1024
(4 rows)

error_id | msg_id | task_kind | task_id | row_id | error_code | error_message | detail | created_at
----------+--------+-----------+---------+--------+------------+---------------+--------+------------
(0 rows)
结果说明:TokenHub Embedding 向量生成成功!pending = 0failed_count = 0,无错误。id=4 的向量维度为 1024。

UPDATE 回填历史数据

-- 更新已有行触发 UPDATE 触发器回填向量
UPDATE kb_articles_tokenhub SET content = content WHERE id IN (1,2,3);
数据库原始返回:
UPDATE 3
-- 查 pending(应为 3)
SELECT task_kind, pending FROM tencentdb_ai.autoembedding_status WHERE task_id = 5;
数据库原始返回:
task_kind | pending
-----------+---------
incr | 3
(1 row)
pending = 3,三行均已入队。
SELECT pg_sleep(8);

-- 全量向量 + 维度
SELECT id, title,
content_embedding IS NOT NULL AS has_embedding,
CASE WHEN content_embedding IS NOT NULL THEN vector_dims(content_embedding)::text ELSE 'NULL' END AS dims
FROM kb_articles_tokenhub ORDER BY id;
数据库原始返回:
pg_sleep
----------

(1 row)

id | title | has_embedding | dims
----+-----------------+---------------+------
1 | PostgreSQL 简介 | t | 1024
2 | 向量数据库 | t | 1024
3 | RAG 技术 | t | 1024
4 | 混元大模型 | t | 1024
(4 rows)
结果说明:全部 4 行向量生成完毕,均为 1024 维。

向量相似度检索

SELECT id, title,
content_embedding <=> (
SELECT content_embedding FROM kb_articles_tokenhub WHERE id = 1
) AS distance
FROM kb_articles_tokenhub
WHERE content_embedding IS NOT NULL
ORDER BY distance;
数据库原始返回:
id | title | distance
----+-----------------+--------------------
1 | PostgreSQL 简介 | 0
2 | 向量数据库 | 0.5327960213665903
3 | RAG 技术 | 0.6819517300768105
4 | 混元大模型 | 0.710405861090913
(4 rows)
结果说明:向量相似度检索正常。「PostgreSQL 简介」与「向量数据库」距离最近(0.533,数据库领域关联),检索结果合理。
选择建议
已有混元密钥 → 用方式一,最简单直接。
已迁移到 TokenHub 平台 / 想统一管理所有 AI 模型凭证 → 用方式二。
需要多模态能力(图文互搜、视频检索)→ 必须用方式二(TokenHub),混元不支持。
两种方式可以共存,不同表可以用不同模型。
TokenHub 模型选型速查
你的需求
选用模型
embedding_dim
中文知识库检索、FAQ 匹配,成本敏感
kinfra-text-embedding-0.6b
1024
多语言深度语义检索,精度要求高
kinfra-text-embedding-4b
2560
图文互搜,响应速度优先
kinfra-vl-embedding-2b
2048
视频检索、高精度多模态匹配
kinfra-vl-embedding-8b
4096

监控与排查

Worker 进程状态

SELECT pid, backend_type, state, query, query_start, state_change
FROM pg_stat_activity
WHERE backend_type LIKE '%tencentdb_ai%';
数据库原始返回:
pid | backend_type | state | query | query_start | state_change
------+-----------------------------------+--------+-------------------------------------------------------------+-------------------------------+------------------------------
67832 | tencentdb_ai scheduler | | | |
67834 | tencentdb_ai autoembedding worker | active | SELECT tencentdb_ai._autoembedding_process_backfill_batch() | 2026-08-05 22:40:37.409162+08 | 2026-08-05 22:40:37.41009+08
(2 rows)
结果说明:tencentdb_ai schedulertencentdb_ai autoembedding worker 两个后台进程均在运行。

错误表

SELECT * FROM tencentdb_ai.autoembedding_error
ORDER BY created_at DESC LIMIT 10;
数据库原始返回:
error_id | msg_id | task_kind | task_id | row_id | error_code | error_message | detail | created_at
----------+--------+-----------+---------+--------+------------+---------------+--------+------------
(0 rows)
结果说明:测试全程无错误记录,嵌入 API 调用全部成功。