第11章:目标设定与监控 Goal Setting and Monitoring

为了使AI智能体真正有效且具有目的性,它们不仅需要处理信息或使用工具的能力,还需要明确的方向感以及评估自身成功与否的方式。这正是目标设定与监控模式的作用所在。该模式旨在为智能体赋予具体的目标,并提供追踪进度和判断目标是否达成的手段。

目标设定与监控模式概述

想象一下规划一次旅行。你不会突然就出现在目的地。你需要决定想去哪里(目标状态),确定自己的出发点(初始状态),考虑可用选项(交通工具、路线、预算),然后规划一系列步骤:订票、打包行李、前往机场或车站、登上交通工具、抵达目的地、寻找住宿等。这个逐步进行的过程,通常需要考虑依赖关系和约束条件,这正是智能体系统中规划的基本含义。

在AI智能体的上下文中,规划通常涉及智能体从一个高层次的目标出发,自主或半自主地生成一系列中间步骤或子目标。这些步骤可以按顺序执行,也可以采用更复杂的流程,可能涉及其他模式,例如工具使用、路径规划或多智能体协作。规划机制可能包括复杂的搜索算法、逻辑推理,或者越来越多地依赖大型语言模型(LLMs)的能力,根据其训练数据和对任务的理解生成合理且有效的计划。

良好的规划能力使智能体能够解决非简单的单步查询问题。它使智能体能够处理多方面的请求,适应不断变化的环境,通过重新规划来应对变化,并协调复杂的工作流。这是一种基础模式,支撑了许多高级的智能体行为,将简单的反应系统转变为能够主动朝着定义目标努力的系统。

实际应用与使用场景

目标设定与监控模式对于构建能够在复杂的现实场景中自主且可靠运行的智能体至关重要。以下是一些实际应用:

  • 客户支持自动化: 智能体的目标可能是“解决客户的账单查询问题”。它监控对话内容,检查数据库条目,并使用工具调整账单。通过确认账单更改和收到客户的积极反馈来监控成功。如果问题未解决,则进行升级处理。
  • 个性化学习系统: 学习智能体可能以“提高学生对代数的理解”为目标。它监控学生在练习中的进展,调整教学材料,并跟踪准确性和完成时间等性能指标。如果学生遇到困难,它会调整教学方法。
  • 项目管理助手: 智能体可能被赋予“确保项目里程碑 X 在 Y 日期前完成”的任务。它监控任务状态、团队沟通和资源可用性,如果目标有风险,会标记延误并建议纠正措施。
  • 自动化交易机器人: 交易智能体的目标可能是“在风险容忍范围内最大化投资组合收益”。它持续监控市场数据、当前投资组合价值和风险指标,当条件符合目标时执行交易,并在风险阈值被突破时调整策略。
  • 机器人与自动驾驶车辆: 自动驾驶车辆的主要目标是“安全地将乘客从 A 地运输到 B 地”。它不断监控环境(其他车辆、行人、交通信号)、自身状态(速度、燃料)以及沿规划路线的进展,调整驾驶行为以安全高效地实现目标。
  • 内容审核: 智能体的目标可能是“识别并移除平台 X 上的有害内容”。它监控传入内容,应用分类模型,并跟踪误报/漏报等指标,调整过滤标准或将模糊案例升级至人工审核。

这种模式是需要可靠运行、实现特定结果并适应动态条件的智能体的基础,为智能自我管理提供了必要框架。

实操代码示例

为了说明目标设置与监控模式,我们提供了一个使用 LangChain 和 OpenAI API 的示例。这段 Python 脚本展示了一个自主 AI 智能体,设计用于生成和优化 Python 代码。其核心功能是为指定问题生成解决方案,并确保符合用户定义的质量标准。

它采用“目标设置与监控”模式,不仅仅生成一次代码,而是进入一个创建、自我评估和改进的迭代循环。智能体的成功通过其自身的 AI 驱动判断来衡量,即生成的代码是否成功满足初始目标。最终输出是一个经过打磨、注释完整、可直接使用的 Python 文件,代表这一优化过程的最终成果。

依赖项:

pip install langchain_openai openai python-dotenv .env 文件中包含 OPENAI_API_KEY

可以通过将其想象为一个自主 AI 程序员分配到一个项目来最好地理解此脚本(见图 1)。过程从您向 AI 提供详细的项目简介开始,即它需要解决的具体编码问题。

## MIT License
## Copyright (c) 2025 Mahtab Syed
## https://www.linkedin.com/in/mahtabsyed/

"""
实操代码示例 - 迭代 2
- 为了说明目标设置与监控模式,我们提供了一个使用 LangChain 和 OpenAI API 的示例:

目标:构建一个 AI 智能体,能够根据指定的目标为特定用例编写代码:

  • 接收一个编码问题(用例),可以是代码或输入。
  • 接收目标列表(例如,“简单”、“已测试”、“处理边界情况”),可以是代码或输入。
  • 使用一个大型语言模型(如 GPT-4o)生成并优化 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 环境变量。")

## ✅ 初始化 OpenAI 模型
print("📡 正在初始化 OpenAI LLM (gpt-4o)...")
llm = ChatOpenAI(
    model="gpt-4o",  # 如果没有 gpt-4o 的访问权限,请使用其他 OpenAI LLM
    temperature=0.3,
    openai_api_key=OPENAI_API_KEY,
)

## --- 工具函数 ---
def generate_prompt(
    use_case: str, goals: list[str], previous_code: str = "", feedback: str = ""
) -> str:
    print("📝 构建代码生成的提示...")
    base_prompt = f"""
你是一个 AI 编码智能体。你的任务是根据以下用例编写 Python 代码:
用例:{use_case}
你的目标是:
{chr(10).join(f"- {g.strip()}" for g in goals)}
"""
    if previous_code:
        print("🔄 将之前生成的代码添加到提示中以进行优化。")
        base_prompt += f"\n之前生成的代码:\n{previous_code}"
    if feedback:
        print("📋 包括反馈以进行修订。")
        base_prompt += f"\n关于之前版本的反馈:\n{feedback}\n"
    base_prompt += "\n请仅返回修订后的 Python 代码。不要包含代码之外的评论或解释。"
    return base_prompt


def get_code_feedback(code: str, goals: list[str]) -> str:
    print("🔍 根据目标评估代码...")
    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:
    """
    使用 LLM 根据反馈文本评估目标是否已满足。
    返回 True 或 False(从 LLM 输出中解析)。
    """
    review_prompt = f"""
你是一个 AI 审查员。以下是目标:
{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"# 此 Python 程序实现了以下用例:\n# {use_case.strip()}\n"
    return comment + "\n" + code


def to_snake_case(text: str) -> str:
    text = re.sub(r"[^a-zA-Z0-9 ]", "", text)
    return re.sub(r"\s+", "_", text.strip().lower())

def save_code_to_file(code: str, use_case: str) -> str:
    print("💾 正在将最终代码保存到文件...")
    summary_prompt = (
        f"将以下用例总结为一个小写单词或短语,"
        f"不超过10个字符,适合作为Python文件名:\n\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]
    random_suffix = str(random.randint(1000, 9999))
    filename = f"{short_name}_{random_suffix}.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 if isinstance(feedback, str) else feedback.content
        )
        print("🚧 正在生成代码...")
        code_response = llm.invoke(prompt)
        raw_code = code_response.content.strip()
        code = clean_code_block(raw_code)
        print("\n🧾 生成的代码:\n" + "-" * 50 + f"\n{code}\n" + "-" * 50)
        print("\n📤 提交代码以获取反馈...")
        feedback = get_code_feedback(code, goals)
        feedback_text = feedback.content.strip()
        print("\n📥 收到的反馈:\n" + "-" * 50 + f"\n{feedback_text}\n" + "-" * 50)
        if goals_met(feedback_text, goals):
            print("✅ LLM 确认目标已达成。停止迭代。")
            break
        print("🛠️ 目标尚未完全达成。准备进行下一次迭代...")
        previous_code = code

    final_code = add_comment_header(code, use_case)
    return save_code_to_file(final_code, use_case)


## --- CLI 测试运行 ---
if __name__ == "__main__":
    print("\n🧠 欢迎使用 AI 代码生成智能体")
    # 示例 1
    use_case_input = "编写代码以找到给定正整数的二进制间隙"
    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
    # use_case_input = "编写代码,接收一个word文档或docx文件的命令行输入,打开它并统计其中的单词和字符数,并打印所有内容"
    # goals_input = "代码简单易懂,功能正确,处理边界情况"
    # run_code_agent(use_case_input, goals_input)

图1:目标设定与监控示例

图1:目标设定与监控示例

当程序员接到任务后,AI程序员开始工作并编写代码的初稿。然而,它并不会立即提交这一初始版本,而是暂停进行一个关键步骤:严格的自我审查。它会仔细地将自己的作品与您提供的质量检查清单中的每一项进行比较,充当自己的质量保证检查员。在完成这项检查后,它会对自己的进度做出一个简单且公正的判断:“True”表示工作符合所有标准,或者“False”表示未达到标准。

如果判断结果为“False”,AI不会放弃。它会进入一个深思熟虑的修订阶段,利用自我评估中获得的洞察力来找出不足之处,并智能地重写代码。这个起草、自我审查和改进的循环会持续进行,每次迭代都旨在更接近目标。这个过程会一直重复,直到AI最终通过满足所有要求而获得“True”状态,或者达到预设的尝试次数限制,就像开发人员在面对最后期限时的工作一样。一旦代码通过最终检查,脚本会将优化后的解决方案打包,添加有用的注释,并保存到一个干净的新Python文件中,准备使用。

注意事项和考虑因素:

需要注意的是,这只是一个示例说明,并非生产就绪代码。在实际应用中,必须考虑多个因素。LLM可能无法完全理解目标的意图,并可能错误地评估其表现为成功。即使目标被很好地理解,模型也可能出现“幻觉”。当同一个LLM同时负责编写代码和评估质量时,它可能更难发现自己走错了方向。

最终,LLM并不能通过魔法生成完美的代码;您仍然需要运行和测试生成的代码。此外,示例中的“监控”非常基础,可能会导致过程无限循环的风险。

充当一名专业代码审查员,致力于生成干净、正确且简单的代码。您的核心任务是通过确保每个建议都基于现实和最佳实践来消除代码中的“幻觉”。当我提供代码片段时,我希望您能够:
-- 识别并修正错误:指出任何逻辑缺陷、漏洞或潜在的运行时错误。
-- 简化和重构:提出使代码更易读、更高效、更易维护的更改,同时不牺牲正确性。
-- 提供清晰的解释:对于每项建议的更改,解释为什么这是一个改进,并参考清晰代码、性能或安全性的原则。
-- 提供修正后的代码:展示建议更改的“前”和“后”,以便清楚地看到改进之处。
您的反馈应直接、建设性,并始终以提高代码质量为目标。

一种更稳健的方法是通过赋予多个智能体明确的角色来分离这些关注点。例如,我使用Gemini构建了一个个人AI智能体团队,其中每个智能体都有特定的角色:

  • 协作程序员 (Peer Programmer): 帮助编写和头脑风暴代码。
  • 代码审查员 (Code Reviewer): 捕捉错误并提出改进建议。
  • 文档编写员 (Documenter): 生成清晰简洁的文档。
  • 测试编写员 (Test Writer): 创建全面的单元测试。
  • 提示优化师 (Prompt Refiner): 优化与AI的交互。

在这个多智能体系统中,代码审查员作为程序员智能体的独立实体,其提示类似于示例中的评审员,这显著提高了客观评估的质量。这种结构自然会导致更好的实践,因为测试编写员智能体可以满足为协作程序员生成的代码编写单元测试的需求。

我将更复杂的控制和使代码更接近生产就绪的任务留给感兴趣的读者。

概览

定义(What)

AI智能体通常缺乏明确的方向,使其无法超越简单的反应性任务而有目的地行动。没有定义明确的目标,它们无法独立处理复杂的多步骤问题或协调复杂的工作流程。此外,它们也没有内在机制来判断自己的行为是否正在实现预期的成功结果。这限制了它们的自主性,并使其在动态的现实场景中无法真正有效地工作,仅仅执行任务是不够的。

设计意图(Why)

目标设定与监控模式通过将目标感和自我评估嵌入智能体系统中,提供了一种标准化解决方案。这种模式明确地为智能体定义清晰、可衡量的目标,同时建立一个监控机制,持续跟踪智能体的进展以及其环境状态与目标的匹配情况。这形成了一个关键的反馈循环,使智能体能够评估其表现、纠正行动方向,并在偏离成功路径时调整计划。通过实施这一模式,开发者可以将简单的反应性智能体转变为主动的、以目标为导向的系统,从而实现自主可靠的操作。

使用原则(Rule of Thumb)

当AI智能体需要自主执行多步骤任务、适应动态条件,并在没有持续人工干预的情况下可靠地实现特定的高层目标时,可以使用这一模式。

图解 (Visual Summary)

图2:目标设计模式

图2:目标设计模式

关键要点

关键要点包括:

  • 目标设定与监控为智能体提供了目标感和跟踪进展的机制。
  • 目标应具体、可衡量、可实现、相关且有时间限制(SMART)。
  • 明确定义指标和成功标准对于有效监控至关重要。
  • 监控包括观察智能体行为、环境状态和工具输出。
  • 监控反馈循环使智能体能够适应、修订计划或升级问题。
  • 在Google的ADK中,目标通常通过智能体指令传达,监控则通过状态管理和工具交互实现。

结论

本章聚焦于目标设定与监控这一重要范式。文中强调了这一概念如何将AI智能体从简单的反应性系统转变为主动的、以目标为驱动的实体。文本突出了定义清晰、可衡量目标的重要性,以及建立严格的监控程序以跟踪进展的必要性。实际应用展示了这一范式如何支持在多个领域(包括客户服务和机器人技术)中实现可靠的自主操作。一个概念性代码示例说明了如何在结构化框架中实现这些原则,通过智能体指令和状态管理来指导和评估智能体实现其指定目标的情况。最终,为智能体提供制定和监督目标的能力是构建真正智能且负责任的AI系统的基础步骤。

参考文献

  1. SMART目标框架. https://en.wikipedia.org/wiki/SMART_criteria

results matching ""

    No results matching ""