Hermes Trajectory日志工程:让每一次执行都成为进化数据

Trajectory日志工程:让每一次执行都成为进化数据

「Hermes Agent自进化智能体深度解析」系列 | 模块九 · 第4篇

在AI Agent的世界里,没有记录的执行就像蒸发的水------发生了,但什么也没留下。每一次推理、每一次工具调用、每一次错误恢复,都是Agent进化的珍贵养分。但99%的框架让这些数据白白流失。


一、蒸发掉的进化机会

大多数AI Agent框架的执行模型令人遗憾地简单:接收任务、调用LLM、执行工具、返回结果、结束。整个过程如同一次没有录像的体育比赛------运动员跑完了全程,却永远无法回看自己的动作、分析自己的失误、优化自己的策略。

这就是当前Agent领域最隐蔽也最致命的缺陷:执行完就结束,没有轨迹留存

想象一个场景:你的Agent今天处理了50个任务,成功了43个,失败了7个。你知道成功率是86%,但你不知道的是------

  • 成功的43次中,哪条执行路径最快?哪条消耗token最少?
  • 失败的7次中,是哪个步骤出了问题?有没有共同的模式?
  • 那些成功的执行,能否提炼为可复用的策略?
  • 那些失败的经历,能否转化为"避坑指南"?

没有Trajectory(轨迹)日志,这些问题全都是黑箱。Agent永远在"从零开始",每次执行都与历史经验无关------这不是智能体,这是一个有记忆障碍的系统。

Hermes Agent的回答截然不同。

在Hermes的自进化架构中,Trajectory Log不是调试工具,不是可选项,而是自进化系统的基础设施------它是原始石油,未经提炼但蕴含巨大潜力。上一篇#23我们拆解了推理解析与输出清理,那些解析产物的归宿就是Trajectory Log。本篇将完整展示Hermes如何将每一次执行转化为结构化的进化数据。


二、Trajectory Log完整Schema

在#08中我们见过YAML格式的简化版Trajectory日志。现在,让我们看看企业级Hermes部署中使用的完整Schema------一个能承载自进化全部所需信息的数据结构:

json 复制代码
{
  "trajectory": {
    "id": "traj_20260601_a7f3e2d1",
    "session_id": "sess_eva_20260601_001",
    "goal_id": "goal_fastapi_crud_042",
    "created_at": "2026-06-01T14:23:01.456Z",
    "completed_at": "2026-06-01T14:24:38.892Z",
    "duration_ms": 97436,

    "context": {
      "agent_version": "hermes-v3.2.1",
      "model": "deepseek-r1-0528",
      "memory_nodes_accessed": [
        "mem://project/fastapi-patterns",
        "mem://project/error-handling-strategy",
        "mem://user/coding-preference-async"
      ],
      "skills_used": ["file_list", "file_read", "code_write", "test_run"],
      "tools_available": ["bash", "file_ops", "git", "http_client"],
      "token_budget": 50000,
      "token_used": 32847,
      "temperature": 0.7,
      "system_prompt_hash": "sha256:e4a1b2c3..."
    },

    "steps": [
      {
        "step_id": "step_001",
        "timestamp": "2026-06-01T14:23:01.789Z",
        "type": "reasoning",
        "content": "Goal分析:需要在FastAPI项目中添加CRUD API端点...",
        "duration_ms": 3200,
        "token_used": 1850,
        "metadata": {
          "chain_of_thought_depth": 3,
          "confidence": 0.94
        }
      },
      {
        "step_id": "step_002",
        "timestamp": "2026-06-01T14:23:04.989Z",
        "type": "tool_call",
        "tool": "file_list",
        "input": {"path": "./src/routes/"},
        "duration_ms": 450,
        "token_used": 120
      },
      {
        "step_id": "step_003",
        "timestamp": "2026-06-01T14:23:05.439Z",
        "type": "tool_result",
        "tool": "file_list",
        "output": "['users.py', 'auth.py', 'items.py']",
        "duration_ms": 0,
        "token_used": 85,
        "status": "success"
      }
    ],

    "errors": [
      {
        "step_id": "step_007",
        "error_type": "ImportError",
        "message": "cannot import name 'ValidationError' from 'models'",
        "recovery_action": "added missing import to models/__init__.py",
        "recovery_successful": true,
        "time_lost_ms": 4200
      }
    ],

    "artifacts": [
      {
        "type": "file_created",
        "path": "./src/routes/products.py",
        "lines": 87,
        "hash": "sha256:f1e2d3c4..."
      },
      {
        "type": "test_result",
        "tests_run": 12,
        "tests_passed": 12,
        "coverage_delta": "+3.2%"
      }
    ],

    "memory_updates": [
      {
        "action": "upsert",
        "node_id": "mem://project/fastapi-patterns",
        "field": "crud_template_v2",
        "reason": "new pattern: async CRUD with dependency injection"
      }
    ],

    "verification_result": {
      "status": "verified",
      "criteria_met": ["endpoint_responds", "validation_works", "tests_pass"],
      "criteria_failed": [],
      "verifier_version": "v2.1.0"
    },

    "outcome": "success",
    "quality_score": 0.91,
    "human_feedback": null,
    "tags": ["fastapi", "crud", "async", "greenfield"]
  }
}

这个Schema的每一个字段都服务于自进化的某个环节。注意几个关键设计:

  • memory_nodes_accessed:记录Agent在执行过程中"想到了什么",这是连接Memory系统与执行行为的桥梁,让RL训练能学到"在什么情境下应该检索什么记忆"。
  • errors[].recovery_action:不是记录"出了什么错",而是记录"怎么恢复的"------这才是进化的核心数据。成功的错误恢复策略可以直接转化为Skills。
  • quality_score:一个0-1的浮点数,是Reward Calculation的基础信号,决定了这条轨迹在RL训练中的权重。
  • tags:语义标签,支持后续的轨迹聚类与模式识别。

三、持久化策略------不只是存储,是数据基建

有了Schema,下一步是回答一个问题:每天数万条Trajectory,怎么存、怎么查、怎么用?

存储格式选型

diff 复制代码
+------------------+----------------+------------------+------------------+
|     维度         |    JSON文件     |    SQLite        |    Parquet       |
+------------------+----------------+------------------+------------------+
| 写入性能         | ★★★★☆          | ★★★★★            | ★★☆☆☆            |
| 查询灵活性       | ★★☆☆☆          | ★★★★★            | ★★★★☆            |
| 分析性能         | ★★☆☆☆          | ★★★☆☆            | ★★★★★            |
| 压缩率           | ★★☆☆☆          | ★★★☆☆            | ★★★★★            |
| 自进化用途       | 调试/审计       | 实时查询/索引     | 批量分析/RL训练   |
+------------------+----------------+------------------+------------------+

Hermes采用混合存储策略,不赌单一格式:

  • 实时写入 :JSON Lines格式追加写入(trajectory_2026-06-01.jsonl),每条轨迹一行,写入零阻塞
  • 结构索引:异步同步到SQLite,建立五类核心索引
  • 分析归档:定时批量转换为Parquet,供离线RL训练和模式识别

索引设计

sql 复制代码
-- 核心索引:支持自进化最频繁的查询模式
CREATE INDEX idx_trajectory_session ON trajectories(session_id);
CREATE INDEX idx_trajectory_goal ON trajectories(goal_id);
CREATE INDEX idx_trajectory_outcome ON trajectories(outcome, quality_score);
CREATE INDEX idx_trajectory_time ON trajectories(created_at DESC);
CREATE INDEX idx_trajectory_tags ON trajectory_tags(tag, outcome);

-- 复合索引:支持"找某类任务的失败轨迹"这类模式识别查询
CREATE INDEX idx_trajectory_pattern
  ON trajectories(tags_hash, outcome, quality_score DESC);

分层存储------热度驱动的生命周期

javascript 复制代码
┌─────────────────────────────────────────────────────────────────┐
│                    Trajectory 存储生命周期                        │
│                                                                 │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐  │
│  │  热数据   │───>│  温数据   │───>│  冷数据   │───>│  归档     │  │
│  │  0-7天   │    │  7-30天  │    │ 30-180天 │    │  180天+   │  │
│  │  NVMe SSD│    │  HDD阵列  │    │  压缩存储 │    │  对象存储 │  │
│  │  JSON+DB │    │  SQLite  │    │  Parquet │    │  Parquet │  │
│  │  全字段   │    │  索引字段 │    │  分析字段 │    │  采样字段 │  │
│  └──────────┘    └──────────┘    └──────────┘    └──────────┘  │
│                                                                 │
│  用途:           用途:           用途:           用途:        │
│  实时反馈         近期模式识别      RL训练集构建      长期趋势分析  │
│  即时查询         周级别统计        离线批量分析      合规审计      │
└─────────────────────────────────────────────────────────────────┘

这个分层不是随意的------每一层都对应自进化流水线的不同阶段。热数据支撑实时反馈循环("刚执行的路径好不好?"),温数据支撑模式识别("最近一周有没有重复的低效路径?"),冷数据支撑RL训练("用过去半年的数据训练策略模型")。


四、从Trajectory到RL训练数据------自动化的进化引擎

这是整篇最关键的部分。Trajectory Log本身只是原材料,Hermes的自进化魔法在于自动将原始轨迹转化为强化学习训练样本的完整管线。

bash 复制代码
┌─────────────────────────────────────────────────────────────────────────┐
│              Trajectory → RL Training Sample 转化管线                    │
│                                                                         │
│  ┌──────────────┐   ┌──────────────┐   ┌──────────────┐   ┌─────────┐ │
│  │  Trajectory  │──>│    State     │──>│   Action     │──>│ Reward  │ │
│  │  Log (原始)   │   │  Extraction  │   │  Encoding    │   │  Calc   │ │
│  └──────────────┘   └──────────────┘   └──────────────┘   └─────────┘ │
│        |                   |                   |                |       │
│        v                   v                   v                v       │
│  100条成功轨迹         状态向量:            动作向量:          标量奖励: │
│  20条失败轨迹         [context +           [tool_choice +     R = f(   │
│                      memory_state +       parameters +       outcome,  │
│                      goal_state]          execution_path]    quality,  │
│                                                           efficiency)│
│                                                                         │
│  ┌──────────────────────────────────────────────────────────────────┐   │
│  │                     RL Training Sample                           │   │
│  │  {                                                               │   │
│  │    "state": [0.23, 0.87, ...],      # 环境状态编码              │   │
│  │    "action": [0.12, 0.95, ...],     # 动作编码                  │   │
│  │    "reward": 0.91,                  # 奖励信号                  │   │
│  │    "next_state": [0.31, 0.82, ...], # 执行后状态                │   │
│  │    "done": true                     # 是否终止                  │   │
│  │  }                                                               │   │
│  └──────────────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────────────┘

状态提取(State Extraction)

从Trajectory的context字段和当前step中提取状态向量:

python 复制代码
def extract_state(trajectory: dict, step_index: int) -> dict:
    """将轨迹的某一步转化为状态描述"""
    step = trajectory["steps"][step_index]
    context = trajectory["context"]

    return {
        "goal_embedding": embed(trajectory["goal_id"]),       # 目标语义向量
        "memory_hotness": len(context["memory_nodes_accessed"]),  # 记忆活跃度
        "skills_available": context["skills_used"],            # 已用技能
        "tokens_remaining": context["token_budget"] - context["token_used"],
        "error_count_so_far": count_errors_before(trajectory, step_index),
        "time_elapsed_ms": sum_duration_before(trajectory, step_index),
        "project_type": classify_project(context.get("tags", []))
    }

动作编码(Action Encoding)

python 复制代码
def encode_action(step: dict) -> dict:
    """将一步执行转化为动作编码"""
    action_type = step["type"]

    if action_type == "tool_call":
        return {
            "action_category": "tool_call",
            "tool_name": step["tool"],
            "tool_input_shape": hash_input_shape(step["input"]),
            "tool_input_summary": summarize(step["input"])
        }
    elif action_type == "reasoning":
        return {
            "action_category": "reasoning",
            "thought_depth": step["metadata"]["chain_of_thought_depth"],
            "confidence": step["metadata"]["confidence"]
        }
    # ... tool_result, error_recovery, etc.

奖励计算(Reward Calculation)

这是最精妙的部分------奖励不是简单的"成功=1,失败=0",而是一个多维复合函数:

python 复制代码
def calculate_reward(trajectory: dict) -> float:
    """多维奖励函数"""
    outcome_score = 1.0 if trajectory["outcome"] == "success" else -0.3

    quality_score = trajectory["quality_score"]        # 0-1,来自验证器

    efficiency = 1.0 - (trajectory["context"]["token_used"] /
                        trajectory["context"]["token_budget"])

    error_penalty = -0.1 * len(trajectory["errors"])   # 错误惩罚
    recovery_bonus = 0.05 * sum(                       # 成功恢复奖励
        1 for e in trajectory["errors"] if e["recovery_successful"]
    )

    speed_score = max(0, 1.0 - trajectory["duration_ms"] / 120000)

    # 加权融合
    reward = (
        0.30 * outcome_score +
        0.25 * quality_score +
        0.15 * efficiency +
        0.10 * error_penalty +
        0.05 * recovery_bonus +
        0.15 * speed_score
    )
    return round(max(-1.0, min(1.0, reward)), 4)

震撼时刻:Agent自己"悟"出了最优策略

100条成功轨迹 + 20条失败轨迹,通过上述管线自动生成RL训练集。训练完成后,Hermes的Policy Model学到了一条非显而易见的策略:

在FastAPI项目中创建API端点,先执行file_listfile_read模式理解项目结构,再动手写代码,成功率92%;而直接开始写代码的成功率仅为67%。

这条策略不是任何工程师手写的规则,不是Prompt中的指令,不是文档中的最佳实践------这是Agent从120条自己的执行轨迹中,通过强化学习自己"悟"出来的

这就是Trajectory Log作为"自进化石油"的真正价值:你不需要告诉Agent应该怎么做,你只需要忠实记录它做了什么、结果如何,进化会自动发生。


五、成功/失败路径的模式识别

RL训练是"隐式学习",模式识别则是"显式洞察"------让进化过程可解释、可审计、可干预。

聚类分析:发现高效路径

lua 复制代码
┌─────────────────────────────────────────────────────────────┐
│           Trajectory Clustering:路径模式发现                 │
│                                                             │
│  高效路径聚类 (centroid_1, avg_score=0.93)                   │
│  ┌──────────────────────────────────────────────────┐       │
│  │ goal_parse → file_list → file_read → code_write  │       │
│  │           → test_run → verify      → commit      │       │
│  │ 样本数: 38/43 (88%)   avg_duration: 42s          │       │
│  └──────────────────────────────────────────────────┘       │
│                                                             │
│  低效路径聚类 (centroid_2, avg_score=0.61)                   │
│  ┌──────────────────────────────────────────────────┐       │
│  │ goal_parse → code_write → error → debug          │       │
│  │           → code_edit → error → debug → code_edit│       │
│  │           → test_run → verify → commit           │       │
│  │ 样本数: 5/43 (12%)    avg_duration: 118s         │       │
│  └──────────────────────────────────────────────────┘       │
│                                                             │
│  失败路径聚类 (centroid_3, avg_score=-0.15)                  │
│  ┌──────────────────────────────────────────────────┐       │
│  │ goal_parse → code_write → error → error → error  │       │
│  │           → timeout → FAIL                       │       │
│  │ 样本数: 15/20 (75%)   共同特征: token耗尽         │       │
│  └──────────────────────────────────────────────────┘       │
│                                                             │
│  ★ 洞察:centroid_2的5个样本是"差点失败的成功"              │
│    → 提取为"边界案例",用于增强鲁棒性训练                     │
└─────────────────────────────────────────────────────────────┘

根因分析:失败轨迹的共同特征

Hermes的Pattern Analyzer会对失败轨迹进行自动化根因分析:

  1. 时序对齐:将不同长度的轨迹通过Dynamic Time Warping对齐,找到"在哪个步骤开始分叉"
  2. 特征提取 :从contextsteps中提取共同特征------相同的模型?相同的工具?相同的memory节点?
  3. 归因输出:生成人可读的根因报告
yaml 复制代码
root_cause_analysis:
  failure_cluster_id: "fc_token_exhaustion"
  common_patterns:
    - pattern: "token_used / token_budget > 0.8 before step 3"
      frequency: "14/15 (93%)"
    - pattern: "no file_list/file_read in first 3 steps"
      frequency: "13/15 (87%)"
    - pattern: "reasoning_chain_depth > 5 in step_001"
      frequency: "12/15 (80%)"
  inferred_root_cause: >
    Agent在未充分理解项目结构的情况下启动深度推理,
    导致生成大量无效token。根本原因是缺少"先探索再推理"的策略约束。
  suggested_fix: >
    在Skill Router中添加前置条件:code_write之前必须至少执行
    一次file_list和一次file_read。可通过Policy Update自动注入。

异常检测:偏离正常模式的行为识别

不是所有异常都是失败------有时候异常代表"发现了更好的路径"。Hermes的异常检测使用Isolation Forest算法,不预设"好"或"坏",而是标记"与大多数不同"的轨迹,然后交给质量评分来判断。

这种设计避免了一个陷阱:如果只关注"偏离正常=坏",Agent将永远无法发现优于当前策略的新路径。自进化需要探索的空间,异常检测只是标记,不评判。


六、日志的隐私与安全

Trajectory Log记录了Agent的每一次思考、每一次操作,这意味着它可能包含:

  • 用户的项目结构、文件名、代码片段
  • 业务逻辑中涉及的敏感实体名称
  • 错误信息中暴露的系统内部路径

Hermes采用三层防护策略:

自动脱敏

python 复制代码
SENSITIVE_PATTERNS = {
    r"password\s*[:=]\s*\S+": "password: [REDACTED]",
    r"api_key\s*[:=]\s*\S+":  "api_key: [REDACTED]",
    r"/home/[^/]+/":          "/home/[USER]/",
    r"[\w.+-]+@[\w-]+\.[\w.]+": "[EMAIL]",
}

def sanitize_trajectory(raw: dict) -> dict:
    """在写入存储前自动脱敏"""
    sanitized = deep_copy(raw)
    for step in sanitized["steps"]:
        step["content"] = apply_patterns(step["content"], SENSITIVE_PATTERNS)
        if "input" in step:
            step["input"] = apply_patterns(str(step["input"]), SENSITIVE_PATTERNS)
    return sanitized

访问权限控制

Trajectory数据按敏感等级分为三级:

  • L1(公开):outcome、quality_score、duration等聚合指标------团队成员可见
  • L2(内部):steps、errors、工具调用细节------仅Agent运维团队可见
  • L3(敏感):完整content、工具输入输出------仅系统自身访问,用于RL训练

合规保留策略

不同行业对日志保留有不同要求。Hermes的保留策略完全可配置:

yaml 复制代码
retention_policy:
  financial:       # 金融场景
    hot_retention: 30d
    cold_retention: 2555d   # 7年,满足金融审计要求
    anonymize_after: 90d    # 90天后自动脱敏详细内容

  healthcare:      # 医疗场景
    hot_retention: 14d
    cold_retention: 2190d   # 6年
    anonymize_after: 30d
    exclude_phi: true       # 排除所有PHI(受保护健康信息)

  general:         # 通用场景
    hot_retention: 7d
    cold_retention: 365d
    anonymize_after: 60d

七、总结------记录即是进化的起点

Trajectory Log工程看似是"存储问题",实则是自进化的核心基础设施。让我们回顾Hermes的完整链路:

  1. 记录:每一次执行都被完整Schema化为结构化数据
  2. 存储:分层存储策略确保查询效率与成本可控
  3. 转化:自动管线将轨迹转化为RL训练样本
  4. 学习:RL训练让Agent从自己的经验中进化
  5. 洞察:模式识别让进化过程可解释、可干预

这不是一个调试工具,不是日志系统,不是可选项------这是让Agent从"每次从零开始"变为"越用越强"的进化引擎

上一篇#23拆解了推理解析与输出清理,为Trajectory Log提供了高质量的输入。本篇完成了"记录与存储"这一环。但一个关键问题尚未回答:所有执行被记录了,所有证据被收集了------如何判定"这个Goal真的完成了"?

下一篇#25将深入Hermes的Verification协议------从证据收集到目标达成判定的完整验证链。这是自进化系统的最后一道闸门:只有被验证的执行,才能成为高质量的进化数据。


延伸阅读与交流

本文涉及的Hermes Agent自进化智能体技术体系,目前已有系统化的深度学习资源可供参考。中国通信工业协会通信和信息技术创新人才培养工程项目办公室将于近期组织相关技术专题分享,围绕本文讨论的AI原生架构、智能体工作流、自进化数据层等方向展开系统讲解。

专题信息

  • 主题:AI原生Hermes自进化智能体系统
  • 时间:2026年7月4-5日(周末)
  • 形式:线上直播
  • 内容方向:AI原生架构 · Hermes智能体拆解 · 全栈扩展 · 智能自动化 · 产品级实战 · Context Engine · 自进化数据层

分享嘉宾

王老师(Gavin),Agentic AI企业联合创始人兼CTO,十余年硅谷AI系统工程经验。长期深耕NLP、强化学习、可控AI与智能体系统架构,提出"语言即控制(Language as Control)"原创范式,在RLHF、PPO、DPO、GRPO等方向有系统化工程实践,推动智能体技术在社交媒体、医疗、金融、法律、教育等专业场景落地。

技术交流

相关推荐
starsky762383 小时前
基于 Spring AI 构建具备记忆与情绪的多角色 Agent 系统
人工智能·spring·架构
2601_957879333 小时前
基于LBS位置服务与跨域OpenAPI的同城矩阵系统:边缘裂变与数据网关架构实践
线性代数·矩阵·架构
Doris_20233 小时前
eslint
前端·架构·前端框架
Legend NO243 小时前
非结构化数据治理全解:从合规痛点、中台架构到 AI 智能化分类落地
大数据·人工智能·架构
无忧智库3 小时前
破局“伪智慧”陷阱:数智园区全生命周期集成平台的架构重构与价值跃迁(PPT)
重构·架构
逍遥运德4 小时前
Java编程高频的“技术点”-03:“下划线命名”参数,后端用"驼峰命名"接收
java·后端·架构
小红军4 小时前
Flutter和Native通信方案
架构
2601_957888565 小时前
分布式新媒体架构:短视频矩阵系统的技术痛点、算法规则与效率优化实践
分布式·架构·媒体