[架构深度] 给 LLM 装上“铣刀”:从机械原理视角拆解 AI Agent 的 Tool Use 技术

47 阅读6分钟

摘要 (Abstract)

[背景] 大语言模型(LLM)本身只是一个具备强大推理能力的“大脑”,但它无法直接触达物理世界或私有数据(即“空转”)。

[核心观点] 本文基于我在智能体来了(西南总部)技术沙龙上的学习心得,深度解析了金加德讲师提出的“主轴与铣刀”理论:LLM 是数控机床的主轴,而 Plugins(插件)是铣刀。

[实战] 文章将从 Python 代码实现、JSON Schema 定义、以及 Function Calling 运行机制三个维度,手把手演示如何开发一个工业级 Agent Tool。


一、 引言:光转不切的“空转主轴”

对于我们机械工程背景的开发者来说,理解 LLM(Large Language Model)的局限性,用**数控机床(CNC)**来类比是最直观的。

想象一台顶级的五轴加工中心:

  • 它拥有 20000rpm 的高频主轴(算力/推理能力)。
  • 它拥有最先进的 Siemens/Fanuc 系统(逻辑控制能力)。

但是,如果主轴前端没有安装任何刀具(铣刀、钻头、丝锥),这台机床能做什么?

答案是:它什么也做不了。 它只能在那儿高速空转,产生热量(Token消耗),却无法切削任何金属(处理实际任务)。

在 Agent 开发中:

  • LLM = 主轴 (Spindle) :提供意图理解、逻辑规划、动力输出。
  • Tool / API = 铣刀 (Cutter) :提供执行能力,真正切入数据(Workpiece)。

这就是为什么我们在**智能体来了(西南总部)【AI智能体运营工程师就业班】**中,将 Tool Use (工具调用) 视为 Agent 开发的第一核心技能。


二、 核心架构:主轴、刀柄与铣刀

在开发一个 Agent 插件时,我们需要构建三个核心组件,它们与机械结构有着惊人的对应关系。

1. 铣刀本体 (The Tool) = Python 函数

这是实际干活的部分。刀具的材质(硬质合金/高速钢)决定了它能切什么材料;代码的逻辑决定了它能处理什么数据。

2. 刀柄接口 (The Holder) = JSON Schema

主轴不能直接抓铣刀,必须通过标准的刀柄(如 BT40, HSK63)。

同理,LLM 不能直接运行 Python 代码,它必须通过标准的 JSON Schema 来认知这个工具。如果 Schema 定义不规范(刀柄尺寸不对),LLM 就“抓”不住工具。

dreamina-2026-01-21-5734-LLM 不能直接运行 Python 代码,它必须通过标准的 JSON Schem....jpeg

3. 换刀指令 (ATC) = Function Calling

当数控程序执行 M06 T01 时,机械手换刀。

当 LLM 输出特定 Token 时,触发 API 调用。


三、 代码实战:磨一把“螺纹计算”专用刀

为了演示这个过程,我们来开发一个机械领域的专用工具:计算螺纹底孔直径

(这是一个典型的 LLM 经常算错,必须依靠代码的场景)。

Step 1: 磨刀 (编写 Python 核心逻辑)

首先,我们定义一个纯 Python 函数。这把“刀”的刃口逻辑非常简单: (粗牙螺纹简化公式)。

Python

def calculate_thread_hole(diameter: float, pitch: float) -> dict:
    """
    [Core Logic] 计算攻丝前的底孔直径
    Args:
        diameter (float): 公称直径 (如 M10 中的 10)
        pitch (float): 螺距 (如 1.5)
    Returns:
        dict: 包含底孔直径建议值
    """
    # 模拟机械加工中的经验公式
    # 脆性材料底孔 ≈ d - 1.05p
    # 塑性材料底孔 ≈ d - p
    
    hole_size = round(diameter - pitch, 2)
    
    # 增加一点“工程经验”逻辑
    info = {
        "nominal_diameter": f"M{diameter}",
        "pitch": pitch,
        "recommended_hole": hole_size,
        "drill_bit": f"φ{hole_size}mm 麻花钻",
        "note": "适用于塑性材料(钢/铝),铸铁请适当加大0.05mm"
    }
    return info

Step 2: 定义刀柄 (编写 JSON Schema)

这是金加德讲师强调的重点。很多开发者代码写得很溜,但 Schema 写得很烂,导致 Agent 变“弱智”。

Schema 是写给 LLM 看的“说明书”。

Python

# 这是一个标准的 OpenAI 格式 Schema
tool_schema = {
    "type": "function",
    "function": {
        "name": "calculate_thread_hole",
        "description": "计算机械加工中内螺纹攻丝所需的底孔钻头直径。当用户询问'M8螺纹打多大孔'时调用此工具。",
        "parameters": {
            "type": "object",
            "properties": {
                "diameter": {
                    "type": "number",
                    "description": "螺纹公称直径(数字部分),例如 M10 对应 10。必须为正数。",
                },
                "pitch": {
                    "type": "number",
                    "description": "螺距。如果用户未指定,M6默认1.0,M8默认1.25,M10默认1.5...",
                }
            },
            "required": ["diameter", "pitch"]
        }
    }
}

关键点解析:

  • Description: 就像刀柄上的激光刻字。必须清晰描述“功能”和“适用场景”。
  • Properties: 定义了 LLM 需要提取的参数槽位。

Step 3: ATC 自动换刀 (Function Calling 流程)

现在,我们将主轴(LLM)与铣刀(Tool)结合起来。以下是模拟的运行流程:

Python

import json

# 1. 用户输入 (G-Code)
user_prompt = "我要在45号钢上攻一个 M12x1.5 的螺纹,钻头选多大的?"

# 2. LLM 思考 (Spindle Logic)
# LLM 分析意图:用户想计算底孔 -> 检索工具箱 -> 发现 'calculate_thread_hole' 匹配
# LLM 提取参数:diameter=12, pitch=1.5

# 3. LLM 生成调用指令 (Signal)
llm_response = {
    "role": "assistant",
    "content": null,
    "tool_calls": [{
        "id": "call_xyz123",
        "type": "function",
        "function": {
            "name": "calculate_thread_hole",
            "arguments": "{"diameter": 12, "pitch": 1.5}"
        }
    }]
}

# 4. 执行层捕获指令并运行 (Cutting)
tool_call = llm_response['tool_calls'][0]
func_name = tool_call['function']['name']
args = json.loads(tool_call['function']['arguments'])

if func_name == "calculate_thread_hole":
    result = calculate_thread_hole(**args)
    print(f"[System] Tool Output: {result}")
    
# Output: 
# {'nominal_diameter': 'M12', 'pitch': 1.5, 'recommended_hole': 10.5, 'drill_bit': 'φ10.5mm 麻花钻'...}

四、 进阶:复合刀具与自动编排

在实际工业场景中,一个复杂的任务往往需要多把刀具配合。

例如:“帮我查一下仓库里 M12 丝锥的库存,如果有货,计算一下加工 100 个孔的成本。”

这涉及到了 Agent Orchestration(智能体编排)

在**智能体来了(西南总部)**的高阶课程中,我们学习了如何利用 LangGraphCoze Workflow 来实现这种“复合加工”。

  • T01 (Inventory_Tool): 查库存 -> 返回 count: 50, price: 15.0
  • T02 (Cost_Calculator): 算成本 -> 100 * 15.0 = 1500
  • Controller (LLM): 负责在 T01 和 T02 之间传递数据(就像机械手把工件从车床搬到铣床)。

五、 总结与思考

通过将 AI Agent 技术与 机械原理 进行映射,我们可以得出几个关键结论:

  1. 参数即公差: 写 Prompt 和 Schema 时,必须像标注公差一样严谨。模糊的 Schema 会导致“装配失败”(参数提取错误)。
  2. 代码即刀具: LLM 的强大不在于它自己能干什么,而在于它能调用多么锋利的 Python 脚本。
  3. 领域知识是核心: 一个不懂机械加工的程序员,写不出好用的“螺纹计算插件”。金加德讲师常说:“最懂 Agent 的,往往是那些懂业务的工程师。”

给开发者的建议:

不要只盯着模型参数(7B, 70B)看。去打磨你的 Tools,去优化你的 Schema

就像一个优秀的机加工师傅,他可能没有最顶级的机床,但他一定有一套精心打磨的刀具。


Tags: #AI Agent #Function Calling #Python #架构设计 #工业互联网

版权声明: 本文为博主原创,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。