第 5 节 · LLM + 外部支持:为什么需要工具与上下文
LLM 的"天生不知道"

回忆第 1 节的类比:LLM 就像一个住在图书馆里、读过所有书但从未出门的人。以下四类信息,它永远无法从自身获取:
| 类型 | 例子 |
|---|---|
| 实时信息 | 现在几点 / 今天天气 / 某只股票的当前价格 |
| 私域知识 | 你公司的内部文档 / 你仓库里的代码 |
| 训练截止后的事 | 最新的新闻、论文、政策 |
| 执行结果 | 跑一段代码会输出什么 / 调一个 API 返回什么 |
不管模型多大、多聪明,这四类信息不可能从模型参数里"涌现"出来——因为训练时根本没有见过。
方式 1:把信息塞进 Prompt(朴素 RAG)
最直接的解法:你手动把外部信息拼进 user message,让模型基于它来回答。
python
# 示例:让模型回答内部政策问题
internal_doc = open("internal_policy.md").read()
messages = [
{"role": "user", "content": f"""
请根据以下内部文档回答问题。
【文档内容】
{internal_doc}
【问题】
报销流程是什么?
"""}
]模型本来不知道你公司的报销流程,但你把资料喂给它了,它就能准确回答。
这就是 RAG(Retrieval-Augmented Generation,检索增强生成) 的最朴素版本:
- Retrieval(检索):你手动找到相关文档
- Augmented(增强):把文档塞进 prompt
- Generation(生成):模型基于文档生成回答
优点
- 简单粗暴,立竿见影
- 任何 LLM 都支持(只要支持 chat 接口)
缺点
- 需要你手动决定塞什么信息
- 信息量大时会撑爆上下文窗口(回忆第 3 节)
- 模型自己无法主动"去找"它需要的信息
方式 2:让 LLM 自己调工具
更进一步:不是"你帮模型找信息",而是让模型自己决定该查什么工具。
流程大致是这样的:
用户: "现在是北京时间几点?"
↓
LLM 思考: "我不知道当前时间,但我有一个 get_current_time 工具可以用"
↓
LLM 输出: tool_call: get_current_time()
↓
你的程序执行工具,拿到结果: "2026-05-25 15:20:00"
↓
把结果传回给 LLM
↓
LLM 组织自然语言回复: "现在是北京时间 15:20。"
↓
返回给用户这就是 Agent 的雏形——模型不再是被动等你喂信息,而是主动伸手向外部世界获取信息。
Day2 会详细实现这套机制(Function Calling 协议)。今天先理解"为什么需要它"。
两种方式的对比

| 朴素 RAG(塞进 prompt) | Tool Use(模型自己调) | |
|---|---|---|
| 谁决定查什么 | 开发者/用户 | 模型自己 |
| 灵活性 | 低(写死了查什么) | 高(模型按需选择) |
| 复杂度 | 极低 | 需要实现工具调度 |
| 适用场景 | 固定文档问答 | 通用 Agent |
在实际工程中,两种方式经常组合使用:
- 用 RAG 把最相关的文档塞进上下文
- 同时让模型可以调工具获取 RAG 没覆盖的信息
核心类比:LLM 是大脑,工具是手脚
| 角色 | 类比 |
|---|---|
| LLM | 一个聪明但被关在房间里的人——能推理、能总结,但看不到外面 |
| 工具 | 给他一部手机(查天气)、一个文件柜(读文档)、一台电脑(跑代码) |
| Agent | 聪明人 + 一套工具 + "自己决定该用哪个" 的能力 |
整个 Agent 开发的核心工作就是:
- 给 LLM 配什么工具
- 怎么描述这些工具让 LLM 能正确选择
- 怎么管理上下文不让它爆
动手试试
运行 demo_05_with_tool.py,会看到两组前后对比实验:
实验 1:当前时间
- ① 直接问 LLM"现在几点" → 答不上来或者编一个
- ② 先调
get_current_time(),把结果塞进 prompt → 立刻精准回答
实验 2:内部知识
- ① 问"课程截止时间" → 模型完全不知道
- ② 把内部文档塞进 prompt → 模型立刻精确回答
看到的关键结论:LLM 不是不能解决这些问题——它只是需要"被喂"信息,或者能"自己去找"信息。
回顾:Day1 的完整拼图
1. Next-token prediction → 解释了 LLM "怎么思考"
2. 三种角色 + messages 协议 → 解释了 "怎么跟它说话"
3. Token + 上下文窗口 → 解释了 "成本与物理限制"
4. 幻觉 → 解释了 "它的弱点"
5. 工具与上下文 → 解释了 "怎么补强弱点" ← 通往 AgentDay1 完整回答了"LLM 是什么、能做什么、不能做什么"。
从 Day2 开始,我们把第 5 节中"手动喂信息"的过程自动化——让 LLM 自己决定调哪个工具、怎么调、调完怎么用。这就是 Function Calling 协议,也是 Agent 的核心机制。
小结
| 概念 | 一句话理解 |
|---|---|
| LLM 的天然边界 | 不知实时、不知私域、不知训练后的事、不能执行 |
| 朴素 RAG | 手动把信息塞进 prompt |
| Tool Use | 让 LLM 自己决定调什么工具 |
| Agent | LLM + 工具 + 自主决策能力 |
下一步(Day2):实现 Function Calling——让 LLM 自己选工具、调工具、用结果回答用户。