MySQL 宣布正式拥抱 AI

大家好,我是Java1234_小锋老师。

做了二十多年"管表的人",MySQL 把人工智能请到了自己家里。

这篇文章不堆概念。先把 MySQL 是谁说清楚,再看看它现在能帮你做的三件事:把向量存进表、用一句话去问文档、在库里直接训练一个小模型。文末有几段可以照着改的 SQL。

MySQL 先是一个什么样的数据库

如果你写过后台,大概率跟 MySQL 打过交道。它是一个开源的关系型数据库,1995 年由 Michael Widenius 等人写出来,后来进入 Oracle 旗下,一路走到今天。网站的用户表、订单表、库存表,很多都躺在它里面。

它擅长的事情很朴素:用表把数据分门别类存好,用 SQL 把它们查出来,用事务保证扣库存和写订单一起成功,或者一起回滚。再往后,主从复制、备份、权限,把一套系统撑到能上线。

很长一段时间里,模型和向量检索要另外搭一套服务,再把库里的数据导过去。2024 年 7 月,MySQL 9.0 带来了原生的 VECTOR 类型,云上的 MySQL HeatWave 把生成式 AI 做进了数据库。想把同样的能力留在自己机房里,企业版还有 MySQL AI 这个本地选项。有些 AI 能力,可以在 MySQL 里完成。

拥抱 AI,具体拥抱的是什么

可以分成三块来看。它们落在社区版、MySQL AI 还是 HeatWave 上,并不相同,用之前先分清,能少走弯路。

第一块,向量可以当列来存。 从 MySQL 9.0 起,表里可以有一种叫 VECTOR 的列。一个向量就是一串小数,用来表示一句话、一段文档在"意思"上的位置。意思相近的内容,这些小数也更接近。社区版可以建这种列,也能用 STRING_TO_VECTOR() 写入、用 VECTOR_TO_STRING() 读出来。它默认长度是 2048 维,上限 16383 维,每一维是一个单精度浮点数。这种列目前不能当主键或普通索引。

第二块,库里能做语义检索和问答。 DISTANCE() 用来算两个向量有多近,支持余弦、点积和欧氏距离。生成式这一侧会把 PDF、HTML、TXT、PPT、DOCX 切成小段,生成向量,存进普通的 MySQL 表。之后你用自然语言提问,sys.ML_RAG 会先找出相关段落,再交给库内的大模型组织答案,并带上引用。在 HeatWave 上,MySQL 9.5.0 起还可以把"语义相近"和"关键词命中"合在一起查。

第三块,预测类的机器学习也在库里。 AutoML 让你对一张业务表调用 sys.ML_TRAIN,比如判断一个客户会不会再次下单。训练和预测都用 SQL 完成,数据留在原来的库里。

这三块里,向量列本身从 MySQL 9.0 就有,社区版可以存、可以做格式转换。库内大模型、向量存储和 AutoML 则有两个落点:完全在本地跑,用企业版的 MySQL AI;跑在云上,用 HeatWave GenAI。

完全在本地跑,用的是 MySQL AI

如果你的需求是 AI 功能整个留在自己的机器上,对应的产品是 MySQL AI,它是 MySQL 企业版的本地部署选项。内置大模型、向量存储、AutoML 这些能力,它都带到了本地环境。模型在 CPU 上运行,不用单独配 GPU。

文档放在本机目录里即可。安装时会指定一个允许读取的目录,默认常见的是 /var/lib/mysql-files。下面这句把一份退货说明读进来,切段、编码,再写进向量表:

sql 复制代码
CALL sys.VECTOR_STORE_LOAD(
  'file:///var/lib/mysql-files/demo-directory/return-policy.pdf',
  @options
);

问法仍然是后面的 ML_EMBED_ROW、ML_RAG 和 ML_TRAIN。可以先在本地用 MySQL AI 把应用写出来。以后如果需要更好的性能和更丰富的功能,再迁到云上的 HeatWave,应用代码不用改。文档从哪读要按环境换一下路径:本地是 file:// 指向的本机目录,云上是对象存储。

它随 MySQL 企业版本地部署。当前支持 Oracle Linux 8 和 Red Hat Enterprise Linux 8,需要企业版许可。官方给出的机器参考是 32 个逻辑 CPU、128GB 内存和 512GB 磁盘。社区版适合先熟悉 VECTOR 这种列。

从提问到回答,中间发生了什么

想象一家小店的客服。顾客问:"这件衣服不合适,几天内能退?"规则写在退货说明里,顾客不会去翻那份 PDF。

MySQL AI 和 HeatWave 走的是同一条路:
#mermaid-svg-20RPWhP7VxVo2vei{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-20RPWhP7VxVo2vei .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-20RPWhP7VxVo2vei .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-20RPWhP7VxVo2vei .error-icon{fill:#552222;}#mermaid-svg-20RPWhP7VxVo2vei .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-20RPWhP7VxVo2vei .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-20RPWhP7VxVo2vei .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-20RPWhP7VxVo2vei .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-20RPWhP7VxVo2vei .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-20RPWhP7VxVo2vei .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-20RPWhP7VxVo2vei .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-20RPWhP7VxVo2vei .marker{fill:#333333;stroke:#333333;}#mermaid-svg-20RPWhP7VxVo2vei .marker.cross{stroke:#333333;}#mermaid-svg-20RPWhP7VxVo2vei svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-20RPWhP7VxVo2vei p{margin:0;}#mermaid-svg-20RPWhP7VxVo2vei .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-20RPWhP7VxVo2vei .cluster-label text{fill:#333;}#mermaid-svg-20RPWhP7VxVo2vei .cluster-label span{color:#333;}#mermaid-svg-20RPWhP7VxVo2vei .cluster-label span p{background-color:transparent;}#mermaid-svg-20RPWhP7VxVo2vei .label text,#mermaid-svg-20RPWhP7VxVo2vei span{fill:#333;color:#333;}#mermaid-svg-20RPWhP7VxVo2vei .node rect,#mermaid-svg-20RPWhP7VxVo2vei .node circle,#mermaid-svg-20RPWhP7VxVo2vei .node ellipse,#mermaid-svg-20RPWhP7VxVo2vei .node polygon,#mermaid-svg-20RPWhP7VxVo2vei .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-20RPWhP7VxVo2vei .rough-node .label text,#mermaid-svg-20RPWhP7VxVo2vei .node .label text,#mermaid-svg-20RPWhP7VxVo2vei .image-shape .label,#mermaid-svg-20RPWhP7VxVo2vei .icon-shape .label{text-anchor:middle;}#mermaid-svg-20RPWhP7VxVo2vei .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-20RPWhP7VxVo2vei .rough-node .label,#mermaid-svg-20RPWhP7VxVo2vei .node .label,#mermaid-svg-20RPWhP7VxVo2vei .image-shape .label,#mermaid-svg-20RPWhP7VxVo2vei .icon-shape .label{text-align:center;}#mermaid-svg-20RPWhP7VxVo2vei .node.clickable{cursor:pointer;}#mermaid-svg-20RPWhP7VxVo2vei .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-20RPWhP7VxVo2vei .arrowheadPath{fill:#333333;}#mermaid-svg-20RPWhP7VxVo2vei .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-20RPWhP7VxVo2vei .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-20RPWhP7VxVo2vei .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-20RPWhP7VxVo2vei .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-20RPWhP7VxVo2vei .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-20RPWhP7VxVo2vei .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-20RPWhP7VxVo2vei .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-20RPWhP7VxVo2vei .cluster text{fill:#333;}#mermaid-svg-20RPWhP7VxVo2vei .cluster span{color:#333;}#mermaid-svg-20RPWhP7VxVo2vei div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-20RPWhP7VxVo2vei .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-20RPWhP7VxVo2vei rect.text{fill:none;stroke-width:0;}#mermaid-svg-20RPWhP7VxVo2vei .icon-shape,#mermaid-svg-20RPWhP7VxVo2vei .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-20RPWhP7VxVo2vei .icon-shape p,#mermaid-svg-20RPWhP7VxVo2vei .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-20RPWhP7VxVo2vei .icon-shape .label rect,#mermaid-svg-20RPWhP7VxVo2vei .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-20RPWhP7VxVo2vei .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-20RPWhP7VxVo2vei .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-20RPWhP7VxVo2vei :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 退货说明等文档
切成小段
每段生成一个向量
向量存进 MySQL 表
顾客的问题
问题也变成向量
找出最相近的几段
段落和问题一起交给大模型
返回答案,并标明出处

大模型见过很多公开资料,未必见过你店里的退货规则。先把你自己的文档变成向量放进表里,回答时只拿相关的那几段当依据。答案会贴着你的制度走,也方便回头核对原句。

三个可以上手的例子

第一段在 MySQL 9 上就能体会向量列长什么样。后两段在 MySQL AI 和 HeatWave 上都能用,例程名字一样。向量只用了 3 维,是为了让人眼能看懂。手写的这几位小数只为演示,真实嵌入由模型生成,通常有几百维,并且要和提问用同一个模型。

1. 建一张带向量的问答表

sql 复制代码
CREATE DATABASE db_shop;
USE db_shop;

CREATE TABLE t_faq (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  question VARCHAR(200) NOT NULL,
  answer TEXT NOT NULL,
  embedding VECTOR(3) NOT NULL
);

INSERT INTO t_faq (question, answer, embedding) VALUES
('怎么退货', '签收后 7 天内可申请退货。', STRING_TO_VECTOR('[0.90, 0.10, 0.05]')),
('运费怎么算', '满 99 元包邮,否则收取 8 元。', STRING_TO_VECTOR('[0.10, 0.85, 0.15]')),
('会员有什么权益', '会员下单享 9 折,生日当月再减 20 元。', STRING_TO_VECTOR('[0.15, 0.10, 0.90]'));

SELECT id, question, VECTOR_TO_STRING(embedding) AS embedding_text
FROM t_faq;

STRING_TO_VECTOR() 吃的是带方括号的字符串,VECTOR_TO_STRING() 再把它变回人能读的样子。TO_VECTOR()、FROM_VECTOR() 分别是这两个函数的同义词。

2. 找和问题最接近的答案

在 MySQL AI 或 HeatWave 上,可以用余弦距离把"想退货"这种问法对上退货那一行。距离越小,越接近。

sql 复制代码
SET @q = STRING_TO_VECTOR('[0.88, 0.12, 0.06]');

SELECT id, question, answer,
       DISTANCE(embedding, @q, 'COSINE') AS score
FROM t_faq
ORDER BY score
LIMIT 2;

第三个参数还可以写成 'DOT' 或 'EUCLIDEAN'。这里的 score 是距离,小的排在前面。

3. 让数据库按文档回答

真实项目里,向量交给嵌入模型生成。MySQL AI 和 HeatWave 里对单句可以这样:

sql 复制代码
SET @text = '签收后 7 天内可以退货,运费满 99 元包邮。';

SELECT sys.ML_EMBED_ROW(@text, JSON_OBJECT('model_id', 'all_minilm_l12_v2'))
  INTO @text_embedding;

整表文本用 sys.ML_EMBED_TABLE。PDF 这类文件先装进向量存储:本地 MySQL AI 用上一节的 file:// 路径,云上 HeatWave 从对象存储读取。问答时指定这张向量表:

sql 复制代码
SET @query = 'What is the return window?';
SET @options = JSON_OBJECT(
  'vector_store', JSON_ARRAY('db_shop.demo_embeddings'),
  'model_options', JSON_OBJECT('language', 'en')
);

CALL sys.ML_RAG(@query, @output, @options);
SELECT JSON_PRETTY(@output);

返回的 JSON 里,text 是模型组织好的回答,citations 是它参考过的段落和距离。language 用两位语言代码,默认是 en。中文知识库先看你当前版本文档里的语言列表,再改这个值。MySQL 9.2.1 之后,检索会按嵌入模型去匹配同一套向量表,问题和文档要用同一个模型编码。

如果还想做预测,比如订单表里有一列"会不会再次购买",AutoML 是另一条路。MySQL AI 和 HeatWave 都提供这组例程:

sql 复制代码
CALL sys.ML_TRAIN(
  'db_shop.t_order',
  'will_buy_again',
  JSON_OBJECT('task', 'classification'),
  @model
);

问答靠的是"找出相似段落再生成"。预测靠的是"用历史数据学一个分类模型"。两件事都用 SQL 发起,解决的问题不一样。

适合现在就用吗

已经在用 MySQL,又希望客服、制度和产品说明能被直接问到,可以按数据能不能出机房来选。要完全在本地运行,用企业版的 MySQL AI,模型跑在 CPU 上。可以上云,就用 HeatWave GenAI。两边的问答和训练例程是同一套,本地写好的应用,以后可以不改代码迁到 HeatWave,换来更好的性能和更丰富的功能。业务数据留在 MySQL 里,SQL 仍然是入口。

本地社区版想先认识 VECTOR 这种列,用本文第一段就够了。距离计算、库内嵌入和 ML_RAG 需要 MySQL AI 或 HeatWave。向量列不能当索引,数据量上来之后,召回方式和维度要按文档再设计。这几段示例用来把路走通,上生产前还得按数据量重做一遍。

MySQL 仍然是那个存订单、跑事务的数据库。变化在于,按意思找资料、生成一段带出处的回答,也可以从同一条 SQL 会话里开始。

相关推荐
打工仔折腾 AI36 分钟前
介入式脑机接口的跨尺度解码与闭环调控:从算法落地到后端工程实践
人工智能·后端·python·深度学习·算法·ai agent 实战
SabrinaW71136 分钟前
基于 C++17 与 RTTR 的注册式对象工厂:配置驱动的动态对象创建
java·前端·数据库
Aloudata37 分钟前
Data Agent vs AI Native BI:企业数据分析的下一代入口到底是什么?
大数据·人工智能·数据分析·data·语义层
lucas_AI43 分钟前
DDVR-Net:把「字坏了」和「看不清」拆开算,历史文档识别不再靠猜
人工智能·计算机视觉
sunburn-44 分钟前
MySQL 数据库基础:从入门到熟练的完整教程
mysql·数据库开发·数据库架构
NineData44 分钟前
MySQL 迁移到 OceanBase 怎么做?NineData 全量迁移、CDC 实时同步与数据校验指南
数据库·mysql·oceanbase
FITA阿泽要努力1 小时前
/goal 命令:给 Agent 设定目标
服务器·人工智能·python·agent
standxy1 小时前
索引设计实战:pgvector HNSW × JSONB GIN × 复合索引
数据库·开发
志尊宝1 小时前
AI原生前端开发(016):端侧AI与React 19结合实战
人工智能·react.js·ai-native