当前位置: 代码网 > 科技>人工智能>机器学习 > 【AI大模型Agent探索】深入探索实践 Qwen-Agent 的 Function Calling

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

2024年07月28日 机器学习 我要评论
本文将深入探讨 Qwen-Agent 的核心特性之一——功能调用(Function Calling)。这是一种允许 AI 模型直接与外部工具和API进行交互的能力,极大地扩展了 AI 模型的应用范围。通过实际的编码实践,我们将展示如何利用这一机制,将 AI 的决策能力和外部工具的功能性紧密结合,以实现更加丰富和高效的自动化服务。

系列篇章💥

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


引言

在当今快速发展的人工智能领域,大型语言模型(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应用探索实践🔥🔥🔥 其他专栏可以查看📑

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com