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

模式概述

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

核心应用场景

  • 客户支持自动化:目标“解决客户账单问题”,监控对话、查询数据、调整账单,通过客户反馈判断是否成功。
  • 个性化学习系统:目标“提升学生代数理解”,跟踪练习进度、准确率,动态调整教学策略。
  • 项目管理助手:目标“确保里程碑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_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可能产生“幻觉”,需结合人工测试确保代码正确性。
Logo

一座年轻的奋斗人之城,一个温馨的开发者之家。在这里,代码改变人生,开发创造未来!

更多推荐