Skip to content

Hermes-agent 源码解读笔记 #64

@zhuzhh

Description

@zhuzhh

前言

为什么选hermes-agent?

  • Letta 优点是“记忆”
  • claude code 优点是”编码“
  • openclaw 优点是预定义工作流
  • hermes 自进化 + 通用 + 可审计(开源 LLM 微调的机构开源)

核心特点

  • 持久化记忆,每次启动不需要重新认识
  • 自沉淀能力,可自写技能
  • 跨入口统一,cli、微信、飞书、web不同入口,都是同一个大脑
  • 可观测、可评估、可审计

自动生成 skill

  • 当检测到一个”值得沉淀的重复模式“,会主动和用户协商是否要创建skill
  • 协商机制会在后面说

数据库 db 介绍

  • 每次问答,包括模型的思考过程、调用工具的参数、工具返回的结果,都会完整的保存下来,放进 db 数据库
  • 数据库介绍
  • FTS5:构建高效全文搜索的虚拟表模块。虚拟表模块,用来做关键词搜索;普通数据库,使用 LIKE 操作符匹配,速度太慢,性能太差,会扫描每一条记录
  • Hermes记忆 = sqlite会话历史 + memory/目录下的持久化笔记 + skills/目录下程序化知识 + FTS5索引 + LLM压缩摘要

记忆系统

记忆是agent讨论最多的,被作对最少得部分;能把记忆做成一个可工程化的子系统的项目屈指可数。原因很简单,记忆不是一个算法问题,而是一个何时写、何时读、何时忘的策略问题,而策略的好坏只能在使用中验证

window context 上下文 ≠ memory

LLM 上下文窗口,有128K,大的有2M了(Gemini 1.5 Pro);足够塞进去一本书,把所有对话历史都塞进 context,不就有记忆了?

会有如下问题

  • 成本问题,太耗token了
  • 延迟,首 token 延迟会增加,200K的 context 通常会有3-5秒后才会有第一个 token 输出,而10k的context,通常在500ms以内
  • 注意力被稀释,模型对开头和结尾注意力高于中间位置的

content window 是工作记忆,应该装载当前任务直接相关的信息

Hermes的三层记忆

对于不同的写入频率、检索策略、淘汰机制,归纳到不同的层

  • 会话历史 -> sqlite: state.db messages表、按对话分组、FTS5全文检索
  • 持久化笔记 -> memory目录:纯md文档、按主题组织、用户画像 事实 偏好等
  • 程序化知识 -> skills目录:每个skills文件

会话历史

  • 采用sqlite 记录全部过程,FTS5 全文索引能够精确回忆,比向量索引更准。
  • sqlite .db 文件方便迁移。
  • 方便阅读,sqlite3 命令行快速打开查看

代价是超大规模的记忆有性能问题(千万级别);单对于个人组手,目前是够用的

持久化笔记

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions