Інтеграція LlamaIndex для RAG та індексації даних

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Інтеграція LlamaIndex для RAG та індексації даних
Середній
від 1 тижня до 3 місяців
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Інтеграція 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 тижні