ММООЗЗГГ.ru

Как создать ИИ-агента

RAG-система своими руками: от документов до ответа со ссылкой

Михаил Мозг7 минут чтения

Как сделать RAG-систему: собрать документы, разрезать их на фрагменты, превратить фрагменты в векторы, найти нужные по вопросу и отдать модели вместе с вопросом. Подход описан в 2020 году и позволяет агенту работать с вашими документами без обучения модели. Ниже 7 шагов в двух вариантах: без кода во Flowise и с кодом на LangChain с открытыми моделями через Ollama.

Соберете сами за неделю

Шаг 1: документы

Схема RAG-системы из семи шагов: собрать документы, разбить на фрагменты, превратить фрагменты в векторы, сохранить в векторную базу, найти фрагменты по вопросу, передать модели вопрос и фрагменты, получить ответ со ссылкой на источник. Модель при этом не обучают, она отвечает по найденному.

Первый шаг: собрать документы. Возьмите то, о чем сотрудники и клиенты спрашивают чаще всего: регламенты, прайс, условия договоров, ответы поддержки. Устаревшие версии уберите сразу, иначе поиск найдет и их.

Если знания уже лежат в CRM, базе SQL или внутренней вики, переносить их не обязательно. Документация LangChain советует подключить такую систему к агенту как инструмент.

1. Без кода. Во Flowise откройте «Document Stores», добавьте хранилище и выберите загрузчик под формат файлов, например «PDF Loader». Добавьте свою метку метаданных: по ней потом можно отобрать фрагменты именно этого набора.

2. С кодом. В примере LangChain каждая страница PDF становится объектом Document с текстом и метаданными: имя файла в поле source и номер страницы в поле page. Эти поля понадобятся на шаге 6 для ссылки на источник.

Ту же схему без кода собирают и в Dify. Он распространяется по Apache 2.0 с двумя условиями: без разрешения нельзя запускать многопользовательский облачный сервис по типу Dify и убирать логотип из консоли.

Если в документах есть персональные данные клиентов, действует 152-ФЗ: их собирают и хранят в базах на территории России, а до передачи за границу уведомляют Роскомнадзор. Поэтому векторную базу и модели для таких документов ставят на свой сервер, подробнее на странице о безопасности данных.

Шаг 2: фрагменты

Второй шаг: разбить документы на фрагменты. Модель получает не весь файл, а несколько кусков по теме вопроса. Так ответ точнее и дешевле, ведь оплата моделей идет за объем текста.

Размер фрагмента задают в знаках. Перекрытие повторяет конец предыдущего фрагмента в начале следующего, чтобы мысль на границе не потерялась.

1. Без кода. Во Flowise выберите нарезку «Recursive Character Text Splitter»: она ищет естественные границы, например концы предложений и разделов. Для текстов в Markdown есть «Markdown Text Splitter», для веб-страниц «HTML-to-Markdown Text Splitter».

2. Посмотрите предпросмотр фрагментов. В примере документации Flowise фрагмент 1500 знаков с перекрытием 750. Каждый кусок должен читаться отдельно, а лишние после обработки можно удалить вручную.

3. С кодом. В LangChain тот же способ задают строкой RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200, add_start_index=True). Параметр add_start_index запоминает место фрагмента в исходном документе.

Готового размера на все случаи нет. Документация Flowise прямо советует пробовать разные нарезки, размеры и перекрытия на своих документах.

Подготовка базы, один раз1Собрать документы2Разбить на фрагменты3Превратить фрагменты в векторы4Сохранить в векторную базуОтвет на вопрос, каждый раз5Найти фрагменты по вопросу6Передать модели вопрос и фрагменты7Ответ со ссылкой на источник
RAG за 7 шагов

Шаг 3: эмбеддинги

Третий шаг: превратить фрагменты в векторы. Эмбеддинг это набор чисел, который записывает смысл фрагмента: близкие по смыслу тексты получают близкие наборы. Векторы считает отдельная модель эмбеддингов, а не та, что пишет ответы.

Длина вектора зависит от модели, обычно от 384 до 1024 чисел. Документы и вопросы обрабатывают одной и той же моделью. Размерность модели и индекса векторной базы должна совпадать, иначе загрузка закончится ошибкой.

Для русских документов нужна многоязычная модель. Например, bge-m3 в каталоге Ollama поддерживает больше 100 языков и принимает текст до 8192 токенов, то есть кусков слов, которыми считает модель.

1. Без кода. Во Flowise нажмите карточку «Select Embeddings» и выберите «Ollama Embeddings», чтобы векторы считались на вашем компьютере или сервере.

2. С кодом. Скачайте модель командой ollama pull bge-m3. Проверка: ollama run bge-m3 "Привет" выводит вектор массивом чисел.

3. В LangChain модель подключают пакетом langchain-ollama: pip install -qU langchain-ollama, затем в коде OllamaEmbeddings(model="bge-m3").

Шаг 4: векторная база

Четвертый шаг: сохранить векторы в векторную базу. Это хранилище, которое быстро находит векторы, близкие к вектору вопроса. Какие открытые базы есть и как их выбрать, разобрано на странице о векторной базе.

1. Без кода. Во Flowise нажмите «Select Vector Store» и выберите базу.

2. Добавьте «Record Manager». Он хранит отпечаток каждого фрагмента и при повторной загрузке пропускает то, что уже есть в базе.

3. Нажмите «Upsert», чтобы загрузить фрагменты в базу.

4. С кодом. Для пробы в LangChain есть InMemoryVectorStore: база в памяти программы, ставить ничего не нужно. Фрагменты загружают строкой vector_store.add_documents(documents=all_splits).

Для работы с людьми базу в памяти меняют на постоянную. У LangChain есть готовые пакеты для Chroma, Milvus, Postgres и Qdrant, код поиска при этом почти не меняется.

Шаг 5: поиск

Пятый шаг: найти фрагменты по вопросу. Вопрос превращается в вектор той же моделью, а база возвращает ближайшие фрагменты. Для смыслового поиска документация Ollama советует меру близости по косинусу угла между векторами.

Сколько фрагментов вернуть, задает параметр top K, во Flowise по умолчанию 4. Мало фрагментов, и ответ упустит часть фактов. Много, и ответ дороже, а в подсказку попадает лишнее.

1. Без кода. Во Flowise нажмите в хранилище «Retrieval Query» и задайте тестовый вопрос. Вы увидите, какие фрагменты нашлись.

2. С кодом. В LangChain поиск запускают методом vector_store.similarity_search с текстом вопроса.

3. Метод similarity_search_with_score возвращает еще и оценку близости. Ее смысл зависит от базы: в примере документации LangChain меньшее число значит большую близость.

Шаг 6: ответ со ссылкой

Шестой шаг: передать модели вопрос и найденные фрагменты. В инструкции модели напишите: отвечай только по фрагментам, а если ответа в них нет, скажи об этом и передай вопрос человеку. Почему агент без такого правила ошибается, разобрано в статье о том, почему агент отвечает неправильно.

Итог схемы: ответ со ссылкой на источник. Ссылка показывает файл и страницу, откуда взят факт, и сотрудник проверяет ответ сам, не перечитывая весь регламент.

1. Без кода. В Agentflow V2 Flowise подключите векторную базу к блоку «Agent» и включите «Return Source Documents»: вместе с ответом агент вернет сведения об источниках.

2. Если нужен только поиск без рассуждений агента, поставьте блок «Retriever» и выберите формат «Text with Metadata»: фрагменты придут с именами документов.

3. С кодом. Подпишите каждый найденный фрагмент полями source и page из шага 1 и передайте модели вместе с вопросом. Попросите ставить в ответе номер фрагмента, а программа заменит номер на имя файла и страницу.

Как такой агент отвечает сотрудникам и клиентам по базе знаний компании, мы разобрали на странице про RAG-агента.

Шаг 7: проверка качества

Ответ со ссылкой на источник проверяют до запуска: верен ли ответ и ведет ли ссылка туда, где написан факт. Соберите набор реальных вопросов с правильными ответами и источниками, включая вопросы, ответа на которые в документах нет.

Проверяйте поиск и ответ по отдельности. Если нужного нет среди найденных фрагментов, меняйте нарезку, перекрытие или top K. Если фрагменты верные, а ответ нет, правьте инструкцию модели или берите модель сильнее.

В n8n такой прогон делают легкие оценки. На своем сервере они доступны в версии Community после бесплатной регистрации.

1. Создайте таблицу данных или Google Sheets с колонками: вопрос, ожидаемый ответ и пустая колонка для ответа агента.

2. Поставьте в процесс узел «Evaluation Trigger»: он подает вопросы из таблицы по одному.

3. После агента добавьте узел «Evaluation» с действием «Set outputs» и запишите ответ в пустую колонку.

4. Нажмите «Execute workflow» слева от триггера оценки и сравните ответы с ожидаемыми.

Повторяйте прогон после каждого обновления документов. Как составить набор вопросов и какие метрики считать, разобрано на странице о тестировании агента.

Источники и даты

Собрать просто. Решить, что собирать, сложнее

RAG-систему на своих документах соберет за неделю и менеджер, а программист сделает это с кодом. Сложнее решить, по каким документам агент принесет деньги, и следить, чтобы база не устаревала. Это задача владельца процесса и ИИ-директора, а не конструктора.

Пилот ИИ-агента за 14 дней

Если RAG-агент нужен для клиентов или в CRM, начните с пилота: один процесс, метрика в договоре, данные на вашем сервере.

Михаил Мозг

Михаил Мозг

Основатель MMOOZZGG, ИИ-директор

Подробнее о Михаиле@mmoozzggru

Контакты

Соберем RAG-агента на ваших документах

Разбор 30 минут бесплатно в Telegram: документы, риски и план пилота.

Написать в Telegram