Как собрать локальную RAG-систему на Go, PostgreSQL и Ollama без облачных API
Разработчики представили учебный прототип RAG-системы, полностью работающей в локальной среде без обращения к облачным сервисам. Проект использует стек из Go, PostgreSQL с расширением pgvector и Ollama для запуска языковых моделей, что позволяет избежать зависимости от внешних API и обеспечить конфиденциальность данных.
В последнее время подход Retrieval-Augmented Generation (RAG) приобрёл широкую популярность как эффективный способ создания интеллектуальных помощников и корпоративных чат-ботов без необходимости дорогостоящего дообучения языковых моделей. Идея RAG заключается в том, чтобы сначала найти релевантные фрагменты документов во внешней базе знаний, а затем передать их языковой модели в качестве контекста для генерации ответа. Однако на практике реализация такого пайплайна сталкивается с множеством технических вопросов: как оптимально разбивать документы на чанки, как генерировать и хранить эмбеддинги, как организовать семантический поиск и какие модели использовать для разных этапов. Большинство существующих примеров предлагают готовые решения на основе OpenAI API, LangChain и облачных векторных баз данных, что упрощает создание прототипа, но превращает систему в «чёрный ящик», скрывая внутреннюю механику. В реальных проектах такой подход часто упирается в жёсткие ограничения: корпоративные документы нельзя отправлять в зарубежные облачные API, система должна работать в закрытом контуре без доступа в интернет, а готовые библиотеки усложняют кастомизацию поиска, когда стандартных алгоритмов становится недостаточно.
Авторы проекта решили отказаться от тяжёлых фреймворков и собрали полностью локальную RAG-систему на стеке Go, PostgreSQL и Ollama, которая не требует доступа в интернет и может работать в закрытом контуре. Go выбран как язык для ядра системы благодаря компиляции в лёгкий бинарник без тяжёлых runtime-зависимостей и встроенным инструментам конкурентности для параллельной обработки документов. PostgreSQL с расширением pgvector позволяет хранить векторные представления текста прямо в реляционной базе данных, что устраняет необходимость в отдельной векторной БД и упрощает инфраструктуру — такая база уже есть в инфраструктуре 90% проектов. Ollama отвечает за запуск локальных моделей: он предоставляет простой REST API для генерации эмбеддингов и формирования ответов на основе CPU или GPU без внешних запросов. В отличие от альтернативных подходов с LangChain или LlamaIndex, которые скрывают детали разбиения текста, сравнения векторов и формирования промптов, предлагаемый стек выигрывает в прозрачности и лёгкости настройки, хотя и требует больше ручной работы по реализации пайплайна.
Ключевая особенность предложенного подхода — полная автономность и контроль над всеми этапами обработки данных. Система включает индексацию документов, где каждый файл разбивается на чанки заданного максимального размера по токенам или словам, и каждый чанк снабжается метаданными. Эмбеддинг — числовой вектор, кодирующий скрытый смысл текста, — генерируется для каждого чанка и сохраняется в PostgreSQL рядом с исходным текстом. При поступлении запроса система вычисляет эмбеддинг запроса, выполняет семантический поиск по базе с помощью косинусного расстояния или других метрик, находит наиболее релевантные чанки и передаёт их языковой модели вместе с промптом для генерации ответа. Такой пайплайн обеспечивает прозрачность каждого шага и возможность кастомизации под конкретные задачи, что критически важно для разработчиков, сталкивающихся с ограничениями готовых решений.
Разработчики подчёркивают, что их проект носит учебный характер и не предназначен для промышленной эксплуатации, но наглядно демонстрирует все ключевые принципы построения RAG. В качестве примера используется вымышленная компания «Ёлки-метёлки Ltd» с набором нормативных документов в формате Markdown, которые лежат в репозитории на GitHub. Авторы отмечают, что понимание внутренней механики RAG критически важно для разработчиков, которые сталкиваются с ограничениями готовых решений, такими как невозможность отправлять корпоративные документы в облачные API, необходимость работы в закрытом контуре и потребность в тонкой настройке алгоритмов поиска. Предложенный стек позволяет обойти эти ограничения, сохраняя при этом производительность и масштабируемость, а примеры кода в репозитории можно скопировать и воспроизвести на практике, что делает систему доступной для изучения даже разработчикам без глубокого опыта в машинном обучении.
На российском рынке локальные RAG-системы приобретают особую актуальность в связи с требованиями к конфиденциальности данных и импортозамещению. Многие компании, особенно в государственном и финансовом секторах, не могут использовать облачные сервисы зарубежных провайдеров из-за законодательных ограничений или политики безопасности. Предложенный подход на основе Go и PostgreSQL, которые широко распространены в российской инфраструктуре, позволяет быстро внедрить семантический поиск по внутренним документам без привлечения сторонних API. Кроме того, Ollama поддерживает множество открытых языковых моделей, включая модели от российских разработчиков, что расширяет возможности для адаптации под локальные задачи. В сравнении с альтернативными подходами, такими как использование LangChain или LlamaIndex, предлагаемый стек выигрывает в прозрачности и лёгкости настройки, хотя и требует больше ручной работы по реализации пайплайна, но даёт полный контроль над каждым этапом.
Перспективы развития локальных RAG-систем выглядят многообещающими, особенно в контексте роста требований к безопасности данных и автономности. Разработчики планируют расширить функциональность проекта, добавив поддержку более сложных стратегий чанкования, интеграцию с различными моделями эмбеддингов и улучшение алгоритмов ранжирования. Открытыми остаются вопросы масштабирования на большие объёмы документов и оптимизации производительности при работе с большими языковыми моделями на ограниченном оборудовании, таком как обычные машины без мощных GPU. Тем не менее, предложенный прототип закладывает основу для создания полностью автономных систем, которые могут работать на обычных машинах без облачных сервисов и платных API, открывая путь к более широкому внедрению RAG в корпоративной среде, где конфиденциальность и контроль над данными являются приоритетами.