qwen_agent/docs/agent_memory_cache.md
2025-12-23 23:11:24 +08:00

251 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Agent 内存缓存系统
本文档描述了基于 cachetools 实现的 Agent 内存缓存系统。
## 概述
Agent 内存缓存系统使用 cachetools 库在内存中缓存 Agent 实例,提供以下功能:
-**高性能访问**:基于内存存储,访问速度极快(纳秒级)
-**自动过期**:支持设置 TTLTime To Live自动清理过期项
-**LRU 淘汰策略**:当缓存满时,自动淘汰最久未使用的项
-**访问时自动续期**:每次访问时自动延长过期时间
-**线程安全**:使用 RLock 确保多线程并发安全
-**统计信息**:提供详细的缓存命中率等统计信息
## 配置
### 环境变量
可以通过以下环境变量配置缓存行为:
- `TOOL_CACHE_MAX_SIZE`:最大缓存项数(默认:`1000`
- `TOOL_CACHE_TTL`:默认过期时间,秒(默认:`180` = 3分钟
- `TOOL_CACHE_AUTO_RENEW`:是否自动续期(默认:`true`
示例:
```bash
export TOOL_CACHE_MAX_SIZE="500"
export TOOL_CACHE_TTL="300" # 5分钟
export TOOL_CACHE_AUTO_RENEW="false"
```
### 代码配置
```python
from agent.agent_memory_cache import AgentMemoryCacheManager
# 创建缓存管理器
cache = AgentMemoryCacheManager(
max_size=1000, # 最多缓存 1000 个 Agent
default_ttl=180, # 3分钟过期
auto_renew=True # 访问时自动续期
)
```
## 使用方法
### 1. 自动缓存(推荐)
缓存系统已集成到 `init_agent` 函数中,会自动根据配置生成缓存键并缓存 Agent。
```python
from agent.deep_assistant import init_agent
from agent.agent_config import AgentConfig
# 创建配置
config = AgentConfig(
bot_id="your-bot-id",
session_id="user-session-123",
# ... 其他配置
)
# 初始化 Agent会自动使用内存缓存
agent = await init_agent(config)
```
### 2. 手动使用缓存
```python
from agent.agent_memory_cache import get_memory_cache_manager
# 获取全局缓存管理器
cache = get_memory_cache_manager()
# 设置缓存
cache.set("my-key", {"data": "value"}, ttl=300) # 5分钟过期
# 获取缓存
value = cache.get("my-key")
if value is not None:
print("缓存命中!")
print(f"数据: {value}")
else:
print("缓存未命中")
# 删除缓存
cache.delete("my-key")
# 获取统计信息
stats = cache.get_stats()
print(f"命中率: {stats['hit_rate_percent']}%")
print(f"内存使用: {stats['memory_usage_mb']} MB")
print(f"缓存项数: {stats['total_items']}")
```
## 缓存特性详解
### 1. TTLTime To Live过期
每个缓存项都有生存时间,超过时间后自动失效:
```python
# 设置 10 秒过期的缓存
cache.set("temp_data", "value", ttl=10)
# 10 秒后访问会返回 None
```
### 2. 自动续期
`auto_renew=True` 时,每次访问缓存会自动延长其过期时间:
```python
cache.set("data", {"key": "value"}, ttl=60) # 1分钟过期
# 50 秒后访问
value = cache.get("data") # 成功获取,且过期时间重置为 60 秒
```
### 3. LRU 淘汰策略
当缓存达到最大容量时,会自动淘汰最久未使用的项:
```python
cache = AgentMemoryCacheManager(max_size=2)
cache.set("key1", "value1") # 缓存: [key1]
cache.set("key2", "value2") # 缓存: [key1, key2]
cache.set("key3", "value3") # 淘汰 key1缓存: [key2, key3]
```
### 4. 线程安全
缓存管理器使用 RLock 确保线程安全,可以在多线程环境中安全使用:
```python
import threading
def worker(cache, thread_id):
for i in range(100):
cache.set(f"key_{thread_id}_{i}", f"value_{i}")
value = cache.get(f"key_{thread_id}_{i}")
threads = []
for i in range(10):
t = threading.Thread(target=worker, args=(cache, i))
threads.append(t)
t.start()
for t in threads:
t.join() # 安全等待所有线程完成
```
## 缓存管理工具
项目提供了缓存管理脚本:
```bash
# 查看缓存统计
poetry run python scripts/cache_manager.py stats
# 清空所有缓存
poetry run python scripts/cache_manager.py clear
# 列出缓存键
poetry run python scripts/cache_manager.py list
# 删除特定缓存键
poetry run python scripts/cache_manager.py delete my-cache-key
```
## 性能考虑
### 内存使用估算
内存缓存会占用系统内存,每个 Agent 对象的大小取决于其内部状态:
```python
# 获取内存使用估算
stats = cache.get_stats()
print(f"内存使用: {stats['memory_usage_mb']} MB")
```
### 性能优化建议
1. **合理的缓存大小**
- 根据可用内存设置 `max_size`
- 建议不超过可用内存的 20-30%
2. **适当的 TTL**
- 频繁访问的 Agent 可以设置较长的 TTL
- 不常用的 Agent 使用较短的 TTL
3. **监控命中率**
```python
stats = cache.get_stats()
if stats['hit_rate_percent'] < 70:
logger.warning("缓存命中率较低考虑调整 TTL 或缓存大小")
```
4. **定期清理**
```python
# 清理超过 1 小时的缓存
cache.cleanup_old_entries(max_age_seconds=3600)
```
## 与磁盘缓存的比较
| 特性 | 内存缓存 | 磁盘缓存 |
|------|----------|----------|
| 访问速度 | 极快纳秒级 | 较慢毫秒级 |
| 持久化 | 进程重启后丢失 | 持久化保存 |
| 内存占用 | 较高 | 较低 |
| 并发性能 | 优秀 | I/O 限制 |
| 使用场景 | 高频访问临时缓存 | 长期存储低频访问 |
## 注意事项
1. **内存限制**内存缓存受限于系统可用内存注意监控内存使用
2. **进程隔离**每个进程有独立的缓存多进程环境下不共享
3. **重启丢失**服务重启后缓存会丢失首次访问需要重建
4. **合理配置**根据实际需求调整缓存大小和 TTL
## 故障排查
### 缓存命中率低
1. 检查 TTL 是否过短
2. 检查缓存大小是否过小
3. 查看日志中的缓存键是否一致
### 内存使用过高
1. 减少 `max_size` 配置
2. 缩短 TTL 时间
3. 定期调用 `cleanup_old_entries`
### 性能问题
1. 检查是否有大量并发访问
2. 考虑使用连接池或分布式缓存方案
3. 监控 GC垃圾回收压力
## 示例输出
```
INFO: AgentMemoryCacheManager initialized with max_size: 1000, default_ttl: 180s, auto_renew: True
INFO: Using cached agent for session: user-123, cache_key: agent_cache_a1b2c3d4
INFO: Cached agent for key: agent_cache_e5f6g7h8, ttl: 180s
INFO: Cache stats - Total items: 15, Hit rate: 85.5%, Memory: 12.34 MB
```