90、【Agent】【OpenCode】grep 工具提示词
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Agent】【OpenCode】glob 工具提示词(参数内容)
分析了 Glob 工具的参数内容,其中pattern(搜索模式)是必填项,path(搜索范围)是可选项,默认使用当前的工作目录进行搜索,如果想在当前项目中搜索,直接忽略删掉该字段,使用默认值即可,不要填入undefine或者null这样的字段,如果 AI 知道目标文件在哪个具体路径下,则鼓励填入路径,缩小搜索范围,以提升速度,接着介绍了 Grep 工具,Grep 作为极速的内容搜索工具,核心作用是按文件内容查找文件,其本质是 Bash 中grep命令的封装版,支持完整的正则表达式,可以根据文件内容的正则表达式 Regex 来快速定位代码片段,下面继续分析
OpenCode
下面继续看 Grep 工具剩下的提示词
- 提示可以通过 Glob 通配符模式搜索指定文件,比如
*.js,*.{ts,tsx}等 - 返回结果按修改时间排序,并且内容自带行号(和前面介绍的 Read 工具一样),让 AI 能精准定位到代码的具体位置
和之前 Glob 工具一样,这里对 Grep 和 Task 工具做了边界界定
- 简单任务:如果知道文件里有什么特殊的内容,用 Grep 工具可以直接找出带有这些内容的文件,一步到位
- 复杂任务:如果是一个开放式的问题,AI 需要先用 Glob 搜索文件名,再用 Grep 工具找内容,可能还要反复几轮,就应该用 Task 工具,和之前一样
这里提到了 Glob 和 Grep 工具的配合,下面说下它们之间的关系,做个比喻,就像一个学生在图书馆里找书,其中 Glob 工具是看书名和目录,而 Grep 工具则是翻开书,去读书里面的文字,这两个工具的分工完全不同,缺一不可
- Glob 工具找的是外壳(文件名),Glob 能识别文件叫什么名字,是什么后缀,在哪个文件夹里,比如想找所有的 Vue 组件可以用 Glob 搜索
**/*.vue,但 Glob 根本不知道这些*.vue文件里面写的是什么内容,是登录逻辑,还是注销逻辑 - Grep 找的是文件内容,Grep 能钻进文件里,看里面的代码,文字具体写了什么,比如想找哪里定义了用户登录的函数,可以先用 Grep 去搜索
function login,但 Grep 搜索非常消耗资源,如果直接用 Grep 漫无目的地去翻遍整个硬盘,则速度会非常慢
所以此时就需要组合使用 Grep 和 Glob,在复杂的变成任务中,AI 经常需要找同时满足名字和内容两个条件的文件,此时单靠一个工具是搞不定的,比如用户提了个需求:查找所有关于用户注册的测试文件,此时
- 如果只用 Grep 工具搜 register(注册),那能找出一堆包含【register】关键词的文件,但是,这些可能是后端代码,也可能是前端页面,甚至是一个文档,无法精准筛选出那些是测试文件
- 如果只用 Glob 工具搜
**/*.test.js(测试文件),那可能会找出几百个测试文件,但 AI 不知道哪些才是写用户注册逻辑的
所以正确的执行逻辑一定是先用 Glob 工具圈地,快速,低成本地筛选出目标文件,比如src/**/*.js,瞬间把搜索范围从几万个文件缩小到几百个源文件,然后再用 Grep 工具深挖,在 Glob 工具划定的范围里,快速完成内容检索
在真实的 Linux 命令行中,也经常会看到这种先 Glob 后 Grep 的组合,比如
- 先 Glob 定范围,再 Grep 找内容
find . -name “*.js” -exec grep “register” {} +
- 用更现代的
rg命令(ripgrep),下面的-g参数就是先做 Glob 过滤
rg “register” -g “*.js”
而不是类似下面这种全盘扫描,慢且危险,会把一些构建目录中几万行无关代码页翻出来
grep -r “register” .
OK,本篇先,到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
