大模型代码生成中的上下文窗口优化:从理论到实践

0 阅读4分钟

万字详解让大模型写出好代码:上下文窗口的工程化实践-腾讯云开发者社区-腾讯云

实际场景的方法论指导

Cursor 与 Claude4.0 sonnet 的交互,分析 React 官方项目

我正在编写一篇技术文章,主题聚焦于模型上下文窗口的大小对于 AI 生成代码或者分析结果的质量。
这篇文章将会包含如何降低模型上下文大小占用的方法论。
该项目是 React 官方项目,异常庞大,如果我提出问题,你是否是通过将整个项目的所有代码文件来读取进行分析的?
如果不是,你和 CursorIDE 之间进行了哪些交互?分别读取了什么文件?这些交互阶段分别占用了多少 token?
下面是我的问题,以你针对这个问题的分析来回答我上面的要求:
帮我看一下 useState 这个 Hook 是怎么实现的

image.png

image.png

  • 使用比较语义化的搜索进行描述性查询,不直接进行关键词搜索。因为关键词搜索可能搜索到与最终问题结果无关的内容
  • 将搜索进行分层,搜索策略从宽泛到具体,先找到入口点和接口定义,再深入核心实现,最后查看具体的算法细节。进一步降低读取的代码量
  • 只选择性读取代码的实际内容,只读取特定文件的关键部分,避免读取整个大文件,并且限制每个文件能够读取的内容量,防止将超大文件直接读入从而降低内容生成速度和增加 token 占用量
  • 对于拿到的搜索发现,及时进行记录,并且确认搜索结果是否合法/是否符合需求。在每次拿到搜索结果后与之前的搜索结果进行确认和关联,以此来保持搜索结果的相关性,建立代码之间的关联关系。

如何编写 Prompt,避免上下文窗口容量溢出

多轮对话上下文窗口容量溢出

  • 主动要求 AI 对关键信息进行记忆:每当我们有重要发现时,我们可以对 AI 说:
请记忆以下重要内容:xxx
  • 既然 AI 本身由于上下文窗口大小的限制,记忆能力并不是无限的,所以我们可以每间隔几轮或者十几轮,对 AI 说:
"请总结当前调试状态,包括:
- 核心问题
- 已排除的可能性
- 下一步方向"
  • 我们可以针对遇到的新的错误,主动要求 AI 删掉某些比较旧的无用上文,来让它有更多的空间来对新的内容进行存储,例如我们要求:
## 更新 #[序号] - [时间戳]

### 新发现 [P0/P1/P2]
[具体发现内容]

### 验证结果 [P1]
- 假设: [具体假设]
- 验证方法: [如何验证]
- 结果: [成功/失败/部分成功]
- 结论: [从结果得出的结论]

### 新的错误信息 [P0]

一轮对话中上下文窗口溢出

  • 将问题进行分段处理
# 原始复杂问题 → 分解为多个子问题

## 子问题1:错误定位
"React应用在生产环境出现白屏,错误信息是:[核心错误信息],请帮我分析可能的原因"

## 子问题2:环境差异
"开发环境正常,生产环境白屏,这种情况通常是什么原因?我的环境配置是:[关键配置]"

## 子问题3:具体解决
"确认是 polyfill 问题,如何在 webpack 配置中添加 Object.entries 的 polyfill?"
  • 不要在对话中粘贴大段代码,而是使用代码摘要,或者提醒模型哪部分更加重要,更加值得关注。
# 对话1结束时
"请生成一个50字以内的问题摘要,包含:1)核心问题 2)主要发现 3)下一步建议,我将用于开启新对话"

# AI回复示例"SUMMARY: React生产环境TypeError,Safari特有,缺少polyfill。FOUND: Object.entries不支持。NEXT: 检查babel配置和browserlist设置。"

或者:

# 不要这样:[粘贴100行代码]

# 而是这样:
CODE: OrderForm.jsx:45, handleSubmit function
ISSUE: Accessing user.data.id where user might be undefined
CONTEXT: After async API call, before setState