在构建能与人类长期交互的AI助手时,记忆系统始终是个关键挑战。想象一下:当你问助手"上周我们讨论的营销方案需要调整哪些部分?"时,它需要快速定位到具体对话片段(类似人类的直觉回忆),同时理解这个方案涉及的产品定位、目标人群等关联概念(需要系统性思考)。这正是微软亚洲研究院提出的Mnemis框架要解决的核心问题。
传统检索增强生成(RAG)就像只用关键词搜索的记事本——输入"营销方案"可能找到相关记录,但会遗漏与"用户画像"相关的关键讨论。Mnemis的创新在于模拟了人类大脑的双系统记忆机制:系统1(快速直觉)通过向量相似度检索直接关联内容;系统2(深度思考)则沿着构建的语义层级自上而下扫描,确保不遗漏结构相关的信息。实验证明,这种双路由机制在115K token长度的记忆任务中,准确率比传统方法提升超过20%。
基础图是系统1检索的基石,其构建过程如同为碎片化记忆建立索引卡片系统。具体实现包含四个关键组件:
情节节点(Episodes)
原始对话文本被切分为300-500token的片段,通过bge-small-v1.5模型生成768维向量。我们特别发现,对技术文档类内容采用滑动窗口重叠20%的分块策略,能显著改善后续实体提取的连贯性。
实体节点(Entities)
使用GPT-4-turbo进行命名实体识别时,需要精心设计prompt确保提取粒度一致。例如:
python复制def entity_extraction_prompt(text):
return f"""Identify ALL concrete entities in the text below,
including: persons, organizations, products, locations,
and specific concepts. Output as JSON:
{{"entities": [{{"name": "...", "type": "...", "summary": "..."}}]}}
Text: {text}"""
实验表明,补充实体摘要描述能使后续的边连接准确率提升37%。
关系边(Edges)
采用三元组形式(subject, predicate, object)存储关系。对于"Alex建议修改营销方案中的价格策略"这句话,会生成:
情节边(Episodic Edges)
记录实体出现的原始位置。通过布隆过滤器实现O(1)复杂度的去重判断,确保百万级节点下的实时更新。
层级图是系统2检索的核心,其构建过程犹如为知识建立图书馆分类体系。关键技术在于动态平衡三个相互制约的目标:
抽象粒度控制
每个类别节点需满足:
math复制\frac{|descendants(c)|}{|leaves(c)|} \in [0.2,0.5]
其中分母是该类别下实体节点的数量,分子是直接子类别数。这个压缩比约束确保类别既不过于宽泛也不过分具体。
多维分类机制
允许实体属于多个父类别。例如"特斯拉Model 3"可能同时存在于:
增量更新算法
当新增实体时,采用贪心算法寻找最优父类别:
python复制def find_parent_categories(entity, graph):
candidates = []
for cat in graph.categories:
similarity = cos_sim(entity.embedding, cat.centroid)
if similarity > 0.7:
candidates.append((cat, similarity))
return sorted(candidates, key=lambda x: -x[1])[:3]
类别中心向量每新增100个实体重新计算一次,保持表征时效性。
系统1路由融合了两种检索范式:
混合检索策略
math复制score_{RRF} = \sum_{r \in ranks} \frac{1}{60 + r}
实验显示参数k=60时在准确率和召回率间取得最佳平衡。
图扩散增强
对初步检索结果执行2跳图扩散,发现隐式关联实体。例如搜索"服务器宕机"时,会自动关联到相同机房的其他设备告警记录。
系统2路由模仿人类深度思考过程:
层级引导生成
用LLM将用户查询重写为类别路径:
code复制用户问:"去年欧洲市场的销售趋势"
→ ["地理/欧洲", "业务数据/销售", "时间维度/年度"]
采用思维链(CoT)提示确保路径合理性。
多路径探索
沿每条路径向下遍历时,维护一个优先级队列:
python复制def hierarchical_search(query_path, graph):
queue = PriorityQueue()
queue.put((1.0, graph.root))
results = []
while not queue.empty():
priority, node = queue.get()
if node.is_leaf():
results.append(node.entity)
continue
for child in node.children:
sim = compute_similarity(query_path, child)
queue.put((sim * priority, child))
return results
这种设计能同时探索多条语义路径。
动态剪枝策略
当路径优先级<0.2或深度>5时终止搜索,避免无意义遍历。实际测试中这节省了78%的计算开销。
索引分层设计
检索流水线优化
mermaid复制graph LR
A[用户查询] --> B{简单查询?}
B -->|是| C[系统1路由]
B -->|否| D[双路由并行]
C --> E[结果聚合]
D --> E
E --> F[重排序]
通过轻量级分类器预判查询类型,使平均响应时间从320ms降至190ms。
实体消歧失败
现象:相同名称实体被错误合并
解决方案:
层级漂移问题
现象:类别语义随时间发生偏移
监控指标:
math复制drift_score = 1 - \frac{|C_t \cap C_{t+1}|}{|C_t \cup C_{t+1}|}
当drift_score > 0.3时触发重新聚类。
检索结果过载
现象:返回太多无关片段
调节方案:
在金融领域实战中,我们将Mnemis应用于投研助手系统:
财报交叉分析
当询问"某公司毛利率下降原因"时,系统能自动关联:
监管合规审计
通过构建法律条文层级图,可快速定位分散在不同法规中的相关条款,使合规检查效率提升4倍。
客户画像演进
客户的购买记录、服务请求等被自动组织为动态更新的画像层级,支持精准营销。
这个框架最令我惊讶的是其对模糊查询的处理能力。当用户提出"找那个关于云端的东西...好像是和存储优化有关的"这类模糊需求时,双路由机制能通过层级图的语义辐射范围,找到3个月前一次讨论存储成本优化的会议记录——这正是人类助理的工作方式。未来我们计划引入视觉模态处理,使系统能同时解析演示文档中的图表信息。