通义千问2.5-7B-Instruct部署教程:支持工具调用,轻松构建Agent

1. 引言

想在自己的电脑上快速体验一个功能强大、支持工具调用、还能轻松构建智能体的开源大模型吗?今天要介绍的通义千问2.5-7B-Instruct,可能就是你的理想选择。

这个由阿里云在2024年9月发布的模型,虽然只有70亿参数,但能力却相当全面。它不仅能流畅地进行中英文对话,还特别擅长代码生成和数学推理。更重要的是,它原生支持工具调用(Function Calling)和JSON格式输出,这意味着你可以很方便地把它接入到各种自动化流程中,构建你自己的智能助手(Agent)。

对于开发者来说,最头疼的往往是环境配置和部署。好消息是,现在通过CSDN星图镜像,我们可以用最简单的方式——一键部署,来快速启动这个模型。本文将手把手带你完成从部署到使用的全过程,让你在10分钟内就能和这个聪明的“大脑”对话,并探索其工具调用的核心能力。

2. 环境准备与一键部署

2.1 理解部署方案

本次部署采用的是 vLLM + Open WebUI 的组合方案,这是一个非常高效且用户友好的选择。

  • vLLM:一个高性能的推理引擎,专门为大语言模型优化。它能显著提升模型的推理速度,并高效管理GPU内存,让你用更少的资源获得更快的响应。
  • Open WebUI:一个开源的、类似ChatGPT的Web用户界面。它提供了美观的聊天界面、对话历史管理、模型切换等功能,让你无需编写代码就能与模型交互。

这个镜像已经将两者完美集成,你只需要启动服务,打开浏览器,就能开始使用。

2.2 启动与访问服务

部署过程简单到令人惊讶,几乎不需要任何命令行操作。

  1. 启动镜像:在CSDN星图平台找到“通义千问2.5-7B-Instruct”镜像并启动。系统会自动为你分配计算资源并加载模型。
  2. 等待服务就绪:启动后,需要耐心等待几分钟。后台会依次完成两个关键任务:
    • 启动 vLLM 推理服务器,将模型加载到GPU内存中。
    • 启动 Open WebUI 前端服务。 当你在日志中看到相关服务启动成功的提示时,就表示准备就绪了。
  3. 访问Web界面:服务启动后,平台会提供一个访问链接(通常是一个URL)。直接点击或在浏览器中输入该链接,即可打开Open WebUI的登录界面。

登录信息: 为了方便体验,镜像预置了一个演示账号:

  • 账号kakajiang@kakajiang.com
  • 密码kakajiang

使用以上账号密码登录,你就进入了功能完整的聊天界面。

2.3 界面初探

登录后的界面非常直观:

  • 主聊天区域:中间最大的部分,在这里输入问题,模型会在这里回复。
  • 模型选择:通常在侧边栏或顶部,确认当前使用的模型是 Qwen2.5-7B-Instruct
  • 对话历史:左侧边栏会保存你所有的对话记录,方便随时回溯。
  • 参数设置:你可以找到温度(Temperature)、最大生成长度等参数的调节选项,用于控制模型回复的随机性和长度。

至此,你的个人专属大模型已经部署完成,接下来我们就可以开始探索它的核心能力了。

3. 基础功能与对话体验

让我们先抛开复杂的工具调用,看看这个模型作为一个普通的聊天助手,表现如何。你可以尝试问它各种问题。

3.1 通用知识问答

你可以从一些常识性问题开始:

  • “太阳系最大的行星是哪个?”
  • “简述一下光合作用的过程。”
  • “推荐几本经典的科幻小说。”

你会发现,模型不仅能给出准确答案,还能以结构清晰、语言流畅的方式进行阐述,比如使用分点说明。

3.2 内容创作与润色

这是大模型的强项,试试让它帮你进行一些文字工作:

  • 写一封邮件:“帮我写一封感谢面试官的邮件,语气要专业且诚恳。”
  • 生成创意:“为一家新开的咖啡馆想5个朗朗上口的slogan。”
  • 润色文本:“将下面这段话改得更正式、更优美:‘我们产品很好用,大家快来买。’”

模型在理解指令和风格转换上表现不错,能根据你的要求生成相应风格的文本。

3.3 代码生成与解释

对于开发者而言,代码能力至关重要。Qwen2.5-7B-Instruct在代码方面的表现是其亮点之一。

  • 生成代码:尝试提出具体需求。

    # 你可以直接输入:
    用Python写一个函数,计算斐波那契数列的第n项。
    

    模型很可能会回复一个使用递归或迭代的高效实现,并附上简要说明。

  • 解释代码:贴一段复杂的代码,让它帮你解释。

    # 输入一段代码,例如:
    def mystery_func(lst):
        return [x for x in lst if x % 2 == 0]
    请解释这段代码做了什么。
    

    模型能准确识别出这是一个列表推导式,用于筛选偶数。

  • 调试代码:给出一个有错误的代码片段,看它能否发现并修正。

    # 输入有错误的代码:
    def divide(a, b):
        return a / b
    print(divide(10, 0))
    这段代码有什么问题?如何修复?
    

通过这些简单的测试,你可以对模型的逻辑能力、知识广度和语言组织能力有一个基本的感受。接下来,我们将进入它最特色的功能——工具调用。

4. 核心实战:工具调用(Function Calling)功能详解

工具调用是让大模型从“聊天机器人”升级为“智能体(Agent)”的关键。它允许模型在推理过程中,识别出需要调用外部工具(如查询天气、计算、搜索数据库)来完成的任务,并以结构化格式(如JSON)请求调用。

4.1 什么是工具调用?

简单来说,就是教模型学会“使用工具”。你预先定义好一些工具(函数),告诉模型这些工具的名称、描述和参数。当用户的问题需要用到这些工具时,模型会主动说:“要回答这个问题,我需要调用XX工具,参数是YYY。” 然后由外部程序执行这个工具,并把结果返回给模型,模型再整合信息生成最终回复给用户。

例如,用户问:“北京今天天气怎么样?”

  1. 模型分析后认为需要调用 get_weather(location: string) 这个工具。
  2. 模型输出结构化请求:{"function": "get_weather", "arguments": {"location": "北京"}}
  3. 你的程序收到请求,真正去调用天气API获取数据。
  4. 将天气数据(如“晴,25度”)返回给模型。
  5. 模型组织语言回复用户:“北京今天天气晴朗,气温25摄氏度左右。”

4.2 在Open WebUI中配置工具

Open WebUI提供了便捷的界面来配置和管理工具。虽然本次镜像部署主要展示了对话功能,但了解如何配置工具对未来构建复杂应用至关重要。

  1. 找到工具配置:在Open WebUI的设置或高级选项中,寻找 Function CallingTools 相关的配置页面。
  2. 定义工具:你需要以JSON Schema的格式定义工具。例如,定义一个查询天气的工具:
    {
      "name": "get_weather",
      "description": "获取指定城市的当前天气信息",
      "parameters": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "description": "城市名称,例如:北京、上海"
          }
        },
        "required": ["location"]
      }
    }
    
  3. 关联执行后端:你还需要告诉Open WebUI,当模型请求调用 get_weather 时,应该将请求发送到哪个后端API地址。这通常需要一些额外的后端服务开发。

4.3 通过API直接体验工具调用

对于开发者和想深度体验的用户,更直接的方式是使用模型的API。由于镜像部署了vLLM,它提供了兼容OpenAI格式的API,我们可以用简单的Python脚本来测试。

首先,确保你能连接到部署好的vLLM服务(通常地址是 http://localhost:8000 或镜像提供的地址)。

import requests
import json

# 配置API端点
api_base = "http://localhost:8000/v1"  # 请替换为实际地址
chat_completion_url = f"{api_base}/chat/completions"

# 定义我们告诉模型的工具列表
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_time",
            "description": "获取当前的日期和时间",
            "parameters": {
                "type": "object",
                "properties": {},  # 这个工具不需要参数
                "required": []
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "calculator",
            "description": "执行一个简单的数学计算",
            "parameters": {
                "type": "object",
                "properties": {
                    "expression": {
                        "type": "string",
                        "description": "数学表达式,例如:3 + 5 * 2"
                    }
                },
                "required": ["expression"]
            }
        }
    }
]

# 构建请求:询问一个需要工具调用的问题
messages = [
    {"role": "user", "content": "请先告诉我现在的时间,然后计算一下(15 + 7) * 3 等于多少?"}
]

payload = {
    "model": "Qwen2.5-7B-Instruct", # 指定模型
    "messages": messages,
    "tools": tools, # 关键:传入工具定义
    "tool_choice": "auto", # 让模型自动决定是否调用工具
}

headers = {
    "Content-Type": "application/json"
}

response = requests.post(chat_completion_url, json=payload, headers=headers)
result = response.json()

print("模型的第一轮回复(工具调用请求):")
print(json.dumps(result, indent=2, ensure_ascii=False))

运行这段代码,模型不会直接回答时间或计算结果,而是会输出一个包含 tool_calls 的响应。这个响应里指明了它想调用哪个工具,以及参数是什么。

模拟工具执行: 你的程序需要解析这个 tool_calls,然后真正去执行“获取时间”和“计算表达式”这两个操作(这里我们模拟一下),再将结果以特定格式返回给模型进行下一步推理。

# 假设我们从上一轮响应中解析出模型要求调用工具:
# tool_calls = [{'get_current_time'}, {'calculator': {'expression': '(15+7)*3'}}]

# 模拟工具执行结果
tool_responses = [
    {
        "role": "tool",
        "content": "当前时间是:2024年1月15日 下午2:30", # 模拟获取的时间
        "tool_call_id": result['choices'][0]['message']['tool_calls'][0]['id'] # 需要对应ID
    },
    {
        "role": "tool",
        "content": "66", # (15+7)*3 = 66
        "tool_call_id": result['choices'][0]['message']['tool_calls'][1]['id']
    }
]

# 将工具执行结果作为新消息,连同历史消息,再次发送给模型
messages.append(result['choices'][0]['message']) # 加入模型刚才的请求
messages.extend(tool_responses) # 加入工具执行结果

payload["messages"] = messages
# 这次不需要再传tools,模型已经知道上下文

final_response = requests.post(chat_completion_url, json=payload, headers=headers)
final_result = final_response.json()

print("\n模型的最终回复(整合了工具结果):")
print(final_result['choices'][0]['message']['content'])

通过这个流程,你就能看到模型如何协调多个工具调用,并整合信息生成最终回答。这就是构建智能体(Agent)的基础。

5. 构建简易Agent的思路与示例

基于上面的工具调用,我们可以构思一个简单的天气预报Agent。

5.1 定义Agent工作流

  1. 工具定义:定义一个 get_weather 函数,它接收城市名参数,并调用真实天气API(如和风天气、OpenWeatherMap)。
  2. 系统提示词:给模型一个明确的身份和指令。

    “你是一个天气预报助手。当用户询问天气时,你必须调用 get_weather 工具来获取数据,然后根据数据生成友好、详细的天气报告。”

  3. 用户提问:用户问“上海明天天气怎么样?”
  4. 模型决策:模型根据提示词,输出调用 get_weather(“上海”) 的请求。
  5. 执行与整合:你的后端程序调用真实API获取上海天气数据,返回给模型。模型再组织语言回复用户:“上海明天白天多云转晴,气温18-25摄氏度,东南风3-4级,适合外出。”

5.2 扩展可能性

你可以定义更多工具,打造更强大的Agent:

  • search_web(query): 联网搜索最新信息。
  • send_email(to, subject, body): 发送邮件。
  • query_database(sql): 查询业务数据库。
  • execute_command(cmd): 执行系统命令(需极其谨慎)。

通过将Qwen2.5-7B-Instruct作为“大脑”,它负责理解用户意图、规划步骤、调用工具,你负责提供可靠的工具执行后端,一个能自动处理复杂任务的智能体就初具雏形了。

6. 总结

通过本次部署教程,我们完成了从零启动通义千问2.5-7B-Instruct模型,到体验其基础对话能力,再到深入探索其核心特色——工具调用的全过程。这个7B参数的模型在性能、功能与资源消耗之间取得了优秀的平衡。

回顾核心要点

  1. 部署极简:利用 vLLM + Open WebUI 的集成镜像,实现了真正的一键部署和开箱即用,大大降低了使用门槛。
  2. 能力全面:模型在对话、代码、推理等方面表现扎实,足以应对日常开发和学习中的多种任务。
  3. 功能特色突出:原生支持的工具调用(Function Calling)和JSON格式输出,是其区别于许多同类模型的最大亮点,为构建自动化智能体(Agent)提供了坚实的技术基础。
  4. 生态友好:模型量化后对硬件要求亲民,且集成度高,方便融入现有技术栈。

对于开发者、研究者和技术爱好者来说,通义千问2.5-7B-Instruct是一个绝佳的起点。你可以用它快速搭建原型,探索智能体应用,或者作为一个可靠的本地化知识助手。下一步,不妨尝试为你定义的工具编写真实的后端逻辑,开启你的第一个智能体项目。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐