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) и агенты с интеграцией сотен инструментов.
- Сильные стороны
2.2 LlamaIndex (ранее GPT Index)
- Дата выхода 2022
- Основатель Jerry Liu
- Ключевая идея: «Данные — это интерфейс»: оптимальная индексация и retrieval для любых источников.
- Сильные стороны
- Десятки стратегий chunking (text splitter, sentence splitter, chunking|semantic chunking).
- Сложные retrieval pipelines: гибридный поиск (keyword + vector), reranking, query transformation (разбивка сложного запроса).
- Встроенные инструменты для оценки RAG (RAGAS, DeepEval).
- LlamaCloud — управляемый сервис парсинга документов.
2.3 Haystack (by deepset)
- Дата выхода 2019 (первый стабильный)
- Основатель Milos Rusic
- Ключевая идея: «Production-first»: минимальные зависимости, строгая типизация, асинхронность.
- Сильные стороны
3. Сравнительная таблица
| Характеристика | LangChain | LlamaIndex | Haystack |
|---|---|---|---|
| Основное назначение | Агенты, chains, сложная оркестрация | RAG-пайплайны, продвинутый retrieval | Production-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) |
| Мониторинг / Observability | LangSmith, LangFuse | Опционально (через CallbackManager) | Haystack Tracing, OpenTelemetry |
| Поддержка streaming | Да (через StreamingCallbackHandler) | Да (через stream_complete) | Да (нативный async streaming) |
| Лицензия | MIT | MIT | Apache 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-пайплайна (логирование, мониторинг, балансировка).
Пример архитектуры:
- LlamaIndex строит
VectorStoreIndexиSummaryIndexна документах. - LangChain Agent получает запрос, решает, нужно ли искать в документах.
- Вызывает LlamaIndex как инструмент (через
Tool). - Результат передаётся в 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. Критерии выбора сводная таблица
| Критерий | LangChain | LlamaIndex | Haystack |
|---|---|---|---|
| Гибкость | 9/10 | 7/10 | 8/10 |
| Простота RAG | 6/10 | 10/10 | 8/10 |
| Агенты | 10/10 | 3/10 | 4/10 |
| Производительность | 6/10 | 7/10 | 10/10 |
| Стабильность API | 4/10 | 6/10 | 9/10 |
| Экосистема | 10/10 | 8/10 | 6/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.
Шаги:
- Сбор данных Скачайте 20 статей с arXiv по теме «RAG».
- LlamaIndex Создайте два индекса:
VectorStoreIndex(семантический поиск) иKeywordTableIndex(ключевые слова). - LangChain Agent Создайте агента с инструментами:
SearchVector(через LlamaIndex)SearchKeyword(через LlamaIndex)WebSearch(SerpAPI)
- Логика агента Агент получает вопрос, решает, какой инструмент использовать, или комбинирует результаты.
- UI Streamlit-приложение с полем ввода и выводом ответа с источниками.
- Оценка Добавьте несколько тестовых вопросов и посчитайте точность ответов.
Ожидаемый результат Работающее приложение, которое для фактологических вопросов использует векторный поиск, для вопросов типа «перечислить» — keyword search, а для свежих событий — веб-поиск.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| #39 | Агенты в LLM (концепция, ReAct, tool use) |
| #42 | Построение RAG pipeline (LlamaIndex vs Haystack) |
| #43 | Управление памятью в агентах (LangChain Memory) |
| #44 | Использование инструментов (tools) и функций (functions) |
| #45 | Multi-agent архитектуры (LangGraph, CrewAI) |
| #47 | Мониторинг LLM-приложений (LangSmith, Haystack Tracing) |
Навигация
- Предыдущий: 40
- Следующий: 42
- Индекс: 00. Индекс разборов