引言

“老板,开发部工资多少?”
“我这就查。”
——曾经需要写 SQL 的你,现在只需一句话。

在 AI 大模型(AIGC)席卷一切的时代,连我们最熟悉的 数据库操作 都正在被彻底改变。从前必须手敲 SELECT * FROM employees WHERE department = '开发' 的日子一去不复返了——如今,你只需要说一句:“开发部门员工的姓名和工资是多少?”,AI 就能自动帮你生成正确的 SQL 查询语句!

今天我们就来深入剖析:AIGC 是如何实现自然语言到 SQL 的转换? 并结合一个真实代码案例,带你一步步看懂背后的逻辑与魔法。


案例部署

1. 魔搭部署

登录魔搭社区 魔搭官网,进入 【我的】→【我的Notebook】

启动后点击【查看Notebook】,跳转至如图页面,选择Python 3 

分模块输入代码内容后点击运行,生成 text.db 数据库文件,

 2. 数据库文件 test.db 查看步骤

首次在 VScode 中下载扩展  

按下快捷键(如 Ctrl+Shift+P / Cmd+Shift+P),输入:

SQLite: Open Database

选择 .db 文件

最后按照下图步骤即可查看数据库文件


代码第一步:用 SQLite 搭建本地数据库(无需服务器!)

为什么选 SQLite?因为它简单、高效、无依赖,是微信、浏览器等 App 背后默默工作的本地存储引擎。MySQL 需要服务端部署,而 SQLite 只需一个 .db 文件,完美适配个人项目与原型验证。

代码段 1:导入模块

# 轻量级数据库
import sqlite3

导入 Python 内置的 sqlite3 模块,用于操作 SQLite 数据库。无需额外安装,开箱即用。


代码段 2:连接数据库 & 创建表

# 打开链接
conn = sqlite3.connect("test.db")
# 数据库操作的句柄
cursor = conn.cursor()

cursor.execute("""
CREATE TABLE IF NOT EXISTS employees (
 id INTEGER PRIMARY KEY,
 name TEXT,
 department TEXT,
 salary INTEGER
)
""")

逐句解析

  • sqlite3.connect("test.db"):连接名为 test.db 的数据库文件。若文件不存在,则自动创建。
  • conn.cursor():获取“游标”(cursor),它是执行 SQL 语句的操作句柄,就像数据库的“遥控器”。
  • cursor.execute(...):执行一条 SQL 语句。
  • CREATE TABLE IF NOT EXISTS employees (...):创建一张名为 employees 的表,包含四个字段:
    • id:整数类型,主键(自动递增)
    • name:文本类型,员工姓名
    • department:文本类型,所属部门
    • salary:整数类型,薪资
  • IF NOT EXISTS 确保重复运行不会报错。

关键点:SQLite 是独立于 Web 后端的本地数据库实体,适合离线或轻量场景。


代码段 3:插入测试数据

sample_data = [
 (6, "王五", "开发部", 32000),
 ( 7, "张三", "销售部", 20000),
 ( 8, "赵六", "开发部", 33000),
 ( 9, "李四", "销售部", 15000)
]
cursor.executemany('INSERT INTO employees VALUES (?, ?, ?, ?)', sample_data)
conn.commit()

逐句解析

  • 定义 sample_data 列表,包含 4 条员工记录(注意 ID 从 6 开始,可能是为了演示非连续主键)。
  • cursor.executemany(...):批量执行插入操作,效率远高于单条循环。
  • 'INSERT INTO employees VALUES (?, ?, ?, ?)':使用 ? 作为占位符,防止 SQL 注入攻击,安全又规范。
  • conn.commit()提交事务,确保所有更改永久写入数据库。若不提交,数据会丢失!

这就是经典的 CRUD 中的 “C”(Create)


代码第二步:提取数据库 Schema(给 AI 的“说明书”)

为了让大模型知道“表长什么样”,我们需要提供结构描述(Schema):

# 通过table_info 拿到employees 表的描述
# llm 生成sql 提供上下文
schema = cursor.execute("PRAGMA table_info(employees)").fetchall()
schema_str = "CREATE TABLE EMPLOYEES (\n" + "\n".join([f"{col[1]} {col[2]}" for col in schema]) + "\n)"
print("数据库Schema:")
print(schema_str)

逐句解析

  • PRAGMA table_info(employees):SQLite 特有命令,返回表的元信息(字段名、类型等)。
  • fetchall():获取所有行结果。
  • 构造 schema_str 字符串,模拟标准 CREATE TABLE 语句格式,便于 LLM 理解。
  • 最终输出类似:
    CREATE TABLE EMPLOYEES (
    id INTEGER
    name TEXT
    department TEXT
    salary INTEGER
    )
    

💡 为什么需要 Schema?
因为 LLM 不知道你的表叫什么、有哪些字段。提供 Schema 就像给翻译官一本词典,让它能准确“转译”。


代码第三步:调用 DeepSeek 大模型,实现“自然语言 → SQL”

现在进入 AIGC 的核心环节——让 AI 根据你的中文问题,生成可执行的 SQL。

代码段 4:配置 DeepSeek API 客户端

from openai import OpenAI
client = OpenAI(
 api_key='sk-c031736e926b4608ba8603be5750d572',
 base_url='https://api.deepseek.com/v1'
)

逐句解析

  • 导入兼容 OpenAI 协议的客户端(DeepSeek 支持该协议)。
  • 初始化 client,指定:
    • api_key完全保留原始值(实际使用请替换为自己的密钥!)
    • base_url:指向 DeepSeek 的 API 入口

注意:此 API Key 仅为示例,请勿在公开场合泄露真实密钥!

API Key获取地址DeepSeek 开放平台


代码段 5:定义 AIGC 生成函数(核心魔法!)

def ask_deepseek(query, schema):
 prompt = f"""
 这是一个数据库的Schema:
 {schema}
 根据这个Schema,你能输出一个SQL查询来回答以下问题吗?
 只输出SQL查询,不要输出任何内容,也不要带任何格式
 问题:{query}
 """
 # print(prompt)
 response = client.chat.completions.create(
 model="deepseek-reasoner",
 max_tokens=2048,
 messages=[{
  "role": "user",
  "content": prompt
 }]
 )
 return response.choices[0].message
 
# ask_deepseek("开发部部门员工的姓名和工资是多少?", schema)
question = "开发部部门员工的姓名和工资是多少?"
sql = ask_deepseek(question, schema_str)
print("生成的sql查询:")
print(sql)
1. 函数定义
def ask_deepseek(query, schema):

接收两个参数:

  • query:用户的自然语言问题(如“开发部...”)
  • schema:数据库结构描述
2. 构造 Prompt(提示词工程的核心!)
prompt = f"""
 这是一个数据库的Schema:
 {schema}
 根据这个Schema,你能输出一个SQL查询来回答以下问题吗?
 只输出SQL查询,不要输出任何内容,也不要带任何格式
 问题:{query}
 """
  • 明确告诉 AI 当前数据库结构
  • 强调指令:“只输出 SQL 查询,不要输出任何内容,也不要带任何格式
  • 这种约束极大提升了输出的可用性——避免 AI 添加解释、Markdown 或多余字符
3. 调用大模型 API
response = client.chat.completions.create(
 model="deepseek-reasoner",
 max_tokens=2048,
 messages=[{
  "role": "user",
  "content": prompt
 }]
)
  • 使用 deepseek-reasoner 模型(专为逻辑推理优化)
  • 设置足够长的 max_tokens,避免截断复杂 SQL
  • 以标准 Chat 格式发送请求
4. 返回结果
return response.choices[0].message

获取 AI 生成的第一条回复内容(即纯 SQL 字符串)

5. 实际调用
question = "开发部部门员工的姓名和工资是多少?"
sql = ask_deepseek(question, schema_str)
print("生成的sql查询:")
print(sql)
  • 提问关于“开发部”的员工信息
  • 打印 AI 生成的 SQL

这就是 AIGC 的魔力:将人类语言(Human Language)翻译成机器语言(SQL),实现 自然语义数据库操作

6. 输出示例
SELECT name, salary FROM employees WHERE department = '开发';

🎉 成功!AI 把中文问题准确地翻译成了标准 SQL!


AIGC 如何“理解”并生成 SQL?

让我们深入看看 AI 是怎么做到这一点的:

1. 上下文感知(Context Awareness)

AI 看到了完整的 Schema,知道:

  • 表名叫 employees
  • 字段有:namedepartmentsalary
  • department 是字符串类型

2. 意图识别(Intent Recognition)

AI 分析问题:“开发部门员工的姓名和工资是多少?”

  • 关键词提取:开发部门 → 对应 department = '开发'
  • 查询目标:姓名和工资 → 对应 name, salary

3. 语法生成(Grammar Generation)

AI 根据 SQL 语法规则,组合出:

SELECT name, salary 
FROM employees 
WHERE department = '开发';

🤯 整个过程就像一位“数据库翻译官”:把人的语言翻译成机器能懂的语言。


未来展望:AIGC + 数据库 = 新一代生产力工具

传统方式 AIGC 方式
必须记住表名、字段名 自动识别字段
容易写错 SQL 几乎零错误率
需要调试 一键生成

未来的趋势将是:

  • 低代码/无代码平台 中集成 AI SQL 生成器
  • 数据分析人员 无需学习 SQL,也能高效查询
  • 智能助手 可实时回答业务问题(如:“本月销售额最高的产品是哪个?”)

结语:数据库不再高冷,人人都是数据分析师

过去,数据库是程序员的专属领域;
今天,借助 AIGC,任何人都可以用自然语言与数据对话。

🔥 从“写 SQL”到“说中文”
这不是技术的进步,而是认知的解放。

当你下次再问:“开发部工资多少?”时,别忘了——
背后可能正有一个 AI 在默默为你生成 SQL。


附录:

1. 完整可运行代码(Python + DeepSeek)

源码地址:python/text2sql/text2sql.ipynb · Zou/lesson_zp - 码云 - 开源中国

# 轻量级数据库
import sqlite3

# 打开链接
conn = sqlite3.connect("test.db")
# 数据库操作的句柄
cursor = conn.cursor()

cursor.execute("""
CREATE TABLE IF NOT EXISTS  employees (
    id INTEGER PRIMARY KEY,
    name TEXT,
    department TEXT,
    salary INTEGER
)
""")

sample_data = [
    (6, "王五", "开发部", 32000),
    ( 7, "张三", "销售部", 20000),
    ( 8, "赵六", "开发部", 33000),
    ( 9, "李四", "销售部", 15000)
]
cursor.executemany('INSERT INTO employees VALUES (?, ?, ?, ?)', sample_data)
conn.commit()

from openai import OpenAI
client = OpenAI(
    api_key='sk-c031736e926b4608ba8603be5750d572',
    base_url='https://api.deepseek.com/v1'
)

# 通过table_info 拿到employees 表的描述
# llm 生成sql 提供上下文
schema = cursor.execute("PRAGMA table_info(employees)").fetchall()
schema_str = "CREATE TABLE EMPLOYEES (\n" + "\n".join([f"{col[1]} {col[2]}" for col in schema]) + "\n)"
print("数据库Schema:")
print(schema_str)

def ask_deepseek(query, schema):
    prompt = f"""
    这是一个数据库的Schema:
    {schema}
    根据这个Schema,你能输出一个SQL查询来回答以下问题吗?
    只输出SQL查询,不要输出任何内容,也不要带任何格式
    问题:{query}
    """
    # print(prompt)
    response = client.chat.completions.create(
        model="deepseek-reasoner",
        max_tokens=2048,
        messages=[{
            "role": "user",
            "content": prompt
        }]
    )
    return response.choices[0].message
    
# ask_deepseek("开发部部门员工的姓名和工资是多少?", schema)
question = "开发部部门员工的姓名和工资是多少?"
sql = ask_deepseek(question, schema_str)
print("生成的sql查询:")
print(sql)
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐