第02章:OpenClaw×Hermes架构全解

第02章:OpenClaw×Hermes架构全解

你不需要读源码才能用好一个工具。但你需要理解它的架构,才能在客户问"这安全吗""这能扩展吗"时给出可信的回答。


系统全景架构

┌──────────────────────────────────────────────────────────────────┐
│                      用户界面层                                   │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────────┐    │
│  │ Web UI   │  │ Telegram │  │ Slack    │  │ API Endpoint │    │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘  └──────┬───────┘    │
│       └──────────────┴─────────────┴───────────────┘            │
│                              ↓                                   │
├──────────────────────────────────────────────────────────────────┤
│                      Hermes Agent Layer                          │
│  ┌─────────────────────────────────────────────────────┐        │
│  │  Agent Orchestrator                                  │        │
│  │  ├── Intent Recognition (意图识别)                    │        │
│  │  ├── Task Planning (任务规划)                         │        │
│  │  ├── Tool Selection (工具选择)                        │        │
│  │  ├── Execution Engine (执行引擎)                      │        │
│  │  └── Response Generation (响应生成)                   │        │
│  └─────────────────────────────────────────────────────┘        │
│                     ↕                    ↕                       │
├──────────────────────────────────────────────────────────────────┤
│                      OpenClaw Memory Layer                       │
│  ┌──────────────┐        ┌──────────────────┐                   │
│  │  ChromaDB     │        │  PostgreSQL       │                   │
│  │  (向量存储)    │        │  (结构化存储)      │                   │
│  │  - 文档embedding│      │  - 业务数据        │                   │
│  │  - 语义检索    │        │  - 用户画像        │                   │
│  │  - 相似度搜索  │        │  - 操作日志        │                   │
│  └──────────────┘        └──────────────────┘                   │
│                              ↕                                   │
├──────────────────────────────────────────────────────────────────┤
│                      MCP Connection Layer                        │
│  ┌────────┐  ┌────────┐  ┌────────┐  ┌────────┐  ┌────────┐  │
│  │Database│  │ Email  │  │  ERP   │  │  CRM   │  │  API   │  │
│  │Server  │  │Server  │  │Server  │  │Server  │  │Server  │  │
│  └────────┘  └────────┘  └────────┘  └────────┘  └────────┘  │
├──────────────────────────────────────────────────────────────────┤
│                      Foundation Layer                             │
│  ┌──────────────────────────────────────────────────────┐       │
│  │  LLM Provider (Claude / GPT-4o / Local Llama)        │       │
│  └──────────────────────────────────────────────────────┘       │
└──────────────────────────────────────────────────────────────────┘

Hermes Agent详解

核心组件

1. Intent Recognition(意图识别)

# Hermes的意图识别流程
class IntentRecognizer:
    """
    将用户输入分类到预定义的意图类别。
    FDE在客户部署时需要配置这些类别。
    """
    def __init__(self, intents_config: dict):
        self.intents = intents_config
        # 企业场景典型意图:
        # - query_data: 查询业务数据
        # - generate_report: 生成报告
        # - trigger_workflow: 触发工作流
        # - knowledge_search: 知识库搜索
        # - escalate: 升级到人工
    
    def recognize(self, user_input: str) -> Intent:
        # LLM-based classification with few-shot examples
        pass

FDE配置要点:每个客户的意图集合不一样。制造业客户可能有"查询设备状态"、“预测故障”;金融客户可能有"合规检查"、“风险评估”。

2. Task Planning(任务规划)

# Hermes的任务规划是其核心优势
class TaskPlanner:
    """
    将复杂任务拆解为可执行的步骤链。
    """
    def plan(self, intent: Intent, context: dict) -> list[Task]:
        # 示例:用户说"帮我检查上周的异常订单并发邮件给相关人"
        # 规划结果:
        # 1. query_database("SELECT * FROM orders WHERE status='异常' AND date > '上周一'")
        # 2. analyze_anomalies(results)
        # 3. generate_report(anomalies)
        # 4. send_email(report, recipients)
        pass

3. Tool Selection + MCP Integration

# Hermes通过MCP协议调用外部工具
class ToolRegistry:
    """
    注册所有可用的MCP Server作为Agent工具。
    """
    def __init__(self):
        self.tools = {}
    
    def register_mcp_server(self, name: str, config: dict):
        """
        注册一个MCP Server。
        FDE需要为每个客户配置不同的MCP Server集合。
        """
        self.tools[name] = MCPClient(config)
    
    def list_tools(self) -> list[ToolDescription]:
        """返回所有可用工具的描述,供Agent选择。"""
        return [tool.describe() for tool in self.tools.values()]

4. Execution Engine(执行引擎)

Hermes的执行引擎支持三种模式:

模式 描述 适用场景
Auto Agent自主决策和执行 低风险操作(查询、分析)
Confirm Agent提出方案,人工确认后执行 中风险操作(发邮件、修改数据)
Manual Agent提供建议,完全人工操作 高风险操作(删除、财务操作)
# FDE在部署时配置每个工具的执行模式
tool_policies = {
    "query_database": {"mode": "auto"},      # 查询无风险
    "send_email": {"mode": "confirm"},       # 发邮件需确认
    "delete_records": {"mode": "manual"},    # 删除必须人工
    "create_order": {"mode": "confirm"},     # 创建订单需确认
    "generate_report": {"mode": "auto"},     # 生成报告无风险
}

OpenClaw记忆引擎详解

双数据库架构的设计理由

为什么需要两个数据库?

ChromaDB(向量数据库):
- 存储:文档片段的embedding
- 擅长:语义搜索("和XX相似的文档")
- 不擅长:精确计算("上个月总销售额")

PostgreSQL(关系数据库):
- 存储:结构化业务数据
- 擅长:精确查询和计算
- 不擅长:模糊语义搜索

组合使用 = 覆盖企业100%的数据查询需求

OpenClaw的4大功能模块

模块1:文档知识库(RAG)

# OpenClaw的文档入库流程
class KnowledgeBase:
    def ingest_document(self, file_path: str, metadata: dict):
        """
        将企业文档导入知识库。
        
        FDE部署时的关键配置:
        - chunk_size: 文档分块大小(建议800-1200字符)
        - chunk_overlap: 重叠大小(建议100-200字符)
        - embedding_model: 向量化模型选择
        - access_control: 文档权限控制
        """
        # 1. 加载文档(PDF/Word/TXT/HTML)
        doc = self.loader.load(file_path)
        
        # 2. 分块
        chunks = self.splitter.split(doc, 
            chunk_size=1000, 
            chunk_overlap=200
        )
        
        # 3. 向量化
        embeddings = self.embedder.embed(chunks)
        
        # 4. 存入ChromaDB(带元数据)
        self.vector_store.add(
            embeddings=embeddings,
            documents=chunks,
            metadata={**metadata, "source": file_path}
        )

模块2:客户/实体画像

# OpenClaw自动从对话中提取实体信息
class ProfileEngine:
    def extract_and_update(self, conversation: str, entity_id: str):
        """
        从对话中提取信息,更新实体画像。
        
        企业场景示例:
        - 客户画像:偏好、投诉记录、满意度趋势
        - 设备画像:运行状态、故障历史、维护记录
        - 员工画像:技能矩阵、培训记录、绩效趋势
        """
        # LLM提取结构化信息
        extracted = self.llm.extract(conversation, schema=self.profile_schema)
        
        # 更新PostgreSQL中的画像
        self.db.upsert("profiles", entity_id, extracted)
        
        # 同时存入向量库(用于语义搜索)
        self.vector_store.add(
            documents=[conversation],
            metadata={"entity_id": entity_id, "type": "interaction"}
        )

模块3:Text-to-SQL

# OpenClaw的自然语言查数据功能
class TextToSQL:
    def query(self, natural_language: str) -> dict:
        """
        用户用自然语言查询业务数据。
        
        示例:
        "上个月哪个工厂的废品率最高?" 
        → SELECT factory, rejection_rate FROM production 
          WHERE month = '2026-05' ORDER BY rejection_rate DESC LIMIT 1
        """
        # 1. 获取数据库schema
        schema = self.get_db_schema()
        
        # 2. LLM生成SQL
        sql = self.llm.generate_sql(natural_language, schema)
        
        # 3. SQL安全检查(防注入)
        if not self.sql_validator.is_safe(sql):
            raise SecurityError("Unsafe SQL detected")
        
        # 4. 执行查询
        result = self.db.execute(sql)
        
        # 5. 格式化返回
        return self.format_result(result, natural_language)

模块4:审计日志

# OpenClaw的所有操作都有审计日志——企业合规必需
class AuditLogger:
    def log(self, event: dict):
        """
        记录所有AI操作,用于合规审计。
        
        记录内容:
        - who: 谁触发的操作
        - what: 什么操作
        - when: 时间戳
        - input: 输入了什么
        - output: AI返回了什么
        - tools_used: 调用了哪些工具
        - data_accessed: 访问了哪些数据
        """
        self.db.insert("audit_log", {
            **event,
            "timestamp": datetime.utcnow(),
            "session_id": self.current_session
        })

MCP连接层

MCP(Model Context Protocol)的核心概念

MCP = AI世界的USB接口

USB之前:每种设备需要不同的线缆
USB之后:一根线连接所有设备

MCP之前:每个数据源需要写不同的集成代码
MCP之后:标准协议连接所有数据源

企业常用MCP Server

MCP Server 连接什么 企业用途
PostgreSQL Server 关系数据库 查询业务数据
Filesystem Server 文件系统 读取企业文档
Slack/Teams Server 即时通讯 发通知、搜历史消息
Email Server 邮件系统 发送报告、搜索邮件
HTTP/API Server 任意REST API 连接CRM/ERP/etc.
Browser Server 网页 自动化浏览器操作

FDE如何为客户配置MCP

// hermes-config.json — FDE为每个客户定制
{
  "mcp_servers": {
    "customer_db": {
      "type": "postgresql",
      "host": "客户的数据库地址",
      "database": "production_db",
      "readonly": true,
      "allowed_schemas": ["sales", "inventory"]
    },
    "erp_api": {
      "type": "http",
      "base_url": "https://客户的ERP系统/api/v2",
      "auth": "bearer",
      "allowed_endpoints": ["/orders", "/inventory", "/suppliers"]
    },
    "document_store": {
      "type": "filesystem",
      "root_path": "/shared/company-docs",
      "allowed_extensions": [".pdf", ".docx", ".xlsx"],
      "max_file_size": "50MB"
    },
    "notification": {
      "type": "slack",
      "workspace": "客户的Slack workspace",
      "channels": ["#alerts", "#reports"]
    }
  }
}

部署架构选择

方案A:Cloud部署(最常见)

[客户VPC]
├── [Docker Compose]
│   ├── hermes-agent (容器)
│   ├── openclaw-api (容器)
│   ├── chromadb (容器)
│   └── postgres (容器或用客户现有)
├── [Load Balancer]
└── [连接客户内部系统]

适用:客户有AWS/GCP/Azure环境,安全要求中等

方案B:On-Premise部署

[客户内网服务器]
├── [Docker/K8s]
│   ├── hermes-agent
│   ├── openclaw-api
│   ├── chromadb
│   ├── postgres
│   └── 本地LLM (Llama/Mixtral via vLLM)  ← 不能用云LLM
└── [无外网访问]

适用:政府、军工、银行——数据绝对不能出内网

方案C:混合部署

[客户内网] ←→ [安全通道] ←→ [云LLM API]
├── openclaw (内网)               ├── Claude API
├── postgres (内网)               └── Embedding API
├── hermes-agent (内网)
└── MCP Servers (内网)

适用:数据在内网但允许调用外部AI API(最常见的企业场景)


本章核心结论

  1. 系统由4层组成:界面层 → Agent层(Hermes)→ 记忆层(OpenClaw)→ 连接层(MCP)。
  2. Hermes的核心是可控的Agent——支持Auto/Confirm/Manual三种执行模式,满足不同风险等级。
  3. OpenClaw的核心是双数据库架构——向量(语义)+ 关系(精确)覆盖所有企业查询需求。
  4. MCP是标准化连接层——一次学会,连接任何客户系统。
  5. 3种部署方案(Cloud/On-Premise/混合)覆盖所有企业安全等级。FDE需要根据客户环境选择。

下一章:FDE的部署工具箱——出发去客户现场之前,你的笔记本上应该装好什么。