共计 1793 个字符,预计需要花费 5 分钟才能阅读完成。
记忆 Skill 与传统技能的本质区别
记忆 Skill 与传统技能最大的不同在于它能记住上下文(context)并持久化状态(state persistence)。比如传统天气查询技能每次都是独立请求,而记忆 Skill 可以记住用户上次查询的城市,自动作为默认值。这种连续性体验依赖两个核心技术:上下文保持(context retention)和状态存储(state storage)。

从零构建天气记忆 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")
进阶思考方向
- 自动过期机制:TTL 与惰性删除如何配合实现?
- 跨技能共享:如何通过加密内存槽位实现安全共享?
- LLM 增强检索:能否用 embedding 实现语义化记忆搜索?
经过这个教程的实践,你应该已经能处理大部分基础场景。记忆 Skill 真正有趣之处在于——它让机器开始有了『记忆的温度』。当你的技能突然说出『还是按您习惯的摄氏度显示』时,用户脸上的惊喜就是最好的回报。
正文完
