Skip to content

Memo 设计与更新

适用版本:4.0.8+

新版 Session 不再内置“固定 memo 算法”。

你可以把 memo 当成任意结构化状态(dict/list/str/...),并在自定义执行策略里更新它。

1. 设计原则

建议 memo 只保留“稳定、可复用”的信息,例如:

  • 用户长期偏好(语言、风格、格式)
  • 任务长期约束(输出字段、审计规则)
  • 对话中确定事实(项目代号、时间线)

不建议把瞬时上下文原样复制进 memo,否则会和 context_window 重复。

2. 何时更新 memo

常见触发条件:

  • context_window 超过阈值
  • 业务阶段切换(如需求澄清 -> 方案输出)
  • 每 N 轮进行一次总结

3. 实战:LLM 驱动 memo 更新

python
from agently import Agently

agent = Agently.create_agent()
agent.activate_session(session_id="memo_demo")
session = agent.activated_session


def analysis_handler(full_context, context_window, memo, session_settings):
    if len(context_window) > 6:
        return "compress_with_memo"
    return None


async def compress_with_memo(full_context, context_window, memo, session_settings):
    kept = list(context_window[-4:])

    memo_request = agent.create_temp_request()
    (
        memo_request
        .input({
            "history_to_compress": [m.model_dump() for m in context_window[:-4]],
            "old_memo": memo,
        })
        .instruct("请将 history_to_compress 与 old_memo 合并为结构化长期记忆")
        .output({
            "user_preferences": {"<key>": (str, "偏好值"), "...": "..."},
            "stable_facts": [{"fact": (str,), "confidence": (float,)}],
        })
    )

    # 注意:真实项目建议加 ensure_keys 和异常兜底
    new_memo = await memo_request.async_start(ensure_keys=["user_preferences", "stable_facts"])
    return None, kept, new_memo


session.register_analysis_handler(analysis_handler)
session.register_execution_handlers("compress_with_memo", compress_with_memo)

4. memo 如何注入模型

session.memo 非空时,SessionExtension 会在请求前自动追加:

  • CHAT SESSION MEMO

你无需手动 agent.info({"memo": ...})

5. 生产建议

  • 给 memo 定义固定 schema,避免字段漂移
  • 在执行器中加入异常回退:失败时返回旧 memo
  • 控制 memo 体积,避免替代 context_window
  • 对关键字段加测试(如 user_preferences.language