LangChain vs LlamaIndex vs Haystack — что выберете и почему?

Краткий тезис

Выбор фреймворка для оркестрации LLM-приложений зависит от задачи. LangChain — стандарт индустрии для агентов и сложных цепочек, имеет наибольшее сообщество и множество интеграций. LlamaIndex — лучший выбор, если ядро системы — это RAG (Retrieval-Augmented Generation), с продвинутыми стратегиями retrieval и индексации. Haystack ориентирован на production-ready, асинхронные пайплайны без «магии», что делает его надёжным для высоконагруженных систем. На практике часто комбинируют: LlamaIndex для retrieval, LangChain для агентов, а Haystack для финального пайплайна развёртывания.


1. Термин: Оркестрация LLM-приложений

Оркестрация — это процесс управления последовательностью вызовов LLM, инструментов, баз данных и других компонентов для выполнения сложной задачи. Фреймворки оркестрации предоставляют абстракции: Chains (цепочки шагов), Agents (агенты с правом выбора инструментов), Pipelines (конвейеры обработки) и Retrieval (поиск информации).

Каждый фреймворк решает одни и те же базовые проблемы, но с разными акцентами: LangChainгибкость и экосистема, LlamaIndex — глубина retrieval, Haystack — надёжность и производительность.


2. Обзор фреймворков

2.1 LangChain

  • Дата выхода 2022
  • Основатель Harrison Chase
  • Ключевая идея: Модульные цепочки (chains) и агенты с интеграцией сотен инструментов.
  • Сильные стороны
    • Огромное сообщество (>100k stars на GitHub).
    • LangSmith для мониторинга и отладки.
    • LangGraph для построения графовых состояний (state graphs) — основа для сложных агентов.
    • Встроенная поддержка Runnable (единый интерфейс для любых компонентов).

2.2 LlamaIndex (ранее GPT Index)

  • Дата выхода 2022
  • Основатель Jerry Liu
  • Ключевая идея: «Данные — это интерфейс»: оптимальная индексация и retrieval для любых источников.
  • Сильные стороны

2.3 Haystack (by deepset)

  • Дата выхода 2019 (первый стабильный)
  • Основатель Milos Rusic
  • Ключевая идея: «Production-first»: минимальные зависимости, строгая типизация, асинхронность.
  • Сильные стороны
    • Pipeline как граф узлов (каждый узел — компонент с чётким API).
    • Встроенная поддержка Qdrant, Weaviate, Elasticsearch и других векторных БД.
    • Haystack 2.0 — полностью асинхронный, поддерживает streaming.
    • Фокус на отказоустойчивость и observability.

3. Сравнительная таблица

ХарактеристикаLangChainLlamaIndexHaystack
Основное назначениеАгенты, chains, сложная оркестрацияRAG-пайплайны, продвинутый retrievalProduction-ready пайплайны
СообществоОчень большоеБольшоеСреднее
Количество интеграций700+200+50+ (но качественные)
АгентыМощные (ReAct, OpenAI functions, LangGraph)Базовые (через QueryEngine)Ограниченные (через Pipeline)
Стратегии retrievalБазовые (через vectorstores)Лучшие (семантический чанкинг, reranking, query decomposition)Хорошие (гибридный поиск, Ranking node)
Простота start'аСредняя (много концепций)Высокая (быстрый RAG за 5 строк)Средняя (структура pipeline)
Производственная надёжностьСредняя (частые breaking changes)Средняя (стабильнее, но API меняется)Высокая (зрелый, стабильный, async)
Мониторинг / ObservabilityLangSmith, LangFuseОпционально (через CallbackManager)Haystack Tracing, OpenTelemetry
Поддержка streamingДа (через StreamingCallbackHandler)Да (через stream_complete)Да (нативный async streaming)
ЛицензияMITMITApache 2.0
Когда выбиратьНужны агенты, много тулов, кастомизацияRAG — ключевой юзкейс, сложные sourceНадёжный продакшн без сюрпризов

4. Когда выбирать LangChain

LangChain — это «швейцарский нож» LLM-оркестрации. Выбирайте его, если:

  • Вам нужны агенты с динамическим выбором инструментов (калькулятор, поиск в интернете, база данных).
  • Задача требует сложной логики с ветвлением, циклами (например, self-ask, multi-step reasoning).
  • Вы используете LangGraph для построения графа состояний (состояния сохраняются между шагами).
  • Вам нужна интеграция с сотнями внешних сервисов (Slack, Google Drive, SQL, векторные БД).
  • Вы строите chatbot с памятью, историей, контекстными запросами.

Недостатки

  • API часто меняется, особенно в версии 0.3 → 0.4.
  • Много «магии» (скрытые имплементации).
  • Агенты могут быть недетерминированными и дорогими по токенам.

Пример кода (LangChain Agent с инструментом):

from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import Tool
from langchain_community.llms import OpenAI
from langchain_community.utilities import SerpAPIWrapper

llm = OpenAI(temperature=0)
search = SerpAPIWrapper()
tools = [Tool(name="Search", func=search.run, description="Search web")]

agent = create_react_agent(llm, tools, prompt=None)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke({"input": "What is the capital of France?"})

5. Когда выбирать LlamaIndex

LlamaIndex идеален, когда 80% вашего приложения — это RAG. Он предоставляет out-of-the-box:

  • Десятки стратегий чанкинга TokenTextSplitter, SentenceSplitter, SemanticSplitterNodeParser.
  • Гибридный retrieval (BM25 + vector) с reranker (например, Cohere rerank).
  • Query transformation: разбивка сложного запроса на подвопросы (SubQuestionQueryEngine).
  • Составные индексы VectorStoreIndex + SummaryIndex + KeywordTableIndex.
  • Оценка RAG встроенные метрики (hit rate, MRR, faithfulness) через RagEvaluatorPack.

Выбирайте LlamaIndex, если:

  • У вас много документов разного формата (PDF, HTML, Notion, SQL).
  • Нужно реализовать query routing (какой индексперва использовать).
  • Вы хотите быстро прототипировать RAG и сразу оценить его качество.
  • Вы используете LlamaParse для сложных PDF (таблицы, многостраничные документы).

Пример кода (LlamaIndex RAG):

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI

documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("Who is the author?")
print(response)

6. Когда выбирать Haystack

Haystack — это фреймворк зрелого продакшена. Его преимущества:

  • Стабильность версии API редко ломаются, документация чёткая.
  • Асинхронность можно обрабатывать сотни запросов в секунду с AsyncPipeline.
  • Компонентный дизайн каждый узел — класс с run() методом, легко наследовать.
  • Интеграция с популярными векторными БД (Elasticsearch, Qdrant, Weaviate) через одинаковый API.
  • Отказоустойчивость встроенный retry, таймауты, логирование.
  • Haystack 2.x поддерживает streaming, conditional branching, metadata filtering.

Выбирайте Haystack, если:

  • Ваша система будет работать под нагрузкой (100+ RPS).
  • Вам нужна полная прозрачность каждого шага без скрытых вызовов.
  • Вы используете Elasticsearch или OpenSearch как основную БД.
  • Вы хотите легко декомпозировать пайплайн на микросервисы.
  • Вы предпочитаете минимум зависимостей (Haystack тянет только нужное).

Пример кода (Haystack 2.x pipeline):

from haystack import Pipeline
from haystack.components.retrievers import EmbeddingRetriever
from haystack.components.generators import OpenAIGenerator
from haystack.components.embedders import OpenAITextEmbedder
from haystack.document_stores import InMemoryDocumentStore

doc_store = InMemoryDocumentStore()
pipeline = Pipeline()
pipeline.add_component("embedder", OpenAITextEmbedder())
pipeline.add_component("retriever", EmbeddingRetriever(document_store=doc_store, top_k=3))
pipeline.add_component("llm", OpenAIGenerator(model="gpt-4"))
pipeline.connect("embedder.embedding", "retriever.query_embedding")
pipeline.connect("retriever.documents", "llm.documents")

result = pipeline.run({"embedder": {"text": "What is the capital of France?"}})
print(result["llm"]["replies"][0])

7. Комбинирование фреймворков

На практике часто используют гибридный подход:

  • LlamaIndex — для построения индекса и retrieval (наилучший retrieval).
  • LangChain — для агентов, которые принимают решение, какой retrieval использовать, и вызывают инструменты.
  • Haystack — для production-пайплайна (логирование, мониторинг, балансировка).

Пример архитектуры:

  1. LlamaIndex строит VectorStoreIndex и SummaryIndex на документах.
  2. LangChain Agent получает запрос, решает, нужно ли искать в документах.
  3. Вызывает LlamaIndex как инструмент (через Tool).
  4. Результат передаётся в Haystack пайплайн для финальной генерации с проверкой фактов.
# Пример: LlamaIndex как инструмент в LangChain
from langchain.tools import Tool
from llama_index.core import VectorStoreIndex
from langchain.agents import AgentExecutor, create_openai_tools_agent

index = VectorStoreIndex.from_documents(...)
query_engine = index.as_query_engine()

def query_docs(query: str) -> str:
    return str(query_engine.query(query))

tools = [Tool(name="DocumentSearch", func=query_docs, description="Search internal docs")]
# Далее создать LangChain Agent с этими инструментами

8. Критерии выбора сводная таблица

КритерийLangChainLlamaIndexHaystack
Гибкость9/107/108/10
Простота RAG6/1010/108/10
Агенты10/103/104/10
Производительность6/107/1010/10
Стабильность API4/106/109/10
Экосистема10/108/106/10

9. Личный опыт и рекомендации

На собеседовании я отвечаю так:
«Для агентов и сложной оркестрации я выбираю LangChain. Для чистого RAG на продакшн — LlamaIndex или Haystack. Часто комбинирую: LlamaIndex для retrieval, LangChain для агентов, а Haystack для развёртывания финального пайплайна. Если нужна быстрая POC — сначала пробую LlamaIndex, если нужна стабильная высоконагруженная система — Haystack. LangChain — это универсальный клей, но для агентов он незаменим.»

Дополнительный совет следите за новыми фреймворками — LangGraph (от создателей LangChain) уже вытесняет обычный LangChain для агентов, а Haystack активно развивает встроенных агентов (на базе Pipeline с циклами).


10. Типичные ошибки

  • Выбрать LangChain для простого RAG — избыточно и замедлит разработку.
  • Выбрать LlamaIndex для агентов — придётся писать много обвязок.
  • Выбрать Haystack для прототипа — дольше стартовать, меньше готовых шаблонов.
  • Комбинировать все три без чёткой архитектуры — зоопарк зависимостей.

11. Будущее фреймворков

  • LangChain движется к графовым агентам (LangGraph), отходя от линейных цепочек.
  • LlamaIndex углубляется в RAG-as-a-Service (LlamaCloud, бесплатный парсинг).
  • Haystack развивает встроенных агентов и поддержку мультимодальности.
  • Общая тенденция: конвергенция — каждый фреймворк заимствует лучшие идеи других.

Пет-проект для закрепления

Задача Построить гибридную поисковую систему с агентским принятием решений.
Инструменты Python, LangChain, LlamaIndex, Streamlit.
Шаги:

  1. Сбор данных Скачайте 20 статей с arXiv по теме «RAG».
  2. LlamaIndex Создайте два индекса: VectorStoreIndex (семантический поиск) и KeywordTableIndex (ключевые слова).
  3. LangChain Agent Создайте агента с инструментами:
  4. Логика агента Агент получает вопрос, решает, какой инструмент использовать, или комбинирует результаты.
  5. UI Streamlit-приложение с полем ввода и выводом ответа с источниками.
  6. Оценка Добавьте несколько тестовых вопросов и посчитайте точность ответов.

Ожидаемый результат Работающее приложение, которое для фактологических вопросов использует векторный поиск, для вопросов типа «перечислить» — keyword search, а для свежих событий — веб-поиск.


Связь с другими вопросами

ВопросТема
#39Агенты в LLM (концепция, ReAct, tool use)
#42Построение RAG pipeline (LlamaIndex vs Haystack)
#43Управление памятью в агентах (LangChain Memory)
#44Использование инструментов (tools) и функций (functions)
#45Multi-agent архитектуры (LangGraph, CrewAI)
#47Мониторинг LLM-приложений (LangSmith, Haystack Tracing)

Навигация