ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AI-Agent时代-SQL与向量数据库-学习笔记-CSDN版

AI-Agent时代-SQL与向量数据库-学习笔记-CSDN版 AI Agent 时代,SQL 会被 AI 取代吗?——SQL×AI 结合路径的学习笔记这是一篇学习笔记,记录我对「AI Agent 时代数据库查询语言未来」的完整思考:① SQL 如何与 AI 结合并落地应用;② SQL 会不会被自然语言彻底取代、会不会出现新查询语言;③ SQL 与向量数据库之间到底是什么关系。适合正在学习 AI 应用、数据工程、RAG 的同学阅读,也欢迎交流指正。1. 背景:AI Agent 时代,数据访问方式正在被重写过去十年,企业取数的标准姿势是:业务提需求 → 数据同学写 SQL → 跑数 → 做报表 → 业务看报表而 AI Agent 时代,这个链路正在变成:业务直接问(自然语言) → AI 理解意图 → 自动写 SQL / 查数据 → 返回答案或图表随之而来的一类产品叫ChatBI / Data Agent / 智能问数(如 Aloudata Agent、火山引擎 Data Agent、阿里云 DMS ChatBI 等),它们背后最核心的技术就是Text-to-SQL(自然语言转 SQL)。与此同时,向量数据库因为大模型(RAG)爆发而成为 2023 年以来最火的数据基础设施之一。于是很多人开始困惑:SQL 是不是要被 AI 淘汰了?以后是不是用自然语言就能查数据,不用学 SQL 了?会不会出现一种全新的查询语言?向量数据库和 SQL 是替代关系还是共存关系?这篇文章用「学习笔记」的方式,把这些问题逐一拆开讲清楚。2. 先给结论(TL;DR)问题我的结论SQL 会被 AI 取代吗?不会被消灭,但会被 “封装”:从「人写 SQL」变成「AI 写 SQL + 人审 SQL」AI 与 SQL 怎么结合?Text-to-SQL → SQL Agent → 语义层(DSL),三层递进,已经大量落地会产生新查询语言吗?会涌现更多 DSL(PRQL、Malloy、语义层语言),但大多编译回 SQL 或与 SQL 共存,SQL 是 “事实内核”SQL 和向量数据库什么关系?不是替代,是互补:SQL 管精确查询,向量检索管语义相似,最终走向统一引擎(如 pgvector 这类 “SQL 里加向量” 的路线)未来的 AI 数据栈会怎样?五层架构:交互 → 语义层 → Agent 编排 → 统一查询引擎 → 数据底座;语义层是最大增量(详见第 7 节)一句话版本:AI 不会杀死 SQL,而是成为 SQL 的 “翻译官、执行者、监督者”;向量数据库也不是 SQL 的敌人,而是 SQL 生态的 “新数据类型 + 新算子”。3. 为什么说 SQL 是 “旧而不死” 的语言在谈 “取代” 之前,先想清楚 SQL 为什么能活 40 多年。SQL 1974 年诞生于 IBM System R 项目,至今仍是数据世界的 “普通话”,原因如下:3.1 声明式:只说什么,不说怎么做SELECT category, SUM(amount) AS total FROM orders WHERE created\_at = '2026-07-01' GROUP BY category ORDER BY total DESC;你不需要告诉数据库 “先扫哪张表、用什么索引、怎么分组”。优化器(CBO)自己决定执行计划。这种声明式抽象天然适合让另一个程序(AI)来生成 —— 因为 AI 只需要负责 “说什么”,执行细节全交给数据库。3.2 事实标准 + 完整生态所有主流数据库(PostgreSQL、MySQL、SQL Server、Oracle、Doris、ClickHouse……)都讲 SQL;BI 工具、ETL 工具、ORM 框架、数据治理平台全部建立在 SQL 之上;全世界的 DBA、数据工程师都在用同一套语言协作。3.3 可优化、可审计、可验证SQL 可以被EXPLAIN分析执行计划、被索引优化、被权限系统约束、被审计日志追踪。这些特性正是 AI 时代最需要的:AI 生成的 SQL可以被 review(人查得懂);AI 生成的 SQL可以加权限和资源限制(只读、限时、限量);AI 生成的 SQL可以被精确评估(跑基准测试就知道对不对)。3.4 小结SQL 最大的护城河不是 “语法本身”,而是它作为可执行的精确契约存在了几十年,积累了不可替代的生态和治理能力。AI 时代它不会被推翻,而是会成为 AI 访问数据的 “标准中间语言”。4. AI 与 SQL 结合的五种形态(重点,含代码)4.1 形态一:Text-to-SQL—— 让 LLM 直接写 SQL一句话:用户说人话,模型输出 SQL,程序执行后返回结果。这是最基础、落地最多的形态。架构示意:用户自然语言提问大模型生成的 SQL数据库结果返回给用户示例 1:用 LangChain 实现(最简单的框架版)from langchain\_community.utilities import SQLDatabase from langchain\_core.prompts import ChatPromptTemplate from langchain\_openai import ChatOpenAI db = SQLDatabase.from\_uri("sqlite:///demo.db") llm = ChatOpenAI(model="gpt-4o") prompt = ChatPromptTemplate.from\_template( #x20; "根据如下问题写 SQL,只输出 SQL 本身:\n问题:{question}\n表结构:{schema}" ) chain = prompt | llm question = "今年上半年每个月的销售额是多少?" sql = chain.invoke({"question": question, "schema": db.get\_table\_info()}) print(sql)示例 2:OpenAI Function Calling 手写版(理解原理更关键)import json from openai import OpenAI client = OpenAI() tools = \[{ #x20; "type": "function", #x20; "function": { #x20; "name": "query\_database", #x20; "description": "执行一条只读 SQL 并返回结果", #x20; "parameters": { #x20; "type": "object", #x20; "properties": { #x20; "sql": {"type": "string", "description": "合法的只读 SQL"} #x20; }, #x20; "required": \["sql"], #x20; }, #x20; }, }] resp = client.chat.completions.create( #x20; model="gpt-4o", #x20; messages=\[{"role": "user", "content": "本月订单总量是多少?"}], #x20; tools=tools, ) \# 模型返回的不是答案,而是"应该调用什么函数、参数是什么" print(resp.choices\[0].message.tool\_calls)当前水平(2025-2026 实测数据,来源见文末):基准说明最新 SOTA 执行准确率Spider 1.0单库、相对规范的多轮问答约 89.75%(MARS-SQL,2025.11)BIRD真实数据库 + 更复杂的 SQL约 77.84%(MARS-SQL)Spider 2.0企业级真实工作流、脏数据、权限基于 o1-preview 的 agent 框架仅约 21.3%结论:学术高分 ≠ 生产可用。Spider 1.0 上 90% 的准确率,一到 “表很脏、库很多、权限复杂” 的企业环境就掉到 20% 出头。这也是为什么光有 Text-to-SQL 不够,还需要下面的形态。提示:本文中的 Mermaid 图(Mermaid 语法代码块)在部分本地预览器里不会渲染成图,CSDN 会自动渲染;代码块本身不影响阅读。4.2 形态二:SQL Agent—— 把 “写 SQL” 升级成 “能自我纠错的 Agent”一句话:Text-to-SQL 是 “一次性翻译”,SQL Agent 是 “翻译 + 检查 + 改错 + 多步推理”。Agent 可以:先看库表结构(information_schema)再生成 SQL;执行后看报错,自己改 SQL 重试;一次回答拆成多个查询(比如 “对比华东和华南的销量”);调用工具链:SQL 执行器、Excel 导出、图表生成、邮件发送。工具列表式提示词(常见做法):可用工具: 1\. list\_tables —— 列出所有表 2\. describe\_table(table\_name) —— 查看表结构 3\. run\_readonly\_sql(sql) —— 执行只读 SQL 4\. get\_schema\_comment(table) —— 获取字段业务注释 规则:先看表结构再写 SQL;SQL 必须只读;报错后根据错误信息修改重试。一个简化版 SQL Agent 骨架:class SQLAgent: #x20; def \_\_init\_\_(self, llm, db): #x20; self.llm = llm #x20; self.db = db #x20; def run(self, question: str, max\_retry: int = 2) - dict: #x20; \# ① 先感知 schema #x20; schema = self.db.get\_table\_info() #x20; sql = self.llm.generate\_sql(question, schema) #x20; for attempt in range(max\_retry + 1): #x20; ok, result, error = self.db.execute\_readonly(sql) #x20; if ok: #x20; return {"sql": sql, "result": result} #x20; \# ② 把报错喂回给模型,让它改 SQL #x20; sql = self.llm.repair\_sql(question, sql, error, schema) #x20; return {"error": error, "sql": sql}业界动态:2025 年各大云厂商(阿里云 DMS、火山引擎、腾讯云等)陆续把 “单次问数” 升级为 “Data Agent / 智能问数” 产品,本质就是形态一 + 形态二的工程化组合。4.3 形态三:RAG + SQL——“自然语言 → 检索 → 再生成 SQL”一句话:当数据库很大、表很多时,让 LLM 先 “查资料” 再 “写 SQL”:先用 RAG 检索出相关的表、字段、SQL 范例作为上下文,再让 LLM 生成 SQL。这也是 2025 年 Text-to-SQL 工程化的标准姿势。流程:
返回列表