LangChain vs LlamaIndex:RAG应用开发框架选型
RAG(检索增强生成)已成为大模型应用落地最主流的架构模式。在构建RAG应用时,开发者最常面临的选择就是:LangChain 还是 LlamaIndex?这两个框架各有侧重,本文将从多个维度进行深度对比,帮助你做出明智的技术选型。
框架定位差异
LangChain:通用LLM应用编排框架
LangChain 的定位是一个通用的 LLM 应用开发框架,RAG 只是它支持的众多场景之一。它的核心抽象是"链"(Chain),将 Prompt、模型、工具、记忆等组件串联起来。
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
# 文档加载与切分
loader = PyPDFLoader("report.pdf")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(docs)
# 向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
# 构建 RAG 链
llm = ChatOpenAI(model="gpt-4", temperature=0)
prompt = ChatPromptTemplate.from_template("""
基于以下上下文回答问题。如果上下文中没有相关信息,请说明。
上下文:{context}
问题:{question}
""")
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
)
answer = rag_chain.invoke("公司的营收增长率是多少?")
print(answer.content)LlamaIndex:数据驱动的RAG专家
LlamaIndex 专注于数据连接和检索增强,其核心优势在于对文档的深度理解和丰富的索引结构。
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, ServiceContext
from llama_index.llms.openai import OpenAI
# 加载文档
documents = SimpleDirectoryReader("./data").load_data()
# 构建索引
llm = OpenAI(model="gpt-4", temperature=0)
index = VectorStoreIndex.from_documents(documents, llm=llm)
# 查询
query_engine = index.as_query_engine(similarity_top_k=5)
response = query_engine.query("总结这份文档的核心观点")
print(response)核心维度对比
1. 文档处理能力
| 能力 | LangChain | LlamaIndex |
|------|-----------|------------|
| 文档加载器数量 | 100+ | 80+ |
| 文本切分策略 | 基础(递归/字符/Token) | 高级(句子/段落/语义) |
| 元数据提取 | 手动 | 自动 |
| 文档层级结构 | 弱 | 强(节点关系树) |
LlamaIndex 的 SentenceSplitter 能够智能地按照语义边界切分文档,避免在句子中间截断:
from llama_index.core.node_parser import SentenceSplitter
parser = SentenceSplitter(
chunk_size=1024,
chunk_overlap=100,
paragraph_separator="
",
)
nodes = parser.get_nodes_from_documents(documents)2. 检索策略
这是两者差异最大的地方。LlamaIndex 提供了更丰富的检索策略:
from llama_index.core.retrievers import (
VectorIndexRetriever,
BM25Retriever,
)
from llama_index.core.query_engine import RetrieverQueryEngine
# 混合检索:向量 + 关键词
vector_retriever = VectorIndexRetriever(index, similarity_top_k=5)
bm25_retriever = BM25Retriever.from_defaults(docstore=index.docstore, similarity_top_k=5)
# 融合检索结果
from llama_index.core.retrievers import QueryFusionRetriever
fusion_retriever = QueryFusionRetriever(
[vector_retriever, bm25_retriever],
num_queries=3,
mode="reciprocal_rerank",
)
query_engine = RetrieverQueryEngine(fusion_retriever)LangChain 虽然也支持多种检索器,但实现混合检索需要更多手动组装工作。
3. Agent 与工具集成
# LangChain Agent 示例
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain.tools import Tool
tools = [
Tool(name="search", func=search_func, description="搜索网络信息"),
Tool(name="calculator", func=calc_func, description="数学计算"),
]
agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = executor.invoke({"input": "计算 2024年中国GDP增长率"})在 Agent 能力方面,LangChain 明显更强。它提供了丰富的工具集成、Agent 类型(ReAct、Tool Calling 等)和成熟的执行框架。
4. 高级 RAG 技术
LlamaIndex 在高级 RAG 技术方面投入了大量精力:
# LlamaIndex 句子窗口检索
from llama_index.core.postprocessor import SentenceTransformerRerank
from llama_index.core.query_engine import RetrieverQueryEngine
reranker = SentenceTransformerRerank(top_n=3, model="BAAI/bge-reranker-base")
query_engine = index.as_query_engine(
similarity_top_k=10,
node_postprocessors=[reranker],
)性能对比
在典型RAG场景下的实测表现:
| 指标 | LangChain | LlamaIndex |
|------|-----------|------------|
| 索引构建速度 | 较快 | 中等 |
| 查询延迟 | 中等 | 较快 |
| 内存占用 | 中等 | 较高 |
| 检索准确率 | 基础 | 优秀(高级模式) |
选型决策指南
选择 LangChain 的场景
选择 LlamaIndex 的场景
最佳实践:两者结合使用
实际上,两个框架并非互斥,许多团队选择结合使用:
# 使用 LlamaIndex 构建高质量索引
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
# 将 LlamaIndex 查询引擎封装为 LangChain Tool
from langchain.tools import Tool
rag_tool = Tool(
name="knowledge_base",
func=lambda q: str(query_engine.query(q)),
description="查询知识库获取相关信息",
)
# 在 LangChain Agent 中使用
agent_executor = AgentExecutor(agent=agent, tools=[rag_tool])总结
| 维度 | LangChain | LlamaIndex |
|------|-----------|------------|
| 定位 | 通用LLM编排 | 数据/RAG专家 |
| RAG深度 | 中等 | 优秀 |
| Agent能力 | 优秀 | 中等 |
| 学习曲线 | 较陡 | 适中 |
| 社区规模 | 更大 | 较大 |
| 文档质量 | 良好 | 优秀 |
技术选型没有银弹。如果你的项目以 RAG 为核心,追求检索质量,LlamaIndex 是更好的选择;如果你需要构建功能丰富的 AI 应用,包含 Agent、工具调用、记忆管理等,LangChain 的通用性更胜一筹。最重要的是根据实际需求做决策,而不是盲目追逐框架热度。
💬 评论区 (0)
暂无评论,快来抢沙发吧!