简介:本文从“记忆、工具调用、检索增强、代理程序”四类机制切入,系统拆解大模型应用背后的底层逻辑:记忆如何以上下文伪装实现、压缩如何降低Token消耗、外部知识如何按需注入、工具如何被编排调用,以及代理程序如何封装特定逻辑完成任务,帮助读者理解各模块协作方式与技术边界。
大模型本身是一个无状态的函数:给定一段输入(上下文),产出一段输出。它不会自动记住上一轮对话,也无法主动查询外部数据,更不能直接操作外部系统。然而,实际应用中我们却看到模型能“记得”用户偏好、能“查”到知识库内容、能“调用”工具完成任务。这些能力并非模型原生具备,而是通过外围机制在上下文层面构造出来的。
本文要解释的正是这类外围机制的底层原理,围绕四个关键词展开:
理解这些机制的关键在于一个共同前提:模型能“看到”的只有上下文窗口内的内容。所有能力本质上都是“如何构造上下文”以及“如何解析并响应模型输出”的问题。下面逐层展开。
直接使用大模型时存在三个硬约束:
这三个约束分别对应记忆机制、检索增强和工具调用机制要解决的问题,而代理程序则是把它们组织起来的容器。
记忆机制的本质是:将历史对话记录作为上下文的一部分重新送入模型,使模型在当前轮次“看到”过去发生的内容,从而表现出连贯性。模型自身没有任何持久化状态,所谓“记忆”是调用方在每次请求时重建的上下文幻觉。
一种常见实现是把历史记录伪装成多角色对话结构,例如:
[系统] 你是助手,需参考以下历史。[用户] 我住在杭州,偏好简洁回答。[助手] 好的,已了解。[用户] 今天适合跑步吗?
模型在生成回复时会把这些历史当作对话的一部分进行条件化,于是“记得”用户所在城市与偏好。这里的要点是:历史不是模型内部存储,而是每次请求时被重新拼接的文本。上下文越长,重建成本越高。
历史无限累积会迅速耗尽上下文窗口并推高Token成本。常见优化是利用模型自身对记忆内容进行总结压缩:
伪代码示意:
if token_count(history) > threshold:summary = model.summarize(history_old)context = system_prompt + summary + history_recent + user_inputelse:context = system_prompt + history + user_input
这种“摘要+近期原文”的分层结构,是在信息保真度与上下文成本之间的折中:摘要丢失细节,近期原文保留细节,二者互补。
RAG 的核心是:在生成之前,先从外部知识库检索与问题相关的内容片段,将这些片段作为上下文注入,使模型的回答基于检索到的事实而非仅凭参数记忆。
伪代码示意:
query_vec = embed(user_question)chunks = vector_index.search(query_vec, top_k=5)prompt = system_prompt + format(chunks) + user_questionanswer = model.generate(prompt)
模型不能直接执行操作,但可以输出结构化的调用意图,由外部程序解析后代为执行,再把执行结果作为新上下文送回模型。这类机制(业界常以工具调用、函数调用、协议化上下文等形态出现)的本质是“模型负责决策,程序负责执行”。
伪代码示意:
context = system_prompt + tool_specs + history + user_inputoutput = model.generate(context)if is_tool_call(output):result = execute(validate(output.call)) # 外部程序执行context += format(result)output = model.generate(context)return output
代理程序(Agent)的本质是封装了特定逻辑的程序,它把记忆、检索、工具调用、编排控制组织成一个可复用的执行单元。其典型组成包括:
| 模块 | 职责 |
|---|---|
| 上下文管理 | 拼接系统提示、记忆摘要、检索结果与工具返回 |
| 决策循环 | 判断继续推理、调用工具还是结束 |
| 工具执行器 | 校验并执行工具调用,处理错误与超时 |
| 状态存储 | 保存对话历史与摘要,供下次请求重建 |
早期实现可能仅通过提示扩展完成:用一段较长的系统提示描述角色、可用工具与输出格式,模型按提示输出结构化内容,外部程序做简单解析。这类实现门槛低,但鲁棒性依赖提示质量,复杂任务下容易格式漂移。演进方向是把控制逻辑从提示中逐步外移到程序层:显式的状态机、独立的工具执行层、可观测的调用日志,从而提升稳定性与可调试性。
这四类机制的共同底层逻辑可以归纳为一句话:模型只处理上下文,一切能力都通过“构造输入上下文”与“解析输出意图”实现。记忆通过历史回注与摘要压缩维持连贯性,RAG通过检索注入外部事实,工具调用通过结构化输出把决策与执行分离,代理程序则把上述机制封装为带状态管理与编排逻辑的程序实体。理解了这一层,就能明白各项能力的收益来自哪里、边界卡在何处,也就能在实际设计中合理分配上下文预算、做好校验与容错,而不是把工程问题误当成模型能力问题。