Agent Loop:大模型 “能做事” 的核心机制

📅 发布时间:2026/7/11 12:43:40 👁️ 浏览次数:
Agent Loop:大模型 “能做事” 的核心机制
Agent Loop 是什么Agent Loop 调用模型 → 判断是否要用工具 → 执行工具 → 把结果回喂给模型 → 重复直到模型认为信息足够输出最终答案为止。它把大模型从“文本生成器”升级为“能完成任务的执行系统”。还是用之前最简单执行 Bash 的 Agent 作为样例代码import sys import os import traceback from llm_factory import LLMFactory, LLMChatAdapter from util.mylog import logger from utils import run_bash, BASH_TOOLS # 初始化 API 客户端 # 使用 LLMFactory 创建 LLM 实例 llm LLMFactory.create( model_typeopenai, model_namedeepseek-v3.2, # 使用支持的模型 temperature0.0, max_tokens8192 ) client LLMChatAdapter(llm) # 系统提示词 SYSTEM f你是一个位于 {os.getcwd()} 的 CLI 代理系统为 {sys.platform}。使用 bash 命令解决问题。 ## 规则 - 优先使用工具而不是文字描述。先行动后简要解释。 - 读取文件cat, grep, find, rg, ls, head, tail - 写入文件echo ... file, sed -i, 或 cat EOF file - 避免危险操作如 rm -rf等删除或者清理文件, 或格式化挂载点或对系统文件进行写操作 ## 要求 - 不使用其他工具仅使用 bash 命令或者 shell 脚本 - 子代理可以通过生成 shell 代码执行 - 如果当前任务超过 bash 的处理范围则终止不处理 def extract_bash_commands(text): 从 LLM 响应中提取 bash 命令 import re pattern rbash\n(.*?)\n matches re.findall(pattern, text, re.DOTALL) return [cmd.strip() for cmd in matches if cmd.strip()] def chat(prompt, historyNone, max_steps10): if history isNone: history [] # 检查历史记录中是否已有系统提示词作为系统消息 has_system any(msg.get(role) systemfor msg in history) ifnot has_system: # 在开头添加系统提示词作为系统消息 history.insert(0, {role: system, content: SYSTEM}) history.append({role: user, content: prompt}) step 0 while step max_steps: step 1 # 1. 调用模型传递 tools 参数 # 使用 chat_with_tools 接口支持 function calling response client.chat_with_tools( promptprompt, messageshistory, toolsBASH_TOOLS ) if step 1: prompt 继续 # 2. 解析响应内容 assistant_text [] tool_calls [] logger.info(f第 {step} 步响应: {response}) # chat_with_tools 返回的是 Response 对象包含 content 列表 for block in response.content: if getattr(block, type, ) text: assistant_text.append(block.text) elif getattr(block, type, ) tool_use: tool_calls.append(block) # 记录助手文本回复 full_text \n.join(assistant_text) if full_text: logger.info(f助手: {full_text}) history.append({role: assistant, content: full_text}) elif tool_calls: # 如果只有工具调用没有文本添加一个占位文本到历史保持对话连贯 history.append({role: assistant, content: (Executing tools...)}) # 3. 如果没有工具调用直接返回内容 ifnot tool_calls: logger.info(f第 {step} 步结束无工具调用) if response.stop_reason end_turn: return full_text # 如果异常结束也返回 return full_text or(No response) # 4. 执行工具 logger.info(f第 {step} 步工具调用: {tool_calls}) all_outputs [] for tc in tool_calls: if tc.name bash: cmd tc.input.get(command) if cmd: logger.info(f[使用工具] {cmd}) # 黄色显示命令 output run_bash(cmd) all_outputs.append(f$ {cmd}\n{output}) # 如果输出太长则截断打印 if len(output) 200: logger.info(f输出: {output[:200]}... (已截断)) else: logger.info(f输出: {output}) else: logger.warning(fUnknown tool: {tc.name}) # 5. 将命令执行结果添加到历史记录中 if all_outputs: combined_output \n.join(all_outputs) history.append({role: user, content: f执行结果\n{combined_output}\n\n请继续处理。}) else: # 有工具调用但没产生输出可能是解析失败或空命令 history.append({role: user, content: Error: Tool call failed or produced no output.}) return达到最大执行步数限制停止执行。 if __name__ __main__: if len(sys.argv) 1: logger.info(chat(sys.argv[1])) else: # 交互模式 logger.info(Bash 代理已启动。输入 exit 退出。) history [] whileTrue: try: user_input input( ) if user_input.lower() in [exit, quit]: break chat(user_input, history) except KeyboardInterrupt: logger.info(\n正在退出...) break except Exception as e: logger.info(f\n错误: {e}) traceback.print_exc()Agent Loop 怎么工作核心循环可以把 Agent Loop 理解成一个递归的工作流对应上面的代码就是 while 循环不断将历史数据和执行结果信息输入给LLM模型思考基于当前上下文理解任务、制定下一步选择工具如果缺信息或需要执行动作就发起工具调用请求执行工具系统根据工具定义schema校验参数并运行工具结果回传把工具结果作为新消息加入对话历史回到第 1 步继续迭代直到输出最终回答核心的东西上下文会累积模型不仅看到用户最初的问题还能看到自己调用过哪些工具、拿到了哪些结果从而完成多步推理与决策。一个具体例子扫描代码库安全漏洞用户说“帮我分析这个代码库有没有安全漏洞。”单次回答不可能完成因为需要读代码、搜索、归纳Agent Loop 会这样跑模型先需要了解项目结构 → 调用目录列举工具看到目录结构后定位入口文件 → 调用文件读取工具发现有数据库查询 → 再读数据库模块 → 再次调用文件读取工具识别出疑似 SQL 注入用户输入直接拼接 SQL→ 为确认影响面调用代码搜索工具找调用点工具返回 12 处调用 → 模型认为信息足够 → 输出最终报告漏洞说明、位置、修复建议每一轮都遵循同一个模式拿到新信息 → 决定继续行动还是结束输出而且这些决定是模型基于当前上下文“自主做的”。Agent Loop 里消息长什么样对话历史工作记忆Agent Loop 主要维护一份“对话历史”它是模型的临时工作记忆。消息通常分两类角色user用户输入、后续指令、以及常见实现里工具结果也可能以用户/系统形式注入assistant模型输出可能是给用户的文本回答工具调用请求要用哪个工具、参数是什么 -部分模型支持推理痕迹对话历史会越积越多因此通常需要 “对话管理” 策略来避免超出上下文窗口后面会提到常见问题。工具执行发生了什么当模型请求用工具时执行系统一般会做这些事对工具进行校验参数一般工具遵循如下格式{ type: tool_use, id: toolu_01A09q90qw90lq917835123, name: my_function_name, input: { query: Latest developments in quantum computing } }2. 在工具注册表里找到对应工具 3.执行工具并做好错误处理 4. 把成功结果或失败信息统一封装成 “工具结果消息” 回传给模型重点工具失败不会直接让循环崩掉而是把错误返回给模型让它有机会调整策略、换工具或重试。什么时候结束循环Stop Reasons每次调用模型都会带一个 “停止原因”决定 Loop 下一步怎么走常见包括end turn模型已完成 → 正常结束并返回最终答案tool use模型要用工具 → 执行工具后继续下一轮max tokens输出被 token 上限截断 → 通常不可恢复需要报错或拆分任务stop sequence遇到预设停止符 → 正常结束content filtered / guardrail intervention触发安全/策略拦截 → 按产品规则处理常见坑与解决思路1上下文窗口耗尽循环次数多、工具输出长会把对话历史撑爆导致输入过长或模型表现变差。应对方法让工具返回摘要/关键片段不要一股脑返回全量简化工具 schema复杂嵌套也很吃 token用对话管理策略滑动窗口、总结压缩等把大任务拆成多个子任务分段跑、分段总结2模型老选错工具通常是工具描述不清或重叠模型不知道怎么选。应对方法写清楚工具 “适用场景、输入输出、边界”避免多个工具描述高度相似3MaxTokensReached输出太长可能是回答太长、或上下文太满导致留给输出的空间不够。应对方法增加 token 上限如果可控缩短上下文/工具输出拆分任务为子任务让子任务执行减少上下文窗口4复杂的任务不要全部依赖大模型决策可以参考这篇文章mp.weixin.qq.com/s/Zhc-GDTJS… 讲的是为什么大模型不能准确执行所有的 skills (这里其实就是对应工具)主要原因如下工具太多会造成噪声大模型自主决策不一定能按照你想要的方式调用工具链没有决策点大模型会找到最相近的工具但是有些时候相近的工具不一定是最佳工具没有排序大模型自己决策A - B - C但是不一定符合你调用的要求那该怎么做在提示词或者 rules.md 中增加你当前任务大概需要用到哪些工具或者强制使用哪些工具指出具体任务调用的工具顺序可能是怎么样的虽然看起来像人工决策但是往往能有效的解决你想要解决的问题学习资源推荐如果你想更深入地学习大模型以下是一些非常有价值的学习资源这些资源将帮助你从不同角度学习大模型提升你的实践能力。一、全套AGI大模型学习路线AI大模型时代的学习之旅从基础到前沿掌握人工智能的核心技能​因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取二、640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示​因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取三、AI大模型经典PDF籍随着人工智能技术的飞速发展AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型如GPT-3、BERT、XLNet等以其强大的语言理解和生成能力正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取四、AI大模型商业化落地方案作为普通人入局大模型时代需要持续学习和实践不断提高自己的技能和认知水平同时也需要有责任感和伦理意识为人工智能的健康发展贡献力量。