AI智能体记忆守护进程:构建持久化语义记忆系统的架构与实践

news2026/5/5 7:18:20
1. 项目概述一个为AI智能体设计的记忆守护进程最近在折腾AI智能体Agent项目时我遇到了一个几乎所有开发者都会头疼的经典问题记忆管理。当你的智能体需要处理长时间、多轮次的复杂对话或任务时如何让它记住上下文、保持状态一致性并且高效地存取这些“记忆”就成了一个核心挑战。直接在每个智能体进程里维护一个庞大的内存数据库不仅笨重还会导致资源浪费和状态同步的噩梦。这时候一个专门负责记忆存储与检索的独立服务就显得尤为重要。tverney/agent-memory-daemon这个项目正是为了解决这个问题而生的。它是一个独立的守护进程Daemon专门为AI智能体提供集中式的记忆存储、检索和管理服务。你可以把它想象成智能体的“外部大脑”或“记忆中枢”。智能体本身专注于推理和决策而所有需要记住的对话历史、任务状态、用户偏好、知识片段等都交给这个守护进程来打理。它通过一套定义良好的API通常是RESTful或gRPC接口提供服务任何智能体实例都可以像访问数据库一样向它写入记忆或查询相关记忆。这种架构带来的好处是显而易见的。首先它实现了记忆的持久化与共享。不同时间启动的智能体实例甚至分布在不同机器上的智能体都能访问同一份记忆库保证了用户体验的连贯性。其次它解耦了逻辑与存储让智能体代码更轻量、更专注于业务逻辑记忆管理的复杂性被隔离在守护进程中。最后它便于实现高级的记忆功能比如基于向量相似度的语义检索、记忆的自动过期与归档、记忆之间的关联图构建等这些功能如果集成在智能体内部会非常复杂。这个项目特别适合那些正在构建复杂对话系统、长期任务助手、游戏NPC或者任何需要维护长期上下文的AI应用的开发者。如果你受够了在智能体代码里手动拼接和管理越来越长的提示词Prompt或者为状态同步问题焦头烂额那么引入一个像agent-memory-daemon这样的专用服务可能会让你的架构一下子清晰起来。2. 核心架构与设计思路拆解2.1 为什么需要独立的记忆守护进程在深入代码之前我们得先想明白为什么不能把记忆简单地放在智能体进程的内存里这背后有几个关键的设计考量。首先是状态持久化问题。一个智能体进程崩溃或重启其内存中的所有状态也就是记忆都会丢失。对于需要长期服务、记住用户偏好的应用来说这是不可接受的。虽然你可以把记忆序列化后存到文件或数据库但这部分逻辑会污染核心的智能体代码让本应专注于推理的模块变得臃肿。其次是状态共享与一致性问题。在微服务或分布式架构下你可能会有多个智能体实例同时运行以负载均衡或处理不同用户。如果每个实例都有自己的记忆那么用户A的会话被路由到实例1下次被路由到实例2时实例2对用户A一无所知体验就断裂了。你需要一个中心化的存储来保证所有实例看到的状态是一致的。再者是记忆检索的效率与智能化。简单的键值存储比如用用户ID作为键对话历史作为值在记忆量很大时会变得低效。更高级的应用需要的是语义检索智能体问“用户上次提到关于养猫的什么事”记忆系统应该能理解“养猫”这个语义并从历史中找出相关的片段而不是仅仅做字符串匹配。实现这种基于嵌入向量Embedding的相似度搜索涉及模型推理、向量数据库等组件将其作为独立服务更合理。agent-memory-daemon正是基于这些考量采用了客户端-服务器C/S架构。智能体作为客户端通过网络请求与记忆守护进程服务器交互。守护进程内部则封装了记忆的存储引擎可能是Redis、SQLite、PostgreSQL等、向量化模型以及检索逻辑。这种设计模式在软件工程中很常见它遵循了“单一职责”和“关注点分离”的原则。2.2 核心组件与数据流分析一个典型的agent-memory-daemon会包含以下几个核心组件我们可以通过一个数据流来理解它们是如何协作的API接口层这是守护进程对外的门户。通常提供HTTP REST API或gRPC接口。关键的操作包括POST /memory存储一段记忆。客户端会提供记忆的内容、关联的元数据如用户ID、会话ID、时间戳、标签等。GET /memory?query...检索记忆。这里就是语义检索发生的地方查询语句会被向量化然后与存储的记忆向量进行相似度计算。DELETE /memory/:id删除特定记忆。GET /memory/conversation?user_id...获取某个用户的完整对话历史。记忆处理与向量化层当一段新的记忆通过API存入时这一层负责对文本内容进行处理。核心步骤是文本向量化。它会调用一个嵌入模型例如text-embedding-3-small、BGE或SentenceTransformers本地模型将文本转换成高维空间中的一个向量一组浮点数。这个向量捕获了文本的语义信息。同时原始的文本内容和相关的元数据会被结构化地存储起来。向量存储引擎这是项目的“心脏”。它专门用于高效存储和检索向量。常见的选型有Chroma轻量级、易用特别为AI应用设计支持内存和持久化模式。Qdrant/Weaviate功能更强大的专用向量数据库支持过滤、分片等高级特性。PGVectorPostgreSQL的扩展如果你的技术栈已经用了PostgreSQL这是一个非常自然的选择可以同时管理结构化元数据和向量。agent-memory-daemon需要将上一步生成的向量和对应的原始数据ID存入这里。元数据存储引擎用于存储记忆的原始文本、ID、时间戳、用户ID、标签等结构化信息。这可以是一个关系型数据库如SQLite、PostgreSQL也可以和向量存储在一起如使用PGVector或支持元数据的Chroma。检索与排序层当接收到一个查询请求时例如“用户喜欢什么颜色的车”该层首先将查询文本同样进行向量化。然后它向向量存储引擎发起一个近似最近邻搜索。向量数据库会快速返回与查询向量最相似的若干个记忆向量及其ID。最后检索层根据这些ID从元数据存储中取出完整的记忆内容并可能根据相似度分数、时间戳等进行排序将最相关的结果返回给客户端。整个数据流形成了一个高效的管道写入时文本→向量→双存储查询时查询文本→向量→相似搜索→取回原文。这个设计确保了即使记忆库非常庞大检索速度也能保持在毫秒级并且是基于语义的智能检索。3. 关键技术实现细节与选型3.1 嵌入模型的选择与权衡向量检索的效果很大程度上取决于嵌入模型的质量。为agent-memory-daemon选择模型时你需要考虑以下几个维度语义理解能力模型能否准确捕捉句子、段落之间的语义相似性对于对话记忆模型需要理解“我养了一只猫”和“用户家有宠物猫”是高度相关的。上下文长度模型支持的最大输入长度Token数是多少如果你的记忆片段很长例如一整篇文档摘要就需要支持长上下文的模型。速度与资源消耗模型推理需要多长时间占用多少CPU/GPU内存这对于守护进程的响应延迟和部署成本至关重要。多语言支持你的应用是否需要处理中文、英文等多种语言有些模型是单语言专精有些则是多语言的。常见的选型方案OpenAI Embeddings API如text-embedding-3-small优点效果稳定简单易用无需管理模型服务器。缺点产生API调用费用有网络延迟且数据需要发送到外部服务需注意数据隐私合规。适用场景快速原型验证、对数据隐私要求不高的生产环境、希望免去模型运维的情况。本地开源模型如BAAI/bge-small-zh-v1.5,sentence-transformers/all-MiniLM-L6-v2优点数据完全私有无网络延迟一次部署长期使用。缺点需要本地GPU或性能足够的CPU进行推理初次部署稍复杂模型效果可能需要微调以达到最佳。适用场景对数据隐私和安全要求极高、希望控制成本、有运维能力的生产环境。实操心得在项目初期我强烈建议先用OpenAI的API快速跑通整个流程验证架构的可行性。当业务逻辑稳定后再评估是否迁移到本地模型。如果选择本地模型BGE系列对中文支持非常好all-MiniLM-L6-v2则是英文场景下速度和效果的优秀平衡点。你可以使用sentence-transformers库轻松加载和运行这些模型。# 示例使用 sentence-transformers 进行本地向量化 from sentence_transformers import SentenceTransformer model SentenceTransformer(BAAI/bge-small-zh-v1.5) # 记忆文本列表 memories [用户说他喜欢蓝色和白色。, 用户有一只三岁的布偶猫名叫米粒。] # 生成向量 memory_embeddings model.encode(memories, normalize_embeddingsTrue) # 归一化便于余弦相似度计算 # 查询文本向量化 query_embedding model.encode(用户养了什么宠物, normalize_embeddingsTrue)3.2 向量数据库的集成与配置选择了模型下一步就是为它找一个“家”——向量数据库。agent-memory-daemon需要与之紧密集成。以集成 Chroma 为例这是一个非常轻量且流行的选择安装与初始化pip install chromadb在守护进程启动时你需要初始化Chroma客户端并指定持久化路径这样服务重启后记忆不会丢失。import chromadb # 持久化到本地目录 ./chroma_db chroma_client chromadb.PersistentClient(path./chroma_db) # 创建一个集合Collection类似于数据库的表用于存储某一类记忆 memory_collection chroma_client.get_or_create_collection( nameconversation_memories, metadata{hnsw:space: cosine} # 使用余弦相似度作为距离度量 )存储记忆当收到存储API请求时你需要生成向量然后将向量、对应的唯一ID可自生成UUID、元数据如user_id, timestamp和原始文本documents一起存入集合。def store_memory(text, user_id, session_id): memory_id str(uuid.uuid4()) embedding model.encode(text, normalize_embeddingsTrue) memory_collection.add( embeddings[embedding.tolist()], # 注意转换为list ids[memory_id], metadatas[{user_id: user_id, session_id: session_id, text: text}], documents[text] # 也可以只存ID原文放关系数据库 ) return memory_id注意Chroma的add方法要求embeddings是一个二维列表即使只有一条记录。metadatas里的字段可以用于后续的过滤查询。检索记忆这是核心功能。你需要将查询文本向量化然后调用query方法。def query_memories(query_text, user_idNone, top_k5): query_embedding model.encode(query_text, normalize_embeddingsTrue) # 构建查询条件 where_filter {user_id: user_id} if user_id else None results memory_collection.query( query_embeddings[query_embedding.tolist()], n_resultstop_k, wherewhere_filter, # 可选的元数据过滤例如只查某个用户的记忆 include[metadatas, documents, distances] ) # results 包含 ids, distances, metadatas, documents return resultswhere参数非常强大你可以实现诸如“获取用户A在最近一小时内关于主题B的记忆”这样的复杂查询。选型对比Chroma胜在简单纯Python适合中小规模项目、快速启动。但集群和高级功能较弱。Qdrant/Weaviate提供Docker部署有独立的服务进程性能更强支持分布式、过滤条件更丰富适合大规模生产环境。PGVector与现有PostgreSQL生态无缝集成可以利用SQL完成复杂的元数据关联查询但向量检索的纯性能可能不如专用数据库。我的建议是如果记忆量在百万条以下且团队熟悉PythonChroma是起步的最佳选择。如果预计数据量巨大或需要企业级特性从一开始就考虑Qdrant或Weaviate。4. 守护进程的构建与API设计4.1 使用FastAPI构建高性能API服务为了让智能体方便地调用我们需要给守护进程套上一个易用的“外壳”。Python的FastAPI框架是绝佳选择它异步性能好能自动生成API文档开发效率极高。首先定义我们的数据模型Pydantic Models这决定了API的输入输出格式。from pydantic import BaseModel from typing import Optional, List from datetime import datetime class MemoryItem(BaseModel): 单条记忆的数据模型 id: Optional[str] None # 由服务端生成 text: str # 记忆的文本内容 user_id: str # 所属用户 session_id: Optional[str] None # 所属会话 metadata: Optional[dict] {} # 自定义元数据如标签、来源等 timestamp: Optional[datetime] None # 创建时间 class MemoryStoreRequest(BaseModel): 存储记忆的请求体 memories: List[MemoryItem] class MemoryQueryRequest(BaseModel): 查询记忆的请求体 query_text: str user_id: Optional[str] None filter_conditions: Optional[dict] None # 额外的元数据过滤 top_k: int 5 class MemoryQueryResponse(BaseModel): 查询记忆的返回体 results: List[dict] # 包含相似记忆的id, text, score, metadata等接下来创建核心的FastAPI应用和路由from fastapi import FastAPI, HTTPException import uuid from .vector_store import VectorStore # 假设这是封装了向量数据库操作的类 app FastAPI(titleAgent Memory Daemon) vector_store VectorStore() # 初始化向量存储连接 app.post(/v1/memories, response_modelList[str]) async def store_memories(request: MemoryStoreRequest): 批量存储记忆返回存储的记忆ID列表 memory_ids [] for item in request.memories: if not item.id: item.id str(uuid.uuid4()) if not item.timestamp: item.timestamp datetime.utcnow() # 调用向量存储层 success await vector_store.add_memory(item) if success: memory_ids.append(item.id) else: raise HTTPException(status_code500, detailfFailed to store memory: {item.id}) return memory_ids app.post(/v1/memories/query, response_modelMemoryQueryResponse) async def query_memories(request: MemoryQueryRequest): 根据查询文本语义检索相关记忆 if not request.query_text.strip(): raise HTTPException(status_code400, detailQuery text cannot be empty) results await vector_store.search( query_textrequest.query_text, user_idrequest.user_id, filter_conditionsrequest.filter_conditions, top_krequest.top_k ) return MemoryQueryResponse(resultsresults) app.delete(/v1/memories/{memory_id}) async def delete_memory(memory_id: str): 删除指定ID的记忆 success await vector_store.delete_memory(memory_id) if not success: raise HTTPException(status_code404, detailfMemory {memory_id} not found) return {message: fMemory {memory_id} deleted successfully}这个API设计得清晰且实用。/v1/memories支持批量存储提高了效率。查询接口POST /v1/memories/query使用了POST而非GET因为查询文本可能较长且过滤条件filter_conditions作为JSON body更灵活。返回的score字段相似度距离对于智能体决定如何使用这些记忆至关重要。4.2 异步处理、并发与性能优化作为一个守护进程可能会同时接收多个智能体的请求因此异步Async和并发处理能力是关键。FastAPI天生支持异步我们上面的路由处理函数都用了async def。性能优化点模型推理批处理当批量存储记忆或同时处理多个查询时不要一条条地调用模型encode。sentence-transformers和大多数推理库都支持批处理能极大提升GPU利用率。# 低效做法 # embeddings [model.encode(text) for text in texts] # 高效做法 embeddings model.encode(texts, batch_size32) # 一次性编码一个批次连接池与客户端管理确保你的向量数据库客户端如ChromaClient是单例的并且在应用生命周期内被复用。对于像Qdrant这样的HTTP客户端使用httpx.AsyncClient并配置连接池。异步向量数据库操作如果选用的向量数据库客户端库不支持原生异步如Chroma的默认客户端将其放入线程池运行避免阻塞事件循环。import asyncio from functools import partial async def add_memory_async(memory_item): # 将同步的 vector_store.collection.add 放到线程池中执行 loop asyncio.get_event_loop() sync_func partial(vector_store.collection.add, ...) # 填充参数 await loop.run_in_executor(None, sync_func)或者更优雅的方式是寻找或封装该库的异步版本。缓存高频查询对于一些非常高频且结果相对稳定的查询例如“获取用户X的基本信息”可以在内存如redis或应用层添加缓存避免每次都进行向量检索。监控与日志使用结构化日志如structlog记录每个API请求的耗时、向量化的耗时、检索的耗时。这能帮你快速定位性能瓶颈是在网络、模型推理还是数据库检索上。5. 智能体客户端的集成实践守护进程搭建好了接下来就要让智能体学会使用它。这里的关键是设计一个好用、健壮的客户端库SDK。5.1 客户端SDK的设计与封装一个好的SDK应该隐藏网络细节提供简洁直观的接口。我们设计一个MemoryClient类# memory_client.py import aiohttp import asyncio from typing import List, Optional, Dict, Any from .models import MemoryItem, MemoryQueryRequest # 复用服务端的Pydantic模型 class MemoryClient: def __init__(self, base_url: str http://localhost:8000, api_key: Optional[str] None): self.base_url base_url.rstrip(/) self.api_key api_key self._session: Optional[aiohttp.ClientSession] None async def __aenter__(self): self._session aiohttp.ClientSession( headers{Authorization: fBearer {self.api_key}} if self.api_key else {} ) return self async def __aexit__(self, exc_type, exc_val, exc_tb): if self._session: await self._session.close() async def store(self, memory: MemoryItem) - str: 存储单条记忆 async with self._session.post(f{self.base_url}/v1/memories, json{memories: [memory.dict(exclude_noneTrue)]}) as resp: resp.raise_for_status() data await resp.json() return data[0] # 返回存储的记忆ID async def store_batch(self, memories: List[MemoryItem]) - List[str]: 批量存储记忆 async with self._session.post(f{self.base_url}/v1/memories, json{memories: [m.dict(exclude_noneTrue) for m in memories]}) as resp: resp.raise_for_status() return await resp.json() async def query(self, query_text: str, user_id: Optional[str] None, top_k: int 5, **filter_kwargs) - List[Dict[str, Any]]: 查询相关记忆支持额外的元数据过滤 request_data MemoryQueryRequest( query_textquery_text, user_iduser_id, top_ktop_k, filter_conditionsfilter_kwargs if filter_kwargs else None ).dict(exclude_noneTrue) async with self._session.post(f{self.base_url}/v1/memories/query, jsonrequest_data) as resp: resp.raise_for_status() data await resp.json() return data.get(results, []) async def delete(self, memory_id: str): 删除记忆 async with self._session.delete(f{self.base_url}/v1/memories/{memory_id}) as resp: resp.raise_for_status()这个客户端支持异步上下文管理器async with能自动管理HTTP会话。它还提供了单条存储、批量存储和查询等核心方法。query方法中的**filter_kwargs允许客户端灵活地传入额外的元数据过滤条件比如tags[important]。5.2 在智能体工作流中无缝集成记忆现在我们看看如何在一个基于LLM的智能体例如使用LangChain或自定义循环中集成这个记忆客户端。场景一个客服对话智能体需要记住与用户的整个对话历史并在每次回复时参考相关历史。class CustomerServiceAgent: def __init__(self, llm, memory_client: MemoryClient): self.llm llm # 大语言模型调用接口 self.memory_client memory_client self.current_user_id None self.current_session_id None async def start_session(self, user_id: str): 开始一个新会话 self.current_user_id user_id self.current_session_id str(uuid.uuid4()) # 可以在这里加载用户的长期偏好记忆 user_profile await self.memory_client.query( query_text用户的基本信息和偏好, user_iduser_id, tags[profile], top_k1 ) self.user_profile user_profile[0] if user_profile else None async def process_message(self, user_input: str) - str: 处理用户输入生成回复 if not self.current_user_id: raise ValueError(Session not started. Call start_session first.) # 1. 将本轮用户输入作为记忆存储 user_memory MemoryItem( textuser_input, user_idself.current_user_id, session_idself.current_session_id, metadata{role: user, turn: self._get_turn_count()} ) await self.memory_client.store(user_memory) # 2. 检索与当前输入相关的历史记忆语义检索 relevant_memories await self.memory_client.query( query_textuser_input, user_idself.current_user_id, # 可以过滤只查本次会话或包含所有历史会话 session_idself.current_session_id, top_k5 ) # 3. 构建包含记忆的提示词Prompt memory_context \n.join([f- {m[text]} for m in relevant_memories]) prompt f 你是一个客服助手。以下是与当前用户的对话历史相关部分 {memory_context} 用户最新消息{user_input} 请根据以上对话历史专业、友好地回复用户。 回复 # 4. 调用LLM生成回复 agent_response await self.llm.generate(prompt) # 5. 将智能体的回复也存储为记忆 agent_memory MemoryItem( textagent_response, user_idself.current_user_id, session_idself.current_session_id, metadata{role: assistant, turn: self._get_turn_count() 0.5} ) await self.memory_client.store(agent_memory) return agent_response这个工作流清晰地展示了记忆的“写入-检索-利用”闭环。智能体不再是“金鱼记忆”它拥有了一个持久的、可语义检索的外部记忆库。你可以根据业务需要调整检索策略例如混合检索结合关键词和语义、按时间加权等。6. 部署、监控与生产环境考量6.1 容器化部署与配置管理为了让agent-memory-daemon易于部署和扩展Docker容器化是标准做法。Dockerfile示例# 使用Python官方镜像 FROM python:3.11-slim WORKDIR /app # 复制依赖文件并安装 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 下载嵌入模型如果使用本地模型。这一步可能很大考虑使用多阶段构建或预构建的镜像。 # RUN python -c from sentence_transformers import SentenceTransformer; SentenceTransformer(BAAI/bge-small-zh-v1.5) # 暴露端口 EXPOSE 8000 # 启动命令使用uvicorn作为ASGI服务器 CMD [uvicorn, main:app, --host, 0.0.0.0, --port, 8000, --workers, 4]关键配置通过环境变量来管理配置避免硬编码。# config.py import os from pydantic_settings import BaseSettings class Settings(BaseSettings): # 向量数据库配置 VECTOR_DB_TYPE: str os.getenv(VECTOR_DB, chroma) # chroma, qdrant, pgvector CHROMA_PATH: str os.getenv(CHROMA_PATH, ./chroma_data) QDRANT_URL: str os.getenv(QDRANT_URL, http://localhost:6333) # 嵌入模型配置 EMBEDDING_MODEL: str os.getenv(EMBEDDING_MODEL, BAAI/bge-small-zh-v1.5) EMBEDDING_DEVICE: str os.getenv(EMBEDDING_DEVICE, cpu) # cpu or cuda # API安全 API_KEY: str os.getenv(API_KEY, ) # 简单的API密钥认证 class Config: env_file .env settings Settings()然后在docker-compose.yml中编排服务可以很方便地将记忆守护进程、向量数据库如Qdrant、监控组件如Prometheus组合在一起。6.2 监控、日志与故障排查在生产环境中可观测性至关重要。健康检查端点在FastAPI中添加一个/health端点用于Kubernetes或负载均衡器的健康检查。这个端点应该检查向量数据库连接和模型加载状态。app.get(/health) async def health_check(): try: # 检查向量数据库连接 await vector_store.ping() return {status: healthy} except Exception as e: raise HTTPException(status_code503, detailfService unhealthy: {e})结构化日志使用structlog或json-logging记录结构化的日志方便被ELK或Loki收集和分析。记录关键操作如记忆存储/检索的耗时、用户ID、操作结果等。import structlog logger structlog.get_logger() async def store_memories(request): start_time asyncio.get_event_loop().time() memory_ids [] # ... 存储逻辑 duration (asyncio.get_event_loop().time() - start_time) * 1000 logger.info(memories.stored, countlen(memory_ids), duration_msduration, user_idrequest.memories[0].user_id) return memory_ids指标Metrics暴露使用prometheus-client库暴露应用指标如请求数、请求延迟、错误数、向量化耗时、检索耗时等。这能帮你绘制图表直观了解服务性能。from prometheus_client import Counter, Histogram, generate_latest REQUEST_COUNT Counter(memory_api_requests_total, Total API requests, [endpoint, method]) REQUEST_LATENCY Histogram(memory_api_request_duration_seconds, API request latency, [endpoint]) app.middleware(http) async def monitor_requests(request, call_next): endpoint request.url.path method request.method REQUEST_COUNT.labels(endpointendpoint, methodmethod).inc() start_time time.time() response await call_next(request) duration time.time() - start_time REQUEST_LATENCY.labels(endpointendpoint).observe(duration) return response app.get(/metrics) async def metrics(): return Response(generate_latest(), media_typetext/plain)常见故障排查检索结果不相关检查嵌入模型是否适合你的领域文本。尝试不同的模型或者用你自己的数据对模型进行微调。写入/检索速度慢检查向量数据库的索引类型如HNSW的参数M和ef_construction。对于Chroma确保persist_directory在SSD上。检查模型推理是否成为瓶颈考虑使用GPU或模型量化。内存占用过高如果使用本地模型且记忆量大向量会占用大量内存。考虑使用支持磁盘ANN索引的向量数据库如Qdrant的on_disk模式或者将较旧的、不常用的记忆归档到冷存储。连接失败确保向量数据库服务如Qdrant已启动且网络可达。在Docker Compose中合理设置depends_on和健康检查。7. 高级功能与未来演进思考一个基础的记忆守护进程已经能解决大部分问题但要让它在复杂场景下更智能还可以考虑以下高级功能记忆的自动总结与压缩长时间的对话会产生海量记忆直接全部检索效率低且可能超出LLM上下文窗口。可以让守护进程定期或根据规则对旧记忆进行自动总结生成一段浓缩的摘要作为新的“元记忆”存储起来。查询时优先检索这些摘要必要时再展开细节。记忆关联图记忆之间不是孤立的。用户说“我喜欢《三体》”和“我推荐黑暗森林理论”是关联的。可以在存储记忆时利用LLM或简单的规则提取关键实体如书名、概念、人物并建立记忆之间的关联边。这样就能实现“沿着关联脉络探索记忆”而不仅仅是基于相似度的检索。分层记忆与记忆强度模仿人类的记忆机制设计短期记忆高细节、易遗忘和长期记忆低细节、持久。每次记忆被成功检索和利用就增加其“记忆强度”。强度低的记忆会逐渐被遗忘归档或删除强度高的则被巩固。这能动态管理记忆库的容量和 relevance。多模态记忆记忆不只是文本。用户可能发送图片、语音。守护进程可以集成多模态模型如CLIP将图片、语音也编码成向量与文本记忆统一存储在向量空间中实现跨模态的检索。“用户上次发的那张猫的图片”也能被找出来。与现有知识库集成除了对话产生的记忆智能体往往还需要访问静态知识库如产品文档、公司规章。可以让记忆守护进程也具备导入和索引这些静态知识的能力实现“动态记忆”与“静态知识”的统一检索入口。从tverney/agent-memory-daemon这样一个项目出发你会发现它远不止是一个简单的存储服务。它是构建具有长期记忆、个性化能力的下一代AI智能体的核心基础设施。随着智能体应用的复杂化这个“外部大脑”的设计和优化将会成为一个越来越有挑战性和价值的领域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2584249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…