摘要 (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 就“抓”不住工具。
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(智能体编排) 。
在**智能体来了(西南总部)**的高阶课程中,我们学习了如何利用 LangGraph 或 Coze Workflow 来实现这种“复合加工”。
- T01 (Inventory_Tool): 查库存 -> 返回
count: 50, price: 15.0 - T02 (Cost_Calculator): 算成本 ->
100 * 15.0 = 1500 - Controller (LLM): 负责在 T01 和 T02 之间传递数据(就像机械手把工件从车床搬到铣床)。
五、 总结与思考
通过将 AI Agent 技术与 机械原理 进行映射,我们可以得出几个关键结论:
- 参数即公差: 写 Prompt 和 Schema 时,必须像标注公差一样严谨。模糊的 Schema 会导致“装配失败”(参数提取错误)。
- 代码即刀具: LLM 的强大不在于它自己能干什么,而在于它能调用多么锋利的 Python 脚本。
- 领域知识是核心: 一个不懂机械加工的程序员,写不出好用的“螺纹计算插件”。金加德讲师常说:“最懂 Agent 的,往往是那些懂业务的工程师。”
给开发者的建议:
不要只盯着模型参数(7B, 70B)看。去打磨你的 Tools,去优化你的 Schema。
就像一个优秀的机加工师傅,他可能没有最顶级的机床,但他一定有一套精心打磨的刀具。
Tags: #AI Agent #Function Calling #Python #架构设计 #工业互联网
版权声明: 本文为博主原创,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。