Інтеграція LlamaIndex для RAG-систем
Оператори страхової компанії витрачали до 12 хвилин на пошук відповіді серед 15 000 сторінок полісів та інструкцій. Ми впровадили LlamaIndex — час скоротився до 1,5 хвилин, точність зросла до 91%, а помилки через застарілі документи впали з 8% до 0,4%. За 5 років ми реалізували 20+ проєктів з інтеграції RAG на LlamaIndex у фінансах, страхуванні, рітейлі. Гарантуємо точність не нижче 90% на ваших даних. Середня економія на масштабі — значна, а окупність проєкту швидка.
Які проблеми вирішує 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 день — напишіть нам. Замовте аудит даних і отримайте комерційну пропозицію.







