[智能体设计模式] 第11章:目标设定与监控模式

智能体需具备明确目标感与进度追踪能力,才能高效达成结果。目标设定与监控模式的核心是:为智能体设定具体目标,赋予其生成计划、追踪进度、判断目标是否达成的能力,而非仅停留在信息处理或工具调用层面。

模式概述

智能体的"规划"本质是根据高层目标生成中间步骤/子目标,结合工具使用、流程编排等完成复杂任务。优秀的规划能力让智能体可应对非单步问题、适应动态变化、编排复杂工作流,从响应式系统升级为主动达成目标的系统(类似旅行规划:明确目的地→出发点→分步执行→动态调整)。

核心应用场景

  • 客户支持自动化:目标"解决客户账单问题",监控对话、查询数据、调整账单,通过客户反馈判断是否成功。
  • 个性化学习系统:目标"提升学生代数理解",跟踪练习进度、准确率,动态调整教学策略。
  • 项目管理助手:目标"确保里程碑X按时完成",监控任务状态、资源情况,及时预警延误。
  • 自动化交易机器人:目标"风险可控下最大化收益",监控市场数据、风险指标,自动执行交易。
  • 自动驾驶:目标"安全从A地到B地",实时监控环境、自身状态,动态调整驾驶行为。
  • 内容审核:目标"移除有害内容",监控新内容、跟踪误判率,调整过滤标准或升级人工审核。

实战代码示例(LangChain + OpenAI)

功能说明

智能体自主迭代生成Python代码,核心流程:接收编程需求+质量目标→生成代码→评估→优化,循环至目标达成(最多5次迭代),最终输出带注释的可执行文件。

依赖安装

bash 复制代码
pip install langchain_openai openai python-dotenv

创建.env文件,配置:OPENAI_API_KEY=你的API密钥

核心代码

python 复制代码
# 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_prompt

def 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" + code

def 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() / filename

    with 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("目标已全部达成,停止迭代")
            break
        print("目标未达成,准备下一轮优化")
        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)

核心流程

  1. 目标输入:用户提供编程需求(use_case)和质量目标(如"简洁易懂""处理边界情况")。
  2. 迭代循环:
    • 生成代码:基于需求和历史反馈生成/优化代码。
    • 自我评审:评估代码是否满足所有目标,生成反馈。
    • 目标判断:LLM判定是否达成目标(True/False)。
    • 优化迭代:未达成则基于反馈修正代码,重复循环(最多5次)。
  3. 结果输出:目标达成后,保存带注释的可执行代码文件。

注意事项

  1. 本示例为原理演示,非生产级代码,需人工验证最终代码可用性。
  2. 单一LLM同时负责生成和评审,可能存在判断偏差,建议生产环境采用多智能体分工(编程、评审、测试分离)。
  3. 存在无限循环风险,需通过max_iterations限制迭代次数。
  4. LLM可能产生"幻觉",需结合人工测试确保代码正确性。
相关推荐
User_芊芊君子6 分钟前
CANN数学计算基石ops-math深度解析:高性能科学计算与AI模型加速的核心引擎
人工智能·深度学习·神经网络·ai
小白|9 分钟前
CANN与联邦学习融合:构建隐私安全的分布式AI推理与训练系统
人工智能·机器学习·自动驾驶
艾莉丝努力练剑17 分钟前
hixl vs NCCL:昇腾生态通信库的独特优势分析
运维·c++·人工智能·cann
梦帮科技18 分钟前
Node.js配置生成器CLI工具开发实战
前端·人工智能·windows·前端框架·node.js·json
程序员泠零澪回家种桔子19 分钟前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
Echo_NGC223722 分钟前
【FFmpeg 使用指南】Part 3:码率控制策略与质量评估体系
人工智能·ffmpeg·视频·码率
纤纡.32 分钟前
PyTorch 入门精讲:从框架选择到 MNIST 手写数字识别实战
人工智能·pytorch·python
大大大反派33 分钟前
CANN 生态中的自动化部署引擎:深入 `mindx-sdk` 项目构建端到端 AI 应用
运维·人工智能·自动化
程序猿追34 分钟前
深度解读 AIR (AI Runtime):揭秘 CANN 极致算力编排与调度的核心引擎
人工智能
2601_9495936539 分钟前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能