基于大模型的自然语言数据库查询实现指南
使用大模型(LLM)通过自然语言生成 SQL 语句,从结构化数据库中获取结果,是目前大模型与数据交互的主流形式之一。这种技术通常被称为 Text-to-SQL 或 NL2SQL(Natural Language to SQL)。它极大地降低了非技术人员访问数据的门槛,使得业务人员可以直接通过对话方式查询数据。
本文将详细介绍如何使用 Python 生态中的 LlamaIndex、SQLAlchemy 以及本地或云端大模型,构建一个支持自然语言查询数据库的系统。我们将涵盖环境搭建、数据准备、基础查询、流式输出、模糊查询优化以及安全注意事项等完整流程。
一、核心原理概述
Text-to-SQL 的基本流程如下:
- 上下文注入:将数据库的 DDL(建表语句)作为上下文信息提供给大模型,使其理解表结构、字段含义及关系。
- 意图识别与 SQL 生成:大模型接收用户的自然语言问题,结合表结构,生成对应的 SQL 查询语句。
- 执行与反馈:系统执行生成的 SQL,获取结果集,并将结果再次输入大模型,由大模型将数据转换为自然语言回答。
以下是一个简单的示例场景:存储朝阳区高中学校招生信息的数据库,用户提问 陈经纶招多少人?,系统大致处理步骤为:
- 数据库 DDL 加入对话上下文,主要是建表语句,让大模型感知表结构。
- 大模型将提示词转化为 SQL 查询语句,例如
select * from school_info where school_name like '%陈经纶%'。 - 大模型根据 SQL 查询结果,生成自然语言的回答,例如
北京市陈经纶中学招收的学生人数为 279 名。
二、环境准备与依赖安装
在开始之前,需要准备好开发环境。推荐使用 Jupyter Notebook 或 JupyterLab 进行交互式开发。
1. 基础依赖
我们需要安装以下核心库:
pip install llama-index sqlalchemy pandas ollama openai
llama-index: 用于连接 LLM 和外部数据源的核心框架。sqlalchemy: ORM 工具,用于定义数据库结构和操作记录。pandas: 用于数据处理和展示。ollama: 用于运行本地大模型。openai: 兼容 OpenAI API 格式的客户端,用于调用云端或本地兼容接口。
2. 模型配置
本文演示同时支持本地模型(通过 Ollama)和云端模型(通过 One-API 或类似网关)。
- 本地模型:需确保 Ollama 服务已启动,并拉取相应模型(如 qwen2, llama3 等)。
- 云端模型:需配置 API Key 和 Base URL。
三、数据准备与建模
我们使用 SQLAlchemy 在内存 SQLite 数据库中创建示例表和相关记录。SQLite 轻量且无需额外服务器,适合演示。
1. 建立连接和表结构
from sqlalchemy import (
create_engine,
MetaData,
Table,
Column,
String,
Integer,
insert,
)
# 创建内存数据库引擎
engine = create_engine("sqlite:///:memory:")
metadata_obj = MetaData()
# 创建学校信息表结构
table_name =
school_info_table = Table(
table_name,
metadata_obj,
Column(, String(), primary_key=),
Column(, Integer, nullable=),
)
metadata_obj.create_all(engine)


