写点什么

AI 智能体 - 目标设定与监控模式

作者:Hernon AI
AI智能体 - 目标设定与监控模式

📖 引言:从“执行者”到“统筹师”

在之前的章节中,我们赋予了 AI 智能体使用工具(Tool Use)、访问上下文(MCP)和学习适应(Learning/Adaptation)的能力。然而,一个拥有强大工具库的智能体,如果缺乏明确的方向和自我评估机制,仍然只是一个高效的“执行者”,而不是一个真正的“统筹师”。


第十一篇:“目标设定与监控”模式 是将 AI 智能体从反应式系统(Reactive Systems) 提升到 主动式系统(Proactive Systems) 的关键。该模式要求智能体不仅要知道“怎么做”(How to do),更要清楚地知道“为什么做”(Why to do)和“做到什么程度算成功”(What is success)。


本篇将深入解析该模式的架构、原理,并结合 LangGraphPydantic 等现代技术框架,重构一个更健壮、更具生产价值的多智能体代码优化系统,以实现真正可靠的自我监控。



第一部分:模式概述与核心概念

1.1 目标设定与监控模式的哲学基础

该模式借鉴了人类行为学和项目管理的理念:规划 (Planning) 执行 (Execution) 监控 (Monitoring) 反馈 (Feedback) 调整 (Adjustment)。


在 AI 智能体的世界中:


  1. 目标(Goal State):智能体要达成的最终状态(如:“解决客户的账单查询”)。

  2. 初始状态(Initial State):智能体开始时的环境状态和已知信息。

  3. 规划(Planning):将高层目标分解为一系列子目标(Sub-Goals)和中间步骤(Intermediate Steps)。LLM 尤其擅长基于逻辑推理生成这些步骤。

  4. 监控(Monitoring):持续检查环境状态、工具输出和子目标完成情况,以判断是否正在朝着目标前进。

  5. 反馈循环(Feedback Loop):如果监控发现偏差(例如:工具执行失败、客户回复不满意),则触发重新规划(Re-Planning)

1.2 目标设定:SMART 原则在 AI 中的应用

为了让 AI 智能体有效工作,其目标必须满足 SMART 原则:


1.3 监控:两种核心机制

有效的监控是该模式成功的关键。它需要两种互补的机制:


  1. 确定性监控(Deterministic Monitoring)

  2. 定义:通过检查工具输出环境状态的硬性数据来判断进度。

  3. 示例

  4. 检查数据库记录:SELECT status FROM tasks WHERE id=X

  5. 检查 API 返回码:HTTP 状态码是否为 200

  6. 检查代码执行:Python 脚本是否抛出异常 Exception

  7. 特点:客观、快速、可靠。

  8. 非确定性监控(Non-Deterministic Monitoring)

  9. 定义:通过 LLM 的推理和评估能力来判断目标是否达成。

  10. 示例

  11. LLM 评估代码:代码是否“足够简单”或“符合 PEP8 规范”。

  12. LLM 评估对话:客户的语气是否“满意”。

  13. LLM 评估内容:生成的图片是否“具有专业性”。

  14. 特点:主观、灵活、适用于复杂或抽象目标的判断。



第二部分:实战重构:LangGraph 实现的“自我优化代码智能体”

我们将使用 LangGraphPydantic 对其进行重构,实现一个更健壮、更模块化的目标驱动代码优化智能体


我们将把责任拆分给四个节点,形成一个闭环图:Coder Executor/Reviewer Judge (Loop or End)。

2.1 依赖与状态定义

我们将使用 LangGraph 的 StateGraph 来维护智能体的状态。


# pip install langgraph langchain-openai pydanticfrom typing import TypedDict, List, Annotated, Dictimport operatorfrom langchain_core.messages import BaseMessage, HumanMessage, AIMessagefrom langchain_openai import ChatOpenAIfrom langgraph.graph import StateGraph, ENDfrom pydantic import BaseModel, Field
# 1. 定义智能体状态 (State)class CodeAgentState(TypedDict): """用于在 LangGraph 节点间传递的状态""" messages: Annotated[List[BaseMessage], operator.add] # 聊天记录和历史 code: str # 当前生成的代码 goals: List[str] # 智能体要达成的目标列表 review_feedback: str # 评审员的详细反馈 is_met: bool # 目标是否已达成 (由 Judge 节点设置) iterations: int # 当前迭代次数
# 2. 定义确定性工具:代码执行器 (用于监控)# 🚨 警告:生产环境请务必使用沙箱执行代码!def execute_python_code(code: str) -> str: """执行 Python 代码,返回 stdout 或错误信息""" try: import io, sys old_stdout = sys.stdout redirected_output = io.StringIO() sys.stdout = redirected_output # 移除可能破坏环境的危险代码(简单的安全检查) if "os.remove" in code or "shutil." in code: return "Execution Error: Forbidden operations detected."
exec(code, {}) sys.stdout = old_stdout # 恢复 stdout return f"Execution Success. Output:\n{redirected_output.getvalue()}" except Exception as e: sys.stdout = old_stdout return f"Execution Failure: {str(e)}"
复制代码

2.2 节点一:Coder (规划与生成)

Coder 负责生成初始代码或根据反馈进行重写。


def generate_code(state: CodeAgentState) -> CodeAgentState:    """节点:根据目标和反馈生成或修复代码"""        current_goals = state['goals']    feedback = state['review_feedback']        # 构造 LLM 提示词    goals_list = "\n".join(f"- {g}" for g in current_goals)        system_prompt = f"""    你是一个专业的 Python 程序员。你的目标是编写完全符合以下要求的代码:        【目标列表】:    {goals_list}        {'---' if feedback else ''}    {'【上次代码及反馈】:' + feedback if feedback else ''}    {'---' if feedback else ''}        请只返回完整的、可执行的 Python 代码块。不要包含任何解释或额外文字。    """
model = ChatOpenAI(model="gpt-4o", temperature=0.3) # 如果有反馈,将反馈添加到历史消息中进行引导 if feedback: input_message = HumanMessage( content=f"请根据以上反馈和目标,重写并优化代码。" ) else: # 初始任务 input_message = HumanMessage( content="开始编写代码。请生成初始版本。" ) messages_in = [HumanMessage(content=system_prompt), input_message] response = model.invoke(messages_in) # 清理代码块(与原示例类似) code_content = response.content.replace("```python", "").replace("```", "").strip()
print(f"🔄 Coder 节点:生成代码(Iteration {state['iterations'] + 1})") return { "messages": [response], "code": code_content, "iterations": state['iterations'] + 1 }
复制代码

2.3 节点二:Executor and Reviewer (监控与反馈)

此节点是监控的核心。它结合了确定性监控(执行代码)和非确定性监控(LLM 评审)。


def review_and_execute(state: CodeAgentState) -> CodeAgentState:    """节点:执行代码并进行 LLM 评审"""        code = state['code']    goals = state['goals']        # 1. 确定性监控:执行代码并捕获错误    execution_result = execute_python_code(code)    print(f"✅ Executor 节点:执行结果:{'Success' if 'Success' in execution_result else 'Failure'}")        # 2. 非确定性监控:LLM 给出详细的、基于目标的反馈    review_prompt = f"""    你是一个专业的代码评审员。你的任务是根据以下目标,对代码进行全面、客观的审查。        【目标列表】:    {chr(10).join(f"- {g}" for g in goals)}
【代码执行结果】: {execution_result}
【待审查代码】: {code}
请给出详细的改进建议,重点关注:功能正确性、目标达成度、可读性和边界处理。 """ model = ChatOpenAI(model="gpt-4o", temperature=0.2) feedback_response = model.invoke(review_prompt) print("📝 Reviewer 节点:生成详细反馈...") return { "messages": [feedback_response], "review_feedback": feedback_response.content }
复制代码

2.4 节点三:Judge (目标判断)

Judge 节点是模式中的 “成功标准”。它使用 LLM 的推理能力,基于 Reviewer 的反馈,返回一个布尔值 (True/False) 来控制流程。


我们使用 Pydantic 来强制 LLM 输出结构化的结果,保证监控决策的准确性。


class GoalAssessment(BaseModel):    """用于 LLM 输出的 Pydantic 模型"""    is_met: bool = Field(description="如果所有目标均已满足,则为 True;否则为 False。")    reasoning: str = Field(description="解释做出此判断的简短理由。")
def judge_goals_met(state: CodeAgentState) -> CodeAgentState: """节点:判断目标是否达成,并返回结构化结果""" goals = state['goals'] feedback = state['review_feedback'] judge_prompt = f""" 你是一个最终的决策者。请根据以下目标和代码评审反馈,严格判断目标是否全部达成。 【目标列表】: {chr(10).join(f"- {g}" for g in goals)}
【代码评审反馈】: {feedback} 如果反馈中仍有任何明显的、需要修复的建议,即使代码可以运行,也请判定为 False。 请按照 JSON 格式返回结果,并严格遵循提供的 Pydantic 模型。 """ model = ChatOpenAI(model="gpt-4o", temperature=0) # 强制模型返回 Pydantic 结构 response = model.with_structured_output(GoalAssessment).invoke(judge_prompt) print(f"⚖️ Judge 节点:目标达成? {response.is_met}。原因: {response.reasoning}") return { "messages": [AIMessage(content=response.reasoning)], "is_met": response.is_met }
复制代码

2.5 流程控制与图的构建 (LangGraph)

这是模式中反馈循环的实现。


def route_next_step(state: CodeAgentState) -> str:    """路由函数:根据 Judge 的判断决定下一步"""    if state['is_met']:        return "end"    if state['iterations'] >= 5: # 设定最大迭代次数,防止无限循环 (SMART-T)        print("🛑 达到最大迭代次数,停止优化。")        return "end"        # 否则,回到 Coder 节点进行重写 (反馈驱动)    return "replan"
# 1. 初始化图workflow = StateGraph(CodeAgentState)
# 2. 添加节点workflow.add_node("coder", generate_code)workflow.add_node("reviewer", review_and_execute)workflow.add_node("judge", judge_goals_met)workflow.add_node("finalizer", lambda state: state) # 最终处理节点
# 3. 设置起点workflow.set_entry_point("coder")
# 4. 定义边 (顺序执行)workflow.add_edge("coder", "reviewer")workflow.add_edge("reviewer", "judge")
# 5. 定义条件边 (反馈循环)workflow.add_conditional_edges( "judge", route_next_step, { "replan": "coder", # 目标未达成 -> 循环回 Coder (规划/调整) "end": "finalizer" # 目标达成或达到限制 -> 结束 })
# 6. 结束图workflow.add_edge("finalizer", END)
# 7. 编译app = workflow.compile()
# --- 运行测试 ---if __name__ == "__main__": # 高层目标:计算斐波那契数列,并包含严格的质量标准 initial_goals = [ "功能正确,能计算第 N 个斐波那契数。", "代码必须使用迭代法(非递归),以优化性能。", "必须包含清晰的类型注解和文档字符串。", "必须能处理 N <= 0 的边界情况,返回异常。", ]
initial_state = { "messages": [], "code": "", "goals": initial_goals, "review_feedback": "", "is_met": False, "iterations": 0 }
print("🚀 启动目标驱动代码智能体...") final_state = app.invoke(initial_state)
print("\n" + "="*80) print("✨ 最终输出结果:") print("="*80) print(final_state['code']) print(f"\n目标达成状态: {'成功' if final_state['is_met'] else '未完全达成 (最大迭代限制)'}")
复制代码


实战总结:这个 LangGraph 实现精确地体现了“目标设定与监控”模式:


  1. 目标设定:通过 initial_goals 明确定义(SMART 原则)。

  2. 规划Coder 节点负责将目标转化为执行步骤(代码)。

  3. 监控reviewer 节点结合了代码执行(确定性)和 LLM 评审(非确定性)。

  4. 决策/反馈judge 节点通过结构化输出 is_met 来控制 route_next_step 的路由,实现自我修正的循环。



第三部分:高级应用与设计考量

3.1 规划的深度:从序列到树状结构

简单的目标可能只需序列化步骤。但在复杂的企业场景中,规划必须是 树状(Tree-like) 的。


  • 高层目标“部署新版本 API”

  • 子目标 A“通过所有单元测试”

  • 步骤 1:调用 TestWriter 智能体。

  • 步骤 2:执行 TestRunner 工具。

  • 子目标 B“更新数据库 Schema”

  • 步骤 1:生成迁移脚本。

  • 步骤 2:调用 DB-Admin 智能体执行。

  • 子目标 C“更新文档”

  • 步骤 1:调用 Documenter 智能体。

  • 步骤 2:提交到 Git 仓库。


在 LangGraph 中,可以通过嵌套图 (Nested Graphs) 来实现这种树状规划:一个高层 Agent 负责分解主目标,然后将子目标分派给不同的子图(子 Agent)去执行。

3.2 长期监控:将状态持久化到 RAG

对于需要跨会话、长期运行的复杂项目(如项目管理助手),智能体不能只依赖内存中的 LangGraph 状态。


  • 模式监控状态持久化

  • 实现:在每次 judge 节点或 reviewer 节点执行后,将关键的状态变化摘要当前未完成的目标编码成 Vector Embeddings,存入知识库(RAG)。

  • 下次启动:智能体首先检索 RAG 库,以回答“我上次做到哪里了?”或“上次失败的原因是什么?”。

3.3 监控的可靠性:多智能体分离角色

编码评审分离开,这是提高监控可靠性的关键。


这种多智能体协作架构,通过专业分工,将主观的 LLM 判断(如 Reviewer)和客观的程序运行结果(如 Test Runner)结合起来,使监控结果更具公信力。



第四部分:实际应用场景的模式应用

4.1 自动化客户支持 (Goal: 解决客户查询)

  • 目标:将客户查询的工单状态从“待处理”转为“已解决”。

  • 规划

  • 识别问题类型(账单、技术、退款)。

  • 调用相应工具(search_dbapi_tool)。

  • 整合答案。

  • 监控

  • 确定性:检查数据库:工单状态是否变为“Closed”。

  • 非确定性:LLM 评估客户在最后一次回复中的情绪(Sentiment),如果为负面,则触发重新规划(升级给人工)。

4.2 自动交易机器人 (Goal: 最大化投资组合收益)

  • 目标:在风险容忍度 的前提下,季度投资回报率

  • 规划

  • 监控市场:检索实时数据资源(MCP Tool)。

  • 风险评估:计算当前的 VaR (Value at Risk)。

  • 执行交易:调用 broker_api_tool

  • 监控

  • 确定性:每分钟检查一次投资组合的市值(Market Value)和波动率(Volatility)

  • 反馈:一旦 VaR 超过 (确定性监控失败),智能体立即停止所有交易,并触发重新规划:抛售部分高风险资产

4.3 个性化学习系统 (Goal: 提高学生代数理解力)

  • 目标:学生在代数单元测试中的平均分达到

  • 规划

  • 诊断:根据历史错题,规划个性化学习路径。

  • 授课:调用 content_generation_tool 生成材料。

  • 测试:调用 quiz_tool 进行测试。

  • 监控

  • 确定性:跟踪学生在 quiz_tool 上的准确率完成时间(指标)。

  • 反馈:如果准确率低于 ,智能体调整授课策略(重新规划),例如,降低难度或增加额外的解释性资源。



结语:自主 AI 的基石

目标设定与监控模式是赋予 AI 智能体 自主性 (Autonomy)责任感 (Accountability) 的基石。


一个没有目标设定的智能体,是盲目高效的;一个没有监控的智能体,是无法自我修正的。


通过结合 LLM 强大的推理能力进行规划,并利用 LangGraph 的循环结构和 Pydantic 的结构化输出实现监控,我们正在将 AI 从简单的聊天机器人,转变为能够理解并努力实现复杂、高层目标的可靠软件系统。


在构建企业级、高可靠性智能体的道路上,明确的目标严格的监控,才是推动 AI 走向成功的真正引擎。

参考资料

因为 InfoQ 平台风控机制会导致有些文章莫名其妙的被吞下架,后续主要在 CSDN 平台更新,可以去 CSDN 搜索同名 Hernon

1.SMART Goals Framework. https://en.wikipedia.org/wiki/SMART_criteria2.Antonio Gulli 《Agentic Design Patterns》

发布于: 刚刚阅读数: 7
用户头像

Hernon AI

关注

创意心中美好世界 2020-08-19 加入

AI爱好者

评论

发布
暂无评论
AI智能体 - 目标设定与监控模式_AI开发_Hernon AI_InfoQ写作社区