AI 编程助手打造(四):驯服大模型!硬核 Prompt 协议与无缝 Diff 解析引擎

0 阅读4分钟

AI 编程助手打造(四):驯服大模型!硬核 Prompt 协议与无缝 Diff 解析引擎

在上回,我们完成了沉浸式 UI 的搭建,并赋予了输入框“嗅探”指令的双重人格。这套机制让 IDE 和网页版 AI 之间的交互变得无比丝滑。

但是,只要你真正拿 API 或网页版 AI 写过代码,就会立刻明白一个极其绝望的痛点:大模型太爱说废话了!

“好的,没问题,为您生成以下代码!”

“这段代码的原理是……”

“请注意,您可能还需要修改……”

如果你只是个初学者,这些废话可能显得很贴心。但对于我们要打造的全自动、一键注入的插件来说,这些毫无逻辑的 Markdown 文本和聊天提示语简直是灾难!我们的解析引擎根本无法在这一堆废话中精准提取出哪部分是需要替换的旧代码,哪部分是新代码。

为了让 AI 彻底沦为一台没有感情的“代码输出机器”,我们需要给它定下铁血“军规”。这就是我们今天的主角:硬核 Prompt 协议(Code Edit Protocol)

🤐 第一铁律:绝对的“零碎语”(ZERO CHATTER)

在我们的底层 Kotlin 源码中,你可以看到无论是哪个环节的 Prompt,排在第 0 位的永远是这条规矩:

Kotlin

0. 零碎语(ZERO CHATTER):仅输出有效标签。禁止任何解释、文本说明或 Markdown 格式。

我们不需要 AI 教我们做事,我们需要它按照极其严格的 XML/标签化格式输出结构化数据。这正是我们在第一步**“海选文件”“环境预检”**时的核心逻辑:

  • FileSelectionPrompt:基于上一篇提到的“代码骨架”,AI 只需要干脆利落地返回 <CONTEXT_FILE path="绝对路径"/>。多一个字都不行,直接为下一步抓取全量源码提供精准的靶标。
  • PreCheckPrompt:这就是一道安检门。为了防止网页端 AI 偶尔“断片”遗忘了上下文,在真正写代码前,它必须预检环境。如果没有收到 Feature(需求)或 Code Edit Protocol(编辑协议),它会直接抛出 REQUEST_FEATURE 这样的标识,插件捕捉到后会自动补发。

⚔️ 核心魔法:Git 级别的极简 Diff 协议

接下来,就是整个工具的灵魂——CodeEditProtocol

当 AI 拿到全量源码并决定开刀时,它绝不能把整个文件重写一遍(极其浪费 Token,且等待时间极长),而是必须采用局部修改(Partial Edit) 。为了让 JetBrains 插件能完美解析这些修改并一键 Apply,我们借鉴了 Git 合并冲突时的标记语法。

来看看我们是怎么逼迫 AI 遵守规则的:

1. 精确制导的 SEARCH / REPLACE 块

CodeEditProtocol 中,我们定义了极其严格的编辑语法:

Kotlin

<<<<<<< SEARCH
[必须要替换的旧代码,加上前后 2-4 行未修改的上下文]
=======
[新代码]
>>>>>>> REPLACE

为什么要强调包含 2-4 行上下文?因为代码里充斥着无数个 return true;}</script>。如果没有上下文保证唯一性(规则 5),插件在执行全文正则替换时就会瞬间瞎眼,把不该改的地方也改了。

2. “不准用占位符”与“缩进强迫症”

很多 AI 工具(哪怕是 Cursor)也会经常犯一个贱:为了偷懒,给你输出 // ... other code ...。这在自动化替换中是致命的。

因此,我们的军规明确规定(规则 2 & 4):必须是 100% 可运行的代码,严禁占位符!并且 SEARCH 块必须与本地文件完全精确匹配,连缩进和空格都不能差一丝一毫。只有这样,插件后端的 String 匹配引擎才能百发百中。

3. 智能的 Token 效率管理

如果你让 AI 把一个 100 行的方法重写 90 行,再用 SEARCH/REPLACE 块输出,那简直脱裤子放屁。所以我们加入了规则 7:如果修改的代价太大,AI 将自动放弃局部 Diff,直接触发 <CREATE_FILE> 标签,全量覆盖或者生成新文件。


🚀 工作流大闭环:见证奇迹的时刻

现在,结合我们之前所有的架构,整个“白嫖流”工作流终于形成了完美的闭环:

  1. 你在 IDE 的沉浸式面板输入需求。
  2. 插件在后台默默组装好带有绝对路径、代码骨架以及上述 PreCheckProtocol 军规的极客 Prompt。
  3. 你将其粘贴到网页版 ChatGPT 或 Claude 中。
  4. 网页版 AI 被“军规”震慑,吓得一句废话不敢说,直接吐出一串带有 <<<<<<< SEARCH 的标准 Diff 报文。
  5. 你把这串报文往 IDE 的输入框一丢。
  6. 插件瞬间识别到协议头,自动接管! 它会在 JetBrains 的内存树(PSI / Document)中精准定位到那个文件,找到那几行 SEARCH 代码,然后“唰”的一下,优雅地替换为 REPLACE 里的代码。

没有高昂的 API 账单,没有龟速的代码生成,有的只是全网最强网页端模型的狂暴算力,以及 IDE 内零缝隙的 Diff 注入。