Задача
Инженерная компания, тысячи внутренних документов: регламенты, спеки, протоколы испытаний. Поиск нужного фрагмента вручную занимал минуты, а ответы коллег по памяти расходились с актуальной редакцией. Нужен ассистент, который отвечает только со ссылкой на конкретный документ и честно отказывается, если основания в базе нет.
Жёсткое требование заказчика — строго on-prem. Ни один токен запроса или документа не должен уходить во внешнее API. Это снимало с рассмотрения облачные LLM и переводило задачу в плоскость локального инференса с предсказуемой латентностью.
Подход
Развернули локальную LLM на своём железе, поиск — гибридный: плотные эмбеддинги плюс лексический BM25, дальше реранкер по top-k. Главный приоритет — grounding: модель отвечает только по переданным фрагментам, каждый тезис привязан к источнику, при отсутствии релевантного контекста выдаётся явный отказ вместо догадки. Цена false-positive здесь выше, чем цена отказа: лучше «не нашёл», чем уверенная выдумка по устаревшей редакции.
Модель квантовали в INT8 под целевой GPU — латентность ответа упала без заметной потери качества цитирования. Индекс обновляется инкрементально: правка документа переиндексирует только изменённые чанки, а не всю базу, поэтому актуальность держится при постоянном потоке редактур.
Стек
vLLM · INT8 quantization · pgvector + BM25 · cross-encoder reranker · FastAPI
Результат
- 94.2% ответов с корректной ссылкой на источник на тестовом наборе.
- 1.8 с медианная латентность ответа на локальном GPU.
- 0 утечек наружу — весь инференс и индекс остаются в периметре.
- −68% времени на поиск нужного фрагмента против ручного.