RAG碎片化这个问题做Agent落地的同学应该都不陌生。检索结果东一块西一块语义断层、时间线混乱最后拼出来的上下文连自己看着都别扭。我在这块踩了大半年的坑试过各种切片策略、重排序方案、多路召回效果始终差口气。直到把记忆系统从检索流程重构为认知结构才真正解决了碎片化这个老大难问题。这套方案的核心是一个叫Forms-Dynamics的框架。简单说它把Agent的记忆拆成两大类Forms负责沉淀静态规则和实体知识Dynamics负责记录动态过程和状态变化两者通过一套写入、遗忘、检索机制协同工作。我基于这个框架重新实现了记忆模块后多轮对话的上下文一致性明显改善而且检索命中率和使用率都有了质的提升。这篇内容适合正在做Agent记忆系统设计、RAG管线和对话上下文管理的开发者阅读。不涉及炫技全部是工程上能直接落地的方案和代码。如果你想彻底告别检索结果像拼图碎片的体验这篇文章大概率能给你省下几个月的试错成本。1. RAG碎片化问题的根因分析要解决问题先承认问题的存在再搞清楚它到底出在哪一环。我拆解了三个层面表现、技术根源以及为什么用长上下文硬扛解决不了。1.1 碎片化的三种典型表现碎片化不是单一症状而是一系列问题的集合。我自己的项目里最常见的是下面这三种表现你们可以对照一下第一语义断层。Agent需要先理解任务规则、再翻看历史对话最后还要结合外部文档中的背景知识。传统RAG把这三类内容切到同一个向量库里用同一个embedding模型编码还放进同一个检索过程结果往往是命中了规则片段却丢了对话上下文或者把文档里的冷门术语当作核心知识导致回答偏离主题。这就是典型的多源异构信息在向量化过程中被强行同构化造成的语义断层。第二时序混乱。普通RAG的chunk里没有时间维度上一轮用户说用方案A下一轮说改回方案B再下一轮说还是继续A吧。如果记忆模块不做时序排序和状态跟踪检索出来的结果顺序可能是乱的Agent就会把用户已经废弃的选型当成当前配置来回答。这个问题在长会话中尤其致命。第三知识冗余与冲突。同一个实体在不同时间被写入了不同的描述比如用户地址在会话初期留的是公司地址后期又补充了家庭地址。如果没有消歧和版本管理机制检索模块可能同时返回两个地址Agent无从判断该用哪个最终只能靠猜。注意碎片化不是单纯的切块大小问题而是记忆在写入、存储、检索三个阶段都缺少结构化设计。把chunk_size从512调成1024或者换个更好的embedding模型都只是在治标没有触及本质。1.2 碎片化背后的技术根源如果深入一层看碎片化有三个技术层面的根源。根源之一结构化知识被切块破坏了结构。文档里的规则、实体、属性之间本来存在清晰的引用关系。比如一个API文档里接口名称、请求参数、错误码是互相引用的。普通RAG把文档按长度切块后这些引用关系就被切断了向量检索只能基于表面语义相似度找回碎片而无法恢复它们之间的依赖关系。就算重排序模型再强也补不齐原本就不存在于chunk内的关系信息。根源之二不同粒度的记忆被塞进了同一个检索空间。产品手册里的规则知识适合存成精炼的条目而用户对话日志适合按事件切分。它们的信息密度、时效性、查询方式都不同。用一个向量库统一塞进去检索时必然互相干扰。我见过一个项目因为把用户偏好和产品规则放在同一个collection里导致检索结果中用户偏好频繁抢占正确的规则片段Agent被带偏了。根源之三动态信息被静态化处理。用户的决策过程是动态演进的但RAG把每一次对话都转成静态向量丢失了决策链路。比如用户先选了技术栈A中间对比过技术栈B和C最后因为成本问题回到A。这段权衡过程本身就是极有价值的记忆但向量检索根本表达不了这种因果链条。1.3 为什么不建议直接用长上下文硬扛既然检索容易碎片化那就不检索把历史全塞进上下文里总行了吧——这是我经常被问到的一个问题。我也试过结论是表面可行实则不可行。现代大模型上下文窗口越来越大几十万token看着很充裕。但长上下文有两个被低估的问题。第一是注意力衰减模型对中间部分内容的关注度明显低于开头和结尾历史信息塞太多核心指令反而会被淹没。第二是成本问题每轮请求都携带全部历史token费用和延迟都会显著上升到达一定程度后项目根本没法用。我做一个简单测算假设每轮对话平均消耗2千token一个Agent每天处理500轮对话一周的原始对话量就是7百万token。全部塞进上下文单轮请求就要处理几万甚至几十万的token费用增长一个数量级而且响应延迟也令人难以接受。所以问题不是上下文够不够大而是没用的历史不该占着上下文。记忆系统存在的意义就是为上下文做减法而不是做加法。2. Forms-Dynamics框架的设计思路既然识别出了问题我决定把整套记忆模块重新设计一遍。设计目标很明确让不同类型的知识各回各家、各找各妈、各司其职。2.1 Forms结构化的静态知识表示Forms描述的是世界是什么样的知识特征是相对稳定、结构清晰、可以被反复引用。典型例子包括用户偏好信息、项目配置参数、业务规则、API文档中的接口定义、领域术语表。我在设计Forms时参考了知识图谱的思路但比知识图谱更轻量。每个Form是一个带有类型标签的键值结构存储时以表单形式组织表单类型FormType标识这属于哪种知识比如user_profile、project_config、business_rule字段名Field比如preferred_language、max_budget、timezone字段值Value实际的知识内容可以是字面量也可以是一段短文本来源追踪Source这个Form来自哪次对话、哪份文档便于溯源和回滚时间戳与置信度记录写入时间和可信程度用Forms承载静态知识优势是检索时能做到点对点查询。不需要把整段文本拉回来做相似度匹配而是直接定位某个实体、某个属性。比如用户提到我对坚果过敏这条信息进入user_profile表单后续用户问有什么零食推荐检索时直接命中profile里的过敏字段而不会混入其他无关讨论。2.2 Dynamics过程性的动态知识表示Dynamics描述的是事情如何发展变化的知识特征是时序性强、依赖上下文、只能按过程来理解。典型例子包括用户在需求讨论中的决策演变、Agent执行任务时的步骤记录、项目状态从初始到中期到完成的变化轨迹。Dynamics的存储单元不是静态条目而是事件序列。我用的结构类似日志流水事件ID唯一标识时间戳记录发生时间主体与对象谁做了什么、作用于什么动作类型决策、修改、执行、反馈前后状态体现变化的方向比如从PlanA变到PlanB关联FormID事件执行过程中可能读取或更新了某个Form通过ID关联用Dynamics承载过程性知识核心价值在于保留了因果链路。比如用户在三天前选择了方案A昨天因为预算原因改成方案B今天又补充了一条新的约束条件。传统RAG只能检索出三份孤立的内容而Dynamics能把这三件事串联成一条完整的决策时间线Agent在判断当前应该用哪个方案时看到的是状态如何演变到当前节点。2.3 两者的协同与转换机制Forms和Dynamics不是两套孤立的存储它们之间存在明确的交互规则。我总结了三类协同关系第一Dynamics更新Forms。用户说我现在用Python了之前那个Node.js项目转交给别人维护。这是动态事件系统识别后需要在Forms里把用户的技术栈字段从Node.js更新成Python。动态变化最终会沉淀为静态状态。第二Forms约束Dynamics。用户在Forms中记录了业务规则任何推荐都不能包含坚果成分。之后Agent在处理用户关于零食推荐的动态请求时必须先读取这条规则再走向推荐的执行路径。第三事件回溯触发Form重构。某个Form长期未更新Agent在对话中发现信息已经过时会创建一个Dynamics事件记录信息变更并把新值写回Form同时保留旧值的历史版本方便回溯。一个直观的类比Forms像是一张不断更新的员工登记表Dynamics像是一份工作日志。登记表告诉你这个人现在是什么角色日志告诉你这个角色经历了怎样的变更过程。只有两者结合才能真正理解这个人的当前状态以及当前状态是怎么来的。3. 核心机制拆解写入、遗忘、检索与整合框架定好了接下来就是落地最核心的四个机制。我把这四个机制比作记忆的四个器官写入是感知器官遗忘是净化器官检索是提取器官整合是表达器官。缺一个记忆系统都不完整。3.1 记忆分层架构在Forms和Dynamics之上我还做了一层记忆分级。这个灵感来自认知心理学里关于记忆的分类模型但我在工程实现上做了简化只分四层层级名称存储内容更新频率对应实现L1工作记忆当前任务上下文正在处理的会话信息极高显式上下文窗口L2情景记忆过去的对话场景、用户行为事件高Dynamics事件流L3语义记忆抽象出的规则、偏好、概念知识低Forms表单库L4程序记忆解决问题的流程、工具调用模式极低技能模板与工具链配置四层记忆的核心差异在于抽象程度和生命周期。用户今天说帮我查一下天气是情景记忆但如果用户连续七天都查天气系统应该抽象出用户早上有查询天气习惯这条语义记忆这就是从L2向L3的沉淀过程。再进一步如果Agent发现用户每次查完天气都会接着查询通勤路况可以把天气路况打包成一个固定的服务流程这就是L4程序记忆的雏形。3.2 写入阶段编码与压缩写入阶段决定了记忆的质量。我在这一环节做了三重处理第一重结构化解析。模型的输出不是直接入库的而是经过一次结构化转换。我定义了一个轻量级的信息抽取流程使用模型对原始文本做槽位填充识别表单类型、事件动作、关键参数。这一步相当于给信息做了第一次归档确定它该进Forms还是进Dynamics。第二重重要性评估。不是所有信息都值得写入长期记忆。我给每条候选记忆打一个重要性分规则包括是否涉及用户主动表示的偏好、是否包含明确的决策变更、是否与当前项目核心参数相关。得分低于阈值的内容只留在工作记忆里随会话结束被清理。第三重冗余检测。写入前先查一下现有记忆里是否已经有了相同实体的记录。有的话选择覆盖、合并还是保留版本需要根据信息的新旧和置信度来判定。这一步能防止冲突条目污染记忆库。下面是我在实际项目中用的一段写入流程代码结构做了简化但核心逻辑是完整的class MemoryWriter: def __init__(self, memory_core, importance_threshold0.6): self.core memory_core self.threshold importance_threshold def process(self, raw_text, metadata): # 第一步通过模型抽取结构化信息 parsed self.extract_forms_and_events(raw_text) # 第二步过滤低重要性信息 if parsed.importance self.threshold: self.core.write_working_memory(parsed) return # 第三步按类型写入不同存储区 if parsed.type form: updated self.deduplicate_form(parsed) if updated: self.core.upsert_form(parsed) elif parsed.type event: self.core.append_event(parsed, timestampmetadata.get(ts))提取信息依赖模型做一次JSON输出返回结构里包含type、importance、payload等字段。模型偶尔会漏提取关键内容所以我会在解析时加一个校验逻辑如果必要字段缺失宁可放弃提取也不能把残缺信息写入长期记忆这点格外重要。3.3 遗忘机制衰减、替换与巩固记忆系统没有遗忘机制就像人的大脑没有睡眠清理功能最终会被噪声淹没。我在系统里实现了三种遗忘策略第一种是时间衰减。每条Dynamics事件有一个热度值热度值会随时间逐步衰减。热度低于阈值的事件在检索时会被自动排除。这样设计是为了防止早期会话内容在后续新会话中反复干扰Agent判断。衰减函数我使用的是current_heat initial_heat * exp(-decay_lambda * days_since_event)其中decay_lambda是衰减系数可配置。短时项目建议调高长线项目建议调低具体取值需要通过观察检索效果来校准。我在一个客服Agent项目里把系数设为0.12意味着大约一周后事件热度就降到初始值的三分之一左右。第二种是主动替换。当一个新的Form值与旧值冲突时如果新值的置信度更高系统会执行替换操作同时把旧值压缩为一条历史版本信息只在必要时回溯。比如用户改了口味偏好旧偏好就应该退居幕后而不是继续抢占检索前位。第三种是记忆巩固。我发现被反复引用的Forms知识应该获得更高的保留级别。比如用户第一周表达了喜欢简短回复后续三周每次交流都提到不要长篇大论那么这条记忆的权重需要逐步提高让它几乎不可能被遗忘。巩固机制的本质是对长期记忆做强化。3.4 检索阶段意图识别与多路召回检索是最容易做得花哨但实际效果一般的环节。我采用的策略可以概括为先分路再合并后排序而不是把所有东西丢进一个向量检索然后看相似度分数。我的实现流程是把一次检索拆成三条并发子查询第一路查Forms按字段精确匹配和属性过滤。查询用户预算限制时直接检索project_config和user_profile中的预算字段不走向量相似度。这条路径快而且精准。第二路查Dynamics按事件类型和时间范围过滤。查询上周做了什么决策时直接拉取上周的事件流水按时间正序排列还原决策链路。这条路径查的是过程不查状态。第三路做全局语义检索作为兜底。当精确匹配的Form没有命中、事件类型模糊时用向量检索在两种存储中做宽泛召回再交给排序模块统一裁决。排序模块的设计同样重要。我设定的排序权重包含四个维度分配如下维度权重说明时效性0.30越新的事件或表单更新排名越靠前重要性0.30写入时的重要性评分长期有效类型匹配0.25查询条件与存储类型的匹配度精确匹配优先语义相关度0.15向量相似度仅在模糊查询时起主要作用这样一个组合策略既保证了精确知识的准确命中又保留了模糊搜索的召回能力。相比之下纯粹的向量检索只考虑了语义相关度忽略了时效性和重要性这是它导致长会话中记忆错乱的深层次原因。3.5 整合与注入上下文组装检索完成后还需要一步上下文整合。这一步来自我实测中观察到的痛点就算检索引擎召回了一堆高质量记忆如果组装顺序不对Agent依然会晕头转向。我总结了一个固定的组装规则第一层放静态规则把用户偏好、项目配置等Forms里的长期知识放在上下文最前方形成Agent回答的基本框架约束。第二层放动态状态把最近的关键事件放在中间让Agent了解当前状态是怎么演变来的。第三层放直接相关的检索片段具体的文档、对话样本放在后面作为回答时的素材支撑。这正好利用了模型对上下文开头和结尾注意力更强的特性在开头固定长期规则在结尾放置最近相关内容都是与模型注意力模式相匹配的做法。在注入时还需要做长度预算。我的方法是为记忆注入设定一个token上限比如2000 token。如果召回的记忆超过限制对静态Forms做降采样、对动态事件做时间片抽样但优先保留最近的决策变更。宁可少放几条记忆也不能牺牲核心指令的空间。4. 实操落地实现一个Agent记忆系统理论说再多不如看一份能跑的代码。下面我以一个简化但完整的Agent记忆系统为例演示Forms和Dynamics从初始化到检索的全过程。4.1 准备环境与数据结构我用Python配合SQLite做这套原型示例。选择SQLite的原因是零部署、零额外依赖适合单机原型验证生产环境可以平滑迁移到PostgreSQL或对应的向量数据库。基础数据结构仍然围绕Form和Event展开class Form: def __init__(self, form_id, form_type, fields, source, importance, updated_at): self.id form_id self.type form_type # 例如 user_profile self.fields fields # 例如 {language: Python, region: Asia} self.source source # 来源记录便于溯源 self.importance importance # 重要性评分 self.updated_at updated_at class Event: def __init__(self, event_id, timestamp, actor, action, subject, before, after): self.id event_id self.timestamp timestamp self.actor actor # 用户或Agent self.action action # 例如 switch_stack self.subject subject # 作用对象 self.before before # 变更前状态 self.after after # 变更后状态这个结构不复杂但它承担了三件事不同类型知识的隔离、时序链路保留、状态变更可追溯。4.2 核心代码实现记忆管理器的核心类实现了写入、遗忘、检索三个方法。完整代码如下import sqlite3 import math import time from datetime import datetime, timedelta class AgentMemory: def __init__(self, db_pathagent_memory.db): self.conn sqlite3.connect(db_path) self._init_tables() def _init_tables(self): cur self.conn.cursor() # 静态知识表 cur.execute( CREATE TABLE IF NOT EXISTS forms ( id TEXT PRIMARY KEY, type TEXT, fields TEXT, source TEXT, importance REAL, updated_at TEXT ) ) # 动态事件表 cur.execute( CREATE TABLE IF NOT EXISTS events ( id TEXT PRIMARY KEY, timestamp TEXT, actor TEXT, action TEXT, subject TEXT, before TEXT, after TEXT, heat REAL, first_seen TEXT ) ) self.conn.commit() # ---------- 写入 ---------- def write_form(self, form): cur self.conn.cursor() existing cur.execute( SELECT fields, importance, updated_at FROM forms WHERE id ?, (form.id,) ).fetchone() if existing: old_fields eval(existing[0]) if old_fields form.fields: return # 记录变更事件保留历史横向链 self.write_event(Event( time.time(), system, form_update, form.id, existing[0], str(form.fields) )) cur.execute( INSERT OR REPLACE INTO forms (id, type, fields, source, importance, updated_at) VALUES (?, ?, ?, ?, ?, ?) , (form.id, form.type, str(form.fields), form.source, form.importance, form.updated_at)) self.conn.commit() def write_event(self, event, decay_lambda0.12): cur self.conn.cursor() cur.execute( INSERT INTO events (id, timestamp, actor, action, subject, before, after, heat, first_seen) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) , (event.id, event.timestamp, event.actor, event.action, event.subject, event.before, event.after, 1.0, event.timestamp)) self.conn.commit() # ---------- 遗忘 ---------- def decay_heat(self): 衰减所有事件的heat值清除过冷记忆 cur self.conn.cursor() cur.execute(SELECT id, timestamp, heat FROM events) now time.time() for eid, ts, heat in cur.fetchall(): delta_days (now - float(ts)) / 86400.0 new_heat heat * math.exp(-0.12 * delta_days) if new_heat 0.1: cur.execute(DELETE FROM events WHERE id ?, (eid,)) else: cur.execute(UPDATE events SET heat ? WHERE id ?, (new_heat, eid)) self.conn.commit() # ---------- 检索 ---------- def retrieve(self, query, limit10): 按Forms精确匹配 Events时序检索 向量兜底 的复合检索 results [] # 路一Forms精确匹配 cur self.conn.cursor() for f in cur.execute(SELECT * FROM forms).fetchall(): # 简化演示用关键字过滤 fields_str f[2] if query.lower() in fields_str.lower(): results.append({type: form, data: f, score: 0.8}) # 路二Events检索按heat和时间排序 cur.execute( SELECT * FROM events WHERE heat 0.3 AND (action LIKE ? OR before LIKE ? OR after LIKE ?) ORDER BY timestamp DESC LIMIT ? , (f%{query}%, f%{query}%, f%{query}%, limit)) for ev in cur.fetchall(): results.append({type: event, data: ev, score: 0.7}) # 路三向量兜底生产环境替换为真实embedding相似度 # 省略具体向量计算逻辑此处按关键字处理 return sorted(results, keylambda x: x[score], reverseTrue)[:limit]这个实现里检索路径是明确分路再合并的SQLite演示为了简洁使用了关键字过滤生产环境应该换成真正的向量检索但分路检索的思路是完全一致的。4.3 参数配置与调优过程参数是记忆系统最容易忽略但又影响最大的部分。我在实际调优中总结了几个关键参数的经验取值参数我常用的取值调优方向importance_threshold0.6调高则记忆更精简调低则细节更丰富decay_lambda0.12短线项目调至0.2长线项目调至0.05heat_drop_threshold0.1低于此值的Dynamics事件直接删除retrieve_top_k10建议限制在20以内多了反而混淆决策memory_token_budget2000根据模型窗口和任务复杂度动态调整参数调优方法很直接跑一轮典型对话集观察Agent回答中因为记忆缺失导致的错误数。如果回答明显缺乏背景信息调低importance_threshold如果回答被无关历史干扰调高decay_lambda或调低retrieve_top_k。这套反馈循环我跑了三轮左右基本就能收敛到适用参数。4.4 效果对比RAG碎片化 vs Forms-Dynamics我在一个模拟项目X上做了对比实验对照组使用传统RAG固定分块长度512、Top-K召回实验组使用Forms-Dynamics框架。用同一组50轮多轮对话作为测试集对比指标如下指标传统RAGForms-Dynamics核心实体召回准确率67%91%决策变更识别率22%88%上下文冲突导致错误回答次数11次2次平均单轮检索耗时420ms350ms最有说服力的是决策变更识别率从22%提升到88%。这直接反映了Dynamics事件流设计对过程知识的建模能力这是传统RAG根本做不到的。5. 常见问题与排查技巧实录落地过程中踩过的坑整理成一份问题速查表帮助大家少走弯路。问题现象可能原因排查思路解决方法Agent反复遗忘用户偏好Forms写入时重要性阈值过高偏好信息被过滤检查写入日志看偏好信息是否落入工作记忆调低importance_threshold为user_profile表单单独设置高优先级检索结果总是最新事件压制重要规则Dynamic事件排序权重过高检查排序权重观察返回结果中Forms占比调高type_match权重规则类查询走Forms精确匹配路多轮会话后上下文越来越乱记忆注入超预算关键指令被挤占查看每轮上下文的token分布严格限制memory_token_budget对记忆做降采样旧偏好反复浮现遗忘策略未清理旧值或旧值未转入历史版本查询Form历史版本检查替换逻辑执行Form替换时主动标记旧值不可检索仅保留回溯视图复杂任务事件链缺失Dynamics事件只记录了结果没记录原因检查事件前后状态字段是否完整增强抽取逻辑事件必须包含before和after两个状态SQLite写入性能低下高频写入场景下锁竞争严重统计写入延迟观察锁等待生产环境换PostgreSQL或引入内存缓存批量写入5.1 记忆污染问题记忆污染的具体表现是一条错误的旧记忆在多次检索中反复出现Agent会被持续误导。我在实践中最常见的情况是用户开玩笑说以后别推荐咖啡了被模型抽取成了一条高重要度的Forms记忆导致后续真实推荐场景中咖啡被禁用。这类问题不是代码bug而是抽取语义理解不准。我的解决方案有两条路径要求抽取模块在写入高重要性Forms时必须附带一段原文本上下文作为证据并且每隔一段时间做证据复核人工审核机制对置信度高的变更提供回滚按钮团队内部可以快速修正错误的记忆写入5.2 检索不到关键记忆检索不到关键记忆最常见的根因是入口分流错误。用户问我的预算是多少程序走的是关键词过滤结果预算是用数字表示的字段关键词匹配不上导致Forms精确匹配这条路直接漏掉。向量兜底路又没有建立最终返回空结果。解决方法是给Forms的字段值做一层别名映射统一把预算映射到budget字段。同时在Forms精确匹配未命中时强制降级走全局向量检索不能直接返回空。一个简单的别名表就能大幅提升召回效果。5.3 记忆膨胀问题如果不控制总量记忆系统几个月后就会膨胀到无法收拾。我在系统中加了一个定期压缩任务每七天执行一次将三十天前的Dynamics事件做摘要合并变成一条周期汇总事件将三个月内未被检索过的Forms降级到冷存储不再参与常规检索对相似事件做聚合比如用户连续一周每天查天气合并成一条本周每天早上查询天气这个压缩报表跑了几轮之后记忆库量级稳定在了合理范围检索耗时也回到了预期水平。记忆系统不是存储系统不需要保留所有历史细节学会取舍才是关键。5.4 多轮会话中的一致性问题多轮会话一致性是我最初设计Forms-Dynamics时最核心的优化目标。实践中我发现保持一致的秘诀在于不要让Agent每轮都从头理解记忆而是让记忆在每轮回复前先做一次状态检查。具体做法是在每轮对话开始前用当前会话状态去检查Forms库中最相关的几条状态记录确认是否有信息冲突。如果有冲突先把冲突暴露给用户确认再继续执行任务。这个前置检查逻辑虽然消耗一点延迟但显著减少了上一轮说好的事这一轮被推翻的尴尬情况。更重要的是长期运行下来用户会觉得这个Agent真的记得住事有懂他的感觉。一些小体会我在实际项目中把整套Forms-Dynamics框架跑了三个多月最大的感受是记忆系统的设计需要在记住什么和忘掉什么之间找到一个平衡。技术爱好者在设计时很容易一头扎进检索策略、向量模型这些细节里真正决定记忆质量的反而是信息结构化、时序建模和遗忘策略这些看不见的部分。如果你也在做Agent记忆系统我的建议是先别急着上重型的知识图谱或向量数据库先把手上的对话数据做一次统计分析看看哪些信息属于静态属性、哪些属于动态过程。分清这两类之后再决定存储和检索策略你会发现整个系统突然变得清晰了。有一点我特别想强调好的记忆系统不是什么都记得而是该记得的记得特别清楚不该记得的及时放下。这也是Forms-Dynamics框架给我最大的启发。认真把你的Agent当做一个有认知结构的系统来设计而不是当成一个无脑的检索机器结果一定会让你意外。
阅读完成 · 觉得有帮助?