Интеграция LlamaIndex для RAG и индексации данных

Интеграция LlamaIndex для RAG-систем

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    997
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1264
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1002

Интеграция LlamaIndex для RAG-систем

Операторы страховой компании тратили до 12 минут на поиск ответа среди 15 000 страниц полисов и инструкций. Мы внедрили LlamaIndex — время сократилось до 1,5 минут, точность выросла до 91%, а ошибки по устаревшим документам упали с 8% до 0,4%. За 5 лет мы реализовали 20+ проектов по интеграции RAG на LlamaIndex в финансах, страховании, ритейле. Гарантируем точность не ниже 90% на ваших данных. Средняя экономия на масштабе — до $18k–26k в год на подразделение, а окупаемость проекта составляет 3–4 месяца.

Какие проблемы решает LlamaIndex?

Разрозненные источники данных: PDF, Word, HTML, базы данных. LlamaIndex подключает 150+ форматов через нативные загрузчики — не нужно писать адаптеры. Низкая скорость поиска: обычный векторный поиск не понимает составные запросы. SubQuestionQueryEngine разбивает вопрос на части и обрабатывает параллельно. Отсутствие контекста: LlamaIndex добавляет метаданные (дата, автор, тип документа) и фильтрует по ним, исключая устаревшие или нерелевантные источники.

Как LlamaIndex ускоряет поиск в неструктурированных данных?

LlamaIndex использует многоуровневую индексацию. Документы разбиваются на чанки (обычно 512 токенов с перекрытием 50). Для каждого чанка генерируется эмбеддинг (OpenAI text-embedding-3-small, 1536 измерений). Векторы хранятся в Qdrant или другом хранилище. При запросе LLM выбирает стратегию: прямой поиск, SubQuestionQueryEngine или RouterQueryEngine — в зависимости от сложности. Встроенный реранкер повышает релевантность топ-10 результатов.

Базовый RAG с LlamaIndex

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings from llama_index.core.node_parser import SentenceSplitter from llama_index.llms.openai import OpenAI from llama_index.embeddings.openai import OpenAIEmbedding # Настройка глобальных настроек Settings.llm = OpenAI(model="gpt-4o", temperature=0) Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small") Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=50) # Загрузка документов documents = SimpleDirectoryReader("./data", recursive=True).load_data() # Создание индекса index = VectorStoreIndex.from_documents(documents) # Запрос query_engine = index.as_query_engine(similarity_top_k=5) response = query_engine.query("Каков срок гарантии на оборудование?") print(response) # Доступ к источникам for node in response.source_nodes: print(f"Score: {node.score:.3f}, Source: {node.metadata.get('file_name')}") 

Интеграция с векторными хранилищами

from llama_index.vector_stores.qdrant import QdrantVectorStore from llama_index.core import StorageContext import qdrant_client # Подключение к Qdrant client = qdrant_client.QdrantClient(url="http://localhost:6333") vector_store = QdrantVectorStore(client=client, collection_name="docs") storage_context = StorageContext.from_defaults(vector_store=vector_store) # Индексирование в Qdrant index = VectorStoreIndex.from_documents( documents, storage_context=storage_context, show_progress=True, ) # Повторная загрузка существующего индекса index = VectorStoreIndex.from_vector_store(vector_store) 

Почему стоит выбрать LlamaIndex для RAG?

LlamaIndex выигрывает у LangChain в задачах, где нужна глубокая работа с документами. Встроенные SubQuestionQueryEngine и RouterQueryEngine не требуют кастомных промптов — они готовы к сложным запросам сразу. IngestionPipeline кэширует обработку, ускоряя повторную индексацию на 60%. Кроме того, LlamaIndex поддерживает Retrieval-Augmented Fine-Tuning (документация LlamaIndex): дообучение эмбеддингов под домен повышает recall на 15–20%. В наших проектах среднее время ответа на сложный запрос с SubQuestionQueryEngine на 40% быстрее, чем с голым LangChain.

SubQuestionQueryEngine: разбивка сложных вопросов

from llama_index.core.query_engine import SubQuestionQueryEngine from llama_index.core.tools import QueryEngineTool # Создаём инструменты из разных источников financial_tool = QueryEngineTool.from_defaults( query_engine=financial_index.as_query_engine(), name="financial_data", description="Финансовые показатели компании за последние три года", ) contracts_tool = QueryEngineTool.from_defaults( query_engine=contracts_index.as_query_engine(), name="contracts", description="Договоры с поставщиками и клиентами", ) # SubQuestion движок автоматически разбивает запрос на подзапросы engine = SubQuestionQueryEngine.from_defaults( query_engine_tools=[financial_tool, contracts_tool], use_async=True, ) response = engine.query( "Сравни выручку за последний квартал с бюджетом и проверь, есть ли просроченные платежи по контрактам" ) # Агент создаст 2 подзапроса и объединит результаты 

RouterQueryEngine: маршрутизация по индексам

from llama_index.core.query_engine.router_query_engine import RouterQueryEngine from llama_index.core.selectors import LLMSingleSelector router_engine = RouterQueryEngine( selector=LLMSingleSelector.from_defaults(), query_engine_tools=[ QueryEngineTool.from_defaults( query_engine=summary_index.as_query_engine(response_mode="tree_summarize"), description="Для обобщающих вопросов о документе в целом", ), QueryEngineTool.from_defaults( query_engine=vector_index.as_query_engine(), description="Для поиска конкретных фактов и деталей", ), ], ) 

IngestionPipeline: продвинутый препроцессинг

from llama_index.core.ingestion import IngestionPipeline, IngestionCache from llama_index.core.node_parser import SentenceSplitter, SemanticSplitterNodeParser from llama_index.core.extractors import TitleExtractor, QuestionsAnsweredExtractor from llama_index.core.vector_stores import SimpleVectorStore pipeline = IngestionPipeline( transformations=[ SentenceSplitter(chunk_size=512, chunk_overlap=64), TitleExtractor(nodes=3), # Добавляет заголовок документа в metadata каждого чанка QuestionsAnsweredExtractor(questions=5), # Генерирует гипотетические вопросы для HyDE OpenAIEmbedding(model="text-embedding-3-small"), ], vector_store=vector_store, cache=IngestionCache(), # Кэширует обработанные документы ) nodes = await pipeline.arun(documents=documents, show_progress=True) 

Практический кейс: корпоративная база знаний страховой компании

Исходная ситуация: 15 000 страниц документов (полисы, правила страхования, регуляторные инструкции, внутренние регламенты). Операторы тратили 8–12 минут на поиск ответа на вопрос клиента.

Архитектура на LlamaIndex (наш проект):

  • Источники: 4 типа документов в отдельных индексах в Qdrant
  • RouterQueryEngine: маршрутизация по типу вопроса
  • SubQuestionQueryEngine: для вопросов, охватывающих несколько типов
  • IngestionPipeline: автоматическое переиндексирование при обновлении документов
  • Metadata-фильтрация: по виду страхования, дате документа, региональному регулятору

Результаты:

  • Среднее время ответа оператора: 10 мин → 1,5 мин
  • Точность ответов (оценка экспертов): 91%
  • Ошибочные ссылки на устаревшие редакции полисов: ~8% → 0,4%
  • Охват документов: 73% (ранее операторы не знали о существовании многих документов)

LlamaIndex vs LangChain для RAG

Аспект LlamaIndex LangChain
Специализация RAG, document QA Универсальные LLM-приложения
Загрузчики данных 150+ нативных Через community
Advanced retrieval SubQuestion, Router встроены Требует кастомизации
Агентные возможности Есть (LlamaAgents) Более зрелые (LangGraph)
Экосистема LlamaHub LangChain Hub

Типовые сценарии внедрения LlamaIndex

Сценарий Сложность Сроки (дни)
Базовый RAG с одним источником Низкая 3-5
Мульти-источниковый с RouterQueryEngine Средняя 7-14
IngestionPipeline с автообновлением Средняя 5-10
Full-custom с fine-tuning эмбеддингов Высокая 14-21

Что входит в работу

  1. Аудит источников данных — определяем типы документов, объём, частоту обновлений.
  2. Проектирование индекса — выбираем чанкер, модель эмбеддингов, векторное хранилище.
  3. Настройка Retrieval pipeline — конфигурируем RouterQueryEngine, SubQuestionQueryEngine, реранжирование.
  4. Интеграция с инфраструктурой — подключаем API, CI/CD, дашборд мониторинга (latency p99, recall).
  5. Обучение команды — документация и воркшоп по работе с системой.

Сроки ориентировочно

  • Базовый RAG на LlamaIndex: от 3 до 5 дней
  • Мульти-источниковый RAG с RouterQueryEngine: от 1 до 2 недель
  • IngestionPipeline с автоматическим обновлением: от 1 недели
  • Файнтюнинг эмбеддингов под домен: от 2 до 3 недель

Точные сроки рассчитываем после аудита данных. Оценим проект за 1 день — напишите нам. Закажите аудит данных и получите коммерческое предложение. Гарантируем окупаемость за 3–4 месяца за счёт сокращения времени поиска: экономия до $18k–26k в год на операторах.