文本向量化(Embedding)使用说明

更新时间:
复制为 MD 格式

在数据库内构建语义搜索、问答系统(RAG)等AI应用时,通常涉及在应用层和数据库之间同步数据、调用外部模型进行向量化等复杂流程。PolarDB MySQL内置的EMBEDDING()函数,可直接在数据库内核中调用阿里云大模型服务平台百炼的文本向量化模型,将文本数据实时转换为向量。此功能简化了AI应用的开发架构,通过纯SQL接口,即可在一个系统内完成文本处理、向量生成、向量存储和相似性检索的全过程,提升了开发效率和系统性能。

说明

文本向量化(Embedding)目前处于灰度阶段。如需使用该功能或对当前功能有任何疑问,请提交工单联系我们为您处理。

适用范围

使用EMBEDDING()函数前,集群版本需为:MySQL 8.0.2,且修订版本需为8.0.2.2.31.1及以上。

使用EMBEDDING函数生成向量

配置完成后,可在SQL查询中调用EMBEDDING()函数,将文本内容转换为向量。

函数语法

EMBEDDING('<text>', '<model_name>', <dimension>)

参数说明

参数

说明

text

待向量化的文本内容。

model_name

指定阿里云大模型服务平台百炼的文本向量化模型。取值范围:

  • 'text-embedding-v4'

  • 'text-embedding-v3'

  • 'text-embedding-v2'

  • 'text-embedding-v1'

dimension

生成向量的维度。该值需是所选模型支持的特定维度值。取值范围:

  • text-embedding-v4:2048、1536、1024、768、512、256、128、64。

  • text-embedding-v3:1024、768、512、256、128、64。

  • text-embedding-v2:1536

  • text-embedding-v1:1536

使用示例

执行以下SQL,将文本'你好'通过text-embedding-v4模型转换为一个1024维的向量。

SELECT EMBEDDING('你好', 'text-embedding-v4', 1024);
+-----------------------------------------------+
| EMBEDDING('你好', 'text-embedding-v4', 1024)   |
+-----------------------------------------------+
| ��;��|��n�=0�=    ��K: ^�<��)<�i��    ��K  ...|
+-----------------------------------------------+
SELECT HEX(EMBEDDING('你好', 'text-embedding-v4', 1024));
+-----------------------------------------------+
| EMBEDDING('你好', 'text-embedding-v4', 1024)   |
+-----------------------------------------------+
| E20BFE3BB7A37CBDE46E953D14308C3DF63D173DE8 ...|
+-----------------------------------------------+

构建一个基于内置向量化的RAG应用

本节介绍如何构建一个完整的RAG(Retrieval-Augmented Generation,检索增强生成)示例,包括创建自动生成向量的知识库表,以及通过一条SQL完成提问→向量化→检索→拼接Prompt的全过程。

步骤一:创建知识库表并自动生成向量

利用MySQL的物化虚拟列(Stored Generated Column)特性,结合EMBEDDING()函数,可实现数据写入时自动向量化。同时,需为向量列创建向量索引以加速相似性搜索。

-- 创建知识库表
CREATE TABLE knowledge_base (
  id INT AUTO_INCREMENT PRIMARY KEY,
  doc TEXT,
  -- 定义一个物化虚拟列(STORED),当doc列写入或更新时,自动调用EMBEDDING函数生成向量并存入vec列
  vec VECTOR(1024) AS (EMBEDDING(doc, 'text-embedding-v4', 1024)) STORED 
  -- 通过COMMENT语法为vec列声明一个HNSW向量索引,这是创建向量索引的特定语法
  -- metric=cosine: 指定距离计算方式为余弦距离
  COMMENT 'imci_vector_index=HNSW(metric=cosine,max_degree=16,ef_construction=300)'
) 
-- COMMENT 'COLUMNAR=1' 表示为此表创建列存索引,这是使用向量索引的前提
COMMENT 'COLUMNAR=1';

-- 插入原始文本数据,向量生成和索引构建将由数据库自动完成
INSERT INTO knowledge_base (doc) VALUES 
('PolarDB IMCI支持通过Hybrid Plan在一条SQL中同时访问行存和列存'),
('HashMatch是PolarDB IMCI中的一种Join算子'),
('PolarDB IMCI提供内置的向量索引和embedding服务');

步骤二:执行语义搜索并构造Prompt

知识库准备就绪后,可模拟用户提问,使用EMBEDDING()函数将问题实时向量化,利用DISTANCE()函数查找最相关的文档,最后通过CONCAT()GROUP_CONCAT()函数将检索到的知识与原始问题拼接成一个完整的Prompt。

  • 一条SQL内完成拼接Prompt:

    -- 将用户问题“HashMatch是什么”向量化,并在knowledge_base表中查找最相似的一条记录,
    -- 然后将其内容与问题拼接成一个发送给大语言模型的Prompt。
    
    SELECT 
        CONCAT(
            '请参考以下内容: ', 
            GROUP_CONCAT(doc), 
            ', 以合适的语气回答用户的问题: HashMatch是什么'
        ) AS final_prompt
    FROM (
        SELECT 
            doc 
        FROM 
            knowledge_base 
        ORDER BY 
            -- DISTANCE函数用于计算两个向量间的距离,这里计算用户问题向量与表中各知识向量的余弦距离
            DISTANCE(vec, EMBEDDING('HashMatch是什么', 'text-embedding-v4', 1024), 'COSINE') 
        LIMIT 1
    ) AS t;

    返回结果如下:

    +--------------------------------------------------------------------------------------------+
    | final_prompt                                                                               |
    +--------------------------------------------------------------------------------------------+
    | 请参考以下内容: HashMatchPolarDB IMCI中的一种Join算子, 以合适的语气回答用户的问题: HashMatch是什么 |
    +--------------------------------------------------------------------------------------------+
  • 使用Session变量存储EMBEDDING表达式的结果,便于后续SQL使用。

    SET @value = EMBEDDING("HashMatch是什么", "text-embedding-v4", 1024);
    
    SELECT 
        CONCAT(
            '请参考以下内容: ', 
            GROUP_CONCAT(doc), 
            ', 以合适的语气回答用户的问题: HashMatch是什么'
        ) AS final_prompt
    FROM (
        SELECT 
            doc 
        FROM 
            knowledge_base 
        ORDER BY 
            -- DISTANCE函数用于计算两个向量间的距离,这里计算用户问题向量与表中各知识向量的余弦距离
            DISTANCE(vec, @value, 'COSINE') 
        LIMIT 1
    ) AS t;