学习内容:
✅ Function Calling的概念与应用
- 什么是Function Calling?
- Function Calling 与 MCP的区别
✅ Qwen3 Function Calling使用 - Qwen3的特点
- 使用Qwen3完成天气调用 Function Calling
✅ 搭建业务助手 - Qwen-Agent中的 Function Calling
- 使用Function Calling完成数据库查询
- 数据表可视化
学习产出:
门票助手系统技术文档
1. 项目概述
门票助手系统是基于大语言模型的智能数据分析应用,用于门票销售数据的查询、分析和可视化展示。系统使用ModelScope大模型平台提供的OpenAI兼容接口,结合SQL查询和数据可视化技术,为用户提供直观的门票销售数据分析服务。
1.1 主要功能
- 自然语言转SQL:用户可通过自然语言提问,系统自动生成并执行SQL查询
- 自动数据可视化:查询结果自动转换为柱状图,支持中文显示
- 多模式交互:支持Web图形界面和终端命令行两种交互方式
- 会话隔离:每个用户会话的数据独立存储,避免数据串扰
- 错误处理与日志:完善的错误捕获和日志记录机制
2. 技术架构
2.1 技术栈
| 技术/框架 | 用途 | 版本 |
|---|---|---|
| Python | 主要开发语言 | 3.x |
| qwen-agent | 大模型代理框架 | - |
| ModelScope | 大模型平台 | - |
| pandas | 数据处理 | - |
| matplotlib | 数据可视化 | - |
| SQLAlchemy | 数据库连接 | - |
| Gradio (WebUI) | Web界面 | - |
2.2 系统架构图
┌─────────────┐ ┌───────────────┐ ┌──────────────┐
│ 用户交互层 │ │ 大模型代理层 │ │ 工具与执行层 │
│ │ │ │ │ │
│ - WebUI │◄───►│ - qwen-agent │◄───►│ - SQL查询 │
│ - 终端界面 │ │ - 函数调用 │ │ - 数据可视化 │
└─────────────┘ └───────────────┘ └──────────────┘
│
┌───────────────┐
│ 数据源 │
│ - MySQL数据库 │
└───────────────┘
3. 核心功能模块
3.1 大模型集成模块
负责与ModelScope大模型平台的对接,使用OpenAI兼容接口进行通信。
核心配置示例:
llm_cfg = {
'model': 'Qwen/Qwen3-8B',
'api_key': MODEL_SCOPE_API_KEY,
'base_url': MODEL_SCOPE_BASE_URL,
'enable_thinking': True,
'tool_choice': 'auto'
}
3.2 SQL查询与可视化模块
系统的核心功能实现,负责执行SQL查询并自动生成可视化图表。
核心代码结构:
@register_tool('exc_sql')
class ExcSQLTool(BaseTool):
"""SQL查询工具,执行传入的SQL语句并返回结果,并自动进行可视化"""
description = '对于生成的SQL,进行SQL查询,并自动可视化'
parameters = [{'name': 'sql_input', 'type': 'string', 'description': '生成的SQL语句', 'required': True}]
def call(self, params: str, **kwargs) -> str:
# 执行SQL查询
# 处理结果并生成Markdown表格
# 自动推断字段并生成可视化图表
# 返回包含表格和图表的Markdown格式文本
3.3 用户交互模块
系统提供两种交互模式:
3.3.1 Web图形界面
使用qwen-agent提供的WebUI组件,基于Gradio构建。
def app_gui():
"""图形界面模式"""
bot = init_agent_service()
chatbot_config = {
'prompt.suggestions': [示例问题列表],
'title': '智能门票助手'
}
WebUI(bot, chatbot_config=chatbot_config).run()
3.3.2 终端交互模式
提供命令行交互界面,支持连续对话和历史记录管理。
def app_tui():
"""终端交互模式"""
bot = init_agent_service()
messages = []
# 主循环处理用户输入
4. 关键类与函数
4.1 核心类
ExcSQLTool
功能:执行SQL查询并生成可视化图表
参数:
- sql_input:要执行的SQL语句
- database:数据库名称(可选,默认为’ubr’)
返回值:包含查询结果表格和可视化图表的Markdown格式文本
Assistant
功能:初始化门票助手,配置大模型和可用工具
参数:
- llm:大模型配置
- name:助手名称
- description:助手描述
- system_message:系统提示词
- function_list:可用工具列表
4.2 辅助函数
get_session_id
功能:生成会话唯一标识符,用于会话隔离
init_agent_service
功能:初始化大模型配置和助手实例
5. 数据库设计
系统连接到MySQL数据库,主要查询tkt_orders表:
CREATE TABLE tkt_orders (
order_time DATETIME, -- 订单日期
account_id INT, -- 预定用户ID
gender VARCHAR(10), -- 使用人性别
age INT, -- 年龄
province VARCHAR(30), -- 使用人省份
SKU VARCHAR(100), -- 商品SKU名
sales_channel VARCHAR(20), -- 销售渠道
order_value DECIMAL(10,2), -- 订单金额
quantity INT -- 商品数量
);
6. 部署与配置
6.1 环境变量配置
系统依赖以下环境变量:
- ModelScope_Api_Key:ModelScope平台的API密钥
- ModelScope_Base_Url:ModelScope API的基础URL(可选,默认为’https://api-inference.modelscope.cn/v1’)
6.2 运行模式
系统支持两种运行模式,通过修改主函数中的调用切换:
if __name__ == '__main__':
app_gui() # 图形界面模式(默认)
# app_tui() # 终端交互模式
6.3 日志系统
系统配置了完善的日志记录,同时输出到文件和控制台。
7. 典型用例
7.1 销售量统计
用户提问:“2023年4、5、6月一日门票,二日门票的销量多少?帮我按照周进行统计”
系统流程:生成SQL → 执行查询 → 生成按周统计的销售数据图表
7.2 地域分析
用户提问:“2023年7月的不同省份的入园人数统计”
系统流程:生成按省份分组的SQL → 执行查询 → 生成省份分布柱状图
7.3 销售渠道分析
用户提问:“帮我查看2023年10月1-7日销售渠道订单金额排名”
系统流程:生成按销售渠道分组的SQL → 执行查询 → 生成销售渠道排名柱状图
8. 后续优化考量
8.1 错误处理增强
细化错误类型和处理策略,区分数据库连接错误、SQL语法错误等。
8.2 参数验证增强
增加对SQL输入的安全性检查,防止SQL注入攻击。
8.3 数据缓存机制
为频繁查询的结果添加缓存机制,提高响应速度。
8.4 图表生成优化
根据数据类型自动选择合适的图表类型,增强图表生成的健壮性和美观度。
9. 总结
门票助手系统是一个功能完整的智能数据分析应用,通过整合大语言模型的自然语言理解能力、SQL查询和数据可视化技术,为用户提供了直观、便捷的门票销售数据分析工具。系统架构清晰,代码组织合理,具有良好的可维护性和扩展性。
Q & A
Q:在部署一些本地化的工程的时候,一般的流程大概是怎样的
1)大模型本地化
Qwen3-32B
2)数据库连接
MySQL8.0, Redis, ES
3)单点登录
Q:我想开发智能客服,用于电商售后,现有学习的知识可以做吗,还需要哪些技术点
可以!
RAG,大模型选择 qwen-flash,业务场景(和AI进行交流,梳理业务场景和方案)
Q:为什么要开发 LLM应用,而不是直接用 DeepSeek网页
Function Call (高德天气、联网搜索、画图,… )
AI代码上生产必须一行一行审才放心
Q:为什么不直接调用。反而交给大模型调用
直接调用,传什么参数呢?(我们需要根据用户的提问,理解提取这个参数)
明天北京天气怎么样?
今天大连天气怎么样?
location, start_time => 大模型提参
大模型在Function Call中的作用:
1)理解用户的需求,选择适合的 Function Call
2)提取适合参数
Q:我问的其实就是说我们用function calling的时候都要去各种接口去申请账号吗
1)第三方服务,需要的
比如高德地图,墨迹天气
2)自己定义
send_email
个人调用不收,有免费限制
让大模型做决定,而不是写死
Q:这种调用和api调用有什么区别吗?
api调用 就是 LLM Function call中的一部分
LLM 交互,项目经理
可以用大模型再做二次的处理?
Q:LangChain 的tools就像包装好的functions 对吗?
是的
Q:function call需要模型支持,意思是不是需要大模型经过强化学习,返回function call需要的格式才叫做支持。是这样理解的吗
DeepSeek-V3, DeepSeek-R1 最早的版本是不支持Function Call
ChatGPT,
LangChain提出了function call, tool call
Q:大模型先语义理解,然后加工成json格式,接着传参么
对的
Q:function call与MCP在使用上有什么区别?
function call是给指定大模型提供的内部接口
MCP 是所有大模型提供的公共服务
Q:为什么要让LLM自己决定调用工具?这样会不会每次的输出不稳定?
LLM的好处和不足:
1)不足:
不稳定,这次调用 高德天气,下次可能调用 墨迹天气
2)好处:
因为用户的需求不是固定,问的问题 各种各样
LLM 泛化能力强
Q:和agent tool区别是啥
都是tool,LLM输出的reponse,需要自己解析
agent tool,在agent中 已经封装好了解析
Q:大模型怎么知道需要返回什么参数代表调用什么模型,是约定好了的吗?
输入参数 是需要告诉LLM
输出参数 LLM不需要提前知道,只要你将结果(可以是String,也可以是JSON)返回给LLM即可
Q:是不是langchain开发,就没有必要用function call了,就用langchain自身的tools。
langchain自己的tools是已经开发好的工具
如果我们想要打造自己的tool,需要自己定义
也可以用prompt稳定
Q:没有实现的tools怎么办,比如自己做的本地方法
高代码 开发这个 tool
比如 你想做股票价格的预测,你可以写一个 股票价格预测的函数,传入 股票代码,未来N天
定义函数的 输入和输出
Q:Temperature 设置得越低,是不是得到的置信度越高?
是的
大模型是一个概率性的生成工具,它学习了非常多的样本
Temperature 设置得越低答案越保守
Q:LangChain 的tools就像包装好的functions 对吗?
是的
Q:有function call的话要比没有多一次API call到大模型吧
AI native
Q:正常业务复杂点,查询肯定需要查视图,提示词里面怎么处理
将创建好的视图SQL 放到system prompt中
Q:调用千问和调用千问agent 主要区别是什么
qwen LLM 就是一堆参数,文本进,文本出
qwen-agent:理解成为一个"人",它的大脑(做决策,做理解)由qwen LLM来负责
tool
qwen-agent = qwen+ (tool + 知识库+开场白+gui)
Q:千问agent可以调用其他网站的API吗?
可以的
Q:查到数据以后的话术是LLM自己组织的语言吗?还是代码里要求LLM去解读数据
自己组织,LLM = 项目经理
Q:function call算不算简单的agent
Agent = 大而全的人
function call 是其中的一种能力
Q:exc_sql 与EXCTOOLSQL类是什么关系
exc_sql 是一个名称,在qwen-agent中的 工具名
EXCTOOLSQL 是代码实现
Q:在示例中, QWen好像也封装了一个类似LangChain的功能,QWen作为核心LLM,再附加一些工具类/LLM,内部实现是不是也是基于LangChain的?
功能和LangChain类似,但不是LangChain
Q:量化交易动不动就是投入几十亿,不是有了AI大模型就行吧
量化交易 是通过数据决策的,这里是传统AI
AI大模型 帮我们分析理解新闻
Q:不同的大模型 调用 function calling 的写法 格式 是不是不一样?如果不用dashscop 调用api 而是调用我本地部署的qwen 怎么写
qwen 都是一样的
openai 里面的function call的写法按照openai的写法(JSON格式的约束不同)
Q:每次调用大模型的时候都需要把所有的工具传给他吗?那不是很费token
传给它的是 工具的名称,参数的定义
Q:微服务的开发中,一般都要求功能解耦,方便维护。刚刚的例子表明大模型的开发中这种模式未必最优。那未来的开发中,如何平衡功能解耦与减少用大模型传递大量参数呢?
1)功能相对独立
2)如果功能A => 功能B,那么可以把 功能A和功能B 合并变成一个大的功能

被折叠的 条评论
为什么被折叠?



