第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(最常见的企业场景)
本章核心结论
- 系统由4层组成:界面层 → Agent层(Hermes)→ 记忆层(OpenClaw)→ 连接层(MCP)。
- Hermes的核心是可控的Agent——支持Auto/Confirm/Manual三种执行模式,满足不同风险等级。
- OpenClaw的核心是双数据库架构——向量(语义)+ 关系(精确)覆盖所有企业查询需求。
- MCP是标准化连接层——一次学会,连接任何客户系统。
- 3种部署方案(Cloud/On-Premise/混合)覆盖所有企业安全等级。FDE需要根据客户环境选择。
下一章:FDE的部署工具箱——出发去客户现场之前,你的笔记本上应该装好什么。