Skip to content

阶段 3:任务分解与多步推理 Agent

📖 本阶段目标

  • 理解任务分解的原理和方法
  • 掌握 ReAct 模式的实现
  • 学习让 Agent 进行多步骤推理
  • 实践构建能够自主规划的工作流 Agent

🧩 任务分解核心概念

为什么需要任务分解?

复杂任务通常无法一步完成,需要: 1. 分解:将大任务拆解为小步骤 2. 规划:确定执行顺序 3. 执行:逐步完成各个子任务 4. 整合:汇总结果

任务分解模式

1. 线性分解

任务:准备一份市场报告
↓
步骤1:收集市场数据 → 步骤2:分析数据 → 步骤3:生成报告

2. 并行分解

任务:准备项目方案
    ↓
    ├─ 技术方案(并行)
    ├─ 成本估算(并行)
    └─ 时间规划(并行)
    ↓
    整合为完整方案

3. 层级分解

任务:开发新功能
    ├─ 需求分析
    │   ├─ 用户调研
    │   └─ 竞品分析
    ├─ 技术设计
    │   ├─ 架构设计
    │   └─ 接口设计
    └─ 实施计划

🔄 ReAct 模式深入

ReAct 循环

# examples/stage3/react_agent.py
from typing import List, Dict, Any
from openai import OpenAI
import json
import re

client = OpenAI()

class ReActAgent:
    """ReAct 模式 Agent"""

    def __init__(self, max_iterations=10):
        self.max_iterations = max_iterations
        self.tools = self._define_tools()
        self.thought_history = []

    def _define_tools(self):
        """定义可用工具"""
        return {
            "search": self.search_tool,
            "calculate": self.calculate_tool,
            "lookup": self.lookup_tool,
        }

    def search_tool(self, query: str) -> str:
        """搜索工具(模拟)"""
        # 实际应该调用真实搜索API
        mock_results = {
            "Python": "Python是一种高级编程语言,由Guido van Rossum创建于1991年。",
            "北京": "北京是中国的首都,人口超过2000万。",
            "AI": "人工智能是计算机科学的一个分支,研究如何让机器模拟人类智能。"
        }
        for key in mock_results:
            if key in query:
                return mock_results[key]
        return f"关于'{query}'的搜索结果:暂无相关信息。"

    def calculate_tool(self, expression: str) -> str:
        """计算工具"""
        try:
            result = eval(expression, {"__builtins__": {}}, {})
            return str(result)
        except:
            return "计算错误"

    def lookup_tool(self, keyword: str) -> str:
        """查找工具(在之前的搜索结果中查找)"""
        # 简化实现
        return f"查找到关于'{keyword}'的信息"

    def parse_action(self, text: str) -> tuple:
        """解析 LLM 输出的行动"""
        # 匹配 Action: tool_name[arguments]
        action_pattern = r"Action:\s*(\w+)\[(.*?)\]"
        match = re.search(action_pattern, text)

        if match:
            tool_name = match.group(1)
            arguments = match.group(2).strip('"\'')
            return tool_name, arguments
        return None, None

    def run(self, question: str) -> str:
        """运行 ReAct 循环"""
        prompt = f"""
你是一个使用 ReAct 模式的智能助手。

可用工具:
- search[query]: 搜索信息
- calculate[expression]: 计算数学表达式
- lookup[keyword]: 在之前的结果中查找关键词

请按以下格式思考和行动:
Thought: [你的思考过程]
Action: [工具名称][参数]
Observation: [工具返回的结果,由系统填充]
... (重复 Thought/Action/Observation)
Thought: 我现在知道最终答案了
Final Answer: [最终答案]

问题: {question}

开始!
Thought:
"""

        messages = [{"role": "user", "content": prompt}]
        full_response = ""

        for i in range(self.max_iterations):
            response = client.chat.completions.create(
                model="gpt-4",
                messages=messages,
                temperature=0.2,
                max_tokens=500
            )

            thought = response.choices[0].message.content
            full_response += thought + "\n"

            # 检查是否得到最终答案
            if "Final Answer:" in thought:
                final_answer = thought.split("Final Answer:")[-1].strip()
                return {
                    "answer": final_answer,
                    "process": full_response,
                    "iterations": i + 1
                }

            # 解析行动
            tool_name, arguments = self.parse_action(thought)

            if tool_name and tool_name in self.tools:
                # 执行工具
                observation = self.tools[tool_name](arguments)
                full_response += f"Observation: {observation}\n"

                # 更新消息
                messages.append({"role": "assistant", "content": thought})
                messages.append({
                    "role": "user",
                    "content": f"Observation: {observation}\nThought:"
                })
            else:
                # 如果没有找到有效的行动,提示继续
                messages.append({"role": "assistant", "content": thought})
                messages.append({
                    "role": "user",
                    "content": "请继续思考或给出最终答案。\nThought:"
                })

        return {
            "answer": "达到最大迭代次数,未能得到答案",
            "process": full_response,
            "iterations": self.max_iterations
        }

# 测试
if __name__ == "__main__":
    agent = ReActAgent(max_iterations=5)

    question = "Python语言是什么时候创建的?创建者是谁?"
    result = agent.run(question)

    print("=" * 50)
    print("问题:", question)
    print("=" * 50)
    print("推理过程:")
    print(result["process"])
    print("=" * 50)
    print("最终答案:", result["answer"])
    print("迭代次数:", result["iterations"])

🎯 实践项目

项目 1:自动资料收集 Agent

# examples/stage3/research_agent.py
from openai import OpenAI
import json
from typing import List, Dict

client = OpenAI()

class ResearchAgent:
    """自动研究和资料收集 Agent"""

    def __init__(self):
        self.research_results = []
        self.sources = []

    def decompose_research_task(self, topic: str) -> List[str]:
        """分解研究任务为子问题"""
        prompt = f"""
        研究主题: {topic}

        请将这个研究主题分解为3-5个具体的子问题,这些问题的答案能够全面覆盖该主题。

        以JSON格式返回:
        {{
            "subtopics": [
                "子问题1",
                "子问题2",
                ...
            ]
        }}
        """

        response = client.chat.completions.create(
            model="gpt-4-turbo-preview",
            messages=[{"role": "user", "content": prompt}],
            response_format={"type": "json_object"}
        )

        result = json.loads(response.choices[0].message.content)
        return result.get("subtopics", [])

    def research_subtopic(self, subtopic: str) -> Dict:
        """研究单个子主题"""
        # 这里应该调用真实的搜索API或知识库
        # 模拟搜索过程
        prompt = f"""
        请简要回答以下问题(100-200字):
        {subtopic}

        请给出准确、专业的回答。
        """

        response = client.chat.completions.create(
            model="gpt-4",
            messages=[{"role": "user", "content": prompt}],
            temperature=0.3
        )

        answer = response.choices[0].message.content

        return {
            "question": subtopic,
            "answer": answer,
            "source": "GPT-4 知识库"
        }

    def synthesize_results(self, topic: str, results: List[Dict]) -> str:
        """综合研究结果"""
        results_text = "\n\n".join([
            f"Q: {r['question']}\nA: {r['answer']}"
            for r in results
        ])

        prompt = f"""
        研究主题: {topic}

        以下是对该主题的分项研究结果:

        {results_text}

        请将这些信息综合成一份连贯、结构化的研究报告(300-500字),包括:
        1. 概述
        2. 主要发现
        3. 总结
        """

        response = client.chat.completions.create(
            model="gpt-4",
            messages=[{"role": "user", "content": prompt}],
            temperature=0.5
        )

        return response.choices[0].message.content

    def conduct_research(self, topic: str) -> Dict:
        """执行完整的研究流程"""
        print(f"📚 开始研究: {topic}\n")

        # 步骤1: 任务分解
        print("步骤1: 分解研究任务...")
        subtopics = self.decompose_research_task(topic)
        print(f"已分解为 {len(subtopics)} 个子问题:")
        for i, st in enumerate(subtopics, 1):
            print(f"  {i}. {st}")
        print()

        # 步骤2: 逐个研究子主题
        print("步骤2: 研究各个子主题...")
        results = []
        for i, subtopic in enumerate(subtopics, 1):
            print(f"  研究中 ({i}/{len(subtopics)}): {subtopic[:50]}...")
            result = self.research_subtopic(subtopic)
            results.append(result)
        print()

        # 步骤3: 综合报告
        print("步骤3: 生成综合报告...")
        report = self.synthesize_results(topic, results)
        print()

        return {
            "topic": topic,
            "subtopics": subtopics,
            "detailed_results": results,
            "final_report": report
        }

# 测试
if __name__ == "__main__":
    agent = ResearchAgent()

    topic = "AI Agent的核心技术"
    result = agent.conduct_research(topic)

    print("=" * 60)
    print("📊 研究报告")
    print("=" * 60)
    print(result["final_report"])
    print("=" * 60)

项目 2:工作流助手

# examples/stage3/workflow_agent.py
from openai import OpenAI
from typing import List, Dict, Any
from datetime import datetime
import json

client = OpenAI()

class WorkflowAgent:
    """工作流自动化助手"""

    def __init__(self):
        self.workflow_history = []
        self.available_actions = {
            "send_email": self.send_email,
            "create_task": self.create_task,
            "schedule_meeting": self.schedule_meeting,
            "generate_document": self.generate_document,
            "analyze_data": self.analyze_data
        }

    def send_email(self, recipient: str, subject: str, body: str) -> Dict:
        """发送邮件(模拟)"""
        print(f"📧 发送邮件到: {recipient}")
        print(f"   主题: {subject}")
        return {"status": "sent", "timestamp": datetime.now().isoformat()}

    def create_task(self, title: str, description: str, assignee: str) -> Dict:
        """创建任务(模拟)"""
        print(f"✅ 创建任务: {title}")
        print(f"   负责人: {assignee}")
        return {"task_id": f"TASK-{len(self.workflow_history)+1}", "status": "created"}

    def schedule_meeting(self, title: str, participants: List[str], duration: int) -> Dict:
        """安排会议(模拟)"""
        print(f"📅 安排会议: {title}")
        print(f"   参与者: {', '.join(participants)}")
        return {"meeting_id": f"MEET-{len(self.workflow_history)+1}", "status": "scheduled"}

    def generate_document(self, doc_type: str, content: str) -> Dict:
        """生成文档(模拟)"""
        print(f"📄 生成文档: {doc_type}")
        return {"doc_id": f"DOC-{len(self.workflow_history)+1}", "status": "generated"}

    def analyze_data(self, data_source: str, analysis_type: str) -> Dict:
        """分析数据(模拟)"""
        print(f"📊 分析数据: {data_source}")
        return {"analysis_id": f"ANAL-{len(self.workflow_history)+1}", "status": "completed"}

    def plan_workflow(self, user_request: str) -> List[Dict]:
        """规划工作流步骤"""
        prompt = f"""
        用户请求: {user_request}

        可用操作:
        1. send_email(recipient, subject, body) - 发送邮件
        2. create_task(title, description, assignee) - 创建任务
        3. schedule_meeting(title, participants, duration) - 安排会议
        4. generate_document(doc_type, content) - 生成文档
        5. analyze_data(data_source, analysis_type) - 分析数据

        请将用户请求分解为具体的操作步骤,以JSON格式返回:
        {{
            "steps": [
                {{
                    "step_number": 1,
                    "action": "操作名称",
                    "parameters": {{"param1": "value1"}},
                    "description": "步骤描述"
                }},
                ...
            ]
        }}

        注意:
        - 步骤要有逻辑顺序
        - 参数要具体明确
        - 每个步骤要有清晰的描述
        """

        response = client.chat.completions.create(
            model="gpt-4-turbo-preview",
            messages=[{"role": "user", "content": prompt}],
            response_format={"type": "json_object"}
        )

        plan = json.loads(response.choices[0].message.content)
        return plan.get("steps", [])

    def execute_workflow(self, user_request: str) -> Dict:
        """执行完整工作流"""
        print(f"🚀 开始执行工作流")
        print(f"📝 用户请求: {user_request}\n")

        # 步骤1: 规划
        print("=" * 60)
        print("步骤1: 规划工作流")
        print("=" * 60)
        steps = self.plan_workflow(user_request)

        print(f"已规划 {len(steps)} 个步骤:")
        for step in steps:
            print(f"  {step['step_number']}. {step['description']}")
        print()

        # 步骤2: 执行
        print("=" * 60)
        print("步骤2: 执行工作流")
        print("=" * 60)

        execution_results = []
        for step in steps:
            print(f"\n执行步骤 {step['step_number']}: {step['description']}")
            print("-" * 60)

            action_name = step['action']
            if action_name in self.available_actions:
                try:
                    # 执行操作
                    action_func = self.available_actions[action_name]
                    result = action_func(**step['parameters'])

                    execution_results.append({
                        "step": step['step_number'],
                        "action": action_name,
                        "status": "success",
                        "result": result
                    })
                    print(f"✓ 完成")
                except Exception as e:
                    execution_results.append({
                        "step": step['step_number'],
                        "action": action_name,
                        "status": "failed",
                        "error": str(e)
                    })
                    print(f"✗ 失败: {e}")
            else:
                print(f"⚠ 未知操作: {action_name}")

        print("\n" + "=" * 60)
        print("工作流执行完成")
        print("=" * 60)

        return {
            "request": user_request,
            "planned_steps": steps,
            "execution_results": execution_results,
            "overall_status": "completed"
        }

# 测试
if __name__ == "__main__":
    agent = WorkflowAgent()

    request = """
    我们需要启动一个新项目:
    1. 给团队成员发邮件通知项目启动
    2. 创建项目任务列表
    3. 安排项目启动会议
    4. 生成项目计划文档
    """

    result = agent.execute_workflow(request)

    print("\n\n📊 执行总结:")
    print(f"总步骤数: {len(result['planned_steps'])}")
    print(f"成功: {sum(1 for r in result['execution_results'] if r['status'] == 'success')}")
    print(f"失败: {sum(1 for r in result['execution_results'] if r['status'] == 'failed')}")

🎨 高级技巧

1. 自适应规划

让 Agent 根据中间结果调整计划:

def adaptive_planning(self, goal: str, current_state: Dict) -> List[Dict]:
    """根据当前状态自适应调整计划"""
    prompt = f"""
    目标: {goal}
    当前状态: {json.dumps(current_state, ensure_ascii=False)}

    基于当前状态,规划接下来需要执行的步骤。
    如果目标已达成,返回空列表。
    """
    # ... 实现

2. 任务优先级排序

def prioritize_tasks(self, tasks: List[Dict]) -> List[Dict]:
    """对任务进行优先级排序"""
    prompt = f"""
    以下是待执行的任务列表:
    {json.dumps(tasks, ensure_ascii=False)}

    请根据以下因素排序:
    1. 依赖关系(先决条件)
    2. 紧急程度
    3. 重要性

    返回排序后的任务列表。
    """
    # ... 实现

3. 错误恢复

def handle_step_failure(self, step: Dict, error: str) -> Dict:
    """处理步骤失败"""
    prompt = f"""
    步骤执行失败:
    步骤: {step['description']}
    错误: {error}

    请提供:
    1. 失败原因分析
    2. 可能的替代方案
    3. 是否应该继续执行后续步骤
    """
    # ... 实现

✅ 阶段完成检查清单

  • [ ] 理解任务分解的基本原理
  • [ ] 掌握 ReAct 模式的实现
  • [ ] 能够让 Agent 进行多步推理
  • [ ] 实现了自动规划和执行的工作流
  • [ ] 了解如何处理复杂任务的依赖关系
  • [ ] 掌握错误处理和恢复机制
  • [ ] 完成至少一个多步推理项目

🎯 下一步

完成本阶段后,进入 阶段 4:记忆、知识库系统与长期状态,学习如何赋予 Agent 记忆能力。


💡 小贴士:多步推理是 Agent 的"大脑",好的任务分解能力让 Agent 更智能。记住:从简单任务开始,逐步增加复杂度。