在这里插入图片描述

在上一篇博文中,我们详细阐述了如何构建工具以及工具的属性。本篇博文我们将更进一步,探索大模型是如何分析用户需求,并决定调用特定工具来完成任务的。我们将从代码层面剖析其工作原理,并阐明大模型(LLM)与代理(Agent)在工具使用上的核心区别。


第一步:让大模型“看懂”你的工具

要让大模型能够使用工具,我们首先需要让它“理解”我们有哪些工具,以及这些工具分别能做什么。

1. 初始化大模型

万事开头,我们需要一个作为“大脑”的大语言模型。这里我们以 Langchain 结合 OpenAI 的模型为例。

import os
import dotenv
from langchain_openai import ChatOpenAI

# 加载环境变量 (API KEY等)
dotenv.load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")

# 初始化大模型
llm = ChatOpenAI(
    model=os.environ.get("CHAT_MODEL")
)

这段代码非常基础,我们在本系列博文初期已经详细阐述了这种调用代码的结构方式,它加载了必要的凭证并初始化了我们指定的大语言模型,这个 llm 对象就是我们后续进行所有分析和决策的核心。

2. 定义与“翻译”工具

接下来,我们需要定义可用的工具,并将其转换为大模型能够理解的格式。

from langchain.tools import MoveFileTool
from langchain_core.utils.function_calling import convert_to_openai_function

# 1. 定义我们的工具列表
tools = [MoveFileTool()]

# 2. 将工具转换为大模型能理解的 "Function" 格式
functions = [convert_to_openai_function(t) for t in tools]

功能说明与使用方法:

  • tools = [MoveFileTool()] 我们首先定义一个工具列表。MoveFileTool 是 Langchain 内置的一个工具,它可以执行移动文件的操作。在实际应用中,这里可以是我们自定义的任何函数,例如 query_database, send_email 等。
  • convert_to_openai_function(t) 这是至关重要的一步。
    • 为什么需要转换? 大模型本身并不直接“运行”Python的 Tool 对象。它依赖于一个标准化的描述格式(在OpenAI中称为 Function Calling Schema)。这个格式通常是一个JSON对象,详细描述了函数的名称(name)、功能描述(description)以及所需参数(parameters)
    • 如何工作? convert_to_openai_function 的作用就是读取 MoveFileTool 对象的元数据(例如,它的名称是 move_file,描述是“Move or rename a file from a source path to a destination path.”,参数是source_pathdestination_path),并将其“翻译”成上述标准格式。只有这样,大模型在进行分析时,才能准确地知道“哦,我有一个叫move_file的工具,它能移动文件,并且需要源路径和目标路径这两个参数”。

第二步:意图分析 - 大模型如何“决策”

准备工作就绪后,我们来看看大模型是如何根据用户的输入来决定是否以及如何使用这些工具的。

3. 调用模型并解析响应

我们将用户的提问(消息)和我们处理好的工具(functions)一起传递给大模型。

from langchain_core.messages import HumanMessage

# 准备用户输入
messages = [HumanMessage(content="请帮我把文件 a.txt 移动到 /Users/Desktop 目录下")]

# 调用大模型,同时传入消息和工具定义
response = llm.invoke(
    input=messages,
    functions=functions,
)

大模型的响应 response 会根据它对用户意图的分析,呈现出截然不同的结构。让我们通过两个测试来对比:

测试 1:用户意图与工具相关(“将文件a移动到桌面”)

模型会判断出这个任务需要使用 move_file 工具。此时,它的返回结果 AIMessage 核心属性如下:

content: '' (内容为空字符串)

说明: 因为模型决定调用工具,它认为自己无需直接回答用户,而是将任务“委托”给了工具。

additional_kwargs: {'function_call': {'name': 'move_file', 'arguments': '{\n  "source_path": "a.txt",\n  "destination_path": "/Users/Desktop/a.txt"\n}'}}

说明: 关键内容信息。function_call 字段被填充。

  • name: move_file,准确地指明了要调用的工具名称。
  • arguments: 一个JSON字符串,包含了从用户输入中提取出的、执行该工具所需的所有参数。

测试 2:用户意图与工具无关(“今天天气怎么样?”)

模型发现没有任何工具能回答这个问题,于是会像一个普通聊天机器人一样回复。

content: '很抱歉,我无法查询实时天气信息。' (或其他类似文本)
  • 说明:由于没有分析出需要调用的工具,function_call 字段不存在,additional_kwargs 字段为空或无实际价值内容。

总结

大模型是否决定使用工具,其判断依据完全体现在返回消息的 additional_kwargs 中是否包含 function_call 字段。这是我们程序逻辑的分水岭。


第三步:从“分析”到“执行”

大模型完成了最困难的“分析”工作,但它本身并不会去执行。执行需要我们编写代码来完成。

4. 检查并执行工具

我们的应用程序需要检查模型的响应,如果存在 function_call,就解析它并真正地运行对应的工具。

# 检查模型是否意图调用工具
if "function_call" in response.additional_kwargs:
    # 1. 解析出工具名称和参数
    tool_name = response.additional_kwargs["function_call"]["name"]
    tool_args = json.loads(response.additional_kwargs["function_call"]["arguments"])

    print(f"大模型决定调用工具:{tool_name}")
    print(f"提取出的参数:{tool_args}")

    # 2. 手动调用对应的工具并执行
    if tool_name == "move_file":
        tool = MoveFileTool()
        result = tool.run(tool_args)
        print(f"工具执行结果:{result}")

else:
    # 如果模型没有调用工具,直接打印其回复
    print(f"模型回复: {response.content}")

功能说明与使用方法:

这段代码逻辑清晰地展示了如何“响应”大模型的决策。

  1. 通过 if "function_call" in ... 来判断分支。
  2. 如果为真,就从 additional_kwargs 中提取名称和参数。
  3. 然后,根据工具名称,创建相应的工具实例 (MoveFileTool()),并使用 .run() 方法传入参数来执行。

终极形态:Agent 的自动化魔法

我们刚刚手动完成了工具的执行。但在实际开发中,更强大、更自动化的模式是使用 Agent。

大模型与Agent 的核心区别

  • 大语言模型(LLM): 扮演的是 “分析师” 或 “规划师” 的角色。它的核心任务是理解意图,选择工具,并提取参数。它只产出“计划”,但从不“执行”。
  • 代理(Agent): 是一个建立在 LLM 之上的执行框架。它不仅包含了 LLM 这个“大脑”,还内置了一套循环逻辑,能够:
    • 调用 LLM 进行分析(我们上面的步骤)。
    • 自动解析 function_call。
    • 自动匹配并执行对应的工具。
    • 将工具的执行结果再反馈给 LLM,让其进行下一步的思考或总结。

在 Langchain 等框架中,当你使用 Agent 时,上述手动检查和执行工具的代码都被其内部逻辑封装好了,你无需手动编写,实现了从“分析”到“执行”的无缝自动化。


总结

通过本文的剖析,我们清晰地了解了“工具调用”的全过程:

  1. 准备阶段: 定义工具,并将其转换为模型能理解的标准化格式。
  2. 分析阶段: LLM 根据用户输入和工具描述,决策是否使用工具,并在 additional_kwargs['function_call'] 中返回“计划”。
  3. 执行阶段: 应用程序代码或 Agent 框架负责解析这个“计划”,并真正地运行工具,完成任务。

理解并掌握工具调用机制,是释放大模型全部潜能、构建复杂 AI 应用的关键一步。它让模型不再局限于文本世界,而是真正成为了可以操作软件、查询数据、与现实世界联动的智能实体。


2025.10.13 宣武门

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐