growing_agent:AI Agent 成长框架
一个让 AI Agent 能够自我进化的框架,通过持续学习和反馈闭环来提升 Agent 的能力边界。
项目背景
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 系统从"能用"走向"好用"的关键因素。