Impression-based hierarchical memory management library for AI applications with Redis storage
Project description
ImpressMem
给 AI Agent 的印象式记忆系统 —— 不做向量检索,不做复杂召回漏斗,用 Redis zset + LLM 理解能力实现轻量记忆,依赖只有
redis一个包。
ImpressMem 模拟人类"形成印象"的认知方式,让 AI Agent 拥有轻量、高效、可自进化的长期记忆能力。它不依赖向量数据库、不需要 embedding 模型、不需要部署额外服务,只需要一个 Redis 实例。
为什么选 ImpressMem?
现有的 AI 记忆方案功能强大,但往往需要向量数据库、embedding 模型、内部自动调用 LLM 做信息抽取,安装依赖多、部署复杂。
如果你只是想给 AI Agent 加一个轻量记忆,不想折腾这些基础设施,ImpressMem 就是为你准备的:
- 零向量数据库 —— 不需要 Qdrant/Chroma/Pinecone,不需要 embedding 模型
- 单依赖 ——
pip install impressmem只装redis,没有 torch/numpy/openai 一堆东西 - 不调用 LLM —— ImpressMem 本身是纯存储/检索工具,LLM 调用完全由你控制
- 印象式认知模型 —— 三级结构(category/label/clue)+ 时间衰减 + 自动合并冗余,模拟人类形成印象的方式
- OpenAI function calling 原生支持 —— 3 个工具直接塞进
tools参数就能用
架构
┌─────────────────────────────────────────────────────────┐
│ AI Agent / LLM │
│ ┌─────────────┐ ┌──────────────┐ ┌────────────────┐ │
│ │ Save Tool │ │ Recall Tool │ │ Organize Tool │ │
│ └──────┬──────┘ └──────┬───────┘ └───────┬────────┘ │
│ │ │ │ │
│ └────────────────┼───────────────────┘ │
│ │ │
│ ┌───────────▼───────────┐ │
│ │ slice_new_turn_msgs │ ← 渐进式沉淀 │
│ └───────────┬───────────┘ │
└──────────────────────────┼───────────────────────────────┘
│
┌──────▼──────┐
│ Redis zset │ category/label/clue
└─────────────┘
Installation
pip install impressmem
Requires Python 3.8+ and a running Redis instance (default: localhost:6379).
Quick Start
import asyncio
from impressmem import ImpressMemConfig, ImpressMemManager
async def main():
config = ImpressMemConfig(
bot_name="MyAssistant",
redis_config={"host": "localhost", "port": 6379, "db": 0},
)
manager = ImpressMemManager(config)
# 获取记忆上下文,直接塞进 LLM 的 system prompt
memory_context = await manager.build_memory_context()
print(memory_context)
await manager.close()
asyncio.run(main())
实战场景
ImpressMem 在实战中有两种典型用法:
场景一:Agent 原生工具(主动调用)
三个 Tool 类实现了 OpenAI function calling 接口,直接作为工具注册给 Agent,让 LLM 在对话中自主决定何时保存、回忆、整理记忆:
import json
from impressmem import (
ImpressMemConfig, ImpressMemManager,
SaveImpressionsTool, RecallImpressionsTool, OrganizeImpressionsTool
)
config = ImpressMemConfig(bot_name="MyAssistant", redis_config={"host": "localhost"})
manager = ImpressMemManager(config)
# 初始化三个工具
save_tool = SaveImpressionsTool(manager)
recall_tool = RecallImpressionsTool(manager)
organize_tool = OrganizeImpressionsTool(manager)
# 获取 OpenAI function calling 格式的工具定义
tools = [
save_tool.get_definition(),
recall_tool.get_definition(),
organize_tool.get_definition(),
]
# 传给 LLM 的 tools 参数即可,Agent 会自主调用
# response = await openai.chat.completions.create(
# model="gpt-4",
# messages=messages,
# tools=tools,
# )
# 执行工具调用时(支持批量,一次保存多条碎片化印象):
# full_result, summary = await save_tool.execute(json.dumps({
# "impressions": [
# {"clue": "USER-PREF-COLOR", "content": "用户喜欢紫色主题", "category": "UserPreference", "labels": ["Color", "UI"]},
# {"clue": "USER-PREF-LANG", "content": "偏好中文回复", "category": "UserPreference", "labels": ["Language"]},
# ]
# }))
场景二:渐进式被动沉淀(自动记忆)
搭配 slice_new_turn_messages() 方法,在每轮对话结束后自动蒸馏关键信息,实现"不需要 Agent 主动记,系统自动沉淀印象"的效果。
个人助手实践示例:ai-bot-brain/impression_manager.py 中的 maintain_impressions_by_llm 方法,在 Agent 每一次模型轮结束后触发:
用户消息 → LLM 回复 → 模型轮结束
↓
slice_new_turn_messages(full_history) ← 切出本轮增量消息
↓
构建上下文(已有记忆 + 本轮消息 + Save/Organize 工具定义)
↓
LLM 自主判断:是否有新信息需要保存?是否有冗余记忆需要合并?
↓
自动调用 SaveImpressionsTool / OrganizeImpressionsTool 执行沉淀
核心实现思路:
from impressmem import slice_new_turn_messages
# 1. 每轮对话结束后,切出本轮增量消息
new_turn = slice_new_turn_messages(full_message_history)
# 2. 获取记忆维护的 system prompt(指导 LLM 分析消息、判断是否需要保存/合并)
maintain_prompt = manager.get_maintain_prompt()
# 返回 str,指导 LLM 分析新消息、判断是否需要保存印象或合并冗余
# 3. 获取记忆维护所需的工具定义(SaveImpressionsTool + OrganizeImpressionsTool)
maintain_tools = manager.get_maintain_tool_definitions()
# 返回 List[Dict[str, Any]],可直接传给 LLM 的 tools 参数
# 4. 构建请求并调用 LLM
messages_for_llm = [
{"role": "system", "content": await manager.build_memory_context()},
*new_turn,
{"role": "user", "content": maintain_prompt},
]
response = await openai.chat.completions.create(
model="doubao-seed-2.0-lite",
messages=messages_for_llm,
tools=maintain_tools,
)
# 5. 批量执行 LLM 返回的工具调用(自动分发到 save/organize 工具)
await manager.execute_maintain_tool_calls(response.choices[0].message.tool_calls)
# 参数: Optional[List[Dict[str, Any]]] — LLM response 中的 tool_calls 列表
# 每个 tool_call 格式: {"function": {"name": "...", "arguments": "<json_string>"}}
# 无法识别的工具名会被跳过并记录 warning,执行异常会被捕获并记录 error
两种模式可以同时使用:Agent 主动记重要信息 + 系统被动沉淀日常细节,形成完整的记忆体系。
记忆模型
ImpressMem 使用三级印象结构:
- Category(分类):顶层分类,如
UserPreference、Finance、Health - Label(标签):具体属性标签,如
Color、Diet、Schedule - Clue(线索):最细粒度的记忆线索,如
USER-PREF-COLOR、DIANDIAN-FEEDING
每条印象包含:clue(唯一标识)、content(信息内容)、category、labels、pin(是否置顶)。记忆按时间衰减,置顶印象永久保留,系统自动合并冗余信息。
Configuration
ImpressMemConfig(
bot_name: str, # Agent 名称,用作 Redis key 前缀
redis_config: Dict[str, Any], # Redis 连接配置
categories_per_set: int = 500, # 每轮上下文最大分类数
labels_per_set: int = 1500, # 每轮上下文最大标签数
clues_per_set: int = 500, # 每轮上下文最大线索数
impression_text_units_per_set: int = 15000, # 每轮上下文最大文本单元
unpinned_emoji: str = "⚪", # 非置顶印象标记
pinned_emoji: str = "📌", # 置顶印象标记
)
redis_config 接受传统参数字典:{"host": "localhost", "port": 6379, "db": 0, "password": "xxx"}
Core API
ImpressMemManager
manager = ImpressMemManager(config)
# 构建记忆上下文(用于 LLM system prompt)
memory_context = await manager.build_memory_context()
# 关闭连接
await manager.close()
Tools
三个工具类均提供两个方法:
get_definition()→ 返回 OpenAI function calling 格式的 JSON schemaexecute(json_args)→ 执行操作,返回(full_result, summary)元组
| Tool | 用途 |
|---|---|
SaveImpressionsTool |
批量保存多条印象(支持碎片化存储),自动去重更新 |
RecallImpressionsTool |
按 category/labels 检索相关印象 |
OrganizeImpressionsTool |
合并冗余分类/标签/线索,清理记忆结构 |
Utility Functions
from impressmem import slice_new_turn_messages
# 从完整对话历史中切出最新一轮消息
# 用于渐进式记忆沉淀
sliced = slice_new_turn_messages(messages)
Examples
See the examples/ directory:
context_example.py- 构建记忆上下文tools_example.py- 使用三个工具类
Contributing
Contributions welcome! Feel free to submit issues and pull requests.
License
MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file impressmem-0.4.1.tar.gz.
File metadata
- Download URL: impressmem-0.4.1.tar.gz
- Upload date:
- Size: 26.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
993cfbf43e29bf6da0a70ec0dad1cbc14be39c693ca41e2edcdda43bd97582d3
|
|
| MD5 |
502ce2a09bb54045018c13c7cacf85e0
|
|
| BLAKE2b-256 |
774774ad7020dc641632c5fae7c357c13d0d9c6ce766ffbc3d15ae9c3c60ccf9
|
File details
Details for the file impressmem-0.4.1-py3-none-any.whl.
File metadata
- Download URL: impressmem-0.4.1-py3-none-any.whl
- Upload date:
- Size: 23.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48a18f2363042fa500aefc7bd0749f14103bb16cc88c915782ff84689cef21c9
|
|
| MD5 |
f2a552d28041b1e22c93c8b1a9477d0e
|
|
| BLAKE2b-256 |
bb1547ab8d06c5dbc6a313011b81ac4d118d0c3fd0978843d29fdbbab6b903dc
|