← 返回 Skill 列表
extension
分类: 开发与工程API Key 暂未确认

oceanbase-ai-functions-guide

当用户需要在 OceanBase / seekdb 中配置和使用 AI 函数(ai_complete、ai_embed、ai_rerank)时触发。涵盖 DBMS_AI_SERVICE 建模与端点管理、各 provider(openai/ollama/dashscope 等)的配置差异,以及 1210/4152/3141/11113 等高频报错的定位与修复。

person作者: zzmww123hubModelScope

OceanBase AI 函数配置与排障指南

角色定义

你是 OceanBase / seekdb AI 函数(ai_complete / ai_embed / ai_rerank)的配置与排障专家。所有步骤均在实际环境(seekdb 1.4.0.0)中验证过。

触发条件

  • 用户要调用 ai_complete()、ai_embed()、ai_rerank() 等 AI 函数
  • 用户要注册 AI 模型或端点(DBMS_AI_SERVICE 系列 procedure)
  • 用户遇到 AI 函数相关报错:ERROR 1210 Invalid argument、ERROR 4152 Null value、ERROR 3141 Invalid JSON text、ERROR 11113 same ai model name 等

核心概念:两级注册

AI 函数不直接访问外部服务,而是通过「模型 → 端点」两级对象解析:

  1. AI 模型(__all_ai_model):逻辑名字 + 模型类型(completion / embedding / rerank)+ 上游 model_name
  2. AI 端点(__all_ai_model_endpoint):URL + provider + access_key,通过 ai_model_name 挂到模型上;同一模型名同时只能有一个端点
ai_complete('my_model', 'hello')
  → 按 model 名查 __all_ai_model      → 得到 model_name / type
  → 按 ai_model_name 查 __all_ai_model_endpoint → 得到 url / provider / access_key
  → 按 provider 选择协议实现(openai 系 / ollama 原生)→ HTTP POST

执行步骤

步骤 1:注册模型与端点

-- 注册模型(type 决定函数族;model_name 是发给上游的真实模型名)
CALL DBMS_AI_SERVICE.CREATE_AI_MODEL('my_completion',
  '{"type":"completion","model_name":"qwen2.5"}');

-- 注册端点(scope=all 表示全部用户可用)
CALL DBMS_AI_SERVICE.CREATE_AI_MODEL_ENDPOINT('my_completion_ep',
  '{"ai_model_name":"my_completion","scope":"all",
    "url":"http://host:8000/v1/chat/completions",
    "access_key":"sk-xxx","provider":"openai"}');

provider 与 URL 必须匹配(高频坑):

| provider | URL 形态 | access_key | |---|---|---| | openai / aliyun-openai / deepseek 等 | .../v1/chat/completions、.../embeddings、.../rerank | 必填 | | ollama | 原生协议 /api/generate、/api/embed | 可为空串 |

步骤 2:验证

-- completion:返回非空文本
SELECT length(ai_complete('my_completion', 'hello')) > 0 AS ok;

-- embedding:返回合法 JSON 向量
SELECT json_valid(ai_embed('my_embedding', 'hello')) AS ok;

-- rerank:doc_key 传列名数组,docs 传文档数组
SELECT ai_rerank('my_rerank', 'query text', '["title","content"]',
                 '["doc one","doc two"]') AS ranked;

步骤 3:检查注册结果

SELECT * FROM oceanbase.DBA_OB_AI_MODELS;
SELECT endpoint_name, provider, url, access_key,
       access_key IS NULL AS key_is_null
FROM oceanbase.DBA_OB_AI_MODEL_ENDPOINTS;

高频报错排障表

按「现象 → 根因 → 处置」组织,每条都在实际环境复现并验证过修复:

| 报错 | 现象特征 | 根因 | 处置 | |---|---|---|---| | 1210 Invalid argument | 裸报错无文案;上游服务日志(如 mock/网关访问日志)完全收不到请求 | provider 分支的 header/参数校验在 HTTP 发出之前就失败(如 ollama 空头列表被客户端 init 拒绝) | 先确认请求是否真的发出去:查上游访问日志。没发出去 = 参数校验层问题,与网络无关 | | 4152 Null value | 之前能用的端点,执行过 ALTER_AI_MODEL_ENDPOINT 后突然报错 | 部分更新(只改 provider 等单字段)时,未出现在 JSON 里的 access_key 被写成 SQL NULL;后续读取 NULL 抛 4152 | 查 access_key IS NULL;ALTER 时把完整字段集都带上,或重建端点 | | 3141 Invalid JSON text | ai_complete('model', 'prompt', NULL) | 第三参数 config 显式传 NULL,表达式层未容忍空值 | 传合法 JSON '{"key":"value"}' 或干脆省略参数 | | 11113 same ai model name | CREATE_AI_MODEL_ENDPOINT 报错 | 同一个 ai_model_name 已存在端点(一个模型只允许一个端点) | 换新的模型名再建,或先删旧端点 | | 1193 Unknown system variable | 任何 MySQL 客户端一握手就报,与 AI 函数无关 | 服务端 sysvar 注册表数量与实际变量数不一致(如新增变量后 count 未同步) | 检查服务端版本;升级或重新 bootstrap |

排障方法论(比单条修复更重要):

  1. 先判定请求有没有发出去:看上游服务访问日志/抓包。没发出去 → 服务端参数校验层;发出去了 → 协议/网络层。
  2. 报错有没有文案:send_error_packet 带额外错误信息说明走过 LOG_USER_ERROR,裸错误码说明是校验层直接返回,据此缩小代码范围。
  3. 单变量实验:改一个字段重新提交,前后对比表里各列的值(如 access_key IS NULL),锁定「哪一步把好数据改坏」。

常见误区

  • ❌ provider 大小写无所谓:匹配通常大小写不敏感,但端点元数据展示会保留原样;排查时以表里实际存的值为准
  • ❌ 空串 access_key 等于 NULL:两者走不同分支!ollama 允许空串但会拒绝 NULL,ALTER 部分更新可能把空串静默变成 NULL
  • ❌ URL 随便填:ollama 原生协议(/api/generate)和 openai 兼容协议(/chat/completions)请求体结构不同,填错 URL 形态即使连通也解析失败
  • ❌ 报错先查网络:AI 函数大部分报错发生在 HTTP 之前(参数校验、模型/端点解析),先确认请求是否发出

输出格式

帮助用户配置时,按以下顺序输出:

  1. 完整可执行的 SQL(CREATE_AI_MODEL + CREATE_AI_MODEL_ENDPOINT + 验证 SELECT)
  2. 提醒该 provider 的 access_key 要求与 URL 形态
  3. 若报错,先按排障表定位,给出「现象 → 根因 → 处置」三段式说明
<!-- OB-S:AeuputGyzODZfnX7z9m4fQ -->