从理论到实践的最后一步

前面四篇教程分别讲解了 Agent Loop 的基础理论、工具调用、Reflection 和多 Agent 协作。现在,到了将这些知识融会贯通的时候——我们将构建一个完整的 Agent Loop 应用,它能够自动完成从需求理解到最终交付的全流程。

这个应用将模拟一个「AI 研究助手」:用户提出一个研究主题,Agent 自动进行需求分析、任务分解、信息检索、结果验证和报告生成。整个过程无需人工干预,展示 Agent Loop 在实际场景中的完整能力。

应用架构设计

我们的「AI 研究助手」采用五阶段流水线架构:

  1. 需求接收:理解用户的研究主题,明确范围和深度要求
  2. 任务分解:将研究主题拆解为多个可执行的子任务
  3. 逐步执行:逐个完成子任务,收集信息和分析结果
  4. 结果验证:交叉验证信息的准确性,补充缺失内容
  5. 最终交付:整合所有结果,生成结构化的研究报告

每个阶段都可能触发反馈循环——如果验证不通过,会回到执行阶段重新收集信息;如果交付不完整,会回到分解阶段重新规划。

技能链拆解:完整 Agent Loop 应用

我们以「完整 Agent Loop 应用」技能链为例,拆解每个节点在端到端流程中的作用:

节点 1:需求接收(sp-15)——这是整个 Agent Loop 的入口。AI 需要从用户的自然语言输入中提取关键信息:研究主题、期望深度、输出格式、特殊要求等。这个节点的输出是一份结构化的需求文档。

节点 2:任务分解(sp-188)——将需求文档转化为可执行的行动计划。好的任务分解应该:每个子任务独立可执行、子任务之间有清晰的逻辑关系、总工作量合理可控。

节点 3:逐步执行(sp-187)——这是 Agent Loop 的核心执行阶段。AI 按照任务计划,逐个完成子任务。每个子任务可能涉及工具调用、信息检索、代码执行等操作。执行过程会记录日志,便于后续验证。

节点 4:结果验证(sp-185)——对所有执行结果进行质量检查。验证维度包括:信息准确性(是否有事实错误)、覆盖完整性(是否遗漏关键点)、逻辑一致性(各部分是否矛盾)。如果验证不通过,会将具体问题反馈给执行节点进行修正。

节点 5:最终交付(sp-122)——将所有验证通过的结果整合为最终交付物。根据用户的需求格式(报告、PPT、代码仓库等),生成符合要求的输出。这个节点还会添加元数据(生成时间、信息来源、置信度评分等)。

完整代码实现

以下是「AI 研究助手」的完整实现代码:

import json
import time
from datetime import datetime
from openai import OpenAI

client = OpenAI(
    api_key="your-deepseek-api-key",
    base_url="https://api.deepseek.com"
)

class AIResearchAssistant:
    """完整的 Agent Loop 应用:AI 研究助手"""

    def __init__(self, max_iterations=10):
        self.max_iterations = max_iterations
        self.execution_log = []
        self.start_time = None

    def log(self, phase, message):
        """记录执行日志"""
        entry = {
            "timestamp": datetime.now().isoformat(),
            "phase": phase,
            "message": message
        }
        self.execution_log.append(entry)
        print(f"[{phase}] {message}")

    def call_llm(self, system_prompt, user_prompt, response_format=None):
        """统一的 LLM 调用接口"""
        messages = [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ]
        kwargs = {
            "model": "deepseek-chat",
            "messages": messages
        }
        if response_format:
            kwargs["response_format"] = response_format

        response = client.chat.completions.create(**kwargs)
        return response.choices[0].message.content

    def phase1_understand(self, user_input):
        """阶段 1:需求接收与分析"""
        self.log("需求分析", "开始分析用户需求")

        prompt = f"""分析以下用户的研究需求,提取关键信息。

用户输入:{user_input}

请以 JSON 格式输出:
{{
    "topic": "研究主题",
    "scope": "研究范围(技术/商业/学术等)",
    "depth": "期望深度(概述/详细/深入)",
    "format": "期望输出格式",
    "keywords": ["关键词1", "关键词2"],
    "constraints": ["约束条件1", "约束条件2"],
    "target_audience": "目标读者"
}}"""

        result = self.call_llm(
            "你是一位需求分析专家,善于从模糊描述中提取结构化需求。",
            prompt
        )
        requirements = json.loads(result)
        self.log("需求分析", f"识别主题:{requirements['topic']}")
        return requirements

    def phase2_decompose(self, requirements):
        """阶段 2:任务分解"""
        self.log("任务分解", "开始分解研究任务")

        prompt = f"""根据以下需求,将研究任务分解为 3-5 个可执行的子任务。

需求:{json.dumps(requirements, ensure_ascii=False)}

请以 JSON 格式输出:
{{
    "subtasks": [
        {{
            "id": 1,
            "title": "子任务标题",
            "description": "详细描述",
            "type": "research|analysis|synthesis|verification",
            "estimated_tokens": 500,
            "depends_on": []
        }}
    ],
    "execution_order": [1, 2, 3]
}}"""

        result = self.call_llm(
            "你是一位项目管理专家,擅长将复杂任务拆解为可执行的子任务。",
            prompt
        )
        plan = json.loads(result)
        self.log("任务分解", f"拆解为 {len(plan['subtasks'])} 个子任务")
        return plan

    def phase3_execute(self, requirements, plan):
        """阶段 3:逐步执行"""
        self.log("执行阶段", "开始执行子任务")
        results = {}

        for task_id in plan["execution_order"]:
            task = next(t for t in plan["subtasks"] if t["id"] == task_id)
            self.log("执行阶段", f"执行子任务 {task_id}:{task['title']}")

            # 收集依赖任务的上下文
            context = ""
            for dep_id in task.get("depends_on", []):
                if dep_id in results:
                    context += f"\n前置任务 {dep_id} 的结果:\n{results[dep_id]}"

            prompt = f"""完成以下研究子任务。

研究主题:{requirements['topic']}
子任务:{task['title']}
描述:{task['description']}
{"上下文:" + context if context else ""}

要求:
1. 提供准确、有深度的信息
2. 引用具体的数据和案例
3. 指出信息的不确定性(如有)
4. 标注信息来源类型(学术论文/行业报告/新闻/官方数据等)"""

            result = self.call_llm(
                "你是一位资深研究员,善于收集、分析和整合信息。",
                prompt
            )
            results[task_id] = result
            self.log("执行阶段", f"子任务 {task_id} 完成({len(result)} 字符)")

        return results

    def phase4_verify(self, requirements, results):
        """阶段 4:结果验证"""
        self.log("验证阶段", "开始验证结果质量")

        prompt = f"""验证以下研究结果的完整性和准确性。

研究主题:{requirements['topic']}
研究结果:
{json.dumps(results, ensure_ascii=False, indent=2)}

请从以下维度评估:
1. 信息准确性(是否有存疑或不一致的内容)
2. 覆盖完整性(是否遗漏了关键方面)
3. 逻辑一致性(各部分之间是否有矛盾)

以 JSON 格式输出:
{{
    "verified": true/false,
    "overall_score": 0-100,
    "issues": [
        {{"task_id": 1, "severity": "high/medium/low", "description": "问题描述"}}
    ],
    "missing_topics": ["遗漏的主题"],
    "recommendation": "通过/需补充/需重做"
}}"""

        result = self.call_llm(
            "你是一位严谨的质量审核专家,不放过任何信息缺陷。",
            prompt
        )
        verification = json.loads(result)

        if verification["verified"]:
            self.log("验证阶段", f"验证通过,评分:{verification['overall_score']}")
        else:
            self.log("验证阶段", f"发现问题 {len(verification['issues'])} 个")

        return verification

    def phase5_deliver(self, requirements, results, verification):
        """阶段 5:最终交付"""
        self.log("交付阶段", "生成最终报告")

        elapsed = time.time() - self.start_time

        prompt = f"""基于以下研究结果,生成最终的研究报告。

研究主题:{requirements['topic']}
目标读者:{requirements['target_audience']}
期望格式:{requirements['format']}
验证结果:{json.dumps(verification, ensure_ascii=False)}

研究数据:
{json.dumps(results, ensure_ascii=False, indent=2)}

报告要求:
1. 结构清晰,包含摘要、正文、结论
2. 专业但易懂,适合目标读者
3. 标注关键数据和引用来源
4. 在末尾附上执行统计(耗时、子任务数、质量评分)

执行统计:
- 总耗时:{elapsed:.1f} 秒
- 子任务数:{len(results)}
- 质量评分:{verification['overall_score']}"""

        report = self.call_llm(
            "你是一位资深的报告撰写专家,善于将研究数据转化为高质量的报告。",
            prompt
        )
        self.log("交付阶段", f"报告生成完成({len(report)} 字符)")
        return report

    def run(self, user_input):
        """运行完整的 Agent Loop"""
        self.start_time = time.time()
        print("=" * 60)
        print("AI 研究助手启动")
        print("=" * 60)

        for iteration in range(self.max_iterations):
            print(f"\n--- 第 {iteration + 1} 轮迭代 ---")

            # 阶段 1-2:需求分析与任务分解
            if iteration == 0:
                requirements = self.phase1_understand(user_input)
                plan = self.phase2_decompose(requirements)

            # 阶段 3:执行
            results = self.phase3_execute(requirements, plan)

            # 阶段 4:验证
            verification = self.phase4_verify(requirements, results)

            if verification["verified"]:
                # 阶段 5:交付
                report = self.phase5_deliver(requirements, results, verification)

                print("\n" + "=" * 60)
                print("任务完成!")
                elapsed = time.time() - self.start_time
                print(f"总耗时:{elapsed:.1f} 秒")
                print(f"总迭代:{iteration + 1} 轮")
                print(f"子任务数:{len(results)}")
                print(f"质量评分:{verification['overall_score']}")
                print("=" * 60)

                return {
                    "report": report,
                    "requirements": requirements,
                    "verification": verification,
                    "execution_log": self.execution_log,
                    "elapsed_seconds": elapsed
                }
            else:
                self.log("迭代", "验证未通过,调整计划重新执行")
                # 根据验证反馈调整计划
                plan = self.phase2_decompose({
                    **requirements,
                    "feedback": verification["issues"],
                    "missing": verification["missing_topics"]
                })

        return {"error": "达到最大迭代次数,任务未完成"}

# 使用示例
assistant = AIResearchAssistant(max_iterations=10)
result = assistant.run(
    "请研究 2024 年 AI Agent 技术的发展现状和未来趋势,"
    "重点关注企业级应用场景,面向技术决策者,"
    "输出一份结构化的研究报告。"
)
print(f"\n研究报告:\n{result['report']}")

运行效果与关键指标

运行上述代码,你将看到 Agent Loop 的完整执行过程:

  • 需求分析:提取研究主题、范围、深度、目标读者等信息
  • 任务分解:将研究拆解为背景调研、技术分析、应用场景、竞争格局、趋势预测等子任务
  • 逐步执行:每个子任务独立执行,输出详细的分析结果
  • 结果验证:检查信息准确性、覆盖完整性和逻辑一致性
  • 最终交付:生成结构化研究报告,包含执行统计

关键设计要点:

  • 日志系统:每个阶段记录执行日志,便于调试和审计
  • 反馈循环:验证不通过时自动回到任务分解阶段,重新规划
  • 上下文传递:子任务之间通过依赖关系传递上下文,保证信息连贯
  • 质量量化:用评分机制量化输出质量,作为停止条件的判断依据

生产化部署建议

要将这个 Agent Loop 应用部署到生产环境,还需要考虑以下方面:

  • 异步执行:使用消息队列(如 Redis、RabbitMQ)实现异步任务处理,避免长时间阻塞
  • 状态持久化:将 Agent 的执行状态存入数据库,支持断点续传和进度查询
  • 并发控制:对 LLM API 调用实施速率限制和重试机制,避免触发限流
  • 成本监控:记录每次调用的 token 消耗,设置预算告警
  • 人工审核节点:在关键决策点(如最终交付前)加入人工审核环节
  • A/B 测试:对比不同提示词策略的效果,持续优化 Agent 表现

总结与展望

通过这五篇教程,我们从 Agent Loop 的基础概念出发,逐步深入到工具调用、Reflection、多 Agent 协作,最终构建了一个完整的 Agent Loop 应用。Agent Loop 不是遥不可及的概念,而是可以立即上手的开发范式。

Agent Loop 的未来令人兴奋:自主编程、自动化科研、智能运维——这些场景正在从想象变为现实。掌握 Agent Loop,你就掌握了构建下一代 AI 应用的核心能力。现在,打开技能链,亲手编排你的第一个 Agent Loop 吧!

想亲手编排这个技能链?

在技能链中打开 →