用 AI 让自然语言直接 “操控” 数据库:Text2SQL 的极简实践

82 阅读3分钟

用 AI 让自然语言直接 “操控” 数据库:Text2SQL 的极简实践

当业务人员想查 “工程部门的薪资”,却得等开发写 SQL;当运营要加个新员工,还得翻数据库文档 —— 这些场景里,自然语言直接生成 SQL的能力,正在让数据库操作变得像聊天一样简单。

一、从 “写 SQL” 到 “说需求”:Text2SQL 的落地逻辑

我们可以用 “大模型 + 数据库” 快速实现 Text2SQL:

  1. 准备数据库与数据先通过 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()
  1. 让大模型 “读懂” 表结构要让 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
# )
  1. 调用大模型生成 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 能力” 变得更简单 —— 未来,“用自然语言做开发、做运营” 或许会成为常态。