名称:搜索工具层次结构 描述:搜索工具层次结构
搜索工具层次结构
为每种查询类型使用最令牌高效的搜索工具。
决策树
查询类型?
├── 结构(代码模式)
│ → AST-grep(约50令牌输出)
│ 示例:"def foo"、"class Bar"、"import X"、"@decorator"
│
├── 语义(概念性问题)
│ → LEANN(约100令牌,如果仅路径)
│ 示例:"认证如何工作"、"查找错误处理模式"
│
├── 字面(精确标识符)
│ → 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 "认证如何工作" --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令牌