使用 Qwen-Agent 最佳开源模型释放自主代理

探索 Qwen-Agent 开源模型的力量,了解如何通过函数调用和自定义代理创建来释放自主代理。发现量化对实际应用中模型性能的影响。

2025年2月24日

party-gif

使用Qwen-Agent,这个利用最佳开放权重模型的前沿开源框架,释放自主代理的力量。探索如何无缝集成函数调用和基于代理的工作流,构建能与现实世界互动并适应用户需求的智能应用程序。

使用最佳开放权重模型构建自主代理

阿里巴巴的Quen 2模型是最新和最强大的开源语言模型,在广泛的任务中展现了令人印象深刻的能力。这些模型的参数从5亿到720亿不等,较大的模型支持高达12.8万个标记 - 这大大超过了GPT-3的8,000个标记限制。

Quen 2的一个关键特点是它在编码和数学方面的出色表现,以及处理长上下文理解的能力 - 这对于现实世界的应用至关重要。此外,这些模型支持多种语言,包括对中东和东南亚语言的关注,这与许多其他模型过于集中于西方语言的焦点形成了鲜明对比。

为了利用Quen 2的强大功能,我们可以使用Quen Agent框架,它提供了内置的浏览器助手、代码解释器,以及创建自定义助手的能力。这使我们能够构建自主代理,根据手头的任务进行规划、执行和调整行动。

在本节中,我们将探讨如何使用Quen Agent创建一个定制的图像生成代理。该代理将能够根据用户输入生成图像,下载生成的图像,甚至在遇到任何问题时更新自己的代码。通过将Quen 2强大的语言理解能力与Quen Agent的规划和执行能力相结合,我们可以创造出真正自主和强大的代理,能够处理各种各样的任务。

函数调用和代理:了解差异

函数调用和代理是大型语言模型(LLM)世界中的两个不同概念。以下是它们之间差异的简要说明:

函数调用(工具使用):

  • 函数调用或工具使用允许LLM通过访问外部API或函数与外部世界进行交互。
  • LLM根据用户输入确定要使用的函数,生成函数所需的输入,并将结果返回给用户。
  • 但是,LLM本身无法执行函数调用;用户或单独的系统必须进行实际的函数调用并将结果返回给LLM。

代理:

  • 代理是更复杂的LLM实例,它们可以访问一组工具,就像在函数调用中一样。
  • 代理还可以进行规划,将任务分解为子目标,并使用可用的工具执行操作。
  • 代理可以访问短期和长期记忆,允许他们跟踪进度并相应地计划下一步行动。
  • 代理对于使LLM在实际应用中真正有用至关重要,因为他们可以自主完成复杂的任务。

总之,函数调用是一种更有限的交互,LLM只能生成函数所需的输入,而代理则具有规划、执行和调整行动以实现所需结果的能力。

开始使用Qwen代理:函数调用和代理使用

要开始使用Qwen代理,我们将使用Qwen 2的720亿版本,并使用AMA在本地运行它。你也可以使用他们的外部API,但要使用Qwen Agent,我们有两个选择:

  1. 作为独立的Python包通过pip安装软件包。
  2. 克隆存储库并在本地运行安装,如果你想要最新的开发版本。

我将使用AMA在本地运行它。首先,启动一个AMA服务器并使用olama Run Qwen 272 billion命令。这将下载AMA和模型,这可能需要一些时间,具体取决于您的网速。

接下来,使用conda创建一个虚拟环境并激活它:

conda create -n qwen python=3.10
conda activate qwen

现在,使用pip安装Qwen Agent软件包:

pip install qwen-agent

我们将从函数调用开始。该模型需要选择要使用的函数,确定输入,并将它们传递给Python解释器。解释器将执行该函数,获取响应,并将其反馈给LLM。

以下是获取当前天气的函数调用示例:

# 创建LLM实例
llm = QwenLLM(base_api="http://localhost:8000/v1", model_name="qwen-2-72b", version="v1")

# 用户消息
user_message = "What's the current weather like in Paris?"

# 定义函数
function_call = {
    "description": "Get the current weather for a given location",
    "function": "get_weather",
    "arguments": {
        "location": "Paris",
        "unit": "celsius"
    }
}

# 调用LLM并执行函数
response = llm.call_with_function(user_message, [function_call])
print(response)

这将生成巴黎的当前天气信息并将其返回给LLM。

现在,让我们看一个使用Qwen Agent的示例。我们将创建一个自定义代理,可以生成图像并将其下载到本地文件夹。该代理将使用自定义的图像生成工具和代码解释器来执行必要的代码。

from qwen_agent import Assistant, CodeInterpreter, CustomTool

# 定义自定义图像生成工具
class MyImageGeneration(CustomTool):
    def __init__(self):
        self.description = "Generate images based on user input using the Pollinations.AI API."

    def run(self, args):
        # 使用API生成图像
        image_url = generate_image(args["prompt"])
        
        # 将图像下载到本地文件夹
        download_image(image_url, "images")

        return f"Image generated and saved to 'images' folder."

# 创建代理
agent = Assistant(
    llm=QwenLLM(base_api="http://localhost:8000/v1", model_name="qwen-2-72b", version="v1"),
    tools=[MyImageGeneration(), CodeInterpreter()]
)

# 让代理生成图像
agent.run("Create an image of a llama wearing sunglasses.")

这个代理将使用自定义的图像生成工具创建图像,将其下载到"images"文件夹,并返回结果。

最后,让我们看看量化对Qwen模型性能的影响。Qwen团队已经提供了针对不同量化级别的MML、C-Evolve和I-Evolve指标的详细评估。

结果显示,对于较大的模型(72亿),16位和8位量化之间的差异并不显著,但4位量化可能会对性能产生更明显的影响。对于较小的模型(0.5亿),差异更加明显,4位量化会导致平均得分下降5个点。

总的来说,建议至少使用8位或16位量化进行生产部署,因为4位量化可能会对模型性能产生更大的影响,特别是对于较小的模型。

FAQ