OpenClaw记忆Skill入门指南:从零构建你的第一个记忆增强应用

2次阅读
没有评论

共计 1793 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

记忆 Skill 与传统技能的本质区别

记忆 Skill 与传统技能最大的不同在于它能记住上下文(context)并持久化状态(state persistence)。比如传统天气查询技能每次都是独立请求,而记忆 Skill 可以记住用户上次查询的城市,自动作为默认值。这种连续性体验依赖两个核心技术:上下文保持(context retention)和状态存储(state storage)。

OpenClaw 记忆 Skill 入门指南:从零构建你的第一个记忆增强应用

从零构建天气记忆 Skill

1. 技能注册与 OAuth 配置

先看基础技能注册模板,特别注意带 memory_capabilities 的声明部分:

from openclaw.skill import Skill

class WeatherMemorySkill(Skill):
    def __init__(self):
        super().__init__(
            name="weather_memory",
            description="Weather query with city memory",
            # NOTE: 必须声明记忆权限才能使用存储 API
            memory_capabilities={"read": ["user_preferences"],
                "write": ["user_preferences"]
            },
            oauth_scopes=["weather_api:read"]  # 按需添加第三方 API 权限
        )

2. 记忆存储 API 实战

存储用户偏好的关键代码示例(key-value 结构设计):

def handle_query_intent(self, user_id, context):
    # 尝试读取记忆
    last_city = self.memory.get(f"{user_id}:last_city")

    if not last_city:
        # NOTE: 首次使用时的默认值处理
        return "请告诉我您要查询的城市"

    try:
        weather_data = fetch_weather(last_city)
        return f"{last_city}的天气是{weather_data}"
    except Exception as e:
        # NOTE: 异常时清除错误记忆
        self.memory.delete(f"{user_id}:last_city")
        return "查询失败,请重新指定城市"

3. 上下文关联实现

通过 <<context_id>> 实现多轮对话关联的 JSON 示例:

{
  "context_id": "abcd1234",
  "memory_slots": {
    "user_preferences": {
      "last_city": "北京",
      "unit": "celsius"
    }
  },
  "dialog_state": "awaiting_time_selection"
}

必须掌握的避坑指南

内存泄漏防护

  • 对话 session 务必在结束时清理:
    def on_session_end(self, session_id):
        self.memory.clear(f"{session_id}:*")  # 通配符删除所有相关 key
  • 本地缓存推荐使用 LRU 策略

并发安全策略

方案 适用场景 示例
Redis 分布式环境 使用 WATCH/MULTI 原子操作
本地锁 单机高并发 threading.Lock()

完整 CRUD 示例

def memory_crud_demo(user_id):
    # Create/Update
    self.memory.set(key=f"{user_id}:preferences",
        value={"city": "上海", "unit": "celsius"},
        ttl=3600  # NOTE: 1 小时过期
    )

    # Read
    prefs = self.memory.get(f"{user_id}:preferences")
    if not prefs:
        return "未找到用户设置"

    # Delete
    if prefs["unit"] == "fahrenheit":
        self.memory.delete(f"{user_id}:preferences")

进阶思考方向

  1. 自动过期机制:TTL 与惰性删除如何配合实现?
  2. 跨技能共享:如何通过加密内存槽位实现安全共享?
  3. LLM 增强检索:能否用 embedding 实现语义化记忆搜索?

经过这个教程的实践,你应该已经能处理大部分基础场景。记忆 Skill 真正有趣之处在于——它让机器开始有了『记忆的温度』。当你的技能突然说出『还是按您习惯的摄氏度显示』时,用户脸上的惊喜就是最好的回报。

正文完
 0
评论(没有评论)