关于平凡AI 提示词造就世界最强ast-grep 规则这件事

大家好,我是 ast-grep 的作者。ast-grep 是一个能让你像做手术一样,精准查找和替换代码的命令行工具。它直接在代码的真实骨架------语法树(AST)上操作。虽然功能强大,但手写 ast-grep 规则是个不小的门槛,需要你彻底玩明白这个工具才行。

这个项目从设计之初,就是为"人"打造的工具,而不是为了追 AI 的风口。不过,ast-grep 也一直在探索如何利用 AI 来优化人类开发者的体验。这篇文章,就是我尝试用 AI 来生成 YAML 规则的心路历程。

为啥 AI 写 ast-grep 规则这么难?

让 AI 来生成 ast-grep 规则,真不是件容易事。首先,ast-grep 相对较新,大语言模型(LLM)的训练数据里基本没见过它,所以你让它写规则,它要么一本正经地胡说八道,要么干脆就摆烂看不懂。

虽然我们可以用"上下文学习"(In-context learning)的方式,在提示词里给它几个例子,让它临场学会语法,但这解决不了一个更头疼的问题------"复合错误"(compounding errors)。

ast-grep 的规则尤其如此,它常常是由一堆更小的原子规则组合而成的。我们人类开发者在写的时候,也得通过反复试错来调试这些小规则,再小心翼翼地把它们组合成一个能正常工作的整体。对于 LLM 来说,一个小地方的错误,就像滚雪球一样,最终导致整个规则完全报废。正如论文 《Faith and Fate》 中所说:

这些任务需要将问题分解为子步骤,并将这些步骤综合成一个精确的答案。

这就解释了为什么简单地向 LLM 提问对 ast-grep 不起作用。不过,好消息是,现在各种"会思考"、"懂反思"的 Agentic 模式开始崭露头角,它们能纠正自己的错误,并可能降低这类错误的概率。所以,是时候再给 AI 规则生成一次机会了!

一年前的首次尝试

我一年前的初次尝试,简直是被现实狠狠打了脸。当时用 DSPy 搭建了一个固定的 Agent 工作流:生成用例 -> 创建代码范例 -> 用自然语言描述规则 -> 翻译成 ast-grep 规则 -> 最终验证。

结果呢?四个字:惨不忍睹

我当时用的模型,基本都是 Ollamaaistudio 上的免费 API(感谢谷爹 $GOOG)。它们连固定的输出格式都做不到,代码范例错漏百出,更别提生成有效的 ast-grep 规则了。而且,那会儿模型的上下文窗口也短得可怜,我连一份完整的说明书都塞不进去。我感觉自己缺了两个关键环节:一个是让 Agent 能根据搜索结果的反馈来优化规则,另一个是把复杂的需求动态拆解成更小的子任务。我的 Agent 架构虽然能解决这些问题,但背后的模型实在是心有余而力不足。

一年后:更好的模型,更好的 Agent

快进到今天,世界变了。现代 LLM 不仅"记忆力"超群,而且理解复杂指令的能力也大大提升。有了这些,再加上受 Anthropic 最新指南的启发,我决定再战一次。

这次我发现,根本不需要什么复杂的 Agent 框架。像 Cursor 这样的 AI 编程工具,已经为我们这些工具开发者提供了足够好的 Agent 框架。所谓重剑无锋、大巧不工。真正的秘诀其实非常简单:提示词工程(Prompt Engineering) 。我说的"提示词工程",不是指任何框架或技巧,就是给人和 AI 写一份清晰、易懂的"操作手册"

当然,在打磨好提示词之前,我还是见识了不同模型各种有趣的翻车现场,这些现象某种程度上也反映了各大 LLM 厂商的训练思路:

  • OpenAI O3 :这家伙简直是"幻觉"的代名词,天马行空地发明了一套看起来像 CodeQLjscodeshift 的语法,完全无视了网上能找到的 ast-grep 文档。一旦工具报错,它就彻底懵圈,立马放弃治疗。那感觉,就像 OpenAI 的预训练数据集瞥了一眼我的文档,然后自信满满地决定"我比你更懂",接着就把我的文档扔进了垃圾桶。(哦豁,就像开智对待我的简历一样)

  • Gemini :这位就正常多了。它的"幻觉"至少还在一个圈子里,会借鉴一个相关但更成熟的工具------Semgrep 的语法。(再次感谢谷歌爸爸的抬爱)。它在处理错误方面也还行,但就是有点"犟",老想自己发明一套 ast-grep 的命令行用法,而不是用我提供MCP 工具。

  • Claude 4:这是开箱体验最好的一个。它能准确识别出 ast-grep,并生成语法正确的规则。看来 Anthropic 的训练数据已经收录了 ast-grep 的文档!好耶!不过,它在处理那些决定规则能否正常工作的语义细节上还是有点吃力。但值得表扬的是,它真的非常努力,会一遍又一遍地用不同的输入参数尝试我给的工具,展现出了其他模型所没有的"执着"。

像教人一样给 AI Agent 写提示词

在反复迭代提示词之后,我发现,这三个模型其实都能表现得非常出色。关键在于,不要把提示词当成什么"魔法咒语",而是把它当作一本条理清晰的"操作手册"

我最终的提示词,给了 AI 一个简单的五步计划:

  1. 首先,清晰地理解用户的需求。
  2. 其次,写一个用户想要查找的简单代码片段。
  3. 然后,编写一个能够精确匹配该代码片段的 ast-grep 规则。
  4. 接着,用这个例子来测试规则,确保它能正常工作。
  5. 最后,用验证过的规则在代码库里进行搜索

这个清晰的、一步步的流程,把那些有些神经兮兮的天才,变成了更可靠的助理。通过分解问题,并提供一个验证闭环,我给了模型一个成功的框架。你可以在 sg-mcp GitHub 仓库里看到完整的提示词。

最终的效果相当惊艳,可以看看下面的演示视频。视频没有加速,但有音乐和猫猫。(看着 AI 自动生成规则,而我自己则像视频里的小猫一样点头赞许,这种感觉真是该死的满足)

这次的经历再次印证了我的一个核心信念:AI 的真正力量,不在于取代开发者,而在于为他们打造更好的工具。 这也表明,随着大语言模型的能力越来越强,教导 AI 的最佳方式不是通过复杂的框架或僵化的流程,而是通过清晰、人类可读的指令。

通过教会 AI 如何编写规则,我希望 ast-grep 能变得更容易上手、更强大、更方便使用。

Happy grepping!

相关推荐
Turing_010几秒前
HarmonyOS隐私保护全攻略:从入门到精通
前端
Turing_0101 分钟前
HarmonyOS应用安全全攻略:从系统到代码的全面防护
前端
Beginner x_u7 分钟前
[AJAX 实战] 图书管理系统下 编辑图书
前端·javascript·ajax·bootstrap
Ace_31750887768 分钟前
# 唯品会商品详情接口开发指南
前端
Beginner x_u10 分钟前
【AJAX 实战】图书管理系统上 渲染图书列表+新增图书+删除图书
前端·ajax·bootstrap
恋猫de小郭14 分钟前
Flutter 里的像素对齐问题,深入理解为什么界面有时候会出现诡异的细线?
android·前端·flutter
老周聊大模型16 分钟前
ReAct Agent终极指南|LangChain实战×多工具调度×幻觉消除(
人工智能·程序员
学术 学术 Fun19 分钟前
Vui:轻量级语音对话模型整合包,让交互更自然
人工智能·深度学习·ai
anyup27 分钟前
AI 也救不了的前端坑,你遇到过吗?社区、AI、源码三重排查!
前端·数据可视化·cursor
tager34 分钟前
还在为跨框架的微信表情包烦恼?我写了个通用的,拿去吧!🚀
前端·vue.js·react.js