【AI大模型Agent探索】深入探索实践 Qwen-Agent 的 Function Calling
系列篇章💥
No. | 文章 |
---|---|
1 | 【Qwen部署实战】探索Qwen-7B-Chat:阿里云大型语言模型的对话实践 |
2 | 【Qwen2部署实战】Qwen2初体验:用Transformers打造智能聊天机器人 |
3 | 【Qwen2部署实战】探索Qwen2-7B:通过FastApi框架实现API的部署与调用 |
4 | 【Qwen2部署实战】Ollama上的Qwen2-7B:一键部署大型语言模型指南 |
5 | 【Qwen2部署实战】llama.cpp:一键部署高效运行Qwen2-7B模型 |
6 | 【Qwen2部署实战】部署高效AI模型:使用vLLM进行Qwen2-7B模型推理 |
7 | 【AI大模型Agent探索】Qwen-Agent:基于Qwen的LLM应用开发框架 |
8 | 【AI大模型Agent探索】深入探索实践 Qwen-Agent 的 Function Calling |
目录
- 系列篇章💥
- 引言
- 1、概述
- 1.1 功能调用(Function Calling)的定义
- 1.2 功能调用的重要性
- 1.3 功能调用的工作流程
- 1.4 功能调用的实际应用
- 1.5 开发者如何利用功能调用
- 2、安装部署实操
- 3、本地模型部署
- 4、Function Calling开发实践
- 4.1导入依赖库
- 4.2模拟一个外部工具函数
- 4.3测试Qwen2-7B-Instruct 的OpenAI风格的API
- 4.4定义LLM
- 4.5定义工具函数信息
- 4.6定义messages消息
- 4.7第一次请求大模型(查找工具函数)
- 4.8将响应内容放入消息中备用
- 4.9第二次大模型调用
- 结语
- 项目地址
引言
在当今快速发展的人工智能领域,大型语言模型(LLMs)已经成为推动技术革新的关键力量。它们不仅在理解复杂语言结构、生成创造性内容、甚至在提供深入的决策支持方面展现出了前所未有的能力,而且正在不断地拓宽我们对机器智能的认识边界。
在这样的背景下,Qwen-Agent 的出现标志着一个重要的里程碑。它是一个创新的框架,专门设计用于开发基于大型语言模型的应用程序。Qwen-Agent 不仅仅局限于语言理解,它还通过整合功能调用(Function Calling)、代码解释、记忆能力等先进特性,使得开发者能够构建出真正智能、高度自适应的代理(Agents)。
本文将深入探讨 Qwen-Agent 的核心特性之一——功能调用(Function Calling)。这是一种允许 AI 模型直接与外部工具和API进行交互的能力,极大地扩展了 AI 模型的应用范围。通过实际的编码实践,我们将展示如何利用这一机制,将 AI 的决策能力和外部工具的功能性紧密结合,以实现更加丰富和高效的自动化服务。
1、概述
在人工智能的丰富领域中,Qwen-Agent 以其独特的架构和功能,为开发者提供了一个强大的工具集,用于构建高度智能化的助手。本章将重点介绍 Qwen-Agent 的核心特性之一——功能调用(Function Calling),这是实现智能代理与外部工具无缝集成的关键技术。
1.1 功能调用(Function Calling)的定义
功能调用是 Qwen-Agent 的一项基础能力,它允许 AI 模型在处理任务时主动调用预定义的函数或工具。这些工具可以是内部定义的函数,也可以是外部的 API 服务,它们为 AI 提供了执行特定操作的能力,从而扩展了 AI 的应用范围。
1.2 功能调用的重要性
- 扩展性:通过功能调用,AI 模型不再局限于其内置的能力,能够执行更多样化的任务。
- 灵活性:开发者可以根据需求轻松集成新的工具或服务,使 AI 代理能够适应不断变化的应用场景。
- 实用性:功能调用使得 AI 能够直接与现实世界的数据和操作交互,提高了 AI 解决实际问题的能力。
1.3 功能调用的工作流程
- 定义工具:开发者定义工具函数,包括其名称、功能描述、所需参数等。
- 注册工具:将定义好的工具函数注册到 Qwen-Agent 中,使其可供 AI 模型调用。
- 模型调用:在处理用户请求时,AI 模型根据需要调用相应的工具函数。
- 执行与反馈:工具函数执行操作,并将结果反馈给 AI 模型,模型据此继续对话或任务处理。
1.4 功能调用的实际应用
- 数据检索:AI 模型可以调用工具函数来检索数据库中的数据,为用户提供最新信息。
- 自动化操作:通过调用自动化脚本或程序,AI 模型可以执行文件处理、数据录入等任务。
- 智能决策支持:集成分析工具,AI 模型可以为用户提供基于数据的决策建议。
1.5 开发者如何利用功能调用
开发者可以利用 Qwen-Agent 的功能调用机制,开发出能够解决特定问题的智能代理。无论是通过编写自定义的函数,还是通过集成现有的 API 服务,功能调用都为开发者提供了极大的自由度和创新空间。
2、安装部署实操
Qwen-Agent 的安装部署过程简单明了,可以通过以下步骤快速开始:
pip install -U qwen-agent
从 GitHub 安装最新版本:
git clone https://github.com/QwenLM/Qwen-Agent.git cd Qwen-Agent pip install -e ./
安装可选依赖(如果需要内置 GUI 支持):
pip install -U qwen-agent[gui] # 或,从源代码安装最新版本: pip install -e ./[gui]
3、本地模型部署
先采用vLLM进行Qwen2-7B模型部署,启用OpenAI风格的API接口,
下载Qwen2-7B-Instruct 到本地/root/autodl-tmp/qwen目录,执行下面命令,启动OpenAI风格的API接口
python -m vllm.entrypoints.openai.api_server --model /root/autodl-tmp/qwen/Qwen2-7B-Instruct --served-model-name Qwen2-7B-Instruct --max-model-len=2048
具体参考文章:《部署高效AI模型:使用vLLM进行Qwen2-7B模型推理》
4、Function Calling开发实践
接下来我们通过代码来体验Qwen-Agent的Function Calling功能。以获取天气信息为例,我们不仅调用了 get_current_weather 函数,还将结果反馈给 AI 模型,使其能够提供更准确的回答。这个过程展示了 Function Calling 如何使 AI 模型与外部数据源交互,增强了对话的实用性和准确性。
4.1导入依赖库
首先,我们需要导入 Python 标准库中的一些模块,以及 Qwen-Agent 框架中的关键组件。
# 导入Python标准库中的json模块,用于处理JSON数据 import json # 导入Python标准库中的os模块,用于操作系统功能,如环境变量 import os # 从qwen_agent.llm模块导入get_chat_model函数 from qwen_agent.llm import get_chat_model
4.2模拟一个外部工具函数
# 示例虚拟函数,硬编码为返回相同的天气 # 在生产环境中,这可以是您的后端API或外部API def get_current_weather(location, unit='华氏度'): """获取给定地点的当前天气""" if '东京' in location.lower(): return json.dumps({'location': '东京', 'temperature': '10', 'unit': '摄氏度'}) elif '旧金山' in location.lower(): return json.dumps({'location': '旧金山', 'temperature': '72', 'unit': '华氏度'}) elif '巴黎' in location.lower(): return json.dumps({'location': '巴黎', 'temperature': '22', 'unit': '摄氏度'}) else: return json.dumps({'location': location, 'temperature': '未知'})
4.3测试Qwen2-7B-Instruct 的OpenAI风格的API
测试本地Qwen2-7B模型的OpenAI风格的API接口服务是否正常
from openai import OpenAI openai_api_key = "sk-xxx" # 随便填写,只是为了通过接口参数校验 openai_api_base = "http://localhost:8000/v1" client = OpenAI( api_key=openai_api_key, base_url=openai_api_base, ) chat_outputs = client.chat.completions.create( model="Qwen2-7B-Instruct", messages=[ {"role": "system", "content": "你是一个智能AI助手"}, {"role": "user", "content": "你好"}, ] ) print(chat_outputs)
输出:
ChatCompletion(id='cmpl-2e9883ed58154fa5bc6ff63886aea585', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='你好!很高兴能帮助你。有什么问题或需要我提供的信息吗?', role='assistant', function_call=None, tool_calls=None), stop_reason=None)], created=1719843868, model='Qwen2-7B-Instruct', object='chat.completion', system_fingerprint=None, usage=CompletionUsage(completion_tokens=17, prompt_tokens=19, total_tokens=36))
4.4定义LLM
使用本地的模型定义LLM
llm = get_chat_model({ 'model': 'Qwen2-7B-Instruct', 'model_server': 'http://localhost:8000/v1', # api_base 'api_key': 'EMPTY', # 使用 DashScope 提供的模型服务: #'model': 'qwen1.5-14b-chat', #'model_server': 'dashscope', #'api_key': os.getenv('DASHSCOPE_API_KEY'), # 使用 DashScope 提供的与 OpenAI 兼容的模型服务: # 'model': 'qwen1.5-14b-chat', # 'model_server': 'https://dashscope.aliyuncs.com/compatible-mode/v1', # 'api_key': os.getenv('DASHSCOPE_API_KEY'), # 使用 Together.AI 提供的模型服务: # 'model': 'Qwen/Qwen1.5-14B-Chat', # 'model_server': 'https://api.together.xyz', # api_base # 'api_key': os.getenv('TOGETHER_API_KEY'), })
4.5定义工具函数信息
functions = [{ 'name': 'get_current_weather', 'description': '获取给定位置的当前天气', 'parameters': { 'type': 'object', 'properties': { 'location': { 'type': 'string', 'description': '城市和州,例如加利福尼亚州旧金东京山', }, 'unit': { 'type': 'string', 'enum': ['摄氏度', '华氏度'] }, }, 'required': ['location'], }, }]
4.6定义messages消息
messages = [{'role': 'user', 'content': "东京的天气怎么样?"}]
4.7第一次请求大模型(查找工具函数)
print('# 助手回复 1:') responses = [] for responses in llm.chat( messages=messages, functions=functions, stream=True,#True # 注意:extra_generate_cfg 是可选的 # extra_generate_cfg=dict( # # 注意:如果 function_choice='auto',让模型决定是否调用函数 # # function_choice='auto', # 如果没有设置 function_choice,默认是 'auto' # # 注意:设置 function_choice='get_current_weather' 强制模型调用此函数 # function_choice='get_current_weather', # ), ): print(responses)
输出:
4.8将响应内容放入消息中备用
messages.extend(responses) # 用助手的回复扩展对话
查看messages
messages
输出:
4.9第二次大模型调用
1、取出工具函数进行手工调用 2、将响应结果给到大模型进行整理增强
# 第 2 步:检查模型是否想要调用一个函数 last_response = messages[-1] # 检查变量 last_response 是否包含键 function_call 并且其值不为 None if last_response.get('function_call', None): # 第 3 步:调用函数 # 注意:JSON 响应可能不是有效的;确保要处理错误 available_functions = { 'get_current_weather': get_current_weather, } # 此示例中只有一个函数,但您可以有多个 function_name = last_response['function_call']['name'] function_to_call = available_functions[function_name] function_args = json.loads(last_response['function_call']['arguments']) function_response = function_to_call( location=function_args.get('location'), unit=function_args.get('unit'), ) print('# 函数响应:') print(function_response) # 第 4 步:将每个函数调用和函数响应的信息发送给模型 messages.append({ 'role': 'function', 'name': function_name, 'content': function_response, }) # 用函数响应扩展对话 print('# 助手回复 2:') for response in llm.chat( messages=messages, functions=functions, stream=True,#True ): # 在模型能够看到函数响应的情况下获取模型的新回复 print(response)
输出:
response[-1]
输出:
{'role': 'assistant', 'content': '东京的当前气温是10摄氏度。'}
结语
本文的探索之旅让我们深刻理解了 Qwen-Agent 框架及其功能调用(Function Calling)特性的重要性和潜力。Qwen-Agent 以其卓越的能力,将 AI 的深度学习能力与外部工具的实用操作无缝融合,为智能自动化服务的发展开辟了新天地。在这个过程中,我们见证了如何通过简单的代码实现复杂的功能,如何让 AI 模型更加智能和自适应。
面向未来,我们有理由相信,Qwen-Agent 将在 AI 技术的广阔天地中继续绽放光彩,带来更多激动人心的创新和突破。在安全和伦理的框架内,Qwen-Agent 的发展既快速又负责任。希望大家一起加入AI的旅程,一起探索、创造,并迎接智能自动化服务的新时代。随着本文的结束,我们的探索并未停止,而是开启了新的篇章。
项目地址
Qwen-Agent GitHub
🎯🔖更多专栏系列文章:AI大模型提示工程完全指南、AI大模型探索之路(零基础入门)、AI大模型预训练微调进阶、AI大模型开源精选实践、AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑
😎 作者介绍:我是寻道AI小兵,资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索。
📖 技术交流:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,加入技术交流群,开启编程探索之旅。
💘精心准备📚500本编程经典书籍、💎AI专业教程,以及高效AI工具。等你加入,与我们一同成长,共铸辉煌未来。
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我,让我们携手同行AI的探索之旅,一起开启智能时代的大门!