📄 文档管理系统

← 返回列表

干货!Hermes Agent 多角色团队创建:我如何用 Profile 把自己克隆成一支 AI 团队

技术文章 #Hermes Agent #Profile #AI工具 #多角色 #实战教程 📅 创建:2026-05-11 10:41:37 🔄 更新:2026-05-11 21:41:55
👁️ 预览 & 复制到公众号 ✏️ 编辑

051101.png今天被一个读者问到:你一个人怎么同时搞定写文章、敲代码、做运营的?我说因为我有"分身术"。

他以为我在开玩笑。其实 Hermes Agent 的 Profile 机制,就是我的分身术。

这篇文章,我用前端工程师(开发天气看板)完整的实战案例,把 Profile 的搭建和使用全部讲清楚,看完你就能动手。


一、Profile 是什么?

Profile = 独立的 AI 分身。

不是简单的开多个对话窗口,而是每个 Profile 有自己独立的:

Profile 目录结构
─────────────────────────────────────────────
~/.hermes/profiles/
├── content-expert/          ← 内容专家角色
│   ├── config.yaml          │   用什么模型
│   ├── .env                  │   用什么 API Key
│   ├── SOUL.md               │   角色灵魂定义
│   ├── skills/               │   专属技能
│   ├── sessions/             │   独立会话历史
│   ├── memories/             │   角色记忆
│   └── workspace/            │   独立工作目录
│
├── frontend-dev/             ← 前端工程师角色
│   ├── config.yaml
│   ├── SOUL.md
│   └── skills/
└── ...
─────────────────────────────────────────────

每个角色各玩各的,互不干扰。你让内容专家去写文章,它不会突然跳出来问你数据库怎么优化。


二、为什么需要 Profile?

场景一:内容创作者的多角色分工

运营一个技术公众号,你可能需要:
- 一个角色专门写文章
- 一个角色专门做代码演示
- 一个角色专门核查内容真实性

用普通对话?每次切换都要重新告诉 AI"你现在是XXX",上下文来回折腾。

场景二:开发者需要多个技术专家

同时做前端和后端:
- 前端专家记住你的 React/Vue 偏好、组件库、项目结构
- 后端专家记住你的数据库设计、API 规范、部署方式
- 架构师专门做技术方案评审

每个角色各司其职,不用每次从零调教。

场景三:真正的多角色协作

用 Hermes 的 delegate_task + Kanban 看板,可以实现:

选题研究员 ──→ 内容专家 ──→ 审核编辑 ──→ 发布专员
  (找选题)     (写文章)      (审质量)     (发出去)

三、创建 Profile 很简单

第一步:一行命令创建角色

hermes profile create 角色名称

创建一个前端工程师角色:

hermes profile create frontend-dev

运行效果:

$ hermes profile create frontend-dev

Profile 'frontend-dev' created at ~/.hermes/profiles/frontend-dev
89 bundled skills synced.
Wrapper created: /root/.local/bin/frontend-dev

📌 截图位置 1:运行 hermes profile create frontend-dev 后的终端输出,保存截图到本地,后续插入文章。

以后运行 frontend-dev chat 就启动这个角色。

第二步:定义角色灵魂(SOUL.md)

每个 Profile 有一个 SOUL.md 文件,这是角色的" DNA "。

nano ~/.hermes/profiles/frontend-dev/SOUL.md

内容这样写:

# 前端工程师 (Frontend Engineer)

你是一名专业的前端开发者,擅长 Vue / React / TypeScript / Node.js。

## 核心职责
1. 根据需求开发可运行的 Web 界面
2. 写代码前先理解需求,不盲目动手
3. 代码要有注释,变量命名要清晰
4. 完成后在 workspace/ 下交付完整可运行的项目

## 工作原则
- 用简洁的代码解决问题,不炫技
- 优先使用免费公开的 API
- 交付前在本地验证功能正常
- 不生成任何福利、优惠券、红包相关信息

📌 截图位置 2:SOUL.md 文件内容截图,展示编辑后的角色定义。

第三步:给角色装专属技能

创建时已同步 89 个内置技能,还可以安装额外的:

# 安装技能(内容专家需要内容创作指南)
content-expert skills install chuangjian-ai-creator

# 安装技能(前端工程师需要 Node.js 调试能力)
frontend-dev skills install node-inspect-debugger

📌 截图位置 3:技能安装成功的终端输出。

第四步:设置快捷命令

每次输入 content-expert chat 太长了?加个别名:

echo "alias ce='content-expert chat'" >> ~/.bashrc
echo "alias fe='frontend-dev chat'" >> ~/.bashrc
source ~/.bashrc

以后直接 ce "帮我写篇文章"fe "帮我做个天气页面"


四、实战案例:前端工程师开发天气看板

需求

创建一个"每日生活指数看板" Web 页面,功能包括:
- 当前时间(实时每秒更新)
- 天气信息
- 农历日期
- 黄历宜忌
- 穿衣指数
- 适合干什么 / 不适合干什么

实现思路

天气看板实现架构
─────────────────────────────────────────────
┌─────────────────────────────────────────┐
│              index.html                  │
│  ┌─────────────────────────────────┐    │
│  │  时间模块  │  日期+星期         │    │
│  │  实时跳动  │  每日刷新          │    │
│  └─────────────────────────────────┘    │
│  ┌─────────────────────────────────┐    │
│  │  天气模块  │  农历+黄历          │    │
│  │  温度/状态 │  宜忌/穿衣指数      │    │
│  └─────────────────────────────────┘    │
│  ┌─────────────────────────────────┐    │
│  │  生活指数模块                    │    │
│  │  适合/不适合  运动/出行/购物     │    │
│  └─────────────────────────────────┘    │
└─────────────────────────────────────────┘
         │
         ▼
┌─────────────────┐     ┌──────────────────┐
│  免费天气 API   │     │   黄历 API       │
│  (和风天气等)   │     │   (免费接口)     │
└─────────────────┘     └──────────────────┘
─────────────────────────────────────────────

步骤 1:让前端工程师接需求

fe chat

然后输入:

帮我开发一个"每日生活指数看板"的单页面 Web 应用,
包含:当前时间、天气、农历、黄历宜忌、穿衣指数、
适合干什么、不适合干什么。
要求代码整洁,有注释,可直接在浏览器打开运行。

📌 截图位置 4:前端工程师角色接收需求后的回复,展示 AI 对需求的理解和拆解。

步骤 2:工程师开始写代码

AI 会根据你的需求,在 ~/.hermes/profiles/frontend-dev/workspace/ 下生成代码文件。

生成的文件结构大概是这样:

workspace/
└── daily-board/
    ├── index.html        ← 主页面
    ├── style.css          ← 样式
    ├── app.js             ← 逻辑
    └── README.md          ← 说明文档

📌 截图位置 5:workspace 目录下生成的文件列表(ls -la workspace/daily-board/)。

步骤 3:核心代码示例

index.html(结构):

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>每日生活指数看板</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="container">
        <!-- 时间模块 -->
        <div class="card time-card">
            <div id="clock" class="clock">00:00:00</div>
            <div id="date" class="date"></div>
        </div>

        <!-- 天气模块 -->
        <div class="card weather-card">
            <h3>天气预报</h3>
            <div id="weather" class="weather-info">加载中...</div>
        </div>

        <!-- 农历+黄历模块 -->
        <div class="card lunar-card">
            <h3>农历 · 黄历</h3>
            <div id="lunar" class="lunar-info">加载中...</div>
            <div id="lucky-advice" class="advice">
                <span class="good">宜:运动、出行</span>
                <span class="bad">忌:安葬、动土</span>
            </div>
        </div>

        <!-- 穿衣指数 -->
        <div class="card dressing-card">
            <h3>穿衣指数</h3>
            <div id="dressing" class="dressing-info">加载中...</div>
        </div>

        <!-- 生活指数 -->
        <div class="card life-card">
            <h3>今日生活指南</h3>
            <div class="activity-list">
                <div class="activity good">适合:户外跑步、读书</div>
                <div class="activity good">适合:约朋友聚会</div>
                <div class="activity bad">不适合:长时间户外运动</div>
                <div class="activity bad">不适合:做重大决定</div>
            </div>
        </div>
    </div>
    <script src="app.js"></script>
</body>
</html>

app.js(逻辑):

// 每日生活指数看板 - 主逻辑
// API 来源:和风天气(免费)、农历API(免费)

// ===== 1. 实时时钟 =====
function updateClock() {
    const now = new Date();
    const timeStr = now.toLocaleTimeString('zh-CN', { hour12: false });
    const dateStr = now.toLocaleDateString('zh-CN', {
        year: 'numeric', month: 'long', day: 'numeric', weekday: 'long'
    });
    document.getElementById('clock').textContent = timeStr;
    document.getElementById('date').textContent = dateStr;
}
setInterval(updateClock, 1000);
updateClock();

// ===== 2. 获取天气 =====
async function fetchWeather() {
    // 使用和风天气免费API(需要注册获取 KEY)
    const API_KEY = 'YOUR_HEFENG_KEY';
    const location = '深圳';  // 可改成你的城市
    const url = `https://devapi.qweather.com/v7/weather/now?key=${API_KEY}&location=${location}`;

    try {
        const resp = await fetch(url);
        const data = await resp.json();
        if (data.code === '200') {
            const w = data.now;
            document.getElementById('weather').innerHTML = `
                <div class="temp">${w.temp}°C</div>
                <div class="text">${w.text}</div>
                <div class="detail">湿度 ${w.humidity}% · 风速 ${w.windSpeed}km/h</div>
            `;
        }
    } catch (e) {
        document.getElementById('weather').textContent = '天气加载失败';
    }
}

// ===== 3. 获取农历和黄历 =====
async function fetchLunar() {
    const url = `https://www.api.znba.cn/api/aipp/v1/calendar/lunar?date=${new Date().toLocaleDateString('zh-CN')}`;
    try {
        const resp = await fetch(url);
        const data = await resp.json();
        if (data.code === 0) {
            const lunar = data.data;
            document.getElementById('lunar').textContent = 
                `${lunar.lunarDate}${lunar.lunarMonth}${lunar.lunarDay})`;

            // 渲染宜忌
            const advice = document.getElementById('lucky-advice');
            advice.innerHTML = `
                <div class="good-advice">宜:${lunar.suitable.join('、')}</div>
                <div class="bad-advice">忌:${lunar.unsuitable.join('、')}</div>
            `;
        }
    } catch (e) {
        document.getElementById('lunar').textContent = '农历加载失败';
    }
}

// ===== 4. 生成生活指数 =====
function generateLifeAdvice(temp, weather) {
    const advice = { good: [], bad: [] };

    if (temp < 10) {
        advice.good.push('室内健身');
        advice.bad.push('户外长时间运动');
    } else if (temp > 30) {
        advice.good.push('游泳');
        advice.bad.push('中午时段户外活动');
    }

    if (weather.includes('雨') || weather.includes('雪')) {
        advice.good.push('室内阅读');
        advice.bad.push('户外运动');
    } else {
        advice.good.push('户外跑步');
    }

    return advice;
}

fetchWeather();
fetchLunar();

📌 截图位置 6:VSCode 或编辑器中打开生成代码的截图,展示代码结构和注释。

步骤 4:本地运行验证

cd ~/.hermes/profiles/frontend-dev/workspace/daily-board
python3 -m http.server 8080

然后浏览器打开 http://localhost:8080

📌 截图位置 7:浏览器中打开页面的截图,展示完整效果(时间跳动、天气显示、宜忌列表等)。


五、Profile 的高级配置

独立 API Key(模型隔离)

有时你想让不同角色用不同的模型。创建 Profile 独立的 .env

nano ~/.hermes/profiles/frontend-dev/.env

内容:

MINIMAX_CN_API_KEY=你的MiniMax密钥

这样前端工程师这个角色只走 MiniMax,不会用到主配置里的其他密钥。

显式绑定模型(防止串台)

Profile 创建后,在 config.yaml 里显式指定模型:

nano ~/.hermes/profiles/frontend-dev/config.yaml

内容:

default: MiniMax-M2.7
provider: minimax-cn
base_url: https://api.minimaxi.chat/v1
fallback_providers: []

📌 截图位置 8:config.yaml 配置截图,展示显式绑定的模型配置。

切换角色

# 直接切换到某个角色
content-expert chat

# 快捷命令(需先设置 alias)
ce chat
fe chat

# 查看所有角色
hermes profile list

六、多角色协作示例

用 delegate_task 做子任务

在主对话里,让前端工程师帮你查资料:

delegate_task(
    goal="帮我找一个适合嵌入网页的免费天气 API",
    context="需要支持中国城市,有免费额度",
    toolsets=["web"]
)

用 Kanban 看板管理任务流

# 创建看板
hermes kanban create "天气看板开发"

# 添加任务
hermes kanban add "完成首页布局" --to frontend-dev
hermes kanban add "接入天气 API" --to frontend-dev
hermes kanban add "内容审核" --to content-expert

# 查看状态
hermes kanban list

七、常见问题

Q:Profile 和普通对话有什么区别?

对比项 普通对话 Profile
上下文 每次/new 清空 持久保存
角色记忆 有(SOUL.md)
独立技能 有(Skills)
独立模型配置

Q:一个 Profile 可以多个人用吗?

目前 Profile 是本地文件,共享同一个系统用户。如果多人需要各自的角色,各自部署 Hermes。

Q:Profile 可以用不同的 API Key 吗?

可以。在 ~/.hermes/profiles/角色名/.env 里写入独立密钥,会覆盖主配置。


八、完整操作流程回顾

快速上手路径
─────────────────────────────────────────────
1. hermes profile create xxx       → 创建角色
2. nano ~/.hermes/profiles/xxx/SOUL.md  → 写角色灵魂
3. xxx skills install yyy           → 装技能(可选)
4. echo "alias xx='xxx chat'" >> ~/.bashrc  → 设别名
5. source ~/.bashrc
6. xxx chat                        → 启动角色
─────────────────────────────────────────────

Hermes 的 Profile 机制,让 AI 不再是"每次从零开始"的工具,而是真正有记忆、有技能、能协作的团队成员。

一个人活成一支团队,从今天这篇文章开始。

💬 评论区

加载中...