Directual
Menu

Продвинутые техники для RAG и ИИ-агентов

Погружаемся в продвинутые методы: заставляем модель рассуждать пошагово, структурируем её ответы и отлавливаем галлюцинации. Учимся разбивать документы на смысловые чанки и запускаем LLM прямо у себя на ноутбуке — без облаков и API.

Что думает Anthropic о создании эффективных агентов

Недавно команда Anthropic (создатели Claude) выпустила статью Building Effective Agents.

Вот несколько важных мыслей из неё:

  • Контекст — это всё. Агент не «знает» ничего сам по себе. Он работает с тем, что вы ему подаёте: промпт, структура, история диалога.
  • Агент — это не один промпт, а последовательность шагов. Рекомендуется строить агентов как процессы, где LLM делает выводы, принимает решения, хранит промежуточные данные и передаёт их между этапами.
  • Состояние — важно. Агент, который делает запрос и передаёт результат в другой этап, должен понимать своё состояние. Без этого он становится болтуном с амнезией.
  • Используйте несколько промптов. Один — на анализ, другой — на выбор действия, третий — на генерацию, четвёртый — на проверку и улучшение. Это архитектура, а не просто одна длинная подсказка.

Вывод: LLM — это строительный блок. Настоящий агент — это архитектура + оркестрация. В этом помогает Directual.

Structured Output — чтобы не просто говорил, а работал

Когда вы хотите, чтобы ассистент возвращал не просто текст, а структурированные данные, нужно использовать Structured Output.

Это может быть JSON, XML, markdown, таблица и т.д.

Зачем это нужно:

  • Легко парсить и использовать в сценариях Directual
  • Проверка корректности ответа
  • Чёткий контроль формата

Как настроить Structured Output на Directual

Есть два подхода как настроить SO на платформе Directual

__wf_reserved_inherit

Response Format

Это вариант, когда мы добавляем в запрос "response_format": { "type": "json_object" }, а стурктуру ответа указываем прямо в системном промпте. Код запроса ниже:

Function Calling

Этот вариант подразумевает использование tools. Формат ответа в этом случае гарантирован. Код запроса ниже:

Если нужен другой формат (например, XML) — указывается прямо в тексте промпта.

Chain of Thought — заставляем LLM думать вслух

Chain of Thought (CoT) — техника, где модель размышляет пошагово. Это:

  • повышает точность
  • позволяет отслеживать логику
  • помогает отлавливать ошибки

Комбо: CoT + Structured Output

  1. Модель размышляет
  2. Возвращает финальный JSON

Можно хранить рассуждения для логов, а пользователю показывать только результат.

‍Пример CoT + SO в запросе из Directual:

На выходе мы получаем JSON вида, с которым уже можно работать далее в сценарии:

Возвращаемся к RAG — про чанкинг

Когда документов становится много и они длинные — нужно делить их на чанки.

Почему это важно:

  • У моделей есть лимит контекста
  • Слишком длинные тексты плохо векторизуются

Подходы к чанкингу

В Directual удобно сделать чанкинг в три шага:

  1. Разбить текст на JSON-объект вида { "chunks": [ { "text" : "..." }, { "text": "..." },... ] }
  2. Применить JSON-шаг для создания объектов в структуре Chunks
  3. Отправлять массив объектов в шаг LINK scenario, и там делать эмбеддинг и прокидывать обратную ссылку на родительский документ.
__wf_reserved_inherit

Есть три метода разбиения текста на чанки:

1. По длине

Например, 100 слов, с overlap 10

Код для создания JSON ниже.Обратите внимание, что для использования стрелочных функций необходимо в шаге START => Advanced включить ECMAScript 2022 (ES13), по умолчанию работает ES6. Также при сохранении JS-объекта в поле типа json необходимо оборачивать выражение в JSON.stringify().

Плохой чанкинг = однотипные ответы, обрывы логики, "ничего не найдено".

2. По структуре

Разделяем на абзацы. Если чанк менее 5 слов, склеиваем его со следующим, потому что, скорее всего, это заголовок.

Код для шага Edit object:

3. По смыслу

‍Делаем запрос в ChatGPT:

‍Как понять, что чанкинг плохой?

Плохой чанкинг = однотипные ответы, обрывы логики, "ничего не найдено".

Как тестировать LLM на галлюцинации — logprobs

Logprobs = log-вероятность каждого токена.

  • Высокий logprob (ближе к 0) — уверенность
  • Низкий logprob — модель сомневается

Используем это для фильтрации ненадёжных ответов.

Что делать:

  • Не показывать сомнительные ответы
  • Перегенерировать
  • Показать вариант с предупреждением

В связке с Structured Output — можно проверять уверенность по конкретным полям.

На Directual делаем:

  • Шаг запроса с logprobs: true
  • Визуализация HTML (цвет по уровню уверенности)

Код для визуализации ответа модели с logprobs: true:

‍Этот код генерирует HTML. Дополнительно в разделе Web-app => Custom code надо сохранить CSS:

__wf_reserved_inherit

Запускаем LLM локально — никаких API и облаков

Модель: Qwen 1.5 1.8B Chat — небольшая модель, но для демонстрации на ноутбуке будет достаточно!

Проверка утилит

Создание изолированного окружения для Python

Установка необходимых библиотек

  • torch — движок PyTorch, на котором работает Qwen
  • transformers — библиотека Hugging Face для загрузки и работы с LLM
  • accelerate — помогает автоматически определить, есть ли GPU и ускорить инференс
  • flask — минималистичный фреймворк для API, на нём мы поднимем наш сервер

Подключение Hugging Face

Это своего рода GitHub, но для моделей и нейросетей. Qwen там и хранится.

Далее идем на https://huggingface.co/ и входим в свой аккаунт (регистрируемся при необходимости) и создаем новый Read-only токен.

__wf_reserved_inherit

Возвращаемся в терминал и логинимся в HF, вводим свой новый токен.

Теперь сделаем первую проверку, что всё работает.

Smoke test

Открываем Jupyter Notebook — это такая легковесная интерактивная среда, в которой удобно писать и запускать Python-проекты по шагам.

Если не установлен — поставьте через 

Создаем файл test_qwen.py

Запускаем в терминале

Модель может скачиваться до 10-15 минут. Далее она будет храниться локально, и ее можно будет использовать.

‍Поднимаем API

Проверили, что модель работает и отвечает, теперь сделаем сервер, который будет предоставлять нам API, идентичное ChatGPT API.

Создаем файл app.py

Запускаем!

Теперь у нас есть локальное апи, но надо сделать его доступным из интернета, в частности из Directual.

Делаем HTTPS-туннель для API

Регистируем аккаунт на ngrok.com, получаем токен и запускаем в терминале:

Полученный API можно использовать в шаге HTTP-запроса из Directual точно так же как любое другое API LLM-модели!

Заключение

Вы узнали:

  • Как думает Anthropic о построении агентов
  • Как работает Structured Output
  • Как применять Chain of Thought
  • Как правильно делить текст на чанки
  • Как ловить галлюцинации с помощью logprobs
  • Как поднять локальную LLM на ноутбуке

А главное — как всё это соединяется на Directual.

Дальше — только практика. Применяйте знания, собирайте ассистентов, делайте своих агентов. Удачи!

Встречайте единомышленников без кода

Заходите в наше комьюнити: помощь по проектам, знакомства с потенциальными сооснователями, общение с разработчиками платформы и не только.