跳转到内容

第 5 节 · LLM + 外部支持:为什么需要工具与上下文

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 vs 工具调用:人喂资料 vs AI 自己伸手

朴素 RAG(塞进 prompt)Tool Use(模型自己调)
谁决定查什么开发者/用户模型自己
灵活性低(写死了查什么)高(模型按需选择)
复杂度极低需要实现工具调度
适用场景固定文档问答通用 Agent

在实际工程中,两种方式经常组合使用

  • 用 RAG 把最相关的文档塞进上下文
  • 同时让模型可以调工具获取 RAG 没覆盖的信息

核心类比:LLM 是大脑,工具是手脚

角色类比
LLM一个聪明但被关在房间里的人——能推理、能总结,但看不到外面
工具给他一部手机(查天气)、一个文件柜(读文档)、一台电脑(跑代码)
Agent聪明人 + 一套工具 + "自己决定该用哪个" 的能力

整个 Agent 开发的核心工作就是

  1. 给 LLM 配什么工具
  2. 怎么描述这些工具让 LLM 能正确选择
  3. 怎么管理上下文不让它爆

动手试试

运行 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. 工具与上下文  解释了 "怎么补强弱点" 通往 Agent

Day1 完整回答了"LLM 是什么、能做什么、不能做什么"

从 Day2 开始,我们把第 5 节中"手动喂信息"的过程自动化——让 LLM 自己决定调哪个工具、怎么调、调完怎么用。这就是 Function Calling 协议,也是 Agent 的核心机制。

小结

概念一句话理解
LLM 的天然边界不知实时、不知私域、不知训练后的事、不能执行
朴素 RAG手动把信息塞进 prompt
Tool Use让 LLM 自己决定调什么工具
AgentLLM + 工具 + 自主决策能力

下一步(Day2):实现 Function Calling——让 LLM 自己选工具、调工具、用结果回答用户。

Released under the MIT License.