первыйБитБИТ.АГЕНТЫ/туториал

Знания и RAG

Зачем агенту база знаний?

LLM ограничены тем, что знали на момент обучения. Спросите модель о внутренних регламентах компании — и она либо не ответит, либо начнёт галлюцинировать (выдумывать факты). RAG (Retrieval-Augmented Generation) решает эту проблему: перед ответом агент ищет релевантную информацию в собственной базе знаний и отвечает только на её основе.

Enterprise-внедрения LLM в 2024–2026 годах почти всегда используют RAG — это самый надёжный способ привязать ответы модели к актуальным корпоративным данным, будь то регламенты, документация продуктов или база знаний техподдержки.

8 техник улучшения RAG

Упорядочены по эффективности. Первые три реализованы в этом туториале.

#1Query Rewriting/Transformation✅ Реализовано
+10–25% точности

Агент переписывает запрос перед поиском: разрешает местоимения, раскрывает аббревиатуры, уточняет намерение. Самый эффективный приём — дешевле и проще любых архитектурных изменений.

#2Chunk Optimization (размер + границы)✅ Реализовано
+5–15% точности

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

#3Relevance Threshold + Graceful Fallback✅ Реализовано
Устраняет ложные срабатывания

Чанки ниже порога косинусной близости (0.5) не возвращаются. Если ничего не найдено — агент отказывается отвечать, а не галлюцинирует.

#4Hybrid Search (Semantic + Keyword)🔲 Для самостоятельной работы
+5–10% полноты

Комбинация эмбеддингов (семантика) с BM25 (ключевые слова). Ловит точные совпадения — номера телефонов, имена — которые могут теряться в эмбеддингах.

#5Re-ranking (Cross-Encoder)🔲 Для самостоятельной работы
+5–15% точности

После грубого поиска по эмбеддингам — повторное ранжирование более точной (но дорогой) моделью. Стандартный production-паттерн.

#6Self-RAG (рефлексия над документами)🔲 Для самостоятельной работы
+5–10% корректности

Агент проверяет, действительно ли найденный документ релевантен, прежде чем использовать его. Если нет — повторяет поиск.

#7Context Compression🔲 Для самостоятельной работы
-40–60% размера промпта

Вместо целых чанков — извлечение только релевантных предложений через LLM. Снижает стоимость и помогает с длинным контекстом.

#8Metadata Filtering (предварительная фильтрация)🔲 Для самостоятельной работы
Критично для 10k+ чанков

Фильтрация по метаданным (раздел, дата, тип) до семантического поиска. Резко снижает шум в поисковом пространстве.

Как это работает: RAG-пайплайн

Когда пользователь задаёт вопрос, агент проходит шесть шагов:

ЗапросПереписываниеЭмбеддингПоискРанжированиеИнжекцияОтвет
  • Запрос — пользователь задаёт вопрос на естественном языке.
  • Переписывание (Rewrite) — LLM превращает «какой у нас дресскод?» в «правила дресс-кода компания».
  • Эмбеддинг (Embed) — запрос превращается в вектор через embedding API.
  • Поиск (Search) — косинусная близость между вектором запроса и всеми чанками базы знаний.
  • Ранжирование (Rank) — отсев ниже порога 0.5, сортировка по близости.
  • Инжекция (Inject) — найденные чанки добавляются в контекст сообщения.
  • Ответ (Answer) — LLM формирует ответ строго на основе предоставленного контекста.

Код RAG-пайплайна

rag-pipeline.ts
// Полный RAG-пайплайн
async function ragPipeline(userQuery: string) {
  // 1. Query Rewriting
  const rewritten = await llm.chat([
    { role: "system", content: "Перепиши запрос для поиска" },
    { role: "user", content: userQuery }
  ])

  // 2. Embedding
  const queryEmbedding = await embed(rewritten)

  // 3. Search (Cosine Similarity)
  const chunks = vectorStore
    .map(c => ({
      ...c,
      similarity: cosineSimilarity(queryEmbedding, c.embedding)
    }))
    .filter(c => c.similarity >= 0.5)  // Threshold
    .sort((a, b) => b.similarity - a.similarity)
    .slice(0, 3)

  // 4. Inject context & generate
  const context = chunks.map(c => c.text).join("\n")
  return llm.chat([
    { role: "system", content: "Ответь на основе контекста" },
    { role: "user", content: context },
    { role: "user", content: userQuery }
  ])
}

Query Rewriting

query-rewrite.ts
// Query Rewriting — самый эффективный приём
const rewritePrompt = `Перепиши вопрос для поиска по базе знаний:
- Замени местоимения на существительные
- Раскрой аббревиатуры
- Выдели ключевые сущности

Оригинал: "${query}"
Поисковый запрос:`

Чанкинг с осознанием границ

chunk-text.ts
// Чанкинг с осознанием границ
function chunkText(text: string): Chunk[] {
  const sections = text.split(/=== (.+) ===/)
  // Каждый раздел → параграфы
  // Каждый параграф → ~256 токенов
  // Перекрытие 15% между чанками
  const chunks: Chunk[] = []
  // ... boundary-aware splitting
  return chunks
}

Попробуйте сами

Чат ниже подключён к базе знаний company_handbook.txt. Задавайте вопросы о регламентах, контактах и политиках компании.

Попробуйте эти вопросы:

  • Какой дресс-код? — должен ответить из раздела «Общие регламенты»
  • Кому звонить при проблемах с IT? — найдёт контакты IT-поддержки
  • Сколько зарабатывает гендиректор? — должен отказаться (нет в базе знаний)
RAG-агент