尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

LLM智能体长期记忆系统设计:从向量检索到LeanMem架构实践

LLM智能体长期记忆系统设计:从向量检索到LeanMem架构实践 1. 项目概述为什么LLM智能体需要“长期记忆”最近在折腾LLM智能体LLM Agents的朋友估计都遇到过同一个头疼的问题这玩意儿记性太差了。你让它帮你处理一个多步骤的任务比如连续几天的数据整理或者一个需要上下文关联的复杂对话它经常聊着聊着就把前面说过的关键信息给忘了。这感觉就像和一个金鱼大脑的超级助手合作每次都得从头开始解释效率低得让人抓狂。这正是“长期记忆”Long-Term Memory要解决的核心痛点。我们人类之所以能进行复杂的规划和协作很大程度上依赖于我们能记住过去发生的事情、学到的经验以及达成的共识。对于LLM智能体而言没有有效的长期记忆它就永远只是一个“单次对话”的工具无法真正成为能持续学习、适应和成长的自主伙伴。而今天要聊的LeanMem就是冲着这个痛点来的。它的名字很有意思“Lean”意味着精简、高效、不臃肿。在智能体领域一提到“记忆”很多人第一反应就是搞一个庞大的向量数据库把所有对话历史都存进去每次检索都来一次大海捞针。这种方法不是不行但成本高、延迟大而且经常检索出一堆无关信息反而干扰了智能体的判断。LeanMem的设计哲学截然不同。它追求的不是“记住一切”而是“聪明地记住该记的”。它试图用更简单、更直接、计算开销更小的方式为LLM智能体赋予真正可用的长期记忆能力。简单来说它想让智能体变得更“聪明”而不是更“笨重”。接下来我们就深入拆解一下一个高效的长期记忆系统到底应该怎么设计以及LeanMem可能给出的答案。2. 长期记忆系统的核心挑战与设计思路在动手设计或选择一个记忆系统之前我们必须先搞清楚一个理想的、适用于LLM智能体的长期记忆需要闯过哪些关卡。2.1 记忆的三大核心挑战挑战一信息的选择与过滤What to Remember智能体在运行中会产生海量的交互信息包括用户指令、自身思考过程、工具调用结果、环境反馈等。如果事无巨细全部存储不仅存储成本爆炸更致命的是会在检索时引入大量噪声。想象一下你每次回忆“上周三开会讨论了什么”大脑却把那天早上的早餐味道、路上的广告牌都翻出来这显然效率低下。因此记忆系统必须具备重要性评估机制能自动判断哪些信息具有长期保存价值。例如一个任务达成的最终结果、一个由用户确认的重要事实、一个反复出现的错误模式这些通常比中间某次失败的API调用详情更值得记住。挑战二信息的组织与索引How to Organize存下来的信息不能是一团乱麻。我们需要高效的索引方式以便在需要时能快速、准确地提取。目前主流的方法是向量化检索将文本转换为向量Embedding通过计算向量相似度来查找相关记忆。这很好但它并非唯一也不总是最优。例如对于具有明确时间戳的事件记忆按时间线组织可能更直观对于“用户偏好”这类键值对信息直接用字典或数据库存储可能更高效。一个健壮的记忆系统可能需要支持多种索引方式的混合或分层。挑战三记忆的提取与整合How to Retrieve and Use这是记忆价值变现的关键一步。当智能体面临新情境时记忆系统需要根据当前上下文当前的用户问题、对话状态、任务目标从海量记忆中提取最相关的片段。但“相关”不等于“有用”。提取出来的记忆如何整合到当前的提示词Prompt中是直接拼接还是总结摘要提取多少条记忆才算合适过多会超出上下文窗口并造成干扰过少则可能遗漏关键信息。这涉及到检索策略和记忆注入策略的精细设计。2.2 LeanMem 可能的设计取向基于“Simple and Efficient”的定位我们可以推测LeanMem在应对上述挑战时可能会做出以下设计选择轻量级存储后端可能避免直接绑定庞大的专用向量数据库如Pinecone, Weaviate而是优先支持本地轻量级存储如SQLite、文件系统或与常见数据库如PostgreSQL的向量扩展简单集成降低部署复杂度。智能的记忆摘要与压缩不会存储完整的原始文本而是倾向于对信息进行摘要Summarization或提取关键实体、关系用更紧凑的形式保存记忆核心节省空间并提升后续检索效率。混合检索策略除了向量检索很可能结合基于时间、基于元数据如记忆类型、重要性分数的过滤检索实现更精准的查找。上下文感知的检索检索过程会紧密依赖当前的对话上下文和智能体状态动态调整检索查询确保拿回来的记忆是真正对当前决策有帮助的。模块化与易集成设计上会追求与现有主流智能体框架如LangChain, LlamaIndex, AutoGen的平滑集成让开发者可以像搭积木一样为其智能体添加记忆功能。理解了这些底层逻辑我们就能更好地欣赏LeanMem在具体实现上的巧思。3. LeanMem 架构与核心组件解析虽然我们无法看到LeanMem未公开的详细代码但根据其设计目标和技术趋势我们可以构建一个合理的、高可用的架构蓝图。一个典型的LeanMem风格系统可能包含以下核心组件3.1 记忆处理流水线这是记忆的“写入”端。原始信息不会直接存入记忆库而是需要经过一系列处理。原始观察/思考 - 重要性评分器 - 记忆编码器 - 记忆存储器重要性评分器这是一个轻量级模型或一套启发式规则用于判断当前信息是否需要存入长期记忆。例如规则1如果信息中包含用户明确的指令“记住这一点”则重要性满分。规则2如果信息是任务的成功结果或最终答案则高重要性。规则3如果信息是智能体自身产生的核心推理步骤或关键决策点则中等重要性。规则4普通的中间过程或未产生结果的工具调用则低重要性或直接丢弃。也可以用一个微调过的小型LLM如Phi-3 mini来打分平衡准确性与开销。记忆编码器负责将高重要性的信息转换为适合存储的格式。摘要压缩调用LLM对原始文本进行摘要保留核心事实、结论或指令。这是实现“Lean”的关键能极大减少存储体积。结构化提取提取信息中的实体人、物、概念、属性、关系以结构化的JSON等形式存储便于后续的精确查询。向量化使用Embedding模型如text-embedding-3-small,BGE-M3将文本转换为向量为相似性检索做准备。记忆存储器负责持久化存储编码后的记忆。为了体现“Simple”它可能设计为一个抽象层后端可以灵活配置轻量级模式直接使用SQLite一张表存向量一张表存元数据时间、重要性、类型等。扩展模式支持PgVectorPostgreSQL的向量扩展或Chroma这类轻量向量库。存储的每条记忆都附带丰富的元数据如时间戳、来源会话、重要性分数、记忆类型事实、技能、偏好等。3.2 记忆检索与回忆机制这是记忆的“读取”端直接决定了智能体能否“想起”正确的事情。检索查询生成器根据当前智能体的状态最新用户输入、当前任务目标、已执行的步骤动态生成检索 query。这不仅仅是把用户问题原样拿去搜索而是会进行增强。例如当前问题是“我们接下来该怎么做”检索器可能会结合任务背景生成如“项目X的当前状态、已尝试步骤、遇到的障碍”等多个查询向量去并行搜索记忆。混合检索器这是核心。向量检索使用生成的查询向量在向量存储中进行相似性搜索如余弦相似度找到语义上相关的记忆。元数据过滤同时利用元数据进行硬过滤。例如只检索“重要性0.7”且“类型为事实”且“时间在最近一周内”的记忆。这能有效排除陈旧或低质信息。时间衰减加权给记忆引入一个时间衰减因子越近的记忆权重越高避免智能体总是沉溺于“古老”的经验。记忆重排序与融合将混合检索到的候选记忆列表根据相关性分数、重要性、时间新鲜度进行综合重排序选出Top-K条最相关的记忆。然后可能再次调用LLM对这K条记忆进行去重、冲突检测和简要融合生成一个更加精炼、连贯的“记忆包”。3.3 记忆的整合与利用检索到的记忆如何交给智能体使用这里有几个关键策略动态上下文注入将精炼后的“记忆包”作为系统提示词System Prompt的一部分或放在用户消息的历史记录中提供给LLM。关键在于动态根据当前上下文窗口的剩余容量智能地决定注入多少记忆、以何种详细程度注入。记忆反射与更新记忆不是只读的。当智能体基于现有记忆做出决策并得到环境反馈后这个反馈可以用来更新原有的记忆。例如如果一条记忆指导了错误操作可以调低其重要性或添加“此方法无效”的注释。这就是“学习”的过程。记忆抽象与技能形成当类似的任务模式多次出现并成功解决后记忆系统可以尝试将具体的记忆抽象成一条通用的“技能”或“工作流”记忆。例如多次成功通过“搜索A分析B总结C”的步骤完成市场调研后可以形成一条“执行市场调研任务的标准流程”的技能记忆未来遇到同类任务直接调用该技能无需重新回忆所有细节。注意这个架构是一个逻辑推演旨在说明一个高效长期记忆系统应有的模块。LeanMem的具体实现可能会在模块的粒度、实现方式上有所不同但其追求“简单高效”的思想会贯穿始终例如可能将重要性评分和摘要压缩合并或者提供非常简洁的API来隐藏底层复杂性。4. 实操为你的智能体集成LeanMem风格记忆系统理论说得再多不如动手搭一个。下面我们以一个“学习研究助手”智能体为例一步步为其添加一个自建的、遵循LeanMem理念的长期记忆模块。我们将使用Python并借助一些成熟的库来简化开发。4.1 环境准备与依赖安装首先确保你的Python环境建议3.9然后安装核心依赖。我们不会从头造轮子而是利用现有工具组合。# 核心LLM交互与智能体框架这里以LangChain为例因其生态丰富 pip install langchain langchain-openai langchain-community # 向量存储与Embedding。选择Chroma因为它轻量且简单。 pip install chromadb # 用于文本摘要/处理的LLM。我们使用OpenAI GPT-4o-mini性价比高。 # 你需要设置OPENAI_API_KEY环境变量 # export OPENAI_API_KEYyour-api-key # 可选但推荐用于更复杂记忆处理的工具 pip install pydantic # 用于数据验证和结构化记忆 pip install numpy # 向量计算基础4.2 定义记忆数据结构我们使用Pydantic来定义一条记忆的结构这能让代码更清晰、更安全。from pydantic import BaseModel, Field from datetime import datetime from typing import Optional, Dict, Any from enum import Enum class MemoryType(str, Enum): FACT fact # 客观事实如“用户喜欢喝黑咖啡” OBSERVATION observation # 观察结果如“调用API X经常超时” SKILL skill # 抽象技能如“如何分析财报” PREFERENCE preference # 用户偏好 PLAN plan # 任务计划 class AgentMemory(BaseModel): 一条智能体记忆的模型 id: str Field(default_factorylambda: str(uuid.uuid4())) content: str Field(..., description记忆的文本内容可能是摘要后的) original_content: Optional[str] Field(None, description原始完整内容) embedding: Optional[List[float]] Field(None, description内容的向量表示) memory_type: MemoryType importance: float Field(ge0.0, le1.0, default0.5) # 重要性评分0-1 created_at: datetime Field(default_factorydatetime.now) last_accessed_at: Optional[datetime] None metadata: Dict[str, Any] Field(default_factorydict) # 来源会话、关联任务ID等 # 反射字段 verified_count: int 0 # 被成功使用的次数 conflict_flag: bool False # 是否与其他记忆冲突4.3 实现核心记忆管理器这是整个系统的中枢负责记忆的增删改查。import chromadb from chromadb.config import Settings from langchain_openai import OpenAIEmbeddings from langchain.text_splitter import RecursiveCharacterTextSplitter import uuid class LeanMemoryManager: def __init__(self, persist_directory: str ./chroma_memory): # 初始化向量数据库客户端 self.client chromadb.PersistentClient(pathpersist_directory) # 创建或获取一个集合相当于一个命名空间下的记忆库 self.collection self.client.get_or_create_collection(nameagent_memories) # 初始化Embedding模型 self.embedder OpenAIEmbeddings(modeltext-embedding-3-small) # 文本分割器用于处理长文本 self.text_splitter RecursiveCharacterTextSplitter(chunk_size500, chunk_overlap50) def _calculate_importance(self, text: str, context: Dict) - float: 一个简单的重要性评分函数示例 score 0.5 # 基础分 # 启发式规则1包含特定关键词 important_keywords [记住, 重要, 关键, 总是, 从不, 偏好] if any(keyword in text for keyword in important_keywords): score 0.3 # 启发式规则2来自用户最终确认或任务成功结果 if context.get(is_final_answer, False): score 0.4 # 启发式规则3是智能体自身的核心推理结论 if context.get(source) agent_reasoning: score 0.2 return min(1.0, score) # 确保不超过1.0 def add_memory(self, raw_text: str, memory_type: MemoryType, context: Dict None): 添加一条新记忆 if context is None: context {} # 1. 重要性评分 importance self._calculate_importance(raw_text, context) # 2. 记忆编码这里我们做一个简单的摘要实际应用可用LLM # 为简化我们直接截取前100字符作为“摘要”生产环境请使用LLM摘要。 summary raw_text[:100] ... if len(raw_text) 100 else raw_text # 3. 生成向量 embedding self.embedder.embed_query(summary) # 4. 构建记忆对象 memory AgentMemory( contentsummary, original_contentraw_text, embeddingembedding, memory_typememory_type, importanceimportance, metadatacontext ) # 5. 存储到向量数据库 self.collection.add( embeddings[embedding], documents[memory.content], metadatas[{ id: memory.id, type: memory.memory_type.value, importance: memory.importance, created_at: memory.created_at.isoformat(), **memory.metadata }], ids[memory.id] ) print(f[Memory Added] Type: {memory_type}, Importance: {importance:.2f}, Content: {summary}) return memory.id def retrieve_memories(self, query: str, n_results: int 5, filters: Dict None) - List[AgentMemory]: 检索相关记忆 # 1. 将查询文本向量化 query_embedding self.embedder.embed_query(query) # 2. 构建查询条件 where_clause {} if filters: # 处理元数据过滤例如 {type: fact, importance: {$gte: 0.7}} where_clause.update(filters) # 3. 执行相似性搜索 results self.collection.query( query_embeddings[query_embedding], n_resultsn_results, wherewhere_clause, include[metadatas, documents, distances] ) # 4. 将结果转换为AgentMemory对象列表 memories [] for i in range(len(results[ids][0])): meta results[metadatas][0][i] memory AgentMemory( idmeta[id], contentresults[documents][0][i], memory_typeMemoryType(meta[type]), importancemeta[importance], created_atdatetime.fromisoformat(meta[created_at]), metadata{k: v for k, v in meta.items() if k not in [id, type, importance, created_at]} ) memories.append(memory) # 5. 按综合分数重排序相似度距离 重要性 for mem in memories: # 这里简化处理实际应结合results中的距离值 pass return memories4.4 将记忆模块接入智能体工作流现在我们将这个记忆管理器嵌入到一个简单的LangChain智能体循环中。from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_openai import ChatOpenAI from langchain.tools import Tool from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.memory import ConversationBufferMemory from langchain.schema import SystemMessage, HumanMessage, AIMessage import json class AgentWithLeanMem: def __init__(self): self.llm ChatOpenAI(modelgpt-4o-mini, temperature0) self.memory_manager LeanMemoryManager() # 传统的短期对话记忆保存在上下文窗口内 self.conversation_memory ConversationBufferMemory(return_messagesTrue, memory_keychat_history) # 定义智能体可用的工具 self.tools [ Tool( namesearch_web, funclambda q: f[模拟] 搜索了网络关于{q}的信息。, description用于搜索最新的网络信息。 ), Tool( nameremember_this, funcself._remember_tool, description当用户要求记住某事或你认为某事重要时调用此工具将其存入长期记忆。 ) ] # 构建提示词模板其中包含一个用于注入长期记忆的占位符 prompt ChatPromptTemplate.from_messages([ SystemMessage(content你是一个拥有长期记忆的研究助手。在回答问题时你会参考过去的记忆。 以下是可能相关的长期记忆片段 {long_term_memories} 请基于当前对话和以上记忆提供最佳帮助。), MessagesPlaceholder(variable_namechat_history), HumanMessage(content{input}), MessagesPlaceholder(variable_nameagent_scratchpad) ]) # 创建智能体 self.agent create_openai_tools_agent(self.llm, self.tools, prompt) self.agent_executor AgentExecutor(agentself.agent, toolsself.tools, verboseTrue, memoryself.conversation_memory) def _remember_tool(self, statement: str) - str: 一个工具函数供智能体主动调用以保存重要信息到长期记忆。 context {source: agent_triggered, tool: remember_this} mem_id self.memory_manager.add_memory(statement, MemoryType.FACT, context) return f已成功将信息存入长期记忆ID: {mem_id} def _get_relevant_memories(self, query: str) - str: 根据当前查询从长期记忆中检索相关内容并格式化为字符串。 memories self.memory_manager.retrieve_memories( query, n_results3, filters{importance: {$gte: 0.6}} # 只检索重要性较高的记忆 ) if not memories: return 暂无相关长期记忆。 memory_texts [] for mem in memories: # 格式化每条记忆包含内容和来源时间 mem_str f- [{mem.memory_type}] ({mem.created_at.date()}): {mem.content} memory_texts.append(mem_str) return \n.join(memory_texts) def run(self, user_input: str): 运行智能体主循环 # 1. 在每次交互前先根据用户输入检索长期记忆 relevant_mems self._get_relevant_memories(user_input) print(f\n[检索到的长期记忆]\n{relevant_mems}\n) # 2. 将检索到的记忆作为变量传入智能体执行器 # 这里需要稍微绕一下因为LangChain的AgentExecutor输入是固定的。 # 一种方法是将记忆直接拼接到用户输入中另一种是修改prompt的填充方式。 # 我们采用修改输入内容的方式简化示例 enhanced_input f用户说{user_input}\n\n相关背景记忆{relevant_mems} # 3. 执行智能体 response self.agent_executor.invoke({input: enhanced_input}) output response[output] # 4. 可选自动判断是否将本轮交互的重要结果存入长期记忆 # 例如如果智能体给出了最终答案且对话即将结束可以自动保存。 if 最终答案是 in output or 总结如下 in output: # 简单的启发式判断 context {source: auto_save_from_final_answer, session_turn: final} self.memory_manager.add_memory( fQ: {user_input}\nA: {output}, MemoryType.OBSERVATION, context ) return output # 使用示例 if __name__ __main__: agent AgentWithLeanMem() # 第一轮告诉智能体你的偏好 print(用户我更喜欢用Python而不是Java进行数据分析。) resp1 agent.run(我更喜欢用Python而不是Java进行数据分析。) print(f助手{resp1}\n) # 第二轮几天后你问一个相关的问题 print(用户帮我分析一下这份销售数据用什么工具好) resp2 agent.run(帮我分析一下这份销售数据用什么工具好) print(f助手{resp2}) # 期望的输出中助手应该能回忆起你更喜欢Python从而推荐Pandas, NumPy等Python库而不是Java系的工具。通过以上步骤我们就构建了一个具备LeanMem核心理念轻量、高效、智能筛选的长期记忆模块并将其与一个LLM智能体框架进行了集成。这个示例虽然简化但清晰地展示了从记忆存储、检索到应用的全流程。5. 进阶优化与生产环境考量上面的示例是一个起点。要将其用于更严肃的生产环境或复杂任务还需要考虑以下优化点5.1 记忆的摘要与压缩优化直接存储原始文本或简单截断不是长久之计。真正的“Lean”在于智能压缩。使用LLM进行摘要在add_memory方法中调用一个小型、快速的LLM如GPT-4o-mini或本地模型对原始文本生成摘要。提示词可以设计为“请将以下文本压缩为一句核心事实陈述保留关键实体和结论[原始文本]”。提取结构化信息对于特定类型的信息如用户偏好{“工具”: “Python”, “领域”: “数据分析”}可以直接用代码或小模型解析成JSON结构存储。这能实现极其精准的检索例如当用户提到“数据分析”时直接匹配领域字段。分层记忆将记忆分为“详细记忆”和“索引记忆”。只将“索引记忆”关键词、实体、极简摘要做向量化存储和检索。当需要详细信息时再通过索引去关联的外部存储如文件、数据库中读取完整内容。这能显著降低向量数据库的负载和成本。5.2 检索策略的精细化查询扩展单一的查询向量可能不够。可以使用LLM根据当前问题生成多个相关问题或假设。例如对于“数据分析工具推荐”可以扩展出“Python数据分析库”、“易用性”、“性能”等多个查询向量并行检索然后合并结果。递归检索先进行一次粗略检索得到一批候选记忆。然后用这批记忆的内容作为新的上下文生成更精确的查询进行第二次检索。这种方法能更好地理解复杂、多层次的查询意图。基于时间的检索衰减在重排序算法中给每条记忆的分数加上一个时间衰减因子。公式可以简单如最终分数 相似度分数 * 重要性 * exp(-衰减系数 * 天数)。这能确保系统更倾向于使用新鲜、相关的记忆。5.3 记忆的维护与生命周期管理记忆不能只增不减需要“遗忘”机制。重要性衰减一条记忆如果长期不被访问其重要性可以随时间缓慢降低。当低于某个阈值时可以将其归档或删除。冲突检测与解决当新存入的记忆与旧记忆矛盾时例如用户先说“喜欢A”后说“讨厌A”系统应能检测到冲突。可以标记冲突记忆并在下次用户涉及相关话题时主动询问以澄清“我记得您之前提到喜欢A但现在似乎有所变化能确认一下吗”然后更新记忆。定期清理设置定时任务清理低重要性、过时或标记为冲突且已解决的记忆。5.4 性能与可扩展性缓存热点记忆对于被频繁访问的高重要性记忆可以缓存在内存中避免每次都要查询向量数据库。批量操作对记忆的写入和更新操作可以进行批量处理减少I/O开销。支持分布式存储当记忆量非常大时可以考虑使用支持分布式的向量数据库后端如Milvus, Qdrant而LeanMemoryManager的抽象层设计使其可以相对容易地切换后端。6. 常见问题与排查技巧实录在实际开发和调试记忆系统时你肯定会遇到各种问题。以下是一些典型场景和解决思路问题1智能体好像“失忆”了检索不到明明存进去的记忆。排查步骤检查存储首先确认add_memory函数是否成功执行没有抛出异常。检查向量数据库集合中是否确实增加了记录。检查Embedding确保存储和检索使用的是同一个Embedding模型。不同模型生成的向量空间不同无法直接比较。这是最常见的错误之一。检查检索Query打印出用于检索的query文本和生成的query_embedding的前几个维度看看是否合理。有时查询文本过于简短或模糊导致向量表示不明确。调整相似度阈值向量数据库返回的结果通常有一个距离分数如余弦距离。检查这个分数是否过高相似度过低。你可能需要调整检索时的相似度阈值或者增加返回结果的数量n_results。检查元数据过滤确认你在retrieve_memories中设置的filters没有过于严格意外过滤掉了目标记忆。尝试不加过滤器进行检索。问题2检索到的记忆不相关干扰了智能体的判断。解决思路提升重要性评分质量优化_calculate_importance函数让它更能区分噪音和信号。可以考虑引入一个微调的小型分类模型来做这件事。优化记忆摘要低质量的摘要如简单截断会丢失关键信息导致向量表示不准。务必使用LLM生成高质量的、信息密集的摘要。采用混合检索不要只依赖向量检索。结合基于记忆类型、时间范围的元数据过滤可以大幅提升精度。例如在回答“现在该怎么做”时可以过滤掉“计划”类型的旧记忆优先检索“观察”和“事实”类的新记忆。实施重排序在向量检索返回初步结果后用一个更精细的交叉编码器模型Cross-Encoder对查询和每个候选记忆进行相关性重打分虽然慢一些但精度高很多。问题3记忆系统导致智能体响应速度明显变慢。性能优化点异步操作将记忆的存储add_memory改为异步非阻塞操作。智能体不需要等待记忆存储完成再回复用户。检索缓存对频繁出现的相似查询及其检索结果进行缓存设定一个短的过期时间。限制记忆条数在每次提示词中注入的记忆不要太多例如3-5条。可以使用LLM对检索到的记忆进行一次总结只注入总结后的文本。评估Embedding模型速度text-embedding-3-small在速度和性能上是一个很好的平衡。如果使用本地模型确保它有足够的GPU资源或使用量化版本。问题4如何评估记忆系统的效果定性评估设计一系列多轮对话的测试用例人工检查智能体是否能正确回忆和应用之前对话中的关键信息。定量评估检索准确率构建一个测试集包含查询 相关记忆ID对。计算系统检索到的Top-K记忆中包含相关记忆的比例。任务完成度设计需要长期记忆才能完成的任务例如在对话中逐步提供信息最后要求总结比较有/无记忆系统时任务的完成成功率。人工评分让评估者对智能体在带有记忆的对话中的连贯性、一致性和有用性进行打分。为LLM智能体添加长期记忆不是简单地连接一个数据库而是设计一个模仿人类记忆工作方式的复杂系统。它需要在信息过载和遗忘之间找到平衡在快速检索和精准回忆之间做出权衡。LeanMem所倡导的“Simple and Efficient”理念正是提醒我们在追求功能强大的同时必须时刻关注系统的简洁性、可维护性和实际运行开销。
返回列表