1. 项目概述
最近在探索如何将大语言模型与数据库查询能力结合,构建一个真正实用的数据分析智能体。经过多次尝试,最终基于LangChain DeepAgents框架和Qwen3.5-397B-A17B大模型,成功实现了一个能够理解自然语言查询并返回结构化数据的智能系统。
这个项目的核心价值在于:它让非技术用户也能通过自然语言与数据库交互,无需编写SQL语句就能获取所需数据。对于数据分析师来说,可以大幅减少重复性的数据查询工作,把更多时间花在数据分析本身上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型解析
2.1 LangChain DeepAgents框架
DeepAgents是LangChain生态中的一个重要组件,它提供了构建复杂智能体所需的核心能力:
- 技能管理:通过Skills机制将专业知识模块化
- 记忆管理:支持对话历史的持久化存储
- 工具调用:可以执行代码、调用API等
- 流程控制:支持多步骤的任务执行
选择DeepAgents的主要原因在于它的灵活性。相比直接使用大模型的函数调用能力,DeepAgents提供了更完整的智能体开发框架,特别适合构建需要长期记忆和复杂交互的应用。
2.2 Qwen3.5-397B-A17B模型
Qwen3.5系列是阿里云最新发布的大模型,在多个基准测试中表现优异。选择397B-A17B这个版本主要基于以下考虑:
- 中文理解能力强:相比其他开源模型,Qwen在中文任务上表现更优
- 函数调用支持好:能准确理解何时以及如何调用工具
- 推理能力突出:在处理复杂查询时表现稳定
- API访问方便:通过ModelScope可以快速接入
实测下来,这个模型在理解数据查询意图和生成正确SQL语句方面,准确率能达到90%以上。
3. 核心实现细节
3.1 Skills机制详解
Skills是DeepAgents中封装专业知识的核心方式。一个标准的Skill包含以下部分:
code复制my-skill/
├── SKILL.md # 必须:技能说明和元数据
├── scripts/ # 可选:可执行代码
├── references/ # 可选:参考文档
└── assets/ # 可选:资源文件
3.1.1 SKILL.md编写规范
这个文件是技能的核心,需要包含:
- 元数据头:定义技能名称和描述
- 使用场景:说明何时使用这个技能
- 详细指南:分步骤说明如何使用
- 示例:提供典型的使用案例
关键点在于description字段的编写。这个字段决定了智能体何时会调用这个技能,因此需要全面覆盖技能的能力范围。
3.1.2 脚本实现技巧
scripts目录下的代码是技能的实际执行部分。在实现数据库查询技能时,有几个注意事项:
- 错误处理:要捕获并清晰报告各种可能的错误
- 结果格式化:确保输出能被模型正确解析
- 安全性:避免SQL注入等风险
我们的实现中使用了Python的pymysql库,并通过参数化查询来保证安全。
3.2 数据库连接实现
数据库连接是项目的关键部分。在run_sql.py脚本中,我们实现了以下功能:
python复制def get_conn():
return pymysql.connect(
host="127.0.0.1",
port=3306,
database="test3",
user="root",
password="root",
autocommit=True
)
def query(sql):
conn = get_conn()
cursor = conn.cursor()
cursor.execute(sql)
columns = [column[0] for column in cursor.description]
res = list()
for row in cursor.fetchall():
res.append(dict(zip(columns, row)))
cursor.close()
conn.close()
return res
这里特别要注意的是:
- 使用字典返回结果,保留列名信息
- 确保连接在使用后正确关闭
- 设置autocommit避免事务问题
3.3 智能体系统提示设计
系统提示词对智能体行为有重要影响。我们的设计包含以下几个关键部分:
- 角色设定:明确智能体的专业定位
- 核心任务:定义优先级原则
- 交互风格:规定输出格式要求
- 注意事项:特别说明工具使用的限制
一个有效的技巧是在提示词中包含具体的错误示例和正确写法,这能显著减少模型犯错的可能性。
4. 实战应用案例
4.1 基础查询场景
对于"确诊人数Top10的县是哪几个?"这样的查询,系统的工作流程如下:
- 识别查询意图,确定需要使用db技能
- 读取SKILL.md了解数据库结构
- 生成正确的SQL语句
- 执行查询并格式化结果
生成的SQL语句示例:
sql复制SELECT county, state, cases
FROM us_covid19_counties
WHERE date='2021-01-28'
ORDER BY cases DESC
LIMIT 10
4.2 复杂分析场景
系统也能处理更复杂的查询,比如"加州各县的确诊率和死亡率对比"。这种情况下:
- 模型会先确认分析维度
- 计算必要的衍生指标(如死亡率)
- 生成包含JOIN或子查询的SQL
- 对结果进行初步分析
sql复制SELECT
county,
cases,
deaths,
(deaths/cases)*100 AS death_rate
FROM us_covid19_counties
WHERE state='California' AND date='2021-01-28'
ORDER BY cases DESC
4.3 交互式探索场景
用户可以通过多轮对话逐步细化查询:
用户:先给我加州的数据
智能体:返回加州各县的基本情况
用户:只看确诊病例超过1万的县
智能体:添加过滤条件,返回筛选结果
用户:按死亡率从高到低排序
智能体:调整排序方式,返回最终结果
这种交互方式极大提升了数据探索的效率。
5. 性能优化技巧
5.1 查询效率优化
- 索引优化:确保常用查询字段有索引
- 查询简化:让模型生成更高效的SQL
- 结果限制:默认添加LIMIT避免返回过多数据
5.2 缓存机制实现
对于常见查询,可以实现结果缓存:
- 对SQL语句做hash作为缓存键
- 设置合理的过期时间
- 对缓存命中率进行监控
5.3 大结果集处理
当可能返回大量数据时:
- 先返回前几条样本
- 询问用户是否需要完整结果
- 对大数据进行分页处理
6. 常见问题与解决方案
6.1 SQL生成错误
问题现象:生成的SQL语法错误或逻辑不对
解决方案:
- 在SKILL.md中提供更详细的表结构说明
- 添加更多的使用示例
- 实现SQL验证环节
6.2 查询超时
问题现象:复杂查询执行时间过长
解决方案:
- 设置查询超时时间
- 对复杂查询进行分解
- 添加查询取消功能
6.3 结果解释不足
问题现象:只返回数据,缺乏分析
解决方案:
- 在系统提示中要求模型添加解读
- 对数值型结果自动计算统计指标
- 提供可视化建议
7. 扩展应用方向
这个基础框架可以扩展到更多场景:
- 多数据源支持:连接MySQL以外的数据库
- 自动化报告:定期执行查询并生成分析报告
- 预测分析:结合机器学习模型进行预测
- 自然语言生成:将数据结果转化为自然语言描述
一个特别有价值的扩展是添加数据可视化能力,让系统不仅能返回数据,还能生成直观的图表。
8. 开发经验分享
在实际开发过程中,有几个关键点值得注意:
- 技能描述的准确性:description字段要全面准确,这是技能匹配的关键
- 错误信息的友好性:数据库错误要转换为用户能理解的提示
- 会话状态的维护:多轮对话中要保持上下文一致性
- 性能监控:记录查询响应时间,持续优化
最大的收获是:要让AI真正理解数据,不仅需要强大的模型,更需要精心设计的数据表示和交互流程。
