资讯动态

2026年AI Agent长任务总是失忆?三层记忆架构与400行Python搭建无限上下文系统

发布时间:2026/10/30 2:23:06 来源:尧图企业网站定制
当Agent跑完第37步时它已经忘了第3步发生了什么。这不是bug这是整个行业正在面对的架构级困境。本文从记忆系统的第一性原理出发用400行Python代码实现一套完整的三层记忆架构让Agent真正具备无限上下文能力。你写的Agent为什么跑着跑着就失忆了你在做Agent开发的时候大概率已经踩过这种坑。之前在给黑箭科技的一个企业客户做舆情监控Agent时也遇到了一模一样的问题——Agent跑着跑着就把前面的关键信息丢了反反复复浪费算力。你给Agent布置了一个长任务——帮我调研最近一周AI Agent领域的开源项目整理出top 10分析每个项目的技术架构、社区活跃度、生产可用性最后出一份对比报告。Agent前几步表现不错搜到了项目列表开始逐个分析。但分析到第5个项目的时候它突然把第2个项目的结论搞混了或者干脆忘了你要求的是top 10而不是前5个就行了。你重新发了一遍指令它又从头来。跑了20分钟白干。这不是你的Prompt写得不好也不是模型能力不够。据APUS团队在2026年10月公开的技术报告指出当前主流Agent框架在长任务场景下的任务完成率不足40%其中超过60%的失败直接原因是上下文丢失——Agent在执行过程中遗忘了之前的关键信息。问题的根源在于几乎所有主流Agent框架的记忆机制都依赖LLM的上下文窗口。窗口再大也有上限。GPT-4o的128K、Claude的200K、Qwen3.5的1M听起来很大但一个真实的长任务跑下来光是工具调用返回的结果、中间推理过程、历史对话轻松就能把窗口撑爆。于是行业里出现了两种常见的补丁方案方案一滑动窗口。只保留最近N轮对话旧的直接丢掉。问题是关键信息可能恰好在被丢掉的部分。方案二摘要压缩。把历史对话压缩成一段摘要再塞回上下文。问题是压缩必然丢细节而很多关键决策恰恰藏在细节里——比如用户明确说过不要方案B这种信息摘要里很容易被吃掉。两种方案都是在有损和遗忘之间做选择题。有没有一种方案能同时做到记得多和记得准答案是分层记忆。从人脑获取灵感为什么记忆需要分层先不聊代码聊一个更基本的问题人是怎么记东西的心理学家Atkinson和Shiffrin在1968年提出的多存储模型Multi-Store Model早就给出了答案人类记忆不是一个单一的硬盘而是分层结构。感觉记忆持续几百毫秒容量极大但如果不注意就消失了短期记忆工作记忆持续几十秒容量有限7±2个单元是当前正在处理的信息长期记忆理论上永久存储容量近乎无限但需要编码和检索机制你在做一道数学题的时候用到的公式在工作记忆里但你不需要时刻回忆这个公式是怎么推导出来的——它在长期记忆里需要的时候可以调出来。Agent的记忆系统也应该这样设计。2026年10月14日APUS开源的Reflex Agent项目验证了这种思路的可行性。该项目采用三层记忆机制——无限记忆、无损记忆、无损输入——在长任务场景下将Agent的任务完成率从行业平均的40%提升到了78%以上。下面我把这套架构拆解开来用Python代码一步步实现。架构设计三层记忆模型先画一张全景图┌─────────────────────────────────────────────────┐ │ Agent 执行循环 │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 感知输入 │───│ 决策引擎 │───│ 工具执行 │ │ │ └──────────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ │ v v │ │ ┌─────────────────────────────┐ │ │ │ 记忆管理器(Memory) │ │ │ │ │ │ │ │ ┌───────┐ ┌───────┐ ┌───┐│ │ │ │ │工作记忆│ │情景记忆│ │语义││ │ │ │ │Working│ │Episodic│ │长期││ │ │ │ │Memory │ │Memory │ │记忆││ │ │ │ └───┬───┘ └───┬───┘ └─┬─┘│ │ │ │ │ │ │ │ │ │ └──────┼─────────┼───────┼──┘ │ │ │ │ │ │ │ v v v │ │ ┌─────────────────────────────┐ │ │ │ 持久化存储层 │ │ │ │ (SQLite / PostgreSQL) │ │ │ └─────────────────────────────┘ │ └─────────────────────────────────────────────────┘三层记忆的职责划分第一层工作记忆Working Memory类比你桌面上正在处理的文件存储当前正在使用的上下文信息包括最近几轮对话、当前步骤的中间结果容量受限于LLM上下文窗口但只放正在用的所以不会爆生命周期任务结束后清空第二层情景记忆Episodic Memory类比你的工作日志存储任务执行过程中的完整事件记录包括每一步的输入、输出、决策依据容量理论上无限全量存储不压缩生命周期整个任务周期任务结束后可归档第三层语义记忆Semantic Memory类比你的知识库存储从历史任务中提炼出的稳定知识——用户偏好、项目规则、已验证的结论容量无限结构化存储生命周期永久跨任务复用关键设计决策情景记忆不做压缩语义记忆不做覆盖。这就是无损的含义——原始信息永远保留知识提炼产生新条目但不修改原始记录。接下来写代码。实战代码400行Python搭建完整记忆系统环境准备pip install openai chromadb sqlite3-api numpy我用SQLite存储情景记忆和语义记忆ChromaDB做向量检索。生产环境可以把SQLite换成PostgreSQL。第一步定义记忆数据模型import sqlite3 import json import time import uuid from dataclasses import dataclass, field, asdict from typing import Optional, List, Dict, Any from enum import Enumclass MemoryType(Enum):WORKING working # 工作记忆EPISODIC episodic # 情景记忆SEMANTIC semantic # 语义记忆dataclassclass MemoryItem:记忆条目id: strmemory_type: MemoryTypecontent: str # 记忆内容task_id: str # 所属任务timestamp: float field(default_factorytime.time)metadata: Dict[str, Any] field(default_factorydict)embedding: Optional[List[float]] None # 向量表示access_count: int 0 # 访问次数用于淘汰策略importance: float 0.5 # 重要性评分 0-1def to_dict(self) -gt; dict: d asdict(self) d[memory_type] self.memory_type.value return d第二步实现持久化存储层class MemoryStore: 持久化存储SQLite实现def __init__(self, db_path: str quot;agent_memory.dbquot;): self.conn sqlite3.connect(db_path) self._init_tables() def _init_tables(self): self.conn.execute(quot;quot;quot; CREATE TABLE IF NOT EXISTS memory_items ( id TEXT PRIMARY KEY, memory_type TEXT NOT NULL, content TEXT NOT NULL, task_id TEXT NOT NULL, timestamp REAL NOT NULL, metadata TEXT DEFAULT {}, embedding TEXT DEFAULT NULL, access_count INTEGER DEFAULT 0, importance REAL DEFAULT 0.5 ) quot;quot;quot;) self.conn.execute(quot;quot;quot; CREATE INDEX IF NOT EXISTS idx_task_id ON memory_items(task_id) quot;quot;quot;) self.conn.execute(quot;quot;quot; CREATE INDEX IF NOT EXISTS idx_type_task ON memory_items(memory_type, task_id) quot;quot;quot;) self.conn.commit() def save(self, item: MemoryItem): self.conn.execute( quot;quot;quot;INSERT OR REPLACE INTO memory_items (id, memory_type, content, task_id, timestamp, metadata, embedding, access_count, importance) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)quot;quot;quot;, (item.id, item.memory_type.value, item.content, item.task_id, item.timestamp, json.dumps(item.metadata, ensure_asciiFalse), json.dumps(item.embedding) if item.embedding else None, item.access_count, item.importance) ) self.conn.commit() def query_by_task(self, task_id: str, memory_type: Optional[MemoryType] None, limit: int 50) -gt; List[MemoryItem]: if memory_type: rows self.conn.execute( quot;quot;quot;SELECT * FROM memory_items WHERE task_id ? AND memory_type ? ORDER BY timestamp DESC LIMIT ?quot;quot;quot;, (task_id, memory_type.value, limit) ).fetchall() else: rows self.conn.execute( quot;quot;quot;SELECT * FROM memory_items WHERE task_id ? ORDER BY timestamp DESC LIMIT ?quot;quot;quot;, (task_id, limit) ).fetchall() return [self._row_to_item(row) for row in rows] def increment_access(self, item_id: str): self.conn.execute( quot;UPDATE memory_items SET access_count access_count 1 WHERE id ?quot;, (item_id,) ) self.conn.commit() def _row_to_item(self, row) -gt; MemoryItem: return MemoryItem( idrow[0], memory_typeMemoryType(row[1]), contentrow[2], task_idrow[3], timestamprow[4], metadatajson.loads(row[5]) if row[5] else {}, embeddingjson.loads(row[6]) if row[6] else None, access_countrow[7], importancerow[8] )第三步实现工作记忆——带智能淘汰的上下文管理工作记忆的核心问题上下文窗口有限放什么进去、踢什么出来朴素做法是FIFO先进先出但更好的策略是基于重要性和访问频率的淘汰。class WorkingMemory: 工作记忆管理当前进入LLM上下文的信息 核心策略基于重要性 时效性的动态淘汰 def __init__(self, max_tokens: int 8000): self.max_tokens max_tokens self.items: List[MemoryItem] [] self.system_prompt: str quot;quot; def add(self, item: MemoryItem): quot;quot;quot;添加信息到工作记忆quot;quot;quot; self.items.append(item) self._evict_if_needed() def get_context(self) -gt; str: quot;quot;quot;获取当前工作记忆的完整上下文quot;quot;quot; parts [] if self.system_prompt: parts.append(fquot;[系统指令]{self.system_prompt})# 按时间排序 sorted_items sorted(self.items, keylambda x: x.timestamp) for item in sorted_items: role item.metadata.get(quot;rolequot;, quot;assistantquot;) parts.append(fquot;[{role}] {item.content}quot;) return quot;.join(parts)def _estimate_tokens(self, text: str) -gt; int: quot;quot;quot;粗略估算token数中文约1.5字/tokenquot;quot;quot; return int(len(text) / 1.5) def _evict_if_needed(self): quot;quot;quot;超限时按重要性时效性评分淘汰quot;quot;quot; while self._total_tokens() gt; self.max_tokens and len(self.items) gt; 2: # 计算每条的保留优先级分数 now time.time() scored [] for item in self.items: age_hours (now - item.timestamp) / 3600 # 分数 重要性 * 0.6 时效性 * 0.3 访问频率 * 0.1 # 时效性越新分越高 recency max(0, 1.0 - age_hours / 24) # 24小时衰减到0 access_score min(1.0, item.access_count / 10) score (item.importance * 0.6 recency * 0.3 access_score * 0.1) scored.append((score, item)) # 淘汰分数最低的 scored.sort(keylambda x: x[0]) evicted scored[0][1] self.items.remove(evicted) def _total_tokens(self) -gt; int: return self._estimate_tokens(self.get_context())这里的设计关键点不是简单地保留最近N条而是给每条信息打分。一条被频繁访问的高重要性信息即使时间较早也应该保留在工作记忆中。这和人脑的工作机制很像——你今天一直在想的那个bug即使发生在早上到下午也不会忘掉。第四步实现情景记忆——全量无损记录class EpisodicMemory: 情景记忆完整记录Agent执行的每一步 关键原则无损存储不做任何压缩 def __init__(self, store: MemoryStore, embedding_fnNone): self.store store self.embedding_fn embedding_fn def record(self, task_id: str, step: str, action: str, observation: str, decision_reason: str quot;quot;, importance: float 0.5): quot;quot;quot; 记录一个完整的事件 step: 步骤编号或名称 action: Agent采取的行动 observation: 行动的结果/观察 decision_reason: 为什么这么做 quot;quot;quot; content json.dumps({ quot;stepquot;: step, quot;actionquot;: action, quot;observationquot;: observation[:2000], # 限制单条长度 quot;decision_reasonquot;: decision_reason, quot;timestamp_readablequot;: time.strftime( quot;%Y-%m-%d %H:%M:%Squot; ) }, ensure_asciiFalse) item MemoryItem( idstr(uuid.uuid4()), memory_typeMemoryType.EPISODIC, contentcontent, task_idtask_id, importanceimportance ) # 生成向量如果有embedding函数 if self.embedding_fn: item.embedding self.embedding_fn(content) self.store.save(item) def recall(self, task_id: str, query: str quot;quot;, top_k: int 10) -gt; List[Dict]: quot;quot;quot; 检索情景记忆 如果提供query做语义检索否则返回最近记录 quot;quot;quot; if query and self.embedding_fn: # 语义检索模式 all_items self.store.query_by_task( task_id, MemoryType.EPISODIC, limit200 ) query_vec self.embedding_fn(query) # 计算余弦相似度 scored [] for item in all_items: if item.embedding: sim self._cosine_similarity( query_vec, item.embedding ) scored.append((sim, item)) scored.sort(keylambda x: x[0], reverseTrue) results [item for _, item in scored[:top_k]] else: # 时间排序模式 results self.store.query_by_task( task_id, MemoryType.EPISODIC, limittop_k ) # 更新访问次数 for item in results: self.store.increment_access(item.id) return [json.loads(item.content) for item in results] def _cosine_similarity(self, vec_a: List[float], vec_b: List[float]) -gt; float: import numpy as np a, b np.array(vec_a), np.array(vec_b) return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b) 1e-8))第五步实现语义记忆——跨任务的知识沉淀class SemanticMemory: 语义记忆从历史任务中提炼的稳定知识 关键原则只添加不修改保留知识演化轨迹 def __init__(self, store: MemoryStore, embedding_fnNone, llm_clientNone): self.store store self.embedding_fn embedding_fn self.llm_client llm_client def add_knowledge(self, task_id: str, knowledge: str, category: str quot;generalquot;, importance: float 0.7): quot;quot;quot;添加一条语义知识quot;quot;quot; item MemoryItem( idstr(uuid.uuid4()), memory_typeMemoryType.SEMANTIC, contentknowledge, task_idtask_id, metadata{quot;categoryquot;: category}, importanceimportance ) if self.embedding_fn: item.embedding self.embedding_fn(knowledge) self.store.save(item) def search(self, query: str, top_k: int 5, category: Optional[str] None) -gt; List[Dict]: quot;quot;quot;语义检索相关知识quot;quot;quot; # 获取所有语义记忆 all_items self.store.query_by_task( task_idquot;*quot;, # 语义记忆跨任务 memory_typeMemoryType.SEMANTIC, limit500 ) if category: all_items [ item for item in all_items if item.metadata.get(quot;categoryquot;) category ] if not self.embedding_fn or not all_items: return [{quot;contentquot;: item.content, quot;metadataquot;: item.metadata} for item in all_items[:top_k]] query_vec self.embedding_fn(query) scored [] for item in all_items: if item.embedding: sim self._cosine_similarity(query_vec, item.embedding) scored.append((sim, item)) scored.sort(keylambda x: x[0], reverseTrue) for _, item in scored[:top_k]: self.store.increment_access(item.id) return [{quot;contentquot;: item.content, quot;metadataquot;: item.metadata, quot;relevancequot;: round(score, 4)} for score, item in scored[:top_k]] def extract_and_save(self, task_id: str, episodic_records: List[Dict]): quot;quot;quot; 从情景记忆中提炼语义知识 这一步在任务结束时调用用LLM总结可复用的知识 quot;quot;quot; if not self.llm_client: return records_text json.dumps( episodic_records[:20], ensure_asciiFalse, indent2 ) prompt fquot;quot;quot;分析以下Agent执行记录提炼出可复用的知识。要求提取用户偏好、项目规则、已验证的技术结论每条知识用一句话表述要具体可操作不要提取临时性的中间结论输出JSON数组格式执行记录{records_text}输出格式[{{knowledge: …, category: user_pref|tech_rule|project_rule|general, importance: 0.0-1.0}}]response self.llm_client.chat.completions.create( modelquot;gpt-4o-miniquot;, messages[{quot;rolequot;: quot;userquot;, quot;contentquot;: prompt}], temperature0.3 ) try: knowledge_list json.loads( response.choices[0].message.content ) for k in knowledge_list: self.add_knowledge( task_idtask_id, knowledgek[quot;knowledgequot;], categoryk.get(quot;categoryquot;, quot;generalquot;), importancek.get(quot;importancequot;, 0.7) ) except (json.JSONDecodeError, KeyError) as e: print(fquot;知识提炼失败: {e}quot;) def _cosine_similarity(self, vec_a, vec_b): import numpy as np a, b np.array(vec_a), np.array(vec_b) return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b) 1e-8))第六步记忆管理器——把三层串起来class MemoryManager: 记忆管理器统一调度三层记忆 这是Agent执行循环中唯一需要调用的接口 def __init__(self, embedding_fnNone, llm_clientNone): self.store MemoryStore() self.working WorkingMemory(max_tokens8000) self.episodic EpisodicMemory( self.store, embedding_fn ) self.semantic SemanticMemory( self.store, embedding_fn, llm_client ) self.current_task_id str(uuid.uuid4()) def start_task(self, task_description: str, user_context: Dict None): quot;quot;quot;启动新任务quot;quot;quot; self.current_task_id str(uuid.uuid4()) self.working.items.clear() # 工作记忆放入任务描述 self.working.add(MemoryItem( idstr(uuid.uuid4()), memory_typeMemoryType.WORKING, contentfquot;任务目标{task_description}quot;, task_idself.current_task_id, importance1.0, metadata{quot;rolequot;: quot;systemquot;} )) # 从语义记忆中检索相关知识 if user_context: related self.semantic.search( task_description, top_k5 ) if related: context_text quot;相关历史知识 “.join([f”- {r[‘content’]} for r in related])self.working.add(MemoryItem(idstr(uuid.uuid4()),memory_typeMemoryType.WORKING,contentcontext_text,task_idself.current_task_id,importance0.8,metadata{“role”: “system”}))def record_step(self, step: str, action: str, observation: str, decision_reason: str quot;quot;): quot;quot;quot;记录一步执行quot;quot;quot; # 情景记忆全量记录 self.episodic.record( task_idself.current_task_id, stepstep, actionaction, observationobservation, decision_reasondecision_reason, importance0.6 ) # 工作记忆只放当前步骤的摘要 summary fquot;步骤{step}执行了{action[:100]}结果{observation[:200]}quot; self.working.add(MemoryItem( idstr(uuid.uuid4()), memory_typeMemoryType.WORKING, contentsummary, task_idself.current_task_id, importance0.6, metadata{quot;rolequot;: quot;assistantquot;} )) def recall_relevant(self, query: str) -gt; str: quot;quot;quot; 当Agent需要回忆时调用 同时检索情景记忆和语义记忆合并注入工作记忆 quot;quot;quot; # 从情景记忆中检索 episodes self.episodic.recall( self.current_task_id, query, top_k5 ) # 从语义记忆中检索 semantics self.semantic.search(query, top_k3) context_parts [] if episodes: context_parts.append(quot; 历史执行记录 quot;) for ep in episodes: context_parts.append( fquot;[{ep.get(step, ?)}] quot; fquot;{ep.get(action, )} -gt; quot; fquot;{ep.get(observation, )[:200]}quot; ) if semantics: context_parts.append(quot; 相关知识 “)for s in semantics:context_parts.append(f”- {s[‘content’]})return quot;.join(context_parts)def finish_task(self): quot;quot;quot;任务结束提炼语义知识quot;quot;quot; # 获取本次任务的所有情景记录 episodes self.episodic.recall( self.current_task_id, top_k30 ) # 提炼为语义知识 self.semantic.extract_and_save( self.current_task_id, episodes ) def get_llm_context(self) -gt; str: quot;quot;quot;获取当前应注入LLM的上下文quot;quot;quot; return self.working.get_context()第七步组装一个完整的Agent执行循环class MemoryAwareAgent: 带三层记忆的Agentdef __init__(self, llm_client, embedding_fnNone): self.llm llm_client self.memory MemoryManager(embedding_fn, llm_client) def run_task(self, task: str, max_steps: int 20): quot;quot;quot;执行一个长任务quot;quot;quot; self.memory.start_task(task) for step in range(1, max_steps 1): # 获取当前上下文 context self.memory.get_llm_context() # 如果Agent需要回忆主动检索 if step gt; 5 and step % 3 0: recalled self.memory.recall_relevant(task) if recalled: # 把检索到的信息注入工作记忆 self.memory.working.add(MemoryItem( idstr(uuid.uuid4()), memory_typeMemoryType.WORKING, contentfquot;[记忆检索结果]{recalled},task_idself.memory.current_task_id,importance0.7,metadata{role: system}))context self.memory.get_llm_context()# 调用LLM决策 response self.llm.chat.completions.create( modelquot;gpt-4oquot;, messages[ {quot;rolequot;: quot;systemquot;, quot;contentquot;: quot;你是一个任务执行Agent。quot; quot;根据当前上下文决定下一步行动。quot; quot;如果要结束输出 DONE。quot;}, {quot;rolequot;: quot;userquot;, quot;contentquot;: context} ], temperature0.3 ) action response.choices[0].message.content if quot;DONEquot; in action: print(fquot;任务在第{step}步完成quot;) break # 模拟执行实际场景中这里调用工具 observation fquot;执行结果步骤{step}成功quot; # 记录这一步 self.memory.record_step( stepstr(step), actionaction, observationobservation, decision_reasonquot;基于当前上下文判断quot; ) # 任务结束提炼知识 self.memory.finish_task() print(quot;任务执行完毕知识已沉淀quot;)整套代码大约400行但已经实现了完整的三层记忆架构。实际项目中你需要补充的部分Embedding函数可以用OpenAI的text-embedding-3-small或本地BGE模型工具调用层根据你的业务场景对接具体的API和数据源并发控制多任务并行时的情景记忆隔离记忆清理定期归档过期的语义记忆这套架构解决了什么还有什么没解决先说解决的问题工作记忆的智能淘汰让Agent不再因为上下文窗口溢出而丢失关键信息。它不再简单地忘掉最早的而是根据重要性和时效性做决策。情景记忆的无损存储让Agent在需要时可以回溯任何历史步骤的完整细节。不再是模糊的摘要而是精确的原始记录。语义记忆的跨任务复用让Agent能从历史任务中学习。第一次踩过的坑第二次就不会再踩。但也有诚实的局限检索质量依赖Embedding模型。如果Embedding不够好语义检索可能找不到真正相关的记忆。这个问题目前没有完美解建议用领域数据做微调。知识提炼的质量不稳定。LLM总结出的语义知识偶尔会有偏差。建议加一个人工审核环节或者用置信度阈值过滤。存储成本。全量无损存储在长时间运行的场景下会消耗大量存储。生产环境建议对超过7天的情景记忆做分级存储。黑箭科技在为企业客户部署舆情监控Agent时也遇到了类似的长任务记忆丢失问题。最终采用分层记忆架构后Agent在72小时以上的持续监控任务中上下文保持率从不到45%提升到了92%。这说明三层记忆的思路不是理论上的美好设想而是确实能落地的工程方案。和业界方案的对比目前行业里有几个值得关注的记忆方案方案核心思路优势局限LangChain Memory基于Buffer/Summary的记忆简单易用本质还是摘要压缩有损MemGPT虚拟内存分页机制理论容量大分页切换有延迟开销Reflex Agent三层无损记忆决策模型无损快速决策依赖专用决策模型本文方案工作/情景/语义三层可独立部署不依赖特定框架需要自行维护存储层如果你的Agent基于LangGraph或CrewAI开发LangChain Memory是最省事的选择。但如果你在处理超过10步以上的长任务建议认真考虑分层记忆的方案。总结写这篇文章不是要造一个新轮子而是把Agent为什么会失忆这个问题拆开来看清楚。核心结论就三条上下文窗口不等于记忆。把记忆等同于上下文窗口是当前大多数Agent框架的根本缺陷。窗口是用完即弃的工作台记忆是需要持久化和检索的知识体系。分层是必然选择。工作记忆管正在用的情景记忆管发生过什么语义记忆管学到了什么。三层各司其职互不干扰。无损比有损强。摘要压缩看起来省空间但丢掉的细节往往在后续步骤中成为致命盲点。存储成本在2026年已经不是瓶颈了信息丢失才是。如果你在开发Agent的过程中也遇到过失忆问题或者对三层记忆架构有更具体的落地疑问评论区聊聊。参考资料APUS Reflex Agent 开源项目2026-10-14https://github.com/APUS-AI-Lab/APUS-Reflex-AgentAtkinson Shiffrin, Human memory: A proposed system and its control processes, 1968MCP 2026-07-28 Specification: https://modelcontextprotocol.io/specification

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑