RAG框架对比:LangChain vs LlamaIndex vs Haystack
AI 导读
RAG框架对比:LangChain vs LlamaIndex vs Haystack 三大 RAG 框架的架构设计、检索策略、生产化能力与社区生态对比 | 2026-02 一、RAG 框架的定位 RAG(Retrieval Augmented Generation)已成为大模型应用的标准范式。三大框架各有侧重:LangChain 定位为通用 LLM 编排框架,LlamaIndex...
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 |
|---|---|---|---|
| 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 |
九、混合使用策略
在生产实践中,不必拘泥于单一框架。常见的混合策略:
- LlamaIndex 管数据 + LangChain 管编排:用 LlamaIndex 的 Reader/Parser 做数据处理,导出为 LangChain Document,在 LangChain 中做 Agent 和工作流编排
- LangChain 做原型 + Haystack 做生产:用 LangChain 快速验证 RAG 方案,然后用 Haystack 的 Pipeline 重写核心检索链路
- 框架无关的向量层:直接使用向量数据库 SDK(Qdrant/Milvus),在上层选择轻量编排
核心原则:框架是手段,不是目的。当框架的抽象成为负担时,直接用底层 SDK。
Maurice | [email protected]
深度加工(NotebookLM 生成)
基于本文内容生成的 PPT 大纲、博客摘要、短视频脚本与 Deep Dive 播客,用于多场景复用
PPT 大纲(5-8 张幻灯片) 点击展开
RAG框架对比:LangChain vs LlamaIndex vs Haystack — ppt
幻灯片 1:三大 RAG 框架核心定位与设计哲学
- LangChain:定位为通用的 LLM 编排框架,其核心设计哲学是“万物皆 Chain/Agent” [1]。
- LlamaIndex:专注于数据连接与检索(数据框架),其核心设计哲学是“万物皆 Index/Query” [1]。
- Haystack:以搜索和 NLP 工程流水线为根基,其核心设计哲学是“万物皆 Pipeline/Component” [1]。
- 框架选型维度:选型需综合评估架构设计、检索策略、数据块切分(Chunking)、评估体系以及生产就绪度 [1]。
幻灯片 2:核心架构设计与抽象对比
- LangChain 架构:依托 LCEL(LangChain 表达式语言),将执行流抽象为 Prompt -> Model -> OutputParser,最小执行单元为 Runnable [1, 2]。
- LlamaIndex 架构:工作流围绕 Documents -> Nodes -> Index -> Query Engine 展开,最小执行单元为 QueryEngine [1, 2]。
- Haystack 架构:将组件构建为有向无环图(DAG),形成 Pipeline 结构流水线进行处理 [1, 2]。
- 核心组件差异:LangChain 使用 Chain/Agent 编排,LlamaIndex 侧重 Retriever/Index,Haystack 则侧重基于组件(Component)的连接 [2]。
幻灯片 3:数据接入与 Chunking 策略
- 数据源连接器:LlamaIndex 生态最为丰富(支持约 150 种连接器),LangChain 支持约 80 种,Haystack 约 40 种 [2]。
- LangChain 的切分策略:提供丰富的文本分割器生态,如固定大小切分以及基于 Embedding 边界检测的语义切分(SemanticChunker) [2-4]。
- LlamaIndex 的切分策略:基于节点(Node)进行解析并保留元数据,其独有的层级切分(HierarchicalNodeParser)能保留父子节点关系,便于后续的高级检索 [3, 4]。
幻灯片 4:高阶检索(Retrieval)策略对比
- 基础与混合搜索:三大框架均支持向量搜索和 BM25,其中 Haystack 在 BM25 方面具备原生优势,LangChain 和 LlamaIndex 则内置了混合搜索能力 [4]。
- LangChain 的高阶方案:擅长利用 Multi-query 生成多种问题变体,并结合 Cross-encoder 实现重排序(Rerank)流水线 [4, 5]。
- LlamaIndex 的高阶方案:依赖层级节点切分,提供自动合并检索(AutoMergingRetriever),当同一父节点下有足够多子节点匹配时会自动合并上下文 [5, 6]。
幻灯片 5:RAG 评估体系构建
- 内置评估能力:LangChain 依托 LangSmith 提供 UI 及正确性、相关性等评估;LlamaIndex 和 Haystack 也有专门的内置 Evaluator 工具 [6]。
- LlamaIndex 评估代码实践:提供
BatchEvalRunner进行批量评估,可直接测算 Faithfulness(忠实度)和 Relevancy(相关性)等指标分数 [7]。 - 检索质量与生态:三大框架均支持计算 MRR、MAP 等量化指标评估检索质量,并且均集成了第三方 RAGAS 评估框架 [6]。
幻灯片 6:生产就绪度与容错机制
- 并发与部署:三大框架均全面支持流式输出、异步支持和并发控制,LangChain 提供官方 LangServe 部署,Haystack 支持 Hayhooks [7]。
- 错误处理能力:LangChain 在生产环境的容错机制最完善,提供了原生的 Fallback(回退链)、组件级重试策略(
with_retry)以及错误回调功能 [7, 8]。 - 速率限制与安全:LangChain 原生提供内存级的速率限制器(InMemoryRateLimiter),以应对生产环境中的并发流量冲击,而其他两个框架暂无原生相关组件 [8]。
幻灯片 7:社区生态与架构建议
- 社区影响力:LangChain 生态规模最大(100K+ GitHub Stars,每月超 500 万次下载),LlamaIndex 次之,Haystack 相对小众 [1, 8]。
- 学习曲线考量:不同框架到达生产环境的“学习曲线”不同,企业需要结合其生态集成数量、活跃贡献者和教程丰富度进行考量 [8]。
- 核心实践原则:框架只是手段而非目的;如果框架的抽象成为了系统负担,建议跳出框架,直接采用底层的向量数据库 SDK(如 Qdrant/Milvus)并在上层实现轻量级编排 [9]。
博客摘要 + 核心看点 点击展开
RAG框架对比:LangChain vs LlamaIndex vs Haystack — summary
SEO 友好博客摘要
RAG(检索增强生成)已成为大模型应用的标准范式,但开发者往往面临框架选型的难题 [1]。本文深度对比了 LangChain、LlamaIndex 与 Haystack 三大主流框架,全面剖析了它们在架构设计、数据分块(Chunking)、检索策略、评估体系及生产就绪度五大核心维度的差异 [1-4]。无论您是准备构建通用大模型 Agent、开发纯 RAG 系统,还是部署企业级搜索应用,本文详实的选型决策树与框架混合使用策略,都将助您快速锁定最适合业务场景的技术方案,大幅降低试错成本 [5, 6]。
3 条核心看点
- 框架定位各异:LangChain 主攻大模型编排,LlamaIndex 深耕数据检索,Haystack 专注搜索工程 [1, 5]。
- 检索与数据:LlamaIndex 具超150种连接器及合并检索优势,Haystack 则原生强于BM25 [7, 8]。
- 最佳生产实践:生产环境推荐混合策略,如用 LlamaIndex 处理数据,结合 LangChain 编排工作流 [5]。
60 秒短视频脚本 点击展开
RAG框架对比:LangChain vs LlamaIndex vs Haystack — video
这是一段为您定制的 60 秒短视频脚本,严格按照字数要求并基于提供的文档内容编写:
【钩子开场】
RAG三大框架到底怎么选?[1]
【核心解说】
- LangChain主打通用编排,生态系统最大,是做Agent和快速验证的首选。[1, 2]
- LlamaIndex专注数据连接与检索,策略极丰富,是构建纯RAG系统的最佳选择。[1, 2]
- Haystack以搜索工程为根基,原生BM25极强,最适合做企业级搜索和稳健扩展。[1, 2]
【一句收束】
框架只是手段不是目的,实战中不必拘泥,按需混合使用效果更好![2, 3]
课后巩固
与本文内容匹配的闪卡与测验,帮助巩固所学知识
延伸阅读
根据本文主题,为你推荐相关的学习资料