AI编程实战:Python + Qwen-agent 实现chat2SQL智能助手系统

项目目标

  1. 满足自己筛选基金经理;
  2. 写一个跟AI相关的项目;
  3. 学习与锻炼Python编程;
  4. 学习与使用开源框架 Qwen-agent。

项目背景

       早在2020年底就尝试过爬取网上的基金数据用来解决自己的问题了,从网上学到一些筛选基金经理的理论,想着去实践,但是专业网站、APP都不能满足。
        因此,就想着自己来写一个工具,从数据采集到最后数据分析结果呈现,尽可能地让整个过程自动化。可是,一直未去实践,仅是有想法而已,画画流程图而已。
        2020年,随着 GPT-3火爆全球,AI正式进入科技领域的热门。而我是在近一年多才慢慢主动去关注这个领域,去学习一些应用层技术。之后,了解到有chan2SQL,觉得挺有意思的。很快就和自己以前构想的基金经理筛选项目结合到一起了。

        好了,大概就这样,接下来就是实现的过程了。整个过程,基本上靠LLM chat工具来写代码,而我主要负责出想法,调试代码。


想法 + 使用AI工具实现过程

工具与技术框架介绍

工具:

  • Windows 笔记本
  • PyCharm 2024.3.4 (Community Edition)

技术框架:

  • Qwen-agen 0.0.24;
  • Python 3.12

Python解释器里关键包:

  • mysql 0.0.3
  • mysql-connector-python    8.4.0    
  • mysqlclient    2.2.7    

初版代码实现过程

        选定了使用 Qwen-agen 作为框架搭建,于是就开始了面向 LLM chat 来编程……

(1)在腾讯元宝,使用 Hunyuan 非深度思考 联网搜索
    prompt是:“Qwen-agent 实现chat2SQL”
    倒腾了差不多一个小时,一直运行有报错,就暂时放弃使用它了。
    
(2)在通义,使用 Qwen3
    prompt是:“用 Qwen-agent 实现chat2SQL,数据库使用 MySQL”
    这次运行倒没有什么报错了,就是输出的结果总让我觉得哪里不对,倒腾了半个多小时,又暂时放弃它了。
    
(3)在问小白,使用 DeepSeek V3 联网模式:日常搜索(即时获取最新信息)
    prompt是:“要用 Qwen-agent 实现chat2SQL,数据库使用 MySQL。Python 代码怎么写”

得到代码如下:

1. 环境准备

首先确保安装以下依赖:

pip install qwen-agent mysql-connector-python mcp-server-sqlite  # MCP可选

2. 核心代码实现

2.1 自定义 MySQL 工具

创建一个继承 BaseTool 的 MySQL 工具类,用于执行 SQL 查询并返回结果:

# mysql_tool.py
from qwen_agent.tools.base import BaseTool, register_tool
import mysql.connector
import json

@register_tool('mysql_query')
class MySQLQueryTool(BaseTool):
    description = '执行针对 MySQL 数据库的 SQL 查询,返回结果集。'
    parameters = [{
        'name': 'query',
        'type': 'string',
        'description': '用户输入的自然语言问题转换为 SQL 查询语句',
        'required': True
    }]

    def __init__(self):
        super().__init__()
        # MySQL 数据库连接配置(需根据实际情况修改)
        self.conn = mysql.connector.connect(
            host='localhost',
            user='root',
            password='your_password',
            database='your_database'
        )

    def call(self, params: str, **kwargs) -> str:
        query = json.loads(params)['query']
        cursor = self.conn.cursor()
        try:
            cursor.execute(query)
            result = cursor.fetchall()
            return json.dumps({'result': result}, ensure_ascii=False)
        except Exception as e:
            return json.dumps({'error': str(e)}, ensure_ascii=False)
        finally:
            cursor.close()
2.2 配置 LLM 和 Agent

定义大语言模型(LLM)配置,并初始化智能体(Agent),绑定 MySQL 工具:

# main.py
import os
from qwen_agent.agents import Assistant
from qwen_agent.llm import get_chat_model

# LLM 配置(使用 DashScope 服务)
llm_cfg = {
    'model': 'qwen-max',
    'model_server': 'dashscope',
    # 如果未设置环境变量 DASHSCOPE_API_KEY,需显式指定 api_key
    # 'api_key': 'YOUR_DASHSCOPE_API_KEY',
    'generate_cfg': {
        'top_p': 0.8
    }
}

# 初始化 MySQL 工具
tools = ['mysql_query']

# 系统提示词(引导 LLM 生成 SQL)
system_prompt = '''
你是一个数据库助手,能够将用户的自然语言问题转换为 SQL 查询语句,并调用 MySQL 工具执行。请遵循以下规则:
1. 仅输出 SQL 查询语句或工具调用结果。
2. 如果用户问题与数据库无关,请直接回答。
3. 确保生成的 SQL 语法正确,并符合 MySQL 规范。
'''

# 初始化 Agent
bot = Assistant(
    llm=llm_cfg,
    system_message=system_prompt,
    function_list=tools
)

# 处理用户输入
messages = []
while True:
    query = input('请输入您的问题(输入 "exit" 退出): ')
    if query.lower() == 'exit':
        break
    messages.append({'role': 'user', 'content': query})
    response = []
    for r in bot.run(messages=messages):
        response.append(r)
    print('SQL 执行结果:', response[-1].get('content', ''))
    messages.extend(response)

3. 运行及问题解决过程

获得上述第一版代码,复制粘贴,修改相关配置执行之后,运行出现了不少问题:

问题1

【问题描述】一直说使用 LLM 的 api_key 未设置
 (使用的 LLM chat是:问小白,DeepSeek V3 联网模式:日常搜索)
prompt:

为何指定了 api_key,还是报错 Setting the dashscope api_key.
    Traceback (most recent call last):
      File "D:\PythonLearn\codeWorkSpace\QwenAgentLearn\chat2SQL\OK_app.py", line 64, in
        bot = Assistant(llm=llm_cfg, function_list=tools, system_message=system_prompt)

解决办法:

永久设置环境变量:(使用的是 widows系统)
    右键“此电脑” → “属性” → “高级系统设置” → “环境变量”。
    在“系统变量”或“用户变量”中添加 DASHSCOPE_API_KEY。
    重启终端或 IDE 以确保新变量生效。

问题2

【问题描述】具体问题请看如下 prompt中的错误信息
(使用的 LLM chat是:问小白,千问3 联网模式:日常搜索)
prompt:

为何指定了 api_key,还是报错 Setting the dashscope api_key.
Traceback (most recent call last):
  File "D:\PythonLearn\codeWorkSpace\QwenAgentLearn\chat2SQL\OK_app.py", line 64, in
    bot = Assistant(llm=llm_cfg, function_list=tools, system_message=system_prompt)

解决办法:

它给了一份新的完整代码,没对比修改了哪些,就直接用了新代码,代码如下:

工具类定义(mysql_tool.py)

from qwen_agent.tools.base import BaseTool, register_tool
import mysql.connector
import json

@register_tool('mysql_query')
class MySQLQueryTool(BaseTool):
    description = '执行针对 MySQL 数据库的 SQL 查询,返回结果集。'
    parameters = [{
        'name': 'query',
        'type': 'string',
        'description': '用户输入的自然语言问题转换为 SQL 查询语句',
        'required': True
    }]

    def __init__(self, tool_cfg: dict = None):
        super().__init__(tool_cfg)  # 确保调用父类初始化
        cfg = tool_cfg or {}
        self.conn = mysql.connector.connect(
            host=cfg.get('host', 'localhost'),
            user=cfg.get('user', 'root'),
            password=cfg.get('password', ''),
            database=cfg.get('database', 'your_database')
        )

    def call(self, params: str, **kwargs) -> str:
        query = json.loads(params)['query']
        cursor = self.conn.cursor()
        try:
            cursor.execute(query)
            result = cursor.fetchall()
            return json.dumps({'result': result}, ensure_ascii=False)
        except Exception as e:
            return json.dumps({'error': str(e)}, ensure_ascii=False)
        finally:
            cursor.close()

主程序(main.py)

import os
from qwen_agent.agents import Assistant
from qwen_agent.llm import get_chat_model

# 设置环境变量(Windows 下推荐方式)
# set DASHSCOPE_API_KEY=your_api_key

# LLM 配置(使用 DashScope 服务)
llm_cfg = {
    'model': 'qwen-max',
    'model_server': 'dashscope',
    'tool_cfg': {
        'mysql_query': {
            'host': 'localhost',
            'user': 'root',
            'password': 'your_password',
            'database': 'your_database'
        }
    }
}

# 初始化 MySQL 工具
tools = ['mysql_query']

# 系统提示词
system_prompt = '''
你是一个数据库助手,能够将用户的自然语言问题转换为 SQL 查询语句,并调用 MySQL 工具执行。请遵循以下规则:
1. 仅输出 SQL 查询语句或工具调用结果。
2. 如果用户问题与数据库无关,请直接回答。
3. 确保生成的 SQL 语法正确,并符合 MySQL 规范。
'''

# 初始化 Agent
bot = Assistant(
    llm=llm_cfg,
    system_message=system_prompt,
    function_list=tools
)

# 处理用户输入
messages = []
while True:
    query = input('请输入您的问题(输入 "exit" 退出): ')
    if query.lower() == 'exit':
        break
    messages.append({'role': 'user', 'content': query})
    response = []
    for r in bot.run(messages=messages):
        response.append(r)
    print('SQL 执行结果:', response[-1].get('content', ''))
    messages.extend(response)

运行上述代码后,又有新的问题:

问题3

【问题描述】具体问题请看如下 prompt中的错误信息
 (使用的 LLM chat是:问小白,千问3 联网模式:日常搜索)
prompt: 

新的报错:Traceback (most recent call last):
  File "D:\PythonLearn\codeWorkSpace\QwenAgentLearn\chat2SQL_fromWXB_Qwen3\main.py", line 49, in
    print('SQL 执行结果:', response[-1].get('content', ''))
                            ^^^^^^^^^^^^^^^^
    AttributeError: 'list' object has no attribute 'get'

看了解释就是拿到输出的结果,在输出时,不懂里面的数据结构导致的错误,将处理用户输入的那块代码修改为如下的代码即可

# 处理用户输入
messages = []
while True:
    query = input('请输入您的问题(输入 "exit" 退出): ')
    if query.lower() == 'exit':
        break
    messages.append({'role': 'user', 'content': query})
    response = []
    for r in bot.run(messages=messages):
        response.append(r)
    # print('SQL 执行结果:', response[-1].get('content', ''))
    print('full response ', respo

运行成功截图

AI编程实战:Python + Qwen-agent 实现chat2SQL智能助手系统_第1张图片

至此,到这里已完成了,使用 Qwen-agen 搭建一个工具实现了:将用户的自然语言转成 SQL从 MySQL中获取数据回复用户问题。


未完待续...

        仔细分析运行结果也可以看到,得到的结果并不是我们想要的。因此,接下来,要做的就是怎么实现让 LLM的回答结果是我们想要的答案,以及做成一个简易的网页对话。

第二篇文章已发布,方便大家阅读,链接已更新(2025/5/28 pm),如下:

AI编程实战:Python + Qwen-agent 实现chat2SQL智能助手系统(二)-CSDN博客

你可能感兴趣的:(AI编程,python,pycharm,mysql,sql)