前面三课,我们的程序会聊天、有记忆,但它始终只会「动嘴」——不能查、不能算、不能替你做任何实际操作。
这一课,我们给它装上第一件工具:计算器。做完之后,你的程序就不再只是聊天机器人,而是迈出了 Agent 的第一步。
一、先建立项目结构
现在的项目应该长这样:
my-agent/ │ ├── .venv/ │ ├── main.py │ └── tools.py其中:
main.py负责Agent 的「大脑」(调用模型、协调流程)tools.py负责Agent 的「工具」(真正干活的函数)
这种「大脑」和「手」分离的结构,是 Agent 后面能不断扩展工具的基础。
二、先写一个计算器
打开tools.py:
def calculator(a, b, operation): if operation == "add": return a + b elif operation == "subtract": return a - b elif operation == "multiply": return a * b elif operation == "divide": return a / b else: return "不支持的运算"先单独测一下。在tools.py末尾加两行:
print(calculator(10, 20, "add")) print(calculator(10, 20, "multiply"))运行:
python tools.py看到:
30 200说明工具本身没问题。然后把这两行测试代码删掉。
三、让 DeepSeek「认识」这个工具
现在是关键:我们不是写if 用户输入里带乘号就调用计算器,而是把工具描述给模型,让它自己决定用不用。
在main.py里这样告诉模型:
tools = [ { "type": "function", "function": { "name": "calculator", "description": "进行数学计算", "parameters": { "type": "object", "properties": { "a": {"type": "number", "description": "第一个数字"}, "b": {"type": "number", "description": "第二个数字"}, "operation": { "type": "string", "enum": ["add", "subtract", "multiply", "divide"], "description": "要执行的运算" } }, "required": ["a", "b", "operation"] } } } ]这段看着复杂,但不用背。你只要理解,我们是在给模型写一份「说明书」:
我有一个工具,名字叫 calculator, 作用是数学计算, 需要三个参数:a、b、operation, 其中 operation 只能是 add / subtract / multiply / divide。于是当用户问「100 × 200 等于多少」时,模型就可能输出:
{ "name": "calculator", "arguments": {"a": 100, "b": 200, "operation": "multiply"} }这就叫Tool Calling(工具调用)。
四、让模型做决定,然后真正执行
接着把请求发出去,并检查模型是否要求调用工具:
messages = [ {"role": "user", "content": "12345 × 6789 等于多少?"} ] response = client.chat.completions.create( model="deepseek-chat", messages=messages, tools=tools ) message = response.choices[0].message if message.tool_calls: tool_call = message.tool_calls[0] function_name = tool_call.function.name arguments = json.loads(tool_call.function.arguments) if function_name == "calculator": result = calculator( arguments["a"], arguments["b"], arguments["operation"] ) print("计算结果:", result) else: print(message.content)运行后你会看到:
计算结果: 83810205五、一个必须理解的分工:模型思考,Python 执行
这里有一个特别容易误解的点:DeepSeek 并没有真正执行 Python 计算。
它只是告诉我们:「我想使用这个工具,参数是这些。」真正去调用calculator的,是我们写的 Python 代码。
┌─────────────┐ │ DeepSeek │ 负责思考、选择工具 └──────┬──────┘ │ Tool Call(我要用 calculator) ↓ ┌─────────────┐ │ Python │ 真正执行工具 └─────────────┘一句话概括:模型负责「想」,代码负责「做」,两者各司其职。
六、对比一下,你就懂差在哪了
| 维度 | 聊天机器人 | 会 Tool Calling 的程序 |
|---|---|---|
| 能做的事 | 只会生成文字 | 能计算、查询、调用 API |
| 谁决定用不用工具 | 无(没工具) | 模型自己决定 |
| 判断逻辑 | 无 | 由模型生成,非硬编码 |
| 本质 | 文本生成 | 向 Agent 靠近 |
一句话概括:给模型一件工具,它就从「回答者」变成了「行动者」。
总结
这一课的核心:模型负责决策,Python 负责执行。我们用一个计算器,跑通了 Agent 最关键的机制——Tool Calling。
但现在还有个问题:我们的代码只会执行一次工具就结束。如果任务需要「先搜索、再计算」,一次根本不够。下一课,我们就来手搓整个系列最重要的东西——Agent Loop。
下一课预告
第5课:手搓 Agent Loop,让 AI 自己循环执行工具。