# SGR vs Manual Search: Детальный анализ
## Обзор тестирования
- **Модель:** gemini-2.5-flash-lite
- **Вопросов протестировано:** 2
- **SGR recall:** 0%
- **Мой recall:** ~60%
---
## Q2: Django QuerySet Lazy Evaluation - Детальный разбор
### Ожидаемый ответ
`django/db/models/query.py` с методами `__iter__`, `_fetch_all`, `_result_cache`
### Что делал SGR
#### ✅ Правильно определил термины (Step 32)
```json
{
"primary_terms": ["QuerySet", "db.models.query", "LazyList", "db.utils"],
"likely_files": ["django/db/models/query.py", "django/db/models/query_utils.py"]
}
```
**SGR ПРАВИЛЬНО определил файл `django/db/models/query.py`!**
#### ❌ Проблема 1: Не прочитал найденный файл
SGR определил нужный файл в Step 35, но НИКОГДА не использовал `read_file` чтобы его прочитать.
#### ❌ Проблема 2: Слишком широкий grep
```bash
grep "QuerySet" /repo # Нашёл 50+ файлов с упоминаниями
```
Результаты grep:
- `django/shortcuts.py` - упоминание QuerySet
- `tests/test_utils/tests.py` - тест
- `django/test/testcases.py` - тест
**Мой подход:**
```bash
grep "_result_cache|def __iter__|_fetch_all" django/db/models/query.py
```
Я искал КОНКРЕТНЫЕ методы в КОНКРЕТНОМ файле.
#### ❌ Проблема 3: Неверный формат пути в финальном ответе
SGR сгенерировал: `django.db.models.query.py` (с точками)
Правильно: `django/db/models/query.py` (со слэшами)
```
Step 94: Skipping non-existent file: django.db.models.query.py
```
#### ❌ Проблема 4: Преждевременная остановка
В Step 85 LLM решил остановиться с `should_continue: false` несмотря на:
- confidence = `low-medium`
- Выявленный правильный файл не был прочитан
- Не найдена конкретная реализация
---
## Q1: Django Middleware Lifecycle - Детальный разбор
### Ожидаемые файлы
- `django/core/handlers/base.py`
- `django/core/handlers/wsgi.py`
- `django/core/handlers/exception.py`
- `django/utils/deprecation.py`
### Что нашёл SGR
- `django/conf/global_settings.py` (настройки, не код)
- `django/utils/decorators.py` (декораторы, не handlers)
### Проблемы
#### ❌ Неправильная интерпретация результатов
SGR нашёл упоминание middleware в `global_settings.py`:
```
django/conf/global_settings.py:469: # middleware will be applied in the order given
```
Это КОММЕНТАРИЙ о настройках, не реализация!
#### ❌ Не искал в handlers/
SGR определил key_directories: `['django/core/', 'django/http/', 'django/middleware/']`
Но НИКОГДА не выполнил `list_dir django/core/handlers/` или `read_file django/core/handlers/base.py`
#### ❌ Остановился на первом "релевантном" результате
После нахождения упоминания в `decorators.py`, SGR решил что этого достаточно.
---
## Ключевые отличия: SGR vs Мой поиск
| Аспект | SGR | Мой поиск |
|--------|-----|-----------|
| **Термины** | Общие (`QuerySet`, `middleware`) | Конкретные (`_result_cache`, `__iter__`, `BaseHandler`) |
| **Scope** | Весь репозиторий | Целевые директории |
| **File reading** | Почти не использует `read_file` | Активно читаю найденные файлы |
| **Итерации** | 4 итерации, ранняя остановка | Продолжаю пока не найду реализацию |
| **Validation** | Не проверяет что файл содержит нужный код | Читаю и убеждаюсь |
---
## Паттерны ошибок SGR
### 1. **Широкий grep без фильтрации**
```bash
# SGR делает:
grep "QuerySet" /entire/repo # 1000+ результатов
# Я делаю:
grep "class QuerySet|def __iter__" django/db/models/query.py
```
### 2. **Не использует likely_files**
SGR определяет правильные файлы в Step 2 (TechnicalTerms), но затем НЕ читает их!
### 3. **Путает пути с модулями**
- Генерирует: `django.db.models.query.py`
- Нужно: `django/db/models/query.py`
### 4. **Интерпретирует упоминания как реализацию**
Находит `"QuerySet"` в docstring или комментарии и считает это ответом.
### 5. **Преждевременная остановка**
Решает остановиться при `medium` confidence без проверки найденных файлов.
---
## Рекомендации по улучшению SGR
### 1. **После определения likely_files - сразу читать их**
```python
if technical_terms.likely_files:
for file in technical_terms.likely_files[:3]:
read_file(file)
```
### 2. **Использовать более специфичные grep паттерны**
Вместо `grep "QuerySet"` использовать:
- `grep "class QuerySet"` - определение класса
- `grep "def __iter__"` - конкретные методы
### 3. **Валидация путей**
```python
# Конвертировать module path в file path
"django.db.models.query" → "django/db/models/query.py"
```
### 4. **Не останавливаться пока не прочитан код**
Условие остановки: найден ФАЙЛ + прочитан КОНТЕНТ + найдена РЕАЛИЗАЦИЯ
### 5. **Фильтровать тестовые файлы из результатов**
```python
results = [r for r in results if "/tests/" not in r.path]
```
---
## Статистика
### SGR Performance
- Total time: ~30s per question
- LLM calls: 8-10 per question
- Tool calls: 4-6 per question
- Recall: 0%
### Manual Search Performance
- Time: ~5 min per question (estimated)
- Grep calls: 2-3 per question
- File reads: 2-4 per question
- Recall: 55-60%
---
## Вывод
SGR правильно **понимает концепции** и **определяет нужные файлы**, но:
1. Не выполняет действия чтобы прочитать эти файлы
2. Использует слишком широкие grep паттерны
3. Путает форматы путей (точки vs слэши)
4. Останавливается преждевременно
**Главная проблема:** LLM определяет правильные цели, но не доводит поиск до конца.