通义千问1.5-1.8B-Chat-QTQ-Int4 WebUI与MySQL集成实战智能数据库查询助手你有没有遇到过这种情况市场部的同事想查一下“上个月哪个产品卖得最好”或者运营同学想知道“最近一周新注册的用户都来自哪些城市”。他们不懂SQL只能跑来求助技术团队。一来一回沟通成本高效率也低。如果能让他们直接用大白话提问系统自动理解、生成SQL、执行查询最后再用大白话把结果“翻译”回来那该多方便。今天我们就来动手实现这样一个“智能数据库查询助手”。我们将使用通义千问1.5-1.8B-Chat-QTQ-Int4这个轻量级大模型结合一个简单的Web界面与MySQL数据库打通让非技术人员也能轻松玩转数据查询。1. 项目目标与核心思路这个项目的核心目标很明确降低数据库查询的门槛。我们不是要做一个复杂的商业智能BI系统而是一个轻量、快速、针对特定业务库的智能查询工具。它的工作流程就像一个有经验的数据库管理员在帮你干活你提问用自然语言说出你的需求比如“帮我找出库存低于10件的所有商品”。助手理解并翻译背后的通义千问模型会分析你的问题结合它知道的数据库表结构比如有products表表里有stock字段生成一条标准的SQL语句SELECT * FROM products WHERE stock 10。安全执行系统会对生成的SQL进行基本的安全检查和语法校验确认没问题后才在MySQL中执行。结果解读拿到原始的数据库查询结果可能是一堆数字和代码后模型再次上场把它转换成一句人话告诉你“目前有5件商品的库存不足10件分别是XXX...”。整个过程中用户只需要在网页上输入问题点击按钮然后看结果就行完全不需要接触任何数据库专业知识。2. 环境搭建与准备工作工欲善其事必先利其器。我们先来把需要的“工具”准备好。2.1 MySQL数据库安装与配置既然要和MySQL交互首先得有一个MySQL数据库。如果你还没有跟着下面的步骤快速安装一个。这里以Ubuntu系统为例用最常用的apt包管理器来安装# 更新软件包列表 sudo apt update # 安装MySQL服务器 sudo apt install mysql-server -y # 安装完成后运行安全配置脚本 sudo mysql_secure_installation运行安全配置脚本时它会问你几个问题是否设置验证密码插件一般选“是”。设置root用户的密码。是否移除匿名用户强烈建议选“是”。是否禁止root远程登录如果只是本地开发可以选“否”生产环境建议“是”。是否移除测试数据库建议“是”。是否立即重新加载权限表选“是”。安装完成后启动MySQL服务并设置开机自启sudo systemctl start mysql sudo systemctl enable mysql现在用root用户登录MySQL为我们接下来的演示创建一个测试数据库和表sudo mysql -u root -p输入你刚才设置的密码进入MySQL命令行。然后执行以下SQL-- 创建一个名为 smart_query_demo 的数据库 CREATE DATABASE smart_query_demo; USE smart_query_demo; -- 创建一张模拟电商的products产品表 CREATE TABLE products ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, category VARCHAR(50), price DECIMAL(10, 2), stock INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 创建一张sales销售记录表 CREATE TABLE sales ( id INT AUTO_INCREMENT PRIMARY KEY, product_id INT, quantity INT, sale_date DATE, FOREIGN KEY (product_id) REFERENCES products(id) ); -- 插入一些示例数据 INSERT INTO products (name, category, price, stock) VALUES (智能手机X, 电子产品, 2999.99, 45), (蓝牙耳机, 电子产品, 399.50, 120), (棉质T恤, 服装, 89.00, 15), (咖啡机, 家用电器, 1250.00, 8), (编程书籍, 图书, 99.00, 200); INSERT INTO sales (product_id, quantity, sale_date) VALUES (1, 5, 2024-04-15), (2, 20, 2024-04-16), (1, 3, 2024-04-17), (3, 8, 2024-04-16), (4, 2, 2024-04-18), (5, 15, 2024-04-19); -- 创建一个专门用于本应用的非root用户并授予必要权限 CREATE USER query_botlocalhost IDENTIFIED BY YourSecurePassword123!; GRANT SELECT ON smart_query_demo.* TO query_botlocalhost; FLUSH PRIVILEGES; -- 退出 EXIT;好了现在我们的“数据土壤”已经准备好了。记住我们创建的数据库名smart_query_demo、用户名query_bot和密码后面会用到。2.2 Python环境与依赖库安装我们的智能助手将用Python来写。确保你的Python版本在3.8以上。然后我们创建一个项目目录并安装必要的Python包。# 创建一个项目文件夹 mkdir smart_db_assistant cd smart_db_assistant # 创建虚拟环境推荐避免包冲突 python3 -m venv venv source venv/bin/activate # Linux/Mac # 在Windows上使用: venv\Scripts\activate # 安装核心依赖 pip install fastapi uvicorn # Web框架和服务器 pip install pymysql sqlalchemy # MySQL连接和ORM工具 pip install transformers torch # 用于加载通义千问模型 pip install python-dotenv # 管理环境变量这里简单说一下这几个包的作用fastapi和uvicorn用来快速搭建我们的Web界面和API。pymysql和sqlalchemy连接和操作MySQL数据库。transformers和torch这是加载和运行通义千问模型的核心。python-dotenv把数据库密码、模型路径等敏感信息放在环境变量里更安全。3. 核心模块设计与实现环境准备好后我们来搭建这个助手的“大脑”和“躯干”。主要分为三个部分模型加载、数据库连接、以及最重要的“大脑”——Prompt工程与SQL生成逻辑。3.1 加载通义千问模型我们选用通义千问1.5-1.8B-Chat-QTQ-Int4版本因为它体积相对较小量化后推理速度快并且在对话和指令跟随任务上表现不错非常适合我们这种特定场景。创建一个叫model_loader.py的文件from transformers import AutoTokenizer, AutoModelForCausalLM import torch def load_qwen_model(model_path./models/Qwen1.5-1.8B-Chat-QTQ-Int4): 加载通义千问模型和分词器。 假设模型已经下载到本地的 ./models/ 目录下。 print(正在加载通义千问模型...) # 加载分词器 tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) # 加载模型。device_mapauto会让Transformers自动分配模型层到CPU/GPU model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.float16, # 使用半精度浮点数节省内存 device_mapauto, trust_remote_codeTrue ) # 设置为评估模式关闭dropout等训练层 model.eval() print(模型加载完毕) return model, tokenizer if __name__ __main__: # 简单测试一下加载 model, tokenizer load_qwen_model() # 可以尝试一个简单的生成 test_input 你好请介绍一下你自己。 inputs tokenizer(test_input, return_tensorspt).to(model.device) with torch.no_grad(): outputs model.generate(**inputs, max_new_tokens50) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))注意你需要提前从ModelScope或Hugging Face Hub将Qwen1.5-1.8B-Chat-QTQ-Int4模型下载到本地的./models/目录下。运行这个脚本可以测试模型是否加载成功。3.2 构建数据库连接与Schema获取要让模型知道数据库里有什么我们必须告诉它表结构。我们写一个模块来自动获取这些信息。创建一个database.py文件from sqlalchemy import create_engine, MetaData, inspect, text from sqlalchemy.orm import sessionmaker import pymysql from dotenv import load_dotenv import os # 加载.env文件中的环境变量 load_dotenv() class DatabaseManager: def __init__(self): # 从环境变量读取数据库配置更安全 self.db_host os.getenv(DB_HOST, localhost) self.db_user os.getenv(DB_USER, query_bot) self.db_password os.getenv(DB_PASSWORD, YourSecurePassword123!) self.db_name os.getenv(DB_NAME, smart_query_demo) # 创建数据库连接字符串 self.connection_string fmysqlpymysql://{self.db_user}:{self.db_password}{self.db_host}/{self.db_name} # 创建SQLAlchemy引擎和会话 self.engine create_engine(self.connection_string) self.SessionLocal sessionmaker(autocommitFalse, autoflushFalse, bindself.engine) # 元数据对象用于获取表结构 self.metadata MetaData() self.metadata.reflect(bindself.engine) def get_session(self): 获取一个数据库会话 return self.SessionLocal() def get_database_schema(self): 获取当前数据库的完整Schema描述。 返回一个易于模型理解的字符串格式。 inspector inspect(self.engine) schema_description 当前数据库包含以下表\n\n for table_name in inspector.get_table_names(): schema_description f表名: {table_name}\n columns inspector.get_columns(table_name) for col in columns: # 简化类型显示 col_type str(col[type]).split(()[0] if ( in str(col[type]) else str(col[type]) schema_description f - 列: {col[name]} (类型: {col_type}) if col.get(primary_key): schema_description [主键] if col.get(nullable) is False: schema_description [非空] schema_description \n # 获取外键信息对于理解表关系很重要 foreign_keys inspector.get_foreign_keys(table_name) if foreign_keys: schema_description 外键关系:\n for fk in foreign_keys: schema_description f - {fk[constrained_columns]} - {fk[referred_table]}.{fk[referred_columns]}\n schema_description \n return schema_description def execute_safe_query(self, sql: str, sessionNone): 安全地执行SQL查询。 包含基本的SQL注入防护只允许SELECT语句。 sql_upper sql.strip().upper() # 安全过滤只允许SELECT开头的查询语句 if not sql_upper.startswith(SELECT): raise ValueError(出于安全考虑只允许执行SELECT查询语句。) # 简单的危险关键词过滤非常基础的防护 dangerous_keywords [DROP, DELETE, INSERT, UPDATE, ALTER, CREATE, TRUNCATE] for keyword in dangerous_keywords: if f {keyword} in f {sql_upper} : raise ValueError(f查询语句中包含潜在的危险操作 {keyword}已被阻止。) # 执行查询 close_session False if session is None: session self.get_session() close_session True try: result session.execute(text(sql)) # 将结果转换为字典列表方便后续处理 columns result.keys() rows [dict(zip(columns, row)) for row in result.fetchall()] return rows finally: if close_session: session.close() # 单例模式全局一个数据库管理器实例 db_manager DatabaseManager() if __name__ __main__: # 测试数据库连接和Schema获取 print(数据库Schema信息) print(db_manager.get_database_schema()) # 测试一个简单查询 test_sql SELECT name, price FROM products WHERE stock 10 results db_manager.execute_safe_query(test_sql) print(f\n测试查询结果{results})这个类做了几件关键事安全地连接数据库、自动分析所有表结构并生成描述、以及提供一个带有基础安全过滤的查询执行方法。生成的Schema描述字符串就是我们等下要喂给模型的“数据库说明书”。3.3 Prompt工程与SQL生成逻辑这是整个项目的“大脑中枢”。我们需要精心设计一个提示词Prompt让通义千问模型能够根据用户问题和数据库结构生成正确的SQL。创建一个sql_generator.py文件from model_loader import load_qwen_model from database import db_manager import torch class SQLGenerator: def __init__(self, model, tokenizer): self.model model self.tokenizer tokenizer self.schema_info db_manager.get_database_schema() # 构建系统提示词这是指导模型行为的关键 self.system_prompt 你是一个专业的SQL专家和数据分析助手。你的任务是根据用户提出的自然语言问题结合已知的数据库表结构生成准确、高效、安全的SELECT查询语句。 请严格遵守以下规则 1. 只生成标准的MySQL SELECT查询语句不要包含任何解释、注释或额外文本。 2. 生成的SQL必须严格基于提供的数据库Schema不能假设不存在的表或列。 3. 优先使用JOIN来关联有外键关系的表。 4. 如果问题中涉及“最近”、“上周”、“最高”等模糊概念你需要基于当前日期做出合理假设并使用对应的SQL函数如CURDATE(), DATE_SUB, MAX等。 5. 绝对不要生成任何数据修改语句如INSERT, UPDATE, DELETE, DROP等。 数据库Schema信息如下 {schema_info} 现在请根据用户的问题生成SQL语句。 def generate_sql(self, user_question: str) - str: 根据用户问题生成SQL语句 # 将Schema信息填充到系统提示词中 full_prompt self.system_prompt.format(schema_infoself.schema_info) # 组合成模型需要的对话格式Qwen Chat格式 messages [ {role: system, content: full_prompt}, {role: user, content: user_question} ] # 将对话格式转换为模型输入的文本 text self.tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue ) # 分词并移至模型所在的设备 model_inputs self.tokenizer([text], return_tensorspt).to(self.model.device) # 生成SQL with torch.no_grad(): generated_ids self.model.generate( **model_inputs, max_new_tokens150, # SQL语句一般不会太长 do_sampleFalse, # 为了稳定性不使用随机采样 temperature0.1, repetition_penalty1.1 ) # 解码生成结果 generated_sql self.tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)[0] # 提取模型生成的部分去掉输入的提示词 # 简单处理找到最后一个“assistant”标签后的内容 if assistant in generated_sql: generated_sql generated_sql.split(assistant)[-1].strip() # 进一步清理确保只返回SQL语句 lines generated_sql.split(\n) sql_lines [] for line in lines: line_strip line.strip() if line_strip and not line_strip.startswith((, ---, )) and not line_strip.lower().startswith(select): # 如果行不是以SELECT开头但看起来是SQL的一部分也保留比如WHERE子句换行 sql_lines.append(line_strip) elif line_strip.upper().startswith(SELECT): sql_lines.append(line_strip) final_sql .join(sql_lines).strip() # 确保以分号结尾 if final_sql and not final_sql.endswith(;): final_sql ; return final_sql def query_and_summarize(self, user_question: str): 完整的流程生成SQL - 安全执行 - 结果自然语言摘要 print(f\n用户问题: {user_question}) # 1. 生成SQL try: generated_sql self.generate_sql(user_question) print(f生成的SQL: {generated_sql}) except Exception as e: return {error: f生成SQL时出错: {str(e)}, sql: None, results: None, summary: None} # 2. 安全执行 try: query_results db_manager.execute_safe_query(generated_sql) print(f查询到 {len(query_results)} 条记录。) except ValueError as ve: return {error: f安全校验失败: {str(ve)}, sql: generated_sql, results: None, summary: None} except Exception as e: return {error: f执行查询时出错: {str(e)}, sql: generated_sql, results: None, summary: None} # 3. 自然语言摘要如果结果不为空 summary None if query_results: summary self._generate_summary(user_question, query_results) print(f结果摘要: {summary}) return { error: None, sql: generated_sql, results: query_results, summary: summary } def _generate_summary(self, original_question: str, data: list) - str: 使用模型对查询结果进行自然语言摘要 # 将数据转换为简短的文本表示避免过长 data_preview str(data[:3]) # 只取前3条作为示例 if len(data) 3: data_preview f ... 以及另外 {len(data)-3} 条记录 summary_prompt f用户最初的问题是“{original_question}” 针对这个问题查询到了以下数据示例 {data_preview} 请用一句简洁、通顺的自然语言总结查询结果的核心信息直接回答用户的问题。不要提及SQL或数据格式。 messages [ {role: user, content: summary_prompt} ] text self.tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue ) model_inputs self.tokenizer([text], return_tensorspt).to(self.model.device) with torch.no_grad(): generated_ids self.model.generate( **model_inputs, max_new_tokens100, do_sampleTrue, temperature0.7, ) summary self.tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)[0] # 清理输出 if assistant in summary: summary summary.split(assistant)[-1].strip() return summary if __name__ __main__: # 测试整个流程 print(初始化SQL生成器...) model, tokenizer load_qwen_model() generator SQLGenerator(model, tokenizer) test_questions [ 库存最低的商品是什么, 上个月销量最好的产品是哪个, 显示所有电子产品的名称和价格, ] for q in test_questions: result generator.query_and_summarize(q) print(- * 50)这个类集成了从理解问题到生成摘要的全流程。system_prompt是关键它详细规定了模型的角色、规则和数据库上下文。在实际使用中你可能需要根据自己数据库的复杂度和查询特点微调这个提示词。4. 构建Web用户界面有了强大的后端我们需要一个简单的前端让用户能方便地使用。用FastAPI可以非常快速地搭建一个兼具API和简单页面的应用。创建主程序文件main.pyfrom fastapi import FastAPI, Request, Form from fastapi.responses import HTMLResponse, JSONResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates import uvicorn from sql_generator import SQLGenerator, load_qwen_model from database import db_manager import json # 加载模型启动时加载一次避免重复加载 print(正在启动智能数据库查询助手...) model, tokenizer load_qwen_model() sql_generator SQLGenerator(model, tokenizer) # 创建FastAPI应用 app FastAPI(title智能数据库查询助手) # 设置模板目录用于存放HTML页面 templates Jinja2Templates(directorytemplates) # 挂载静态文件目录可选用于存放CSS/JS app.mount(/static, StaticFiles(directorystatic), namestatic) app.get(/, response_classHTMLResponse) async def home_page(request: Request): 返回主页面 return templates.TemplateResponse(index.html, {request: request}) app.post(/api/query) async def handle_query(question: str Form(...)): 处理用户查询的API接口 if not question.strip(): return JSONResponse({error: 问题不能为空, sql: None, results: None, summary: None}) # 调用核心处理逻辑 result sql_generator.query_and_summarize(question) # 返回JSON结果 return JSONResponse(result) app.get(/api/schema) async def get_schema(): 获取当前数据库Schema信息的API用于前端展示 schema_info db_manager.get_database_schema() return JSONResponse({schema: schema_info}) if __name__ __main__: # 创建必要的目录 import os os.makedirs(templates, exist_okTrue) os.makedirs(static, exist_okTrue) # 创建简单的HTML页面 html_content !DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title智能数据库查询助手/title style body { font-family: Segoe UI, Tahoma, Geneva, Verdana, sans-serif; max-width: 1000px; margin: 40px auto; padding: 20px; background-color: #f5f7fa; color: #333; } .container { background: white; border-radius: 12px; padding: 30px; box-shadow: 0 5px 20px rgba(0,0,0,0.08); } h1 { color: #2c3e50; border-bottom: 3px solid #3498db; padding-bottom: 10px; } .subtitle { color: #7f8c8d; margin-bottom: 25px; } .input-section { margin-bottom: 25px; } textarea { width: 100%; height: 100px; padding: 15px; border: 2px solid #ddd; border-radius: 8px; font-size: 16px; resize: vertical; box-sizing: border-box; } textarea:focus { outline: none; border-color: #3498db; } button { background: #3498db; color: white; border: none; padding: 14px 28px; border-radius: 8px; font-size: 16px; cursor: pointer; transition: background 0.3s; } button:hover { background: #2980b9; } .result-section { margin-top: 30px; } .result-box { background: #f8f9fa; border-left: 4px solid #3498db; padding: 20px; margin: 15px 0; border-radius: 0 8px 8px 0; } .sql-box { background: #2c3e50; color: #ecf0f1; padding: 15px; border-radius: 6px; font-family: monospace; overflow-x: auto; } .summary-box { background: #e8f6f3; padding: 15px; border-radius: 6px; } .error-box { background: #fde8e8; color: #c0392b; padding: 15px; border-radius: 6px; border-left: 4px solid #c0392b; } table { width: 100%; border-collapse: collapse; margin-top: 15px; } th, td { padding: 12px 15px; text-align: left; border-bottom: 1px solid #ddd; } th { background-color: #f2f6fc; } .loading { display: none; text-align: center; color: #7f8c8d; margin: 20px; } .schema-info { background: #fffde7; padding: 15px; border-radius: 6px; font-size: 14px; max-height: 200px; overflow-y: auto; margin-bottom: 20px; } /style /head body div classcontainer h1 智能数据库查询助手/h1 p classsubtitle直接用中文提问自动查询数据库并返回结果。例如“显示库存最少的商品”或“上个月销售额是多少”/p div classschema-info strong当前数据库结构/strong pre idschemaText正在加载.../pre /div div classinput-section form idqueryForm textarea idquestionInput placeholder请输入您想查询的问题比如#10;• 哪些商品库存不足20件#10;• 最近一周销量最高的产品是什么#10;• 列出所有电子产品的名称和价格... autofocus/textarea div stylemargin-top: 15px; text-align: center; button typesubmit 执行智能查询/button /div /form /div div classloading idloadingIndicator p⏳ 正在思考并查询中请稍候.../p /div div classresult-section idresultSection styledisplay: none; h3 查询结果/h3 div idresultContainer !-- 结果将动态填充在这里 -- /div /div /div script // 页面加载时获取数据库Schema window.onload function() { fetch(/api/schema) .then(response response.json()) .then(data { document.getElementById(schemaText).textContent data.schema; }); }; // 处理表单提交 document.getElementById(queryForm).addEventListener(submit, async function(e) { e.preventDefault(); const question document.getElementById(questionInput).value.trim(); if (!question) { alert(请输入一个问题); return; } // 显示加载中隐藏结果区域 document.getElementById(loadingIndicator).style.display block; document.getElementById(resultSection).style.display none; try { const formData new FormData(); formData.append(question, question); const response await fetch(/api/query, { method: POST, body: formData }); const result await response.json(); // 隐藏加载中 document.getElementById(loadingIndicator).style.display none; // 显示结果区域 document.getElementById(resultSection).style.display block; // 构建结果显示HTML let resultHtml ; if (result.error) { resultHtml div classerror-boxstrong❌ 出错啦/strong ${result.error}/div; } else { // 显示生成的SQL resultHtml div classresult-box strong 生成的SQL语句/strong div classsql-box${result.sql || 无}/div /div; // 显示自然语言摘要 if (result.summary) { resultHtml div classresult-box strong 结果摘要/strong div classsummary-box${result.summary}/div /div; } // 显示详细数据表格 if (result.results result.results.length 0) { resultHtml div classresult-box strong 详细数据共 ${result.results.length} 条/strong; // 获取表头所有键 const headers Object.keys(result.results[0]); let tableHtml tabletheadtr; headers.forEach(h tableHtml th${h}/th); tableHtml /tr/theadtbody; // 填充数据行 result.results.forEach(row { tableHtml tr; headers.forEach(h { let cellValue row[h]; // 处理null和对象 if (cellValue null) cellValue emnull/em; else if (typeof cellValue object) cellValue JSON.stringify(cellValue); tableHtml td${cellValue}/td; }); tableHtml /tr; }); tableHtml /tbody/table; resultHtml tableHtml /div; } else { resultHtml div classresult-box strong 详细数据/strong p查询成功但未找到匹配的记录。/p /div; } } document.getElementById(resultContainer).innerHTML resultHtml; } catch (error) { document.getElementById(loadingIndicator).style.display none; document.getElementById(resultContainer).innerHTML div classerror-boxstrong网络请求失败/strong ${error.message}/div; document.getElementById(resultSection).style.display block; } }); /script /body /html # 将HTML写入文件 with open(templates/index.html, w, encodingutf-8) as f: f.write(html_content) print(Web界面已生成启动服务...) print(请访问: http://127.0.0.1:8000) uvicorn.run(app, host0.0.0.0, port8000)这个main.py文件做了几件事启动时加载模型和数据库管理器。创建了几个API端点主页、处理查询、获取数据库结构。动态生成了一个包含简单样式和交互逻辑的HTML页面。使用Uvicorn服务器运行应用。现在在项目根目录下创建一个.env文件来安全地存储你的数据库密码切记不要提交到版本控制# .env 文件 DB_HOSTlocalhost DB_USERquery_bot DB_PASSWORDYourSecurePassword123! DB_NAMEsmart_query_demo5. 运行与效果展示一切就绪让我们启动这个智能助手看看效果如何。在项目根目录下运行python main.py打开浏览器访问http://127.0.0.1:8000。你会看到一个简洁的页面上方展示了数据库结构中间是一个大大的输入框。现在尝试输入一些中文问题基础查询输入“显示所有商品名称和库存”点击查询。几秒后你会看到系统生成的SQLSELECT name, stock FROM products;一个自然语言摘要“当前数据库中有5种商品库存情况如下...”以及一个格式漂亮的表格展示所有数据。条件过滤输入“库存低于20件的商品有哪些”。模型应该会生成类似SELECT * FROM products WHERE stock 20;的SQL并精准地找出棉质T恤和咖啡机。关联查询与聚合输入“哪个产品总销量最高”。这是一个稍复杂的查询需要关联products和sales表并进行求和与排序。模型生成的SQL可能会是SELECT p.name, SUM(s.quantity) as total_sold FROM sales s JOIN products p ON s.product_id p.id GROUP BY p.id ORDER BY total_sold DESC LIMIT 1;摘要则会告诉你“总销量最高的产品是蓝牙耳机共售出20件。”时间范围查询输入“上周的销售记录”。这里模型需要理解“上周”的含义并转换成具体的日期范围。生成的SQL可能会使用WHERE sale_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE()。整个流程下来你会发现一个完全不懂SQL的同事现在也能通过这个简单的网页自主获取他们想要的数据洞察了。这大大减少了技术团队的重复性支持工作也让业务同学的数据获取效率得到了质的提升。6. 总结通过这个实战项目我们成功地将通义千问大模型与MySQL数据库结合构建了一个真正可用的智能查询助手。它的价值在于消除了技术语言SQL与业务需求自然语言之间的鸿沟。回顾一下我们实现的关键点轻量模型选择1.8B的量化版通义千问在保证足够理解能力的同时推理速度快资源消耗低。安全的数据库交互通过严格的SQL语句过滤和只读权限控制确保了数据库的安全。精心设计的Prompt这是项目的灵魂它让模型理解了“角色”、“规则”和“上下文”。端到端的用户体验从输入问题到看到自然语言摘要和格式化数据流程完整且友好。当然这只是一个起点。在实际生产环境中你可能还需要考虑更多比如对更复杂嵌套查询的支持、查询性能优化、用户权限管理、查询历史记录、以及更强大的错误处理和提示词优化。但这个项目已经为你提供了一个坚实可靠的框架和思路。你可以基于此将它扩展成团队内部的一个高效数据查询工具甚至集成到更大的业务系统中。希望这个实战能给你带来启发让你看到大模型与传统软件工程结合带来的实实在在的提效魔力。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。