Show HN: Muscle-Mem, a behavior cache for AI agents
Show HN:Muscle-Mem,一个用于 AI Agent 的行为缓存
muscle-mem
是一个用于 AI Agent 的行为缓存。
它是一个 Python SDK,可以记录你的 Agent 在解决任务时的工具调用模式,并在再次遇到该任务时确定性地重放这些学习到的轨迹。如果在检测到边缘情况时,则回退到 Agent 模式。
muscle-mem
的目标是将 LLM 从重复性任务的热路径中移除,从而提高速度,减少可变性,并消除对于那些 * 本来可以只是一个脚本 * 的场景的 token 成本。
这是一个未被探索的领域,欢迎所有反馈!
- 阅读 Muscle Mem - Removing LLM calls from Agents 了解更多背景信息。
- 加入 Muscle Mem discord 参与反馈。
开发日志
- 2025 年 5 月 7 日 - 第一个可用的演示
- 2025 年 5 月 8 日 - 开源
工作原理
muscle-mem
* 不是 * 另一个 Agent 框架。你可以按照自己的方式实现你的 Agent,然后将其插入到 muscle-mem
的引擎中。当给定一个任务时,引擎将:
- 使用
Checks
确定环境是否之前已经遇到过(缓存命中),或者是一个新的环境(缓存未命中)。 - 执行任务,可以通过两种方式:
- 在缓存命中的情况下,使用检索到的轨迹。
- 在缓存未命中的情况下,将任务传递给你的 Agent。
- 收集工具调用事件,并将其作为新的轨迹添加到缓存中。
缓存验证是关键
为了将安全的工具重用添加到你的 Agent,关键问题在于缓存验证。问你自己:
对于我们提供给 Agent 的每个工具,可以使用环境中的哪些特征来指示执行该操作是否安全?
如果你可以回答这个问题,你的 Agent 就可以拥有 Muscle Memory(肌肉记忆)。
API
安装
pip install muscle-mem
Engine(引擎)
Engine 封装了你的 Agent,并作为任务的主要执行者。它管理自己的先前轨迹缓存,并确定何时调用你的 Agent。
from muscle_mem import Engine
engine = Engine()
engine.set_agent(your_agent)
# 你的 agent 可以独立调用
your_agent("do some task")
# engine 提供了相同的接口,但具有肌肉记忆
engine("do some task")
engine("do some task") # 缓存命中
Tool(工具)
@engine.tool
装饰器会对动作执行工具进行检测,以便将其调用记录到 Engine 中。
from muscle_mem import Engine
engine = Engine()
@engine.tool()
def hello(name: str):
print(f"hello {name}!")
hello("world") # hello 的调用被存储,参数 name="world"
Check(检查)
Check 是缓存验证的基本构建块。它们确定执行给定操作是否安全。每个 Check 封装了:
- 一个
capture
回调,用于从当前环境中提取相关特征。 - 一个
compare
回调,用于确定当前环境是否与缓存的环境匹配。
Check(
capture: Callable[P, T],
compare: Callable[[T, T], Union[bool, float]],
):
你可以将 Check 附加到每个工具 @engine.tool
,以强制执行缓存验证。这可以在工具调用之前作为 precheck(也用于查询时验证),或者在工具调用之后作为 postcheck 完成。
下面是一个人为设计的示例,它捕获了 hello
工具的使用,并使用时间戳和一秒钟的过期时间作为 Check 机制来验证缓存。
# 我们的 capture 实现,接受参数并返回 T
def capture(name: str) -> T:
now = time.time()
return T(name=name, time=now)
# 我们的 compare 实现,接受 current 和 candidate T
def compare(current: T, candidate: T) -> bool:
# 如果发生在最后一秒内,则缓存有效
diff = current.time - candidate.time
passed = diff <= 1
return passed
# 使用 precheck 装饰我们的工具
@engine.tool(pre_check=Check(capture, compare))
def hello(name: str):
time.sleep(0.1)
print(f"hello {name}")
整合在一起
下面是将上述所有代码片段组合在一起的脚本。
from dataclasses import dataclass
from muscle_mem import Check, Engine
import time
engine = Engine()
# 我们的“环境”特征,存储在 DB 中
@dataclass
class T:
name: str
time: float
# 我们的 capture 实现,接受参数并返回 T
def capture(name: str) -> T:
now = time.time()
return T(name=name, time=now)
# 我们的 compare 实现,接受 current 和 candidate T
def compare(current: T, candidate: T) -> bool:
# 如果发生在最后一秒内,则缓存有效
diff = current.time - candidate.time
passed = diff <= 1
return passed
# 使用 precheck 装饰我们的工具
@engine.tool(pre_check=Check(capture, compare))
def hello(name: str):
time.sleep(0.1)
print(f"hello {name}")
# 假设这是你的 agent
def agent(name: str):
for i in range(9):
hello(name + " + " + str(i))
engine.set_agent(agent)
# 运行一次
cache_hit = engine("erik")
assert not cache_hit
# 再次运行
cache_hit = engine("erik")
assert cache_hit
# 通过 sleep 打破缓存,然后再次运行
time.sleep(3)
cache_hit = engine("erik")
assert not cache_hit
对于一个更真实的例子,请参见计算机使用代理的实现:
https://github.com/pig-dot-dev/muscle-mem/blob/main/tests/cua.py
行动号召
我邀请大家提供反馈,因为这个系统还在开发中!
请考虑:
- 加入 Muscle Mem discord
- 测试 the muscle-mem repo,并给它一个 star。
关于
一个用于 AI Agent 学习和重放复杂行为的缓存。
资源
许可证
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published