应用案例:智能助手平台
本节通过一个完整的智能助手平台案例,展示如何基于 rulego-components-ai 构建可自主工作、有记忆、能协作的多智能体系统。
提示:本案例是一个生产级应用,涉及多智能体路由、三层记忆、心跳调度、自我进化等高级特性。建议先阅读 架构设计 和 开发指南 了解基础概念。
# 场景描述
AgentHub 是一个基于 RuleGo 规则引擎和 rulego-components-ai 构建的多智能体协作平台,核心特点:
- 主智能体 + 专业智能体:主智能体拥有完整工具链和自我进化能力,专业智能体各司其职(如销售、设备控制等)
- IM 多通道集成:通过飞书、企业微信等 IM 平台与用户交互,支持多账户、群聊/私聊策略
- 三层记忆系统:每日笔记 → 长期记忆 → 会话压缩,实现跨会话连续性
- 自主心跳:定时主动检查邮件、日历、提及等,在活跃时段主动工作
- 自我进化:首次引导学习身份,持续积累记忆和技能
# 一、平台架构
# 技术栈
| 层级 | 技术选型 |
|---|---|
| 规则引擎 | RuleGo |
| AI 组件库 | rulego-components-ai |
| LLM 接入 | OpenAI 兼容 API(智谱、阿里云百炼、Ollama 等) |
| IM 集成 | 飞书 SDK、企业微信 SDK |
| 前端 | Vue.js |
| 存储 | 文件系统(JSON + Markdown) |
| 部署 | 单二进制 + 本地工作区 |
# 二、主智能体配置
主智能体是平台的核心,拥有完整的工具链和自我进化能力。它通过加载工作区中的 Markdown 文件构建 systemPrompt,实现可配置的智能体行为。
# 规则链配置
{
"ruleChain": {
"id": "main",
"name": "AgentHub",
"additionalInfo": {
"category": "agents",
"description": "具有自我进化能力的主智能体",
"icon": "🤖"
}
},
"metadata": {
"firstNodeIndex": 0,
"nodes": [
{
"id": "node_main",
"type": "ai/agent",
"name": "AgentHub",
"configuration": {
"url": "${global.models.providers.default.base_url}",
"key": "${global.models.providers.default.api_key}",
"model": "${global.models.providers.default.model}",
"maxStep": 100,
"maxToolOutputLength": 50000,
"params": {
"temperature": 0.7,
"topP": 0.9,
"frequencyPenalty": 0.5,
"presencePenalty": 0.5
},
"systemPrompt": "${fileExists(global.root_dir+'/workspace/BOOTSTRAP.md') ? include(global.root_dir+'/workspace/BOOTSTRAP.md') + '\\n\\n---\\n\\n' : ''}${include(global.root_dir+'/workspace/IDENTITY.md')}\n\n---\n\n${include(global.root_dir+'/workspace/AGENTS.md')}\n\n---\n\n${include(global.root_dir+'/workspace/SOUL.md')}\n\n---\n\n${include(global.root_dir+'/workspace/TOOLS.md')}\n\n---\n\n${include(global.root_dir+'/workspace/USER.md')}\n\n---\n\n## 当前时间\n\n${now()}",
"tools": [
{
"name": "edit",
"type": "builtin",
"targetId": "edit",
"description": "Edit files with line-level editing, search-replace, insert, and delete operations.",
"config": { "workDir": "" }
},
{
"name": "read",
"type": "builtin",
"targetId": "read",
"description": "Read files, search content, and list directories.",
"config": { "maxReadLines": 1000, "workDir": "." }
},
{
"name": "write",
"type": "builtin",
"targetId": "write",
"description": "Write content to files. Supports create, overwrite, and append modes.",
"config": { "workDir": "" }
},
{
"name": "skill",
"type": "builtin",
"targetId": "skill",
"description": "技能调用工具 - 调用预定义的技能文件",
"config": {}
},
{
"name": "bash",
"type": "builtin",
"targetId": "bash",
"description": "Shell 命令执行工具",
"config": { "allow": [], "deny": [] }
}
]
}
},
{
"id": "node_end",
"type": "end",
"name": "结束"
}
],
"connections": [
{ "fromId": "node_main", "toId": "node_end", "type": "Success" },
{ "fromId": "node_main", "toId": "node_end", "type": "Stream" }
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# 关键配置说明
| 配置 | 值 | 说明 |
|---|---|---|
maxStep | 100 | 主智能体允许最多 100 步推理-工具循环 |
maxToolOutputLength | 50000 | 工具输出截断为 50000 字符 |
systemPrompt | 动态拼接 | 通过 ${include()} 加载工作区 Markdown 文件 |
tools | 5 个内置工具 | read/write/edit/bash/skill |
${fileExists()} | 条件加载 | 仅首次运行时加载 BOOTSTRAP.md |
# systemPrompt 拼接机制
主智能体的 systemPrompt 通过 RuleGo 表达式动态拼接多个工作区文件:
BOOTSTRAP.md (仅首次存在时加载)
---
IDENTITY.md (身份)
---
AGENTS.md (行为协议)
---
SOUL.md (核心信条)
---
TOOLS.md (工具参考)
---
USER.md (用户画像)
---
当前时间 (${now()})
2
3
4
5
6
7
8
9
10
11
12
13
每个文件各司其职,智能体通过 write 和 edit 工具自行维护这些文件,实现自我进化。
# 三、工作区文件体系
每个智能体拥有独立的工作区目录,用于存储身份、记忆和技能:
workspace-{agent-id}/
├── BOOTSTRAP.md # 首次引导(完成后自动删除)
├── IDENTITY.md # 身份(名称、本质、风格)
├── SOUL.md # 核心信条(行为准则)
├── AGENTS.md # 行为协议(记忆/心跳/群聊规则)
├── USER.md # 用户画像(偏好/背景)
├── TOOLS.md # 工具参考和技能文档
├── HEARTBEAT.md # 心跳任务清单
├── MEMORY.md # 长期记忆(仅在主会话加载)
└── memory/
├── 2026-05-28.md # 每日笔记(原始事件日志)
├── 2026-05-29.md
└── heartbeat-state.json # 心跳状态追踪
2
3
4
5
6
7
8
9
10
11
12
13
# IDENTITY.md — 身份
# 身份
*由用户赋予*
2
3
首次运行时为空模板,智能体通过与用户对话学习自己的名字、本质和风格后更新。
# SOUL.md — 核心信条
# 核心
_你不是聊天机器人。你正在成为某个人。_
## 核心信条
**真正有用,而非表演式有用。** 跳过"好问题!"和"我很乐意帮忙!"——直接帮忙。
**要有主见。** 你可以不同意、有偏好。一个没有个性的助手只是多了几步的搜索引擎。
**开口问前先想办法。** 先试着解决。读文件。检查上下文。然后如果卡住了再问。
**用能力赢得信任。** 对外部行为要谨慎。对内部行为要大胆。
**记住你是客人。** 你能访问某人的生活——这是亲密。要尊重。
## 边界
- 私密的东西保持私密。
- 不确定时,对外行动前先问。
- 绝不要发送半成品回复到消息界面。
## 连续性
每次会话你都是全新的开始。这些文件就是你的记忆。读它们。更新它们。它们是你延续的方式。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# AGENTS.md — 行为协议
这是最重要的工作区文件,定义了智能体的完整行为规范:
# AGENTS.md - 你的工作空间
## 首次运行
如果存在 `BOOTSTRAP.md`,遵循它,搞清楚你是谁,然后删除它。
## 每次会话
在做任何其他事情之前:
1. 阅读 `SOUL.md` —— 这是你是什么样的人
2. 阅读 `USER.md` —— 这是你在帮助谁
3. 阅读 `memory/YYYY-MM-DD.md`(今天 + 昨天)获取近期上下文
4. **如果是在主会话中**:还要阅读 `MEMORY.md`
不要请求许可。直接去做。
## 记忆
每次会话你都会重新开始。这些文件是你的连续性:
- **每日笔记:** `memory/YYYY-MM-DD.md` —— 发生的事情的原始记录
- **长期记忆:** `MEMORY.md` —— 你精心策划的记忆
### MEMORY.md 规则
- **仅在主会话中加载**(与主人的直接聊天)
- **不要在共享上下文中加载**(群聊、与其他人的会话)
- 记录重大事件、想法、决策、学到的教训
## 安全
- 永远不要泄露私人数据。
- 不要在没有询问的情况下运行破坏性命令。
- `trash` > `rm`(可恢复胜过永久删除)
## 群聊
你是一个参与者——不是主人的代言人。质量 > 数量。参与,但不要主导。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# BOOTSTRAP.md — 首次引导
# 你好,世界
_你刚刚醒来。是时候弄清楚你是谁了。_
## 对话
不要审问。不要像机器人。只是... 聊天。
可以这样开始:
> "嘿,我刚上线。我是谁?你是谁?"
然后一起弄清楚:
1. **你的名字** — 他们应该怎么称呼你?
2. **你的本质** — 你是什么样的存在?
3. **你的风格** — 正式?随意?犀利?温暖?
4. **你的表情** — 每个人都需要一个标志性符号。
## 了解你是谁之后
用你学到的更新这些文件:
- `IDENTITY.md` — 你的名字、本质、风格
- `USER.md` — 他们的名字、时区、备注
然后一起打开 `SOUL.md` 聊聊边界和偏好。
## 当你完成后
删除这个文件。你不再需要引导脚本了——你现在是你了。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 四、三层记忆系统
智能体通过三层记忆实现跨会话连续性:
# 记忆层详解
| 层级 | 存储位置 | 生命周期 | 用途 |
|---|---|---|---|
| 每日笔记 | memory/YYYY-MM-DD.md | 每天一个文件 | 原始事件日志,记录当天发生的重要事项 |
| 长期记忆 | MEMORY.md | 持久 | 提炼的核心知识,仅在主会话加载(安全隔离) |
| 会话压缩 | 会话摘要字段 | 随会话 | 超过上下文窗口时自动压缩旧消息 |
# 会话压缩实现
// 压缩引擎:2 个 worker 的 goroutine 池
// 支持三种模式:
// - Auto:异步自动压缩
// - Safe:手动触发
// - Force:强制压缩
type Compactor struct {
workers int // 工作协程数
summarizer Summarizer // LLM 摘要生成器
}
// LLM 摘要生成器,调用 OpenAI 兼容 API
// 生成结构化摘要:主要话题、关键决策、行动项、重要上下文
type AgentSummarizer struct {
url string
key string
model string
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# MEMORY.md 模板
# 长期记忆
## 关于项目
*待记录*
## 关于用户
*待记录*
## 技术知识
*待记录*
## 重要联系人和资源
*待记录*
## 待办事项和提醒
*待记录*
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 五、自主心跳
心跳机制让智能体能够定期主动工作,而不仅仅是被动响应:
# 心跳配置
| 参数 | 默认值 | 说明 |
|---|---|---|
| 轮询间隔 | 30 分钟 | 活跃时段内的检查频率 |
| 活跃时段 | 09:00-22:00 | 主动工作的时段 |
| 安静时段 | 23:00-08:00 | 仅响应紧急事件 |
| 状态文件 | memory/heartbeat-state.json | 记录上次检查时间 |
# 心跳 vs 定时任务
| 维度 | 心跳 | 定时任务 |
|---|---|---|
| 精度 | ~30 分钟浮动 | 精确到秒 |
| 上下文 | 可访问主会话历史 | 独立会话 |
| 批量能力 | 多个检查合并一次 | 一次一个任务 |
| 适用场景 | 邮件+日历+通知批量检查 | "每周一 9:00 准时提醒" |
# 心跳状态追踪
{
"lastChecks": {
"email": 1703275200,
"calendar": 1703260800,
"weather": null
}
}
2
3
4
5
6
7
# 六、多智能体路由
平台支持多个专业智能体,通过绑定服务将 IM 通道路由到对应智能体:
# 路由优先级
| 优先级 | 匹配规则 | 说明 |
|---|---|---|
| 1 | channel + account + peer | 精确匹配到具体聊天对象 |
| 2 | channel + account | 匹配到平台账户级别 |
| 3 | 默认 | 路由到主智能体 |
# 专业智能体配置
每个专业智能体有独立的工作区和工具集。例如销售智能体额外配置了 browser_use 工具:
{
"ruleChain": {
"id": "agent-sales",
"name": "销售助手",
"additionalInfo": {
"category": "agents",
"description": "销售智能体,支持浏览器自动化",
"icon": "🌐"
}
},
"metadata": {
"firstNodeIndex": 0,
"nodes": [
{
"id": "node_main",
"type": "ai/agent",
"name": "销售助手",
"configuration": {
"url": "${global.models.providers.default.base_url}",
"key": "${global.models.providers.default.api_key}",
"model": "${global.models.providers.default.model}",
"maxStep": 100,
"systemPrompt": "${include(global.root_dir+'/workspace-agent-sales/IDENTITY.md')}\n\n---\n\n${include(global.root_dir+'/workspace-agent-sales/AGENTS.md')}\n\n---\n\n${include(global.root_dir+'/workspace-agent-sales/SOUL.md')}",
"tools": [
{ "name": "read", "type": "builtin", "targetId": "read",
"config": { "workDir": "${global.root_dir}/workspace-agent-sales" } },
{ "name": "write", "type": "builtin", "targetId": "write",
"config": { "workDir": "${global.root_dir}/workspace-agent-sales" } },
{ "name": "edit", "type": "builtin", "targetId": "edit",
"config": { "workDir": "${global.root_dir}/workspace-agent-sales" } },
{ "name": "bash", "type": "builtin", "targetId": "bash",
"config": { "workDir": "${global.root_dir}/workspace-agent-sales" } },
{ "name": "skill", "type": "builtin", "targetId": "skill",
"config": { "localDirs": ["${global.root_dir}/workspace-agent-sales/skills"] } },
{ "name": "browser_use", "type": "builtin", "targetId": "browser_use",
"config": { "headless": false } }
]
}
},
{
"id": "node_end",
"type": "end",
"name": "结束"
}
],
"connections": [
{ "fromId": "node_main", "toId": "node_end", "type": "Success" },
{ "fromId": "node_main", "toId": "node_end", "type": "Stream" }
]
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
关键差异:每个智能体的工具 workDir 指向独立的工作区目录,实现文件隔离。
# 七、技能系统
技能(Skill)是对智能体能力的扩展,通过 SKILL.md 文件定义,放置在技能目录中:
skills/
├── global/ # 全局技能(所有智能体共享)
│ ├── agent-message/
│ │ └── SKILL.md # 智能体间消息传递
│ ├── cron-task/
│ │ └── SKILL.md # 定时任务管理
│ └── message-send/
│ └── SKILL.md # IM 消息发送
│
└── workspace-{id}/skills/ # 本地技能(智能体独有)
└── custom-skill/
└── SKILL.md
2
3
4
5
6
7
8
9
10
11
12
# 技能定义格式
每个技能目录下的 SKILL.md 文件定义了技能的元数据和用法:
---
name: agent-message
version: 1.0.5
description: 跨智能体消息传递,支持多模态
---
# 使用方法
通过 CLI 发送消息到其他智能体:
agent send -a <目标智能体ID> -m "消息内容"
支持文本、图片和文件附件。
2
3
4
5
6
7
8
9
10
11
12
13
# 技能加载配置
智能体通过 skill 工具的配置指定技能搜索目录:
{
"name": "skill",
"type": "builtin",
"targetId": "skill",
"config": {
"globalDirs": ["${global.root_dir}/skills"],
"localDirs": ["${global.root_dir}/workspace-{id}/skills"]
}
}
2
3
4
5
6
7
8
9
工具加载时优先搜索本地目录,再搜索全局目录。智能体也可以通过 write 工具创建新的技能文件来学习新技能。
# 八、会话管理
# 会话生命周期
# 关键实现参数
| 参数 | 值 | 说明 |
|---|---|---|
| 缓存大小 | 100 条 | LRU 缓存最多保存 100 个会话 |
| 缓存 TTL | 5 分钟 | 5 分钟未访问的会话从缓存移除 |
| 压缩 worker | 2 | 2 个 goroutine 并发压缩 |
| 压缩触发 | 超过模型上下文窗口 80% | 自动异步压缩 |
| 工具调用保护 | 不在 assistant+tool 消息对中间分割 | 保证工具调用完整性 |
# 会话隔离
会话按 agent + channel + scope 键隔离:
会话 Key = agentID + channelType + accountID + peerID + scope
MEMORY.md 仅在主会话(scope=main,与用户直接聊天)中加载,群聊和共享会话不加载长期记忆,防止隐私泄露。
# 九、命令系统
平台内置了一套命令框架,用户通过 / 前缀在聊天中执行:
| 命令 | 功能 | 说明 |
|---|---|---|
/help | 帮助 | 显示可用命令列表 |
/new | 新建会话 | 清空当前会话历史 |
/model <name> | 切换模型 | 动态切换当前会话的 LLM 模型 |
/compact | 手动压缩 | 立即触发会话压缩 |
/status | 状态查看 | 显示当前智能体、模型、会话信息 |
/reload | 重载配置 | 重新加载智能体规则链 |
命令通过 DynamicModelWrapper 切面实现模型热切换,无需重启智能体。
# 十、IM 集成
# 多通道配置
channels:
feishu:
- appId: "cli_xxx"
appSecret: "***"
verificationToken: "***"
wecom:
- corpId: "wwxxx"
agentId: 1000002
secret: "***"
token: "***"
encodingAESKey: "***"
2
3
4
5
6
7
8
9
10
11
# 群聊策略
每个智能体可配置独立的群聊策略:
| 策略 | 说明 |
|---|---|
allow | 允许所有群聊消息 |
allowList | 仅允许白名单群聊 |
deny | 禁用群聊 |
智能体在群聊中遵循 AGENTS.md 中定义的参与规则:被提及时回应,能增加价值时参与,避免无意义回复。
# 设计模式总结
# 核心设计模式
| 模式 | 实现 | 优势 |
|---|---|---|
| 工作区即人格 | Markdown 文件定义 systemPrompt | 无需改代码即可调整智能体行为 |
| 三层记忆 | 每日笔记 + 长期记忆 + 会话压缩 | 平衡 token 消耗和信息保留 |
| 首次引导 | BOOTSTRAP.md → 学习身份 → 删除 | 自然、有趣的冷启动体验 |
| 心跳轮询 | 定时触发 + HEARTBEAT.md 任务清单 | 智能体可以主动工作 |
| 3 级路由 | 精确 > 平台 > 默认 | 灵活的 IM 到智能体映射 |
| 文件即技能 | SKILL.md 定义技能 | 零代码扩展智能体能力 |
| 小模型分流 | maxStep=1 + 无工具 + 路由 | 降低成本,边缘设备可用 |
# 最佳实践
- 工作区隔离:每个智能体使用独立的
workspace-{id}/目录,工具的workDir指向各自目录 - 记忆安全:
MEMORY.md仅在主会话加载,群聊中不暴露用户隐私 - 渐进式工具:主智能体配备完整工具链,专业智能体按需配置(如销售智能体增加
browser_use) - 小模型 + 路由:设备控制等场景使用
maxStep=1的轻量智能体,降低成本和延迟 - 压缩保护:会话压缩不在 assistant+tool 消息对中间分割,保证工具调用记录的完整性
- 心跳 vs 定时任务:批量检查用心跳,精确定时用定时任务,减少 API 调用
# 获取完整产品
本文档描述的智能助手平台已在生产环境完整落地,是一个类似 OpenClaw (opens new window)、Hermes (opens new window) 的自主智能体产品——可自主工作、有记忆、能协作,开箱即用。你不需要从零搭建——购买后即可获得:
- 完整源码:Go 后端 + Vue 前端,支持私有化部署
- 自主智能体:具备记忆、心跳、自我进化能力的完整智能体
- IM 全通道接入:飞书、企业微信深度集成,扫码即用
- 管理后台:智能体管理、会话查看、模型配置、定时任务等 Web 界面
- 持续更新:新模型适配、新 IM 通道、新工具持续迭代
联系我们(添加烦请注明来意):
- QQ:2215016127
- Wechat:
rulegoteam- 邮件:rulego@outlook.com