[智能体设计模式] 第11章:目标设定与监控模式
智能体需具备明确目标感与进度追踪能力,才能高效达成结果。目标设定与监控模式的核心是:为智能体设定具体目标,赋予其生成计划、追踪进度、判断目标是否达成的能力,而非仅停留在信息处理或工具调用层面。
模式概述
智能体的“规划”本质是根据高层目标生成中间步骤/子目标,结合工具使用、流程编排等完成复杂任务。优秀的规划能力让智能体可应对非单步问题、适应动态变化、编排复杂工作流,从响应式系统升级为主动达成目标的系统(类似旅行规划:明确目的地→出发点→分步执行→动态调整)。
核心应用场景
- 客户支持自动化:目标“解决客户账单问题”,监控对话、查询数据、调整账单,通过客户反馈判断是否成功。
- 个性化学习系统:目标“提升学生代数理解”,跟踪练习进度、准确率,动态调整教学策略。
- 项目管理助手:目标“确保里程碑X按时完成”,监控任务状态、资源情况,及时预警延误。
- 自动化交易机器人:目标“风险可控下最大化收益”,监控市场数据、风险指标,自动执行交易。
- 自动驾驶:目标“安全从A地到B地”,实时监控环境、自身状态,动态调整驾驶行为。
- 内容审核:目标“移除有害内容”,监控新内容、跟踪误判率,调整过滤标准或升级人工审核。
实战代码示例(LangChain + OpenAI)
功能说明
智能体自主迭代生成Python代码,核心流程:接收编程需求+质量目标→生成代码→评估→优化,循环至目标达成(最多5次迭代),最终输出带注释的可执行文件。
依赖安装
pip install langchain_openai openai python-dotenv
创建.env文件,配置:OPENAI_API_KEY=你的API密钥
核心代码
# MIT License
# Copyright (c) 2025 Mahtab Syed
"""
目标设定与监控模式实战:AI代码生成智能体
功能:
- 接收编程需求(use_case)和质量目标(goals)
- 迭代生成、评估、优化Python代码(最多5次迭代)
- 目标达成判断:LLM仅返回True/False
- 最终保存带注释的可执行.py文件
"""import os
import random
import re
from pathlib import Path
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv, find_dotenv# 加载环境变量
_ = load_dotenv(find_dotenv())
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
if not OPENAI_API_KEY:raise EnvironmentError("请设置OPENAI_API_KEY环境变量")# 初始化LLM
llm = ChatOpenAI(model="gpt-4o", # 无访问权限可替换为其他OpenAI模型temperature=0.3,openai_api_key=OPENAI_API_KEY,
)# 工具函数
def generate_prompt(use_case: str, goals: list[str], previous_code: str = "", feedback: str = "") -> str:"""生成代码生成/优化的提示词"""base_prompt = f"""
你是AI编程助手,根据以下需求编写Python代码:
用例:{use_case}
目标:
{chr(10).join(f"‑ {g.strip()}" for g in goals)}
"""if previous_code:base_prompt += f"\n之前生成的代码:\n{previous_code}"if feedback:base_prompt += f"\n反馈意见:\n{feedback}\n"base_prompt += "\n仅返回修改后的Python代码,不要额外注释或解释"return base_promptdef get_code_feedback(code: str, goals: list[str]) -> str:"""评估代码是否满足目标,生成反馈"""feedback_prompt = f"""
你是Python代码评审员,根据以下目标评估代码:
{chr(10).join(f"‑ {g.strip()}" for g in goals)}
代码:
{code}
请指出是否满足目标,需改进的点(清晰度、简洁性、正确性、边界处理、测试覆盖等)
"""return llm.invoke(feedback_prompt)def goals_met(feedback_text: str, goals: list[str]) -> bool:"""根据反馈判断目标是否达成(返回True/False)"""review_prompt = f"""
目标:
{chr(10).join(f"‑ {g.strip()}" for g in goals)}
代码反馈:
\"\"\"{feedback_text}\"\"\"
基于以上反馈,目标是否全部达成?仅返回True或False
"""response = llm.invoke(review_prompt).content.strip().lower()return response == "true"def clean_code_block(code: str) -> str:"""清理代码块(去除```标记)"""lines = code.strip().splitlines()if lines and lines[0].strip().startswith("```"):lines = lines[1:]if lines and lines[-1].strip() == "```":lines = lines[:-1]return "\n".join(lines).strip()def add_comment_header(code: str, use_case: str) -> str:"""为代码添加头部注释"""comment = f"# 功能:实现以下用例\n# {use_case.strip()}\n"return comment + "\n" + codedef save_code_to_file(code: str, use_case: str) -> str:"""保存代码到文件(生成简洁文件名)"""# 生成简短文件名summary_prompt = f"用1个单词(不超过10字符)概括用例,用于文件名:\n{use_case}"raw_summary = llm.invoke(summary_prompt).content.strip()short_name = re.sub(r"[^a-zA-Z0-9_]", "", raw_summary.replace(" ", "_").lower())[:10]filename = f"{short_name}_{random.randint(1000, 9999)}.py"filepath = Path.cwd() / filenamewith open(filepath, "w") as f:f.write(code)print(f"代码已保存至:{filepath}")return str(filepath)# 主智能体函数
def run_code_agent(use_case: str, goals_input: str, max_iterations: int = 5) -> str:"""运行代码生成智能体"""goals = [g.strip() for g in goals_input.split(",")]print(f"\n用例:{use_case}")print("目标:")for g in goals:print(f" - {g}")previous_code = ""feedback = ""for i in range(max_iterations):print(f"\n=== 迭代 {i + 1}/{max_iterations} ===")# 生成/优化代码prompt = generate_prompt(use_case, goals, previous_code, feedback.content if isinstance(feedback, dict) else feedback)code_response = llm.invoke(prompt)code = clean_code_block(code_response.content.strip())print(f"\n生成的代码:\n{'='*50}\n{code}\n{'='*50}")# 评估代码feedback = get_code_feedback(code, goals)feedback_text = feedback.content.strip()print(f"\n反馈意见:\n{'='*50}\n{feedback_text}\n{'='*50}")# 判断是否达成目标if goals_met(feedback_text, goals):print("目标已全部达成,停止迭代")breakprint("目标未达成,准备下一轮优化")previous_code = code# 保存最终代码final_code = add_comment_header(code, use_case)return save_code_to_file(final_code, use_case)# 测试运行
if __name__ == "__main__":print("AI代码生成智能体启动")# 示例1:计算二进制间隙use_case_input = "编写代码计算给定正整数的二进制间隙(BinaryGap)"goals_input = "代码简洁易懂, 功能正确, 处理所有边界情况, 仅接收正整数输入, 附带示例打印结果"run_code_agent(use_case_input, goals_input)# 示例2:统计目录及子目录文件数(按需启用)# use_case_input = "统计当前目录及所有子目录的文件总数并打印"# goals_input = "代码简洁易懂, 功能正确, 处理边界情况, 忽略性能优化建议, 不使用unittest/pytest"# run_code_agent(use_case_input, goals_input)# 示例3:统计Word文档字数/字符数(按需启用)# use_case_input = "接收命令行输入的Word文档(doc/docx),统计字数和字符数并打印"# goals_input = "代码简洁易懂, 功能正确, 处理边界情况"# run_code_agent(use_case_input, goals_input)
核心流程
- 目标输入:用户提供编程需求(use_case)和质量目标(如“简洁易懂”“处理边界情况”)。
- 迭代循环:
- 生成代码:基于需求和历史反馈生成/优化代码。
- 自我评审:评估代码是否满足所有目标,生成反馈。
- 目标判断:LLM判定是否达成目标(True/False)。
- 优化迭代:未达成则基于反馈修正代码,重复循环(最多5次)。
- 结果输出:目标达成后,保存带注释的可执行代码文件。
注意事项
- 本示例为原理演示,非生产级代码,需人工验证最终代码可用性。
- 单一LLM同时负责生成和评审,可能存在判断偏差,建议生产环境采用多智能体分工(编程、评审、测试分离)。
- 存在无限循环风险,需通过
max_iterations限制迭代次数。 - LLM可能产生“幻觉”,需结合人工测试确保代码正确性。
