1. 项目概述为AI智能体构建一个“类脑”记忆引擎如果你正在开发一个AI智能体无论是用于自动化工作流、个人助手还是复杂的决策系统你迟早会面临一个核心挑战记忆管理。传统的解决方案比如简单的键值对存储或者基础的检索增强生成RAG往往把记忆当作一个静态的“数据库”。它们能记住东西但缺乏“生命力”——无法区分信息的重要性无法建立知识间的联系会逐渐被陈旧或矛盾的信息拖累最终导致检索效率低下、回答前后矛盾。这正是CortiLoop要解决的问题。它不是一个简单的记忆库而是一个受人类大脑记忆全生命周期启发的记忆引擎。它的设计哲学很直接与其从零发明一套记忆系统不如向自然界最精密的记忆系统——人脑——学习。人脑通过编码、巩固、检索、关联、遗忘和再巩固这一系列精妙的动态过程来确保知识是准确、相关且可管理的。CortiLoop将这套生物启发式的原理工程化为一个可插拔、可扩展的Python库。简单来说CortiLoop为你的AI智能体装上了一套“海马体”和“新皮层”。它能让你的智能体选择性记忆像前额叶皮层一样过滤掉“嗯”、“好的”这类无意义的噪音专注于重要的事实和指令。深度巩固像睡眠中的记忆巩固一样在后台将零散的事实“Alice用React”组织成结构化的知识单元“Alice是ProjectX的项目经理技术栈是ReactTS”。联想检索像大脑的模式补全一样即使你只提供模糊的线索“那个用TS的PM”也能通过语义、关键词、知识图谱和时间线四路搜索精准召回相关记忆。主动遗忘遵循艾宾浩斯遗忘曲线让不常用的记忆自然衰减并主动修剪冗余信息保持记忆系统的“健康”和高效。安全更新当接收到矛盾的新信息时比如“Alice现在用Vue了”不是粗暴地覆盖旧记忆而是启动“再巩固”流程创建新的观察记录并标记关联保留完整的历史脉络。这个项目最吸引我的地方在于它的“智能体优先”设计。你不需要为了使用它而重构整个智能体架构。如果你的智能体已经有一个能进行对话补全的LLM大语言模型那么这就是CortiLoop需要的全部。嵌入、重排序这些繁重的任务CortiLoop通过一套巧妙的四级自动回退机制帮你搞定从性能最优的本地sentence-transformers模型到零依赖的哈希回退确保在任何环境下都能开箱即用。无论是研究原型、个人项目还是需要PostgreSQL支撑的生产级应用它都能通过清晰的配置进行适配。2. 核心架构与生物启发式设计解析CortiLoop的架构是其灵魂所在它没有将记忆视为一个黑箱而是拆解为七个相互协作的层次每一层都对应着大脑中特定的记忆处理机制。理解这套架构你就能明白它为何比简单的键值对或RAG更强大。2.1 七层记忆生命周期详解这七层构成了一个完整的记忆处理流水线信息从输入到存储、再到检索和更新会依次或并行地经过这些层。第一层注意力门控 (Attention Gate)大脑类比前额叶皮层。它负责评估信息的“价值”和“新颖性”决定哪些信息值得进入工作记忆并最终被编码。CortiLoop实现这是一个五维度的评分系统。它会分析输入文本评估其是否包含更正“不应该是XXX”、显式标记用户说“记住这个”、实体密度、句法复杂性和情感极性。例如一句“好的”可能得分极低而被过滤而“Alice是ProjectX的项目经理她决定采用TypeScript”则会因为包含高价值实体和事实陈述而获得高分得以进入下一层。这从根本上避免了记忆系统被对话中的填充词和无关信息淹没。第二层编码器 (Encoder)大脑类比海马体。负责将短期工作记忆中的信息绑定上下文和实体转化为可存储的痕迹。CortiLoop实现利用LLM从文本中提取结构化的事实单元。例如从“Alice喜欢在周一早上喝咖啡并review代码”中可能提取出(subject: Alice, predicate: drink, object: coffee, time: Monday morning)和(subject: Alice, predicate: review, object: code)两个事实。同时它会生成文本的向量嵌入embedding用于后续的语义搜索。这一层将非结构化的文本转化为机器可理解和处理的结构化数据。第三层巩固 (Consolidation)大脑类比睡眠中的海马体-新皮层对话。短期记忆在海马体形成后需要通过睡眠等过程“转移”到更稳定、更抽象的新皮层长期记忆中。CortiLoop实现分为两个阶段突触巩固 (Synaptic Consolidation)即时发生。将编码器提取的离散事实单元聚合成更高层次的观察。多个关于Alice的事实可能被聚合成一个“Alice的项目管理习惯”观察。系统巩固 (Systems Consolidation)周期性在后台运行由一个独立的Worker处理。进行更深度的处理例如检测程序性知识“每次用户提到bug都会要求先写测试”构建心智模型并进行全局去重和重要性重评估。这个过程就像大脑在“离线”时整理和深化记忆。第四层关联 (Association)大脑类比赫布学习法则。“一起激发的神经元连接在一起。”大脑通过建立神经元之间的连接来关联概念。CortiLoop实现构建一个动态的知识图谱。节点是实体如“Alice”、“React”、“ProjectX”和观察边代表它们之间的关系。关系类型多样共现关系在同一句话中出现的实体。时序关系按时间顺序发生的事件。因果关系LLM推断出的因果链如“因为采用了TypeScript所以代码错误减少了”。 当检索时这个图谱支持“激活扩散”从一个相关节点出发可以激活与之相连的其他节点极大地增强了联想检索的能力。第五层检索 (Retrieval)大脑类比海马体CA3区的模式补全。仅凭一个片段线索就能回忆起完整的记忆。CortiLoop实现这是性能的关键。它采用四路并行搜索语义搜索使用向量嵌入进行相似度匹配。关键词搜索传统的BM25或TF-IDF匹配对精确术语查找很有效。图谱搜索在关联知识图谱上进行激活扩散寻找相关实体和观察。时序搜索按时间邻近性查找记忆。 四路搜索的结果通过倒数排序融合 (RRF)算法进行合并确保不同搜索策略的优势互补。最后可选地使用交叉编码器 (Cross-Encoder)对Top-K结果进行精排选出与查询最相关的那几个。这种多路召回、融合、重排序的流程是达到高召回率和准确率的保障。第六层遗忘 (Forgetting)大脑类比艾宾浩斯遗忘曲线与小胶质细胞修剪。不常用的记忆会自然衰减无用的神经连接会被清除。CortiLoop实现每个记忆单元都有一个“记忆强度”值它会根据其类型以不同的速率衰减情景记忆对话细节衰减最快。语义记忆提取的知识衰减适中。程序性记忆学会的习惯衰减最慢。 强度低于阈值的记忆会被标记为“不活跃”在检索时优先级降低。后台的巩固Worker会定期执行“修剪”将完全冗余或极度陈旧的记忆归档或软删除从而控制记忆库的总量防止检索性能因数据膨胀而下降。遗忘在这里不是一个Bug而是一个必要的特性。第七层再巩固 (Reconsolidation)大脑类比记忆被提取时会变得不稳定需要重新巩固以融入新信息。这允许记忆被安全地更新。CortiLoop实现当新输入的信息与已有记忆发生冲突时例如先记住“Alice用React”后输入“Alice改用Vue了”系统不会直接覆盖旧记忆。它会检测冲突识别出新旧陈述之间的矛盾。决议策略根据规则决定是取代新信息更正旧信息、合并两者都是部分正确还是共存可能发生在不同上下文中。安全更新创建新的观察记录并与旧记录建立“取代”或“更新”的关系链接。原始记忆作为历史版本被保留。这保证了记忆的可追溯性和一致性避免了信息被无声覆盖的灾难。2.2 架构流程图与数据流结合上面的分层我们可以勾勒出清晰的数据流智能体输入 ↓ [注意力门控] → 低分信息被丢弃 ↓ (高分信息) [编码器] → 生成 {事实单元 嵌入向量} ↓ [海马体存储] (原始编码记忆) ├───────────────┐ ↓ ↓ [突触巩固] [关联图谱构建] (事实→观察) (建立赫布连接) ↓ [系统巩固] (后台周期性深度处理、修剪) ↓ [多路检索] ←──┘ (接受查询) (四路搜索RRF融合重排序) ↓ ├───────────────┐ ↓ ↓ [再巩固] [遗忘] (冲突解决) (强度衰减)这个闭环系统确保了记忆是活的、动态的、自维护的。注意在实际部署中并非所有层都对每次记忆操作同步执行。例如“系统巩固”和“修剪”通常是低优先级后台任务而“编码”和“检索”则是实时、同步的。这种设计平衡了即时响应和长期记忆质量。3. 从零开始安装、配置与基础使用理论很丰满现在我们来实战。CortiLoop的安装和使用力求简洁尤其是对于已经拥有LLM智能体的开发者。3.1 环境准备与安装首先确保你的Python版本在3.11及以上。推荐使用虚拟环境。# 创建并激活虚拟环境 (可选) python -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows # 基础安装 pip install cortiloop基础安装包含了核心逻辑和零依赖的SQLite存储以及哈希回退的嵌入/重排序可以立即运行。为了获得更好的体验和性能我强烈建议安装可选组件# 安装本地嵌入模型质量优先推荐 pip install cortiloop[local] # 这会安装 sentence-transformers自动下载 BAAI/bge-m3 等模型 # 安装高效的向量索引速度优先 pip install cortiloop[usearch] # 使用 USearch 的 HNSW 算法加速向量检索 # 安装 PostgreSQL 支持生产环境 pip install cortiloop[postgres] # 或者一次性安装所有功能 pip install cortiloop[all]3.2 核心使用模式与现有智能体集成这是最常用、最优雅的方式。假设你已经有一个智能体它有一个能响应complete方法的LLM对象。# 你的智能体可能已经有这样一个LLM封装 class MyAgentLLM: async def complete(self, prompt: str) - str: # 调用 OpenAI, Anthropic, Ollama 等 API ... # 集成 CortiLoop 只需两行 from cortiloop import CortiLoop # 1. 初始化传入你的LLM。CortiLoop只需要它的补全能力。 loop CortiLoop(llmmy_agent.llm) # 2. 开始使用 async def chat_round(user_input: str): # 记忆将用户说的话存入长期记忆会经过注意力门控过滤 await loop.retain(user_input) # 检索在智能体生成回复前召回相关记忆作为上下文 relevant_memories await loop.recall(query用户刚才提到了什么项目, limit5) # 构建增强后的提示词 context \n.join([f- {m[content]} for m in relevant_memories]) full_prompt f基于以下已知信息 {context} 请回答用户的问题{user_input} # 你的智能体使用增强后的提示词生成回复 agent_response await my_agent.llm.complete(full_prompt) # 你也可以选择将智能体的回复也记忆下来例如记住它做出的承诺 # await loop.retain(fAssistant said: {agent_response}) return agent_response关键在于你只需要提供一个符合MemoryLLM协议的对象。这个协议极其简单from typing import Protocol class MemoryLLM(Protocol): async def complete(self, system: str, user: str, response_format: str text) - str: 给定系统提示和用户输入返回补全文本。 ... async def complete_json(self, system: str, user: str) - dict: 给定系统提示和用户输入返回解析好的JSON字典。 ...绝大多数LLM客户端OpenAI, LiteLLM, 自定义封装都能轻松满足这个协议。CortiLoop用这个LLM来完成记忆提取、关联分析等需要理解能力的任务。3.3 嵌入与重排序的自动魔法你可能会问“向量嵌入和重排序模型呢我不需要配置吗” 这就是CortiLoop“智能体优先”设计的精髓——四级自动回退。当你没有明确提供embedder和reranker时CortiLoop会按以下优先级自动选择优先级嵌入 (Embedding)重排序 (Reranking)触发条件1 (最高)用户显式提供embedder用户显式提供reranker你明确指定时2LLM内置的.embed()方法LLM内置的.rerank()方法你的LLM客户端支持时如某些封装库3 (推荐)BAAI/bge-m3(本地)BAAI/bge-reranker-v2-m3(本地)安装了cortiloop[local]或sentence-transformers4 (保底)基于哈希的N-gram相似度词重叠评分零依赖环境纯SQLite这意味着只要你安装了cortiloop[local]就能免费获得高质量的多语言嵌入和重排序模型无需任何API密钥或额外配置。模型会自动从HuggingFace下载缓存。你也可以通过环境变量轻松切换模型# 使用更轻量的英文专用模型 export CORTILOOP_EMBEDDING_MODELBAAI/bge-small-en-v1.5 export CORTILOOP_RERANKER_MODELcross-encoder/ms-marco-MiniLM-L-6-v2或者在代码中指定from sentence_transformers import SentenceTransformer embedder SentenceTransformer(BAAI/bge-small-en-v1.5) loop CortiLoop(llmmy_llm, embedderembedder)3.4 独立使用与高级配置如果你的项目还没有智能体框架或者需要更精细的控制可以直接使用CortiLoop的配置对象。from cortiloop import CortiLoop, CortiLoopConfig # 创建配置 config CortiLoopConfig( db_pathmemories.db, # SQLite数据库路径 storage_backendsqlite, vector_backendusearch, # 使用USearch加速 ) # 在配置中指定LLM此时CortiLoop会内部创建LLM客户端 config.llm.provider openai # 支持: openai, anthropic, ollama, litellm等 config.llm.api_key os.getenv(OPENAI_API_KEY) config.llm.model gpt-4o-mini # 使用配置初始化 loop CortiLoop(configconfig)使用Ollama实现完全本地化config CortiLoopConfig(db_pathlocal_mem.db) config.llm.provider ollama config.llm.model llama3.2 # 或 qwen2.5, mistral 等 config.llm.base_url http://localhost:11434 # Ollama默认地址 loop CortiLoop(configconfig) # 嵌入和重排序会自动回退到本地的 sentence-transformers 模型 # 整个系统完全离线运行无需任何外部API生产环境配置PostgreSQL pgvector# 首先确保已安装PostgreSQL并创建数据库以及pgvector扩展 pip install cortiloop[postgres]config CortiLoopConfig( db_pathpostgresql://user:passwordlocalhost:5432/cortiloop_db, storage_backendpostgres, # 使用PostgreSQL后端 ) loop CortiLoop(configconfig)PostgreSQL后端支持连接池、更好的并发性和利用pgvector的原生HNSW索引非常适合多用户或高负载的生产场景。4. 实战进阶集成到智能体框架与可视化CortiLoop不仅仅是一个库它提供了多种集成方式能无缝融入现有的AI智能体生态。4.1 作为MCP服务器运行模型上下文协议MCP是新兴的智能体工具调用标准。CortiLoop可以作为一个独立的MCP服务器运行任何兼容MCP的智能体如Claude Desktop、Cline都可以通过标准接口调用其记忆功能。# 设置你的LLM API密钥如果需要 export OPENAI_API_KEYsk-... # 或 export ANTHROPIC_API_KEY... # 或确保Ollama在运行 # 启动MCP服务器 cortiloop-mcp服务器启动后智能体框架可以通过MCP协议发现并使用以下工具cortiloop_retain存储记忆。cortiloop_recall检索记忆。cortiloop_reflect触发深度巩固周期。cortiloop_stats获取记忆系统统计信息。4.2 集成到nanobot和openclaw对于流行的开源智能体框架CortiLoop提供了直接插件。nanobot集成在你的nanobot配置文件中添加MCP服务器配置{ mcp: { servers: { cortiloop: { command: python, args: [-m, cortiloop.adapters.mcp_server], env: { CORTILOOP_DB_PATH: ~/.nanobot/cortiloop.db, OPENAI_API_KEY: sk-... } } } } }或者在Python代码中直接使用插件from cortiloop.adapters.nanobot_plugin import NanobotMemoryPlugin memory_plugin NanobotMemoryPlugin(config{db_path: memory.db}) # 在nanobot的消息处理钩子中调用 async def on_message(message): if message.from_user: await memory_plugin.on_user_message(message.content) context await memory_plugin.on_before_response(准备生成回复) # context 包含了相关的记忆字符串可以注入到提示词中openclaw集成配置方式类似在openclaw的技能配置中声明即可。4.3 记忆可视化面板理解智能体“记住”了什么以及记忆之间如何关联对于调试和信任至关重要。CortiLoop内置了一个Web可视化面板。# 指定记忆数据库和端口 cortiloop-viz --db ./memories.db --port 8888然后在浏览器中打开http://localhost:8888你会看到力导向知识图谱以交互式图谱展示实体、观察和它们之间的关联。你可以拖动、缩放、点击节点查看详情。统计仪表盘显示记忆总数、各类型记忆分布、遗忘曲线、检索命中率等关键指标。记忆时间线按时间顺序展示记忆的存入和检索事件。记忆强度图表直观展示不同记忆的当前强度及其衰减趋势。这个面板在开发调试阶段 invaluable它能让你直观地“看到”智能体的记忆是如何形成、关联和演变的。4.4 配置详解与调优CortiLoop的默认配置适用于大多数场景但你也可以通过YAML文件或代码进行精细调优。核心配置项包括# config.yaml storage_backend: sqlite vector_backend: auto # 自动选择最优的usearch numpy attention_gate: threshold: 0.2 # 重要性分数阈值低于此值的信息被过滤 weights: correction: 0.30 # “更正”类信息权重最高 explicit_mark: 0.25 # 用户显式要求“记住”的 novelty: 0.20 # 信息新颖性 entity_density: 0.15 complexity: 0.10 retrieval: routes: [semantic, keyword, graph, temporal] # 启用哪些检索路径 fusion_method: rrf # 融合方法rrf (倒数排序融合) rerank_enabled: true # 是否启用交叉编码器重排序 rerank_top_k: 50 # 对前50个结果进行重排序 decay: episodic_rate: 0.1 # 情景记忆衰减率快 semantic_rate: 0.03 # 语义记忆衰减率中 procedural_rate: 0.005 # 程序性记忆衰减率慢 pruning_interval_hours: 24 # 修剪任务执行间隔 consolidation: worker_enabled: true systems_interval_minutes: 30 # 深度系统巩固间隔在代码中加载配置import yaml from cortiloop import CortiLoopConfig with open(config.yaml, r) as f: config_dict yaml.safe_load(f) config CortiLoopConfig(**config_dict) loop CortiLoop(configconfig)实操心得配置调优建议注意力阈值如果你的智能体对话很简练可以稍微降低threshold如0.15以避免过滤掉有用信息。如果对话充满寒暄和废话则可以提高如0.25。衰减率根据智能体的使用频率调整。高频使用的助手可以加快episodic_rate以快速忘记对话细节用于长期知识库的智能体则应大幅降低semantic_rate。检索路径如果应用场景中精确关键词很重要如代码片段、产品名确保keyword路由开启。如果强调事件顺序temporal路由很有用。通常建议全开。重排序rerank_enabled会显著提高最终结果的相关性但也会增加延迟需要调用重排序模型。在延迟敏感的场景可以关闭它或减小rerank_top_k。5. 性能评估、问题排查与最佳实践任何一个严肃的项目都需要可衡量的标准。CortiLoop自带一套评估体系帮助你了解其性能边界并在出现问题时进行排查。5.1 使用LongMemEval基准测试CortiLoop项目包含一个专门的benchmarks目录其中实现了LongMemEval基准测试。这是一个来自ICLR 2025论文的权威评测集专门评估长期记忆系统的能力。# 1. 快速冒烟测试13个手工设计的案例离线运行 # 使用内置的基于规则的本地LLM模拟器无需真实API python -m benchmarks.longmemeval --provider local # 期望输出各项测试通过并给出一个综合分数如0.92 # 2. 运行官方完整测试集500个问题 # 首先下载数据集需要huggingface-hub库 python -m benchmarks.download_longmemeval --variant s # 下载标准变体 # 使用真实的LLM如OpenAI运行评测 export OPENAI_API_KEYsk-... python -m benchmarks.longmemeval_official --variant s --provider openai --model gpt-4o-mini # 3. 针对性测试特定能力 python -m benchmarks.longmemeval_official --variant s --types knowledge-update temporal-reasoning # 这专门测试“知识更新”和“时序推理”两类问题 # 4. 保存结果以供分析 python -m benchmarks.longmemeval_official --variant s --provider openai --output benchmark_results.json官方测试集有三个变体代表了不同的记忆负载变体每个问题的会话数总令牌数使用场景oracle仅包含与答案相关的会话很少调试。用于快速验证逻辑。s~40~115K标准评估。推荐用于大多数情况。m~500~1.5M压力测试。评估系统在超长上下文下的稳定性。测试涵盖六种问题类型全面考察记忆系统的能力单会话用户查询、单会话助手查询、单会话偏好记忆、时序推理、知识更新、多会话推理。5.2 常见问题与排查指南在实际使用中你可能会遇到一些典型问题。下面是一个速查表问题现象可能原因排查步骤与解决方案retain后recall查不到1. 注意力门控过滤。2. 向量索引未刷新。3. 记忆强度瞬间衰减配置错误。1. 检查输入文本是否过于简单如“ok”。可通过cortiloop-viz查看是否被记录。2. 对于SQLite后端写入后索引是同步的。对于某些异步框架检查await是否被正确调用。3. 检查decay配置确保episodic_rate不是极大值。检索结果不相关1. 嵌入模型不匹配如用英文模型处理中文。2. 检索路径配置不当。3. 知识图谱未正确构建。1. 确认CORTILOOP_EMBEDDING_MODEL是否为多语言模型如BAAI/bge-m3。2. 在配置中启用所有检索路由[semantic, keyword, graph, temporal]。3. 运行await loop.reflect()触发一次深度巩固以加强关联。通过可视化面板检查图谱连接。内存或磁盘占用增长过快1. 遗忘机制未生效。2. 存储了大量低价值记忆。3. PostgreSQL连接未关闭。1. 确认后台consolidation worker是否启用配置中worker_enabled: true。2. 调高attention_gate.threshold过滤更多噪音。检查pruning_interval_hours是否合理如24小时。3. 确保在应用关闭时调用await loop.close()如果使用异步。与现有LLM集成报错1. 你的LLM对象不符合MemoryLLM协议。2. 异步async/await使用不当。1. 实现一个简单的适配器包装你的LLM确保它有complete(system, user)和complete_json(system, user)方法。2. CortiLoop的API全是异步的async/await。确保在异步函数中调用或在同步环境中使用asyncio.run()。Ollama本地模型响应慢1. Ollama服务未运行或模型未加载。2. 首次使用sentence-transformers下载模型。1. 运行ollama serve并ollama pull llama3.2或你指定的模型。2. 首次运行会下载嵌入模型几百MB请耐心等待。后续调用会使用缓存。5.3 最佳实践与经验总结经过一段时间的实践我总结出以下几点经验能帮助你更好地驾驭CortiLoop始于简单逐步复杂刚开始集成时使用默认配置和SQLite后端。等核心功能跑通后再根据需求考虑切换到PostgreSQL、调整衰减率或启用重排序。善用可视化面板进行调试当智能体的行为不符合预期时第一时间打开cortiloop-viz。查看知识图谱能直观地发现记忆是否被正确关联时间线能帮你理清事件顺序统计面板能告诉你记忆系统的健康度。区分“记忆”与“上下文”CortiLoop用于管理长期、跨会话的记忆。对于当前会话的短期上下文仍然应该使用智能体框架原有的上下文窗口管理。两者是互补的。有选择地记忆不是所有对话都需要retain。通常只记忆用户陈述的事实、偏好、决策和智能体做出的承诺。对于闲聊、问候、重复确认等信息让注意力门控去过滤或者干脆不调用retain。定期触发“反思”在智能体空闲时例如每天结束时可以手动调用await loop.reflect()。这会强制执行一次深度的系统巩固和修剪就像让智能体“睡一觉”来整理记忆能有效提升长期性能。为记忆打上“来源”和“元数据”标签虽然CortiLoop内部会存储时间戳和类型但在调用retain时可以巧妙地在文本中加入元信息。例如retain(“[来自用户邮件] 项目截止日期提前到周五。”)。这样在检索时这些信息也会被考虑进去。处理冲突信息的策略默认的再巩固逻辑是保守的创建新记录并链接。如果你的应用场景要求“真相”唯一且最新可以在配置中探索更激进的冲突解决策略或者在业务层根据recall返回的记忆列表包含历史版本自行决定使用哪一个。CortiLoop将一个复杂的认知科学概念工程化为一个实用、可扩展的开发者工具。它没有试图创造一个“通用人工智能”而是聚焦于解决智能体开发中一个非常具体且痛苦的痛点——记忆管理。通过将大脑的记忆机制模块化、参数化它为我们提供了一套强大的工具箱。你可以直接使用它来增强现有智能体的记忆力也可以深入研究其架构借鉴其思想来设计自己的系统。在AI智能体从“单次对话的奇迹”走向“长期协作的伙伴”的演进道路上这样的工作无疑是非常有价值的一步。