📄 文档列表
🎬 口播文案
✏️ 编辑文档
标题
工具栏
加粗
H2 标题
H3 标题
引用
无序列表
有序列表
代码块
📷 上传图片
点击或拖拽上传图片
支持 PNG, JPG, GIF, WebP 格式
内容 (Markdown 格式)
今天被一个读者问到:你一个人怎么同时搞定写文章、敲代码、做运营的?我说因为我有"分身术"。 他以为我在开玩笑。其实 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 很简单 ### 第一步:一行命令创建角色 ```bash hermes profile create 角色名称 ``` 创建一个前端工程师角色: ```bash hermes profile create frontend-dev ``` **运行效果:** ```text $ 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 "。 ```bash nano ~/.hermes/profiles/frontend-dev/SOUL.md ``` 内容这样写: ```markdown # 前端工程师 (Frontend Engineer) 你是一名专业的前端开发者,擅长 Vue / React / TypeScript / Node.js。 ## 核心职责 1. 根据需求开发可运行的 Web 界面 2. 写代码前先理解需求,不盲目动手 3. 代码要有注释,变量命名要清晰 4. 完成后在 workspace/ 下交付完整可运行的项目 ## 工作原则 - 用简洁的代码解决问题,不炫技 - 优先使用免费公开的 API - 交付前在本地验证功能正常 - 不生成任何福利、优惠券、红包相关信息 ``` > **📌 截图位置 2:SOUL.md 文件内容截图,展示编辑后的角色定义。** ### 第三步:给角色装专属技能 创建时已同步 89 个内置技能,还可以安装额外的: ```bash # 安装技能(内容专家需要内容创作指南) content-expert skills install chuangjian-ai-creator # 安装技能(前端工程师需要 Node.js 调试能力) frontend-dev skills install node-inspect-debugger ``` > **📌 截图位置 3:技能安装成功的终端输出。** ### 第四步:设置快捷命令 每次输入 `content-expert chat` 太长了?加个别名: ```bash echo "alias ce='content-expert chat'" >> ~/.bashrc echo "alias fe='frontend-dev chat'" >> ~/.bashrc source ~/.bashrc ``` 以后直接 `ce "帮我写篇文章"` 或 `fe "帮我做个天气页面"`。 --- ## 四、实战案例:前端工程师开发天气看板 ### 需求 创建一个"每日生活指数看板" Web 页面,功能包括: - 当前时间(实时每秒更新) - 天气信息 - 农历日期 - 黄历宜忌 - 穿衣指数 - 适合干什么 / 不适合干什么 ### 实现思路 ``` 天气看板实现架构 ───────────────────────────────────────────── ┌─────────────────────────────────────────┐ │ index.html │ │ ┌─────────────────────────────────┐ │ │ │ 时间模块 │ 日期+星期 │ │ │ │ 实时跳动 │ 每日刷新 │ │ │ └─────────────────────────────────┘ │ │ ┌─────────────────────────────────┐ │ │ │ 天气模块 │ 农历+黄历 │ │ │ │ 温度/状态 │ 宜忌/穿衣指数 │ │ │ └─────────────────────────────────┘ │ │ ┌─────────────────────────────────┐ │ │ │ 生活指数模块 │ │ │ │ 适合/不适合 运动/出行/购物 │ │ │ └─────────────────────────────────┘ │ └─────────────────────────────────────────┘ │ ▼ ┌─────────────────┐ ┌──────────────────┐ │ 免费天气 API │ │ 黄历 API │ │ (和风天气等) │ │ (免费接口) │ └─────────────────┘ └──────────────────┘ ───────────────────────────────────────────── ``` ### 步骤 1:让前端工程师接需求 ```bash 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(结构):** ```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(逻辑):** ```javascript // 每日生活指数看板 - 主逻辑 // 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:本地运行验证 ```bash cd ~/.hermes/profiles/frontend-dev/workspace/daily-board python3 -m http.server 8080 ``` 然后浏览器打开 `http://localhost:8080`。 > **📌 截图位置 7:浏览器中打开页面的截图,展示完整效果(时间跳动、天气显示、宜忌列表等)。** --- ## 五、Profile 的高级配置 ### 独立 API Key(模型隔离) 有时你想让不同角色用不同的模型。创建 Profile 独立的 `.env`: ```bash nano ~/.hermes/profiles/frontend-dev/.env ``` 内容: ``` MINIMAX_CN_API_KEY=你的MiniMax密钥 ``` 这样前端工程师这个角色只走 MiniMax,不会用到主配置里的其他密钥。 ### 显式绑定模型(防止串台) Profile 创建后,在 `config.yaml` 里显式指定模型: ```bash nano ~/.hermes/profiles/frontend-dev/config.yaml ``` 内容: ```yaml default: MiniMax-M2.7 provider: minimax-cn base_url: https://api.minimaxi.chat/v1 fallback_providers: [] ``` > **📌 截图位置 8:config.yaml 配置截图,展示显式绑定的模型配置。** ### 切换角色 ```bash # 直接切换到某个角色 content-expert chat # 快捷命令(需先设置 alias) ce chat fe chat # 查看所有角色 hermes profile list ``` --- ## 六、多角色协作示例 ### 用 delegate_task 做子任务 在主对话里,让前端工程师帮你查资料: ```python delegate_task( goal="帮我找一个适合嵌入网页的免费天气 API", context="需要支持中国城市,有免费额度", toolsets=["web"] ) ``` ### 用 Kanban 看板管理任务流 ```bash # 创建看板 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 不再是"每次从零开始"的工具,而是真正有记忆、有技能、能协作的团队成员。 一个人活成一支团队,从今天这篇文章开始。
摘要
标签
多个标签用逗号分隔
分类
技术文章
教程指南
工具测评
项目实战
行业观察
默认
💾 保存修改
← 返回查看
返回列表