简介:大模型能力扩展机制常被混为一谈,容易导致选型失误与成本浪费。本文从“往Context里放什么、能否改变外部世界”这一底层逻辑出发,系统对比RAG、联网搜索、工具调用、技能封装与Agent在数据流向、时效性、安全可控、接入与运维成本上的差异,并给出典型场景的选型判断与组合使用建议,帮助开发者快速找到适合自己业务的技术路径。
当前构建大模型应用时,同一份架构方案里经常同时出现RAG、联网搜索、工具调用、技能封装、Agent等术语。它们常被并列提及,也常被混用:有的团队本该建知识库,却不断堆提示词;有的场景只需要一次检索,却被设计成多步自主Agent,导致延迟、成本和故障面同步放大。
理解它们的关系,只需抓住一条主线:模型的能力来自两部分——训练时固化在参数中的知识,以及推理时临时注入的上下文(Context)。上述所有机制,本质上都是在不改动模型权重的前提下,往Context中补充信息或补充能力,差异只在于“补什么、从哪补、能否反向影响外部系统”。把这条主线拆开,选型问题就会清晰很多。
1. RAG(检索增强生成)
通过向量数据库进行语义检索,把本地文档或数据库中与问题相关的片段注入Context,从而增强模型生成的准确性与可信度。它解决的核心问题是“模型参数里没有企业内部知识、或知识已经过时”。典型链路包括文档解析、切分、向量化、检索召回、重排序和结果注入。
2. 联网搜索
面向公开互联网的实时信息获取,把搜索结果整理后注入Context。它与RAG同属外部信息获取能力,都是“模型参数外的数据补充手段”,差别主要在数据源(公网 vs 私有知识库)与时效性要求。
3. 工具调用与工具接入协议
模型根据需要发起结构化调用,去查询订单、写入数据、触发业务流程。业界还出现了把工具描述、参数格式、返回结构标准化的统一工具接入协议,使同一个工具能被不同应用复用。它解决的是“模型只能输出文本、不能真正做事”的问题。
4. 技能封装
把完成某类任务所需的指令说明、执行步骤、参考示例乃至辅助脚本,打包成可按需加载的模块,在任务匹配时挂载到Context。它更像“提示词与流程资产的组织方式”,让固定类型的任务拥有稳定、可版本化的执行范式。
5. Agent(智能体)
在模型之上增加“规划—执行—观察—修正”的自主循环,可统一调度检索、工具与技能,完成多步骤任务。需要强调:Agent是编排层,不是与RAG并列的一种“信息获取手段”,它恰恰可能把RAG当作自己的一个子能力。
这是最本质的分界线。
RAG与联网搜索是单向只读:外部数据 → Context → 生成回答,模型不改变任何外部状态,即使检索结果有误,影响也止步于“答错话”。
工具调用是双向读写:模型可以触发外部系统的真实动作,一旦涉及写入,就必须引入鉴权、参数校验、幂等设计、失败回滚与审计日志,系统边界从“问答应用”扩展为“业务系统的一部分”。
技能封装名义上是只读的指令注入,但若技能包内含可执行脚本,性质就会向工具调用靠拢,需要按“可执行代码”的标准审查其安全性。
Agent则把上述所有数据流收编进一个自主循环,系统边界最大,风险也随循环步数放大。
RAG可控性较高:检索命中内容可审计、可追溯,但必须把数据隔离与行级权限下沉到检索层,否则会出现“越权召回”——用户通过提问拿到了本无权限查看的文档片段。
联网搜索引入了不可控的公网内容,需要防范结果中夹带的提示注入与敏感信息回流。
工具调用风险最高:任何写操作都应遵循最小权限原则,高危动作需二次确认与人工审批。
Agent将自主决策引入执行链路,必须设置步数上限、敏感操作拦截、全链路追踪与成本熔断,否则一次失控循环就可能同时演变成业务事故与资源账单。
大致存在递进关系:提示词优化 < 技能封装 ≈ 联网搜索 < RAG < 工具调用 < Agent。
RAG的隐性成本常被低估:除向量库之外,还需要文档解析、切分策略、向量化模型选型、召回评测集、知识更新流水线,这些持续性的数据工程往往比初次搭建更消耗人力。
工具调用的成本集中在接口治理:工具定义是否清晰直接决定调用准确率,业务接口变更需要同步维护工具描述。
Agent的成本集中在可观测性与状态管理:每一步的输入输出、失败重试、循环次数与Token消耗都需要监控,排障难度显著高于单次调用。
RAG的效果可以拆成“召回准不准”与“生成好不好”两段,问题定位相对容易;Agent是多步链路,早期一个小错误会沿执行路径传播放大,归因和回归测试都更困难。这也是“能不用Agent就不用”的重要技术理由之一。
| 维度 | RAG | 联网搜索 | 工具调用 | 技能封装 | Agent |
|---|---|---|---|---|---|
| 本质 | 只读知识注入 | 只读实时信息 | 读写动作执行 | 指令与流程挂载 | 自主循环编排 |
| 数据方向 | 外部→模型 | 外部→模型 | 双向 | 指令→模型 | 调度以上全部 |
| 时效性 | 随知识库更新 | 实时 | 实时 | 随版本发布 | 取决于被调对象 |
| 接入成本 | 中高 | 低 | 中 | 低 | 高 |
| 安全风险 | 较低(需权限过滤) | 中(内容不可控) | 高(涉及写操作) | 低 | 最高 |
| 归因难度 | 低(两段式) | 低 | 中 | 低 | 高(多步传播) |
| 典型场景 | 企业知识问答 | 资讯行情 | 业务查询与执行 | 固定流程任务 | 跨系统多步任务 |
context = system_prompt# RAG:私有知识检索,只读注入chunks = vector_search(embed(query), top_k=5, filter=user_permission)context += render(chunks)# 联网搜索:公网实时信息,只读注入context += web_search(query)# 技能封装:按任务匹配加载指令包context += load_skill("weekly_report")# 工具调用:模型决策后发起,读写外部系统result = invoke_tool(model.pick_tool(context), auth=min_privilege)# Agent:以循环把上述能力编排起来while not finished and step < max_steps:observe(); plan(); act(); reflect()
从这段伪代码可以直观看出:RAG、搜索、技能都是“装配阶段”的一次性注入;工具调用是“执行阶段”的受控外溢;Agent则是把两者纳入循环调度的外壳。
条件化判断如下:
组合与迁移注意事项:
回到底层逻辑那一问:这套机制往Context里放了什么?能不能反向改变外部世界?
决策顺序建议:先判断任务是否需要“动作”,再判断知识来自私域还是公网,最后才考虑是否需要Agent编排。多数业务问题用“RAG+少量工具”就能高质量解决,Agent通常更适合作为演进路径上的后期选择,而非架构设计的起点。