| 维度 | LangChain | LlamaIndex |
|---|---|---|
| 适用范围 | 通用:支持 RAG、Agent、聊天机器人等多种 LLM 应用 | 专一:主要聚焦 RAG 场景,其他 LLM 应用支持较弱 |
| 组件设计 | 高度模块化,组件间解耦(如 VectorStore、Chain 等接口可自由替换) | 组件更集成化,围绕“索引(Index)”设计(索引包含加载、分割、存储逻辑) |
| 检索能力 | 基础检索支持(向量检索、关键词检索),复杂策略需手动组合 | 内置高级检索策略(如递归检索、路由检索、混合检索),开箱即用 |
| 文档处理 | 提供丰富的加载器和分割器,但需手动串联流程 | 自动处理文档加载→分割→索引→存储全流程,支持复杂格式(表格、公式) |
| LLM 集成 | 支持几乎所有主流 LLM(OpenAI、Anthropic、开源模型等),接口统一 | 同样支持多 LLM,但更侧重与 OpenAI 等主流模型的深度适配 |
| 扩展性 | 极强:支持自定义组件(如自研检索器、工具) | 中等:扩展需遵循索引体系,自定义灵活度低于 LangChain |
| 学习曲线 | 较陡:组件多、概念多(Chain、Agent、Memory 等) | 较平缓:核心概念少(Index、QueryEngine 等),专注 RAG 场景 |
选 LangChain 当:
- 你的应用不止 RAG(如需要 Agent 工具调用、多轮对话记忆);
- 需深度定制 RAG 链路(如自定义检索算法、特殊数据处理流程);
- 依赖小众工具或开源模型,需要丰富的集成能力。
选 LlamaIndex 当:
- 专注 RAG 场景,追求快速实现且检索质量高;
- 处理复杂文档(如长论文、多格式报告);
- 团队希望降低开发成本,减少代码量。
在 RAG(检索增强生成)链路中,不同库承担着不同的核心角色,从数据处理、检索到生成形成完整闭环。以下是 RAG 中常用库的作用及典型场景:
1. LangChain:RAG 链路的“胶水框架”
核心定位:提供标准化接口和组件,快速拼接 RAG 各环节(数据加载、处理、检索、LLM 调用等),降低开发复杂度。
主要作用:
- 统一接口抽象:对文档加载器(
DocumentLoader)、分割器(TextSplitter)、向量存储(VectorStore)、LLM 模型等进行抽象,支持无缝切换不同工具(如从 OpenAI 切换到 Anthropic,从 Pinecone 切换到 Chroma)。 - 链(Chain)与代理(Agent):封装 RAG 核心逻辑为可复用的“链”(如
RetrievalQA链直接实现“检索+生成”),支持复杂流程编排(如多轮检索、动态调整 prompt)。 - 内存管理(Memory):维护对话历史,让 RAG 支持上下文感知的多轮交互(如用户追问时结合历史对话优化检索)。
典型场景:快速搭建基础 RAG 流程,例如:
python
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
# 加载文档 → 分割 → 向量存储 → 构建检索+生成链
<NolebasePageProperties />
loader = TextLoader("docs.txt")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=500)
split_docs = splitter.split_documents(docs)
db = Chroma.from_documents(split_docs, OpenAIEmbeddings())
qa_chain = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=db.as_retriever())
# 调用 RAG 链
result = qa_chain.run("文档中关于xxx的内容是什么?")2. LlamaIndex(原 GPT Index):专注 RAG 优化的“智能检索框架”
核心定位:更专注于检索增强场景,提供更深度的文档理解和检索策略优化。
主要作用:
- 文档结构化处理:支持将非结构化文档(PDF、网页等)转换为结构化索引(如
VectorStoreIndex、TreeIndex),甚至支持表格、图片等多模态数据的解析。 - 高级检索策略:除基础向量检索外,提供“关键词检索+向量检索”混合模式、递归检索(对复杂文档逐层深入查询)、路由检索(自动选择最相关的文档片段)等。
- LLM 增强索引:通过 LLM 生成文档摘要、关键词,辅助优化检索相关性(如
SummaryIndex先生成摘要再检索)。
典型场景:处理复杂文档(如长论文、多章节手册)时,提升检索精准度,例如:
python
from llama_index import VectorStoreIndex, SimpleDirectoryReader
# 加载文档并构建索引(内部自动完成分割、嵌入、存储)
documents = SimpleDirectoryReader("docs/").load_data()
index = VectorStoreIndex.from_documents(documents)
# 创建查询引擎,支持高级检索参数(如相似度阈值、返回文档数量)
query_engine = index.as_query_engine(similarity_top_k=3)
response = query_engine.query("文档中关于xxx的核心观点是什么?")3. OpenAI SDK / Anthropic SDK 等:LLM 调用的“原生接口”
核心定位:直接调用大语言模型(LLM)的官方工具,负责 RAG 链路的“生成”环节。
主要作用:
- 模型调用:封装 API 接口,支持调用 GPT-3.5/4(OpenAI)、Claude(Anthropic)等模型,传入 prompt 并获取生成结果。
- 流式输出:支持实时返回生成内容(如聊天场景的打字机效果)。
- 参数控制:设置温度(
temperature,控制随机性)、最大 tokens、停止词等,优化生成效果。
典型场景:在 RAG 中作为“生成器”,基于检索到的文档生成回答,例如:
python
import openai
# RAG 中检索到的文档片段
retrieved_docs = ["文档内容1...", "文档内容2..."]
prompt = f"基于以下文档回答问题:{retrieved_docs}\n问题:xxx"
# 调用 OpenAI API 生成回答
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0.3 # 降低随机性,更贴合文档
)
print(response.choices[0].message.content)4. 向量数据库:如 Pinecone、Chroma、Weaviate
核心定位:存储文档向量 embedding,提供高效的相似性检索能力,是 RAG 中“检索”环节的核心。
主要作用:
- 向量存储:将文档片段的 embedding(由嵌入模型生成的向量)存入数据库。
- 近似最近邻(ANN)检索:根据用户查询的 embedding,快速找到最相似的文档片段(无需全量比对,提升效率)。
- 元数据过滤:支持结合文档的元数据(如日期、类别)筛选检索结果(如只检索 2023 年后的文档)。
典型场景:作为 RAG 的“记忆库”,例如用 Chroma(轻量级本地向量库)存储文档:
python
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 文档片段的 embedding 生成与存储
embeddings = OpenAIEmbeddings()
db = Chroma.from_documents(split_docs, embeddings, persist_directory="./chroma_db")
db.persist()
# 检索:根据查询生成 embedding,找相似文档
query = "xxx"
similar_docs = db.similarity_search(query, k=3) # 返回 top3 相似文档5. 嵌入模型库:如 SentenceTransformers、OpenAI Embeddings
核心定位:将文本(用户查询、文档片段)转换为向量(embedding),是“检索”环节的前提(向量才能计算相似度)。
主要作用:
- 文本向量化:将非结构化文本映射到高维向量空间,使得语义相似的文本向量距离更近。
- 多语言支持:部分模型(如
all-MiniLM-L6-v2)支持多语言文本的向量化。
典型场景:生成文档和查询的 embedding,例如:
python
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2') # 轻量级开源模型
doc_embedding = model.encode("这是一段文档内容") # 文档向量
query_embedding = model.encode("用户的查询") # 查询向量6. 文档处理库:如 Unstructured、PyPDF2
核心定位:负责 RAG 链路的“数据输入”环节,将原始文档(PDF、Word、网页等)解析为可处理的文本。
主要作用:
- 格式解析:提取不同格式文档的文本内容(如 PyPDF2 解析 PDF,Unstructured 处理复杂格式)。
- 元数据提取:获取文档的标题、页码、作者等信息,辅助后续检索过滤。
典型场景:加载本地 PDF 文档到 RAG 流程:
python
from PyPDF2 import PdfReader
reader = PdfReader("document.pdf")
text = ""
for page in reader.pages:
text += page.extract_text() # 提取所有页文本总结:各库在 RAG 链路中的协作关系
- 文档加载与处理:用
Unstructured/PyPDF2解析原始文档 → 用LangChain/LlamaIndex的分割器切割为片段。 - 向量化与存储:用
SentenceTransformers/OpenAI Embeddings生成向量 → 存入Pinecone/Chroma向量库。 - 检索:用户查询经向量化后,通过向量库找到相似文档片段(
LangChain/LlamaIndex封装检索逻辑)。 - 生成:将检索到的文档与查询组合为 prompt → 调用
OpenAI SDK等工具让 LLM 生成最终回答。
这些库分工明确,通过 LangChain 或 LlamaIndex 等框架整合后,可快速搭建高效的 RAG 系统。