Skip to content

上下文管理技巧:如何在不浪费 token 的情况下提供必要信息

使用 AI 时经常遇到两个问题,上下文不够 AI 说信息不足无法回答,或者上下文太多 AI 被无关信息干扰给出错误答案。经过几个月的摸索,学会了在不浪费 token 的情况下提供必要信息。

想让 AI 修改一个函数,于是把整个项目的代码都发给了 AI,package.json 一百行、main.js 五百行、utils.js 两百行、config.js 一百五十行,还有 README.md、CONTRIBUTING.md 等,总共两千多行代码。AI 回答代码太复杂无法分析,或者建议简化后再提问,或者给出了完全无关的建议。问题在于信息过载,AI 被大量无关信息淹没无法找到关键信息。token 浪费,大部分信息 AI 根本没用到占用了宝贵的上下文窗口。注意力分散,AI 不知道该关注哪部分。

吸取教训后只给关键部分,请修改这个函数,foo 函数返回一。AI 给出了修改建议,但不知道这个函数在整个项目中的作用,不了解项目的编码规范,修改后与其他部分不兼容。信息太少导致 AI 缺少必要的上下文。

经过多次试错,总结了一个上下文管理框架。结构包括核心信息 AI 必须知道的关键内容、上下文信息有助于理解但非必需的信息、约束信息必须遵守的规则和规范、排除信息 AI 不需要知道的无关内容。

用上面的函数修改例子,现在的做法。项目上下文这是用户认证模块用于权限检查。核心代码 validateUser 函数检查用户是否有效,如果不存在返回假,返回用户激活并且角色是管理员。修改要求添加对用户过期时间的检查,如果用户过期则返回假。约束条件保持向后兼容,添加错误处理,遵循 ESLint 规范。AI 能准确理解需求并给出符合项目规范的修改建议。

将信息按重要性分层。一层必须核心代码加具体要求,二层重要上下文加约束,三层可选相关代码片段,四层排除无关文件。

不要发送整个文件只发送相关部分。错误做法发送整个 utils.js 文件两百行。正确做法发送相关函数,formatDate 日期格式化函数,parseDate 日期解析函数。

对于复杂的项目提供摘要而不是原文。项目结构 src auth 认证相关、src api API 调用、src utils 工具函数。编码规范使用 ESLint、异步函数用 async await、错误处理用 try catch。

根据 AI 的反馈调整上下文。如果 AI 说信息不足添加更多上下文信息,如果 AI 给出无关建议减少无关信息,如果 AI 理解错误添加澄清信息。

重构大型组件之前信息过载发送整个 React 项目五千多行,AI 无法找到重点。现在结构化,核心组件 UserList.jsx 一百五十行只发送关键部分,上下文这是管理员页面用于管理用户,问题组件性能差渲染一千加用户时卡顿。约束不能改变 API 接口,需要保持现有 UI,使用 React.memo 优化。相关代码 UserService.js API 调用部分、UserItem.jsx 子组件。AI 准确识别性能问题并给出优化建议。

每次给 AI 提供信息前会检查,核心信息是否足够 AI 能完成任务,上下文信息是否必要有助于理解,约束信息是否明确规则和规范,是否有无关信息可以排除的,token 是否在限制内不超过上下文窗口。

对于连续对话可以复用之前的上下文。后续问题基于刚才的修改现在还需要添加缓存功能。当项目发生变化时及时更新上下文,比如提醒刚才修改了 API 接口现在 getUserInfo 返回字段有变化。定期清理过时的上下文,比如忽略之前关于旧 API 的讨论我们现在使用新接口。

上下文管理的核心是信息的有效性。不是信息越多越好,而是有用信息的比例越高越好。关键是要知道 AI 需要什么信息。好的上下文管理关键在精确、结构化、相关性、动态调整。这套方法减少了百分之七十的 token 浪费,同时提高了 AI 的准确性。

Built with <3