还在纠结用哪个框架?选错技术栈,你的RAG项目可能从第一天就埋下了“祖传代码”的雷!本文一次讲透三大主流框架的底裤,让你少踩坑、少加班、早下班。
文字目录
- 框架出身与人设:三大框架的出厂设置与底层基因
- 数据摄取与索引:谁能把脏活累活干得更漂亮?
- 查询编排与链式调用:复杂流程谁搭积木更顺手?
- 检索与生成精度:核心RAG的最后一公里谁更稳?
- 生态与可维护性:社区、文档、Debug,谁让你不秃头?
- 选型决策树:对号入座,找到你的真命框架
嗨,大家好呀,我是你的老朋友精通代码大仙。接下来我们一起学习 《大模型RAG生成式AI开发实战》7.[第1章 RAG基础概念] RAG技术栈选型指南:LlamaIndex、LangChain还是Haystack。
俗话说得好,框架选得好,下班下得早;框架选得烂,Debug到半夜。你是不是也这样——打开GitHub,看着LangChain那好几万的star,又瞅见LlamaIndex社区里热火朝天的讨论,再翻翻Haystack那专业得像论文的文档,心里直打鼓:这仨到底该翻谁的牌子?选错了,项目写到一半发现框架根本hold不住需求,重写吧,时间没了;硬着头皮写吧,代码越堆越像意大利面条。这种焦虑我太懂了。今天这篇,就是来给你指条的明路。
1 框架出身与人设:三大框架的出厂设置与底层基因
很多新手一上来就对比哪个性能好、哪个star多,这就好比你去相亲,不问对方是什么性格,只问对方工资多少。LlamaIndex、LangChain、Haystack,这三个框架的原生家庭完全不同。
LangChain诞生于2022年,创始人Harrison Chase的目标是解决怎么把大模型串起来的问题。它的核心抽象是Chain、Prompt、Agent、Memory。它本质上是一个LLM应用编排框架,RAG只是它支持的众多场景之一。
LlamaIndex诞生于2022年底,创始人Jerry Liu一开始就是冲着怎么让大模型读懂我的私有数据去的。它的核心抽象是Index、Node、Retriever、QueryEngine。它从一开始就是RAG原生框架。
Haystack的资历更老,诞生于2019年,由Deepset团队开发。它最初是为了解决传统搜索引擎(如ElasticSearch)如何结合深度学习模型的问题。Pipeline、Component、Document Store是它的核心。它的基因是企业级语义搜索。
新手最容易犯的错误,就是拿着锤子找钉子。我见过太多这样的案例了。你接了一个需求,做个公司内部知识库问答。你打开GitHub,发现LangChain的star最多,教程最多,于是直接开干。你开始写各种Loader、Splitter、Embedding、VectorStore、RetrievalQA。三天后,代码跑起来了,但你的代码里已经有几百行配置,而且你发现要改个检索策略,得翻好几个文件的Chain定义。Meanwhile,你的同事用LlamaIndex,可能五十行就搞定了。因为LlamaIndex把数据到索引到查询这个链路封成了原子能力。你本来不需要写那么多编排代码,但因为你选了LangChain,你就得为灵活性支付代码复杂度的代价。
反过来也成立。如果你要做的是一个多Agent协作系统,需要调用API、查数据库、读文档、然后让GPT-4和Claude分工协作。这时候你用LlamaIndex,你会发现它的Agent和Tool抽象虽然能用,但不如LangChain的LCEL表达起来那么丝滑。你又会陷入明明我想拼个复杂乐高,但手里的积木块接口对不上的窘境。
这就是选错舒适区的代价。不是框架不好,是你把它用在了不属于它的战场上。
我的建议是,在你写第一行pip install之前,先在纸上画三个圈。第一个圈,写我的核心痛点是数据。如果你的项目是各种格式的文档,想要快速构建索引、做高级检索、少写代码,那你应该先看LlamaIndex。它是数据增强取向。第二个圈,写我的核心痛点是流程。如果你的项目需要复杂的业务逻辑、多步骤判断、多模型切换、工具调用、条件路由,那你应该先看LangChain。它是流程编排取向。第三个圈,写我的核心痛点是搜索。如果你的项目更接近语义搜索,比如替代ElasticSearch做更聪明的搜索,需要BM25和向量的深度融合,那Haystack可能是你的菜。它是搜索流水线取向。
记住一句话:LlamaIndex是数据狂魔,LangChain是编排鬼才,Haystack是搜索老兵。认清楚框架的原生基因,你才能在正确的战场上用正确的兵器。
2 数据摄取与索引:谁能把脏活累活干得更漂亮?
RAG圈子里有一句黑话:Garbage in, garbage out。你喂给模型的是乱的、脏的、切得支离破碎的上下文,它吐出来的也只能是胡言乱语。很多新手把百分之八十的时间花在调Prompt和换模型上,但只有百分之二十的时间处理数据。这其实搞反了。
新手对数据摄取的认知,往往停留在把文档扔进去。我举个例子。你拿到一份五十页的产品手册,PDF格式。你直接用了某框架的PDFLoader,加载完直接切分,每个chunk一千字符,然后嵌入。这看起来没问题,对吧?
但实际跑起来,你会发现表格里的内容全乱了。第一行是表头,第二行被切到了下一个chunk,导致产品型号和价格永远对不上。页眉页脚的水印文字被当成了正文内容,检索时经常命中这些无意义文字。文档里的图片和流程图,要么被直接忽略,要么被OCR成了一堆乱码。代码块和正文混在一起,切分的时候把一段完整的代码切成了两段,导致检索出来的代码片段无法运行。
这就是脏活累活没处理好。更惨的是,LangChain虽然Loader生态最广,号称三百多种数据源,但它的Parser和Splitter是相对原子化的。你经常需要手动组装:Loader读进来,Document,TextSplitter切,VectorStore存。这个过程中,每一步的参数你都得自己调。比如用LangChain的CharacterTextSplitter,你需要指定chunk_size和chunk_overlap。这个overlap设多少?百分之十?百分之二十?没有经验的新手只能拍脑袋。拍错了,检索效果直接崩盘。
再看看三大框架的数据处理能力。LlamaIndex在数据摄取上下了大功夫。它的核心概念是Node。IngestionPipeline允许你把数据转换器串起来:Reader、NodeParser、MetadataExtractor、Embedding、VectorStore。而且它的NodeParser策略非常丰富。SentenceSplitter按句子边界切,保留语义完整性。TokenTextSplitter按token数切,对大模型上下文更友好。HierarchicalNodeParser是父子节点切分,检索时先找父节点定位,再找子节点精读,这是高级RAG的标配。MarkdownNodeParser针对Markdown文档按标题层级切分,保留结构。CodeSplitter针对代码文件按函数、类切分。如果你数据源复杂,特别是有很多非结构化文档,LlamaIndex的数据治理能力通常能让你少写很多代码。
Haystack的数据处理能力被低估了。Haystack的Document对象有清晰的content和meta字段。它的Converter层非常成熟,PDFToDocument、DOCXToDocument、TextFileToDocument,对PDF的表格、HTML标签的清洗能力很强。它的DocumentCleaner和DocumentSplitter是Pipeline中的标准组件,可视化程度高。如果你原本就是搜索团队的,习惯了ES那套文档预处理,Haystack会让你觉得很亲切。
LangChain的强项是接入,不是处理。它的BaseLoader生态确实无人能敌,从Notion到飞书到GitHub到数据库,都有Loader。但Load进来之后,怎么处理,LangChain提供的原子操作比较多,需要你自己组装。你可以用UnstructuredPDFLoader做更精细的PDF解析,但那不是LangChain原生,而是集成了Unstructured库。本质上,LangChain在这里更像一个胶水层。
所以如果你的数据是五花八门、格式复杂,LlamaIndex和Haystack的文档解析和结构化能力通常更省心。如果你的数据是来源广泛、但格式相对规整,LangChain的Loader生态能让你最快接进来。
别把数据当二等公民,选个能把脏活累活干漂亮的框架,RAG就成功了一半。
3 查询编排与链式调用:复杂流程谁搭积木更顺手?
最简单的RAG是直来直去的:用户问一个问题,去向量库找相关文档,塞进Prompt,大模型回答。但真实业务很少这么简单。你可能需要判断用户是在闲聊、问技术问题、还是查订单状态。如果是技术问题,是去查产品文档、技术白皮书、还是历史工单?检索回来的内容不够怎么办,是换关键词再搜,还是调用搜索引擎?最后生成答案时,需不需要让模型先列出引用来源?这些流程,就是查询编排。
新手写复杂RAG,很容易写出意大利面条代码。我见过一个小伙,他要做这么一个功能:用户提问后,系统先去本地知识库检索,如果置信度低于零点七,就去搜百度;如果百度也没找到,就回答不知道;如果找到了,就让大模型总结并给出引用。他用原生Python写,代码里嵌套了五层if-else,还套了两个try-except。每个分支都要手动组装Prompt、调API、解析结果。一周后,他自己都看不懂这堆代码了。后来他换成了某框架,发现框架的路由抽象和链式调用能帮他把这团面条捋直。但问题在于,不同框架的捋顺能力是不一样的。
LangChain在这块是目前的王者。它的LCEL真的非常香。你可以把LLM、Prompt、Retriever、Tool、甚至自定义函数,都统一成Runnable对象。然后用管道符号把它们串起来。举个例子:
chain=route|retriever|prompt|llm这看起来像Unix管道,非常直观。而且LangChain原生支持RouterRunnable、ParallelRunnable、Map-Reduce等模式。做复杂的Agent、多工具调用、条件分支,LangChain的表达力是最强的。
LlamaIndex的编排方式走的是高层抽象路线。它提供QueryEngine和Tool的概念。你可以把不同的索引封装成QueryEngine,然后用RouterQueryEngine做路由。它也有SubQuestionQueryEngine,把大问题拆成小问题,和MultiStepQueryEngine,多步推理。这些高级能力非常RAG场景化,开箱即用。但如果你想做一些非RAG的奇怪流程,比如先调Stripe API查账单,再查文档,再发邮件,LlamaIndex的抽象层可能不如LangChain那么灵活。新版LlamaIndex推出了Workflow,基于事件驱动的异步编排,这是个好方向,但生态还在快速演进中,部分API可能变动。
Haystack的编排是Pipeline-based。你定义好components,如Retriever、Reader、Ranker、PromptNode,然后用pipeline.connect把它们按DAG连起来。这种设计在搜索流程这个特定领域非常清晰、可观测。你可以在Pipeline里清晰地看到数据流。但Haystack的Pipeline更适合静态流程。如果你需要动态分支、条件循环、或者运行时决定走哪条路,Haystack写起来会比较费劲,你需要自定义Component。
所以我的建议是:如果你的RAG流程是检索到生成这种标准DAG,Haystack很清晰。如果你的RAG流程是复杂的条件分支、多Agent、多工具调用,LangChain目前最顺手。如果你主要是RAG场景,但想要一些开箱即用的高级策略,如子问题分解、多路召回,LlamaIndex的QueryEngine更贴心。
编排能力决定了你的RAG天花板,别让框架成为你的瓶颈。
4 检索与生成精度:核心RAG的最后一公里谁更稳?
很多新手把RAG简单理解为向量搜索加大模型生成。这其实只做了RAG的骨头,没有摸到灵魂。真正的RAG高手,都在死磕检索环节:怎么让检索器找得准、找得全、不找偏。
只用基础向量检索,你的RAG就是裸奔。假设你做了一个电商客服RAG。用户问:你们这款手机的续航怎么样?你的向量检索可能返回了三个chunk:第一个是手机A的外观设计介绍,提到了轻薄;第二个是手机B的电池容量说明,五千毫安时;第三个是手机A的价格信息。为什么?因为续航和电池、轻薄在向量空间里可能距离相近。但检索回来的内容,只有第二个是真正相关的,而且第二个还可能是手机B的信息,不是用户问的那款。更可怕的是,如果你不做重排序,直接把这三个chunk塞给大模型,模型可能会把手机B的电池和手机A混淆,给出一个错误答案。
这只是检索环节的一个坑。还有长文档的上下文分散问题,答案在第十页,但检索只回了第三页的内容。还有多义词问题,苹果是水果还是公司。还有最新信息问题,向量库里的文档已经过时了。
看看三大框架在检索精度上的家底。LlamaIndex在RAG高级策略上,堪称军火库。它几乎把学术界的高级RAG论文都实现了。自动合并检索,把文档切成父子节点,检索时先匹配子节点,返回时把父节点上下文带回来,解决上下文断裂。多路召回与重排序,原生支持VectorIndexRetriever加BM25Retriever混合,再经过CohereRerank或SentenceTransformerRerank精排,配置几行代码就能搞定。子问题生成,把复杂问题拆成多个子问题,分别检索,再汇总答案,适合多文档对比分析。假设性文档嵌入,让模型先根据问题生成一个假设答案,再用假设答案去检索,提升相关性。还有Metadata过滤与路由,通过元数据先缩小检索范围。在LlamaIndex里,这些不是第三方插件,而是原生API。这对新手极其友好,因为你不需要读论文、写算法,调个参数就能用上前沿技术。
LangChain在检索上的策略是组合式。它提供了MultiQueryRetriever,生成多个query去检索;ContextualCompressionRetriever,上下文压缩;EnsembleRetriever,多检索器融合。这些能力也很强,但你需要自己组装。比如要做重排序,你需要额外引入CohereRerank或自己写,LangChain本身只提供了接口和少量集成。它的优势在于灵活性,劣势在于需要你自己拼乐高。
Haystack的检索能力是其祖传手艺。它的Pipeline设计让检索环节的优化非常专业。原生支持BM25Retriever和EmbeddingRetriever的混合检索。SentenceTransformersRanker节点可以无缝接入Pipeline。支持QueryClassifier,查询分类,把问题路由到不同检索策略。对DocumentStore如ElasticSearch、OpenSearch、Weaviate的集成非常深,适合已有搜索基础设施的团队。如果你原本就是搞搜索引擎的,Haystack的检索粒度控制会让你感觉如臂使指。
LlamaIndex是RAG高级玩法的开箱即用版,Haystack是搜索精度的专业调音台,LangChain则给了你自己搭舞台的积木。
5 生态与可维护性:社区、文档、Debug,谁让你不秃头?
代码能跑通是demo,代码能维护才是项目。新手选框架,往往只关注功能有没有,但很少关注出了问题怎么办。RAG项目不是一锤子买卖,你要面对的是版本升级、线上bug、新同事接手、需求变更。这时候,框架的社区、文档、稳定性,就成了你的救命稻草或者催命符。
在生态荒漠里Debug,是程序员最孤独的时刻。我举一个真实的例子。小钱的团队去年用LangChain搭了一个RAG系统。当时LangChain零点一版本。半年后,LangChain升级到零点二版本,大量API被标记为legacy或deprecated。PromptTemplate的导入路径变了,RetrievalQA链被推荐改用create_retrieval_chain。小钱的团队花了整整两周做迁移,改了一百多个文件。更头疼的是,LangChain的抽象层级很多。你Debug的时候,一个调用链可能要跳七八层:User Question到Chain到Runnable到Prompt到LLM到OutputParser到Retriever。当你发现某个结果不对时,你很难在中间某一层打断点看数据流。这种黑盒感很折磨人。
当然,LangChain社区确实大,你遇到问题去StackOverflow搜,大概率有人问过。但问题在于,你搜到的答案可能是零点一版本的,而你用的是零点二版本。版本混乱是LangChain生态的一个痛点。
再说Haystack。Haystack的文档其实写得很好,很工程化。但国内用Haystack的人太少了。你去搜Haystack RAG报错,中文结果可能只有个位数。你遇到一个问题,可能得去GitHub Discussion里用英文提问。对于英语不好的同学,这种孤独感会直接劝退。
LlamaIndex的社区增长很快,RAG领域的文档是最全面的。但LlamaIndex也在快速迭代,从一个Index库扩展成Agent框架、Workflow引擎,API的广度在膨胀。新手有时候会被它庞大的概念体系搞得有点晕。
如果你是一个人做项目,或者团队很小,那LangChain的丰富生态能让你快速找到解决方案。但你得做好版本锁定和封装隔离。建议把LangChain的调用封装在自己的Adapter层里,不要让它扩散到每个业务文件。这样升级时,只需要改Adapter。
如果你团队里有搜索背景的老兵,Haystack的Pipeline可观测性会很强。每个Component的输入输出都是标准化的Document或Answer对象,Debug时你可以很容易地看到Pipeline中间产物。但你需要确保团队能接受英文文档加小众社区的现实。
如果你团队是RAG新手,想要一个概念清晰、文档友好的框架,LlamaIndex是最佳选择。它的核心概念,Index存数据,QueryEngine查数据,非常直观。而且LlamaIndex的文档里,RAG的案例是最丰富的,从基础到高级,手把手教学。
另外,还要考虑招人这个现实问题。如果你在中国招Python工程师,写LangChain和LlamaIndex的简历相对多,写Haystack的少。这也是隐形成本。
生态是护城河,也是绊脚石。选一个让你的团队现在能跑通、未来能维护的框架,比选一个功能最全的框架更重要。
6 选型决策树:对号入座,找到你的真命框架
说了这么多,直接给你一张导航地图,按图索骥不迷路。我知道,看完上面的对比,你可能还是会有点晕。我既要处理复杂PDF,又要做多Agent,还要保证搜索精度,到底该选谁?别慌,选型不是选美,是匹配度测试。
选择困难症的根源,是既要又要还要。很多新手做选型时,列出的需求是:要支持各种文档格式、要检索准确、要代码简单、要社区活跃、要方便扩展、要稳定不升级。这世上没有这样的完美框架。如果你抱着找完美框架的心态,你会在三个框架之间反复横跳,最后每个都只学了皮毛。
我画了一张决策图,帮你快速定位:
更具体的场景建议:
场景一,个人开发者、创业公司MVP、内部知识库。你的数据是PDF、Word、网页,想快速搭一个能用的问答系统。选LlamaIndex。它让你用最少的代码,获得最高的RAG数据质量。VectorStoreIndex.from_documents和as_query_engine这两行代码,能帮你撑过从零到一。
场景二,AI应用平台、多模型中间件、复杂Tool调用。你需要对接多个模型,GPT-4、Claude、本地模型,需要复杂的权限控制、多轮对话、工具调用、多Agent协作。选LangChain。LCEL的编排能力,加上它庞大的集成生态,是构建复杂LLM应用的瑞士军刀。
场景三,企业级语义搜索、传统搜索团队转型。你们原本有ElasticSearch团队,现在想上语义搜索。你们需要BM25加向量的混合检索,需要严格的检索精度控制,需要可观测的搜索Pipeline。选Haystack。它的设计哲学和搜索团队的工作流天然契合。
场景四,团队协作、长期维护。团队有三到五个后端工程师,RAG只是系统的一部分。建议LlamaIndex或LangChain,取决于RAG的复杂度。如果RAG只是简单检索,LlamaIndex概念少,维护成本低。如果RAG是核心业务且流程复杂,LangChain生态更不容易踩到无人区的坑。
场景五,什么都不确定,只想先跑起来。选LlamaIndex。它的学习曲线在入门阶段是最平缓的。你不需要理解复杂的Chain概念,先让数据跑通,看到效果,建立信心。
最后我还想多说一句:这三个框架并不是互斥的。很多生产环境是混合架构:用LlamaIndex做数据摄取和索引,用LangChain做上层Agent编排,用Haystack的检索思想做Pipeline优化。框架只是工具,理解RAG的每个环节才是你的真本事。
没有银弹,只有最趁手的兵器。认清你的第一性需求,选型就成功了一半。
写在最后
RAG选型不是一锤子买卖,而是技术债务的第一笔投资。LlamaIndex、LangChain、Haystack三足鼎立,各有所长。新手最怕的不是选错,而是在错误的路线上狂奔三个月。技术选型这件事,从来就没有标准答案。你今天选的框架,三个月后可能会换,这很正常。重要的是,通过选型这个过程,你真正理解了RAG的每个环节——数据怎么进、索引怎么建、查询怎么编排、结果怎么优化。这些能力,比你会用某个框架的API要值钱一百倍。
编程之路不易,但每一步成长都算数。保持好奇,持续迭代。你选的不仅是框架,更是你解决问题的方式。相信自己,你已经在变强的路上了。
关注私信备注:“资料代找获取”,全网计算机学习资料代找:例如:
《课程:2026 年多模态大模型实战训练营》
《课程:AI 大模型工程师系统课程 (22 章完整版 持续更新)》
《课程:AI 大模型系统实战课第四期 (2026 年开课 持续更新)》
《课程:2026 年 AGI 大模型系统课 23 期》
《课程:2026 年 AGI 大模型系统课 21 期》
《课程:AI 大模型实战课 8 期 (2026 年 2 月最新完结版)》
《课程:AI 大模型系统实战课三期》
《课程:AI 大模型系统课程 (2026 年 2 月开课 持续更新)》
《课程:AI 大模型全阶课程 (2025 年 12 月开课 2026 年 6 月结课)》
《课程:AI 大模型工程师全阶课程 (2025 年 10 月开课 2026 年 4 月结课)》
《课程:2026 年最新大模型 Agent 开发系统课 (持续更新)》
《课程:LLM 多模态视觉大模型系统课》
《课程:大模型 AI 应用开发企业级项目实战课 (2026 年 1 月开课)》
《课程:大模型智能体线上速成班 V2.0》
《课程:Java+AI 大模型智能应用开发全阶课》
《课程:Python+AI 大模型实战视频教程》
《书籍:软件工程 3.0: 大模型驱动的研发新范式.pdf》
《课程:人工智能大模型系统课 (2026 年 1 月底完结版)》
《课程:AI 大模型零基础到商业实战全栈课第五期》
《课程:Vue3.5+Electron + 大模型跨平台 AI 桌面聊天应用实战 (2025)》
《课程:AI 大模型实战训练营 从入门到实战轻松上手》
《课程:2026 年 AI 大模型 RAG 与 Agent 智能体项目实战开发课》
《课程:大模型训练营配套补充资料》