当我们使用相同的参数 反复调用同一个节点 时,会浪费大量的资源,这时我们就可以将第一次调用该节点的结果保存起来,也就是cache_policy(缓存策略),当下一次使用相同参数调用该节点时,我们就不需要真正的去执行该节点,只需要去cache中去查询。
关键代码:
python
builder.add_node(
"node_a",
node_a,
cache_policy=CachePolicy(ttl=10),
)
我们需要在将节点加入时配置 cache_policy 。
ttl=10:表示该节点输出结果保存时间为10s,超时后需要重新执行该节点。
python
graph = builder.compile(
cache=InMemoryCache()
)
同时,编译图时还需要添加缓存后端,表示设置缓存的存储方式。
CachePolicy()核心参数:
key_func:生成一个cache的Key,用于查询时使用,默认是使用 input 参数来生成一个对应的Key
ttl:设置缓存存活时间
其中key_func一般不需要配置,默认使用所有input参数生成Key。当然某些情况下我们也可以自定义一个key_func,示例如下:
python
略.................
class State(TypedDict):
user: str
request_id: str
weather: str
def user_cache_key(state: State) -> str:
"""
state 是节点本次收到的输入。
只使用 user 生成缓存键,忽略 request_id。
"""
return state['user']
略.................
builder.add_node(
"get_weather",
get_weather,
cache_policy=CachePolicy(
ttl=60,
key_func=user_cache_key,
),
)
略.................
result1 = graph.invoke({
"user": "小明",
"request_id": "request-001",
})
通过自定义key_func,我们生成Key时只用"user"来生成Key
CachePolicy()基本原理:
1.创建节点任务时生成缓存键:
cache_policy = proc.cache_policy or cache_policy
if cache_policy:
args_key = cache_policy.key_func(val)
cache_key = CacheKey(
namespace=(
CACHE_NS_WRITES,
identifier(proc) or "__dynamic__",
name,
),
key=xxh3_128_hexdigest(args_key),
ttl=cache_policy.ttl,
)