跳到正文
Joeplover
AI Agent·2026-06-03·约 5 分钟阅读

growing_agent:AI Agent 成长框架

一个让 AI Agent 能够自我进化的框架,通过持续学习和反馈闭环来提升 Agent 的能力边界。

AI 大脑

项目背景

growing_agent 是一个探索性的 AI Agent 框架,核心理念是让 Agent 具备"成长"能力——不仅仅是执行任务,而是能从每次交互中学习并改进。传统的 Agent 是静态的:给它一个固定的 Prompt 和工具集,它按固定的流程执行任务,完成任务后不会"变聪明"。growing_agent 尝试打破这个限制,让 Agent 像人一样积累经验、形成策略、逐步提升能力。

这个项目的灵感来源于"元学习"(Meta-Learning)和"经验回放"(Experience Replay)的概念——让 Agent 在执行任务后对过程进行反思,提取有用的策略和经验,存储到经验库中,在未来的类似任务中参考和应用。

技术选型

组件选择理由
核心语言Python 3.11类型注解支持好,生态丰富
AI 引擎OpenAI GPT API / LangChain多种 LLM 后端接入
图编排LangGraph有状态的 Agent 图编排
数据持久化SQLite / JSON 文件轻量级经验存储
PPT 生成ppt_agent(内置模块)自动生成演示文稿
Web 界面内置 Web UI实验监控和日志查看

架构设计

growing_agent 的核心架构围绕"感知-推理-行动-反思"循环构建:

用户输入
  → 感知层(理解用户意图)
  → 推理层(分析当前状态,参考历史经验)
  → 行动层(选择并执行工具)
  → 反思层(总结经验,更新策略库)
  → 输出结果

模块结构:

  • ppt_agent/ — PPT 自动生成的 Agent 模块,包含 graph(图编排)、nodes(节点定义)、services(服务调用)
  • ppt_creator/ — PPT 内容创建工具
  • web/ — Web 管理界面
  • docs/ — 架构文档和流程图

核心实现

Agent 成长循环

Agent 在每次任务执行后,会进行"经验提取"——分析哪些策略有效、哪些无效,将有效策略存入经验库:

class GrowingAgent:
    def __init__(self, llm, experience_store):
        self.llm = llm
        self.experience_store = experience_store
        self.state = AgentState()

    async def run(self, task: str) -> str:
        # Step 1: 检索相关经验
        relevant_experiences = self.experience_store.query(task, top_k=5)

        # Step 2: 构建增强 Prompt(含历史经验)
        enhanced_prompt = self.build_prompt(task, relevant_experiences)

        # Step 3: 执行任务
        result = await self.llm.generate(enhanced_prompt)

        # Step 4: 反思与经验提取
        experience = await self.extract_experience(task, enhanced_prompt, result)

        # Step 5: 存储经验
        if experience["usefulness"] > 0.7:
            self.experience_store.save(experience)

        return result

    async def extract_experience(self, task: str, prompt: str,
                                  result: str) -> dict:
        """让 LLM 分析本次执行的经验"""
        analysis_prompt = f"""
        请分析以下任务执行过程,提取可复用的经验。
        任务:{task}
        结果:{result}

        请评估:
        1. 本次任务中哪些策略/方法有效?
        2. 哪些地方可以改进?
        3. 给未来的自己一条最有用的建议。
        4. 整体有用性评分(0-1)。
        """
        analysis = await self.llm.generate(analysis_prompt)
        # 解析分析结果,提取为结构化经验
        return self.parse_experience(analysis)

基于 LangGraph 的状态图编排

PPT Agent 模块使用 LangGraph 编排了一个多步骤的创作流程:

# ppt_agent/graph.py
from langgraph.graph import StateGraph, END

class PPTAgentState(TypedDict):
    user_request: str
    design_spec: Optional[dict]
    slides_content: list[dict]
    current_slide_index: int
    feedback: Optional[str]
    final_output: Optional[str]

def build_ppt_agent() -> StateGraph:
    graph = StateGraph(PPTAgentState)

    # 定义节点
    graph.add_node("analyze_request", analyze_user_request)
    graph.add_node("generate_design_spec", generate_design_spec)
    graph.add_node("create_slides", create_slides)
    graph.add_node("review_slides", review_slides)
    graph.add_node("refine_slide", refine_slide)
    graph.add_node("finalize", finalize_ppt)

    # 定义边
    graph.set_entry_point("analyze_request")
    graph.add_edge("analyze_request", "generate_design_spec")
    graph.add_edge("generate_design_spec", "create_slides")
    graph.add_edge("create_slides", "review_slides")

    # 条件分支:Review 不通过则进入修改循环
    graph.add_conditional_edges(
        "review_slides",
        lambda state: "accept" if state["feedback"] is None else "refine",
        {"accept": "finalize", "refine": "refine_slide"}
    )
    graph.add_edge("refine_slide", "review_slides")
    graph.add_edge("finalize", END)

    return graph.compile()

经验存储与检索

class ExperienceStore:
    def __init__(self, storage_path: str = "experiences.json"):
        self.storage_path = storage_path
        self.experiences = self._load()

    def save(self, experience: dict):
        experience["id"] = str(uuid.uuid4())
        experience["timestamp"] = datetime.now().isoformat()
        self.experiences.append(experience)
        self._persist()

    def query(self, task_description: str, top_k: int = 5) -> list[dict]:
        # 简单的关键词匹配检索
        keywords = self._extract_keywords(task_description)
        scored = []
        for exp in self.experiences:
            score = self._similarity_score(keywords, exp.get("tags", []))
            scored.append((score, exp))
        scored.sort(key=lambda x: x[0], reverse=True)
        return [exp for _, exp in scored[:top_k]]

踩坑记录

1. 经验质量难以保证
让 LLM 自评"经验有用性"存在主观偏差——模型倾向于认为自己的输出是有用的。解决方案:加入人工验证环节,经验需要达到一定使用次数和正面反馈阈值才能进入核心经验库。

2. 经验爆炸
随着运行次数增加,经验库快速膨胀,检索效率下降。解决方案:实现经验的"遗忘机制"——低使用率和低评分的经验自动归档,定期压缩合并相似经验。

3. Prompt 长度膨胀
每次查询都带上 Top-5 经验,加上系统 Prompt 和任务描述,Token 消耗快速增长。解决方案:对经验做摘要压缩,只在必要时附上完整经验。

4. 状态图调试困难
LangGraph 的图编排在复杂节点间调试比较困难,尤其是条件分支多的时候。解决方案:每个节点加入详细的输入输出日志,并开发了一个可视化日志查看器。

总结

growing_agent 目前还是一个实验性项目,但它提出了一个有趣的问题:Agent 能不能越用越聪明?传统的 Agent 是确定性的——同样的输入总是得到同样的输出。而 growing_agent 尝试让 Agent 在每次执行后"变强一点"。

核心成果是验证了"经验回放"在 LLM Agent 中的可行性——通过结构化的经验提取和检索,Agent 确实能在后续类似任务中表现出更好的效果。但挑战也很明显:经验质量的控制、经验库的管理、以及 Token 成本的控制都是需要继续攻克的难题。

这个项目让我对 Agent 系统的设计有了更深的理解——Agent 的能力不仅取决于底层的 LLM,更取决于围绕它的架构设计:如何感知环境、如何调用工具、如何积累经验。这些都是 Agent 系统从"能用"走向"好用"的关键因素。