📌 Q19: What are the popular frameworks to implement a RAG system
P0 · rag
🏷 标签:rag, frameworks, langchain, llamaindex, haystack
1️⃣ 考察意图
面试官想看的不是“你背过几个框架名字”,而是:你是否理解 RAG 系统的核心模块(检索、生成、评估、存储)以及不同框架在工程取舍上的差异。这是典型的“生态熟悉度 + 选型能力”考察,刁钻点在于:候选人往往只提 LangChain,却说不清它和 LlamaIndex 在“文档索引 vs Agent 编排”上的本质区别。答好了能展示你对生产级 RAG 的落地经验,知道什么时候该用框架、什么时候该手写。
2️⃣ 标准答
RAG 系统的主流框架可以按“定位”分为三类:全栈编排框架、检索专用框架、评估与调试工具。下面逐一拆解。
全栈编排框架:LangChain vs Haystack
- LangChain:最流行,但也是最容易被滥用的框架。它提供 600+ 集成(LLM、向量库、文档加载器),核心抽象是
Chain和Agent。优点是快速原型,缺点是对生产级控制力弱——默认的RecursiveCharacterTextSplitter按 1000 字符切分,不加overlap会导致上下文断裂。实际坑:LangChain 的ConversationBufferMemory默认不限制 token,长对话会爆显存,必须手动设max_token_limit。工程取舍:用 LangChain 的LCEL(LangChain Expression Language)声明式管道,比手写invoke循环更易维护,但调试时堆栈深,不如 Haystack 的Pipeline直观。 - Haystack(deepset 出品):更偏向生产部署。它的
Pipeline是 DAG 结构,每个节点(Retriever、Reader、PreProcessor)可独立替换。优势:内置DocumentStore抽象,支持 Elasticsearch、Weaviate、Qdrant 等,且提供Haystack 2.0的ChatAgent支持多轮对话。取舍:Haystack 的社区比 LangChain 小,但 API 更稳定,适合需要长期维护的线上系统。
检索专用框架:LlamaIndex
- LlamaIndex:核心优势在“索引策略”。它提供 10+ 种索引类型(
VectorStoreIndex、SummaryIndex、KeywordTableIndex、TreeIndex),以及 RouterQueryEngine 自动路由到不同索引。实际坑:默认的SimpleDirectoryReader会递归加载所有文件,如果目录下有.git或node_modules,会拖慢加载速度,必须用exclude参数过滤。工程取舍:LlamaIndex 的SentenceWindowNodeParser比 LangChain 的RecursiveCharacterTextSplitter更智能——它按句子切分并保留窗口上下文,但代价是索引体积增大 30-50%。适合文档问答场景,不适合实时流式数据。
评估与调试工具:RAGAS 与 TruLens
- RAGAS:专门评估 RAG 质量的框架,提供
faithfulness(忠实度)、answer_relevancy(答案相关性)、context_precision(上下文精度)等指标。实际坑:默认用 GPT-4 做评估器,成本高且延迟大,生产环境应替换为LLama 3 70B或Mistral Large的本地部署版本。取舍:RAGAS 的指标是“参考性”而非“决定性”,不能替代人工标注,但能快速发现检索召回率低的问题。 - TruLens:提供
Feedback Function做端到端评估,支持groundedness(接地性)和context_relevance。优势:可集成到 LangChain 和 LlamaIndex 的 pipeline 中,但需要额外部署 TruLens 服务器。
向量数据库:Chroma vs Weaviate vs Qdrant
- Chroma:轻量级,适合原型。默认用
all-MiniLM-L6-v2做 embedding,但生产环境必须换BAAI/bge-large-en-v1.5或intfloat/e5-mistral-7b-instruct提升检索精度。坑:Chroma 的persist_directory默认在内存中,重启后丢失,必须显式调用persist()。 - Weaviate:支持混合搜索(BM25 + 向量),内置
multi2vec-clip做多模态 RAG。取舍:Weaviate 的部署复杂度高(需要 Kubernetes),但检索延迟比 Chroma 低 40%(【通用知识】)。 - Qdrant:纯 Rust 实现,延迟最低,支持
payload过滤和group by聚合,适合高并发场景。
选型建议
- 快速原型:LangChain + Chroma,用
ChatOpenAI和OpenAIEmbeddings最快。 - 生产级文档问答:Haystack + Weaviate,用
ElasticsearchRetriever做 BM25 兜底。 - 多模态 RAG:LlamaIndex + Weaviate,用
MultiModalRetriever处理图文混合文档。 - 评估优先:RAGAS + TruLens,在 CI/CD 中集成
pytest-ragas插件。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从三个层面回答:第一,主流框架按定位分三类——全栈编排(LangChain、Haystack)、检索专用(LlamaIndex)、评估工具(RAGAS、TruLens)。第二,选型要看场景:快速原型用 LangChain + Chroma,生产级文档问答用 Haystack + Weaviate,多模态用 LlamaIndex。第三,实际落地要注意坑:LangChain 的 memory 默认不限制 token,LlamaIndex 的索引体积大 30-50%,RAGAS 评估器成本高。总结一句:没有万能框架,要根据检索精度、部署成本和团队维护能力做取舍。”
4️⃣ 高频追问 & 应对
追问 1:你提到 LangChain 和 LlamaIndex 的区别,那在同一个 RAG 任务(比如 100 页 PDF 问答)中,你会怎么选?
我会先看需求:如果只需要“检索 + 生成”的简单管道,选 LlamaIndex,因为它内置
SentenceWindowNodeParser和SummaryIndex,能自动处理长文档的上下文窗口,代码量比 LangChain 少 40%。但如果需要多步推理(比如先总结目录再检索章节),选 LangChain 的Agent配合Tool,因为 LlamaIndex 的RouterQueryEngine不支持动态工具调用。实际案例:在金融研报问答中,我用 LlamaIndex 的TreeIndex做分层索引,检索延迟从 2.3s 降到 0.8s(【通用知识】),但需要手动调chunk_size和overlap。
追问 2:你提到 RAGAS 的评估指标,那在实际项目中,你如何判断 RAG 系统是否“足够好”?
我会设三个阈值:
faithfulness> 0.85(防止幻觉)、context_precision> 0.7(确保检索相关)、answer_relevancy> 0.8(答案不跑题)。但注意,这些指标是“相对”的——如果业务场景是法律合同审查,faithfulness必须 > 0.95,而客服问答可以放宽到 0.8。实际坑:RAGAS 的context_precision依赖ground_truth标注,如果标注质量差(比如标注者只给了 1 个相关文档但实际有 3 个),指标会虚高。解法:用TruLens的groundedness做补充,它不依赖 ground truth,而是用 LLM 判断答案是否基于上下文。
追问 3:如果不用任何框架,手写 RAG 系统,你会怎么设计?
手写的好处是完全可控。我会用
FAISS做向量检索(IndexFlatIP+IVF加速),BM25(rank_bm25库)做关键词兜底,HuggingFace的pipeline做生成。核心模块:①chunking:用spaCy的sentencizer按句子切分,设chunk_size=512、overlap=128;②retrieval:用CohereRerank做重排序,top-k 从 10 降到 3;③generation:用vLLM部署Llama 3 8B,temperature=0.1保证确定性。取舍:手写需要 2-3 天搭建基础 pipeline,但后续调试成本低——比如发现检索召回率低,可以直接改embedding模型或加HyDE(假设文档嵌入)策略,而框架里改这些需要绕很多抽象层。
5️⃣ 避坑 · 常见错误答法
- ❌ “RAG 框架就是 LangChain,其他都不成熟。” → ✅ “LangChain 是生态最全的,但 Haystack 在生产部署上更稳定,LlamaIndex 在索引策略上更专业。选型要看场景,比如多模态 RAG 必须用 LlamaIndex + Weaviate。”
- ❌ “框架选型只看社区大小,LangChain 社区最大所以选它。” → ✅ “社区大意味着集成多,但也意味着 API 变动频繁(LangChain 0.1 到 0.2 的
Chain接口全改了)。生产环境更推荐 Haystack 或 LlamaIndex,API 更稳定。” - ❌ “RAGAS 的指标可以直接用于线上监控。” → ✅ “RAGAS 指标是离线评估用的,线上监控应该用
TruLens的Feedback Function做实时评估,或者用G-Eval做无参考评估。”
6️⃣ 简历呼应
- 如果你有 RAG 项目:从“实际选型决策”切入,比如“在金融研报问答项目中,我对比了 LangChain 和 LlamaIndex,最终选 LlamaIndex 的
TreeIndex因为检索延迟低 40%”。强调你踩过的坑(如chunk_size调参、overlap设置)。 - 如果你只做过传统 NLP:用“检索系统类比”切入,比如“RAG 框架本质是信息检索 + 生成,类似传统 NLP 的
Elasticsearch+Seq2Seq模型。LangChain 相当于spaCy的 pipeline 抽象,LlamaIndex 相当于Whoosh的索引策略”。展示迁移能力。 - 如果你是校招无项目:聚焦“论文复现 demo”,比如“我复现了
Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks论文,用 LangChain 的Chain和 Chroma 实现了一个文档问答 demo,并对比了BM25和DPR的检索效果”。展示动手能力和论文理解。 - 《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》(Lewis et al., 2020)—— RAG 原始论文
- 《LlamaIndex: A Data Framework for LLM Applications》(官方文档)—— 索引策略详解
- 《Haystack 2.0: Building Production-Ready Search Systems》(deepset 博客)—— 生产部署最佳实践
- 《RAGAS: Automated Evaluation of Retrieval Augmented Generation》(Shahul et al., 2023)—— 评估指标论文
- 《LangChain vs LlamaIndex: A Practical Comparison》(Towards Data Science 博客)—— 选型对比案例