RAG框架对比:LangChain vs LlamaIndex vs Haystack

三大 RAG 框架的架构设计、检索策略、生产化能力与社区生态对比 | 2026-02


一、RAG 框架的定位

RAG(Retrieval Augmented Generation)已成为大模型应用的标准范式。三大框架各有侧重:LangChain 定位为通用 LLM 编排框架,LlamaIndex 专注于数据连接与检索,Haystack 以搜索工程为根基。

本文从架构设计、检索策略、Chunking、评估体系、生产就绪度五个维度做深度对比。


二、架构设计

2.1 基础信息

维度 LangChain LlamaIndex Haystack
公司 LangChain Inc. LlamaIndex Inc. deepset
语言 Python / TypeScript Python / TypeScript Python
开源协议 MIT MIT Apache 2.0
GitHub Stars 100K+ 40K+ 18K+
核心定位 LLM 编排框架 数据框架 搜索/NLP 流水线
设计哲学 万物皆 Chain/Agent 万物皆 Index/Query 万物皆 Pipeline/Component

2.2 架构理念对比

LangChain Architecture:
  LCEL (LangChain Expression Language)
     |
  Prompt -> Model -> OutputParser
     |          |
  Retriever  Tools/Functions
     |
  VectorStore / BM25 / Multi-query

LlamaIndex Architecture:
  Documents -> Nodes -> Index -> Query Engine
     |            |         |          |
  Readers    Parsers   Embeddings  Response Synthesizer
     |                     |
  150+ data    Vector / Summary / Knowledge Graph
  connectors

Haystack Architecture:
  Pipeline = Component Graph (DAG)
     |
  Component -> Component -> Component
     |            |            |
  Retriever   Ranker      Generator
     |            |
  DocumentStore  Cross-encoder

2.3 核心抽象对比

抽象概念 LangChain LlamaIndex Haystack
最小执行单元 Runnable (LCEL) QueryEngine Component
流水线 Chain / RunnableSequence QueryPipeline Pipeline (DAG)
文档 Document Document / Node Document
检索器 Retriever Retriever / Index Retriever
生成器 ChatModel / LLM LLM / ResponseSynth Generator
记忆 Memory / History ChatMemory ChatMessageStore
Agent Agent / AgentExecutor Agent Agent

三、数据处理与 Chunking

3.1 数据连接器

数据源 LangChain LlamaIndex Haystack
PDF PyPDFLoader + 10种 SimpleDirectory + 插件 PDFToTextConverter
Web 页面 WebBaseLoader BeautifulSoupReader HTMLToDocument
数据库 SQLDatabase DatabaseReader 社区组件
API APIChain 自定义 Reader 自定义 Component
S3/GCS S3Loader S3Reader 社区组件
Notion NotionDBLoader NotionPageReader 社区组件
Confluence ConfluenceLoader 插件 社区组件
总数 ~80 种 ~150 种(LlamaHub) ~40 种

3.2 Chunking 策略

# LangChain: Rich text splitter ecosystem
from langchain_text_splitters import (
    RecursiveCharacterTextSplitter,
    MarkdownHeaderTextSplitter,
    HTMLSectionSplitter,
    SemanticChunker,
)

# Basic recursive splitting (most common)
splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    separators=["\n\n", "\n", ". ", " ", ""],
)

# Semantic chunking (embedding-based boundary detection)
from langchain_openai import OpenAIEmbeddings
semantic_splitter = SemanticChunker(
    embeddings=OpenAIEmbeddings(),
    breakpoint_threshold_type="percentile",
    breakpoint_threshold_amount=95,
)
chunks = semantic_splitter.split_text(long_document)
# LlamaIndex: Node-based parsing with metadata preservation
from llama_index.core.node_parser import (
    SentenceSplitter,
    SemanticSplitterNodeParser,
    HierarchicalNodeParser,
    MarkdownNodeParser,
)
from llama_index.core import Document

# Hierarchical chunking (parent-child relationships)
parser = HierarchicalNodeParser.from_defaults(
    chunk_sizes=[2048, 512, 128],  # Large -> Medium -> Small
)
nodes = parser.get_nodes_from_documents([Document(text=content)])
# Each node knows its parent and children -> enables auto-merging retrieval

3.3 Chunking 策略对比

策略 LangChain LlamaIndex Haystack
固定大小 RecursiveCharText SentenceSplitter DocumentSplitter
语义切分 SemanticChunker SemanticSplitter 社区
层级切分 HierarchicalParser
Markdown 感知 MarkdownHeaderSplitter MarkdownParser MarkdownConverter
HTML 感知 HTMLSectionSplitter HTMLNodeParser HTMLConverter
代码感知 Language(code) CodeSplitter
自动合并 AutoMergingRetriever

四、检索策略

4.1 检索方法支持

检索方法 LangChain LlamaIndex Haystack
向量搜索
BM25 是(BM25Retriever) 是(原生强项)
混合搜索 EnsembleRetriever 内置 内置
Multi-query MultiQueryRetriever
HyDE 社区
Parent-Document ParentDocRetriever AutoMerging
Contextual Compression 是(Ranker)
Self-Query SelfQueryRetriever
Recursive RecursiveRetriever
Knowledge Graph GraphRetriever KGIndex
Reranking 是(Cohere/BGE) 是(Cross-encoder)

4.2 高级 RAG 实现对比

# LangChain: Multi-query + Rerank pipeline
from langchain.retrievers import MultiQueryRetriever, ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder

# Step 1: Multi-query generates 3 variations of the question
multi_retriever = MultiQueryRetriever.from_llm(
    retriever=vectorstore.as_retriever(search_kwargs={"k": 20}),
    llm=llm,
)

# Step 2: Rerank with cross-encoder
reranker = CrossEncoderReranker(
    model=HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-v2-m3"),
    top_n=5,
)
compression_retriever = ContextualCompressionRetriever(
    base_compressor=reranker,
    base_retriever=multi_retriever,
)

# Step 3: Generate
docs = compression_retriever.invoke("What is the refund policy?")
# LlamaIndex: Auto-merging retrieval (hierarchical)
from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.core.node_parser import HierarchicalNodeParser, get_leaf_nodes
from llama_index.core.retrievers import AutoMergingRetriever
from llama_index.core.query_engine import RetrieverQueryEngine

# Build hierarchical nodes
parser = HierarchicalNodeParser.from_defaults(chunk_sizes=[2048, 512, 128])
nodes = parser.get_nodes_from_documents(documents)

# Index only leaf nodes, but store all
leaf_nodes = get_leaf_nodes(nodes)
storage_context = StorageContext.from_defaults()
storage_context.docstore.add_documents(nodes)

index = VectorStoreIndex(leaf_nodes, storage_context=storage_context)

# Auto-merging retriever: if enough leaf nodes from same parent match,
# automatically merges up to parent node for better context
retriever = AutoMergingRetriever(
    index.as_retriever(similarity_top_k=12),
    storage_context,
    simple_ratio_thresh=0.4,  # Merge if 40%+ children match
)
query_engine = RetrieverQueryEngine.from_args(retriever)

五、评估体系

5.1 内置评估能力

维度 LangChain LlamaIndex Haystack
评估框架 LangSmith Evals 内置 Evaluator Haystack Eval
忠实度 是(FaithfulnessEval) FaithfulnessEvaluator
相关性 是(RelevanceEval) RelevancyEvaluator
回答正确性 CorrectnessEvaluator
检索质量 MRR/MAP HitRate/MRR MRR/MAP/NDCG
LLM 评判
人工标注 LangSmith UI
RAGAS 集成

5.2 评估代码对比

# LlamaIndex built-in evaluation
from llama_index.core.evaluation import (
    FaithfulnessEvaluator,
    RelevancyEvaluator,
    BatchEvalRunner,
)

faithfulness = FaithfulnessEvaluator(llm=eval_llm)
relevancy = RelevancyEvaluator(llm=eval_llm)

runner = BatchEvalRunner(
    {"faithfulness": faithfulness, "relevancy": relevancy},
    workers=4,
)

eval_results = await runner.aevaluate_queries(
    query_engine,
    queries=test_queries,
    reference=ground_truth,
)

# Output: per-query scores + aggregate metrics
for query, results in eval_results.items():
    print(f"Q: {query}")
    print(f"  Faithfulness: {results['faithfulness'].score}")
    print(f"  Relevancy: {results['relevancy'].score}")

六、生产就绪度

6.1 生产化特性对比

特性 LangChain LlamaIndex Haystack
流式输出 是(LCEL原生)
异步支持 是(完整) 是(完整)
并发控制 是(RateLimiter)
重试机制 是(内置)
缓存 是(多种后端)
可观测性 LangSmith / Callbacks Callbacks Pipeline logs
部署方式 LangServe / API FastAPI 示例 Hayhooks
Docker 官方支持 社区 官方支持
Kubernetes LangServe + Helm 社区 deepset Cloud

6.2 错误处理与回退

能力 LangChain LlamaIndex Haystack
Fallback 链 with_fallbacks()
重试策略 with_retry() 组件级
超时控制
速率限制 InMemoryRateLimiter
错误回调 on_chain_error on_event
# LangChain: Production-grade error handling
from langchain_core.runnables import RunnableWithFallbacks

# Primary model with fallback
primary = ChatOpenAI(model="gpt-4o", request_timeout=30)
fallback = ChatAnthropic(model="claude-sonnet-4-20250514", request_timeout=30)

robust_llm = primary.with_fallbacks([fallback])

# Add retry and rate limiting
from langchain_core.rate_limiters import InMemoryRateLimiter

rate_limiter = InMemoryRateLimiter(
    requests_per_second=10,
    check_every_n_seconds=0.1,
    max_bucket_size=20,
)

production_llm = robust_llm.with_retry(
    stop_after_attempt=3,
    wait_exponential_jitter=True,
).bind(rate_limiter=rate_limiter)

七、社区与生态

7.1 生态规模

维度 LangChain LlamaIndex Haystack
GitHub Stars 100K+ 40K+ 18K+
月活贡献者 200+ 80+ 30+
NPM/PyPI 下载量 5M+/月 1.5M+/月 300K+/月
Discord 成员 30K+ 10K+ 3K+
集成数量 800+ 300+ 100+
教程/博客 极多 中等

7.2 学习曲线

Learning Curve (Time to Production)

Complexity
    |
    |         LangChain
    |        /
    |       /    LlamaIndex
    |      /    /
    |     /    /     Haystack
    |    /    /     /
    |   /    /     /
    |  /    /     /
    | /    /     /
    |/    /     /
    +----/-----/-------> Time
    PoC      Production

Notes:
- LangChain: Fast PoC due to many examples, but complexity ramps up
- LlamaIndex: Moderate start, cleaner path to production
- Haystack: Steeper start (pipeline thinking), but predictable scaling

八、选型决策

8.1 按场景推荐

场景 首选 理由
通用 LLM 应用 LangChain 最大生态,最多集成
纯 RAG 系统 LlamaIndex 专注数据检索,策略丰富
企业搜索 Haystack 搜索工程基因,BM25 原生强
快速 PoC LangChain 示例最多,上手最快
复杂数据管道 LlamaIndex 150+ 连接器,层级解析
Agent 系统 LangChain (LangGraph) Agent 生态最完整
生产稳定性 LangChain / Haystack 错误处理和部署最成熟

8.2 综合评分

维度(权重) LangChain LlamaIndex Haystack
检索策略丰富度(25%) 9.0 9.5 7.5
生产就绪度(25%) 9.0 7.5 8.5
开发者体验(20%) 8.5 8.5 7.0
生态/社区(15%) 9.5 8.0 6.5
数据连接能力(15%) 8.0 9.5 6.5
加权总分 8.8 8.6 7.3

九、混合使用策略

在生产实践中,不必拘泥于单一框架。常见的混合策略:

  1. LlamaIndex 管数据 + LangChain 管编排:用 LlamaIndex 的 Reader/Parser 做数据处理,导出为 LangChain Document,在 LangChain 中做 Agent 和工作流编排
  2. LangChain 做原型 + Haystack 做生产:用 LangChain 快速验证 RAG 方案,然后用 Haystack 的 Pipeline 重写核心检索链路
  3. 框架无关的向量层:直接使用向量数据库 SDK(Qdrant/Milvus),在上层选择轻量编排

核心原则:框架是手段,不是目的。当框架的抽象成为负担时,直接用底层 SDK。


Maurice | maurice_wen@proton.me