---
title: "体验 AI 场景 - OceanBase 数据库 V5.0.1 | OceanBase 文档中心"
description: 体验 AI 场景 OceanBase 数据库从 V4.3.3 版本开始支持向量数据类型，并在后续版本中持续增强 AI 能力，逐步构建了集向量存储、向量索引、全文索引、AI 函数服务和混合搜索于一体的 AI 数据库能力。通过在数据库内直接调用嵌入模型（Embedding Model）和大语言模型（LLM），开发者无需在…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 5.0.1

# 体验 AI 场景

更新时间：2026-10-27 15:56:46

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V5.0.1/zh-CN/200.quickstart/400.experience-ai-scenarios.md)  

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](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615008) 中使用 All in One 安装包部署的单节点环境为例，需已按 [体验高并发 OLTP 场景](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000007140970) 创建测试租户 `oltp_tenant`。AI 函数服务自 V4.4.1 版本开始提供，同表创建向量索引和全文索引需要 V4.4.0 及以上版本，本文使用的 V5.0.1 均已支持。

## 前提条件

在开始本文操作前，确保满足以下条件：

| 项目 | 描述 |
| --- | --- |
| OceanBase 数据库 | 已完成部署并成功启动，参见 [部署 OceanBase](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615008)。建议使用 V4.4.1 及以上版本（本文基于 V5.0.1）。 |
| 测试租户 | 已创建 MySQL 模式业务租户（如 `oltp_tenant`），参见 [体验高并发 OLTP 场景](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000007140970)。 |
| 向量内存配置 | 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 租户中执行以下命令：

```sql
-- 使用 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](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006618722)。

### 注册 AI 模型

OceanBase 数据库通过 `DBMS_AI_SERVICE` 系统包管理 AI 模型和访问端点。在使用 `AI_EMBED`、`AI_COMPLETE`、`AI_RERANK` 等 AI 函数前，需要先注册对应的模型和访问端点。

以下示例以阿里云百炼为例，注册嵌入模型、文本生成模型和重排序模型三组模型与端点。请将 `access_key` 替换为您的实际 API Key：

```sql
-- 登录业务租户
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 模型注册](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615297)。完整的快速上手流程请参见 [AI 函数服务快速上手](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615295)。

执行以下查询，验证模型和端点注册成功：

```sql
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 个端点即表示注册成功：

```shell
+-------------+-----------------+
| 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` | 关键词搜索，通过分词和倒排索引实现精确匹配 |
| 同表共存 | 两者同时创建 | 混合搜索，结合语义搜索与关键词搜索的综合排序 |

### 操作步骤

1. 登录业务租户：

   ```shell
   obclient -h127.0.0.1 -uroot@oltp_tenant -P2881 -p -A test

   ```
 2. 创建知识库表，同时包含向量列和全文索引列。以文档知识库为例：

   ```sql
   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 个字符。
 3. 验证表和索引创建成功：

   ```sql
   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"}` 指定图片输入，进行图片嵌入。 |

### 操作步骤

1. 插入文档数据，同时使用 `AI_EMBED()` 函数生成向量：

   ```sql
   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 将返回插入结果：

   ```shell
   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 是否有效、数据库节点是否能访问模型服务端点（见前提条件的网络要求）、模型和端点注册参数是否正确。
 2. 也可以使用 `UPDATE` 语句为已有数据批量生成向量：

   ```sql
   obclient [test]> UPDATE knowledge_base SET embedding = AI_EMBED('ob_embed', content) WHERE embedding IS NULL;

   ```
 3. 验证向量是否生成成功：

   ```sql
   obclient [test]> SELECT id, title, vector_dims(embedding) AS dim_count FROM knowledge_base;

   ```

   返回结果如下，`dim_count` 应显示与模型输出维度一致的值（如 1024）：

   ```shell
   +----+------------------+-----------+
   | 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` 关键字进行向量近似最近邻搜索：

```sql
obclient [test]> SET @query_vector = AI_EMBED('ob_embed', '数据库的搜索功能');

```

```sql
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;

```

返回结果按距离从近到远排序，距离越近表示语义越相似（以下为示意输出，实际数值取决于所用的模型和数据）：

```shell
+----+------------------+----------------------+
| 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`](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006618554) 调整 HNSW 索引的搜索候选集大小，值越大召回率越高但搜索越慢。

#### 2. 纯全文搜索

使用 `MATCH() AGAINST()` 语法进行全文搜索：

```sql
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);

```

返回结果按相关性评分排序（以下为本文环境的实测输出，具体数值因数据分布而异）：

```shell
+----+------------------+---------------------+
| 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 算法融合排序。

先生成查询向量：

```

由于 JSON 参数中无法直接调用 `AI_EMBED()` 函数，需通过 `CONCAT()` 将查询向量拼入 JSON 查询参数：

```sql
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"]
}');

```

```sql
obclient [test]> SELECT json_pretty(DBMS_HYBRID_SEARCH.SEARCH('knowledge_base', @hybrid_query));

```

返回结果按 RRF 融合后的相关性排序（以下为示意输出，实际数值取决于所用的模型和数据）：

```shell
[
  {
    "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 流程

```text
输入问题 → AI_EMBED 生成查询向量 → 向量搜索 Top-K 文档 → AI_RERANK 重排序 → AI_COMPLETE 生成答案

```

### 操作步骤

以下示例演示在数据库内完成一个最简化的 RAG 流程。

1. **输入问题并生成查询向量**：

   ```sql
   obclient [test]> SET @query = 'OceanBase 支持哪些搜索能力？';
   obclient [test]> SET @query_vector = AI_EMBED('ob_embed', @query);

   ```
 2. **向量搜索 Top-K 文档**：检索与查询语义最相似的 Top 3 文档：

   ```sql
   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` 函数使用。
 3. **使用 AI_RERANK 重排序**（可选步骤，需已注册重排序模型）：

   ```sql
   obclient [test]> SELECT AI_RERANK('ob_rerank', @query, @candidate_docs) AS ranked_results;

   ```

   返回结果如下，`index` 为文档索引，`relevance_score` 为相关性分数，按分数降序排列（示意输出，实际数值取决于模型）：

   ```shell
   +-------------------------------------------------------------------------------------------------------------+
   | 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 结果。
 4. **调用 AI_COMPLETE 生成答案**：基于检索到的文档内容，调用大语言模型生成答案：

   ```sql
   obclient [test]> SELECT AI_COMPLETE('ob_complete',
       CONCAT('基于以下文档内容，回答用户的问题。用户问题：', @query,
           ' 相关文档：', CAST(JSON_EXTRACT(@candidate_docs, '$[0]') AS CHAR),
           ' 请基于以上文档内容，简洁准确地回答用户的问题。')) AS answer;

   ```

   返回结果如下（示意输出，实际回答内容取决于模型）：

   ```shell
   +------------------------------------------------------------------------------------------------------------------------------------+
   | 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 场景体验后，您可以继续以下探索之旅：

1. **体验混合搜索高级特性**：探索多路向量搜索、标量过滤与混合搜索结合、自定义 RRF 参数调优等高级功能。详见 [索引混合搜索（SQL 接口）](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615303)。
 2. **体验 OceanBase 高级特性**：探索多租户与资源隔离、高可用与容灾、水平扩展、并行导入、数据保护与恢复、在线 DDL 等企业级能力。详见 [体验多租户与资源隔离](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000007140973)。
 3. **深入了解向量索引**：探索 HNSW_SQ、HNSW_BQ、IVF 等不同向量索引类型的特点和适用场景。详见 [向量索引概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615292)。

## 相关文档

- 向量数据类型的完整说明请参见 [向量数据类型概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615300)，向量索引的完整说明请参见 [向量索引概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615292)。
 - 向量函数（距离函数、相似度函数等）的完整说明请参见 [使用 SQL 函数](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615055)。
 - 全文查询的语法和搜索模式请参见 [全文查询](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006619318)。
 - AI 函数服务（AI_EMBED、AI_COMPLETE、AI_RERANK）的完整语法和示例请参见 [AI 函数服务语法及示例](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615296)。
 - AI 模型注册的完整命令和模板请参见 [AI 模型注册](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615297)。
 - 混合搜索的完整说明和更多示例请参见 [索引混合搜索（PL 接口）](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615304)，SQL 接口请参见 [索引混合搜索（SQL 接口）](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615303)。
 - 向量嵌入技术的概述和方法请参见 [向量嵌入技术](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615066)。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
