Qwen-Agent开发教程!
Qwen-Agent是阿里开源的智能体开发框架,基于Qwen大模型,支持多种调用方式。摘要如下: 主要调用方式 DashScope SDK(官方推荐):功能完整,支持流式输出和多模态 OpenAI兼容接口:方便迁移项目 Qwen-Agent框架:支持工具调用和复杂应用开发 HTTP API直接调用:适合特殊需求场景 LangChain集成:与生态工具链结合 工具使用 通过@register_too
Qwen-Agent是阿里开源的智能体开发框架,基于Qwen模型,支持指令遵循、工具调用、规划和记忆等能力,适用于客户服务、内容创作等场景


一、通义千问(Qwen)大模型的几种主要调用方式:
1.DashScope SDK 方式(官方推荐):
from dashscope import Generationresponse = Generation.call(model='qwen-turbo',prompt='你好',api_key='your_api_key')
特点:
- 官方SDK,功能最完整
- 支持所有模型参数
- 提供完整的错误处理
- 支持流式输出
- 支持多模态输入
2.OpenAI 兼容接口方式:
from openai import OpenAIclient = OpenAI(api_key='your_api_key',base_url='https://dashscope.aliyuncs.com/api/v1')response = client.chat.completions.create(model='qwen-turbo',messages=[{'role': 'user', 'content': '你好'}])
特点:
- 与OpenAI API完全兼容
- 可以复用OpenAI的代码
- 适合迁移项目
- 支持流式输出
3.Qwen Agent 框架方式(如当前项目,使用智能体):
from qwen_agent.agents import Assistantllm_cfg = {'model': 'qwen-turbo','model_server': 'dashscope','api_key': 'your_api_key'}bot = Assistant(llm=llm_cfg)
特点:
- 提供完整的Agent功能
- 支持工具调用
- 内置对话管理
- 适合构建复杂应用
4.HTTP API 直接调用方式:
import requestsheaders = {'Authorization': f'Bearer your_api_key','Content-Type': 'application/json'}data = {'model': 'qwen-turbo','input': {'messages': [{'role': 'user', 'content': '你好'}]}}response = requests.post('https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation',headers=headers,json=data)
特点:
- 最基础的调用方式
- 完全控制请求过程
- 适合特殊需求场景
- 需要自己处理错误
5.LangChain 集成方式:
from langchain.llms import QianfanLLMllm = QianfanLLM(model_name='qwen-turbo',api_key='your_api_key')response = llm.predict('你好')
特点:
- 与LangChain生态集成
- 支持链式调用
- 适合构建AI应用
- 提供丰富的工具集成
选择建议:
1.如果是新项目:
- 简单对话:使用 DashScope SDK
- 复杂应用:使用 Qwen Agent 框架
- 需要工具链:使用 LangChain 集成
2.如果是迁移项目:
- 从OpenAI迁移:使用 OpenAI 兼容接口
- 需要完全控制:使用 HTTP API 直接调用
3.特殊场景:
- 需要流式输出:DashScope SDK 或 OpenAI 兼容接口
- 需要多模态:DashScope SDK
- 需要工具调用:Qwen Agent 框架
每种方式都有其适用场景,建议根据具体需求选择合适的调用方式。
二、Qwen-Agent 的工具使用方式
Qwen-Agent 是基于 Qwen 大模型的智能体框架,支持工具调用、任务规划和记忆管理。
1.定义工具
通过 @register_tool 装饰器注册自定义工具,需实现 call 方法:
from qwen_agent.tools.base import BaseTool, register_tool@register_tool('my_image_gen')class MyImageGen(BaseTool):def call(self, params: str):# 解析参数并执行逻辑return {"image_url": "https://example.com/image"}
2.配置 Agent
在 Assistant 中指定可用工具列表:
from qwen_agent.agents import Assistantllm_cfg = {'model': 'qwen3-235b', 'api_key': 'your_api_key'}bot = Assistant(llm=llm_cfg, function_list=['my_image_gen', 'code_interpreter'])
3.执行调用
通过 bot.run(messages) 触发工具调用:
messages = [{'role': 'user', 'content': '生成一张日落图片'}]response = bot.run(messages)
特点:
- 支持流式输出和多轮对话
- 自动解析用户意图并匹配工具
- 内置代码解释器、浏览器助手等工具
这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
01.Qwen-agent 使用FunctionCall
示例代码:qwen-agent 使用functioncall 添加天气查询工具
import osimport asyncioimport requestsfrom typing import Optionalimport dashscopefrom qwen_agent.agents import Assistantfrom qwen_agent.gui import WebUIimport pandas as pdfrom sqlalchemy import create_enginefrom qwen_agent.tools.base import BaseTool, register_tool# 定义资源文件根目录ROOT_RESOURCE = os.path.join(os.path.dirname(__file__), 'resource')# 配置 DashScopedashscope.api_key = os.getenv('DASHSCOPE_API_KEY', '') # 从环境变量获取 API Keydashscope.timeout = 30 # 设置超时时间为 30 秒functions_desc = [{"name": "get_current_weather","description": "获取指定位置的当前天气情况","parameters": {"type": "object","properties": {"location": {"type": "string","description": "城市名称,例如:北京",},"adcode": {"type": "string","description": "城市编码,例如:110000(北京)",}},"required": ["location"],},}]# ====== 天气查询工具实现 ======@register_tool('get_current_weather')class WeatherTool(BaseTool):"""天气查询工具,通过高德地图API查询指定位置的天气情况。"""description = '获取指定位置的当前天气情况'parameters = [{'name': 'location','type': 'string','description': '城市名称,例如:北京','required': True}, {'name': 'adcode','type': 'string','description': '城市编码,例如:110000(北京)','required': False}]def call(self, params: str, **kwargs) -> str:import jsonargs = json.loads(params)location = args['location']adcode = args.get('adcode', None)return self.get_weather_from_gaode(location, adcode)def get_weather_from_gaode(self, location: str, adcode: str = None) -> str:"""调用高德地图API查询天气"""gaode_api_key = "bda990017010b58718d952f26e0af777" # 高德API Keybase_url = "https://restapi.amap.com/v3/weather/weatherInfo"params = {"key": gaode_api_key,"city": adcode if adcode else location,"extensions": "base", # 可改为 "all" 获取预报}try:response = requests.get(base_url, params=params)if response.status_code == 200:data = response.json()if data.get('status') == '1' and data.get('lives'):weather_info = data['lives'][0]result = f"天气查询结果:\n城市:{weather_info.get('city')}\n天气:{weather_info.get('weather')}\n温度:{weather_info.get('temperature')}°C\n风向:{weather_info.get('winddirection')}\n风力:{weather_info.get('windpower')}\n湿度:{weather_info.get('humidity')}%\n发布时间:{weather_info.get('reporttime')}"return resultelse:return f"获取天气信息失败:{data.get('info', '未知错误')}"else:return f"请求失败:HTTP状态码 {response.status_code}"except Exception as e:return f"获取天气信息出错:{str(e)}"# ====== 初始化助手服务 ======def init_agent_service():"""初始化助手服务"""llm_cfg = {'model': 'qwen-turbo','timeout': 30,'retry_count': 3,}try:bot = Assistant(llm=llm_cfg,name='天气助手',description='天气助手,查询天气',system_message="你是一名有用的助手",function_list=['get_current_weather'], # 增加天气工具)print("助手初始化成功!")return botexcept Exception as e:print(f"助手初始化失败: {str(e)}")raisedef app_tui():"""终端交互模式提供命令行交互界面,支持:- 连续对话- 文件输入- 实时响应"""try:# 初始化助手bot = init_agent_service()# 对话历史messages = []while True:try:# 获取用户输入query = input('user question: ')# 获取可选的文件输入file = input('file url (press enter if no file): ').strip()# 输入验证if not query:print('user question cannot be empty!')continue# 构建消息if not file:messages.append({'role': 'user', 'content': query})else:messages.append({'role': 'user', 'content': [{'text': query}, {'file': file}]})print("正在处理您的请求...")# 运行助手并处理响应response = []for response in bot.run(messages):print('bot response:', response)messages.extend(response)except Exception as e:print(f"处理请求时出错: {str(e)}")print("请重试或输入新的问题")except Exception as e:print(f"启动终端模式失败: {str(e)}")def app_gui():"""图形界面模式,提供 Web 图形界面"""try:print("正在启动 Web 界面...")# 初始化助手bot = init_agent_service()# 配置聊天界面,列举3个典型门票查询问题chatbot_config = {'prompt.suggestions': ['北京今天的天气怎么样?',]}print("Web 界面准备就绪,正在启动服务...")# 启动 Web 界面WebUI(bot,chatbot_config=chatbot_config).run()except Exception as e:print(f"启动 Web 界面失败: {str(e)}")print("请检查网络连接和 API Key 配置")if __name__ == '__main__':# 运行模式选择app_gui() # 图形界面模式(默认)
02.Qwen-agent MCP +functioncall 混合调用
示例代码:qwen-agent 使用
gradio---chat-gui工具
functioncall (执行sql生成图表)+MCP (使用modelscope fetch网页查询)构建 门票助手 ui chat
import osimport asynciofrom typing import Optionalimport dashscopefrom qwen_agent.agents import Assistantfrom qwen_agent.gui import WebUIimport pandas as pdfrom sqlalchemy import create_enginefrom qwen_agent.tools.base import BaseTool, register_toolimport matplotlib.pyplot as pltimport ioimport base64import timeimport numpy as npimport json# 解决中文显示问题plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'SimSun', 'Arial Unicode MS'] # 优先使用的中文字体plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题# 定义资源文件根目录ROOT_RESOURCE = os.path.join(os.path.dirname(__file__), 'resource')# 配置 DashScopedashscope.api_key = os.getenv('DASHSCOPE_API_KEY', '') # 从环境变量获取 API Keydashscope.timeout = 30 # 设置超时时间为 30 秒# ====== 门票助手 system prompt 和函数描述 ======system_prompt = """我是门票助手,以下是关于门票订单表相关的字段,我可能会编写对应的SQL,对数据进行查询-- 门票订单表CREATE TABLE tkt_orders (order_time DATETIME, -- 订单日期account_id INT, -- 预定用户IDgov_id VARCHAR(18), -- 商品使用人ID(身份证号)gender VARCHAR(10), -- 使用人性别age INT, -- 年龄province VARCHAR(30), -- 使用人省份SKU VARCHAR(100), -- 商品SKU名product_serial_no VARCHAR(30), -- 商品IDeco_main_order_id VARCHAR(20), -- 订单IDsales_channel VARCHAR(20), -- 销售渠道status VARCHAR(30), -- 商品状态order_value DECIMAL(10,2), -- 订单金额quantity INT -- 商品数量);一日门票,对应多种SKU:Universal Studios Beijing One-Day Dated Ticket-StandardUniversal Studios Beijing One-Day Dated Ticket-ChildUniversal Studios Beijing One-Day Dated Ticket-Senior二日门票,对应多种SKU:USB 1.5-Day Dated Ticket StandardUSB 1.5-Day Dated Ticket Discounted一日门票、二日门票查询SUM(CASE WHEN SKU LIKE 'Universal Studios Beijing One-Day%' THEN quantity ELSE 0 END) AS one_day_ticket_sales,SUM(CASE WHEN SKU LIKE 'USB%' THEN quantity ELSE 0 END) AS two_day_ticket_sales我将回答用户关于门票相关的问题每当 exc_sql 工具返回 markdown 表格和图片时,你必须原样输出工具返回的全部内容(包括图片 markdown),不要只总结表格,也不要省略图片。这样用户才能直接看到表格和图片。我还可以帮助获取网页内容并转换为Markdown格式,用户可以提供网页链接,我将获取内容并整理。"""functions_desc = [{"name": "exc_sql","description": "对于生成的SQL,进行SQL查询","parameters": {"type": "object","properties": {"sql_input": {"type": "string","description": "生成的SQL语句",}},"required": ["sql_input"],},},]# --------------------------# 1. 定义 MCP 工具# --------------------------# 注意:这里定义的 mcp_tools 变量实际上没有被使用# MCP 配置应该在 config.json 中定义,或通过 mcp_config 参数传递# 移除未使用的变量# mcp_tools = [# {# "mcpServers": {# "fetch": {# "type": "sse",# "url": "https://mcp.api-inference.modelscope.net/c6635d75d8fa48/sse"# }# }# }# ]# ====== 会话隔离 DataFrame 存储 ======# 用于存储每个会话的 DataFrame,避免多用户数据串扰_last_df_dict = {}def get_session_id(kwargs):"""根据 kwargs 获取当前会话的唯一 session_id,这里用 messages 的 id"""messages = kwargs.get('messages')if messages is not None:return id(messages)return None# ====== exc_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:import jsonimport matplotlib.pyplot as pltimport io, os, timeimport numpy as npargs = json.loads(params)sql_input = args['sql_input']database = args.get('database', 'ubr')engine = create_engine(f'mysql+mysqlconnector://student123:student321@rm-uf6z891lon6dxuqblqo.mysql.rds.aliyuncs.com:3306/{database}?charset=utf8mb4',connect_args={'connect_timeout': 10}, pool_size=10, max_overflow=20)try:df = pd.read_sql(sql_input, engine)md = df.head(10).to_markdown(index=False)# 自动创建目录save_dir = os.path.join(os.path.dirname(__file__), 'image_show')os.makedirs(save_dir, exist_ok=True)filename = f'bar_{int(time.time()*1000)}.png'save_path = os.path.join(save_dir, filename)# 生成图表generate_chart_png(df, save_path)img_path = os.path.join('image_show', filename)img_md = f''return f"{md}\n\n{img_md}"except Exception as e:return f"SQL执行或可视化出错: {str(e)}"# ========== 通用可视化函数 ==========def generate_chart_png(df_sql, save_path):columns = df_sql.columnsx = np.arange(len(df_sql))# 获取object类型object_columns = df_sql.select_dtypes(include='O').columns.tolist()if columns[0] in object_columns:object_columns.remove(columns[0])num_columns = df_sql.select_dtypes(exclude='O').columns.tolist()if len(object_columns) > 0:# 对数据进行透视,以便为每个日期和销售渠道创建堆积柱状图pivot_df = df_sql.pivot_table(index=columns[0], columns=object_columns,values=num_columns,fill_value=0)# 绘制堆积柱状图fig, ax = plt.subplots(figsize=(10, 6))# 为每个销售渠道和票类型创建柱状图bottoms = Nonefor col in pivot_df.columns:ax.bar(pivot_df.index, pivot_df[col], bottom=bottoms, label=str(col))if bottoms is None:bottoms = pivot_df[col].copy()else:bottoms += pivot_df[col]else:print('进入到else...')bottom = np.zeros(len(df_sql))for column in columns[1:]:plt.bar(x, df_sql[column], bottom=bottom, label=column)bottom += df_sql[column]plt.xticks(x, df_sql[columns[0]])plt.legend()plt.title("销售统计")plt.xlabel(columns[0])plt.ylabel("门票数量")plt.xticks(rotation=45)plt.tight_layout()plt.savefig(save_path)plt.close()# ====== 初始化门票助手服务 ======def init_agent_service():"""初始化门票助手服务"""llm_cfg = {'model': 'qwen-turbo','timeout': 30,'retry_count': 3,}try:bot = Assistant(llm=llm_cfg,name='门票助手',description='门票查询与订单分析',system_message=system_prompt,function_list=['exc_sql',{'mcpServers': {'fetch': {'type': 'sse','url': 'https://mcp.api-inference.modelscope.net/c6635d75d8fa48/sse' }}}] # 只使用本地注册的工具)print("助手初始化成功!")return botexcept Exception as e:print(f"助手初始化失败: {str(e)}")raisedef app_tui():"""终端交互模式提供命令行交互界面,支持:- 连续对话- 文件输入- 实时响应"""try:# 初始化助手bot = init_agent_service()# 对话历史messages = []while True:try:# 获取用户输入query = input('user question: ')# 获取可选的文件输入file = input('file url (press enter if no file): ').strip()# 输入验证if not query:print('user question cannot be empty!')continue# 构建消息if not file:messages.append({'role': 'user', 'content': query})else:messages.append({'role': 'user', 'content': [{'text': query}, {'file': file}]})print("正在处理您的请求...")# 运行助手并处理响应response = []for response in bot.run(messages):print('bot response:', response)messages.extend(response)except Exception as e:print(f"处理请求时出错: {str(e)}")print("请重试或输入新的问题")except Exception as e:print(f"启动终端模式失败: {str(e)}")def app_gui():"""图形界面模式,提供 Web 图形界面"""try:print("正在启动 Web 界面...")# 初始化助手bot = init_agent_service()# 配置聊天界面,列举3个典型门票查询问题chatbot_config = {'prompt.suggestions': ['2023年4、5、6月一日门票,二日门票的销量多少?帮我按照周进行统计','2023年7月的不同省份的入园人数统计','帮我查看2023年10月1-7日销售渠道订单金额排名',]}print("Web 界面准备就绪,正在启动服务...")# 启动 Web 界面WebUI(bot,chatbot_config=chatbot_config).run()except Exception as e:print(f"启动 Web 界面失败: {str(e)}")print("请检查网络连接和 API Key 配置")if __name__ == '__main__':# 运行模式选择app_gui() # 图形界面模式(默认)
三、如何学习AI大模型?
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

更多推荐


所有评论(0)