Гибридный поиск
Векторный и полнотекстовый поиск в engram
Гибридный поиск
Engram комбинирует два метода поиска с alpha-weighted scoring для наилучших результатов.
Два метода поиска
Векторный поиск (HNSW cosine)
Основной метод. Использует HNSW (Hierarchical Navigable Small World) граф для приблизительного поиска ближайших соседей по cosine similarity.
Три индекса — каждое поле записи (context, action, result) имеет отдельный HNSW-индекс. Запрос ищется во всех трех индексах параллельно, результаты агрегируются.
Параметры HNSW (настраиваемые в engram.toml):
| Параметр | По умолчанию | Описание |
|---|---|---|
max_connections | 16 | Максимум связей на узел (M) |
ef_construction | 200 | Точность при построении графа |
ef_search | 40 | Точность при поиске (больше = точнее, медленнее) |
dimension | 1024 | Размерность вектора (определяется моделью эмбеддинга) |
Разреженный поиск (BM25 через FTS5)
Полнотекстовый поиск через SQLite FTS5 с BM25 scoring. Индексирует три текстовых поля записи (context, action, result) через виртуальную таблицу memories_fts.
Эффективен для точного совпадения терминов, аббревиатур и имен собственных, где векторный поиск может быть неточным.
Alpha-weighted scoring
Финальный score каждого результата вычисляется как взвешенная комбинация:
final_score = 0.7 * vector_score + 0.3 * sparse_score- 70% вектор — семантическое понимание запроса
- 30% sparse — точное совпадение терминов
Коэффициенты зафиксированы в search_handler.rs.
HyDE (Hypothetical Document Embeddings)
Для сложных запросов engram использует HyDE — технику улучшения поиска через генерацию гипотетического документа.
Процесс:
- LLM получает поисковый запрос
- LLM генерирует гипотетическую запись памяти, которая могла бы ответить на запрос
- Гипотетическая запись эмбеддируется вместо оригинального запроса
- Поиск выполняется по эмбеддингу гипотезы
HyDE улучшает поиск, когда запрос формулируется в терминах проблемы, а релевантные записи описывают решение.
Graceful degradation
При недоступности API эмбеддингов (ошибки сети, невалидный API-ключ) поиск деградирует до FTS5-only:
- Только BM25 scoring
- Без векторной компоненты
- Ответ содержит флаг
degraded: true
Кросс-проектный поиск
При указании параметра project поиск:
- Ищет в указанном проекте с полным весом
- Ищет в других проектах с пониженным score multiplier
- Insights (тип
insight) не привязаны к проекту и всегда возвращаются
Трехпольное эмбеддирование
Каждая запись хранит три вектора эмбеддинга:
| Поле | Назначение |
|---|---|
embedding_context | Семантика ситуации |
embedding_action | Семантика действия |
embedding_result | Семантика результата |
Модуль engram-embeddings использует EmbeddingProvider trait из engram-llm-client. Провайдеры: Voyage AI (voyage-code-3, 1024 dim) или deterministic (для тестов).