【AI大模型Agent探索】深入探索实践 Qwen-Agent 的 Function Calling

news2024/11/15 10:22:11

系列篇章💥

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 功能调用的工作流程

  1. 定义工具:开发者定义工具函数,包括其名称、功能描述、所需参数等。
  2. 注册工具:将定义好的工具函数注册到 Qwen-Agent 中,使其可供 AI 模型调用。
  3. 模型调用:在处理用户请求时,AI 模型根据需要调用相应的工具函数。
  4. 执行与反馈:工具函数执行操作,并将结果反馈给 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的探索之旅,一起开启智能时代的大门!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1935559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

django报错(二):NotSupportedError:MySQL 8 or later is required (found 5.7.43)

执行python manage.py runserver命令时报版本不支持错误,显示“MySQL 8 or later is required (found 5.7.43)”。如图: 即要MySQL 8或更高版本。但是企业大所数用的还是mysql5.7相关版本。因为5.7之后的8.x版本是付费版本,贸然更新数据库肯定…

JAVASE-医疗管理系统项目总结

文章目录 项目功能架构运行截图数据库设计设计模式应用单列设计模式JDBC模板模板设计模式策略模式工厂设计模式事务控制代理模式注解开发优化工厂模式 页面跳转ThreadLocal分页查询实现统计模块聊天 项目功能架构 传统的MVC架构,JavaFX桌面端项目,前端用…

水经微图Web版1.10.0发布

水经微图(简称“微图”)新版已上线,在该版本中主要新增了三调图例符号库,以及其它功能的优化。 当前版本 当前版本号为:1.10.0-beta.2 如果你发现该版本中存在问题,请及时反馈给我们修订。 关于我们产品…

Adobe国际认证详解-影视后期

在当今的数字媒体时代,影视后期制作作为创意产业的核心环节,对于专业技能的要求日益提高。Adobe国际认证,作为全球创意设计领域的重要标杆,为影视后期制作人员提供了一个展示自我、提升技能的国际舞台。 何为影视后期?…

javaEE (3)

Json json--JavaScript object notation (js对象表现形式) 在后端将java对象转为json格式的字符串 有很多第三方组件,可以直接将java对象转为json格式的字符串 new objectMapper().writeValueAsString(); 返回string类型 <!-- jackson--><dependency>&…

华为od机试真题 — 分披萨(Python)

题目描述 “吃货”和“馋嘴”两人到披萨店点了一份铁盘(圆形)披萨&#xff0c;并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。 但是粗心服务员将披萨切成了每块大小都完全不同奇数块&#xff0c;且肉眼能分辨出大小。 由于两人都想吃到最多的披萨&#xff0c;他们商量…

Open3d入门 点云拼接算法

点云拼接&#xff08;Point Cloud Stitching&#xff09;是将从不同视角或位置获取的多组点云数据对齐到同一个坐标系中的过程&#xff0c;以形成一个完整的三维模型。这项技术在计算机视觉、机器人导航、三维重建和无人驾驶等领域有着广泛的应用。 点云配准&#xff08;Point…

Qt 制作安装包

记录使用Qt工具制作一个安装包的过程 目录 1.准备工作 1.1检查Qt Installer Frameworks是否安装 1.2.安装Qt Installer Frameworks 1.3准备release出来的exe dll等文件 2.创建打包工程所需要的文件及目录 2.1创建子目录 2.2 创建工程文件 2.3 创建config/config.xml …

5.4 软件工程-系统设计

系统设计 - 概述 设计软件系统总体结构 数据结构及数据库设计 编写概要设计文档、评审 详细设计的基本任务 真题

HDU1011——Starship Troopers(树形DP),HDU1012——u Calculate e,HDU1013——Digital Roots

目录 HDU1011——Starship Troopers&#xff08;树形DP&#xff09; 题目描述 运行代码 代码思路 树形DP HDU1012——u Calculate e 题目描述 运行代码 代码思路 HDU1013——Digital Roots 题目描述 超时代码 改进后依旧超时代码 运行代码 代码思路 HDU1011——…

工时记录软件选型指南

国内外主流的10款工时计算软件对比&#xff1a;PingCode、Worktile、Tita、易企秀、奇鱼、Teambition、Timely、Toggl Track、RescueTime、ClickUp。 在忙碌的工作中&#xff0c;记录和管理工时常常是令人头疼的问题。工时记录软件的选择不仅能帮你省时省力&#xff0c;还能大幅…

视频素材网站无水印的有哪些?热门视频素材网站分享

当我们走进视频创作的精彩世界时&#xff0c;一个难题常常摆在面前——那些高品质、无水印的视频素材究竟应该在哪里寻找&#xff1f;许多视频创作者感叹&#xff0c;寻找理想的视频素材难度甚至超过了寻找伴侣&#xff01;但不用担心&#xff0c;今天我将为您介绍几个优质的视…

理解UI设计:UI设计师的未来发展机遇

UI设计师的出现是互联网时代的设计变革。随着移动互联网的快速发展&#xff0c;移动产品设计师非常短缺。高薪资让许多其他行业的设计师已经转向了UI设计。那么什么是UI设计呢&#xff1f;UI设计师负责什么&#xff1f;UI设计的发展趋势和就业前景如何&#xff1f;这些都是许多…

C++仓库管理系统

功能 代码在效果图后面 1.添加物品 2.删除物品 3.更新物品数量 4.查询物品 5.列出所有物品 6.保存并退出 注意事项&#xff1a;退出要输入“6”退出才能保存数据&#xff0c;不要直接按X关掉窗口&#xff08;不会保存数据&#xff09;。 效果图 源代码 编…

C语言 底层逻辑详细阐述指针(一)万字讲解 #指针是什么? #指针和指针类型 #指针的解引用 #野指针 #指针的运算 #指针和数组 #二级指针 #指针数组

文章目录 前言 序1&#xff1a;什么是内存&#xff1f; 序2&#xff1a;地址是怎么产生的&#xff1f; 一、指针是什么 1、指针变量的创建及其意义&#xff1a; 2、指针变量的大小 二、指针的解引用 三、指针类型存在的意义 四、野指针 1、什么是野指针 2、野指针的成因 a、指…

Unity客户端接入原生Google支付

Unity客户端接入原生Google支付 1. Google后台配置2. 开始接入Java部分C#部分Lua部分 3. 导出工程打包测试参考踩坑注意 1. Google后台配置 找到内部测试&#xff08;这个测试轨道过审最快&#xff09;&#xff0c;打包上传&#xff0c;这个包不需要接入支付&#xff0c;如果已…

机器人开源调度系统OpenTcs6-架构运行分析

系统启动 启动 Kernel&#xff1a;加载核心应用&#xff0c;初始化系统配置和状态。 启动 Plant Overview&#xff1a;加载图形用户界面&#xff0c;初始化模型和用户界面。 模型导入和配置 在 Plant Overview 中导入或创建工厂布局模型。 配置路径、位置和车辆信息。 车辆连…

用DrissionPage过某里滑块分析

最近我又在找工作了&#xff0c;悲哀啊~&#xff0c;面试官给了一道题&#xff0c;要求如下&#xff1a; 爬虫机试&#xff1a;https://detail.1688.com/offer/643272204627.html 过该链接的滑动验证码&#xff0c;拿到正确的商品信息页html&#xff0c;提取出商品维度的信息&a…

排序一次讲清(从冒泡到基数)

文章目录 冒泡原理代码pythonc 选择原理代码pythonc 插入原理代码pythonc 希尔原理代码pythonc 快排原理代码pythonc 归并原理代码pythonc 堆原理代码pythonc 计数原理代码pythonc 桶原理代码pythonc 基数原理代码pythonc 【待更新】 冒泡 原理 如果我们想要让数组从左至右从…

海豚调度器(DolphinScheduler)集群搭建详细笔记

海豚调度器集群搭建笔记 1.DolphinScheduler Cluster部署1.1 集群部署规划1.2 集群准备工作1.3 初始化数据库1.4 修改安装环境配置1.5 安装DolphinScheduler1.6 启停命令1.7 登录 DolphinScheduler UI 1.DolphinScheduler Cluster部署 分布式去中心化易扩展的工作流任务调度系…