Інтеграція LlamaIndex для RAG-систем
LlamaIndex (раніше GPT Index) — це фреймворк, спеціалізований для RAG: завантаження, індексування та запит документів. На відміну від універсальності LangChain, LlamaIndex фокусується на ingestion даних, передовому retrieval та розумінні запитів. Виділяється багатою екосистемою загрузників (150+ джерел) та передовими стратегіями індексування.
Базовий 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)
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="Фінансові показники компанії за 2023–2025",
)
contracts_tool = QueryEngineTool.from_defaults(
query_engine=contracts_index.as_query_engine(),
name="contracts",
description="Контракти з постачальниками та клієнтами",
)
# SubQuestion engine автоматично розбиває запити на під-запити
engine = SubQuestionQueryEngine.from_defaults(
query_engine_tools=[financial_tool, contracts_tool],
use_async=True,
)
response = engine.query(
"Порівняйте виручку Q1 2025 з бюджетом і перевірте затримані платежі в контрактах"
)
# Агент створює 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), # Додає заголовок документу до метаданих кожного чанка
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)
Retrieval-Augmented Fine-Tuning: Адаптація вбудовувань
from llama_index.finetuning import EmbeddingAdapterFinetuneEngine, generate_qa_embedding_pairs
# Генерування тренувальних пар з документів
train_dataset = generate_qa_embedding_pairs(
nodes=train_nodes,
llm=OpenAI(model="gpt-4o-mini"),
)
# Fine-tune адаптера вбудовувань
finetune_engine = EmbeddingAdapterFinetuneEngine(
train_dataset,
base_embed_model=OpenAIEmbedding(),
model_output_path="embed_adapter",
epochs=4,
batch_size=8,
)
finetune_engine.finetune()
# Застосування адаптера
from llama_index.embeddings.adapter import AdapterEmbeddingModel
adapted_embed = AdapterEmbeddingModel(
OpenAIEmbedding(),
adapter_path="embed_adapter",
)
Практичний приклад: Корпоративна база знань страховної компанії
Початкова ситуація: 15 000 сторінок документів (поліси, правила страхування, нормативні інструкції, внутрішні процедури). Оператори витрачали 8–12 хвилин на пошук відповіді на запитання клієнта.
Архітектура на LlamaIndex:
- Джерела: 4 типи документів у окремих Qdrant індексах
- RouterQueryEngine: маршрутизація за типом запиту
- SubQuestionQueryEngine: для запитів, що охоплюють кілька типів
- IngestionPipeline: автоматичне переіндексування при оновленні документів
- Фільтрація метаданих: за типом страхування, датою документу, регіональним регулятором
Результати:
- Середній час відповіді оператора: 10 хв → 1,5 хв
- Точність відповідей (оцінка експертів): 91%
- Неправильні посилання на застарілі версії поліс: ~8% → 0,4%
- Охоплення документів: 73% (оператори раніше не знали про існування багатьох документів)
LlamaIndex vs LangChain для RAG
| Аспект | LlamaIndex | LangChain |
|---|---|---|
| Спеціалізація | RAG, document QA | Універсальні LLM-додатки |
| Завантажувачі даних | 150+ нативних | Через спільноту |
| Передовий retrieval | SubQuestion, Router вбудовані | Потребує кастомізації |
| Можливості агентів | Доступні (LlamaAgents) | Більш зрілі (LangGraph) |
| Екосистема | LlamaHub | LangChain Hub |
Графік реалізації
- Базовий RAG на LlamaIndex: 3–5 днів
- Мульти-джерельний RAG з RouterQueryEngine: 1–2 тижні
- IngestionPipeline з автоматичними оновленнями: 1 тиждень
- Fine-tuning вбудовувань для домену: 2–3 тижні







