Show HN:Muscle-Mem,一个用于 AI Agent 的行为缓存

muscle-mem 是一个用于 AI Agent 的行为缓存。

它是一个 Python SDK,可以记录你的 Agent 在解决任务时的工具调用模式,并在再次遇到该任务时确定性地重放这些学习到的轨迹。如果在检测到边缘情况时,则回退到 Agent 模式。

muscle-mem 的目标是将 LLM 从重复性任务的热路径中移除,从而提高速度,减少可变性,并消除对于那些 * 本来可以只是一个脚本 * 的场景的 token 成本。

这是一个未被探索的领域,欢迎所有反馈!

开发日志

工作原理

muscle-mem * 不是 * 另一个 Agent 框架。你可以按照自己的方式实现你的 Agent,然后将其插入到 muscle-mem 的引擎中。当给定一个任务时,引擎将:

  1. 使用 Checks 确定环境是否之前已经遇到过(缓存命中),或者是一个新的环境(缓存未命中)。
  2. 执行任务,可以通过两种方式:
    • 在缓存命中的情况下,使用检索到的轨迹。
    • 在缓存未命中的情况下,将任务传递给你的 Agent。
  3. 收集工具调用事件,并将其作为新的轨迹添加到缓存中。

缓存验证是关键

为了将安全的工具重用添加到你的 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 封装了:

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

行动号召

我邀请大家提供反馈,因为这个系统还在开发中!

请考虑:

  1. 加入 Muscle Mem discord
  2. 测试 the muscle-mem repo,并给它一个 star。

关于

一个用于 AI Agent 学习和重放复杂行为的缓存。

资源

Readme

许可证

Apache-2.0 license

Activity

Custom properties

Stars

39 stars

Watchers

0 watching

Forks

1 fork

Report repository

Releases

No releases published

Packages 0

No packages published

Languages