说明
对AI应用开发所涉及到的流程、工具、技能进行系列介绍,全部文章收录于《AI应用开发》专栏。关注+收藏,不错过后续精彩。
前置文章
AI应用开发01-环境准备
AI应用开发02-从零构建AI聊天机器人
AI应用开发03-RAG增强知识问答
AI应用开发04-对话+RAG管理桌面端GUI
AI应用开发05-MCP集成
AI应用开发06-SKILL的诞生
AI应用开发06-SKILL执行原理与落地场景
AI应用开发07-深入认识MCP
AI应用开发08-Python前后端分离之FastAPI
AI应用开发09-MCP客户端与服务端实践
一、概述
本文旨在对AI Agent系统中的两个基础性概念进行系统梳理:循环执行机制(Loop)与推理框架(Reasoning Framework)。理解两者的定义、功能边界及协作关系,是实现可控、可扩展Agent系统的必要条件。
二、循环执行机制(Loop)
循环执行机制是Agent运行过程中的基本控制结构。其典型形式为:在满足终止条件之前,重复执行“接收输入 → 调用语言模型 → 解析输出 → 执行动作 → 更新状态”这一序列。
2.1 功能定位
循环机制位于Agent架构的执行层,负责:
- 控制迭代次数与终止条件;
- 维护跨轮次的状态(包括对话历史、中间结果、任务进度);
- 调度外部工具或子模块的执行;
- 处理运行时异常(如超时、工具调用失败)。
2.2 设计维度
| 维度 | 说明 | 常见实现方式 |
|---|---|---|
| 循环触发 | 何时启动或继续一轮循环 | 用户输入、定时事件、系统调用 |
| 状态管理 | 跨轮信息存储与传递 | 内存对象、外部缓存(Redis)、关系数据库 |
| 终止条件 | 何时结束循环 | 达到最大步数、模型输出终止符、任务完成标志 |
| 异常处理 | 单步失败后的行为 | 重试、降级、重新规划、人工介入 |
2.3 常见实现模式
- 基本循环:每轮调用一次语言模型,根据输出决定下一动作。适用于ReAct等动态推理框架。
- 规划-执行循环:先由模型生成完整计划,再逐步执行。适用于确定性较强的长流程任务。
- 工作流驱动循环:基于有向无环图(DAG)的确定性调度,适合企业级数据处理。
- 事件驱动循环:异步消费事件队列,用于高并发或多会话场景。
2.4 基本循环伪代码示例
以下伪代码展示了一个最小化的循环执行机制,包含迭代控制、状态管理、工具调度和终止条件。
function run_agent(user_input): state = { "history": [{"role": "user", "content": user_input}], "step": 0, "max_steps": 10, "final_answer": None } while state.step < state.max_steps and state.final_answer is None: # 1. 调用语言模型 prompt = build_prompt(state.history) response = llm.generate(prompt) # 2. 解析模型输出 action = parse_action(response) # 3. 执行动作 if action.type == "tool_call": observation = execute_tool(action.tool_name, action.parameters) state.history.append({"role": "assistant", "content": f"Observation: {observation}"}) elif action.type == "final_answer": state.final_answer = action.content elif action.type == "error": handle_error(action.error) # 可选择重试或降级 state.step += 1 if state.final_answer is None: raise MaxIterationsExceeded() return state.final_answer生产环境中需额外考虑:超时控制、状态持久化(如每步后写入Redis)、断点恢复逻辑。
三、推理框架(Reasoning Framework)
推理框架定义了Agent在每一轮循环中应当遵循的思考与行动的模式。它通过提示词模板规范语言模型的输出格式,并通过代码解析器将模型输出转化为可执行的动作。
3.1 功能定位
推理框架位于Agent架构的策略层,负责:
- 构造适用于当前任务阶段的提示词(包括角色设定、输出格式示例、可用工具说明);
- 解析语言模型的文本输出,提取动作类型与参数;
- 在某些框架中,还承担任务分解、计划维护、记忆读写等更高层逻辑。
3.2 代表性框架概要
| 框架名称 | 工作流概要 | 主要特点 | 适用场景 |
|---|---|---|---|
| ReAct | 交替生成“思考”与“行动”文本,行动后获得观察结果 | 动态适应,推理过程可解释 | 开放性任务、需要环境反馈的场景 |
| Plan-and-Execute | 首先生成步骤列表,再依次执行 | 长流程稳定性较高 | 步骤可预先确定的业务流程 |
| ReWOO | 一次性生成完整工具调用链,批量执行后汇总 | 与语言模型交互次数少,Token消耗低 | 成本敏感、工具链明确的批处理任务 |
| Reflection | 生成初稿后,使用同一或另一模型进行批判并修订 | 改善单次输出的质量 | 文本生成、代码修复等需自我优化任务 |
| Reflexion | 将失败经验存储为语言形式的长期记忆,供后续任务参考 | 具备跨任务的学习能力 | 需要从试错中改进的策略性问题 |
| LATS | 结合树搜索与自我反思,探索多条推理路径并选择最优解 | 推理质量高,但计算开销较大 | 高难度推理、编程等需探索的任务 |
| ReCode | 通过递归生成代码来统一高层规划与底层操作 | 可动态控制推理粒度 | 长程复杂任务,兼具规划与执行需求 |
3.3 实现构成
推理框架的实现包含两个必要组成部分:
- 提示词模板:用于约束模型的输出格式。例如ReAct模板要求模型输出以“Thought:”“Action:”“Observation:”为前缀的行。
- 输出解析器:一个确定性程序,用于从模型输出中提取结构化的动作信息。解析器不依赖模型能力,仅执行模式匹配或语法分析。
需要指出:仅提供提示词模板而不配备解析器与动作执行逻辑,不能构成可工作的推理框架。
3.4 推理框架接口伪代码示例
以下伪代码定义了推理框架的抽象接口,以及ReAct框架的示例实现。
// 抽象接口 interface ReasoningFramework: function build_prompt(state, user_input) returns string function parse(llm_output) returns Action // ReAct框架实现 class ReActFramework implements ReasoningFramework: function build_prompt(state, user_input): tools_desc = format_tools(state.available_tools) return f""" You are an agent. Use the following tools: {tools_desc} Respond in this format: Thought: [your reasoning] Action: tool_name[parameters] Observation: [result will be provided] (repeat Thought/Action/Observation as needed) Final Answer: [final answer] User question: {user_input} """ function parse(llm_output): if "Final Answer:" in llm_output: answer = extract_after("Final Answer:", llm_output) return Action(type="final_answer", content=answer) if "Action:" in llm_output: action_line = extract_line_starting_with("Action:", llm_output) // 期望格式: Action: tool_name[param1, param2] tool_name, params = parse_action_line(action_line) return Action(type="tool_call", tool_name=tool_name, parameters=params) return Action(type="error", error="Unable to parse output")四、循环机制与推理框架的关系
循环机制与推理框架在Agent系统中处于不同层次,通过明确接口协作。
4.1 层次区分
- 循环机制位于执行层,关注“何时停止、如何保存状态、如何处理错误”。它不关心模型具体按照何种格式思考。
- 推理框架位于策略层,关注“模型应该输出什么格式、如何解析、下一步应当采取什么类型的动作”。它不负责循环控制或状态持久化。
4.2 协作方式
两者通过标准化的动作接口进行交互。典型的协作流程如下:
- 循环机制调用推理框架的
build_prompt方法,获得当前轮次的提示词。 - 循环机制调用语言模型,获得原始输出。
- 循环机制将模型输出传递给推理框架的
parse方法,获得一个动作对象(例如ToolCall、FinalAnswer、Replan)。 - 循环机制根据动作类型执行相应操作(调用工具、更新状态、终止循环等),并更新状态。
- 循环机制更新内部状态后,进入下一轮迭代。
4.3 协作伪代码示例
以下伪代码展示了一个通用的Agent执行器,它接受任意实现了推理框架接口的策略,并在统一的循环中运行。
class AgentExecutor: function __init__(framework: ReasoningFramework, tools: dict, max_steps: int): this.framework = framework this.tools = tools this.max_steps = max_steps function run(user_input: str) -> str: state = { "history": [], "step": 0, "available_tools": this.tools, "final_answer": None } while state.step < this.max_steps and state.final_answer is None: // 1. 框架构建提示词 prompt = this.framework.build_prompt(state, user_input) // 2. 调用语言模型 llm_output = llm.generate(prompt) // 3. 框架解析输出 action = this.framework.parse(llm_output) // 4. 循环机制根据动作类型执行分支 if action.type == "tool_call": tool = this.tools.get(action.tool_name) if tool is not None: try: observation = tool.execute(action.parameters) state.history.append({ "role": "assistant", "content": f"Observation: {observation}" }) except Exception as e: state.history.append({ "role": "assistant", "content": f"Error executing tool: {str(e)}" }) else: state.history.append({ "role": "assistant", "content": f"Unknown tool: {action.tool_name}" }) elif action.type == "final_answer": state.final_answer = action.content elif action.type == "error": // 可选择重试、降级或终止 if state.step >= this.max_steps - 1: state.final_answer = "Execution failed due to repeated errors." // 否则继续下一轮,状态中已包含错误信息 state.step += 1 if state.final_answer is None: raise MaxIterationsExceeded(f"Reached max steps {this.max_steps}") return state.final_answer4.4 设计原则
- 关注点分离:循环机制不应包含任何与特定推理框架相关的逻辑(如提示词格式、解析规则)。推理框架不应包含循环控制逻辑。
- 可插拔性:应允许在不修改循环实现的情况下,替换或组合不同的推理框架。
- 状态显式传递:循环机制维护的状态应当以结构化形式(如字典或数据类)传递给推理框架的提示词构建方法,避免隐式依赖。
五、总结
- 循环机制是Agent的执行骨架,负责迭代、状态管理与异常处理。
- 推理框架是Agent的决策策略,负责提示词构建与输出解析。
- 两者通过标准动作接口协作,共同构成完整的Agent运行系统。
在实际工程中,建议将循环机制实现为可复用的执行引擎,将推理框架实现为可配置的策略模块。这种分离设计有助于提升系统的可维护性与扩展性。
参考资料
[1] Yao, S., et al.ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629, 2022. https://arxiv.org/abs/2210.03629
[2] LangChain.Agent Loop & Custom Framework Integration. https://python.langchain.com/docs/modules/agents/how_to/custom_agent
[3] LangGraph.Persistence & Checkpointing. https://langchain-ai.github.io/langgraph/concepts/persistence/
[4] OpenAI.Agents SDK - Loop Design Patterns. https://openai.github.io/openai-agents-python/loop/
[5] Anthropic.Building Reliable Agents. https://www.anthropic.com/research/building-reliable-agents