用 AI 让自然语言直接 “操控” 数据库:Text2SQL 的极简实践
当业务人员想查 “工程部门的薪资”,却得等开发写 SQL;当运营要加个新员工,还得翻数据库文档 —— 这些场景里,自然语言直接生成 SQL的能力,正在让数据库操作变得像聊天一样简单。
一、从 “写 SQL” 到 “说需求”:Text2SQL 的落地逻辑
我们可以用 “大模型 + 数据库” 快速实现 Text2SQL:
- 准备数据库与数据先通过 Python 连接 SQLite,创建员工表并插入测试数据:
python
运行
import sqlite3
# 连接数据库+创建员工表
conn = sqlite3.connect("test2.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, "黄佳", "销售", 50000),
(7, "宁宁", "工程", 75000),
(8, "谦谦", "销售", 60000),
(9, "悦悦", "工程", 80000),
(10, "黄仁勋", "市场", 55000),
(11, "曾繁花", "工程", 80000)
]
cursor.executemany("INSERT INTO employees VALUES (?,?,?,?)", sample_data)
conn.commit()
- 让大模型 “读懂” 表结构要让 AI 生成正确的 SQL,得先把表结构(Schema)传给它。我们可以通过
PRAGMA table_info自动获取表结构,并格式化为大模型能理解的文本:
python
运行
# 获取表结构并格式化
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)"
# 输出的schema_str示例:
# CREATE TABLE EMPLOYEES (
# id INTEGER
# name TEXT
# department TEXT
# salary INTEGER
# )
- 调用大模型生成 SQL用自然语言作为问题,结合表结构传给大模型(这里以 DeepSeek 为例),让它直接输出 SQL 语句:
python
运行
from openai import OpenAI
# 配置大模型客户端
client = OpenAI(
api_key="你的API_KEY",
base_url="https://api.deepseek.com/v1"
)
def ask_deepseek(query, schema):
prompt = f"""
这是一个数据库的Schema:
{schema}
根据这个Schema,请输出一个SQL查询来回答以下问题。
只输出SQL查询语句本身,不要使用任何Markdown格式,
不要包含反引号、代码块标记或额外说明。
问题:{query}
"""
response = client.chat.completions.create(
model="deepseek-chat",
max_tokens=2048,
messages=[{"role": "user", "content": prompt}],
temperature=0
)
return response.choices[0].message.content
二、实战:用一句话完成数据库操作
场景 1:查询数据
当业务问 “工程部门员工的姓名和工资是多少”,只需一行代码:
python
运行
question = "工程部门员工的姓名和工资是多少"
sql_query = ask_deepseek(question, schema_str)
# 大模型返回的SQL:SELECT name, salary FROM EMPLOYEES WHERE department = '工程';
# 执行查询并输出结果
results = cursor.execute(sql_query).fetchall()
print(results) # 输出:[('宁宁', 75000), ('悦悦', 80000), ('曾繁花', 80000)]
场景 2:新增数据
运营说 “在销售部门增加一个新员工,姓名为张三,工资为 45000”:
python
运行
question = "在销售部门增加一个新员工,姓名为张三,工资为45000"
sql_query = ask_deepseek(question, schema_str)
# 大模型返回的SQL:INSERT INTO EMPLOYEES (name, department, salary) VALUES ('张三', '销售', 45000);
# 执行插入并提交
cursor.execute(sql_query)
conn.commit()
场景 3:删除数据
需要 “删除市场部门的黄仁勋”:
python
运行
question = "删除市场部门的黄仁勋"
sql_query = ask_deepseek(question, schema_str)
# 大模型返回的SQL:DELETE FROM EMPLOYEES WHERE department = '市场' AND name = '黄仁勋';
# 执行删除并提交
cursor.execute(sql_query)
conn.commit()
三、AI First:不止于 Text2SQL 的未来
这种 “自然语言直接操控系统” 的模式,正是AI First理念的体现 —— 用 AI 降低技术门槛,让业务人员直接用 “说话” 的方式完成操作。
除了数据库,AI First 还能延伸到更多场景:比如 “点奶茶” 时,让 AI 帮你在美团、抖音等平台比价、领券,自动下单;或是在开发中,用自然语言生成代码、调度服务。
而像阿里云 ModelScope 这样的大模型社区,也在让 “微调模型、快速落地 AI 能力” 变得更简单 —— 未来,“用自然语言做开发、做运营” 或许会成为常态。