# Инструмент Hybrid Search
## Описание
Инструмент `hybrid_search` — это gRPC-сервис на Python, который выполняет сложный двухэтапный поиск по локальной коллекции документов. Он предназначен для нахождения наиболее релевантных документов путем сочетания современного семантического поиска с традиционной фильтрацией по ключевым словам.
Инструмент использует локальную модель sentence-transformer для семантического поиска и базу данных SQLite для фильтрации по ключевым словам.
> **Примечание:** Этот инструмент загружает модель машинного обучения в память при запуске, что делает его ресурсоемким. Он считается модулем **R&D (Исследования и Разработка)** и по умолчанию отключен в основной конфигурации сервера для обеспечения стабильной и быстро запускающейся среды.
## Рабочий процесс гибридного поиска
1. **Семантический поиск:** Сначала инструмент принимает `semantic_query` и использует поиск по векторной близости для нахождения документов, концептуально связанных с текстом запроса.
2. **Фильтрация по ключевым словам:** Затем результаты семантического поиска сужаются с помощью SQL-условия `WHERE`, основанного на необязательных `filters`.
## Параметры
Инструмент принимает следующие аргументы в виде JSON-объекта:
| Параметр | Тип | Обязательный | Описание |
|------------------|----------|--------------|----------------------------------------------------------------------------------------------------------------------------------------|
| `semantic_query` | `string` | **Да** | Запрос на естественном языке для семантического поиска (например, "информация о программировании на Go"). |
| `filters` | `object` | Нет | Необязательный JSON-объект с парами ключ-значение для использования в качестве условий `AND` в SQL-запросе `WHERE` (например, `{"author": "Роб Пайк"}`). |
## Ответ
* **Успешный поиск:** Возвращает JSON-массив объектов, где каждый объект представляет собой документ, соответствующий как семантическому запросу, так и фильтрам. Каждый документ включает `id`, `author`, `title` и `text`.
* **Ошибка:** Если `semantic_query` отсутствует или возникает другая ошибка, инструмент возвращает сообщение об ошибке.
## Пример использования
Вот пример поиска документов о "gRPC на Go", написанных автором "Иванова".
**Запрос:**
```bash
curl -X POST http://localhost:8002/v1/tools:run \
-d '{
"name": "hybrid_search",
"arguments": {
"semantic_query": "Как использовать gRPC на языке Go",
"filters": {
"author": "Иванова"
}
}
}'
```
**Успешный ответ:**
```json
{
"result": {
"listValue": {
"values": [
{
"structValue": {
"fields": {
"id": { "numberValue": 101 },
"author": { "stringValue": "Иванова" },
"title": { "stringValue": "Продвинутый gRPC на Go" },
"text": { "stringValue": "Этот документ описывает продвинутые паттерны использования gRPC в микросервисной архитектуре на Go..." }
}
}
}
]
}
}
}
```
## Конфигурация
Конфигурация инструмента управляется через файл `config.json`.
**Пример `config.json`:**
```json
{
"port": 50072,
"command": ["python", "server.py"]
}
```
## Проверки состояния и логирование
* **Проверки состояния:** Реализует стандартный протокол gRPC Health Checking Protocol.
* **Логирование:** Использует стандартный модуль `logging` в Python.