早在2020年底就尝试过爬取网上的基金数据用来解决自己的问题了,从网上学到一些筛选基金经理的理论,想着去实践,但是专业网站、APP都不能满足。
因此,就想着自己来写一个工具,从数据采集到最后数据分析结果呈现,尽可能地让整个过程自动化。可是,一直未去实践,仅是有想法而已,画画流程图而已。
2020年,随着 GPT-3火爆全球,AI正式进入科技领域的热门。而我是在近一年多才慢慢主动去关注这个领域,去学习一些应用层技术。之后,了解到有chan2SQL,觉得挺有意思的。很快就和自己以前构想的基金经理筛选项目结合到一起了。
好了,大概就这样,接下来就是实现的过程了。整个过程,基本上靠LLM chat工具来写代码,而我主要负责出想法,调试代码。
工具:
技术框架:
Python解释器里关键包:
选定了使用 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 代码怎么写”;
得到代码如下:
首先确保安装以下依赖:
pip install qwen-agent mysql-connector-python mcp-server-sqlite # MCP可选
创建一个继承 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()
定义大语言模型(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)
获得上述第一版代码,复制粘贴,修改相关配置执行之后,运行出现了不少问题:
【问题描述】一直说使用 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 以确保新变量生效。
【问题描述】具体问题请看如下 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)
运行上述代码后,又有新的问题:
【问题描述】具体问题请看如下 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
运行成功截图
至此,到这里已完成了,使用 Qwen-agen 搭建一个工具实现了:将用户的自然语言转成 SQL从 MySQL中获取数据回复用户问题。
仔细分析运行结果也可以看到,得到的结果并不是我们想要的。因此,接下来,要做的就是怎么实现让 LLM的回答结果是我们想要的答案,以及做成一个简易的网页对话。
第二篇文章已发布,方便大家阅读,链接已更新(2025/5/28 pm),如下:
AI编程实战:Python + Qwen-agent 实现chat2SQL智能助手系统(二)-CSDN博客