Интеграция 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 |
Что входит в работу
- Аудит источников данных — определяем типы документов, объём, частоту обновлений.
- Проектирование индекса — выбираем чанкер, модель эмбеддингов, векторное хранилище.
- Настройка Retrieval pipeline — конфигурируем RouterQueryEngine, SubQuestionQueryEngine, реранжирование.
- Интеграция с инфраструктурой — подключаем API, CI/CD, дашборд мониторинга (latency p99, recall).
- Обучение команды — документация и воркшоп по работе с системой.
Сроки ориентировочно
- Базовый RAG на LlamaIndex: от 3 до 5 дней
- Мульти-источниковый RAG с RouterQueryEngine: от 1 до 2 недель
- IngestionPipeline с автоматическим обновлением: от 1 недели
- Файнтюнинг эмбеддингов под домен: от 2 до 3 недель
Точные сроки рассчитываем после аудита данных. Оценим проект за 1 день — напишите нам. Закажите аудит данных и получите коммерческое предложение. Гарантируем окупаемость за 3–4 месяца за счёт сокращения времени поиска: экономия до $18k–26k в год на операторах.







