首页 / 资讯中心 / 文章详情

编码智能体路径上下文分层设计:避免上下文窗口被喂爆的实践

编码智能体路径上下文分层设计:避免上下文窗口被喂爆的实践 ★ FEATURED ARTICLE
我们团队在做智能体的时候遇到的最头疼的问题不是模型不够聪明而是上下文窗口被无意义的路径噪音塞满。明明是一次简单的文件查找模型却因为读了整棵文件树而忘了之前的任务重点。特别是进入编码智能体这种高频、强交互场景上下文就是黄金喂错了料后面所有推理全跑偏。这篇文章是“AI coding 智能体设计系列”的第三篇聚焦路径上下文。我会掰开揉碎讲清楚为什么路径信息是编码智能体的刚需怎么给材料才不把上下文喂爆以及我自己在多次实践后沉淀下来的分层设计方法。这套思路不依赖具体模型也不绑定特定框架只要你做智能体相关的上下文工程设计基本都能直接用上。1. 路径上下文为什么是编码智能体的第一刚需先说一个典型的“被喂爆”现场。某次我让智能体去修一个前端构建报错它第一步读取了项目根目录的完整文件树第二步带着这棵“大树”去读配置文件第三步再返回去查某个深层依赖的版本。三轮对话下来光文件路径和目录结构就吃掉了大半的上下文预算真正有用的报错堆栈却被挤得只剩一点空间。结果模型开始“幻觉”文件名把不存在的路径当成真实现象来推理。路径上下文之所以是刚需是因为代码项目本身就是一棵树。任何一次编码任务本质上都是在“树”的某个节点上做读、改、增、删操作。模型的每一次决策——往哪里跳、改哪一个文件、哪个 import 需要同步更新——都依赖对项目结构的理解。没有路径上下文模型就像蒙着眼睛在迷宫里摸索。但问题在于路径上下文天然是海量的。一个中大型项目动辄几千个文件完整文件树转成文本少说几万 token就算小项目每次对话带着完整树也不现实。更麻烦的是路径信息并不是等价的。有的路径是核心代码改一处影响全局有的路径是配置文件、测试用例、文档注释读一遍纯粹浪费。这里有个关键认知错误许多人把“上下文工程”理解为“把更多信息塞给模型”。但现实中上下文窗口是硬约束塞得越多模型对每个 token 的注意力就越稀释推理精度反而下降。路径上下文要做的事情不是“给全”而是“给准”——在正确的时机把正确的路径信息以合适的粒度交给模型并且尽可能避免重复投喂。我之前在系列第二篇里讲过“素材张力”的概念路径上下文是同一个逻辑在空间维度上的延伸。每一份投喂给模型的路径信息都要问一句这个信息对当下这一步决策是不可或缺的还是纯属背景噪音如果答案是后者就应该被压缩或直接过滤掉。1.1 路径信息在模型眼中的“权重分布”做过几次编码智能体测试之后我总结出路径信息在不同场景下的权重分布。模型处理路径信息时依赖顺序大致是这样的当前工作目录与操作目标路径权重最高。模型必须先知道自己在哪个目录下、接下来要改哪个文件否则后续任何代码片段都会失焦。路径的“相对语义”比如src/components/Button.tsx里的components暗示这是组件层Button暗示关联样式文件可能存在。模型对这类语义推理很敏感能帮它自动联想相近文件。目录的“形状”哪些目录是平坦的、哪些嵌套很深、哪些文件成对出现这些结构特征决定了模型推测路径规律的准确度。全局目录树权重最低。只有模型需要跨模块搜索或排查依赖关系时才值得投喂平时给全量就是灾难。从这个权重分布可以推出一个反直觉的结论全局文件树不是路径上下文的必须项而是近乎最末尾的可选项。多数场景下给模型几条精确的路径、几个关键目录的局部结构比给一整棵全局树有效得多。1.2 “喂爆”与“喂不饱”之间的平衡点在哪里路径上下文工程的难点在于同时避开两个极端。一端是“喂爆”把完整文件树、所有文件路径、每层目录结构都塞进上下文模型倒是“看得全”了但真正需要聚焦的代码细节反而被淹没。另一端是“喂不饱”只给一个文件名不给目录语义、不给相邻文件关系模型找不到入口绕着圈子反复猜。我的经验是平衡点不取决于“项目多大”而取决于**“模型当前正在做哪一层决策”**。决策颗粒度粗时——比如要规划整体改造方案——路径信息可以给到二级或三级目录的粒度决策颗粒度细时——比如要修改某个函数的内部实现——路径上下文应该收窄到目标文件及其直接相邻文件。换句话说路径上下文要跟着决策深度动态伸缩而不是一成不变地全局投喂。2. 路径上下文的核心矛盾全局视野的“幻觉诱惑”与局部定位的“隧道效应”上一节提到“给准”很重要但真正动手设计时你会发现路径上下文有个天生的矛盾很难用简单方案化解。我先解释什么叫全局视野的“幻觉诱惑”。模型一旦看到整棵文件树会产生一种“我掌握全局”的错觉于是开始大胆地推测各文件之间的关系。哪怕某个目录下面只有几个空文件模型也会脑补出一堆并不存在的模块边界。这种幻觉一旦侵入推理后面它会反复引用不存在的路径而且每次报错后它都倾向于“继续往已经错的方向深挖”而不是换个思路。我见过最离谱的一次模型坚信/src/utils/request.ts存在并据此设计了整套接口修改方案。实际上那个文件在项目的另一个目录里路径完全不同。因为文件树太大模型没有细看就按自己的直觉补全了路径。这种幻觉成本极高不是浪费几个 token 的事而是直接产生错误的代码改动。再解释局部定位的“隧道效应”。如果只给模型一个目标文件的绝对路径并且把所有其他路径信息都藏起来模型确实不会幻觉出不存在的全局结构但它又容易“钻牛角尖”。改一个组件时它不知道同级的__tests__目录里有现成的测试用例也不知道constants文件里相关的枚举定义在什么地方。明明抬手就能参照的证据因为路径信息被裁剪掉模型就只能靠猜。两条路单独走都会翻车。真正可用的路径上下文方案必须在内部同时构建“粗粒度全局地图”和“细粒度局部详情”并且让这两层能互相引用、按需切换。这个设计思想对应到工程上就是我下面要展开的分层路径上下文结构。2.1 为什么传统 CV 式“把文档塞进 System Prompt”在这里失效很多做 RAG 的同学一开始会把路径上下文当成普通的检索文档来处理——项目启动时把每个文件的路径、摘要都向量化对话时检索 top-k 拼进 prompt。这种做法在小 demo 里能跑通但放到真实的编码智能体上会有三个致命问题。第一编码任务的查询意图不是稳定向量。用户说“帮我改一下登录流程”这类意图在语义上可能对应十几个文件的路径检索出来的 top-k 大概率把最核心的那个文件漏掉。第二路径语义很难被嵌入空间有效表达。src/a/b/c.ts和src/a/b/d.ts这两个路径在文本上非常相似但可能一个是入口模块、一个是死代码。按时 token 级别的相似度排序模型拿到的往往是“看起来像但用不上”的文件。第三文档式检索天生缺乏结构调整能力。检索结果是一堆零散的路径列表模型很难从中恢复出“目录层级关系”“兄弟文件的依赖模式”这类结构性认知。而这些恰恰是编码推理中最高价值的信息。所以我从一开始就倾向于放弃“路径当文档检索”的思路转而把路径上下文当作结构化状态来管理——不是一股脑丢进 prompt而是维护一棵带权重、带摘要、带状态标记的“路径状态树”按任务阶段逐步展开。2.2 路径上下文应该被设计成“拉取式”而非“推送式”顺着上面的思路路径上下文设计的第二个原则是拉取式。推送式的做法是启动时把整个项目的路径结构整理成静态文本无论后续任务是改 bug 还是做重构都带着这份文本。拉取式的做法是把路径上下文拆成一个可查询的服务模型需要哪一层的结构就通过工具调用来获取。两个方案最本质的区别在于上下文投喂的时机和粒度。推送式在对话开始时就把路费用完了后面遇到真正需要大段代码的场景只能两眼一抹黑。拉取式则能保证每一轮模型的上下文都只包含当轮决策真正需要的路径信息。举一个直观的例子。同样是“修复登录页样式异常”这个任务推送式模型在 System Prompt 里看到完整文件树知道有src/pages/Login.tsx、src/styles/login.less、src/components/Input.tsx这些文件。但等它真正开始改样式时它手里其实只剩下片段化的记忆还得靠猜文件之间的引用。拉取式模型先调用“读取目录结构”工具拿到src/pages和src/styles两层的目录列表然后调用“读取源码片段”工具精确拿到Login.tsx和login.less的头部定义最后改到哪个文件再临时拉取对应文件的核心片段。每一轮上下文里路径信息都是刚刚好够用。拉取式的代价是工程复杂度更高。你需要维护一套路径查询工具还要设计每次查询的返回格式、缓存策略、错误兜底。但跟上下文挤爆导致的推理质量下降相比这点复杂度非常值得。3. 分层路径上下文的具体设计从“全量树”到“按需片段”明确了拉取式的思路之后我落地时把路径上下文分成了四个层级。每一层有不同的粒度、更新频率和投喂时机组合起来既不会让模型“瞎”也不会让上下文爆炸。3.1 第一层静态骨架层静态骨架层是整个项目路径的压缩表示。它不做全量展示只保留目录的层级结构、文件名的模式和标记过的重要节点。一个典型实现是维护一棵“路径骨架树”节点包括目录名、关键文件名、文件类型但不包含文件的具体内容。比如说一个前端仓库的骨架可能是这样project-root ├─ src/ │ ├─ pages/ │ │ ├─ Login.tsx [page] │ │ ├─ Register.tsx [page] │ │ └─ Dashboard.tsx [page] │ ├─ components/ │ │ ├─ Button.tsx [ui] │ │ ├─ Input.tsx [ui] │ │ └─ Layout.tsx [layout] │ ├─ services/ │ │ └─ api.ts [data-layer] │ ├─ styles/ │ │ ├─ globals.css [style] │ │ └─ login.less [style] │ └─ utils/ │ ├─ auth.ts [helper] │ └─ request.ts [helper] ├─ tests/ ├─ configs/ └─ README.md这棵树要不要全量投喂我的答案是不投喂。它作为“静态索引”存在真正的作用是支撑其他层的路径查询。它更像项目的“地图索引”而不是交到模型手里的“地图”。只有模型明确请求“整体看一下项目结构”时我才会用二元截断的方式把这个骨架投过去。静态骨架层负责回答的问题是这个项目的模块边界在哪里、有哪些重要的文件类型分布在哪些目录。它的粒度控制在“一眼能看完整页”的程度一般不超过一两百个路径节点。如此巨量的项目路径信息被压缩到这个量级靠的是两类过滤规则一类是目录黑名单直接滤掉node_modules、dist、.git、__pycache__等另一类是文件“重要度”打分规则根据文件类型、路径深度、引用关系给路径额外地降权。3.2 第二层动态工作区层动态工作区层解决的是“当下对话正在操作哪个局部区域”的问题。它不是一个静态目录树而是一个随任务推进不断收窄或拓宽的窗口。举例来说任务初始阶段工作区可能是src/pages这个层级当模型定位到Login.tsx并要修改它时工作区会收窄到src/pages/Login.tsx和它直接引用的src/components/Input.tsx当模型需要修改 API 调用时工作区又要扩展到src/services/api.ts。每个工作区快照里需要包含的信息有三类当前目录的直接子节点列表让模型知道这个区域里有哪些东西避免幻觉出不存在的文件。相邻文件的显眼标记比如Button.tsx同级的Button.test.tsx这种“伴生文件”往往是调试时的关键参照。当前操作文件的引用关系为了知道改这个文件会影响哪些别的文件模型需要看它 import 了什么、又被谁 import。动态工作区层的核心实现是一个“窗口管理器”。我写过一个简化版的逻辑class WorkspaceTracker: def __init__(self, project_root): self.project_root project_root self.active_window None # 当前工作区快照 self.history [] # 历史工作区用于回溯 def focus_on_path(self, path): 把工作区窗口收窄到某个具体路径 node self.path_index.locate(path) if node is None: return {ok: False, msg: fpath {path} not found} self.active_window self._build_window(node) self.history.append(path) return self.active_window def expand_to_parent(self): 把工作区窗口向上扩一层 if self.active_window is None: return None parent self.active_window.parent self.active_window self._build_window(parent) return self.active_window def _build_window(self, node): 构建某个节点的局部路径快照 children [self._summarize(child) for child in node.children] references self._extract_references(node) return { current: node.absolute_path, children: children, references: references }这个类不用很复杂但它锚定了一个原则工作区永远只保留当前决策区域附近的路径而不是整个项目路径。当模型需要跳出当前区域时它必须显式调用“向上扩一层”或“重新聚焦”的指令而不是默认手里一直握有全局视图。3.3 第三层缓存热点层编码智能体的交互往往有很强的时间局部性。同一轮的几个步骤通常围绕同一批文件连续几轮对话也可能反复读取同一个目录。针对这个现象我设计了一个“缓存热点层”记录最近 N 次被读取路径并维护它们的高频度排名。缓存热点层负责两件事。第一件是把最近投喂过的路径快照记录在案避免同一轮里重复拼接相同信息导致 token 浪费。第二件是当模型需要做下一步决策时优先从热点层里挑候选路径而不是从头检索。举个例子某次对话里模型已经读过Login.tsx和login.less下一轮问题涉及“如何调整按钮在登录页的样式”那么热点层可以直接把src/components/Button.tsx作为高优候选推荐给模型。这个推荐不需要重新检索文件树也不需要向量召回纯粹基于上下文的时间局部性推断。热点层的容量要严格控制。我通常把热点路径数量限制在 20~40 条超过之后按最近最少使用策略淘汰。路径快照本身不是代码内容只是路径和摘要所以占用的 token 不多但带来的决策增益非常明显。3.4 第四层按需检索层前几层覆盖了 90% 的场景但总有一些需求是动态工作区覆盖不到的。比如模型要排查某条报错的根源这条报错来自一个被深埋在src/libs/parser/tokenizer.js的底层函数。此时工作区窗口在src/pages/Login.tsx热点里也没有 tokenizer。按需检索层就要发挥作用。按需检索层设计上跟动态工作区不同它是以“模糊路径匹配 关键词筛选”为核心的检索层。模型那边给定一个目标描述比如“找到处理 token 的文件”系统返回候选的路径列表每个带上一段非常短的摘要。检索层做的事情query 自然语言/关键词 → 路径名模糊匹配tokenize 路径片段做子串相似度 → 文件名语义匹配比如文件名里有 login、auth 等近义词 → 本地变量筛选比如只搜 src 下排除 test 目录 → 排序后返回 top-k默认 5可配这里的关键约束是按需检索层返回的每个路径都必须带一句 10~20 token 的摘要而不是返回文件全文。摘要的作用是让模型知道这个文件“大概是什么”如果它确认这是目标文件再通过动态工作区层的工具去读取具体代码。这样模型就不会为了一次模糊搜索被迫在上下文里囤积一整批源码文件。4. 实操构建一套“路径上下文管理器”的核心工具下面我给出一个可以直接落地的路径上下文管理器设计包括工具接口、链路和避坑点。这个设计是基于我前面的代码架构思路实现的一个精简版本你有自己的工程结构可以照样迁移。4.1 三个最核心的工具函数我整个系统里真正暴露给智能体的工具其实只有三个load_context、expand_path、lookup_file。load_context用于初始化项目骨架和当前目录结构相当于把“地图索引”加载进智能体的“工作记忆”。它的输出非常简单就是前三层的骨架和当前目录的局部快照。这个函数调用频率很低通常是任务开始时调用一次。def load_context(project_root, depth2): 返回项目骨架和初始工作区 注意控制 depth太深会带来无效 tokens skeleton build_skeleton(project_root, depth) workspace focus_root(project_root) return { skeleton: skeleton, workspace: workspace, hotspot: get_hotspots() }expand_path用于获取某个路径的下一层子节点、文件摘要和引用关系。每次调用产生的上下文量控制在 100~300 token。它的实现核心是“只读取当前节点的直接子节点不递归展开”。def expand_path(path): 展开某个路径返回其下一层节点摘要 node locate(path) if node is None: return {ok: False, error: path not found} children [summarize(child, detail0) for child in node.children] return {ok: True, current: path, children: children}lookup_file用于在检索层里精确或模糊定位文件。它内部走 3.4 描述的模糊匹配流程返回 top-k 候选。每个候选只有路径和一行摘要绝不返回全文。def lookup_file(query, scopesrc, top_k5): candidates rank_paths(query, scopescope) return [{path: p.path, summary: p.summary} for p in candidates[:top_k]]把工具数量控制在三个对智能体特别友好。工具越多模型越容易在“选哪个工具”这个环节上浪费推理步骤。三个工具覆盖了路径上下文的全部核心操作记忆成本也低。4.2 信息压缩策略摘要、剪枝、引用代替全文但仅有工具接口还不够真正的上下文节约发生在信息压缩层。三个工具的所有返回值都必须经过压缩策略处理我用了三个具体手段。路径摘要化给每个路径生成一行短摘要比如“Button.tsx: 通用按钮组件内含 loading 与 disabled 状态处理”。摘要由代码首部注释、函数签名、导出符号共同拼接而成。路径摘要的 token 成本通常只是完整文件的几分之一但模型靠它就能建立对文件的准确预期。目录剪枝不是每个目录都值得展开。我用“启发式深度限制 命名词典”组合遇到node_modules、vendor、build、dist直接跳过目录深度大于 5 的默认折叠目录里只有单文件的把这一个文件直接提升到上一级展示。这些规则的目的是让模型看到有限的路径节点就能掌握结构而不是被层层嵌套拖垮。引用关系代替全量扫描当模型需要知道“改了这个文件会牵扯谁”时最节省上下文的做法是给出该文件的 import 列表和反向引用入口而不是把整个依赖图贴在 prompt 里。反向引用入口我通常只给“上一级引用者的文件名引用位置”不展开引用者的内容。4.3 避免在同一轮里重复投喂相同路径路径上下文设计里另一个隐形杀手是“重复投喂”。模型用expand_path看过src/components的目录后下一轮又因为某个操作重新触发了同样路径的展开这时候如果系统把相同的 300 token 再塞一遍上下文就白白膨胀。我在管理器里给每个路径快照加了“本轮已投喂”标记。同一轮对话里重复请求相同路径会直接复用缓存不再重新拼接。跨轮对话里我维护一个“最近使用的路径集合”再次投喂时优先做“摘要替换”——例如之前已经给过完整路径摘要的这一轮就只给路径本身让模型通过路径名联想。这套机制的实际效果是同样一个“登录页改造”任务随手写出完整 prompt 时可能消耗 3k~5k token 的路径上下文压缩后能压到 800~1200 token而且模型对目标的聚焦度更高。4.4 模拟项目X路径上下文的完整工作链路我用一个虚构项目“模拟项目X”来说明这套机制跑起来的状态。项目结构类似simulate-project-x/ ├─ src/ │ ├─ pages/ │ │ ├─ Login.tsx │ │ └─ Home.tsx │ ├─ components/ │ │ └─ Button.tsx │ ├─ services/ │ │ └─ api.ts │ └─ utils/ │ └─ auth.ts ├─ styles/ │ └─ global.css └─ package.json假设用户给出的指令是“登录页的按钮在移动端显示有点小帮我调一下。”整个过程里路径上下文的调度是这样的智能体调用load_context(project_root, depth2)拿到项目骨架和/src层的局部快照。当前上下文里只多了大约 300 token 的路径信息。智能体发现与“登录页”直接相关的是src/pages/Login.tsx于是调用expand_path(src/pages/Login.tsx)拿到该文件路径摘要以及它的直接子节点列表。模型注意到页面里有用到Button组件需要进一步确认组件属性。智能体调用expand_path(src/components/Button.tsx)拿到按钮组件的摘要。它发现按钮通过 props 控制尺寸于是选中了“修改 Button 组件的默认尺寸”作为切入点或者继续展开样式文件。如果按钮的样式定义在global.css里智能体再调用expand_path(styles/global.css)来查看样式结构。如果用户要求更细节的改动它还能继续通过lookup_file(button size)检索相关样式定义。整条链路里模型只用三次expand_path和一次lookup_file就完成了路径定位没有一次请求过完整文件树。对比之前动不动就把整棵树丢给模型的做法token 占用下降了 70% 以上而且每一步的推理都更精准。5. 进阶优化增量刷新、短路检索与多 Agent 间的路径共享基础版跑通之后还有几个进阶优化点值得投入。它们的效果立竿见影尤其是项目规模变大之后。5.1 增量刷新只更新路径摘要不重建整个快照大项目最常见的痛点是文件结构高频变化。用户一边生成代码、一边安装依赖、一边调试路径管理器如果不能及时感知变化模型手里的路径摘要就会过期。这时候如果每次变更都重建全量快照代价又很高。我的做法是对路径快照做时间戳分级增量刷新。目录下有文件的创建时间、修改时间都会记录在路径状态树里。只有当某个目录的文件变更时间超过阈值时才触发该目录子树的局部重建。其余目录沿用旧快照。这个优化让路径管理与真实代码库保持同步但同步的成本远远低于重算全量。实测下来一个三千文件级别的项目路径快照的重建成本能下降 80%。5.2 短路检索根据任务意图直接锁定候选目录按需检索层虽然已经比全量文件树省很多但依然有优化空间。编码智能体的很多任务意图是高度模式化的“修 bug”和“加 feature”对应的路径分布有明显区别。我为此做了一个“短路检索”先根据任务分类直接缩小检索范围。比如任务是“修复某种运行时错误”优先检索src下的源码文件和最近的error.log任务是“新增一个页面”优先检索pages目录、路由配置、菜单配置任务是“改动接口”优先检索services、api和类型定义目录。这种短路规则不需要模型做复杂推理但能把检索命中率提高一大截尤其在模型拿不准“该往哪里查”的时候。5.3 多 Agent 间共享路径热点避免各自重复探索我在同一个功能区域里会同时部署多个 Agent 子任务比如一个负责改 UI、一个负责改接口、一个负责写测试。如果这三个 Agent 各带一套独立的路径管理器它们会重复展开同一个目录造成严重的资源浪费。我的做法是升级缓存热点层为全局共享存储。每个 Agent 的路径快照和摘要会被写入共享热点表其他 Agent 可以直接复用。这样三个 Agent 同时围绕“登录页改造”工作时其中任意一个已经查过src/pages/Login.tsx另外两个再需要时就不用重新检索和拼接。共享热点表需要注意时效性。同一个文件被一个 Agent 改动后其他 Agent 的缓存必须立刻失效。我用“文件版本号 路径摘要版本号”的双校验机制来保证一旦文件变化所有引用它的 Agent 都会拿到最新版本而不是沿用旧摘要。6. 常见坑与调优建议最后聊几个我在实际调路径上下文时踩过的大坑。这些坑几乎每个做编码智能体的人都会遇到提前知道能少走很多弯路。6.1 这里最大的坑让路径摘要过于详细路径摘要是节省上下文的关键手段但很多人在实现摘要时会不自觉地把“完整文件头”“所有导出符号”“文件内所有类名”都塞进摘要。这样做的结果是单条摘要就从“几 token”膨胀到“几百 token”十个文件就是几 k token跟直接喂文件全文没什么区别。我的调优经验是摘要生成遵循“三行原则”第一行写文件名和一句话功能概述第二行写主要导出符号最多五个第三行写与外部文件的明显引用关系。如果文件实在太复杂第三行可以省略让模型在确认需要时再展开全文。摘要是“目录”不是“详情页”。6.2 缓存过期而不自知导致模型基于过期路径做决策路径管理器的缓存若更新不及时智能体会把已经删除的文件路径当作真实目标来回引用。这种错误比上下文爆炸更难排查因为模型会在推理链路里反复使用同一个错误前提。规避手段除了 5.1 里的时间戳增量刷新还有一个兜底策略路径引用校验。模型每次准备提供一个“即将修改的文件路径”时系统都应该做一次存在性验证。如果这个路径已经不存在或已重命名立刻返回更正信息而不是让模型带着错误的路径继续生成代码。这个校验逻辑在智能体工具链里优先级很高必须在代码生成前触发。6.3 上下文“粘滞性”问题兜底不清理路径上下文残留污染后续轮次编码智能体最隐蔽的上下文问题不是信息不够而是上一轮的信息残留到了下一轮。模型在改 A 模块时读了一堆路径摘要这些摘要不会自动从上下文里消失等下一轮任务转到 B 模块时残留的 A 路径摘要依然占据上下文空间干扰模型对新任务的判断。如果模型一直被过去的信息覆盖新任务推理质量会明显下滑。我常用两个方案缓解一个是任务轮次重置——检测到用户指令指向的目标路径与当前工作区快照差异过大时自动重置路径上下文为骨架层新工作区另一个是衰减重写——给路径摘要加时间衰减权重超过一定轮次后即使还未被挤出上下文系统也会在下一次投喂时用更短的摘要占位替代。6.4 路径分隔符与大小写策略的一致性这个坑比较小但很容易被忽略。不同项目、不同操作系统路径分隔符和大小写规则不一致。Windows 下路径用\类 Unix 下用/有些项目目录名有大小写敏感性。如果路径管理器内部用的规范不统一模型很容易在拼接路径时出错。我的建议是所有路径上下文在系统内部一律统一为 POSIX 风格相对路径并以项目根为基准输出。这样既方便模型理解也避免绝对路径带来的迁移问题。生成文件路径时也全部由管理器生成候选模型不直接拼写路径减少拼写错误。7. 最后分享一点实际体会路径上下文设计走到最后你会发现它本质上不是技术问题而是信息取舍问题。你给模型的信息不应该取决于“我能给什么”而应该取决于“模型这一步需要什么”。路径信息是编码智能体的燃料但燃料太多会淹灭火苗燃料太少又点不着火。恰到好处才是最有挑战也最让人上瘾的部分。我个人实践中最大的感悟是先把路径上下文的“分层结构”想清楚再谈任何缓存、检索、热度优化。结构对了后面所有的优化都是锦上添花结构错了再强的模型也救不回来。希望这篇文章能帮你少走几步弯路在下一版智能体项目里用一个更轻盈的路径上下文换来更聪明的推理输出。
阅读完成 · 觉得有帮助?
咨询建站