Text2SQL的“底层逻辑”!手撸Ollama+Qwen3-Coder,让你彻底搞懂AI是如何写SQL的!

核心流程:

阶段步骤组件/动作描述
初始化1配置数据库和模型设置 DATABASE_CONFIG 字典,选择要使用的数据库类型(如 SQLite, MySQL),并配置 Ollama 的 API 地址和模型。
2创建数据库引擎使用 SQLAlchemy.create_engine() 根据配置的 URL 创建一个数据库引擎对象,用于后续所有数据库操作。
查询执行3用户输入接收用户的自然语言问题。
4获取数据库模式调用 SQLAlchemy.inspect() 获取所有表的名称、列信息、数据类型和主键,并格式化为文本。
5构建 Prompt将用户问题和数据库模式信息组合成一个“代码补全”式的 Prompt,强烈引导 LLM 输出 SQL 语句。
6调用 Ollama API使用 requests.post() 将构建好的 Prompt 发送给本地 Ollama 服务的 /api/generate 端点。
7解析 SQL 响应从 Ollama 返回的 JSON 中提取 response 字段,并进行清理,得到纯 SQL 语句。
8安全检查检查生成的 SQL 语句是否以 SELECTWITH 开头,确保其为只读查询,防止恶意操作。
9执行 SQL 查询使用 SQLAlchemy 引擎的 execute() 方法执行安全的 SQL 语句。
10获取查询结果从执行结果中获取所有数据行 (fetchall()) 和列名 (keys())。
11格式化并显示将列名和数据行组合成一个对齐的、易于阅读的表格形式,并打印给用户。

代码如下:(生成数据库的代码见:AI 大模型实践笔记 8:text2sql之使用langchain+qwen3+rag实现(附案例,最佳实现方式)数据准备阶段)

import requests
from sqlalchemy import create_engine, text, inspect
from sqlalchemy.exc import SQLAlchemyError
import os
# --- 配置 ---
OLLAMA_API_URL = "http://localhost:11434/api/generate"
LLM_MODEL = "qwen3-coder:30b"
# 在这里配置你的数据库连接信息
# 只需要取消注释你想要使用的数据库配置即可
DATABASE_CONFIG = {
# SQLite 配置
"sqlite": {
"url": "sqlite:///data/banking.db"
},
# # MySQL 配置示例
# "mysql": {
#     "url": "mysql+mysqlconnector://user:password@host:port/database"
# },
# # PostgreSQL 配置示例
# "postgresql": {
#     "url": "postgresql+psycopg2://user:password@host:port/database"
# }
}
# 选择要使用的数据库
DB_TYPE = "sqlite" # 可以改为 "mysql" 或 "postgresql"
DB_URL = DATABASE_CONFIG[DB_TYPE]["url"]
def get_database_schema_via_sqlalchemy(db_url: str) -> str:
"""使用 SQLAlchemy 内省功能获取数据库模式"""
try:
engine = create_engine(db_url)
inspector = inspect(engine)
schema_statements = []
table_names = inspector.get_table_names()
if not table_names:
print("警告: 数据库中没有找到任何表。")
return ""
for table_name in table_names:
columns = inspector.get_columns(table_name)
# 获取主键信息
pk_columns = inspector.get_pk_constraint(table_name)['constrained_columns']
schema_statements.append(f"-- Table: {table_name}")
schema_statements.append("-- Columns:")
for col in columns:
is_pk = " (Primary Key)" if col['name'] in pk_columns else ""
schema_statements.append(f"--   - {col['name']} ({col['type']}){is_pk}")
schema_statements.append("") # 添加空行分隔
return "\n".join(schema_statements)
except SQLAlchemyError as e:
print(f"❌ 数据库连接或内省失败: {e}")
return ""
def is_safe_sql(sql: str) -> bool:
"""简单的安全检查,确保 SQL 是只读的"""
sql_upper = sql.strip().upper()
return sql_upper.startswith('SELECT') or sql_upper.startswith('WITH')
def ask_database(question: str):
"""
接收用户问题,通过 Ollama 生成 SQL,执行并返回结果。
"""
print(f"\n{'='*50}")
print(f"用户问题: {question}")
print(f"{'='*50}\n")
try:
# 1. 获取数据库模式
print(f"--- 步骤 1: 从 {DB_TYPE} 数据库加载模式 ---")
schema = get_database_schema_via_sqlalchemy(DB_URL)
if not schema:
print("无法获取数据库模式,终止查询。")
return
# 2. 构建 "代码补全" 式的 Prompt
print("--- 步骤 2: 构建 Prompt 并请求 LLM ---")
prompt = f"""
你是一个 SQL 专家。请根据下面提供的数据库表结构,补全后面的 SQL 查询语句以回答用户的问题。
只输出补全后的 SQL 语句本身,不要包含任何解释、markdown 格式或其他任何文字。
-- 数据库表结构:
{schema}
-- 用户问题: {question}
SELECT
"""
# 3. 调用 Ollama API
payload = {
"model": LLM_MODEL,
"prompt": prompt,
"stream": False,
"options": { "temperature": 0.1 }
}
response = requests.post(OLLAMA_API_URL, json=payload)
response.raise_for_status()
generated_sql = response.json().get('response', '').strip()
generated_sql = generated_sql.replace('```sql', '').replace('```', '').strip()
print(f"生成的 SQL:\n```sql\n{generated_sql}\n```")
# 4. 安全检查并执行 SQL
print("--- 步骤 3: 执行 SQL 查询 ---")
if not is_safe_sql(generated_sql):
print("❌ 安全警告: 生成的 SQL 不是只读查询,已拒绝执行。")
return
engine = create_engine(DB_URL)
with engine.connect() as conn:
result = conn.execute(text(generated_sql))
rows = result.fetchall()
# 获取列名,用于更友好的显示
column_names = result.keys()
# 5. 格式化并显示结果
if rows:
print(f"✅ 查询成功,找到 {len(rows)} 条结果:")
# 打印列名
print(" | ".join(column_names))
print("-" * (len(" | ".join(column_names))))
# 打印每一行数据
for row in rows:
print(" | ".join(map(str, row)))
else:
print("✅ 查询成功,但没有找到任何数据。")
except requests.exceptions.ConnectionError:
print("❌ 错误: 无法连接到 Ollama 服务。请确保 Ollama 正在运行。")
except SQLAlchemyError as e:
print(f"❌ 数据库操作错误: {e}")
except Exception as e:
print(f"❌ 发生未知错误: {e}")
# --- 主程序 ---
if __name__ == "__main__":
# 确保 banking.db 存在,如果不存在则提示用户
if DB_TYPE == "sqlite" and not os.path.exists("banking.db"):
print("❌ 错误: 'banking.db' 文件不存在。请先运行数据准备脚本创建它。")
else:
questions = [
"我们一共有多少个客户?",
"列出所有申请了住房贷款的客户姓名。",
"客户 '张三' 的所有账户的总余额是多少?",
"找出所有交易金额大于 4000 的交易详情。",
"删除账户表的数据"
]
for q in questions:
ask_database(q)
print("\n" + "-"*50 + "\n")

执行结果:

思考:

1.为什么选用coder模型?经过测试,如果使用chat模型,速度会非常慢,需要几秒钟才能输出查询语句,如果使用coder模型,采用代码补全方式可以在一秒内补全出sql语句。

2.代码中第二个问题,并没有回答正确,原因是提供的资料不足,大模型不知道字段的具体值有哪几种类型,如果再提供一些描述信息,是可以回答准确的。

3.最终提供的查询结果,可以将问题、sql、查询结果,发给chat模型总结输出。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

在这里插入图片描述

要使用 OllamaQwen2.5 - VL 展示图片,可按以下步骤操作: ### 1. 安装 Ollama 首先要确保已经安装了 Ollama。可以按照官方文档的指引进行安装,在不同操作系统上安装方式有所不同。 #### macOS 系统 使用 Homebrew 进行安装: ```bash brew install ollama ``` #### Linux 系统 通过以下命令安装: ```bash curl https://ollama.com/install.sh | sh ``` ### 2. 拉取 Qwen2.5 - VL 模型 在安装好 Ollama 之后,需要拉取 Qwen2.5 - VL 模型: ```bash ollama pull qwen2.5-vl ``` ### 3. 启动 Ollama 服务 拉取模型完成后,启动 Ollama 服务: ```bash ollama serve ``` ### 4. 使用 OllamaQwen2.5 - VL 展示图片 可以使用以下 Python 代码示例来展示图片。假设已经安装了 `requests` 库,如果未安装,可以使用 `pip install requests` 进行安装。 ```python import requests import base64 # 读取图片并进行 base64 编码 with open('your_image.jpg', 'rb') as f: image_data = f.read() base64_image = base64.b64encode(image_data).decode('utf-8') # 构建请求体 data = { "model": "qwen2.5-vl", "messages": [ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{base64_image}" } }, { "type": "text", "text": "请描述这张图片" } ] } ] } # 发送请求 response = requests.post('http://localhost:11434/api/chat', json=data) # 处理响应 if response.status_code == 200: result = response.json() print(result['message']['content']) else: print(f"请求失败,状态码: {response.status_code}") ``` 将代码中的 `your_image.jpg` 替换为实际要展示的图片文件名。代码的主要逻辑是先将图片进行 base64 编码,然后构建包含图片和文本提示的请求体,最后发送请求并处理响应。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值