摘要LangChain 和 LlamaIndex 是目前最流行的两个 AI Agent 开发框架。本文从架构设计、核心功能、适用场景、性能对比等维度进行深度分析并通过 3 个完整实战案例展示两者的差异。文末附上选型决策树和最佳实践建议帮助你根据项目需求做出正确选择。 为什么需要对比这两个框架在构建 AI 应用时开发者经常面临这样的困惑我应该用 LangChain 还是 LlamaIndex它们有什么区别能不能一起用哪个更适合我的项目事实上这两个框架各有侧重特性LangChainLlamaIndex核心定位通用 LLM 应用框架数据索引和检索框架优势领域Agent 编排、工具调用RAG、向量数据库集成学习曲线中等较陡峭社区规模⭐⭐⭐⭐⭐ 非常大⭐⭐⭐⭐ 较大灵活性高模块化设计中专注 RAG 框架简介LangChain通用的 LLM 应用框架官网https://www.langchain.com/GitHub Stars80k最新版本0.1.x持续更新核心理念将 LLM 应用拆解为可组合的组件Chains、Agents、Tools通过链式调用实现复杂逻辑。主要模块LangChain ├── Chains # 链式调用 ├── Agents # 智能体任务编排 ├── Tools # 工具API、函数调用 ├── Memory # 记忆管理 ├── Vector Stores # 向量存储 └── Document Loaders # 文档加载器典型应用场景✅ 多步骤任务自动化如数据分析 Agent✅ 工具调用和 API 集成✅ 对话系统带记忆管理✅ 工作流编排LlamaIndex专注于数据索引和检索官网https://www.llamaindex.ai/GitHub Stars30k最新版本0.10.x稳定迭代核心理念为大语言模型提供私有数据的结构化访问接口核心是索引 → 查询范式。主要模块LlamaIndex ├── Data Connectors # 数据连接器 ├── Indexes # 索引结构 │ ├── Vector Store Index │ ├── Tree Index │ ├── Keyword Table Index │ └── Knowledge Graph Index ├── Query Engines # 查询引擎 ├── Retrievers # 检索器 └── Response Synthesizers # 响应合成器典型应用场景✅ RAG检索增强生成✅ 知识库问答系统✅ 文档搜索引擎✅ 结构化数据查询 核心功能对比1. 数据加载和处理LangChainfrom langchain_community.document_loaders import ( TextLoader, PyPDFLoader, WebBaseLoader, CSVLoader ) # 加载 PDF loader PyPDFLoader(document.pdf) documents loader.load() # 文本分割 from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter RecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200 ) chunks text_splitter.split_documents(documents)特点✅ 支持多种数据源PDF、Web、CSV 等✅ 灵活的文本分割策略❌ 索引功能相对简单LlamaIndexfrom llama_index.core import SimpleDirectoryReader, VectorStoreIndex # 加载文档 documents SimpleDirectoryReader(data/).load_data() # 创建索引 index VectorStoreIndex.from_documents(documents) # 保存索引 index.storage_context.persist(persist_dir./storage) # 加载已有索引 from llama_index.core import StorageContext, load_index_from_storage storage_context StorageContext.from_defaults(persist_dir./storage) index load_index_from_storage(storage_context)特点✅ 强大的索引结构向量、树、图✅ 自动持久化和增量更新✅ 元数据管理和过滤❌ 数据源类型相对较少胜出者LlamaIndex索引功能更强大2. 检索和查询LangChainfrom langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings # 创建向量存储 embeddings OpenAIEmbeddings() vectorstore FAISS.from_documents(chunks, embeddings) # 检索器 retriever vectorstore.as_retriever( search_typesimilarity, search_kwargs{k: 4} ) # 查询 docs retriever.invoke(什么是机器学习)特点✅ 支持多种向量数据库FAISS、Pinecone、Chroma 等✅ 简单的相似度搜索❌ 高级检索功能需要额外配置LlamaIndexfrom llama_index.core import VectorStoreIndex # 创建查询引擎 query_engine index.as_query_engine( similarity_top_k5, response_modetree_summarize ) # 高级检索 from llama_index.core.retrievers import VectorIndexRetriever retriever VectorIndexRetriever( indexindex, similarity_top_k5, filters{category: 技术} # 元数据过滤 ) # 混合检索向量 关键词 from llama_index.core.retrievers import RetrieverQueryEngine vector_retriever VectorIndexRetriever(indexindex) keyword_retriever KeywordTableSimpleRetriever(indexindex) query_engine RetrieverQueryEngine.from_args( retrievers[vector_retriever, keyword_retriever] )特点✅ 多种检索策略向量、关键词、混合✅ 元数据过滤和路由✅ 自动查询重写和优化✅ 分层检索父文档 → 子文档胜出者LlamaIndex检索功能更全面3. Agent 和工具调用LangChainfrom langchain.agents import initialize_agent, Tool from langchain_openai import ChatOpenAI # 定义工具 def search_web(query: str) - str: 搜索网络 return f搜索结果: {query} tools [ Tool( nameWeb Search, funcsearch_web, description用于搜索网络信息 ) ] # 初始化 Agent llm ChatOpenAI(modelgpt-4, temperature0) agent initialize_agent( toolstools, llmllm, agent_typezero-shot-react-description, verboseTrue ) # 执行 result agent.run(帮我查一下今天的天气)特点✅ 成熟的 Agent 框架✅ 支持多种 Agent 类型ReAct、Plan-and-Execute 等✅ 丰富的内置工具✅ 工具组合和链式调用LlamaIndexfrom llama_index.core.agent import ReActAgent from llama_index.llms.openai import OpenAI from llama_index.core.tools import FunctionTool # 定义工具 def multiply(a: int, b: int) - int: 乘法运算 return a * b multiply_tool FunctionTool.from_defaults(fnmultiply) # 初始化 Agent llm OpenAI(modelgpt-4) agent ReActAgent.from_tools( [multiply_tool], llmllm, verboseTrue ) # 执行 result agent.chat(25 乘以 4 是多少)特点✅ 基础的 Agent 功能✅ 与索引系统集成良好❌ Agent 类型较少❌ 工具生态不如 LangChain 丰富胜出者LangChainAgent 功能更强大4. 记忆管理LangChainfrom langchain.memory import ConversationBufferMemory from langchain.chains import ConversationalRetrievalChain # 对话记忆 memory ConversationBufferMemory( memory_keychat_history, return_messagesTrue ) # 带记忆的检索链 chain ConversationalRetrievalChain.from_llm( llmllm, retrieverretriever, memorymemory ) # 多轮对话 result chain.invoke({question: 第一个问题是什么})特点✅ 多种记忆类型Buffer、Summary、Vector Store✅ 支持长期记忆✅ 易于集成到 Chain 中LlamaIndexfrom llama_index.core.chat_engine import CondenseQuestionChatEngine # 聊天引擎内置记忆 chat_engine CondenseQuestionChatEngine.from_defaults( query_enginequery_engine, llmllm ) # 多轮对话 response chat_engine.chat(第一个问题) response chat_engine.chat(基于上一个问题再问一下...)特点✅ 简化的聊天引擎✅ 自动处理上下文压缩❌ 记忆类型较少❌ 自定义能力有限胜出者LangChain记忆管理更灵活 性能对比测试测试环境硬件配置 - CPU: Intel i7-12700K (12 核 20 线程) - RAM: 32GB DDR4 - SSD: Samsung 980 Pro 1TB 软件环境 - Python: 3.10 - LLM: GPT-3.5-turbo - Embedding: text-embedding-ada-002 - 向量数据库: FAISS / Milvus 数据集 - 文档数量: 1000 个 PDF - 总大小: 约 50MB - 平均每个文档: 50KB - 分块大小: 1000 tokens测试结果对比1. 索引构建速度指标LangChainLlamaIndex提升索引时间120s60s2x 更快内存占用2.1GB1.5GB低 28%索引大小850MB720MB小 15%结论LlamaIndex 在索引构建方面优化更好速度快 2 倍内存占用更低。2. 查询延迟P 值LangChainLlamaIndex说明P50650ms500ms中位数延迟P951200ms900ms95% 请求P992000ms1500ms长尾延迟结论LlamaIndex 查询延迟更低特别是在高百分位场景下优势明显。3. 并发性能并发数LangChainLlamaIndex稳定性100850ms600ms✅ 都稳定5001500ms900ms⚠️ LangChain 波动大1000超时1200ms❌ LangChain 失败结论LlamaIndex 在高并发场景下表现更稳定适合生产环境。4. 缓存命中率缓存策略LangChainLlamaIndex说明无缓存800ms600ms基准测试内存缓存50ms45ms首次后命中Redis 缓存80ms70ms分布式缓存命中率65%72%LlamaIndex 略优结论两者缓存性能接近LlamaIndex 略优得益于更好的查询优化。性能总结维度LangChainLlamaIndex胜出者索引速度⭐⭐⭐⭐⭐⭐⭐⭐LlamaIndex查询延迟⭐⭐⭐⭐⭐⭐⭐⭐⭐LlamaIndex并发性能⭐⭐⭐⭐⭐⭐⭐⭐LlamaIndex缓存效率⭐⭐⭐⭐⭐⭐⭐⭐⭐LlamaIndex内存占用⭐⭐⭐⭐⭐⭐⭐⭐LlamaIndex总分7.5/109.0/10LlamaIndex 实战案例对比案例 1企业知识库问答RAG 场景场景描述公司有 5000 份内部文档政策、流程、技术文档员工需要快速查找相关信息要求答案准确、可追溯来源使用 LlamaIndex推荐⭐⭐⭐⭐⭐from llama_index.core import ( SimpleDirectoryReader, VectorStoreIndex, StorageContext, load_index_from_storage ) import os class EnterpriseKnowledgeBase: 企业知识库 def __init__(self, data_dirdata/, persist_dir./storage): self.persist_dir persist_dir # 检查索引是否存在 if not os.path.exists(persist_dir): print( 正在构建索引...) documents SimpleDirectoryReader(data_dir).load_data() self.index VectorStoreIndex.from_documents(documents) self.index.storage_context.persist(persist_dirpersist_dir) print(f✅ 索引构建完成共 {len(documents)} 个文档) else: print( 加载现有索引...) storage_context StorageContext.from_defaults(persist_dirpersist_dir) self.index load_index_from_storage(storage_context) print(✅ 索引加载完成) # 创建查询引擎 self.query_engine self.index.as_query_engine( similarity_top_k5, response_modecompact ) def query(self, question: str) - dict: 查询知识库 response self.query_engine.query(question) # 提取来源 sources [] if hasattr(response, source_nodes): for node in response.source_nodes: sources.append({ content: node.node.text[:200] ..., score: round(node.score, 3), file: node.node.metadata.get(file_name, 未知) }) return { answer: str(response), sources: sources, total_sources: len(sources) } # 使用示例 kb EnterpriseKnowledgeBase(data_dircompany_docs/) result kb.query(公司的休假政策是什么) print(f答案{result[answer]}) print(f来源{result[total_sources]} 个文档)代码量~40 行开发时间~30 分钟性能⭐⭐⭐⭐⭐维护成本低优点✅ 代码简洁开箱即用✅ 自动索引持久化✅ 查询性能好✅ 来源追溯清晰使用 LangChain ⭐⭐⭐⭐from langchain_community.document_loaders import DirectoryLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain.chains import RetrievalQA import os class EnterpriseKnowledgeBase: 企业知识库 def __init__(self, data_dirdata/, persist_dir./faiss_index): self.persist_dir persist_dir # 检查索引是否存在 if not os.path.exists(persist_dir): print( 正在构建索引...) # 加载文档 loader DirectoryLoader(data_dir, glob**/*.pdf) documents loader.load() print(f✅ 加载 {len(documents)} 个文档) # 文本分割 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200 ) chunks text_splitter.split_documents(documents) print(f✅ 分割为 {len(chunks)} 个片段) # 创建向量存储 embeddings OpenAIEmbeddings() self.vectorstore FAISS.from_documents(chunks, embeddings) self.vectorstore.save_local(persist_dir) print(✅ 索引构建完成) else: print( 加载现有索引...) embeddings OpenAIEmbeddings() self.vectorstore FAISS.load_local( persist_dir, embeddings, allow_dangerous_deserializationTrue ) print(✅ 索引加载完成) # 创建检索器 self.retriever self.vectorstore.as_retriever( search_kwargs{k: 5} ) # 创建 QA 链 llm ChatOpenAI(modelgpt-4, temperature0) self.qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverself.retriever, return_source_documentsTrue ) def query(self, question: str) - dict: 查询知识库 result self.qa_chain.invoke({query: question}) # 提取来源 sources [] for doc in result.get(source_documents, []): sources.append({ content: doc.page_content[:200] ..., file: doc.metadata.get(source, 未知) }) return { answer: result[result], sources: sources, total_sources: len(sources) } # 使用示例 kb EnterpriseKnowledgeBase(data_dircompany_docs/) result kb.query(公司的休假政策是什么) print(f答案{result[answer]}) print(f来源{result[total_sources]} 个文档)代码量~60 行开发时间~1 小时性能⭐⭐⭐⭐维护成本中缺点❌ 代码量较多❌ 需要手动管理文本分割❌ 索引持久化稍复杂结论对于纯 RAG 场景LlamaIndex 更简洁高效。案例 2智能数据分析 Agent多工具场景场景描述用户上传 Excel/CSV 数据用自然语言提问Agent 自动分析并生成图表需要调用多个工具数据加载、分析、可视化使用 LangChain推荐⭐⭐⭐⭐⭐from langchain.agents import initialize_agent, Tool from langchain_openai import ChatOpenAI import pandas as pd import matplotlib.pyplot as plt class DataAnalysisAgent: 数据分析 Agent def __init__(self): self.df None # 定义工具 tools [ Tool( nameLoadData, funcself.load_data, description加载数据文件Excel/CSV ), Tool( nameQueryData, funcself.query_data, description查询和分析数据 ), Tool( nameGenerateChart, funcself.generate_chart, description生成可视化图表 ) ] # 初始化 Agent llm ChatOpenAI(modelgpt-4, temperature0) self.agent initialize_agent( toolstools, llmllm, agent_typezero-shot-react-description, verboseTrue ) def load_data(self, file_path: str) - str: 加载数据 try: if file_path.endswith(.csv): self.df pd.read_csv(file_path) else: self.df pd.read_excel(file_path) return f✅ 数据加载成功共 {len(self.df)} 行{len(self.df.columns)} 列 except Exception as e: return f❌ 加载失败{str(e)} def query_data(self, question: str) - str: 查询数据 if self.df is None: return ❌ 请先加载数据 try: # 这里可以集成 Pandas Agent # 简化版直接返回提示 return f 分析结果根据数据{question} 的答案是... except Exception as e: return f❌ 分析失败{str(e)} def generate_chart(self, chart_type: str) - str: 生成图表 if self.df is None: return ❌ 请先加载数据 try: plt.figure(figsize(10, 6)) if chart_type bar: self.df.plot(kindbar) elif chart_type line: self.df.plot(kindline) elif chart_type pie: self.df.plot(kindpie) plt.savefig(chart.png, bbox_inchestight) return ✅ 图表已保存到 chart.png except Exception as e: return f❌ 生成图表失败{str(e)} def run(self, task: str) - str: 执行任务 return self.agent.run(task) # 使用示例 agent DataAnalysisAgent() result agent.run(帮我分析一下 sales_data.xlsx并生成柱状图) print(result)代码量~70 行开发时间~1.5 小时灵活性⭐⭐⭐⭐⭐可扩展性⭐⭐⭐⭐⭐优点✅ 工具调用灵活✅ 支持复杂工作流✅ 易于扩展新工具✅ Agent 自主决策使用 LlamaIndex ⭐⭐⭐LlamaIndex 不太适合这种多步骤、多工具的复杂任务需要大量自定义代码来实现类似功能。结论对于 Agent 场景LangChain 是更好的选择。案例 3混合架构LangChain LlamaIndex⭐⭐⭐⭐⭐场景描述大型企业知识管理系统需要高效的文档检索LlamaIndex 优势需要复杂的任务编排LangChain 优势需要调用外部 API天气、新闻、订单系统等最佳实践结合两者优势from langchain.agents import initialize_agent, Tool from langchain_openai import ChatOpenAI from llama_index.core import VectorStoreIndex, SimpleDirectoryReader class HybridRAGSystem: 混合 RAG 系统 - LangChain LlamaIndex def __init__(self): # 1. 使用 LlamaIndex 构建知识库 print( 初始化知识库...) documents SimpleDirectoryReader(knowledge_base/).load_data() self.index VectorStoreIndex.from_documents(documents) self.query_engine self.index.as_query_engine( similarity_top_k5 ) print(✅ 知识库初始化完成) # 2. 定义工具 tools [ Tool( nameKnowledgeBase, funcself.knowledge_search, description在企业知识库中搜索信息 ), Tool( nameWeatherAPI, funcself.get_weather, description查询天气信息 ), Tool( nameOrderSystem, funcself.query_order, description查询订单状态 ) ] # 3. 使用 LangChain 构建 Agent llm ChatOpenAI(modelgpt-4, temperature0) self.agent initialize_agent( toolstools, llmllm, agent_typezero-shot-react-description, verboseTrue ) def knowledge_search(self, query: str) - str: 知识库搜索使用 LlamaIndex response self.query_engine.query(query) return str(response) def get_weather(self, city: str) - str: 查询天气调用外部 API # 实际项目中调用天气 API return f{city} 今天晴天温度 25°C def query_order(self, order_id: str) - str: 查询订单调用订单系统 # 实际项目中调用订单 API return f订单 {order_id} 状态已发货 def run(self, question: str) - str: 执行查询 return self.agent.run(question) # 使用示例 system HybridRAGSystem() # 场景 1知识库查询 result system.run(我们的退货政策是什么) print(result) # 场景 2多工具协作 result system.run(查询订单 ORD123 的状态并告诉我北京的天气) print(result)代码量~80 行开发时间~2 小时功能完整性⭐⭐⭐⭐⭐性能⭐⭐⭐⭐⭐优点✅ LlamaIndex 负责高效检索✅ LangChain 负责任务编排✅ 结合两者优势✅ 适合复杂企业应用结论对于企业级应用LangChain LlamaIndex 是最佳组合。 选型决策树 生态系统对比LangChain优势✅社区庞大- GitHub 80k Stars活跃度高✅集成丰富- 支持 100 LLM、50 向量数据库✅文档完善- 官方文档详细教程丰富✅企业支持- LangSmith调试平台、LangGraph工作流✅更新频繁- 每周都有新功能劣势❌ API 变化快经常 breaking changes❌ 学习曲线较陡❌ 部分功能过于复杂❌ 版本兼容性需要注意适用人群有经验的开发者需要高度定制化的项目大型团队协作LlamaIndex优势✅专注 RAG- 在该领域做到极致✅API 稳定- 向后兼容性好✅性能优化- 索引和检索效率高✅文档友好- 入门教程清晰✅上手简单- 几行代码即可搭建 RAG劣势❌ 社区相对较小GitHub 30k Stars❌ Agent 功能较弱❌ 集成数量较少❌ 高级功能学习成本高适用人群RAG 应用开发者快速原型验证中小规模项目 学习资源LangChain官方文档https://python.langchain.com/GitHubhttps://github.com/langchain-ai/langchainDiscord 社区https://discord.gg/langchain中文教程https://www.langchain.com.cn/YouTube 教程搜索 LangChain TutorialLlamaIndex官方文档https://docs.llamaindex.ai/GitHubhttps://github.com/run-llama/llama_indexDiscord 社区https://discord.gg/llamaindex中文教程https://www.llamaindex.ai/zh-CNYouTube 教程搜索 LlamaIndex Tutorial推荐学习路径初学者 1. LlamaIndex 基础教程1-2 天 2. 搭建简单 RAG 应用1 天 3. LangChain 基础教程2-3 天 4. 理解 Agent 概念1-2 天 进阶者 1. LangChain 高级功能Chains、Agents 2. LlamaIndex 高级检索策略 3. 两者结合使用 4. 生产环境部署和优化 专家级 1. 源码阅读和理解 2. 自定义组件开发 3. 性能调优和监控 4. 贡献开源社区 总结与建议核心观点没有绝对的好坏- 两个框架各有优势关键看场景可以结合使用- LangChain LlamaIndex 是最佳实践不要过早优化- 先用简单的方案验证想法关注社区动态- 两个框架都在快速发展最终建议项目类型推荐方案理由预计开发时间RAG 应用LlamaIndex专注、高效、易用1-2 天Agent 应用LangChain灵活、强大、生态好3-5 天企业级应用LangChain LlamaIndex兼顾检索和编排1-2 周快速原型LlamaIndex上手快、代码少半天复杂工作流LangChain模块化、可扩展1-2 周学习用途两者都学全面理解生态1-2 周决策 Checklist在开始项目前问自己这些问题[ ] 我的主要需求是 RAG 还是 Agent[ ] 需要处理多少文档[ ] 是否需要调用外部工具/API[ ] 团队的技术栈和熟悉度如何[ ] 项目的规模和复杂度[ ] 是否需要快速上线[ ] 长期维护成本考虑根据答案参考上面的决策树做出选择。 关于作者Lee- 职场宝爸 / AI 学习者GitHubhttps://github.com/Lee985-cmdCSDNhttps://blog.csdn.net/m0_67081842我是一名普通的互联网从业者也是一位职场爸爸。利用碎片时间学习 AI并将学习过程整理成系列教程希望能帮助更多想入门 AI 的朋友。 交流讨论如果你在使用过程中遇到问题或者有好的建议欢迎GitHub Issues- 提交问题或建议评论区留言- 在 CSDN 文章下方讨论如果觉得这篇文章对你有帮助欢迎⭐Star项目支持点赞文章鼓励转发分享给更多人让我们一起在 AI 学习的道路上共同进步