说明:
环境:本文所使用数据库版本为 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, commentFROM pg_available_extensionsWHERE 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, contextFROM pg_settingsWHERE name LIKE 'tencentdb_ai.autoembedding%'ORDER BY name;
数据库原始返回:
name | setting | context--------------------------------------------------+----------+---------tencentdb_ai.autoembedding_batch_size | 32 | sighuptencentdb_ai.autoembedding_database | postgres | sighuptencentdb_ai.autoembedding_max_input_bytes | 65536 | sighuptencentdb_ai.autoembedding_max_retry | 5 | sighuptencentdb_ai.autoembedding_naptime_ms | 5000 | sighuptencentdb_ai.autoembedding_retry_base_ms | 1000 | sighuptencentdb_ai.autoembedding_task_launch_jitter_ms | 10 | sighuptencentdb_ai.autoembedding_worker | on | sighup(8 rows)
结果说明:
autoembedding_database = postgres,autoembedding_worker = on,全部默认值合理。安装扩展
-- 会自动安装 pgcrypto、vector、pgmqCREATE 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+08tencentdb_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.columnsWHERE 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 | namejson_path | jsonpathsecretid | byteasecretkey | byteaversion | textregion | textid_random | integerkey_random | integerbackend_type | textreal_model_name | nameapi_key | byteaapi_key_random | integerembedding_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_listSET embedding_dim = 1024WHERE model_name = 'hunyuan-embedding';-- 验证模型配置SELECT model_name, backend_type, embedding_dimFROM tencentdb_ai.model_listWHERE model_name = 'hunyuan-embedding';
数据库原始返回:
add_model-----------(1 row)update_model_attr-------------------(1 row)update_model_attr-------------------(1 row)UPDATE 1model_name | backend_type | embedding_dim-------------------+--------------+---------------hunyuan-embedding | hunyuan | 1024(1 row)
结果说明:混元 embedding 模型注册成功,
backend_type = hunyuan,embedding_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, skippingDROP TABLECREATE TABLEINSERT 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 ROWEXECUTE FUNCTION tencentdb_ai._autoembedding_enqueue_trigger(...)tencentdb_ai_autoemb_upd_1 BEFORE UPDATE OF content ON kb_articles FOR EACH ROWEXECUTE FUNCTION tencentdb_ai._autoembedding_enqueue_trigger(...)
结果说明:
add_incr_autoembedding_task 自动创建了 content_embedding vector(1024) 列和两个触发器。查看触发器详情
SELECT trigger_name, event_manipulation, action_statementFROM information_schema.triggersWHERE 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_countFROM tencentdb_ai.autoembedding_statusORDER 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 | 0backfill | 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 | 1backfill | 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 NULLTHEN vector_dims(content_embedding) ELSE NULL END AS dimsFROM kb_articlesORDER 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
-- 立即查 pendingSELECT task_kind, pending FROM tencentdb_ai.autoembedding_status;
数据库原始返回:
task_kind | pending-----------+---------incr | 1backfill | 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_embeddingFROM 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 | 0backfill | 0 | 0(2 rows)id | title | has_embedding----+-----------------+---------------1 | PostgreSQL 简介 | f2 | 向量数据库 | f3 | RAG 技术 | f4 | 嵌入模型 | t5 | 混元大模型 | 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 = 0、failed_count = 0、无错误记录。id=1~3 仍为 null(因缺少存量回填)。向量维度验证
SELECT id, title,vector_dims(content_embedding) AS dims,length(content_embedding::text) AS text_lenFROM kb_articlesWHERE content_embedding IS NOT NULL;
数据库原始返回:
id | title | dims | text_len----+------------+------+----------4 | 嵌入模型 | 1024 | 127275 | 混元大模型 | 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 | 3backfill | 0(2 rows)
pending = 3,三行均已入队。SELECT pg_sleep(5);-- 全量验证SELECT id, title, content_embedding IS NOT NULL AS has_embeddingFROM kb_articles ORDER BY id;
数据库原始返回:
pg_sleep----------(1 row)id | title | has_embedding----+-----------------+---------------1 | PostgreSQL 简介 | t2 | 向量数据库 | t3 | RAG 技术 | t4 | 嵌入模型 | t5 | 混元大模型 | 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 distanceFROM kb_articlesWHERE content_embedding IS NOT NULLORDER BY distance;
数据库原始返回:
id | title | distance----+------------+---------------------4 | 嵌入模型 | 05 | 混元大模型 | 0.28689392595353047(2 rows)
结果说明:「嵌入模型」到自身的余弦距离为 0,到「混元大模型」的距离约 0.287,两者语义相近(都关于 AI 模型),符合预期。
全量相似度检索
SELECT id, title,content_embedding <=> (SELECT content_embedding FROM kb_articles WHERE id = 1) AS distanceFROM kb_articlesWHERE content_embedding IS NOT NULLORDER BY distance;
数据库原始返回:
id | title | distance----+-----------------+---------------------1 | PostgreSQL 简介 | 02 | 向量数据库 | 0.27894660689305753 | RAG 技术 | 0.35634816927513164 | 嵌入模型 | 0.38403617384205585 | 混元大模型 | 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.columnsWHERE table_schema = 'tencentdb_ai' AND table_name = 'model_list'ORDER BY ordinal_position;
数据库原始返回:
column_name | data_type-----------------+-----------model_name | namejson_path | jsonpathsecretid | byteasecretkey | byteaversion | textregion | textid_random | integerkey_random | integerbackend_type | textreal_model_name | nameapi_key | byteaapi_key_random | integerembedding_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 | | -1hunyuan-embedding | hunyuan | | 1024tokenhub-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 TABLECREATE TABLEINSERT 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 ROWEXECUTE FUNCTION tencentdb_ai._autoembedding_enqueue_trigger('4', '17167', ...)tencentdb_ai_autoemb_upd_4 BEFORE UPDATE OF content ON kb_articles_tokenhub FOR EACH ROWEXECUTE FUNCTION tencentdb_ai._autoembedding_enqueue_trigger('4', '17167', ...)
结果说明:表结构和触发器与方式一完全一致,
content_embedding vector(1024) 列 + INSERT/UDPATE 触发器均自动创建。查看任务状态
SELECT task_kind, task_id, table_name, model_name, statusFROM tencentdb_ai.autoembedding_statusORDER BY task_id;
数据库原始返回:
task_kind | task_id | table_name | model_name | status-----------+---------+----------------------+---------------------+---------incr | 1 | kb_articles | hunyuan-embedding | enabledbackfill | 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
-- 查看 pendingSELECT task_kind, task_id, table_name, model_name, pendingFROM tencentdb_ai.autoembedding_status ORDER BY task_id;
数据库原始返回:
task_kind | task_id | table_name | model_name | pending-----------+---------+----------------------+-------------------+---------incr | 1 | kb_articles | hunyuan-embedding | 0backfill | 1 | kb_articles | hunyuan-embedding | 0incr | 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_countFROM 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 dimsFROM 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 | 0backfill | 1 | 0 | 0incr | 5 | 0 | 0(3 rows)id | title | has_embedding | dims----+-----------------+---------------+------1 | PostgreSQL 简介 | f | NULL2 | 向量数据库 | f | NULL3 | RAG 技术 | f | NULL4 | 混元大模型 | 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 = 0,failed_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 dimsFROM kb_articles_tokenhub ORDER BY id;
数据库原始返回:
pg_sleep----------(1 row)id | title | has_embedding | dims----+-----------------+---------------+------1 | PostgreSQL 简介 | t | 10242 | 向量数据库 | t | 10243 | RAG 技术 | t | 10244 | 混元大模型 | t | 1024(4 rows)
结果说明:全部 4 行向量生成完毕,均为 1024 维。
向量相似度检索
SELECT id, title,content_embedding <=> (SELECT content_embedding FROM kb_articles_tokenhub WHERE id = 1) AS distanceFROM kb_articles_tokenhubWHERE content_embedding IS NOT NULLORDER BY distance;
数据库原始返回:
id | title | distance----+-----------------+--------------------1 | PostgreSQL 简介 | 02 | 向量数据库 | 0.53279602136659033 | RAG 技术 | 0.68195173007681054 | 混元大模型 | 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_changeFROM pg_stat_activityWHERE 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 scheduler 和 tencentdb_ai autoembedding worker 两个后台进程均在运行。错误表
SELECT * FROM tencentdb_ai.autoembedding_errorORDER 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 调用全部成功。