跳到主要内容

体验语义索引

本教程将引导您快速上手 seekdb 语义索引,帮助您理解语义索引的实际应用,并在几分钟内体验语义索引的强大功能:无需手动转换为向量,直接存储文本即可实现语义搜索。

概述

语义索引(Hybrid Vector Index)指可以自动将文本转换为向量并建立索引的向量索引,是 seekdb 提供的一项强大功能,它实现了向量概念对用户的透明化。与不使用语义索引的向量索引相比,语义索引极大地简化了使用流程。

  • 不使用语义索引的向量索引流程:
    文本 → 手动调用 `AI_EMBED` 函数生成向量 → 插入向量 → 使用向量搜索
  • 语义索引流程:
    文本 → 直接插入 → 直接使用文本搜索

seekdb 会在内部自动将文本转换为向量并建立索引,搜索时也只需提供原始文本,系统会自动进行嵌入并搜索向量索引,从而显著提升了使用的便捷性。

前提条件

  • 联系管理员获取相应的数据库连接串,然后执行以下命令连接到数据库:
    # host: seekdb 数据库连接 IP。
    # port: seekdb 数据库连接端口。
    # database_name: 需要访问的数据库名称。
    # user_name: 数据库用户名。
    # password: 数据库密码。
    obclient -h$host -P$port -u$user_name -p$password -D$database_name
  • 确保你已拥有 AI 函数服务相关权限,并确保数据库中已使用 CREATE_AI_MODELCREATE_AI_MODEL_ENDPOINT 程序注册嵌入模型(Embedding Model):
    CALL DBMS_AI_SERVICE.DROP_AI_MODEL ('ob_embed');
    CALL DBMS_AI_SERVICE.DROP_AI_MODEL_ENDPOINT ('ob_embed_endpoint');

    CALL DBMS_AI_SERVICE.CREATE_AI_MODEL(
    'ob_embed', '{
    "type": "dense_embedding",
    "model_name": "BAAI/bge-m3"
    }');

    CALL DBMS_AI_SERVICE.CREATE_AI_MODEL_ENDPOINT (
    'ob_embed_endpoint', '{
    "ai_model_name": "ob_embed",
    "url": "https://api.siliconflow.cn/v1/embeddings",
    -- 需替换为实际的 access_key
    "access_key": "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "provider": "siliconflow"
    }');
信息

语义索引功能当前版本仅支持 HNSW/HNSW_BQ 索引类型。

步骤一:创建语义索引

语义索引支持建表时创建后建两种方式。

信息

创建语义索引时必须指定在 VARCHAR 列上,并指定嵌入模型和向量维度。

建表时创建

CREATE TABLE items (
id INT PRIMARY KEY,
doc VARCHAR(100),
VECTOR INDEX vector_idx(doc)
WITH (distance=l2, lib=vsag, type=hnsw, model=ob_embed, dim=1024, sync_mode=immediate)
);

后建索引

CREATE TABLE items1 (
id INT PRIMARY KEY,
doc VARCHAR(100)
);

CREATE VECTOR INDEX vector_idx
ON items (doc)
WITH (distance=l2, lib=vsag, type=hnsw, model=ob_embed, dim=1024, sync_mode=immediate);

步骤二:插入文本数据(无需手动向量化)

插入文本数据时,系统会自动进行嵌入,无需手动调用 AI_EMBED 函数:

INSERT INTO items(id, doc) VALUES(1, 'Rose');
INSERT INTO items(id, doc) VALUES(2, 'Sunflower');
INSERT INTO items(id, doc) VALUES(3, 'Lily');

步骤三:使用文本直接搜索

使用 semantic_distance 函数,传入原始文本进行向量搜索,无需手动生成查询向量:

SELECT id, doc FROM items
ORDER BY semantic_distance(doc, 'flower')
APPROXIMATE LIMIT 3;

返回结果如下:

+----+-----------+
| id | doc |
+----+-----------+
| 1 | Rose |
| 2 | Sunflower |
| 3 | Lily |
+----+-----------+
3 rows in set

系统会自动将查询文本 'flower' 转换为向量,然后在向量索引中搜索最相似的文本。

进阶:使用向量搜索

如果已经拥有了搜索内容的向量表示(例如通过 AI_EMBED 函数预先生成),也可以直接使用这些向量来搜索语义索引,从而避免每次搜索都进行重复的嵌入操作:

-- 先获取查询向量
SET @query_vector = AI_EMBED("ob_embed", "flower");

-- 使用向量进行索引搜索
SELECT id, doc FROM items
ORDER BY semantic_vector_distance(doc, @query_vector)
APPROXIMATE LIMIT 3;

返回结果如下:

+----+-----------+
| id | doc |
+----+-----------+
| 1 | Rose |
| 2 | Sunflower |
| 3 | Lily |
+----+-----------+
3 rows in set

总结

通过本教程,您已经掌握了 seekdb 语义索引的核心功能:

  • 简化使用流程:无需手动转换为向量,直接存储文本即可实现语义搜索。
  • 自动嵌入:系统自动将文本转换为向量并建立索引,搜索时也只需提供原始文本。
  • 性能优化:支持直接使用向量搜索,避免重复嵌入操作。

语义索引功能极大地简化了向量搜索的使用流程,是构建智能搜索应用的理想选择。

下一步

更多操作

更多体验 seekdb 的 AI Native 特性以及尝试基于 seekdb 搭建 AI 应用的使用指导,参见:

除了使用 SQL 进行操作之外,也支持通过 seekdb 提供的 Python SDK(pyseekdb)进行操作,使用方法参见 通过 Python SDK 体验嵌入式pyseekdb 概述