TL;DR
Что это и как работает:
Исследование про RAG-систему для вопросов по кибербезопасности (уязвимости CVE, слабости CWE). Гибридный retriever комбинирует keyword-поиск (BM25 — находит точные совпадения типа "CVE-2024-5022") и семантический поиск (векторные embeddings — находит похожие по смыслу куски). Плюс regex-фильтр для усиления документов с CVE-идентификаторами. Всё это требует векторную базу данных (FAISS), код на Python и инфраструктуру — не работает в обычном чате.
Главная находка:
LLM с вручную отформатированным контекстом выдала 82.8% точности. Та же LLM с автоматическим RAG (который сам находит контекст) — всего 57.6%. Почему? RAG подгрузил правильный документ, но в нём не было границ предложений, слова слиплись ("Focus for iOS < 12.6" превратилось в кашу), модель запуталась и ответила неправильно. Качество форматирования контекста оказалось критичнее чем сам факт его наличия. Вывод: мусор в контексте хуже чем отсутствие контекста.
Суть метода:
Гибридный retriever взвешивает два типа поиска: α × keyword_score + (1-α) × semantic_score. Keyword ловит точные идентификаторы (CVE-2024-1234), semantic ловит смысл ("buffer overflow" найдёт описание переполнения буфера даже без этих слов). Regex добавляет +1.0 к документам с CVE-ID. После поиска — нормализация и ранжирование. Топ-k документов скармливаются LLM как контекст.
Извлекаемые принципы для работы в чате
Сама RAG-инфраструктура требует код, но из исследования можно извлечь принципы для ручной работы:
Принцип 1: Форматируй контекст как для человека
Что показали: Preformatted context (82.8%) >> RAG с сырым текстом (57.6%). Модель ошибалась даже когда правильный ответ БЫЛ в контексте — из-за слипшихся слов, отсутствия границ предложений, шума.
Как применить: Когда копируешь контекст в промпт — не вставляй как есть из PDF/сайта. Потрать 30 секунд: - Раздели на абзацы - Убери повторы заголовков, навигацию, футеры - Оставь только суть: описание, факты, данные - Добавь структуру: "### Описание", "### Затронутые версии"
Пример:
❌ Плохо:
Вот статья: [вставить 5 страниц скопированного текста с сайта]
Ответь на вопрос: ...
✅ Хорошо:
Вот релевантная информация (я отформатировал для ясности):
### Описание уязвимости CVE-2024-5022
Схемы file:// в URL скрывались, что позволяло подделать адрес сайта
в адресной строке.
### Затронутые версии
Mozilla Focus for iOS < 126
Ответь на вопрос: затронут ли Firefox for iOS < 126?
Принцип 2: Температура = 0 для фактических вопросов
Что показали: При температуре 0.01 точность +4-9% по сравнению с 0.7 (дефолт) во всех конфигурациях. При температуре 1.0 — ещё хуже, рандомные ответы.
Как применить: В ChatGPT/Claude нельзя менять температуру напрямую, но можно попросить:
Отвечай максимально детерминированно, без креативности.
Только факты из контекста, никаких додумываний.
[Контекст]
[Вопрос]
Или используй Custom Instructions / System Prompt (где доступно):
Режим работы: фактический анализ без креативности.
При неуверенности — скажи "недостаточно данных", не додумывай.
Принцип 3: Keyword + смысл = надёжность
Что показали: Гибридный поиск (keyword + semantic) лучше каждого по отдельности. Keyword ловит точные идентификаторы, semantic — смысловые связи.
Как применить вручную:
Когда ищешь информацию для промпта — используй ОБА подхода:
Шаг 1 — Keyword: Загугли точные термины: "CVE-2024-5022", "Firefox iOS 126"
Шаг 2 — Semantic: Загугли смысл: "Firefox iOS адресная строка уязвимость 2024"
Шаг 3 — Объедини: Возьми официальный источник (из keyword-поиска) + детальное объяснение (из semantic-поиска). Скормить оба в промпт.
У меня два источника по уязвимости CVE-2024-5022:
**Источник 1 (официальная база CVE):**
[точное описание]
**Источник 2 (статья с разбором):**
[детальное объяснение]
Вопрос: [...]
Пример применения
Задача: Проверяешь безопасность корпоративных приложений. Пришло уведомление про CVE-2024-5022 в Firefox for iOS. Нужно понять: затронуты ли мобильные сотрудники, какие версии обновить.
Промпт:
Отвечай строго по контексту, без додумываний.
### Официальное описание CVE-2024-5022
Схемы file:// в URL могли использоваться для подделки адреса
в адресной строке браузера.
Затронуты версии: Mozilla Focus for iOS < 126
### Наш вопрос
1. Затронут ли обычный Firefox for iOS (не Focus)?
2. Если да — какие версии?
3. Если контекст не содержит ответа — так и скажи.
Результат:
Модель либо найдёт в контексте явное упоминание Firefox (и ответит точно), либо скажет "в предоставленном контексте упомянут только Firefox Focus, про обычный Firefox информации нет". Это избежит галлюцинаций.
Почему это работает
Слабость LLM: Когда контекст зашумлён (слипшиеся слова, обрывки предложений, навигационный мусор) — модель цепляется за случайные фрагменты. В исследовании LLM видела "Focus for iOS < 12.6" и решила что это не про Firefox, хотя Focus — это вариант Firefox. Форматирование убирает шум.
Сильная сторона LLM: Модель отлично извлекает факты из структурированного текста. Когда есть чёткие границы (абзацы, заголовки), модель точно связывает вопрос и ответ.
Как принцип использует сильную сторону: Ты вручную делаешь то, что RAG-система пытается автоматизировать — находишь релевантный контекст (keyword + semantic поиск) и форматируешь его. Минус: тратишь время. Плюс: гарантируешь качество, нет шума из автоматического retrieval.
Температура = рычаг детерминизма: Для фактических задач (CVE, даты, версии) креативность вредит. Низкая температура заставляет модель идти по самому вероятному пути, не отклоняться на случайные варианты.
Ограничения
⚠️ Применимость: Принципы работают для фактических задач (кибербезопасность, аналитика, проверка данных). Для креативных задач (писательство, идеи, brainstorming) форматирование менее критично, а низкая температура вредит.
⚠️ Ручной труд: В исследовании всё автоматизировано через код. Эти принципы требуют ручного поиска и форматирования контекста — окей для разовых задач, утомительно для частых.
⚠️ Узкий домен исследования: Тестировали только на CVE/CWE вопросах. В других доменах (медицина, право, финансы) форматирование может быть менее критичным фактором.
Как исследовали
Команда взяла 466 вопросов про уязвимости (KCV dataset) и 103 вопроса про слабости кода (CWET dataset). Вопросы типа "Уязвимость CVE-2024-5022 затрагивает Firefox for iOS < 126? True/False". Сравнили три подхода: (1) LLM без контекста — 59.2%, постоянно отвечала "False"; (2) LLM с вручную отформатированным контекстом — 82.8%; (3) LLM с автоматическим RAG — 57.6%, хуже чем вообще без контекста!
Почему RAG провалился? Исследователи разобрали ошибки. Пример: Модель получила документ с правильным ответом ("Focus for iOS < 12.6"), но текст был без пробелов между полями, слова слиплись. Модель решила что "Focus" ≠ "Firefox", ответила неправильно. Когда тот же текст отформатировали вручную (разбили на предложения, добавили заголовки) — модель ответила правильно.
Инсайт: Шум в контексте убивает точность. Гибридный retriever (keyword + semantic + regex для CVE) поднял точность до 72.7% — лучше чем baseline RAG, но всё ещё на 10% хуже чем preformatted. Вывод: автоматический retrieval может найти правильный документ, но если он плохо отформатирован — толку ноль.
Протестировали разные embedding-модели: mxbai-embed-large-v1 (335M параметров) vs multi-qa-MiniLM (22.7M параметров) — разница всего 1.94% точности. Огромная модель почти не даёт преимуществ.
Температура: При temp=0.01 точность 76.3%, при temp=0.7 — 72.7%, при temp=1.0 — 67.2%. Креативность = враг для фактических задач.
Ресурсы
Adapting Large Language Models to Emerging Cybersecurity using Retrieval-Augmented Generation
Arnabh Borah (Georgia Institute of Technology), Md Tanvirul Alam, Nidhi Rastogi (Rochester Institute of Technology)
Датасеты: SECURE benchmark (KCV, CWET)
Модель: Llama-3-8B-Instruct
Внешние источники: CVE база данных, CWE knowledge base
