周一早上,你的工作群和生活群打架了

闹钟响的时候,我已经在脑子里过了三遍今天的安排。工作群里同事催着要产品方案,家里的智能家居推送说猫粮快没了,健身房的预约提醒弹出来,房贷还款日也在这几天。打开电脑,桌面上堆了五个配置文件,每个工具都有自己的 token、路径、参数,混在一起乱成一锅粥。我上周就干过一件蠢事,把生产环境的 API key 当成测试环境的写进了脚本,结果把同事的开发库清了一半。那种感觉,就像你穿着西装去健身房,又穿着运动服去开会,两边都不对劲。 后来我换了 Hermes Agent,用多配置文件把工作和生活彻底拆开。装它很简单,一条命令的事: ```bash pip install hermes-agent ``` 装完默认配置文件在 `~/.hermes/config.yaml`,但 Hermes 支持你指定任意配置文件启动,这正好是拆分的核心。我不再只有一个 Hermes,而是三个:一个管工作,一个管生活,一个管临时杂事。每个实例的配置、技能、记忆全部分开,互不串门。你可能会问,这不就是多开几个终端的事吗?区别在于,Hermes 的每个实例有独立的记忆空间和技能目录,工作里的对话记录不会污染生活里的提醒,反之亦然。 具体怎么操作,下面一步步说。

创建三个独立的配置文件:工作、生活、临时

Hermes 的配置目录默认是 `~/.hermes/`,但你可以通过环境变量 `HERMES_CONFIG_DIR` 让每个实例用不同的目录。我建了三个文件夹: ```bash mkdir -p ~/.hermes-work ~/.hermes-life ~/.hermes-temp ``` 然后在每个目录下放一个 `config.yaml`。工作配置长这样: ```yaml # ~/.hermes-work/config.yaml agent: name: "work-helper" model: "gpt-4o" temperature: 0.2 memory: path: "~/.hermes-work/memory" skills_dir: "~/.hermes-work/skills" cron: timezone: "Asia/Shanghai" log_file: "~/.hermes-work/cron.log" ``` 生活配置: ```yaml # ~/.hermes-life/config.yaml agent: name: "life-helper" model: "gpt-4o-mini" temperature: 0.7 memory: path: "~/.hermes-life/memory" skills_dir: "~/.hermes-life/skills" cron: timezone: "Asia/Shanghai" log_file: "~/.hermes-life/cron.log" ``` 注意几个关键差异。工作的 `temperature` 我设了 0.2,让输出更确定,减少废话;生活里设 0.7,聊天可以放开一点。模型也分开了,工作用 gpt-4o 保证质量,生活用 gpt-4o-mini 省钱。`memory` 和 `skills_dir` 各指各的目录,这是拆分记忆和技能的基础。 启动的时候,用 `--config` 参数指定: ```bash hermes --config ~/.hermes-work/config.yaml hermes --config ~/.hermes-life/config.yaml ``` 我给这两个命令起了别名,放在 shell 配置里: ```bash alias work-hermes="hermes --config ~/.hermes-work/config.yaml" alias life-hermes="hermes --config ~/.hermes-life/config.yaml" ``` 这样每次不用敲长路径,直接 `work-hermes` 或者 `life-hermes` 就进去了。临时配置就不用建文件了,直接命令行传参: ```bash hermes --config /dev/null --memory /tmp/hermes-temp-mem ``` 一次性任务用完就扔,记忆也不留。三套配置互不干扰,工作里问的代码问题不会出现在生活的对话历史里,生活里的菜谱也不会让工作助手犯迷糊。

技能目录拆分:工作技能和生活技能井水不犯河水

配置文件分开只是第一步,真正让两个 Hermes 干不同活的,是技能目录。默认技能在 `~/.hermes/skills/`,但既然配置里指定了 `skills_dir`,每个实例就会去各自的目录找技能。 我工作的技能目录 `~/.hermes-work/skills/` 下放了三个技能: ```bash ~/.hermes-work/skills/ ├── git_commit.yaml # 自动生成提交信息 ├── code_review.yaml # 代码审查规则 └── deploy_check.yaml # 部署前检查清单 ``` 每个技能就是一个 YAML 文件,描述触发条件和执行步骤。比如 `git_commit.yaml` 长这样: ```yaml name: "git_commit" description: "根据 git diff 生成规范的提交信息" trigger: command: "git-commit" steps: - "运行 git diff --stat 查看变更概况" - "运行 git diff 查看具体改动" - "根据改动类型生成 conventional commit 格式的信息" - "输出提交信息,不自动执行 git commit" ``` 生活的技能目录 `~/.hermes-life/skills/` 内容完全不同: ```bash ~/.hermes-life/skills/ ├── meal_plan.yaml # 一周菜谱规划 ├── workout_schedule.yaml # 健身计划 └── bill_reminder.yaml # 账单提醒 ``` `bill_reminder.yaml` 里我写了每月的固定支出项目:房贷 6800 号扣,水电燃气 15 号,信用卡 20 号。Hermes 会结合记忆里的上个月账单,在扣款前一天提醒我。 有一次我在工作实例里输入 `git-commit`,它正常生成了提交信息。然后切到生活实例,我故意输入同样的命令,它直接回复“我没有这个技能,你是不是走错房间了?”这种隔离让我很放心。反过来,生活里的菜谱技能也不会在工作实例里被触发,省得开会的时候突然蹦出来一条“今天该买牛肉了”。 技能可以随时加。我上个月新加了一个 `meeting_notes.yaml` 在工作目录里,专门把会议录音转成带要点的笔记。生活目录里加了个 `gift_ideas.yaml`,记着家人朋友的一些偏好,到节日提前出主意。两边的技能互不干扰,因为路径完全分开了。

记忆分离:用 memory 命令让两个 Hermes 各聊各的

配置文件分开、技能分开,但记忆如果不分开,还是会串。Hermes 的 `memory` 命令就是干这个的。每个实例启动后,`memory` 操作的都是自己配置里指定的那个路径。 工作实例里我存了这些: ```bash work-hermes> memory add "项目Alpha的部署环境是 staging,数据库密码存在公司的 vault 里" work-hermes> memory add "王工的接口文档在 docs/internal/api.md,改动前先看这个" work-hermes> memory list ``` 输出: ``` 1. 项目Alpha的部署环境是 staging,数据库密码存在公司的 vault 里 2. 王工的接口文档在 docs/internal/api.md,改动前先看这个 3. 团队周会时间是每周二下午 3 点 ``` 生活实例里存的是完全另一套: ```bash life-hermes> memory add "猫粮品牌是渴望六种鱼,一次买 5.4kg 装,京东自营有货" life-hermes> memory add "健身房周二周四晚上 8 点有团课,需要提前一天预约" life-hermes> memory list ``` 输出: ``` 1. 猫粮品牌是渴望六种鱼,一次买 5.4kg 装,京东自营有货 2. 健身房周二周四晚上 8 点有团课,需要提前一天预约 3. 爸妈的结婚纪念日是 11 月 8 号 ``` 看到没,两边完全隔离。我在工作实例里问“这个月账单多少”,它查不到生活记忆里的水电费,因为那些存在另一个路径下。反过来,生活实例里问“项目部署环境”,它只会回“我没有这个信息”。 我还试过在生活实例里加了条记忆“周末去爬山”,然后跑到工作实例里问“周末安排”,它完全不知道这回事。这种隔离对专注很重要。工作的 Hermes 只存工作上下文,对话历史短,检索快;生活的 Hermes 只存生活琐事,不会被工作术语干扰。 如果你想导出某个实例的记忆做备份,直接复制对应的 memory 目录就行: ```bash cp -r ~/.hermes-work/memory ~/backups/work-memory-$(date +%Y%m%d) ``` 恢复也简单,把备份拷回去覆盖。这个操作我每个月做一次,防止数据丢失。

定时任务分开调度:hermes cron create 建两套计划

定时任务是另一个容易混的地方。如果用默认配置,所有 cron 混在一起,工作提醒和生活提醒会互相打扰。Hermes 的 `hermes cron create` 命令跟着配置文件走,所以两套实例各建各的。 工作的定时任务,我在 `work-hermes` 里创建: ```bash work-hermes> hermes cron create --name "daily-standup" --schedule "0 9 * * 1-5" --command "生成今日工作要点,列出三个优先事项" work-hermes> hermes cron create --name "weekly-report" --schedule "0 17 * * 5" --command "汇总本周完成的任务,生成周报草稿" ``` 查看一下: ```bash work-hermes> hermes cron list ``` 输出: ``` 1. daily-standup: 0 9 * * 1-5 - 生成今日工作要点 2. weekly-report: 0 17 * * 5 - 汇总本周任务 ``` 生活的定时任务在 `life-hermes` 里建: ```bash life-hermes> hermes cron create --name "water-plants" --schedule "0 8 * * *" --command "提醒给阳台植物浇水,今天天气如果下雨就不用浇" life-hermes> hermes cron create --name "medicine-refill" --schedule "0 10 1 * *" --command "检查常用药余量,列出需要补买的清单" ``` 各自列表: ```bash life-hermes> hermes cron list ``` 输出: ``` 1. water-plants: 0 8 * * * - 提醒给阳台植物浇水 2. medicine-refill: 0 10 1 * * - 检查常用药余量 ``` 分开调度有个实际好处:工作实例的 cron 日志写在 `~/.hermes-work/cron.log`,生活的写在 `~/.hermes-life/cron.log`。排查问题的时候,直接看对应的日志,不用在一堆混杂的条目里翻。有一次工作 cron 没触发,我打开工作日志发现是时区设置错了,改完 `timezone: "Asia/Shanghai"` 就好。生活实例完全没受影响,该提醒浇水还是准时提醒。 我还用过一个技巧:把需要工作环境变量的任务放在工作 cron 里,比如部署脚本需要 `AWS_PROFILE`,在配置文件里写环境变量,启动的 cron 自动带上。生活 cron 不需要这些,保持干净。

切换实例的实际操作:shell 函数和 tmux 双保险

配置文件、技能、记忆、cron 都分开了,但还有个问题:怎么方便地切换。每次敲 `hermes --config ~/.hermes-work/config.yaml` 太长了。我用 shell 函数解决: ```bash # 在 ~/.zshrc 里添加 function work() { hermes --config ~/.hermes-work/config.yaml "$@" } function life() { hermes --config ~/.hermes-life/config.yaml "$@" } ``` 这样直接在终端里输入 `work "查一下项目Alpha的部署文档"`,或者 `life "提醒我今晚买牛奶"`,干净利落。 如果同时开两个窗口,我建议用 tmux。我建了两个会话: ```bash tmux new-session -s work -d 'hermes --config ~/.hermes-work/config.yaml' tmux new-session -s life -d 'hermes --config ~/.hermes-life/config.yaml' ``` 然后 `tmux attach -t work` 进工作,`Ctrl-b d` 退出,再 `tmux attach -t life` 进生活。两个会话互不干扰,界面上下分屏还能同时看。我平时就这么干,左边工作,右边生活,需要哪个切过去。 还有一个细节:两个实例的日志文件不同,排查问题不会混淆。工作实例输出到 `~/.hermes-work/hermes.log`,生活的在 `~/.hermes-life/hermes.log`。用 `tail -f` 同时跟踪两个日志也行: ```bash tail -f ~/.hermes-work/hermes.log ~/.hermes-life/hermes.log ``` 但输出会混在一起,所以我一般分开看,需要哪个看哪个。 这套方案我用了三个月,最明显的变化是:工作实例的对话历史里全是代码和方案,生活实例里全是菜谱和账单,两边检索都变快了。以前混在一起的时候,问“昨天我聊了什么”要翻半天,现在直接切到对应实例,记忆就在那里等着。

搞砸过一次,说说教训

这套配置不是一开始就顺的。我犯过一个错:在生活实例里跑了一个工作技能,因为当时临时改过 `skills_dir` 配置,把两个目录指到了同一个地方。结果生活实例加载了工作技能,工作实例也看到了生活记忆,两边都乱套了。排查花了一个下午,最后发现是配置里写错了路径。 从那以后我加了两个检查: 1. 每次启动前确认环境变量 `HERMES_CONFIG_DIR` 没被设置,避免覆盖配置文件里的路径。 2. 定期检查两个实例的 `memory list`,确认没有互相串数据。 还有一次,我在工作配置文件里临时加了 `temperature: 1.5`,结果输出全是胡话。后来查文档发现 temperature 范围是 0 到 1,设 1.5 等于让模型随机乱说。改回 0.2 就正常了。这类小坑,遇到一次记一次,配置里写清楚注释就不会再犯。 如果你也想拆,建议先从两个实例开始,别贪多。工作一个,生活一个,跑两周看看顺不顺,再考虑要不要加第三个临时实例。临时实例我用 `--config /dev/null` 启动,记忆放 /tmp,用完就丢,不占地方。 这套方法不复杂,核心就是每个实例一套独立目录,配置、技能、记忆、cron 各管各的。花半小时搭好,后面省心很多。

💬 你用过哪些AI工具?

聊了这么多 Hermes 的配置技巧,你平时干活用的是什么工具?我试过不少,有的擅长写代码,有的适合聊天,还有的专门做数据整理,但每个工具的强项不一样。如果你也在纠结选哪个,可以去 AI House 排行榜(aibunkhouse.com/rankings/)看看最新的模型排名,上面有真实用户的使用反馈和评分,比看宣传靠谱多了。看完还可以给喜欢的模型投一票,说不定能帮别人少走弯路。你最近用的哪个工具顺手?评论区聊聊,我这边踩过的坑说不定能帮你避开。

常见问题 / FAQ

周一早上,你的工作群和生活群打架了

闹钟响的时候,我已经在脑子里过了三遍今天的安排。工作群里同事催着要产品方案,家里的智能家居推送说猫粮快没了,健身房的预约提醒弹出来,房贷还款日也在这几天。打开电脑,桌面上堆了五个配置文件,每个工具都有自己的 token、路径、参数,混在一起乱成一锅粥。我上周就干过一件蠢事,把生产环境的 API key 当成测试环境的写进了脚本,结果把同事的开发库清了一半。那种感觉,就像你穿着西装去健身房,又穿...

创建三个独立的配置文件:工作、生活、临时

Hermes 的配置目录默认是 `~/.hermes/`,但你可以通过环境变量 `HERMES_CONFIG_DIR` 让每个实例用不同的目录。我建了三个文件夹: ```bash mkdir -p ~/.hermes-work ~/.hermes-life ~/.hermes-temp ``` 然后在每个目录下放一个 `config.yaml`。工作配置长这样: ```yaml # ~/...

技能目录拆分:工作技能和生活技能井水不犯河水

配置文件分开只是第一步,真正让两个 Hermes 干不同活的,是技能目录。默认技能在 `~/.hermes/skills/`,但既然配置里指定了 `skills_dir`,每个实例就会去各自的目录找技能。 我工作的技能目录 `~/.hermes-work/skills/` 下放了三个技能: ```bash ~/.hermes-work/skills/ ├── git_commit.yaml...

记忆分离:用 memory 命令让两个 Hermes 各聊各的

配置文件分开、技能分开,但记忆如果不分开,还是会串。Hermes 的 `memory` 命令就是干这个的。每个实例启动后,`memory` 操作的都是自己配置里指定的那个路径。 工作实例里我存了这些: ```bash work-hermes> memory add "项目Alpha的部署环境是 staging,数据库密码存在公司的 vault 里" work-hermes> memory ...

定时任务分开调度:hermes cron create 建两套计划

定时任务是另一个容易混的地方。如果用默认配置,所有 cron 混在一起,工作提醒和生活提醒会互相打扰。Hermes 的 `hermes cron create` 命令跟着配置文件走,所以两套实例各建各的。 工作的定时任务,我在 `work-hermes` 里创建: ```bash work-hermes> hermes cron create --name "daily-standup" ...