当前位置: 首页 > news >正文

多模态记忆:让 AI Agent 记忆各种类型的信息

多模态记忆:让 AI Agent 记忆各种类型的信息

前言

多模态记忆是指让 AI Agent 能够记忆和理解多种类型的信息,包括文本、图像、音频等。这能显著提升 Agent 的能力。

我在多个项目中实现过多模态记忆,今天分享一些设计和实现。

记忆项设计

from dataclasses import dataclass, field from typing import Dict, Any, Optional, List from enum import Enum import hashlib import time class MemoryType(Enum): """记忆类型""" TEXT = "text" IMAGE = "image" AUDIO = "audio" DOCUMENT = "document" CODE = "code" DIALOGUE = "dialogue" @dataclass class MemoryItem: """记忆项""" id: str type: MemoryType content: Any metadata: Dict[str, Any] = field(default_factory=dict) embedding: Optional[List[float]] = None timestamp: float = field(default_factory=time.time) importance: float = 1.0 tags: List[str] = field(default_factory=list) access_count: int = 0 last_access: Optional[float] = None def generate_id(self): """生成唯一 ID""" content_str = str(self.content) return hashlib.md5((content_str + str(self.timestamp)).encode()).hexdigest() def to_dict(self) -> Dict[str, Any]: """转换为字典""" return { "id": self.id, "type": self.type.value, "content": self.content, "metadata": self.metadata, "embedding": self.embedding, "timestamp": self.timestamp, "importance": self.importance, "tags": self.tags, "access_count": self.access_count, "last_access": self.last_access }

多模态 Embedding

from typing import List, Any class MultimodalEmbedder: """多模态 Embedding 生成器""" def __init__(self): # 这里应该加载实际的模型 self.text_model = None # 文本模型 self.image_model = None # 图像模型 def embed_text(self, text: str) -> List[float]: """文本 Embedding""" # 实际实现应该调用真实模型 return [0.0] * 768 # 示例 def embed_image(self, image_data: bytes) -> List[float]: """图像 Embedding""" # 实际实现应该调用真实模型 return [0.0] * 768 # 示例 def embed(self, memory: MemoryItem) -> List[float]: """通用 Embedding""" if memory.type == MemoryType.TEXT: return self.embed_text(str(memory.content)) elif memory.type == MemoryType.IMAGE: return self.embed_image(memory.content) else: # 其他类型转为文本处理 return self.embed_text(str(memory.content))

记忆存储

from typing import List, Dict, Any, Optional import faiss import numpy as np class MemoryStore: """记忆存储""" def __init__(self, dimension: int = 768): self.dimension = dimension self.memories: Dict[str, MemoryItem] = {} self.index: Optional[faiss.Index] = None self.embeddings: List[List[float]] = [] self.id_map: List[str] = [] self.embedder = MultimodalEmbedder() def add(self, memory: MemoryItem): """添加记忆""" if not memory.id: memory.id = memory.generate_id() # 生成 Embedding if not memory.embedding: memory.embedding = self.embedder.embed(memory) # 存储 self.memories[memory.id] = memory self.embeddings.append(memory.embedding) self.id_map.append(memory.id) # 重建索引 self._rebuild_index() def add_batch(self, memories: List[MemoryItem]): """批量添加""" for memory in memories: self.add(memory) def _rebuild_index(self): """重建索引""" if not self.embeddings: self.index = None return vectors = np.array(self.embeddings).astype(np.float32) self.index = faiss.IndexFlatL2(self.dimension) self.index.add(vectors) def retrieve(self, query: Any, top_k: int = 5) -> List[MemoryItem]: """检索相关记忆""" # 将查询转为 embedding if isinstance(query, str): query_emb = self.embedder.embed_text(query) else: # 处理其他类型 query_emb = [0.0] * self.dimension # 搜索 query_vec = np.array([query_emb]).astype(np.float32) if self.index is None: return [] scores, indices = self.index.search(query_vec, min(top_k, len(self.id_map))) # 获取结果 results = [] for idx in indices[0]: if idx >= 0 and idx < len(self.id_map): memory_id = self.id_map[idx] memory = self.memories[memory_id] memory.access_count += 1 memory.last_access = time.time() results.append(memory) return results

记忆组织

from typing import List from collections import defaultdict class MemoryOrganizer: """记忆组织者""" def __init__(self, store: MemoryStore): self.store = store def get_by_type(self, mem_type: MemoryType) -> List[MemoryItem]: """按类型获取""" return [ mem for mem in self.store.memories.values() if mem.type == mem_type ] def get_by_tag(self, tag: str) -> List[MemoryItem]: """按标签获取""" return [ mem for mem in self.store.memories.values() if tag in mem.tags ] def get_recent(self, limit: int = 10) -> List[MemoryItem]: """获取最近的记忆""" sorted_memories = sorted( self.store.memories.values(), key=lambda m: m.timestamp, reverse=True ) return sorted_memories[:limit] def get_important(self, limit: int = 10) -> List[MemoryItem]: """获取重要的记忆""" sorted_memories = sorted( self.store.memories.values(), key=lambda m: m.importance, reverse=True ) return sorted_memories[:limit]

完整记忆系统

class MultimodalMemorySystem: """多模态记忆系统""" def __init__(self): self.store = MemoryStore() self.organizer = MemoryOrganizer(self.store) def add_memory(self, content: Any, mem_type: MemoryType, metadata: Dict = None, tags: List[str] = None): """添加记忆""" memory = MemoryItem( id="", type=mem_type, content=content, metadata=metadata or {}, tags=tags or [] ) self.store.add(memory) return memory def recall(self, query: str, top_k: int = 5) -> List[MemoryItem]: """回忆相关记忆""" return self.store.retrieve(query, top_k) def get_recent_history(self, limit: int = 20) -> List[MemoryItem]: """获取最近的历史""" return self.organizer.get_recent(limit)

总结

多模态记忆要点:

  1. 记忆表示:多类型统一表示
  2. 嵌入生成:多模态 Embedding
  3. 存储检索:高效存储和检索
  4. 组织管理:按类型、标签等组织
  5. 生命周期:重要性评估和老化

实践建议:

  • 从文本记忆开始
  • 逐步支持更多模态
  • 设计合理的重要性评估
  • 考虑记忆清理策略
http://www.jsqmd.com/news/924538/

相关文章:

  • 5分钟解锁你的网易云音乐收藏:ncmdumpGUI完全指南
  • Rust测试模式:构建高效可靠的测试体系
  • 2026年4月行业内比较好的轨距拉杆直销厂家找哪家,道钉锚固剂/鱼尾螺栓/RGV轨道/轨距拉杆,轨距拉杆公司哪个好 - 品牌推荐师
  • 2026 玻璃钢罐厂家专业评测榜 、推荐排行 ! - 资讯纵览
  • AI儿童绘本生成:技术架构、实战难点与未来展望
  • 网络规划设计师案例要求
  • 3步掌控你的数字记忆:WeChatMsg微信聊天记录永久保存终极指南
  • 【Gemini诗歌生成高阶秘籍】:20年AI内容专家亲授7大避坑法则与韵律控制心法
  • 基于Arduino与3D打印的六轮摇臂转向机器人平台设计与实现
  • 2026 年贵州铜仁职业培训怎么选?本地综合培训机构全面解析 - 资讯纵览
  • 记忆压缩:高效管理 AI Agent 的记忆
  • 想写一个找车app,但是汽油车,没有电,如何跟app连接通讯呢?
  • Rust性能测试与基准测试:优化代码性能
  • 3步掌握X-Spider:告别繁琐的推特媒体收集工作
  • 基于Atmega1284P的Arduino兼容板DIY全流程解析
  • Arduino NANO程序上传失败?CH340G驱动与硬件时钟问题全解析
  • 从废旧灯带自制Arduino RGB LED模块:变废为宝的电子外科手术
  • 为什么92%的Gemini私有部署未启用内存隔离?——2024 Q2第三方审计报告首次公开,含3步热修复补丁
  • 2026武汉黄金回收多少钱一克?靠谱商家推荐TOP3,13区全域免费上门当场到账 - 资讯纵览
  • OpenCV 是什么?能做什么?一张图看懂计算机视觉入门
  • Windows微信QQ防撤回终极指南:一键永久保存所有消息的完整教程
  • 基于Arduino Leonardo的倒计时手表制作:从硬件连接到状态机编程
  • Xenia Canary终极指南:5个专业技巧实现Xbox 360游戏完美模拟
  • 别再用gsutil硬拷!Gemini迁移性能瓶颈定位图谱(含CPU/内存/网络I/O三维压测基准值)
  • 长期记忆存储:构建持久的 AI 记忆系统
  • 从‘more than one device‘到‘appActivity‘报错:一次完整的Android自动化测试踩坑实录
  • 基于Arduino Leonardo的街机外设DIY:从HID原理到实战开发
  • while循环结构以及具体用法
  • GPT还是MBR?给SATA/NVMe固态硬盘分区选错,重装系统白忙活
  • 基于Arduino Leonardo的头部控制游戏控制器设计与实现