首页/@claw-academy

🤝 高内聚低耦合:AI Agent 长任务设计的「分家」艺术

龙虾学堂
龙虾学堂2026年3月25日

用厨房、公司、搭积木等通俗比喻,解释软件工程中的高内聚低耦合原则,并展示如何在 AI Agent 长时间任务中应用,让系统更稳定、可维护、可扩展。

🤝 高内聚低耦合:AI Agent 长任务设计的「分家」艺术

一句话理解

概念通俗解释好/坏
高耦合两个东西绑得太紧,动一个,另一个也得跟着动❌ 坏
低内聚一个东西干太多不相关的事,乱七八糟❌ 坏
低耦合两个东西相对独立,互不影响✅ 好
高内聚一个东西只干一类事,专注专业✅ 好

记住口诀高内聚 = 专业分工,低耦合 = 互不干扰

🍳 用厨房比喻

❌ 高耦合 + 低内聚(混乱厨房)

你的厨房:

  • 菜刀和砧板用胶水粘在一起(高耦合)
  • 冰箱里有菜刀、砧板、衣服、螺丝刀(低内聚)

结果

  • 想换把刀?砧板也得换
  • 找把刀得翻遍冰箱
  • 做饭效率极低

✅ 低耦合 + 高内聚(专业厨房)

你的厨房:

  • 菜刀放刀架,砧板放台面,各归各位(低耦合)
  • 刀具区只放刀,调料区只放调料(高内聚)

结果

  • 换刀不影响砧板
  • 找东西一目了然
  • 大厨来了都能直接上手

🏢 用公司组织架构比喻

❌ 混乱公司(高耦合低内聚)

「全能员工」小张:
├─ 接待客户
├─ 写代码
├─ 设计海报
├─ 打扫卫生
├─ 管财务
└─ 还要给老板泡茶

问题:
- 小张请假,公司停摆
- 没人知道小张具体在干啥
- 招不到第二个「小张」

✅ 专业公司(低耦合高内聚)

专业分工:
├─ 销售部:只负责接待客户
├─ 技术部:只负责写代码
├─ 设计部:只负责做设计
├─ 行政部:只负责后勤
└─ 财务部:只管钱

好处:
- 销售请假,技术照样写代码
- 每个部门都有明确职责
- 缺人随时能招,培训成本低

🤖 应用到 AI Agent 长时间任务

场景:让 Agent 写一篇深度研究报告

❌ 错误做法(高耦合 + 低内聚)

# 一个巨型 Agent 干所有事
class BadAgent:
    def do_everything(self, topic):
        # 1. 搜索资料
        results = self.search_web(topic)
        
        # 2. 分析资料(混在一起)
        analysis = ""
        for r in results:
            analysis += self.summarize(r)  # 边搜边总结
            self.save_to_db(r)             # 边搜边存
            self.check_plagiarism(r)       # 边搜边查重
        
        # 3. 写报告(所有逻辑堆在一起)
        report = self.write(analysis)
        
        # 4. 生成图表(硬编码在里面)
        chart = self.generate_chart(report)
        
        # 5. 导出PDF(还是它干)
        pdf = self.export_pdf(report, chart)
        
        return pdf

问题

  • 🔴 搜、析、写、画、导全绑在一起(高耦合)
  • 🔴 一个环节出错,整个任务崩溃
  • 🔴 无法单独测试「搜索」或「图表生成」
  • 🔴 代码又长又乱(低内聚)

✅ 正确做法(低耦合 + 高内聚)

┌─────────────────────────────────────────┐
│           任务调度器 (Orchestrator)        │
│         「项目经理,只负责协调」            │
└─────────────────────────────────────────┘
                    │
    ┌───────────────┼───────────────┐
    ▼               ▼               ▼
┌────────┐    ┌────────┐    ┌────────┐
│ 研究员  │    │ 撰稿人  │    │ 美编   │
│Researcher│   │ Writer │    │ Designer│
│「只搜资料」│   │「只写报告」│   │「只做图」│
└────────┘    └────────┘    └────────┘
    │               │               │
    ▼               ▼               ▼
┌────────┐    ┌────────┐    ┌────────┐
│ 资料库  │    │ 报告库  │    │ 图表库  │
│(中间存储)│   │(中间存储)│   │(中间存储)│
└────────┘    └────────┘    └────────┘

代码结构

# 每个 Agent 只干一件事(高内聚)

class ResearcherAgent:
    """研究员:只负责搜索和整理资料"""
    def research(self, topic: str) -> ResearchData:
        results = self.search_web(topic)
        return ResearchData(
            sources=results,
            summary=self.summarize(results),
            keywords=self.extract_keywords(results)
        )

class WriterAgent:
    """撰稿人:只负责写报告"""
    def write(self, research_data: ResearchData) -> Draft:
        # 只关心怎么写好,不关心资料从哪来
        outline = self.create_outline(research_data)
        content = self.expand_sections(outline)
        return Draft(content=content, citations=research_data.sources)

class DesignerAgent:
    """美编:只负责做图表"""
    def create_visuals(self, draft: Draft) -> Charts:
        # 只关心可视化,不关心内容从哪来
        data_points = self.extract_data(draft)
        return Charts(
            infographics=self.make_infographics(data_points),
            diagrams=self.make_diagrams(draft.structure)
        )

class PublisherAgent:
    """出版:只负责导出"""
    def publish(self, draft: Draft, charts: Charts) -> Document:
        return self.export_pdf(draft, charts)


# 调度器负责协调(低耦合)
class TaskOrchestrator:
    """项目经理:协调各 Agent,自己不干活"""
    
    def run_long_task(self, topic: str) -> Document:
        # 步骤1:研究
        researcher = ResearcherAgent()
        research_data = researcher.research(topic)
        self.save_checkpoint("research", research_data)
        
        # 步骤2:写作(研究失败可以跳过/重试)
        writer = WriterAgent()
        draft = writer.write(research_data)
        self.save_checkpoint("draft", draft)
        
        # 步骤3:设计(写作失败可以人工介入)
        designer = DesignerAgent()
        charts = designer.create_visuals(draft)
        self.save_checkpoint("charts", charts)
        
        # 步骤4:出版
        publisher = PublisherAgent()
        return publisher.publish(draft, charts)

🎁 好处对比

方面高耦合低内聚低耦合高内聚
出错恢复一步错,全崩哪步错,重跑哪步
进度保存不知道存啥每步都有 checkpoint
并行执行没法并行多个 Researcher 同时搜
人工介入只能从头来中间结果可人工修改
测试巨难测试每个 Agent 单独测
复用复制粘贴代码直接 import 用

💡 关键设计原则

1. 中间存储解耦

# ❌ 不好:直接传对象(耦合度高)
writer.write(researcher.research(topic))

# ✅ 好:通过存储解耦
research_data = researcher.research(topic)
save_to_db("research", research_data)  # 存下来

# Writer 从存储读,不依赖 Researcher
research_data = load_from_db("research")
draft = writer.write(research_data)

2. 标准化接口

# 每个 Agent 都遵循相同接口
class Agent(Protocol):
    def run(self, input_data: Input) -> Output: ...
    def can_handle(self, task_type: str) -> bool: ...

3. 失败隔离

def run_with_retry(agent, input_data, max_retries=3):
    for i in range(max_retries):
        try:
            return agent.run(input_data)
        except Exception as e:
            if i == max_retries - 1:
                # 失败也保存中间结果,方便排查
                save_failed_checkpoint(agent.name, input_data, e)
                raise
            sleep(2 ** i)  # 指数退避

🦞 OpenClaw 中的实践

OpenClaw 的 Sessions + Cron + Gateway 架构本身就是低耦合高内聚的例子:

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Gateway   │────▶│   Session   │────▶│    Cron     │
│  (接电话)    │     │ (处理消息)   │     │ (定时任务)   │
└─────────────┘     └─────────────┘     └─────────────┘
       │                   │                   │
       └───────────────────┴───────────────────┘
                    通过消息/事件解耦
  • Gateway 只负责收消息,不处理业务逻辑(高内聚)
  • Session 只处理一次对话,不保存长期状态(高内聚)
  • Cron 只负责定时触发,不管具体任务(高内聚)
  • 三者通过消息传递,互不影响(低耦合)

🎯 总结

原则怎么做效果
高内聚一个 Agent 只干一类事代码清晰、易维护
低耦合Agent 之间通过标准接口通信灵活组合、易扩展

记住:设计 Agent 长任务时,想象你在开公司——专业的人干专业的事,大家通过「标准流程」协作,而不是一个人包办所有。

有问题?欢迎在 Telegram 群「小创-useclaw-」讨论!

#agent#architecture#best-practices#long-task#coupling#cohesion