AI 函数服务使用及示例
本文档介绍 seekdb 中 AI Function 的相关功能。
AI 函数通过 SQL 表达式,将 AI 模型能力直接集成到数据库内的数据处理中。它极大地简化了利用 AI 大模型进行数据提取、分析、总结和保存等操作,是当前数据库和数据仓库领域的重要新特性。seekdb 通过 DBMS_AI_SERVICE 包提供 AI 模型和端点管理,并新增了几个内置 AI 函数表达式,并支持通过视图监控 AI 模型调用情况。
前提条件
在使用 AI 函数服务之前,需要确保你已拥有相关权限。详细权限请参见 AI 函数服务权限。
注意事项
- 混合搜索(Hybrid Search)依赖 AI 函数服务的模型管理和嵌入(embedding)功能。在删除 AI 模型时,需检查其是否被混合搜索引用,以避免潜在问题。
AI 模型管理
DBMS_AI_SERVICE 包提供了 AI 模型和端点管理能力,支持以下操作:
| 操作 | 描述 |
|---|---|
| CREATE_AI_MODEL | 创建一 个 AI 模型对象。 |
| DROP_AI_MODEL | 删除一个 AI 模型对象。 |
| CREATE_AI_MODEL_ENDPOINT | 创建一个 AI 模型服务端点对象。 |
| ALTER_AI_MODEL_ENDPOINT | 修改一个 AI 模型服务端点对象。 |
| DROP_AI_MODEL_ENDPOINT | 删除一个 AI 模型服务端点对象。 |
你可以通过调用该系统包,实现在 seekdb 内部直接管理 AI 模型和端点,而不需要依赖外部服务。详细参数和语法请参考 DBMS_AI_SERVICE 包的相关文档。
AI 模型调用监控
seekdb 支持通过视图查看和监控 AI 模型信息及调用情况:
- CDB/DBA_OB_AI_MODELS:查看 AI 模型信息。
- CDB/DBA_OB_AI_MODEL_ENDPOINTS:监控 AI 模型调用情况。
AI 函数表达式
seekdb 支持以下 AI 函数表达式,实现直接通过 SQL 语句在 seekdb 内部调用 AI 模型,简化了调用流程:
| 名称 | 描述 |
|---|---|
AI_COMPLETE | 通过调用指定文本生成大模型处理提示词和数据信息,并解析处理结果。 |
AI_PROMPT | 用于构建和格式化提示词,支持动态插入数据。 |
AI_EMBED | 通过调用嵌入模型(Embedding Model)将文本数据转换为向量数据。 |
AI_RERANK | 通过调用重排序模型(Rerank Model)根据提示词对文本进行相似度排序。 |
使用 AI 函数表达式时,需要确保数据库中已注册 AI 模型及端点信息。
AI_COMPLETE 和 AI_PROMPT
AI_COMPLETE 函数通过 model_key 指定一个已注册的文本生成大模型(LLM),对用户提供的提示词(prompt)和数据进行处理,并返回大模型生成的文本信息。用户可以在 prompt 参数中自定义组织提示词和数据库内的数据格式。这种方式不仅支持对文本数据进行多样化处理,还能在数据库内部实现批量处理,有效避免了数据在数据库与大模型之间来回拷贝的开销。
考虑到许多 AI 应用场景中,提示词往往具有高度结构化特征,需要动态注入具体 数据,而每次手动使用 CONCAT 等函数拼接提示词和输入内容,不仅开发成本高,还容易写错导致格式问题。为了支持提示词复用和提示词与数据动态组合的需求,seekdb 提供了 AI_PROMPT 函数。AI_PROMPT 将提示词从"静态文本"升级为"可复用、可参数化"的函数模板形式,可以在 AI_COMPLETE 中替代 prompt 参数直接使用,从而极大地简化了提示词的构建过程,提升了开发效率和准确性。
AI_PROMPT 函数
AI_PROMPT 函数用于构建和格式化提示词,支持动态插入数据。
语法
AI_PROMPT 函数语法如下:
AI_PROMPT('template', expr0 [ , expr1, ... ]);
参数说明:
| 参数 | 描述 | 类型 | 是否可空 |
|---|---|---|---|
| template | 用户输入的提示词模板。 | VARCHAR(max_length) | No |
| expr | 用户输入的数据。 | VARCHAR(max_length) | No |
参数 template 和 expr 为必填项,不允许为空。其中,expr 参数只支持 VARCHAR 类型,不支持 JSON 类型。
返回值:
- JSON,格式化后的提示词字符串。
示例
AI_PROMPT 函数将模板字符串和动态数据组织成 JSON 格式:
- 第一个参数(模板字符串 template)会被放在返回 JSON 的
template字段中。 - 后续的参数(数据值 expr0、expr1、...)会被放在返回 JSON 的
args数组中。 - 模板中的占位符
{0}、{1}等会按索引对应args数组中的数据,在AI_COMPLETE函数中使用时会被自动替换。
例如:
SELECT AI_PROMPT('Recommend {0} of the most popular {1} to me.', 'ten', 'mobile phones');
返回结果如下:
{
"template": "Recommend {0} of the most popular {1} to me.",
"args": ["ten", "mobile phones"]
}
基于上个例子,在 AI_COMPLETE 函数中使用 AI_PROMPT 函数:
SELECT AI_COMPLETE("ob_complete",AI_PROMPT('Recommend {0} of the most popular {1} to me.just output name in json array format', 'two', 'mobile phones')) AS ans;
返回结果如下:
+--------------------------------------------------+
| ans |
+--------------------------------------------------+
| ["iPhone 15 Pro Max","Samsung Galaxy S24 Ultra"] |
+--------------------------------------------------+
AI_COMPLETE 函数
语法
AI_COMPLETE 函数语法如下:
AI_COMPLETE(model_key, prompt[, parameters])
--如果使用 AI_PROMPT 函数,则将 prompt 参数替换为 AI_PROMPT 函数,示例见 AI_PROMPT 函数。
AI_COMPLETE(model_key, AI_PROMPT(prompt_template, data))
参数说明:
| 参数 | 描述 | 类型 | 是否可空 |
|---|---|---|---|
| model_key | 数据库内注册的模型。 | VARCHAR(128) | No |
| prompt | 用户输入的提示词信息。 | VARCHAR/TEXT(LONGTEXT) | No |
| parameters | 用于支持配置 API 提供的可选项。模型的可选字段,会被直接放入到生成的消息体里,在不同厂商这里有一定差异。通常来说,常见的可选项有这些:temperature、top_p、max_tokens。一般情况下无需指定用默认配置即可。 | JSON | Yes |
必须指定 model_key、prompt,并且其中一个为 NULL 时,函数提示报错。
返回值:
- text,大模型根据提示词生成的文本。
示例
-
情感分析示例
SELECT AI_COMPLETE("ob_complete","你的任务是对提供的文本进行情感分析,判断其情感倾向为正面还是负面。
以下是需要分析的文本:
<text>
天气真好啊
</text>
判断标准如下:
如果文本表达的是正面情感,输出1;如果文本表达的是负面情感,输出 -1。不要输出其他东西.\n") AS ans;返回结果如下:
+-----+
| ans |
+-----+
| 1 |
+-----+ -
翻译示例
CREATE TABLE comments (
id INT AUTO_INCREMENT PRIMARY KEY,
content TEXT
);
INSERT INTO comments (content) VALUES ('hello world!');
-- 以 concat 表达式形式将处理的数据替换成数据库中表上的列名,自然地就能对数据库中的数据进行批量处理,而无需将数据从数据库拷贝到大模型和将大模型结果拷贝回数据库内
SELECT AI_COMPLETE("ob_complete",
concat("你是一个翻译大师,你需要将以下将英语翻译成中文。以下是需要翻译的文本:<text>",
content,
"</text>")) AS ans FROM comments;返回结果如下:
+-------------+
| ans |
+-------------+
| 你好,世界! |
+-------------+ -
分类示例
SELECT AI_COMPLETE("ob_complete","你是一个分类大师,你会获取到一堆问题文本,你需要区分这些问题的归属,归属列表为[\"硬件部\",\"软件部\",\"其他\"].以下是需要分析的文本:
<text>
这块屏幕质量真差
</text>") AS res;返回结果如下:
+--------+
| res |
+--------+
| 硬件部 |
+--------+
AI_EMBED
AI_EMBED 函数通过 model_key 指定一个已注册的嵌入模型(Embedding Model),将用户提供的文本数据转换为向量数据。当模型支持多个维度时,允许通过 dim 参数指定输出相关维度的向量。
使用
语法如下:
AI_EMBED(model_key, input, [dim])
参数说明:
| 参数 | 描述 | 类型 | 是否可空 |
|---|---|---|---|
| model_key | 数据库内注册的模型。 | VARCHAR(128) | No |
| input | 用户输入的希望转换的文本数据。 | VARCHAR | No |
| dim | 指定输出相关维度的向量。部分大模型厂商提供的 API,支持配置多个维度。 | INT64 | Yes |
必须指定 model_key、input,并且其中一个为 NULL 时,函数提示报错。
返回值:
- vector 格式的字符串,嵌入模型根据文本转换的向量。
示例
-
嵌入单行数据
SELECT AI_EMBED("ob_embed","Hello world") AS embedding;返回结果如下:
+----------------+
| embedding |
+----------------+
| [0.1, 0.2, 0.3]|
+----------------+ -
嵌入表上列
CREATE TABLE comments (
id INT AUTO_INCREMENT PRIMARY KEY,
content TEXT
);
INSERT INTO comments (content) VALUES ('hello world!');
SELECT AI_EMBED("ob_embed",content) AS embedding FROM comments;返回结果如下:
+----------------+
| embedding |
+----------------+
| [0.1, 0.2, 0.3]|
+----------------+
AI_RERANK
AI_RERANK 函数通过 model_key 指定一个已注册的重排序模型(Rerank Model),将用户提供的查询词和文档列表按厂商规则组织消息发送给指定模型,解析并返回模型返回的排序结果,适用于 RAG 的 rerank 场景。
使用
语法如下:
AI_RERANK(model_key, query, documents[, document_key])
参数说明:
| 参数 | 描述 | 类型 | 是否可空 |
|---|---|---|---|
| model_key | 数据库内注册的模型。 | VARCHAR(128) | No |
| query | 用户输入的搜索文本。 | VARCHAR(1024) | No |
| documents | 用 户输入的文档列表。 | JSON ARRAY,例如 '["apple", "banana"]' | No |
必须指定 model_key、query、documents,并且其中一个为 NULL 时,函数提示报错。
返回值:
- JSON 数组,包含重排序模型返回的文档及其相关性分数,并按相关性分数降序排列。
示例
SELECT AI_RERANK("ob_rerank","Apple",'["apple","banana","fruit","vegetable"]');
返回结果如下:
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ai_rerank("ob_rerank","Apple",'["apple","banana","fruit","vegetable"]') |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [{"index": 0, "document": {"text": "apple"}, "relevance_score": 0.9912109375}, {"index": 1, "document": {"text": "banana"}, "relevance_score": 0.0033512115478515625}, {"index": 2, "document": {"text": "fruit"}, "relevance_score": 0.0003669261932373047}, {"index": 3, "document": {"text": "vegetable"}, "relevance_score": 0.00001996755599975586}] |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+