魅力程序猿

  • 首页
  • Java
  • Android
  • APP
    • 扑克计分器
    • Video Wallpaper
  • 联系我
  • 关于我
  • 资助
道子
向阳而生
  1. 首页
  2. AI技术
  3. 正文

AI Agent 30天速成|Day4 教学笔记

2026年6月20日 2点热度 0人点赞 0条评论

📰 来源: 博客园


  • 理解Agent规划、任务拆解核心思想,掌握ReAct、Plan-Solve标准推理框架
  • 基于前3天代码,实现自主任务拆解Agent(复杂问题自动拆分多子任务)
  • 实现多工具串行/并行调度、任务状态管理、失败子任务重试机制
  • 整合RAG知识库+Function Calling+任务规划,完成全能基础智能体
    每日时长分配(全天8h)
  • 理论笔记阅读+理解:2.5h
  • 复盘+面试背诵:1.5h
  • 1. Agent规划核心概念

    1.1 什么是任务规划

    当用户提出复合型复杂问题(多步骤、多工具、多知识库查询),大模型无法一次性给出答案,需要先拆解成多个可执行子任务,按顺序分步执行,最后汇总结果。
    例:“帮我计算(125+36)*8,同时查询RAG定义,最后汇总成一段总结”
    拆解子任务:

  • 调用计算器计算125+36
  • 调用计算器计算结果×8
  • RAG检索RAG相关知识
  • 1.2 两大主流推理框架(面试必考)

    核心逻辑:Thought→Action→Observation循环

  • Thought:模型思考当前需要做什么、下一步执行什么工具/检索
  • Action:输出标准化工具调用/检索指令
  • Observation:拿到工具/知识库返回结果,作为观察输入下一轮思考
    循环往复直到任务全部完成,输出最终答案。
    优势:实现简单、天然适配Function Calling;缺点:复杂多步骤任务容易跳步、漏任务。
  • Plan阶段:模型一次性输出完整任务清单(结构化JSON子任务列表),包含任务类型、执行顺序、依赖关系
  • Solve阶段:程序按顺序逐个执行子任务,缓存每个子任务结果,全部完成后统一汇总
    优势:任务清晰可控,便于监控、断点续跑、失败重试;缺点:一次性规划消耗更多Token,复杂依赖场景规划易出错。
  • 1.3 子任务类型分类(统一抽象)

    统一封装三类任务,一套调度器兼容所有任务:

  • calc:数学计算工具调用(复用Day2计算器)
  • rag_search:知识库检索任务(复用Day3 RAG)
  • llm_summary:纯文本推理总结任务(无需外部工具)
  • 无依赖任务:可并行执行(多个独立RAG查询)
  • 强依赖任务:必须等待前置子任务完成才能执行(先求和再相乘)
  • 2. 任务调度与状态管理

    pending:待执行
    running:执行中
    success:执行成功
    failed:执行失败(支持重试)
    finished:全部完成
    
  • 任务缓存:存储每个子任务ID、类型、入参、执行结果、状态
  • 重试机制:单个子任务失败最多重试2次,仍失败标记任务异常
  • 执行顺序控制:区分串行依赖、并行独立任务
  • 终止条件:所有子任务success,或达到最大规划轮次强制汇总
  • 3. 规划Agent上下文与Token优化

  • 规划阶段仅传入用户原始问题,不携带冗余历史,减少规划开销
  • 每个子任务执行结果精简压缩,避免大量文本累积超限
  • 设置最大规划轮次(默认5轮),防止无限循环拆解任务
  • 4. 完整全能Agent链路(Day1~Day4全能力整合)

    用户复杂提问
    → Plan:模型拆解结构化子任务列表
    → 调度器循环执行每个子任务
    - 子任务=计算:调用Function Calling计算器
    - 子任务=知识库查询:执行RAG检索
    - 子任务=文本推理:直接LLM生成
    → 缓存所有子任务执行结果
    → LLM汇总全部子任务输出,生成最终完整回答

  • 掌握ReAct与Plan-Solve两种Agent推理框架区别与适用场景
  • 定义标准化子任务JSON Schema,强制模型输出任务清单
  • 实现通用任务调度器,支持任务状态、重试、串行执行
  • 整合LLM、RAG、Function Calling、任务规划一体化Agent
  • 处理规划异常:任务格式错乱、子任务重复、依赖顺序错误
  • 三、今日难点 & 解决方案

    难点1:模型拆解任务格式混乱,无法解析子任务列表

  • 使用Pydantic定义任务列表Schema,Prompt强制输出纯JSON
  • temperature设为0,消除随机性
  • 正则提取JSON、解析失败自动重新规划一次
  • Few-shot给出标准任务拆解示例
  • 难点2:子任务执行失败导致整体流程中断

  • 单个任务捕获全部异常,标记failed,记录错误信息继续执行剩余任务
  • 配置单任务最大重试次数,重试失败后在最终汇总中提示异常
  • 汇总阶段告知用户哪些任务执行失败,给出失败原因
  • 难点3:模型无限拆解、产生大量冗余子任务

  • 全局限制最大规划轮次,到达上限停止拆解直接汇总已有结果
  • Prompt约束:无需拆分的简单问题直接回答,禁止多余子任务
  • 任务去重:调度器过滤重复类型、重复入参的子任务
  • 难点4:多子任务结果过长,Token超限

  • 每个子任务执行后自动精简输出文本,剔除换行、冗余描述
  • 汇总前做滑动窗口裁剪,只保留关键任务结果
  • 四、完整练习代码(基于Day1/2/3扩展)

    沿用前几日所有依赖:aiohttp、pydantic、faiss-cpu、numpy、fastapi、uvicorn,最后总结提示词有bug需要提示词里加前置任务的结果

    1. 任务规划核心模块 task_planner.py

    import asyncio
    import re
    import json
    from pydantic import BaseModel, Field
    from typing import List, Dict, Any, Optional
    # 复用已有能力
    from llm_client_v2 import AsyncLLMClientV2, TOOLS, CalcToolParams
    from rag_store import RAGService

    # ========== 1. 子任务结构化Schema ==========
    class SubTask(BaseModel):
    task_id: str = Field(description="任务唯一id,如t1/t2")
    task_type: str = Field(description="任务类型:calc/rag_search/llm_summary")
    content: str = Field(description="任务执行入参,计算填表达式,rag填查询词")
    rely_task_ids: List[str] = Field(default=[], description="依赖前置任务id,无依赖为空")

    class TaskPlan(BaseModel):
    task_list: List[SubTask] = Field(description="完整子任务列表")

    # ========== 2. 任务执行缓存与调度器 ==========


    🔗 原文链接: 点击阅读原文

    标签: AI 人工智能 技术博客
    最后更新:2026年6月20日

    daozi

    这个人很懒,什么都没留下

    点赞
    < 上一篇

    文章评论

    您需要 登录 之后才可以评论
    搜索
    联系方式

    QQ群:179730949
    QQ群:114559024
    欢迎您加入Android大家庭
    本人QQ:136049925

    赐我一丝安慰
    给我一点鼓励

    COPYRIGHT © 2023 魅力程序猿. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    豫ICP备15000477号