Не внедряйте RAG, пока не сделали это
Это вторая глава из моей новой книги “Знания, поиск и RAG”, в которой я расскажу, как подготовить вашу документацию, чтобы от векторной базы данных была польза, а не вред. Я не планирую углубляться в технические детали, скорее всего, это будет в отдельной статье, когда я сам в них разберусь.
Нет никакого смысла врываться в историю RAG и LLM, если ваша документация плохо написана. Главная мысль всего текста: документация должна быть пригодна для чанкинга (то есть для скармливания по кусочкам в RAG). Если вы не знаете об этом слове из трёх букв вообще ничего, начните с этой статьи.
Итак, погнали, что же делает вашу документацию пригодной для внедрения в неё RAG.
Правильно расставленные заголовки и подзаголовки
Четкая организация контента с помощью заголовков и подзаголовков улучшает читаемость и помогает моделям RAG понимать структуру ваших документов. Хорошо подобранные заголовки помогают LLM держать контекст. Заголовок “Введение” — плохо, а “Как пропатчить KDE2 под FreeBSD” — хорошо.
Существуют две школы:
- первая утверждает, что статья должна быть компактной и решать одну задачу (отвечать на один вопрос);
- вторая — что статья может быть какой угодно большой, главное, чтобы в ней была хорошая структура.
Какой из подходов выбрать — решать вам. Я не буду сейчас выделять плюсы и минусы каждого. Скажу только, что для RAG это не столь принципиально. Там больше влияет то, как вы будете разбивать текст на чанки и добавлять контекст, чем в каком виде у вас хранятся знания. Главное — максимальная информативность, минимум лишних слов, чёткая структура разделов.
Если пользователь задаёт вопрос, идеальный chunk должен полностью отвечать на него без необходимости тянуть соседние куски. Из этого вытекает совет: добавляйте формулировки в виде вопросов и ответов. Это напрямую соответствует пользовательским запросам.
С умом используйте списки и таблицы
Классика документации, если у вас процесс состоит из нескольких последовательных шагов — используйте нумерованные списки. Если вдруг нужно разорвать список для какого-то примечания, то можно использовать фразы типа «После завершения второго шага выполните…», чтобы связать идеи и улучшить поток информации.
Списки для RAG — это хорошо в отличие от таблиц. Потому что бездушные машины хорошо понимают информацию сверху–вниз, а когда надо ещё и смещаться в сторону — им плохеет. И чем сложнее таблица, тем выше шанс, что LLM затупит и поймёт всё неправильно. Поэтому совет такой: избегайте таблиц.
Главный прикол в том, что если таблица простая и её можно легко оформить в маркдаун, то такую таблицу так же легко превратить в список. А вот сложные таблицы, с объединением ячеек, вложенным форматированием и другими ништяками, за которые мы как раз их и любим — всё это не работает в маркдаун из коробки и плохо читается LLM.
У вас может быть подробная информация в красивой и большой таблице, но искаться эта информация через RAG будет крайне плохо. Потому что LLM будет сложно связать заголовок колонки (который несёт важный контекст) и содержимое ячейки, которая содержит ответ на вопрос пользователя. А без контекста качество ответов получается хреновым.
Меньше скриншотов больших и разных
Ещё один пункт, который известен каждому уважающему себя техписателю. Скриншот в доке должен лишь помогать ориентироваться пользователю, но никак не быть единственным источником информации для него.
Многомодальные LLM-модели могут обрабатывать как изображения, так и текст. То есть если вы не делаете RAG, а просто закидываете свой док со скриншотами в ChatGPT или Claude, то они смогут дать вам ответ, используя, в том числе, информацию со скриншотов. Но если мы скармливаем базу знаний в RAG, то туда попадает только текст статьи и ссылка на изображение.
Конечно, вы можете заморочиться и сделать дополнительный слой обработки, который будет предварительно собирать все изображения, отдавать их в LLM, получать обратно текстовое описание и складывать его в документацию или передавать в RAG вместо изображения. Почти всегда это костыль, но если уж совсем некуда деваться, то такой вариант есть.
Но в идеале для всех будет лучше, если изображения будут выполнять только вспомогательную функцию и не будут содержать уникальной информации, которой нет в тексте.
Насыщение контекстом
Эту часть многие пропускают даже просто в документации. Написали заголовок “Создание учётки”, потом накидали каких-то букв во введение, и дальше пишут “Откройте страницу, нажмите сюда, выберите это”. Конечно, LLM всё равно поймёт, что всё это про создание учётки. Но результирующий вектор будет гораздо ближе к вопросу пользователя “как мне создать учётку?”, если статья будет называться “Как создать учётку”, а в тексте будет фраза “Чтобы создать учётку, откройте страницу…”.
При ответе на распространенные вопросы или задачи, такие формулировки в заголовках и тексте помогают как LLM, так и обычным людям. Это создаёт высокую семантическую согласованность, что способствует построению связного ответа. Помочь в этом вам может явное повторение ключевых сущностей (названия систем, процессов, сервисов).
Отдельно есть подход, который использую при самом формировании RAG, когда добавляют контекст из соседних абзацев, которые не попали в чанк, или пишут, где находится каждый кусок текста. В духе “этот текст из статьи про создание учеток пользователей в сервисе А”. Контекст + тест отдаются в RAG и семантическая связь получается ещё лучше. Но это уже другая история.
В тему с контекстом стоит отнести ещё один совет: осторожно используйте внутренние аббревиатуры и сокращения. LLM обучаются на основе больших объемов интернет-данных, и у них может не быть контекста внутренних документов вашей компании. Поэтому определение внутренних сокращений, аббревиатур и терминологии помогает LLM понимать вашу специфику.
Хорошим тоном считается давать расшифровку сокращения первый раз, когда она встречается в тексте. Но в случае с LLM это может не сработать, если текст большой и его пришлось разделить на части. При этом, если использование сокращения или аббревиатуры не ухудшает качество ответа, то забейте. Но продолжайте волноваться, потому что в идеале — каждый фрагмент должен быть понятен сам по себе, без необходимости читать другие части документа.
Типа заключение
Этот список можно продолжать, но внимательный читатель уже заметил, что большинство советов сводится к стандартным рекомендациям по организации качественной документации:
- актуальность;
- активный залог;
- полнота;
- минимум воды (чтобы было больше воды на планете);
- иметь хорошую структуру статей или разделов;
- консистентность.
Если у вас хорошая база знаний, то переход к RAG будет намного более эффективным.
Мы несколько раз упоминали чанкинг — разбиение документации на фрагменты, с которыми работает RAG. Это ключевой элемент всей системы, и от него напрямую зависит качество ответов. В следующей статье подробнее разберу, как именно формировать такие фрагменты и какие требования к ним предъявляются.