百川2-13B模型MySQL数据库智能查询助手开发指南你有没有遇到过这种情况运营同事跑过来问“帮我查一下上个月哪个商品卖得最好呗” 或者产品经理想知道“最近一周新注册的用户里有多少人完成了首单” 作为技术同学你心里可能在想“得又要去写SQL了。” 而对于不懂技术的同事来说他们面对数据库就像面对一堵墙明明数据就在里面却不知道怎么拿出来。今天咱们就来聊聊怎么用百川2-13B这个大模型搭一个“翻译官”。这个翻译官能干的活儿很简单你把用中文问的问题比如“上个月销量最高的商品是什么”丢给它它就能给你翻译成MySQL能听懂的SQL查询语句。这样一来无论是产品、运营还是市场同学都能自己动手查数据了你再也不用当“人肉SQL生成器”。下面我就手把手带你走一遍从环境准备到最终实现一个可用的智能查询助手。1. 项目目标与环境准备咱们的目标很明确开发一个Web应用用户在前端页面用中文输入问题后端调用百川2-13B模型理解问题意图并生成对应的MySQL查询语句最后把查询结果返回给用户展示。首先得把“舞台”搭起来。你需要准备以下几样东西1. 模型服务百川2-13B模型需要部署在能够支持其推理的硬件环境上。你可以选择在云服务器上部署也可以使用一些提供了该模型API服务的平台。确保你有一个可以访问的模型API端点Endpoint这是整个系统的“大脑”。2. 数据库环境既然是查MySQL那你总得有个数据库吧。这里假设你已经有一个MySQL数据库在运行了。如果没有安装起来也很简单。以Ubuntu系统为例打开终端依次执行下面几条命令# 更新软件包列表 sudo apt update # 安装MySQL服务器 sudo apt install mysql-server -y # 启动MySQL服务 sudo systemctl start mysql # 设置MySQL服务开机自启 sudo systemctl enable mysql # 运行安全安装脚本设置root密码等 sudo mysql_secure_installation安装过程中脚本会提示你设置root用户的密码以及一些安全选项比如移除匿名用户、禁止root远程登录等根据提示操作即可。安装好后登录MySQL创建一个我们演示用的数据库和表-- 登录MySQL-p 表示会提示输入密码 mysql -u root -p -- 创建一个名为 ecommerce_demo 的数据库 CREATE DATABASE ecommerce_demo; USE ecommerce_demo; -- 创建一张商品销售表 CREATE TABLE product_sales ( id INT AUTO_INCREMENT PRIMARY KEY, product_name VARCHAR(255) NOT NULL, category VARCHAR(100), sale_date DATE NOT NULL, quantity INT NOT NULL, amount DECIMAL(10, 2) NOT NULL, region VARCHAR(50) ); -- 插入一些模拟数据 INSERT INTO product_sales (product_name, category, sale_date, quantity, amount, region) VALUES (智能手机X, 电子产品, 2024-04-15, 120, 599900.00, 华北), (蓝牙耳机, 电子产品, 2024-04-20, 300, 299700.00, 华东), (棉质T恤, 服装, 2024-04-10, 500, 25000.00, 华南), (智能手机X, 电子产品, 2024-04-25, 80, 479920.00, 华北), (咖啡机, 家电, 2024-04-05, 50, 199500.00, 华东), (棉质T恤, 服装, 2024-04-18, 450, 22500.00, 华北), (蓝牙耳机, 电子产品, 2024-04-28, 200, 199800.00, 华南);3. 开发环境你需要一个Python环境建议3.8以上版本以及一个简单的Web框架。这里我们用轻量级的Flask。在终端里安装必要的包pip install flask requests pymysqlflask: 用来构建我们的Web应用后端。requests: 用来调用百川模型的API。pymysql: 用来连接和操作我们的MySQL数据库。环境齐了咱们就可以开始动手了。2. 核心思路如何让模型“懂”数据库直接让模型凭空生成SQL它很容易“胡说八道”比如表名、字段名搞错。所以核心思路是“喂”给它足够的上下文信息。想象一下你要让一个新来的数据分析师帮你查数据你至少得告诉他数据库里有哪些表product_sales每张表长什么样有哪些列id, product_name, category...这些列都是什么意思amount是销售额sale_date是销售日期对于模型我们也需要提供这些信息这被称为“数据库模式Schema”。我们的系统工作流程大致是这样的用户提问在网页输入“查询上个月销售额最高的商品”。构造提示词后端将用户问题连同我们数据库的Schema表结构描述一起组装成一段详细的“任务说明”发给百川模型。模型理解与生成百川模型根据提示词理解用户意图并基于已知的Schema生成正确的SQL语句。执行与返回后端执行生成的SQL从数据库拿到结果再返回给前端展示。这里最关键的一步就是第2步构造提示词Prompt。一个好的Prompt是成功的一半。3. 构建高效的提示词PromptPrompt就像你给模型下的指令。我们的指令需要清晰、具体。下面是一个比较有效的Prompt模板你是一个专业的MySQL数据库助手。请根据以下数据库表结构信息将用户的中文问题转换为准确、可执行的MySQL查询语句。 ### 数据库表结构 (Schema) 表名product_sales 字段列表 - id (INT, 主键自增) - product_name (VARCHAR(255), 商品名称) - category (VARCHAR(100), 商品类别) - sale_date (DATE, 销售日期) - quantity (INT, 销售数量) - amount (DECIMAL(10,2), 销售金额) - region (VARCHAR(50), 销售区域) ### 注意事项 1. 生成的SQL语句必须完全基于上述表结构不得使用不存在的表或字段。 2. 只输出SQL语句本身不要输出任何解释、标记或额外文本。 3. 日期处理如果问题中提到“上个月”、“本周”等请使用MySQL的日期函数如CURDATE(), DATE_SUB进行换算。 4. 聚合查询如果问题涉及统计如最高、总计、平均请使用GROUP BY和聚合函数如SUM, MAX, COUNT。 ### 用户问题 {用户输入的问题} ### MySQL查询语句这个Prompt做了几件事明确角色告诉模型它是“MySQL数据库助手”。提供上下文清晰给出了表名和每个字段的名字、类型和中文注释。注释非常重要是模型将中文问题中的词如“销售额”映射到字段名amount的关键桥梁。设定规则通过“注意事项”约束模型的行为比如只输出SQL、处理日期、使用聚合函数这能大大提高生成SQL的准确率和安全性。固定格式最后以“### MySQL查询语句”结尾引导模型在此之后直接输出代码。4. 后端服务开发实战现在我们把想法变成代码。创建一个名为app.py的文件。from flask import Flask, request, jsonify, render_template import requests import pymysql from datetime import datetime import json app Flask(__name__) # 配置信息 - 请根据你的实际情况修改 BAICHUAN_API_URL YOUR_BAICHUAN_API_ENDPOINT # 百川模型API地址 BAICHUAN_API_KEY YOUR_API_KEY # API密钥 DB_CONFIG { host: localhost, user: root, password: your_password, # 换成你的MySQL密码 database: ecommerce_demo, charset: utf8mb4 } # 数据库Schema描述 - 核心上下文 DB_SCHEMA 表名product_sales 字段列表 - id (INT, 主键自增) - product_name (VARCHAR(255), 商品名称) - category (VARCHAR(100), 商品类别) - sale_date (DATE, 销售日期) - quantity (INT, 销售数量) - amount (DECIMAL(10,2), 销售金额) - region (VARCHAR(50), 销售区域) # 构建Prompt的模板 PROMPT_TEMPLATE f 你是一个专业的MySQL数据库助手。请根据以下数据库表结构信息将用户的中文问题转换为准确、可执行的MySQL查询语句。 ### 数据库表结构 (Schema) {DB_SCHEMA} ### 注意事项 1. 生成的SQL语句必须完全基于上述表结构不得使用不存在的表或字段。 2. 只输出SQL语句本身不要输出任何解释、标记或额外文本。 3. 日期处理如果问题中提到“上个月”、“本周”等请使用MySQL的日期函数如CURDATE(), DATE_SUB进行换算。 4. 聚合查询如果问题涉及统计如最高、总计、平均请使用GROUP BY和聚合函数如SUM, MAX, COUNT)。 ### 用户问题 {{user_question}} ### MySQL查询语句 def generate_sql_via_llm(question): 调用百川模型API生成SQL prompt PROMPT_TEMPLATE.format(user_questionquestion) headers { Authorization: fBearer {BAICHUAN_API_KEY}, Content-Type: application/json } data { model: baichuan2-13b, # 根据实际模型名称调整 messages: [{role: user, content: prompt}], temperature: 0.1, # 温度调低使输出更确定、更稳定 max_tokens: 500 } try: response requests.post(BAICHUAN_API_URL, headersheaders, jsondata, timeout30) response.raise_for_status() result response.json() # 解析响应获取模型返回的文本内容 sql_query result[choices][0][message][content].strip() # 清理可能出现的代码块标记 sql_query sql_query.replace(sql, ).replace(, ).strip() return sql_query except requests.exceptions.RequestException as e: return fAPI调用失败: {e} except (KeyError, IndexError, json.JSONDecodeError) as e: return f解析响应失败: {e} def execute_sql_query(sql): 执行SQL查询并返回结果 if not sql or sql.startswith(API调用失败) or sql.startswith(解析响应失败): return None, sql # 如果sql本身就是错误信息直接返回 connection None try: connection pymysql.connect(**DB_CONFIG) with connection.cursor(pymysql.cursors.DictCursor) as cursor: cursor.execute(sql) results cursor.fetchall() return results, None except pymysql.Error as e: return None, f数据库执行错误: {e} finally: if connection: connection.close() app.route(/) def index(): 渲染前端页面 return render_template(index.html) # 需要创建一个简单的HTML页面 app.route(/query, methods[POST]) def handle_query(): 处理用户查询请求的核心接口 data request.json user_question data.get(question, ).strip() if not user_question: return jsonify({error: 问题不能为空}), 400 # 步骤1调用模型生成SQL generated_sql generate_sql_via_llm(user_question) # 步骤2执行生成的SQL query_results, db_error execute_sql_query(generated_sql) # 步骤3组织返回结果 response_data { user_question: user_question, generated_sql: generated_sql, } if db_error: response_data[error] db_error response_data[results] None else: response_data[results] query_results response_data[error] None return jsonify(response_data) if __name__ __main__: app.run(debugTrue, port5000)代码逻辑很清晰用户访问首页提交问题/query接口接收到问题后先调用generate_sql_via_llm函数让百川模型生成SQL再调用execute_sql_query函数去数据库执行最后把SQL语句和查询结果一起返回给前端。5. 前端界面与效果展示后端有了还得有个让用户输入和看结果的界面。在项目根目录下创建一个templates文件夹在里面新建一个index.html文件。!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title数据库智能查询助手/title style body { font-family: sans-serif; max-width: 900px; margin: 40px auto; padding: 20px; } .container { background: #f8f9fa; padding: 30px; border-radius: 10px; } h1 { color: #333; text-align: center; } .input-area { margin-bottom: 25px; } textarea { width: 100%; height: 80px; padding: 12px; border: 1px solid #ccc; border-radius: 5px; font-size: 16px; } button { background: #007bff; color: white; border: none; padding: 12px 25px; border-radius: 5px; cursor: pointer; font-size: 16px; } button:hover { background: #0056b3; } .result-area { margin-top: 30px; } .section { background: white; padding: 20px; border-radius: 5px; margin-bottom: 20px; border-left: 4px solid #007bff; } h3 { margin-top: 0; color: #495057; } pre { background: #e9ecef; padding: 15px; border-radius: 5px; overflow-x: auto; } table { width: 100%; border-collapse: collapse; margin-top: 10px; } th, td { border: 1px solid #dee2e6; padding: 10px; text-align: left; } th { background-color: #f1f3f5; } .error { color: #dc3545; background: #f8d7da; padding: 15px; border-radius: 5px; } /style /head body div classcontainer h1 数据库智能查询助手/h1 p直接用中文提问例如“上个月销量最高的商品是什么”/p div classinput-area textarea idquestionInput placeholder请输入您想查询的问题.../textarea div styletext-align: center; margin-top: 15px; button onclicksubmitQuestion()生成SQL并查询/button /div /div div classresult-area idresultArea styledisplay:none; div classsection h3您的问题/h3 p iddisplayQuestion/p /div div classsection h3生成的SQL语句/h3 pre iddisplaySQL/pre /div div classsection h3查询结果/h3 div iddisplayResult/div /div /div /div script function submitQuestion() { const question document.getElementById(questionInput).value.trim(); if (!question) { alert(请输入问题); return; } const button event.target; button.disabled true; button.textContent 查询中...; fetch(/query, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ question: question }) }) .then(response response.json()) .then(data { document.getElementById(displayQuestion).textContent data.user_question; document.getElementById(displaySQL).textContent data.generated_sql; const resultDiv document.getElementById(displayResult); if (data.error) { resultDiv.innerHTML div classerrorstrong执行出错/strong${data.error}/div; } else if (data.results data.results.length 0) { // 动态创建表格展示结果 let tableHtml tabletheadtr; // 获取表头字段名 const headers Object.keys(data.results[0]); headers.forEach(h tableHtml th${h}/th); tableHtml /tr/theadtbody; // 填充数据行 data.results.forEach(row { tableHtml tr; headers.forEach(h tableHtml td${row[h]}/td); tableHtml /tr; }); tableHtml /tbody/table; resultDiv.innerHTML tableHtml; } else { resultDiv.innerHTML p查询成功但未返回数据。/p; } document.getElementById(resultArea).style.display block; }) .catch(error { console.error(Error:, error); alert(请求失败请检查控制台或网络。); }) .finally(() { button.disabled false; button.textContent 生成SQL并查询; }); } /script /body /html这个页面很简单一个输入框、一个按钮、三个展示区域。用户输入中文问题点击按钮页面通过JavaScript调用我们刚写的后端接口然后把模型生成的SQL和数据库查询结果漂亮地展示出来。实际效果怎么样我们来试几个问题输入“列出所有商品类别”生成SQLSELECT DISTINCT category FROM product_sales;结果正确返回“电子产品”、“服装”、“家电”。输入“上个月总销售额是多少”生成SQLSELECT SUM(amount) AS total_amount FROM product_sales WHERE sale_date DATE_SUB(CURDATE(), INTERVAL 1 MONTH);结果正确计算并返回总和。模型成功理解了“上个月”并使用了DATE_SUB函数。输入“哪个区域的销量最高”生成SQLSELECT region, SUM(quantity) AS total_quantity FROM product_sales GROUP BY region ORDER BY total_quantity DESC LIMIT 1;结果正确按区域汇总销量并排序返回销量最高的区域。可以看到对于这类基于单表、意图明确的查询百川2-13B模型结合我们精心设计的Prompt已经能生成非常准确、可用的SQL了。6. 总结与优化方向走完这一趟一个最基础的、能跑起来的智能查询助手就有了。它确实能解决“用中文问数据”这个核心痛点让非技术同学看到了自助查询的希望。实际用下来我感觉这个方案在表结构清晰、问题规范的场景下效果挺靠谱的。但它也不是万能的。有几个地方咱们心里得有数也是未来可以优化的方向第一复杂查询和多人协作。现在的例子只涉及一张表。真实业务库往往有几十张表关联查询非常复杂。下一步需要把完整的数据库Schema多表关系都喂给模型并教会它理解JOIN。另外可以做个“查询历史”功能把生成过的优质SQL存下来形成知识库以后类似问题可以直接参考或优化越用越聪明。第二安全与准确性。直接执行模型生成的SQL是有风险的万一它生成了一条DELETE语句呢生产环境一定要加个“安全审查”环节比如用正则表达式过滤掉DROP、DELETE、UPDATE等危险操作或者只允许执行SELECT语句。对于关键业务查询可以先让SQL给管理员审核一下再执行。第三效果提升。Prompt可以继续优化比如加入几个“示例对话”Few-shot Learning让模型学得更快。对于复杂问题可以尝试让模型先“思考”一下输出它的分析步骤Chain-of-Thought再生成SQL这样准确率可能会更高。第四工程化。真要给团队用现在的简单界面就不够了。需要考虑用户管理、权限控制不同人只能查不同的数据、查询性能优化缓存高频查询结果、以及更友好的结果可视化图表等等。总的来说用百川2-13B这类大模型来降低数据库查询门槛这个方向是没错的今天搭建的这个原型已经证明了其可行性。你可以先把这个小工具在小组内部用起来收集反馈然后沿着上面说的优化方向一步步把它打磨成一个真正好用、耐用的生产力工具。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。