一、概述
tencentdb_ai 提供 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 生成 |
二、适用场景
·企业知识库问答:将文档分块存储为向量,实现基于私有知识的智能问答。
·客服系统:检索历史工单知识库辅助回答用户问题。
·代码库检索:代码片段向量化后检索相似实现。
·产品文档助手:产品手册分块向量化,用户自然语言查询。
三、前提条件
·数据库版本为 PostgreSQL 14 – 18,tencentdb_ai 扩展 ≥ 1.4(以实例中实际 extversion 为准)。
·pgvector 扩展(创建 tencentdb_ai 插件时会自动关联安装)。
·已配置嵌入模型(例如 kinfra-text-embedding-0.6b)和生成模型(例如 hy3、glm-5.2),配置方法请参见 tencentdb_ai 插件功能介绍。
六、函数签名
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 | 嵌入模型名称,如 'kinfra-text-embedding-0.6b' |
| 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 不区分大小写(如 L2 与 l2 等效)。
十、使用示例
— 欧几里得距离检索,返回 Top 3SELECT chunk, TRUNC(distance::numeric, 4) AS distanceFROM tencentdb_ai.retrieve( 'kinfra-text-embedding-0.6b', 'PostgreSQL 支持哪些数据类型?', 'public', 'knowledge_base', 'chunk', 'embedding', 3, 'L2')ORDER BY distance, chunk;– 余弦距离检索,返回 Top 5SELECT chunk, TRUNC(distance::numeric, 4) AS distanceFROM tencentdb_ai.retrieve( 'kinfra-text-embedding-0.6b', '向量检索怎么用?', 'public', 'knowledge_base', 'chunk', 'embedding', 5, 'cosine')ORDER BY distance, chunk;– 内积检索SELECT chunk, TRUNC(distance::numeric, 4) AS distanceFROM tencentdb_ai.retrieve( 'kinfra-text-embedding-0.6b', '什么是全文搜索?', 'public', 'knowledge_base', 'chunk', 'embedding', 10, 'inner product')ORDER BY distance, chunk;
十一、错误处理
| 错误场景 | 触发条件 | 错误信息 |
| 空问题 | question 为 NULL 或空字符串 | question must not be empty |
| 非法 TopN | topn 为 NULL 或 <= 0 | topn must be positive |
| 缺少 pgvector | pgvector 扩展未安装 | tencentdb_ai RAG requires the pgvector extension |
| 无效距离类型 | distance_type 不在白名单中 | invalid distance_type |
| 空嵌入结果 | 嵌入模型返回空 | empty embedding for model |
| 向量维度不匹配 | 查询向量维度与知识库向量列维度不一致(如模型为1024维而列为其他维度) | different vector dimensions N and M(由 pgvector 抛出) |
十三、函数签名
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 | 嵌入模型名称,如 'kinfra-text-embedding-0.6b' |
| prompt_model | NAME | 生成模型名称,如 'hy3'、'glm-5.2' |
| 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 中以 (无召回内容) 占位。内置 Prompt 会指示模型仅依据参考资料回答,并在资料不足时明确说明“根据已有资料无法回答”。
十九、使用示例
以下为你演示一个端到端的完整示例,涵盖模型注册、知识库准备、向量检索和 RAG 问答:
20、步骤1:安装扩展与注册模型
— 安装扩展(自动关联安装 pgcrypto、vector、pgmq)CREATE EXTENSION IF NOT EXISTS tencentdb_ai CASCADE;– 注册嵌入模型(json_path 必须为 NULL,由 get_embedding 自行解析响应)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');– 注册生成模型(json_path 指定响应解析路径)SELECT tencentdb_ai.add_model('glm-5.2', NULL, NULL, '$.choices[0].message.content'::jsonpath, 'tokenhub');SELECT tencentdb_ai.update_model_attr('glm-5.2', 'api_key', 'your_api_key');
注意:说明:
注意:api_key 请在 TokenHub 控制台 获取。
21、步骤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( 'kinfra-text-embedding-0.6b', 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( 'kinfra-text-embedding-0.6b', 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( 'kinfra-text-embedding-0.6b', ARRAY['pgvector 是 PostgreSQL 的向量扩展,支持精确和近似最近邻搜索,支持 L2 距离、内积和余弦距离等多种相似度度量。'] ) AS e LIMIT 1);– 创建向量索引(可选,提升检索性能)CREATE INDEX ON kb_docs USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);
注意:说明:
注意:数据量较少时创建 ivfflat 索引会提示 ivfflat index created with little data(召回率较低),属正常现象,数据量增长后建议重建索引。
22、步骤3:向量检索
SELECT chunk, TRUNC(distance::numeric, 6) AS distanceFROM tencentdb_ai.retrieve( 'kinfra-text-embedding-0.6b', 'PostgreSQL 支持什么数据类型?', 'public', 'kb_docs', 'chunk', 'embedding', 3, 'cosine')ORDER BY distance, chunk;
返回结果如下(距离越小越相似):
chunk | distance—————————————————————————————————————————————————————+———- PostgreSQL 支持丰富的数据类型:数值类型(integer, numeric, real)、字符类型(text, varchar)、日期时间类型(timestamp, date)、JSON/JSONB、数组、范围类型等。 | 0.069388 PostgreSQL 是一个功能强大的开源对象关系数据库系统,拥有超过 30 年的积极开发历史,在可靠性、功能稳健性和性能方面赢得了良好的声誉。 | 0.311017 pgvector 是 PostgreSQL 的向量扩展,支持精确和近似最近邻搜索,支持 L2 距离、内积和余弦距离等多种相似度度量。 | 0.400196(3 rows)
23、步骤4:RAG 问答
— 一站式 RAG 问答SELECT tencentdb_ai.rag( 'kinfra-text-embedding-0.6b', 'glm-5.2', '请介绍一下 pgvector 的主要功能', 'public', 'kb_docs', 'chunk', 'embedding', 2, 'cosine') AS answer;
返回结果如下(模型基于召回的知识库内容作答):
answer—————————————————————————————————————————————————————— "根据参考资料,pgvector 的主要功能如下:\\n1. 作为 PostgreSQL 的向量扩展。\\n2. 支持精确和近似最近邻搜索。\\n3. 支持多种相似度度量,包括 L2 距离、内积和余弦距离。"(1 row)
空知识库问答(知识库无匹配内容时,模型会明确说明无法回答):
— kb_empty 为与 kb_docs 结构相同的空表SELECT tencentdb_ai.rag( 'kinfra-text-embedding-0.6b', 'glm-5.2', '什么是数据库?', 'public', 'kb_empty', 'chunk', 'embedding', 5, 'cosine') AS answer;
answer————————– "根据已有资料无法回答。"(1 row)