tencentdb_ai RAG

最近更新时间:2026-07-10 09:49:00

我的收藏
云数据库 PostgreSQL 提供 tencentdb_ai RAG 功能,本文为您介绍关于 tencentdb_ai RAG 功能的说明及使用方法。

概述

tencentdb_ai 1.4版本新增了 RAG(Retrieval-Augmented Generation,检索增强生成)功能,该功能允许在数据库内直接实现“向量检索 → 构建提示词 → 大模型生成”的完整链路。
RAG 功能架构分为三个层次:
组件
说明
tencentdb_ai.retrieve_result
复合返回类型 (chunk TEXT, distance FLOAT8)
tencentdb_ai.retrieve()
向量嵌入 + pgvector 相似度检索 TopN
tencentdb_ai.rag()
一站式 RAG 问答:retrieve → 构建 Prompt → chat_completions 生成

核心价值

数据库内嵌 RAG:无需外部编排服务,一条 SQL 完成从向量检索到大模型生成的完整流程。
实时嵌入:每次查询实时调用 get_embedding(),embedding 始终与当前模型版本一致。
纯 SQL/PLpgSQL 实现:基于现有 C 层(call_model get_embedding chat_completions),无 C 层变更。
安全防护:内置 SQL 注入防护(quote_ident、USING 参数绑定、distance_type 白名单)。
SECURITY INVOKER:以调用者权限执行,无法越权访问无权限的表。

适用场景

企业知识库问答:将文档分块存储为向量,实现基于私有知识的智能问答。
客服系统:检索历史工单知识库辅助回答用户问题。
代码库检索:代码片段向量化后检索相似实现。
产品文档助手:产品手册分块向量化,用户自然语言查询。

前提条件

数据库版本为 PostgreSQL 18,内核版本 ≥ v18.10_r1.10。
tencentdb_ai 扩展 ≥ 1.4。
pgvector 扩展(CREATE EXTENSION vector)。
已配置嵌入模型(例如 hunyuan-embedding)和生成模型(例如 auto tokenhub 模型)。

功能函数详解

一、retrieve() — 向量相似度检索

函数签名

tencentdb_ai.retrieve(
embed_model NAME, -- 嵌入模型名称
question TEXT, -- 查询问题
source_schema TEXT, -- 知识库表所在 schema
source_table TEXT, -- 知识库表名
chunk_col TEXT, -- 文本块列名
vector_col TEXT, -- 向量列名
topn INT DEFAULT 10, -- 返回 TopN 结果
distance_type TEXT DEFAULT 'L2' -- 距离算法
) RETURNS SETOF tencentdb_ai.retrieve_result

参数说明

参数
类型
说明
embed_model
NAME
嵌入模型名称,如 'hunyuan-embedding'
question
TEXT
查询问题文本(不可为空)
source_schema
TEXT
知识库表所在 schema
source_table
TEXT
知识库表名
chunk_col
TEXT
文本内容列名
vector_col
TEXT
向量列名
topn
INT
返回的最相似结果数量,默认10
distance_type
TEXT
距离度量算法,支持 L2 cosine L1 inner product ip,默认 L2

返回类型

retrieve_result AS (chunk TEXT, distance FLOAT8)
chunk:检索到的文本块内容。
distance:与查询向量的距离值(越小表示越相似)。

支持的距离度量

distance_type
pgvector 操作符
说明
L2
<->
欧几里得距离(默认)
cosine
<=>
余弦距离
L1
<+>
曼哈顿距离
inner product
<#>
内积(负内积)
ip
<#>
内积别名
说明:
distance_type 不区分大小写,使用白名单校验,能有效防止 SQL 注入。

使用示例

-- 欧几里得距离检索,返回 Top 3
SELECT chunk, TRUNC(distance::numeric, 4) AS distance
FROM tencentdb_ai.retrieve(
'hunyuan-embedding',
'PostgreSQL 支持哪些数据类型?',
'public', 'knowledge_base', 'chunk', 'embedding',
3, 'L2'
)
ORDER BY distance, chunk;

-- 余弦距离检索,返回 Top 5
SELECT chunk, TRUNC(distance::numeric, 4) AS distance
FROM tencentdb_ai.retrieve(
'hunyuan-embedding',
'向量检索怎么用?',
'public', 'knowledge_base', 'chunk', 'embedding',
5, 'cosine'
)
ORDER BY distance, chunk;

-- 内积检索
SELECT chunk, TRUNC(distance::numeric, 4) AS distance
FROM tencentdb_ai.retrieve(
'hunyuan-embedding',
'什么是全文搜索?',
'public', 'knowledge_base', 'chunk', 'embedding',
10, 'inner product'
)
ORDER BY distance, chunk;

错误处理

错误场景
触发条件
错误信息
空问题
question 为 NULL 或空字符串
question must not be empty
非法 TopN
topn <= 0
topn must be positive
缺少 pgvector
pgvector 扩展未安装
RAG requires the pgvector extension
无效距离类型
distance_type 不在白名单中
invalid distance_type
空嵌入结果
嵌入模型返回空
empty embedding for model

二、rag() — 一站式 RAG 问答

函数签名

tencentdb_ai.rag(
embed_model NAME, -- 嵌入模型名称
prompt_model NAME, -- 生成模型名称
question TEXT, -- 用户问题
source_schema TEXT, -- 知识库表所在 schema
source_table TEXT, -- 知识库表名
chunk_col TEXT, -- 文本块列名
vector_col TEXT, -- 向量列名
topn INT DEFAULT 10, -- 召回 TopN
distance_type TEXT DEFAULT 'L2' -- 距离算法
) RETURNS TEXT

参数说明

参数
类型
说明
embed_model
NAME
嵌入模型名称,推荐 'hunyuan-embedding'
prompt_model
NAME
生成模型名称,推荐 'auto'(tokenhub)
question
TEXT
用户问题
source_schema
TEXT
知识库表所在 schema
source_table
TEXT
知识库表名
chunk_col
TEXT
文本内容列名
vector_col
TEXT
向量列名
topn
INT
召回的 TopN 文档块数,默认10
distance_type
TEXT
距离算法,默认 L2

返回值

返回 TEXT,即大模型生成的回答文本。

工作流程

用户问题 → retrieve() 召回 TopN 文档块
→ 拼接所有 chunk 构建上下文
→ 按模板构建 Prompt
chat_completions() 调用大模型生成
→ 返回生成结果

内部 Prompt 模板

你是严谨的问答助手。请仅依据下列参考资料回答问题;
若资料不足以回答,请明确说明"根据已有资料无法回答"

【参考资料】
{召回的所有文档块,以 --- 分隔}

【问题】
{用户问题}

空知识库处理

当知识库表为空时,召回结果为空,rag() 不会报错,它会在 Prompt 中以 (无召回内容) 占位,模型将根据自身知识回答或明确表示无法回答。

使用示例

以下为您演示一个端到端的完整示例,涵盖模型注册、知识库准备、向量检索和 RAG 问答:

步骤1:安装扩展与注册模型

-- 安装扩展
CREATE EXTENSION IF NOT EXISTS tencentdb_ai CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;

-- 注册嵌入模型(json_path 可设为 NULL,使用默认解析)
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');

-- 注册生成模型(json_path 指定响应解析路径)
SELECT tencentdb_ai.add_model('hunyuan-a13b', '2023-09-01', NULL,
'$.Response.Choices[*].Message.Content'::jsonpath);
SELECT tencentdb_ai.update_model_attr('hunyuan-a13b', 'SecretId', 'your_secret_id');
SELECT tencentdb_ai.update_model_attr('hunyuan-a13b', 'SecretKey', 'your_secret_key');
说明:
您需要通过混元 / 知识引擎原子能力,来获取实际的 SecretId、SecretKey。

步骤2:创建知识库并填充数据

-- 创建知识库表
CREATE TABLE kb_docs (
id bigserial PRIMARY KEY,
title text,
chunk text,
embedding vector(1024)
);

-- 插入文档块并实时向量化
INSERT INTO kb_docs (title, chunk, embedding)
SELECT
'PostgreSQL简介',
'PostgreSQL 是一个功能强大的开源对象关系数据库系统,拥有超过 30 年的积极开发历史,在可靠性、功能稳健性和性能方面赢得了良好的声誉。',
(SELECT e::vector(1024) FROM tencentdb_ai.get_embedding(
'hunyuan-embedding',
ARRAY['PostgreSQL 是一个功能强大的开源对象关系数据库系统,拥有超过 30 年的积极开发历史,在可靠性、功能稳健性和性能方面赢得了良好的声誉。']
) AS e LIMIT 1);

INSERT INTO kb_docs (title, chunk, embedding)
SELECT
'PostgreSQL特性',
'PostgreSQL 支持丰富的数据类型:数值类型(integer, numeric, real)、字符类型(text, varchar)、日期时间类型(timestamp, date)、JSON/JSONB、数组、范围类型等。',
(SELECT e::vector(1024) FROM tencentdb_ai.get_embedding(
'hunyuan-embedding',
ARRAY['PostgreSQL 支持丰富的数据类型:数值类型(integer, numeric, real)、字符类型(text, varchar)、日期时间类型(timestamp, date)、JSON/JSONB、数组、范围类型等。']
) AS e LIMIT 1);

INSERT INTO kb_docs (title, chunk, embedding)
SELECT
'pgvector介绍',
'pgvector 是 PostgreSQL 的向量扩展,支持精确和近似最近邻搜索,支持 L2 距离、内积和余弦距离等多种相似度度量。',
(SELECT e::vector(1024) FROM tencentdb_ai.get_embedding(
'hunyuan-embedding',
ARRAY['pgvector 是 PostgreSQL 的向量扩展,支持精确和近似最近邻搜索,支持 L2 距离、内积和余弦距离等多种相似度度量。']
) AS e LIMIT 1);

-- 创建向量索引(可选,提升检索性能)
CREATE INDEX ON kb_docs USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);

步骤3:向量检索

SELECT chunk, TRUNC(distance::numeric, 6) AS distance
FROM tencentdb_ai.retrieve(
'hunyuan-embedding',
'PostgreSQL 支持什么数据类型?',
'public', 'kb_docs', 'chunk', 'embedding', 3, 'cosine'
)
ORDER BY distance, chunk;

步骤4:RAG 问答

-- 一站式 RAG 问答
SELECT tencentdb_ai.rag(
'hunyuan-embedding',
'auto',
'请介绍一下 pgvector 的主要功能',
'public', 'kb_docs', 'chunk', 'embedding', 2, 'cosine'
) AS answer;

-- 空知识库问答(知识库无匹配内容时,模型会说明无法回答)
SELECT tencentdb_ai.rag(
'hunyuan-embedding', 'auto', '什么是数据库?',
'public', 'kb_empty', 'chunk', 'embedding', 5, 'cosine'
) AS answer;