【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Agent】【OpenCode】grep 工具提示词(参数内容)
继续分析了 Grep 工具的参数内容,其中pattern是唯一必填的参数,这里的内容是 regex pattern 正则模式,不是普通字符串,AI 可以使用强大的正则语法来进行模糊匹配,path是可选项,圈定了搜索的范围,决定了 Grep 工具从哪个文件夹开始向下递归搜索,如果没传这个参数,工具默认在当前工作目录下全盘扫描,include也是可选项,允许 AI 在调用 Grep 工具时,直接带上一组 Glob 通配符作为过滤器,Grep 工具在底层先执行一次快速的 Glob 匹配,只在 Glob 匹配出的文件里运行正则搜素,排除其他文件的干扰,接着开始分析 Edit 工具,Edit 工具是 AI 可以调用的文件编辑器,并分析了两条规则:先读后写,行号格式前缀细节,下面继续分析
OpenCode
下面继续分析 Edit 工具提示词
上篇 blog 分析到了行号前缀格式细节,下面继续
- 冒号和空格之后的所有内容,才是文件里真实存在的东西,AI 在进行字符串匹配时,必须完全无视前缀,提取空格之后的内容
- 提示词这里强调,绝对不能在要编辑的文件里带上类似
1:这样的行号前缀格式,Edit 工具检测到会直接报错,因为文件的真实内容里是绝对不可能包含这种行号装饰的
举个例子,假设有个 Python 文件,真实内容如下(注意第二行前面有 4 个空格):
deftest():print("hello")当 AI 调用 Read 工具时,它看到返回的内容是这样的
1:deftest():2:print("hello")此时 AI 必须极其聪明地识别出,第二行的开头2:是前缀,而紧接着的 4 个空格才是文件真实的缩进,此时可能有三种情况
- 错误的 oldString(AI 幻觉):AI 把看到的一整行都复制下来
2:print(\"hello\")结果 Edit 工具会报错,因为真实的文件里没有2:
- 半吊子的 oldString(丢了缩进):AI 去掉了行号,但把缩进也当成前缀的一部分给误删掉了,结果是
print(\"hello\")对于 Python 这种靠缩进识别语法的语言,会导致代码逻辑错误,或者因为匹配不到(如果原文件必须带缩进匹配)而失败
- 完美的 oldString(符合提示词要求):AI 严格按照提示词,只取冒号 + 空格之后的所有内容,并且完美保留了后面的原始缩进
print(\"hello\")注意前面保留了那 4 个空格,所以这里的第二条规则,实际上在教 AI 如何正确解析 Read 工具的返回格式,精准提取出空格之后的真实代码,既不带上多余的行号,也不丢掉必要的缩进
上面提到了 oldString,提示词里还有 newString,这里先简要介绍下
oldString(原本要替换掉的旧代码):AI 在文件里想要精准定位,并抹除的那段原始代码,oldString相当于一个锚点,Edit 工具会去文件里找到这段一模一样的段落,然后将其替换掉newString(即将要换上去的新代码):格式完全自由,不需要考虑行号前缀,只需要把 AI 想要生成的最终代码(包括缩进和换行)放进去即可,Edit 工具会直接把oldString所在的位置挖掉,然后把newString填进去
OK,本篇先,到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog