name: search-hierarchy description: 搜索工具层次结构 user-invocable: false
搜索工具层次结构
根据查询类型使用最令牌高效的搜索工具。
决策树
查询类型?
├── 结构型(代码模式)
│ → AST-grep (~50 令牌输出)
│ 示例:"def foo", "class Bar", "import X", "@decorator"
│
├── 语义型(概念性问题)
│ → LEANN (~100 令牌,如果仅路径)
│ 示例:"how does auth work", "find error handling patterns"
│
├── 字面型(精确标识符)
│ → Grep(变量输出)
│ 示例:"TemporalMemory", "check_evocation", 正则表达式模式
│
└── 完整上下文(需要完全理解)
→ Read (1500+ 令牌)
在找到正确文件后最后使用
令牌效率比较
| 工具 | 输出大小 | 最佳用途 |
|---|---|---|
| AST-grep | ~50 令牌 | 函数/类定义、导入、装饰器 |
| LEANN | ~100 令牌 | 概念性问题、架构、模式 |
| Grep | ~200-2000 | 精确标识符、正则表达式、文件路径 |
| Read | ~1500+ | 在找到文件后完全理解 |
钩子强制执行
grep-to-leann.sh 钩子自动:
- 检测查询类型(结构型/语义型/字面型)
- 阻止并建议 AST-grep 用于结构型查询
- 阻止并建议 LEANN 用于语义型查询
- 允许字面模式通过到 Grep
做
- 对于代码结构问题,从 AST-grep 开始
- 对于“X 如何工作”的问题,使用 LEANN
- 仅用于精确标识符匹配时使用 Grep
- 仅通过搜索找到文件后读取文件
不做
- 使用 Grep 处理概念性问题(返回无结果)
- 在知道哪些文件相关之前读取文件
- 在 AST-grep 会给出文件:行时使用 Read
- 忽略钩子建议
示例
# 结构型 → AST-grep
ast-grep --pattern "async def $FUNC($$$):" --lang python
# 语义型 → LEANN
leann search opc-dev "how does authentication work" --top-k 3
# 字面型 → Grep
Grep pattern="check_evocation" path=opc/scripts
# 完整上下文 → Read(找到文件后)
Read file_path=opc/scripts/z3_erotetic.py
优化流程
1. AST-grep: “查找异步函数” → 3 个文件:行匹配
2. Read: 仅顶部匹配 → 完全理解
3. 跳过: 4 个不相关文件 → 节省 6000 令牌