用 llm + SQLite 实现自然语言到 SQL 的智能转换:一个实战案例

在日常开发中,我们经常需要从数据库中查询数据。但对非技术人员来说,写 SQL 查询语句可能是个"噩梦"。而随着大模型的兴起,将自然语言直接转化为 SQL 查询已成为现实。

今天,我将结合 DeepSeek Reasoner 模型SQLite 数据库 ,展示如何通过一段简单的 Python 代码,实现"你说中文,我出 SQL"的自动化能力。


🧩 项目目标

给定一个简单的员工信息表,用户输入自然语言问题(如:"开发部门员工的姓名和工资是多少?"),程序自动解析并生成对应的 SQL 查询语句。


🔧 环境准备

我们使用轻量级的 SQLite 数据库,并接入 DeepSeek 的 API 来完成自然语言理解与 SQL 生成任务。

1. 创建数据库表

python 复制代码
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
)
""")

✅ 这一步创建了一个名为 employees 的表,包含员工编号、姓名、部门和工资字段。


2. 插入测试数据

scss 复制代码
sample_data = [    (6, "王五", "开发部", 32000),    (7, "张三", "销售部", 20000),    (8, "老六", "开发部", 33000),    (9, "李四", "销售部", 15000)]

cursor.executemany("INSERT INTO employees VALUES(?,?,?,?)", sample_data)
conn.commit()

💡 插入了4条测试数据,涵盖两个部门:开发部和销售部。


3. 获取数据库 Schema

为了让 LLM 理解表结构,我们需要把表的 schema 提供给模型:

python 复制代码
# 通过 table_info 拿到 employees 表的描述
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)

输出结果类似:

sql 复制代码
CREATE TABLE EMPLOYEES (
id INTEGER
name TEXT
department TEXT
salary INTEGER
)

📌 这个 schema 将作为上下文传给 DeepSeek 模型,帮助它理解字段含义。


4. 调用 DeepSeek 生成 SQL

现在,我们调用 DeepSeek 的 API,让模型根据自然语言生成 SQL 查询。

ini 复制代码
from openai import OpenAI

client = OpenAI(
    api_key='',//这里写入自己的apikey
    base_url='https://api.deepseek.com/v1'
)

def ask_deepseek(query, schema):
    prompt = f"""这是一个数据库的Schema:
{schema}
根据这个Schema,你能输出一个SQL查询来回答以下问题吗?
只输出SQL查询,不要输出任何内容,也不要带任何格式。
问题:{query}
"""
    response = client.chat_completions.create(
        model="deepseek-reasoner",
        max_tokens=2048,
        messages=[
            {"role": "user", "content": prompt}
        ]
    )
    return response.choices[0].message.content

# 示例提问
question = "开发部门员工的姓名和工资是多少?"
sql = ask_deepseek(question, schema_str)
print("生成的sql查询:")
print(sql)

✅ 预期输出

运行上述代码后,你可能会得到如下 SQL 查询:

ini 复制代码
SELECT name, salary FROM employees WHERE department = '开发部';

🎉 完美!模型成功理解了"开发部门"对应的是 department = '开发部',并返回了正确的字段选择。


🚀 技术亮点解析

特性 说明
自然语言 → SQL 利用 LLM 的理解能力,无需人工编写复杂查询
Schema 上下文注入 让模型知道表结构,避免误读字段名
轻量级部署 使用 SQLite,无需复杂数据库环境
可扩展性强 可轻松接入其他数据库或前端界面

🛠️ 应用场景建议

  • 低代码平台:让用户用自然语言查询数据
  • 内部报表工具:非技术人员也能快速获取数据
  • 教学辅助:帮助学生理解 SQL 逻辑
  • 自动化脚本:集成到工作流中,提升效率

📌 总结

通过本次实践,我们展示了如何利用 llm ,结合 SQLite 数据库,构建一个简单却强大的"自然语言转 SQL"系统。整个流程清晰、易于复现,适合初学者上手,也具备实际应用价值。

相关推荐
肥晨7 分钟前
智能体(Agent)全面解析:什么是智能体agent
agent
jerrywus20 分钟前
前端老哥的救命稻草:用 Obsidian 搞定 Claude Code 的「金鱼记忆」
前端·agent·claude
南山安29 分钟前
手写 Cursor 核心原理:从 Node.js 进程到智能 Agent
人工智能·agent·设计
AlienZHOU1 小时前
为 AI Agent 编写高质量 Skill:Claude 官方指南
agent·ai编程·claude
KaneLogger3 小时前
【翻译】打造 Agent Skills 的最佳实践
agent·ai编程·claude
QCY3 小时前
「完全理解」1 分钟实现自己的 Coding Agent
前端·agent·claude
mCell4 小时前
从零构建一个 Mini Claude Code:面向初学者的 Agent 开发实战指南
typescript·agent·claude
雮尘4 小时前
如何在非 Claude IDE (TARE、 Cursor、Antigravity 等)下使用 Agent Skills
前端·agent·ai编程
会写代码的柯基犬4 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
叁两8 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent