得益于大模型的发展,相比复杂的提示词工程, 上下文工程 变得更加重要。只要把问题描述清楚,提供准确的上下文,就能获得更好的结果。
LLM 拥有百科全书般的知识与记忆能力,远远超过任何单一人类个体。 它们可以轻松记住 Git SHA 哈希值、各种信息、文件结构等内容。 直接把一大片的错误信息粘贴给它都是没问题的(甚至错乱都是可以的),虽然人类不行。 大模型 Token 的上下文窗口受限,而人类能够通过抽象和压缩,实现几乎无限的上下文整合与理解。 车往哪里开,可能还是要程序员决定,因为程序员相对 AI,拥有无限的上下文。
AI 协作的三个关键步骤:
「明确的提示语」(prompt)很关键:如果提示太模糊,AI 可能偏离预期,导致验证失败;一旦验证失败,就要不断试错、反复循环;所以花点时间写更明确、清晰的 prompt,其实是提高效率的关键。
在关键时候帮助 Windsurf 切换上下文,至关重要。 如果发现它采集到的 上下文不准确,可以重启,可以新开 tab,可以直接给它指定明确的代码位置,就非常准了。 还有就是要把你的问题进一步抽象简化,能表现的更好。 Windsurf 升级后,在我的工作中,绝大部分代码都能一遍过。
Karpathy 观察到,目前最有效和 AI 协作模式是“AI 负责生成,人类负责验证”,要让这个循环尽可能快速运转,有两个可以调整的方向:
第一,加速人类验证过程:设计验证友善的输出格式。
所有 AI 的输出都应该考虑人类验证的便利性,这可能意味著结构化的呈现、清楚的标记,或是互动式的介面。 比如说,以程式开发为例,与其让 AI 用文字描述改动,不如直接显示程式的红绿差异对比。这让人类能快速扫描并理解变更,大幅提升验证速度。
第二,让 AI 在控制范围内:避免过度自主。
在这里需要让 AI 尽可能提升它可以通过人类成功验证的机率。Karpathy 提到要给 AI 套上缰绳:“如果你想要完成实际工作,过度反应的 agent 就不是那么棒了。” 他在自己的工作中总是害怕得到太大的程式码差异,宁愿采用小增量的方式,确保每一步都能被理解和验证。 除此之外,模糊的提示会导致 AI 偏离预期,进而增加验证失败的机率。所以花点时间撰写具体明确的 prompt,可以大幅提高验证成功率。 Karpathy 在演讲中提到,与 AI 更好协作的方法包括:提供更多背景信息、拆解问题,当问题越具体,AI 表现得越好。建立详细的文档,通过 LLM 来做会变得更轻松。
注意:以下为基于观察和公开信息的推测性分析,并非官方技术文档
可以认为由这几部分组成:
这个系统通过语法解析 → 上下文理解 → AI 推理 → 意图分类 → 动作建议的完整管道,实现了高度智能和个性化的用户意图分析。
Windsurf 完整交互流程架构
与 AI 进行头脑风暴是氛围编程的重要环节,可以充分利用 AI 的知识广度和快速思维能力。
让大模型根据工程提供优化方法。 大模型一口气说了十个正确的大道理,关键时刻,可能还是依赖人的判断。 提供数据,询问怎么优化,他可以说十条建议,看起来都好有道理,能提供大量灵感:
AI 提供灵感和分析,人类负责决策和执行 ,这是最有效的协作模式。
一切都是围绕上下文优化进行的。 上下文包含:
这些看似无关紧要的操作,对 Windsurf 非常关键。 能让它的上下文收集逻辑工作得更好。
Windsurf.exe 是一个 64 位程序,占了非常大的内存,出现过内存不足崩溃。 language_server_windows_x64.exe 也会得到重启。 这玩意貌似有点问题,久了内存会越来越大。
启动的时候,Windsurf 会对文件夹代码进行 RAG 索引,更小的索引数据库更有利于上下文检索。
最可靠的方法是: 从你的大工程里面抽离出独立完备的小问题,然后全部搞好验收后再整合回大工程。 从大问题中抽象出小问题,创建独立的文件夹工程,独立运行调试通过后,再像积木一样拼装成大工程。
可以想象,一个巨大的项目,要 RAG 抽取上下文是非常困难的,但是一个小工程,往往非常准确。
避免问题和问题上下文互相干扰。
最好包含文件的硬盘绝对路径和代码行,大模型能看懂,这是它最擅长的事情。
直接粘贴成片的错误信息,大模型非常喜欢。
一个印象深刻的例子是:
这个项目以后的运行都用这个 python 跑,记住了:
I:\ocr_data\Python\Python310-mineru\Python310-mineru\python.exe
然后它真的记住了。
Traceback (most recent call last):
File "I:\pdfai_serv\font\workspace\font_serv.py", line 152, in <module>
main_serv()
File "I:\pdfai_serv\font\workspace\font_serv.py", line 133, in main_serv
code = kremote.remote_init(idx, parent_callback, sys.argv)
File "I:\pdfai_serv\font\workspace\pythonx\kremote\kremote_wrapper.py", line 473, in remote_init
result = self._remote_Init(idx, c_callback_func, argc, self.argv_array)
OSError: exception: access violation reading 0x000000000000000D
最佳搭档,写了好多遍都写不对,提示一下,全部秒对。
memmove
是真正的内存复制,不存在参数传递拷贝问题const char**
就是一个内存地址,我们直接往这个地址写入指针值它遇到问题了,就会新建文件 test,造成一堆垃圾文件代码。 这些都会严重干扰 RAG 上下文收集。
相应的,这个任务也可以直接交给大模型:
用 PowerShell 命令 删除临时文件或者代码文件。
这样做,可以有效的保证 RAG 索引的有效和小巧。
顺便说明 这样做的意图,大模型可以工作的更好。
合理拆分源码文件:
这样做的好处是让 AI 更容易理解和处理代码结构。
因为底层是大语言模型,有歧义的文件名或者变量名会严重误导模型。 关键思考,要不断重构源文件名和变量名。
工程的整个结构和风格要遵循传统,以便和大模型的大量训练语料保持一致。 尽量不要有过多的个人风格和标新立异。
有这样一段代码:
model:
choice: torchvision-mobilenet_v2 # torchvision- or custom-
num_classes: 7 # out_channels of fc, maybe be not equal to num_classes of train_dir.
大模型老是出错,问题就出在 num_classes
的命名,后来全部改成 fc_out_features
并加上准确的注释,就再也没错过了:
model:
choice: torchvision-mobilenet_v2 # torchvision- or custom-
fc_out_features: 7 # out_channels of fc, maybe be not equal to num_classes of train_dir.
# eg: maybe more than num_classes
避免让 AI 一次性进行大幅度的代码修改。
这样可以避免出现大量错误时难以回溯和修复的问题。
Windsurf 不仅能处理代码,还能分析:
直接粘贴或拖拽这些内容,比纯文字描述更准确。
定期清理项目:
干净的代码库有助于 AI 更准确地理解项目结构。
在项目根目录创建关键文件:
README.md
- 项目概述和架构说明ARCHITECTURE.md
- 详细的技术架构文档TODO.md
- 当前任务和已知问题列表这些文件充当 "上下文锚点 ",帮助 AI 快速理解项目全貌。
在关键位置添加详细注释:
# IMPORTANT: This function handles user authentication
# Input: username (str), password (str)
# Output: JWT token (str) or raises AuthenticationError
# Dependencies: requires valid database connection
def authenticate_user(username, password):
# Implementation here
清晰的注释可以显著提高 AI 理解代码意图的准确性。
不要使用通用的 try-except
,而要:
try:
result = api_call()
except ConnectionError as e:
logger.error(f"网络连接失败: {e}")
raise
except ValidationError as e:
logger.error(f"数据验证失败: {e}")
raise
具体的异常类型有助于 AI 更准确地定位和解决问题。
充分利用 Git:
这样可以轻松回滚有问题的 AI 修改。
为常见任务创建标准化的提示模板:
任务类型:[功能开发 /Bug 修复 / 代码重构]
相关文件:[文件路径列表]
预期结果:[具体描述期望的输出]
限制条件:[不能修改的部分或必须遵守的规则]
模板化可以提高沟通效率和结果一致性。
当 AI 改了 5-6 遍都改不对,尝试删除,让它重写。
氛围编程不是替代传统编程,而是对传统编程的增强和进化。 工具会进化,但工程思维和问题解决能力永远是程序员的核心竞争力。