基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
体验 AI 场景
更新时间:2026-10-27 15:56:46
OceanBase 数据库从 V4.3.3 版本开始支持向量数据类型,并在后续版本中持续增强 AI 能力,逐步构建了集向量存储、向量索引、全文索引、AI 函数服务和混合搜索于一体的 AI 数据库能力。通过在数据库内直接调用嵌入模型(Embedding Model)和大语言模型(LLM),开发者无需在数据库与外部 AI 服务之间来回搬运数据,仅需 SQL 即可完成从数据向量化、语义搜索到答案生成的完整流程。
本文将引导您完成以下体验:
- 创建向量表和全文索引:创建同一张表同时包含
VECTOR类型字段和FULLTEXT索引,为混合搜索奠定基础。 - 插入文档数据并生成向量:使用
AI_EMBED()函数在数据库内直接将文本转换为向量并插入,体验 OceanBase 作为"AI 数据库"的集成度。 - 执行混合搜索查询:使用向量搜索与全文搜索相结合的混合检索,体验 OceanBase 的融合检索能力。
- 体验 RAG 搜索:在数据库内完成"检索 Top-K 片段 → 重排序 → 调用 LLM 生成答案"的完整 RAG 流程。
说明
本文基于 OceanBase 数据库 V5.0.1(社区版)撰写,文中相关命令和功能说明均以 V5.0.1 版本为准。本文以 部署 OceanBase 中使用 All in One 安装包部署的单节点环境为例,需已按 体验高并发 OLTP 场景 创建测试租户 oltp_tenant。AI 函数服务自 V4.4.1 版本开始提供,同表创建向量索引和全文索引需要 V4.4.0 及以上版本,本文使用的 V5.0.1 均已支持。
前提条件
在开始本文操作前,确保满足以下条件:
| 项目 | 描述 |
|---|---|
| OceanBase 数据库 | 已完成部署并成功启动,参见 部署 OceanBase。建议使用 V4.4.1 及以上版本(本文基于 V5.0.1)。 |
| 测试租户 | 已创建 MySQL 模式业务租户(如 oltp_tenant),参见 体验高并发 OLTP 场景。 |
| 向量内存配置 | V4.4.1 及以上版本(含 V5.0.1)向量搜索功能默认启用,无需手动设置 ob_vector_memory_limit_percentage;V4.4.1 之前版本建议设置为 30。 |
| AI 模型 | 已获取 AI 模型服务的 API Key(本文以阿里云百炼为例)。嵌入、文本生成和重排序模型的注册方法见下文"注册 AI 模型"。 |
| obclient | 已安装 obclient 并可正常连接业务租户。 |
| 网络 | 确保 OceanBase 数据库默认端口 2881 未被防火墙拦截,且数据库节点可访问 AI 模型服务端点。 |
配置向量内存
从 V4.4.1 版本开始,向量搜索功能默认启用:ob_vector_memory_limit_percentage 保持默认值 0 即为自适应模式,由系统自动调整向量索引的内存占用比例(租户实际内存 8 GB 及以下自适应为 40,8 GB 以上自适应为 50),无需手动设置。V4.4.1 之前的版本使用 HNSW 系列索引前需手动设置该参数,否则创建 HNSW 索引会报错。如需显式指定内存比例,可在 sys 租户中执行以下命令:
-- 使用 root 用户登录 sys 租户
obclient -h127.0.0.1 -uroot@sys -P2881 -p -A oceanbase
-- 手动设置向量内存百分比为 30
obclient [oceanbase]> ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30;
注意
IVF 系列索引不占用常驻内存,无需关注此参数。详细信息请参见 ob_vector_memory_limit_percentage。
注册 AI 模型
OceanBase 数据库通过 DBMS_AI_SERVICE 系统包管理 AI 模型和访问端点。在使用 AI_EMBED、AI_COMPLETE、AI_RERANK 等 AI 函数前,需要先注册对应的模型和访问端点。
以下示例以阿里云百炼为例,注册嵌入模型、文本生成模型和重排序模型三组模型与端点。请将 access_key 替换为您的实际 API Key:
-- 登录业务租户
obclient -h127.0.0.1 -uroot@oltp_tenant -P2881 -p -A test
-- 注册嵌入模型(用于 AI_EMBED 函数)
obclient [test]> CALL DBMS_AI_SERVICE.CREATE_AI_MODEL(
'ob_embed', '{
"type": "dense_embedding",
"model_name": "BAAI/bge-m3"
}');
obclient [test]> CALL DBMS_AI_SERVICE.CREATE_AI_MODEL_ENDPOINT(
'ob_embed_endpoint', '{
"ai_model_name": "ob_embed",
"url": "https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings",
"access_key": "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxx",
"provider": "aliyun-openAI"
}');
-- 注册文本生成模型(用于 AI_COMPLETE 函数)
obclient [test]> CALL DBMS_AI_SERVICE.CREATE_AI_MODEL(
'ob_complete', '{
"type": "completion",
"model_name": "THUDM/GLM-4-9B-0414"
}');
obclient [test]> CALL DBMS_AI_SERVICE.CREATE_AI_MODEL_ENDPOINT(
'ob_complete_endpoint', '{
"ai_model_name": "ob_complete",
"url": "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",
"access_key": "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxx",
"provider": "aliyun-openAI"
}');
-- 注册重排序模型(用于 AI_RERANK 函数)
obclient [test]> CALL DBMS_AI_SERVICE.CREATE_AI_MODEL(
'ob_rerank', '{
"type": "rerank",
"model_name": "BAAI/bge-reranker-v2-m3"
}');
obclient [test]> CALL DBMS_AI_SERVICE.CREATE_AI_MODEL_ENDPOINT(
'ob_rerank_endpoint', '{
"ai_model_name": "ob_rerank",
"url": "https://dashscope.aliyuncs.com/api/v1/services/rerank/text-rerank/text-rerank",
"access_key": "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxx",
"provider": "aliyun-dashscope"
}');
说明
type表示模型类型:嵌入模型为dense_embedding,文本生成模型为completion,重排序模型为rerank。注意嵌入模型的类型是dense_embedding,若误写为embeddings,会报ERROR 11116 (HY000): The value of param 'type' is invalid。- 嵌入模型的输出维度需与后文创建的向量列维度一致:本文使用的 BAAI/bge-m3 输出 1024 维向量,对应
VECTOR(1024)。若二者不一致,写入向量数据时会报错。 - 重排序模型的端点 URL 和
provider与另外两类模型不同(分别为api/v1/services/rerank/...和aliyun-dashscope),请按示例填写。 - 以上示例使用阿里云百炼的模型服务作为 AI 模型端点。您也可以注册其他模型服务,详细信息请参见 AI 模型注册。完整的快速上手流程请参见 AI 函数服务快速上手。
执行以下查询,验证模型和端点注册成功:
obclient [test]> SELECT NAME, TYPE FROM oceanbase.DBA_OB_AI_MODELS;
obclient [test]> SELECT ENDPOINT_NAME, AI_MODEL_NAME, PROVIDER FROM oceanbase.DBA_OB_AI_MODEL_ENDPOINTS;
返回结果如下,能看到已注册的 3 个模型和 3 个端点即表示注册成功:
+-------------+-----------------+
| NAME | TYPE |
+-------------+-----------------+
| ob_embed | DENSE_EMBEDDING |
| ob_complete | COMPLETION |
| ob_rerank | RERANK |
+-------------+-----------------+
3 rows in set
+----------------------+---------------+------------------+
| ENDPOINT_NAME | AI_MODEL_NAME | PROVIDER |
+----------------------+---------------+------------------+
| ob_embed_endpoint | ob_embed | aliyun-openAI |
| ob_complete_endpoint | ob_complete | aliyun-openAI |
| ob_rerank_endpoint | ob_rerank | aliyun-dashscope |
+----------------------+---------------+------------------+
3 rows in set
创建向量表和全文索引
OceanBase 数据库支持在同一张表上同时创建向量索引和全文索引,这是实现混合搜索(Hybrid Search)的基础。向量索引支持语义相似性搜索,全文索引支持关键词精确匹配,两者结合可以提供更准确、更全面的搜索结果。
存储格式说明
| 索引类型 | 关键字 | 适用场景 |
|---|---|---|
| 向量索引 | VECTOR INDEX |
语义搜索,通过计算向量距离查找语义相似的内容 |
| 全文索引 | FULLTEXT INDEX |
关键词搜索,通过分词和倒排索引实现精确匹配 |
| 同表共存 | 两者同时创建 | 混合搜索,结合语义搜索与关键词搜索的综合排序 |
操作步骤
登录业务租户:
obclient -h127.0.0.1 -uroot@oltp_tenant -P2881 -p -A test创建知识库表,同时包含向量列和全文索引列。以文档知识库为例:
obclient [test]> CREATE TABLE knowledge_base ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) DEFAULT NULL COMMENT '文档标题', content TEXT DEFAULT NULL COMMENT '文档内容', embedding VECTOR(1024) DEFAULT NULL COMMENT '内容向量', FULLTEXT INDEX ft_title (title) WITH PARSER ngram, FULLTEXT INDEX ft_content (content) WITH PARSER ngram, VECTOR INDEX vec_idx (embedding) WITH (distance=cosine, type=hnsw, lib=vsag) ) ORGANIZATION HEAP;说明
VECTOR(1024)声明 1024 维向量列,维度需与嵌入模型输出维度一致。OceanBase 支持最大 16000 维向量。FULLTEXT INDEX在title和content列上分别创建单列全文索引,并使用WITH PARSER ngram指定 ngram 分词器。ngram 分词器按固定长度(默认 2 个字符)切分文本,适合中文内容搜索;默认的 space 分词器以空格切分单词,无法切分连续的中文句子(整句会被当作一个词),会导致中文全文搜索查不到结果。- 混合搜索要求全文列使用单列全文索引,联合全文索引(如
(title, content)联合索引)对混合搜索无效,因此这里为两列分别创建单列全文索引。 VECTOR INDEX ... WITH (distance=cosine, type=hnsw, lib=vsag)创建 HNSW 向量索引,使用余弦距离算法。ORGANIZATION HEAP指定堆表组织方式,混合搜索功能建议在堆表上使用。- HNSW 索引名长度暂不支持超过 25 个字符。
验证表和索引创建成功:
obclient [test]> SHOW CREATE TABLE knowledge_base\G返回结果中应能看到
VECTOR KEY和FULLTEXT KEY两种索引类型,表示向量索引和全文索引已成功创建在同一张表上。
插入文档数据并生成向量
OceanBase 数据库提供 AI_EMBED() 函数,可在 SQL 语句中直接调用已注册的嵌入模型,将文本数据转换为向量数据。这避免了在外部使用 Python 等语言生成向量再导入数据库的繁琐流程,体现了 OceanBase 作为"AI 数据库"的集成度。
关于 AI_EMBED 函数
AI_EMBED(model_key, input[, dim_or_parameters]) 函数通过 model_key 指定一个已注册的嵌入模型,将用户提供的文本数据转换为向量数据。
| 参数 | 说明 |
|---|---|
model_key |
数据库内注册的模型名称,如 ob_embed。 |
input |
需要转换为向量的文本数据,可以是字符串常量或表中的列。 |
dim_or_parameters |
可选第三参数。文本嵌入时可指定输出向量的维度(部分模型支持多维度输出);V5.0.1 起还支持传入 JSON 参数 {"type":"image"} 指定图片输入,进行图片嵌入。 |
操作步骤
插入文档数据,同时使用
AI_EMBED()函数生成向量:obclient [test]> INSERT INTO knowledge_base (title, content, embedding) VALUES ('OceanBase 简介', 'OceanBase 是一个强大的原生分布式数据库系统,支持向量搜索和 AI 函数服务。', AI_EMBED('ob_embed', 'OceanBase 是一个强大的原生分布式数据库系统,支持向量搜索和 AI 函数服务。')), ('向量搜索原理', '向量搜索通过计算向量之间的距离来查找语义相似的内容,常用于语义搜索和推荐系统。', AI_EMBED('ob_embed', '向量搜索通过计算向量之间的距离来查找语义相似的内容,常用于语义搜索和推荐系统。')), ('全文索引介绍', 'OceanBase 全文索引支持对文本数据进行关键词搜索,通过分词和倒排索引实现高效检索。', AI_EMBED('ob_embed', 'OceanBase 全文索引支持对文本数据进行关键词搜索,通过分词和倒排索引实现高效检索。')), ('AI 函数服务', 'AI_EMBED 函数可以在 SQL 中直接调用嵌入模型生成向量,AI_COMPLETE 函数可以调用大语言模型生成文本。', AI_EMBED('ob_embed', 'AI_EMBED 函数可以在 SQL 中直接调用嵌入模型生成向量,AI_COMPLETE 函数可以调用大语言模型生成文本。')), ('RAG 应用', 'RAG(检索增强生成)通过先检索相关文档再生成答案的方式,提升大模型回答的准确性和可靠性。', AI_EMBED('ob_embed', 'RAG(检索增强生成)通过先检索相关文档再生成答案的方式,提升大模型回答的准确性和可靠性。'));命令执行成功后,obclient 将返回插入结果:
Query OK, 5 rows affected Records: 5 Duplicates: 0 Warnings: 0说明
在
INSERT语句中直接调用AI_EMBED()函数,数据库会自动将文本发送给已注册的嵌入模型,获取向量后写入embedding列。整个过程在 SQL 层完成,无需外部代码。如果执行报错
ERROR 4216 (HY000): http request to AI service failed,表示数据库调用 AI 模型服务失败,请检查:API Key 是否有效、数据库节点是否能访问模型服务端点(见前提条件的网络要求)、模型和端点注册参数是否正确。也可以使用
UPDATE语句为已有数据批量生成向量:obclient [test]> UPDATE knowledge_base SET embedding = AI_EMBED('ob_embed', content) WHERE embedding IS NULL;验证向量是否生成成功:
obclient [test]> SELECT id, title, vector_dims(embedding) AS dim_count FROM knowledge_base;返回结果如下,
dim_count应显示与模型输出维度一致的值(如 1024):+----+------------------+-----------+ | id | title | dim_count | +----+------------------+-----------+ | 1 | OceanBase 简介 | 1024 | | 2 | 向量搜索原理 | 1024 | | 3 | 全文索引介绍 | 1024 | | 4 | AI 函数服务 | 1024 | | 5 | RAG 应用 | 1024 | +----+------------------+-----------+ 5 rows in set说明
vector_dims()函数用于返回向量的维度数。如果返回值为NULL,表示该行向量未生成,请检查 AI 模型端点是否注册成功及网络是否连通。
执行混合搜索查询
混合搜索(Hybrid Search)结合了基于向量的语义搜索和基于全文索引的关键词搜索。向量搜索擅长语义近似匹配,但对精确的关键字、数字和专有名词等匹配能力较弱,而全文搜索能有效弥补这一不足。OceanBase 从 V4.5.0 版本开始提供 DBMS_HYBRID_SEARCH 系统包(PL 接口),当前版本还提供 HYBRID_SEARCH 表函数(SQL 接口),两者均支持在一条 SQL 中融合向量搜索与全文搜索,并通过 RRF(Reciprocal Rank Fusion)等融合算法自动实现合并排序。本文使用 PL 接口进行体验。
混合搜索原理
| 搜索方式 | 擅长场景 | 局限 |
|---|---|---|
| 向量搜索 | 语义近似匹配,理解同义词和相关概念 | 对精确关键词、数字、专有名词匹配较弱 |
| 全文搜索 | 精确关键词匹配,支持布尔运算和短语匹配 | 无法理解语义相似性 |
| 混合搜索 | 综合语义搜索与关键词搜索,通过 RRF 排序融合 | — |
操作步骤
1. 纯向量搜索
使用 ORDER BY + 距离函数 + APPROXIMATE 关键字进行向量近似最近邻搜索:
obclient [test]> SET @query_vector = AI_EMBED('ob_embed', '数据库的搜索功能');
obclient [test]> SELECT id, title, cosine_distance(embedding, @query_vector) AS distance
FROM knowledge_base
WHERE embedding IS NOT NULL
ORDER BY cosine_distance(embedding, @query_vector) APPROXIMATE LIMIT 3;
返回结果按距离从近到远排序,距离越近表示语义越相似(以下为示意输出,实际数值取决于所用的模型和数据):
+----+------------------+----------------------+
| id | title | distance |
+----+------------------+----------------------+
| 2 | 向量搜索原理 | 0.012345678901234567 |
| 3 | 全文索引介绍 | 0.056789012345678901 |
| 1 | OceanBase 简介 | 0.089012345678901234 |
+----+------------------+----------------------+
3 rows in set
说明
APPROXIMATE(或APPROX)关键字表示使用向量索引进行近似搜索,不加此关键字则走全表扫描。cosine_distance()计算余弦距离,也可使用l2_distance()(欧氏距离)或vector_distance(v1, v2, metric)(统一距离函数)。距离值越小表示越相似。AI_EMBED()返回 vector 格式的字符串,可直接用于距离函数计算,也可以拼入后文混合搜索的 JSON 参数。- 向量搜索是一种近似最近邻搜索,不保证 100% 正确,搜索准确率通过召回率衡量。可通过 session 变量
ob_hnsw_ef_search调整 HNSW 索引的搜索候选集大小,值越大召回率越高但搜索越慢。
2. 纯全文搜索
使用 MATCH() AGAINST() 语法进行全文搜索:
obclient [test]> SELECT id, title, MATCH(content) AGAINST('向量 搜索' IN NATURAL LANGUAGE MODE) AS score
FROM knowledge_base
WHERE MATCH(content) AGAINST('向量 搜索' IN NATURAL LANGUAGE MODE);
返回结果按相关性评分排序(以下为本文环境的实测输出,具体数值因数据分布而异):
+----+------------------+---------------------+
| id | title | score |
+----+------------------+---------------------+
| 2 | 向量搜索原理 | 0.7060192883272365 |
| 1 | OceanBase 简介 | 0.5315473209814723 |
| 3 | 全文索引介绍 | 0.24894465290806755 |
| 4 | AI 函数服务 | 0.22518031395842178 |
+----+------------------+---------------------+
4 rows in set
说明
MATCH(column) AGAINST(expr)是全文搜索语法。IN NATURAL LANGUAGE MODE为默认模式,支持自然语言模糊匹配;IN BOOLEAN MODE支持布尔运算符(+表示 AND,-表示 NOT);IN MATCH PHRASE MODE支持短语精确匹配。MATCH中的列列表必须与某个全文索引的列完全一致。本文在title和content列上分别创建了单列全文索引,因此使用MATCH(content)搜索正文;如需搜索标题,可使用MATCH(title)。- 查询词会按建表时指定的 ngram 分词器切分后与索引匹配。如果使用默认的 space 分词器且内容为连续中文,查询可能返回空结果。
score为全文搜索的相关性评分,值越高表示匹配度越高。- 全文搜索擅长精确关键词匹配,对同义词或语义相关但字面不同的内容匹配能力较弱。
3. 向量与全文混合搜索
使用 DBMS_HYBRID_SEARCH.SEARCH 函数,在一条 SQL 中同时发起向量搜索和全文搜索,并通过 RRF 算法融合排序。
先生成查询向量:
obclient [test]> SET @query_vector = AI_EMBED('ob_embed', '数据库的搜索功能');
由于 JSON 参数中无法直接调用 AI_EMBED() 函数,需通过 CONCAT() 将查询向量拼入 JSON 查询参数:
obclient [test]> SET @hybrid_query = CONCAT('{
"query": {
"bool": {
"should": [
{"match": {"title": "数据库搜索"}},
{"match": {"content": "向量 检索"}}
]
}
},
"knn": {
"field": "embedding",
"k": 5,
"query_vector": ', @query_vector, '
},
"rank": {
"rrf": {
"rank_window_size": 10,
"rank_constant": 60
}
},
"_source": ["id", "title", "content"]
}');
obclient [test]> SELECT json_pretty(DBMS_HYBRID_SEARCH.SEARCH('knowledge_base', @hybrid_query));
返回结果按 RRF 融合后的相关性排序(以下为示意输出,实际数值取决于所用的模型和数据):
[
{
"id": 2,
"_score": 0.0325,
"title": "向量搜索原理",
"content": "向量搜索通过计算向量之间的距离来查找语义相似的内容,常用于语义搜索和推荐系统。"
},
{
"id": 3,
"_score": 0.0323,
"title": "全文索引介绍",
"content": "OceanBase 全文索引支持对文本数据进行关键词搜索,通过分词和倒排索引实现高效检索。"
}
]
说明
query部分指定全文搜索条件,knn部分指定向量搜索条件,两者结果通过rank.rrf融合排序。- 混合搜索的全文部分要求目标列使用单列全文索引,联合全文索引对混合搜索无效(这也是前文建表时使用两个单列全文索引的原因)。
- RRF(Reciprocal Rank Fusion)算法通过融合多个子查询结果集的排名计算最终分数:
score = Σ 1/(k + rank(result, doc)),其中k为rank_constant参数值。 _source指定返回列范围。强烈建议指定此字段,如果不指定会默认返回所有列(含向量列),导致响应时间大幅增加。knn.query_vector的维度必须与向量列定义一致(本文为 1024 维),维度不一致会报ERROR 5874。示例中先通过SET @query_vector = AI_EMBED(...)将查询向量保存到变量(AI_EMBED()返回 vector 格式的字符串),再通过CONCAT()将其拼入 JSON 参数。
性能评估
在评估混合搜索性能时,可以关注以下指标:
| 指标 | 说明 |
|---|---|
| 召回率(Recall) | 向量搜索返回的正确结果占所有正确结果的比例。可通过调整 ob_hnsw_ef_search 参数提高召回率,值越大召回率越高但搜索越慢。 |
| 响应时间(RT) | 搜索查询的执行时间。obclient 默认会在查询结果后显示执行耗时(N rows in set (X.XX sec)),可直接用于对比纯向量搜索、纯全文搜索和混合搜索的响应时间。 |
| _score 相关性 | 混合搜索结果中每条记录的 _score 值,反映综合排序后的相关性。RRF 融合后的分数综合考虑了向量搜索排名和全文搜索排名。 |
可分别执行三种搜索方式,obclient 会在每个查询结果后显示执行耗时(N rows in set (X.XX sec)),据此对比响应时间和结果质量的差异。
体验 RAG 搜索
RAG(Retrieval-Augmented Generation,检索增强生成)是一种通过先检索相关文档再生成答案的方式,提升大语言模型回答准确性和可靠性的技术。OceanBase 数据库通过 AI_EMBED(向量化)、AI_RERANK(重排序)和 AI_COMPLETE(文本生成)三个内置 AI 函数,支持在数据库内完成完整的 RAG 流程,无需外部代码。
RAG 流程
输入问题 → AI_EMBED 生成查询向量 → 向量搜索 Top-K 文档 → AI_RERANK 重排序 → AI_COMPLETE 生成答案
操作步骤
以下示例演示在数据库内完成一个最简化的 RAG 流程。
输入问题并生成查询向量:
obclient [test]> SET @query = 'OceanBase 支持哪些搜索能力?'; obclient [test]> SET @query_vector = AI_EMBED('ob_embed', @query);向量搜索 Top-K 文档:检索与查询语义最相似的 Top 3 文档:
obclient [test]> SET @candidate_docs = ( SELECT JSON_ARRAYAGG(content) FROM ( SELECT content FROM knowledge_base WHERE embedding IS NOT NULL ORDER BY cosine_distance(embedding, @query_vector) APPROXIMATE LIMIT 3 ) AS t );说明
JSON_ARRAYAGG()将检索到的文档内容聚合为 JSON 数组格式,供后续AI_RERANK函数使用。使用 AI_RERANK 重排序(可选步骤,需已注册重排序模型):
obclient [test]> SELECT AI_RERANK('ob_rerank', @query, @candidate_docs) AS ranked_results;返回结果如下,
index为文档索引,relevance_score为相关性分数,按分数降序排列(示意输出,实际数值取决于模型):+-------------------------------------------------------------------------------------------------------------+ | ranked_results | +-------------------------------------------------------------------------------------------------------------+ | [{"index": 0, "relevance_score": 0.9904329776763916}, {"index": 2, "relevance_score": 0.16993996500968933}] | +-------------------------------------------------------------------------------------------------------------+ 1 row in set说明
AI_RERANK(model_key, query, documents)函数通过重排序模型根据查询词对文档列表进行相似度排序。重排序模型能更精确地判断文档与查询的相关性,提升 RAG 系统的回答质量。如未注册重排序模型,可跳过此步骤,直接使用向量搜索的 Top-K 结果。调用 AI_COMPLETE 生成答案:基于检索到的文档内容,调用大语言模型生成答案:
obclient [test]> SELECT AI_COMPLETE('ob_complete', CONCAT('基于以下文档内容,回答用户的问题。用户问题:', @query, ' 相关文档:', CAST(JSON_EXTRACT(@candidate_docs, '$[0]') AS CHAR), ' 请基于以上文档内容,简洁准确地回答用户的问题。')) AS answer;返回结果如下(示意输出,实际回答内容取决于模型):
+------------------------------------------------------------------------------------------------------------------------------------+ | answer | +------------------------------------------------------------------------------------------------------------------------------------+ | OceanBase 支持向量搜索和全文索引搜索,并支持通过 DBMS_HYBRID_SEARCH 进行混合搜索,结合语义搜索与关键词搜索提供更全面的检索能力。 | +------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set说明
AI_COMPLETE(model_key, prompt)函数通过已注册的大语言模型处理提示词并返回生成的文本。CONCAT()函数用于将用户问题和检索到的文档内容拼接为完整的提示词,引导大模型基于文档内容回答问题。
性能评估
RAG 流程的完整性和准确性可通过以下方式评估:
| 评估维度 | 方法 |
|---|---|
| 检索质量 | 检查向量搜索返回的 Top-K 文档是否与查询问题相关。可通过查询结果后显示的执行耗时对比检索耗时,并人工判断文档相关性。 |
| 重排序效果 | 对比 AI_RERANK 前后的文档排序,观察相关性分数(relevance_score)最高的文档是否更贴近查询意图。 |
| 回答准确性 | 检查 AI_COMPLETE 生成的答案是否忠实于检索文档内容,是否存在幻觉(Hallucination)。RAG 通过限定上下文文档范围,有效降低大模型幻觉风险。 |
| 端到端延迟 | 观察从发起查询到获取答案的总响应时间,可参考查询结果后显示的执行耗时。各环节延迟主要取决于 AI 模型服务的调用耗时。 |
下一步
完成本文的 AI 场景体验后,您可以继续以下探索之旅:
- 体验混合搜索高级特性:探索多路向量搜索、标量过滤与混合搜索结合、自定义 RRF 参数调优等高级功能。详见 索引混合搜索(SQL 接口)。
- 体验 OceanBase 高级特性:探索多租户与资源隔离、高可用与容灾、水平扩展、并行导入、数据保护与恢复、在线 DDL 等企业级能力。详见 体验多租户与资源隔离。
- 深入了解向量索引:探索 HNSW_SQ、HNSW_BQ、IVF 等不同向量索引类型的特点和适用场景。详见 向量索引概述。
相关文档
- 向量数据类型的完整说明请参见 向量数据类型概述,向量索引的完整说明请参见 向量索引概述。
- 向量函数(距离函数、相似度函数等)的完整说明请参见 使用 SQL 函数。
- 全文查询的语法和搜索模式请参见 全文查询。
- AI 函数服务(AI_EMBED、AI_COMPLETE、AI_RERANK)的完整语法和示例请参见 AI 函数服务语法及示例。
- AI 模型注册的完整命令和模板请参见 AI 模型注册。
- 混合搜索的完整说明和更多示例请参见 索引混合搜索(PL 接口),SQL 接口请参见 索引混合搜索(SQL 接口)。
- 向量嵌入技术的概述和方法请参见 向量嵌入技术。