
企业微信

飞书
选择您喜欢的方式加入群聊

扫码添加咨询专家
每一次对话都是孤岛——这是传统 AI 助手的痛点。用户说过的偏好、纠正过的错误、建立过的上下文,在下一次对话中全部丢失。AskTable 最新引入的跨会话记忆系统,正在打破这一困局。
┌─────────────────────────────────────────┐
│ 对话 1 │
│ 用户:华东销售是多少? │
│ AI:1200 万 │
│ 用户:什么时间的?以后回答销售额这类指标,│
│ 应该带上具体时间 │
│ AI:好的。2026年Q1华东销售是1200万 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 对话 2(之后任意时间) │
│ 用户:华东利润怎么样? │
│ AI:2026年Q1净利润350万, │
│ 同比+18%,环比+5% │ ← 自动带上时间
└─────────────────────────────────────────┘
问题根源:传统架构中,对话历史只在单次会话内有效。
这种"失忆"导致:
AskTable 选择了 mem0 OSS 作为记忆框架,核心原因:
| 考量 | mem0 优势 |
|---|---|
| 开箱即用 | 内置去重、冲突消解、过期机制 |
| API 简洁 | add / search / get_all / delete 四个核心方法 |
| 可替换性 | 通过 Protocol 抽象,后续可切换到自研方案 |
| 异步支持 | 原生 AsyncMemory,与 asyncio 架构完美契合 |
┌─────────────────────────────────────────────────────────────┐
│ AskTable 向量存储架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Qdrant │ │ Qdrant │ │
│ │ (已有) │ │ (记忆专用) │ │
│ │ 元数据检索 │ │ 跨会话记忆 │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ 共享基础设施,降低运维成本 │
│ │
└─────────────────────────────────────────────────────────────┘
复用已有的 Qdrant 实例,不引入新的基础设施依赖。
┌─────────────────────────────────────────────────────────────┐
│ 记忆系统工作流 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 对话开始 │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Memory Search │ ← 用当前问题检索相关记忆 │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 格式化并注入 │ ← 拼入 System Prompt │
│ │ memory_context │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Agent 生成回复 │ ← 携带记忆上下文 │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Memory Write │ ← 对话结束后异步写入(fire-and-forget) │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
读取(Search)在请求开始时:
写入(Add)在回复完成后:
┌─────────────────────────────────────────────────────────────┐
│ 记忆隔离模型 │
├─────────────────────────────────────────────────────────────┤
│ │
│ DataAgent-A │
│ ┌─────────────────────────────────┐ │
│ │ 记忆空间:agent_id = "agent-a" │ │
│ │ - 用户偏好 │ │
│ │ - 常用报表 │ │
│ │ - 分析习惯 │ │
│ └─────────────────────────────────┘ │
│ │
│ DataAgent-B (独立记忆) │
│ ┌─────────────────────────────────┐ │
│ │ 记忆空间:agent_id = "agent-b" │ │
│ │ - 不同的用户偏好 │ │
│ │ - 不同的业务场景 │ │
│ └─────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
设计原则:同一 Data Agent 下的所有用户共享记忆(团队知识库模式)。
class MemoryService(Protocol):
"""记忆服务抽象,支持后续替换"""
async def add(
self,
messages: list[dict],
agent_id: str,
metadata: dict | None = None
) -> list[str]: ...
async def search(
self,
query: str,
agent_id: str,
top_k: int = 5
) -> list[MemoryItem]: ...
async def get_all(
self,
agent_id: str
) -> list[MemoryItem]: ...
async def delete(
self,
memory_id: str
) -> None: ...
价值:通过 Protocol 抽象,确保 mem0 只是实现之一,后续可平滑切换到自研方案。
# 从记忆中提取关键信息,格式化为自然语言
MEMORY_CONTEXT_TEMPLATE = """
## 历史记忆
{relevance_memories}
以下是与你相关的历史信息,请结合这些上下文来回答用户的问题。
"""
示例输出:
## 历史记忆
- 用户提问销售额、利润率等指标时,应带上具体时间段(2026-04-01)
- 用户主要关注华东区域的数据(2026-03-15)
- 偏好在图表中显示同比和环比增长率(2026-03-20)
以下是与你相关的历史信息,请结合这些上下文来回答用户的问题。
async def run_conversation_task(ctx: Context, ...):
# ... 执行对话 ...
# 释放锁之后,异步写入记忆
await release_lock()
await stream_end()
# Fire-and-forget,不阻塞用户收到回复
asyncio.create_task(
memory_service.add(
messages=full_conversation,
agent_id=data_agent_id
)
)
Before(无记忆):
用户:华东销售是多少?
AI:1200 万
用户:什么时间的?
AI:这是 Q1 的数据
用户(另一天):华东利润怎么样?
AI:2026年Q1净利润350万
[没有时间维度,不知道是哪个时间段]
After(有记忆):
用户:华东销售是多少?
AI:1200 万
用户:什么时间的?以后回答销售额这类指标,应该带上具体时间
AI:好的。2026年Q1华东销售是1200万
用户(另一天):华东利润怎么样?
AI:2026年Q1净利润350万,同比+18%,环比+5%
← 自动带上时间维度,无需重复说明
| 场景 | 无记忆 | 有记忆 |
|---|---|---|
| 数据查询 | 每次问区域、时间范围 | 自动使用偏好设置 |
| 报表生成 | 每次指定格式 | 自动按习惯生成 |
| 异常分析 | 每次说明关注指标 | 自动追踪历史关注点 |
| 趋势解读 | 每次解释业务背景 | 自动关联历史洞察 |
系统为 Data Agent 配置页面新增了 "Memories" Tab:
挑战:mem0 每次
add() 需要 1-2 次 LLM 调用提取事实。
应对:
memory_enabled 开关)挑战:mem0 的事实提取 prompt 主要面向英文。
应对:
挑战:记忆错误时,需要 trace mem0 内部链路。
应对:
| 方案 | 记忆粒度 | 实现难度 | 维护成本 | 适用场景 |
|---|---|---|---|---|
| Session Storage | 会话级 | 低 | 低 | 临时存储 |
| User KV Store | 用户级 | 中 | 中 | 简单偏好 |
| mem0 | Agent 级 | 中 | 中 | 复杂上下文 |
| 自研向量库 | 灵活 | 高 | 高 | 深度定制 |
AskTable 的选择:mem0 是"快速验证"路径,Protocol 抽象为"长期演进"留有余地。
如果 mem0 在中文数据分析场景表现不佳,可切换到自研方案:
已有基础设施:
├── Qdrant (向量存储)
├── BAAI/bge-small-zh-v1.5 (Embedding)
└── Langfuse (观测)
自研需解决:
├── 事实提取 Prompt
├── 去重/冲突策略
└── 记忆衰减机制
AskTable 跨会话记忆系统的引入,标志着 AI 数据分析助手从"响应式工具"向"智能化伙伴"的进化:
核心价值:
技术亮点:
产品意义: 记忆系统让 AI 真正"认识"了用户,而不只是回答问题。这是从"工具"到"助手"的关键一步。