我觉得这道题其实是在问,[[Agent]] 怎么跟真实世界有效地交互。LLM 本身只有文本推理能力,要完成实际任务,必须通过工具来感知和行动。Search、Coding、GUI 这三个模块就是最常用的工具,但它们的职责边界和协作方式,决定了 Agent 的上限。
先说 Search。它的核心定位是信息获取,弥补模型知识截止和 [[Hallucination]] 的问题。输入就是一个自然语言的 query,输出是检索到的文档片段或链接。但这里有个坑,就是你不能把 Search 当成万能的知识库。比如一个客服退款场景,用户问“我上周买的鞋降价了,能退差价吗”,如果直接搜全网,可能搜到过期的促销政策。真正落地时,Search 要跟业务知识库配合,比如先搜内部的知识库,再搜外部网页,并且要设定时间范围。如果检索结果质量差,比如 top-k 太小或者相关性分数低,Agent 会基于错误信息做决策,反而加剧幻觉。所以前提是检索系统本身要可靠,比如用 [[Hybrid Search]] 结合关键词和向量,再加一层 [[Rerank]] 过滤低分结果。
再说 Coding。这个模块赋予了 Agent 动手能力,把自然语言需求转成可执行代码。输入是任务描述和上下文,输出是代码片段和执行结果。比如用户说“帮我分析一下这个 CSV 文件,找出销售额最高的月份”,Agent 就可以生成 Python 脚本,运行后得到结果。但这里有个常见失败场景:生成的代码有 bug,或者运行环境不兼容。所以 Coding 模块不能只生成代码,还要能捕获错误并自动迭代修复,比如把报错信息重新喂给 LLM,让它修改。另外,安全性也是个风险点,如果 Agent 能执行任意代码,那权限控制必须到位,比如限制在沙箱里运行,不能访问系统文件。
然后是 GUI。这个模块负责视觉交互,比如操作网页、桌面应用。输入是屏幕截图或界面元素描述,输出是操作序列,比如点击坐标或元素 ID。举个例子,用户说“帮我把这个网页的表格导出成 Excel”,Agent 就需要定位表格元素,模拟右键点击另存为。GUI 模块的难点在于界面动态变化,比如弹窗覆盖了按钮,或者元素 ID 每次刷新都变。我会倾向于用基于视觉的方案,比如 [[OCR]] 识别文字位置,再加坐标定位,而不是依赖 DOM 结构,这样鲁棒性更好。但代价是延迟高,而且对截图质量敏感。
这三个模块不是孤立的,而是通过 [[Function Calling]] 机制被统一调度。比如一个任务:“查一下北京明天天气,写个提醒脚本,设置到系统日历”,流程就是:Search 查天气 → Coding 写 Python 脚本 → GUI 操作日历 APP。规划模块(比如 [[ReAct]] 循环)根据当前状态决定下一步调用哪个工具。但这里有个前提:模块之间要解耦,每个模块的输入输出格式要标准化,否则调度会乱。比如 Search 返回的结构化数据,Coding 模块要能直接引用,而不是重新解析。
另外,我想提一个延伸点:这三个模块的调用顺序不是固定的,但顺序错了可能导致任务失败。比如先 Coding 再 Search,代码里用到的是过时数据。所以规划模块需要具备动态规划能力,而不是简单按固定模板走。这个动态规划怎么实现,比如用 [[Tree-of-Thoughts]] 来搜索最优路径,我觉得是 Agent 架构里比较值得探讨的方向。
总的来说,我会把这三个模块看成 Agent 的感官和手脚。Search 是眼睛,负责看世界;Coding 是手,负责动手操作;GUI 是手指,负责精细交互。它们各有适用场景,也各有风险。我更倾向于在设计时优先保证 Search 的准确性和 Coding 的安全性,因为这两个出问题影响面最大。