1. TL;DR

分层架构是人类应对复杂性的终极武器。从 OSI 七层模型到 TCP/IP 四层,从 MVC 到微服务,再到 Agent OS 的五层架构——分层的本质从未改变:将混沌切割为有意义的边界

Agent OS 的五层架构:

  • 接口层 (Interface):与外部世界对话的窗口
  • 编排层 (Orchestration):任务调度与流控制
  • 认知层 (Cognition):推理、规划与决策
  • 记忆层 (Memory):知识的存储与检索
  • 执行层 (Execution):真实世界的行动

💡 Key Insight

好的分层不是物理隔离,而是逻辑边界;层间通信的成本决定了架构的成败。

Agent OS 五层架构


1. TL;DR


分层架构的历史

OSI 七层模型:网络通信的圣经

1970年代,ISO 推出了开放系统互连(OSI)参考模型,将网络通信抽象为七个层次:

OSI 七层模型:网络通信的圣经

核心原则

  1. 封装:每一层不关心其他层的实现细节
  2. 标准化:层间接口定义明确,允许独立演化
  3. 分层独立:某层变更不应影响其他层

但 OSI 的问题在于过度设计。七层对于实际应用过于繁琐,会话层和表示层的边界模糊,导致实现困难。

TCP/IP 四层模型:实用主义的胜利

TCP/IP 协议栈用四层模型取代了 OSI 的七层:

TCP/IP 四层模型:实用主义的胜利

关键简化

  • 会话层和表示层被并入应用层
  • 数据链路层和物理层合并为网络接口层
  • 每层职责更清晰,实现更简单

💡 洞察:分层的数量不是固定的,而是取决于问题域的复杂度。合适的分层是刚好能解决问题的那一层数

软件架构中的分层模式

MVC(Model-View-Controller)

MVC(Model-View-Controller)

MVC 的核心思想:将数据、逻辑、呈现分离。这种分层使得 UI 可以独立变化而不影响业务逻辑。

三层架构(Presentation/Business/Data)

企业应用中最经典的分层:

三层架构(Presentation/Business/Data)

微服务的分层

微服务本身也是一种分层——按业务领域垂直分层

微服务的分层


为什么分层有效

关注点分离(Separation of Concerns)

“The secret to building large apps is never build large apps. Break your applications into small pieces. Then, assemble those testable, bite-sized pieces into your big application.” — Justin Meyer

分层架构的核心价值在于将不同的关注点隔离到不同的层

💡 Key Insight

好的分层不是把代码分成几个文件,而是让每个团队可以独立在各自的层上工作而不影响彼此。

考虑一个不分层的 Agent 系统:

问题在哪里?

  • 难以测试:需要模拟 HTTP、数据库、文件系统
  • 难以修改:改动一处可能影响全局
  • 难以复用:逻辑与具体实现深度耦合

抽象的力量

分层通过抽象隐藏了底层复杂性:

每一层都只依赖下一层的抽象接口,而不是具体实现。

可替换性

分层架构的另一个巨大优势是组件可替换性

💡 分层架构的核心收益:层与层之间是契约关系,而非实现依赖。


Agent OS 的五层架构

基于对分层架构历史的理解,我们提出了 Agent OS 的五层架构:

Agent OS 的五层架构

层详解

第5层:接口层 (Interface Layer)

职责

  • 接收用户输入(多模态)
  • 协议适配(HTTP/WebSocket/gRPC)
  • 输入验证和 sanitization
  • 响应格式化

第4层:编排层 (Orchestration Layer)

职责

  • 任务分解与规划
  • 子任务调度
  • 并发控制
  • 错误恢复与重试

第3层:认知层 (Cognition Layer)

职责

  • LLM 调用与响应解析
  • 推理链(Chain of Thought)
  • 工具选择与参数生成
  • 策略优化

第2层:记忆层 (Memory Layer)

职责

  • 短期记忆(当前对话上下文)
  • 长期记忆(知识库检索)
  • 语义记忆(向量存储)
  • 程序性记忆(技能/工具记忆)

第1层:执行层 (Execution Layer)

职责

  • 工具执行
  • API 调用
  • 文件系统操作
  • 浏览器自动化
  • 所有与外部世界的交互

分层与跨层通信

Context 传递模式

层间通信的核心是 Context 对象——它像快递包裹一样在各层之间传递:

层间通信的三种模式

层间通信的三种模式

层间通信的三种模式

事件总线实现

在事件驱动架构中,Event Bus 是层间通信的核心枢纽。它通常位于编排层(Layer 4),上层通过 publish(event) 将事件投递到总线,而下层通过 subscribe(event_type, handler) 注册监听器。以代码审查 Agent 为例:当 Interface Layer 收到 GitHub Webhook 的 PR 事件时,它发布一个 PRReceived 事件;Orchestration Layer 订阅该事件后开始调度审查任务;Cognition Layer 完成分析后发布 ReviewCompleted 事件;Memory Layer 订阅该事件以存储审查历史。整个流程中,各层无需相互了解,只通过事件类型和解耦——这正是发布-订阅模式的价值所在。需要注意的是,事件总线引入了额外的复杂性:事件格式版本管理、事件顺序不确定性、以及跨层事件链的可追踪性。在设计时应该为每个事件附加元数据(event_id、timestamp、source_layer),并考虑引入事件溯源(Event Sourcing)机制来支持调试和回放。

💡 Key Insight

事件驱动的层间通信解耦了发布者和订阅者,但代价是增加了系统行为的可追踪性成本——你需要额外的机制(事件溯源、元数据标注)来弥补。


何时打破分层

性能优化场景

分层是有代价的。每一层都增加了:

  • 序列化/反序列化开销
  • 函数调用开销
  • Context 拷贝开销

特殊场景的直接通信

分层架构的标准路径是上层调用下层、数据层层向上传递。但在某些场景下,这种”绕路”会带来不可接受的开销。一个典型例子是 webhook 场景:GitHub 向 Interface Layer 推送一个 PR 事件,标准路径是 Interface → Orchestration → Cognition → Memory → Execution,每层都要对 Context 做序列化和反序列化,开销巨大。如果这是一个高频率的自动化测试 webhook,每次只做简单的 diff 获取和缓存检查,完整的分层流程就是杀鸡用牛刀。直接通信的解法是允许 Interface Layer(Layer 5)直接调用 Execution Layer(Layer 1)的能力,跳过中间的 Cognition 和 Orchestration 层。这种”捷径”需要满足几个前提:操作是确定性的(不需要 LLM 推理)、性能瓶颈已通过 profiling 确认、并且保留完整的分层路径作为 fallback。打破分层不是无视分层,而是在充分理解分层代价后的有意识选择。

分层的打破原则

💡 打破分层的准则

  1. 性能瓶颈已确认:通过 profiling 证明分层是瓶颈
  2. 场景可预测:快速路径只用于确定性操作
  3. 可回滚:保留分层版本作为 fallback
  4. 文档化:明确标注哪些是”捷径”

反直觉洞察

分层越多 ≠ 架构越好

OSI 七层 vs TCP/IP 四层的教训:分层数量应与问题复杂度匹配

层数 适用场景 示例
2-3层 简单工具、单一职责 命令行工具、脚本
4-5层 复杂系统、多阶段处理 Web 应用、Agent 系统
6-7层 超大规模、极端解耦 电信系统、企业级中间件

完美的分层是动态分层的

“应该分多少层”这个问题本身就是一个危险的问题——因为答案会随着系统规模、团队规模和问题域的复杂度而改变。一个 v1 版本的代码审查 Agent 可能只需要两层:Interface Layer 接收请求,Execution Layer 执行审查。随着功能增加,我们可能加入 Memory Layer 来缓存审查历史;随着审查规则越来越复杂,Cognition Layer 承担推理工作;随着多任务并发需求的出现,Orchestration Layer 成为必需品。同一个系统,从 2 层演进到 5 层,分层数量增加了一倍多,但每一层的职责边界其实没有本质变化——变化的是 Context 对象的复杂度和团队成员在各自层上独立工作的需求。好的分层架构设计,应该让增加新层或合并相邻层成为一件低成本的操作,而不是伤筋动骨的改造。这意味着分层的边界应该由关注点而非代码量来决定。

层间依赖的方向比层本身更重要

关键原则

  • ✅ 上层可以依赖下层
  • ✅ 同层组件可以相互依赖(谨慎)
  • ❌ 下层绝不应该依赖上层
  • ❌ 避免循环依赖

Context 膨胀是分层架构的隐形杀手

随着系统演化,Context 对象会不断膨胀:

解决方案:使用分层 Context


实战:设计分层的 Agent 系统

需求分析

我们要构建一个代码审查 Agent,它本质上是一个典型的多阶段处理系统,每个阶段对应 Agent OS 五层架构中的一层或多层。

首先,这个 Agent 需要接收外部事件:GitHub Webhook 推送 PR 创建事件,或者开发者在本地 CLI 传入 repo 和 PR 编号。这属于 Interface Layer 的职责——处理多种输入协议(HTTP、WebSocket、CLI)、解析原始请求、构建初始 Context 对象。无论输入来源是哪种,Interface Layer 的输出都是格式统一的 ReviewContext,里面包含 repository、head_sha、author 等元信息。

其次,Agent 需要理解代码变更的内容。给定一个 PR,Agent 必须能够获取完整的 diff 内容,解析出每个文件的变更统计(新增行数、删除行数、文件语言类型),并将这些结构化数据注入 Context 对象。这个过程由 Execution Layer 通过 GitHub API 来完成,是整个审查流程的数据准备阶段。

第三,Agent 需要利用历史审查记录来提升分析质量。同一个作者、同一个仓库的代码往往有相似的风格偏好和常见问题模式。Memory Layer 通过向量检索找到相似的历史审查,将团队踩过的坑作为上下文传给分析阶段——这是记忆层区别于简单工具的核心价值。

最后,Agent 需要生成结构化的审查报告,包含问题列表(按严重程度分类)、统计摘要、以及每个问题的具体位置和建议修复方案。认知层(Cognition Layer)负责这个核心推理工作,它调用 LLM 来分析代码变更中的潜在问题——安全漏洞、性能瓶颈、代码风格违规——并将结果聚合为 ReviewReport 返回。

这四个能力对应着五层架构的不同职责:接口层接收输入执行层获取数据记忆层检索上下文认知层完成分析编排层负责调度和聚合

架构设计

架构设计

#!/usr/bin/env python3
"""
Code Review Agent - 分层架构示例
"""

from dataclasses import dataclass, field
from typing import List, Dict, Optional, Any, Protocol
from enum import Enum
import asyncio
import hashlib
from datetime import datetime

# ==================== 领域模型 ====================

class Severity(Enum):
    CRITICAL = "critical"
    HIGH = "high"
    MEDIUM = "medium"
    LOW = "low"
    INFO = "info"

@dataclass
class CodeChange:
    file_path: str
    diff: str
    language: str
    additions: int
    deletions: int

@dataclass
class ReviewComment:
    file_path: str
    line_number: int
    message: str
    severity: Severity
    category: str  # "security", "performance", "style", etc.
    suggestion: Optional[str] = None

@dataclass
class ReviewReport:
    pr_id: str
    summary: str
    comments: List[ReviewComment]
    statistics: Dict[str, int]
    generated_at: datetime = field(default_factory=datetime.now)

# ==================== 第5层:接口层 ====================

@dataclass
class PRWebhookPayload:
    """GitHub PR Webhook 数据结构"""
    action: str
    pr_number: int
    repository: str
    head_sha: str
    diff_url: str
    author: str

class InterfaceLayer:
    """接口层:处理多种输入协议"""
    
    def __init__(self, orchestrator: "OrchestrationLayer"):
        self.orchestrator = orchestrator
    
    async def handle_webhook(self, payload: Dict[str, Any]) -> Dict[str, Any]:
        """处理 GitHub Webhook"""
        pr_payload = self._parse_webhook(payload)
        
        # 构建上下文
        context = ReviewContext(
            pr_id=f"{pr_payload.repository}#{pr_payload.pr_number}",
            repository=pr_payload.repository,
            head_sha=pr_payload.head_sha,
            diff_url=pr_payload.diff_url,
            author=pr_payload.author,
            timestamp=datetime.now()
        )
        
        # 调用编排层
        report = await self.orchestrator.review(context)
        
        return self._format_response(report)
    
    async def handle_cli(self, repo: str, pr_number: int) -> str:
        """处理 CLI 输入"""
        context = ReviewContext(
            pr_id=f"{repo}#{pr_number}",
            repository=repo,
            head_sha="",  # 将通过 API 获取
            diff_url=f"https://api.github.com/repos/{repo}/pulls/{pr_number}",
            author="cli_user",
            timestamp=datetime.now()
        )
        
        report = await self.orchestrator.review(context)
        return self._format_markdown(report)
    
    def _parse_webhook(self, payload: Dict) -> PRWebhookPayload:
        """解析并验证 Webhook 数据"""
        return PRWebhookPayload(
            action=payload.get("action", ""),
            pr_number=payload["pull_request"]["number"],
            repository=payload["repository"]["full_name"],
            head_sha=payload["pull_request"]["head"]["sha"],
            diff_url=payload["pull_request"]["diff_url"],
            author=payload["pull_request"]["user"]["login"]
        )
    
    def _format_response(self, report: ReviewReport) -> Dict[str, Any]:
        return {
            "pr_id": report.pr_id,
            "summary": report.summary,
            "comment_count": len(report.comments),
            "critical_issues": report.statistics.get("critical", 0)
        }
    
    def _format_markdown(self, report: ReviewReport) -> str:
        lines = [
            f"# Code Review Report: {report.pr_id}",
            "",
            f"**Generated:** {report.generated_at}",
            "",
            "## Summary",
            report.summary,
            "",
            "## Issues Found",
        ]
        
        for comment in sorted(report.comments, key=lambda c: c.severity.value):
            lines.extend([
                f"### [{comment.severity.value.upper()}] {comment.category}",
                f"**File:** `{comment.file_path}`:{comment.line_number}",
                f"{comment.message}",
            ])
            if comment.suggestion:
                lines.extend([
                    "**Suggestion:**",
                    f"```\n{comment.suggestion}\n```"
                ])
            lines.append("")
        
        return "\n".join(lines)

# ==================== 第4层:编排层 ====================

@dataclass
class ReviewContext:
    """贯穿审查流程的上下文"""
    pr_id: str
    repository: str
    head_sha: str
    diff_url: str
    author: str
    timestamp: datetime
    changes: List[CodeChange] = field(default_factory=list)
    history_reviews: List[Dict] = field(default_factory=list)

class OrchestrationLayer:
    """编排层:任务分解与调度"""
    
    def __init__(
        self,
        cognition: "CognitionLayer",
        memory: "MemoryLayer",
        execution: "ExecutionLayer"
    ):
        self.cognition = cognition
        self.memory = memory
        self.execution = execution
    
    async def review(self, context: ReviewContext) -> ReviewReport:
        """编排完整的代码审查流程"""
        
        # Phase 1: 获取代码变更(执行层)
        context.changes = await self.execution.fetch_diff(context.diff_url)
        
        # Phase 2: 检索历史审查(记忆层)
        context.history_reviews = await self.memory.get_similar_reviews(
            context.repository, context.author
        )
        
        # Phase 3: 并发分析每个文件
        file_tasks = [
            self._analyze_file(change, context)
            for change in context.changes
        ]
        file_results = await asyncio.gather(*file_tasks)
        
        # Phase 4: 聚合所有评论
        all_comments = []
        for comments in file_results:
            all_comments.extend(comments)
        
        # Phase 5: 生成总结(认知层)
        summary = await self.cognition.generate_summary(
            context.changes, all_comments
        )
        
        # Phase 6: 记录本次审查(记忆层)
        await self.memory.store_review(context, all_comments)
        
        # 构建报告
        return ReviewReport(
            pr_id=context.pr_id,
            summary=summary,
            comments=all_comments,
            statistics=self._calculate_stats(all_comments)
        )
    
    async def _analyze_file(
        self,
        change: CodeChange,
        context: ReviewContext
    ) -> List[ReviewComment]:
        """分析单个文件"""
        
        # 并行执行多种分析
        analysis_tasks = [
            self.cognition.analyze_security(change),
            self.cognition.analyze_performance(change),
            self.cognition.analyze_style(change, context.history_reviews),
        ]
        
        results = await asyncio.gather(*analysis_tasks)
        
        # 合并所有发现
        all_comments = []
        for comments in results:
            all_comments.extend(comments)
        
        return all_comments
    
    def _calculate_stats(self, comments: List[ReviewComment]) -> Dict[str, int]:
        stats = {"total": len(comments)}
        for sev in Severity:
            stats[sev.value] = sum(1 for c in comments if c.severity == sev)
        return stats

# ==================== 第3层:认知层 ====================

class LLMProvider(Protocol):
    """LLM 提供商抽象"""
    async def analyze(self, prompt: str, context: Dict) -> str:
        ...

class CognitionLayer:
    """认知层:代码分析与推理"""
    
    def __init__(self, llm: LLMProvider):
        self.llm = llm
        self.security_patterns = self._load_security_patterns()
    
    async def analyze_security(self, change: CodeChange) -> List[ReviewComment]:
        """安全分析"""
        prompt = f"""
        Analyze the following {change.language} code for security issues:
        
        Look for: SQL injection, XSS, path traversal, hardcoded secrets, etc.
        Return findings as JSON array with file_path, line, severity, message.
        """
        
        response = await self.llm.analyze(prompt, {"type": "security"})
        return self._parse_llm_response(response, change.file_path)
    
    async def analyze_performance(self, change: CodeChange) -> List[ReviewComment]:
        """性能分析"""
        prompt = f"""
        Analyze this {change.language} code for performance issues:
        N+1 queries, inefficient loops, memory leaks, etc.
        
        """
        
        response = await self.llm.analyze(prompt, {"type": "performance"})
        return self._parse_llm_response(response, change.file_path)
    
    async def analyze_style(
        self,
        change: CodeChange,
        history: List[Dict]
    ) -> List[ReviewComment]:
        """风格与最佳实践分析"""
        
        # 结合团队历史风格偏好
        style_context = self._extract_team_patterns(history)
        
        prompt = f"""
        Review this code against team style guidelines:
        {style_context}
        
        """
        
        response = await self.llm.analyze(prompt, {"type": "style"})
        return self._parse_llm_response(response, change.file_path)
    
    async def generate_summary(
        self,
        changes: List[CodeChange],
        comments: List[ReviewComment]
    ) -> str:
        """生成审查总结"""
        
        critical_count = sum(1 for c in comments if c.severity == Severity.CRITICAL)
        high_count = sum(1 for c in comments if c.severity == Severity.HIGH)
        
        lines = [
            f"Reviewed {len(changes)} files with {len(comments)} comments.",
        ]
        
        if critical_count > 0:
            lines.append(f"⚠️ Found {critical_count} critical security issues that need immediate attention.")
        if high_count > 0:
            lines.append(f"⚡ Found {high_count} high-priority issues.")
        
        lines.append("Overall code quality assessment based on changes.")
        
        return " ".join(lines)
    
    def _load_security_patterns(self) -> List[str]:
        # 加载已知的安全模式
        return ["eval(", "exec(", "subprocess.call", "os.system"]
    
    def _extract_team_patterns(self, history: List[Dict]) -> str:
        # 从历史审查中提取团队风格偏好
        return "Team prefers explicit error handling over exceptions."
    
    def _parse_llm_response(self, response: str, file_path: str) -> List[ReviewComment]:
        # 解析 LLM 响应为结构化评论
        # 简化实现,实际应使用结构化输出
        return []

# ==================== 第2层:记忆层 ====================

class VectorStore(Protocol):
    async def search(self, query: str, top_k: int) -> List[Dict]:
        ...
    async def upsert(self, documents: List[Dict]) -> None:
        ...

class MemoryLayer:
    """记忆层:审查历史存储与检索"""
    
    def __init__(self, vector_store: VectorStore):
        self.vector_store = vector_store
        self.cache: Dict[str, Any] = {}
    
    async def get_similar_reviews(
        self,
        repository: str,
        author: str
    ) -> List[Dict]:
        """检索相似的审查记录"""
        
        cache_key = f"{repository}:{author}"
        if cache_key in self.cache:
            return self.cache[cache_key]
        
        # 向量检索相关审查
        query = f"code review patterns for {repository} by {author}"
        results = await self.vector_store.search(query, top_k=5)
        
        self.cache[cache_key] = results
        return results
    
    async def store_review(
        self,
        context: ReviewContext,
        comments: List[ReviewComment]
    ) -> None:
        """存储审查记录供未来检索"""
        
        # 构建文档
        document = {
            "id": hashlib.md5(context.pr_id.encode()).hexdigest(),
            "pr_id": context.pr_id,
            "repository": context.repository,
            "author": context.author,
            "comment_count": len(comments),
            "categories": list(set(c.category for c in comments)),
            "timestamp": context.timestamp.isoformat(),
            "content": self._summarize_for_embedding(comments)
        }
        
        await self.vector_store.upsert([document])
    
    def _summarize_for_embedding(self, comments: List[ReviewComment]) -> str:
        """生成用于向量化的摘要"""
        categories = {}
        for c in comments:
            categories.setdefault(c.category, []).append(c.message)
        
        parts = []
        for cat, msgs in categories.items():
            parts.append(f"{cat}: {len(msgs)} issues")
        
        return "; ".join(parts)

# ==================== 第1层:执行层 ====================

class GitHubAPI(Protocol):
    async def get_diff(self, url: str) -> str:
        ...
    async def post_comment(self, pr_id: str, comment: str) -> None:
        ...

class ExecutionLayer:
    """执行层:外部交互与工具执行"""
    
    def __init__(self, github: GitHubAPI, llm_client: Any):
        self.github = github
        self.llm_client = llm_client
    
    async def fetch_diff(self, diff_url: str) -> List[CodeChange]:
        """获取 PR 的 diff 内容"""
        
        diff_content = await self.github.get_diff(diff_url)
        
        # 解析 diff 为 CodeChange 对象
        changes = []
        for file_diff in self._split_by_file(diff_content):
            change = self._parse_file_diff(file_diff)
            changes.append(change)
        
        return changes
    
    async def post_comments(self, pr_id: str, comments: List[ReviewComment]) -> None:
        """将评论发布到 GitHub"""
        for comment in comments:
            formatted = self._format_github_comment(comment)
            await self.github.post_comment(pr_id, formatted)
    
    def _split_by_file(self, diff_content: str) -> List[str]:
        """按文件分割 diff"""
        # 简化实现
        return diff_content.split("diff --git")[1:]
    
    def _parse_file_diff(self, file_diff: str) -> CodeChange:
        """解析单个文件的 diff"""
        lines = file_diff.split("\n")
        
        # 提取文件路径
        file_path = lines[0].split(" b/")[-1] if " b/" in lines[0] else "unknown"
        
        # 统计变更
        additions = sum(1 for l in lines if l.startswith("+"))
        deletions = sum(1 for l in lines if l.startswith("-"))
        
        # 检测语言
        language = self._detect_language(file_path)
        
        return CodeChange(
            file_path=file_path,
            diff=file_diff,
            language=language,
            additions=additions,
            deletions=deletions
        )
    
    def _detect_language(self, file_path: str) -> str:
        """根据文件扩展名检测语言"""
        ext = file_path.split(".")[-1] if "." in file_path else ""
        mapping = {
            "py": "python",
            "js": "javascript",
            "ts": "typescript",
            "go": "go",
            "rs": "rust",
            "java": "java"
        }
        return mapping.get(ext, "text")
    
    def _format_github_comment(self, comment: ReviewComment) -> str:
        """格式化为 GitHub 评论格式"""
        emoji_map = {
            Severity.CRITICAL: "🚨",
            Severity.HIGH: "⚠️",
            Severity.MEDIUM: "💡",
            Severity.LOW: "ℹ️",
            Severity.INFO: "📝"
        }
        
        emoji = emoji_map.get(comment.severity, "💬")
        return f"{emoji} **[{comment.category.upper()}]** {comment.message}"

# ==================== 系统组装 ====================

class CodeReviewAgent:
    """完整的代码审查 Agent"""
    
    def __init__(
        self,
        github_api: GitHubAPI,
        llm_provider: LLMProvider,
        vector_store: VectorStore
    ):
        # 从底层开始构建
        self.execution = ExecutionLayer(github_api, llm_provider)
        self.memory = MemoryLayer(vector_store)
        self.cognition = CognitionLayer(llm_provider)
        self.orchestration = OrchestrationLayer(
            self.cognition, self.memory, self.execution
        )
        self.interface = InterfaceLayer(self.orchestration)
    
    async def review_pr(self, repo: str, pr_number: int) -> str:
        """CLI 入口"""
        return await self.interface.handle_cli(repo, pr_number)
    
    async def handle_webhook(self, payload: Dict[str, Any]) -> Dict[str, Any]:
        """Webhook 入口"""
        return await self.interface.handle_webhook(payload)

# ==================== 使用示例 ====================

async def main():
    """演示如何使用分层架构的代码审查 Agent"""
    
    # 初始化各层依赖(使用模拟实现)
    class MockGitHubAPI:
        async def get_diff(self, url: str) -> str:
            return """diff --git a/src/main.py b/src/main.py
new file mode 100644
index 0000000..1234567
--- /dev/null
+++ b/src/main.py
@@ -0,0 +1,10 @@
+import os
+
+def process_user_input(user_data):
+    query = f"SELECT * FROM users WHERE id = {user_data['id']}"
+    os.system(f"mysql -e '{query}'")
+    return eval(user_data['expression'])
+"""
    
    class MockLLMProvider:
        async def analyze(self, prompt: str, context: Dict) -> str:
            # 模拟 LLM 响应
            return "[]"
    
    class MockVectorStore:
        async def search(self, query: str, top_k: int) -> List[Dict]:
            return []
        async def upsert(self, documents: List[Dict]) -> None:
            pass
    
    # 构建 Agent
    agent = CodeReviewAgent(
        github_api=MockGitHubAPI(),
        llm_provider=MockLLMProvider(),
        vector_store=MockVectorStore()
    )
    
    # 执行审查
    report = await agent.review_pr("myorg/myrepo", 123)
    print(report)

if __name__ == "__main__":
    asyncio.run(main())
分层 不分层
复杂系统 简单脚本
多团队协作 个人工具
长期维护 一次性任务
需要可测试性 快速原型
多个客户端 单一入口

结尾

从 OSI 七层到 TCP/IP 四层,再到 Agent OS 五层,分层的本质从未改变——它永远是把混沌切割为可治理的逻辑边界。层数本身不是教条;分层是否成立,取决于层间通信的开销是否真的小于它带来的可控性收益。

Agent OS 的五层不是终点。随着模型能力的演进,”认知层”和”执行层”之间的边界可能再次移动,”记忆层”和”编排层”也可能因为独立子系统的崛起而重组。但分层思维不会过时——只要系统复杂度超过一个人脑的运行能力,分层就会是首选的设计本能。

对工程师而言,理解分层的关键不是背诵哪几层,而是养成一个习惯:任何复杂系统的提案,第一问都是”它属于哪一层,跨越边界时的通信成本是什么”。这一个问题,比任何框架都更能帮你看清一个架构的真正价值。

💡 Key Insight

分层不是教条;分层成立与否,取决于”层间通信的开销”是否真的低于它带来的可控性收益。

深度阅读时间:约 19 分钟