Type something to search...
LangChain 与 LlamaIndex:检索增强生成(RAG)的综合比较

LangChain 与 LlamaIndex:检索增强生成(RAG)的综合比较

介绍

Retrieval-Augmented Generation (RAG) 结合了信息检索与生成模型,使其成为一个强大的技术,适用于问答、摘要及其他自然语言处理任务。要实现 RAG,目前最流行的两个框架是 LangChainLlamaIndex。这两个框架旨在处理文档的摄取、拆分、索引以及将步骤链在一起,以实现无缝的 RAG 工作流程。但哪个框架更适合您的项目呢?

在本文中,我们将逐步介绍 RAG 的核心组件:加载器拆分器索引,并比较它们在 LangChainLlamaIndex 中的工作方式。每个步骤都包含代码示例,以提供实践理解。

1. LangChain 与 LlamaIndex 中的加载器

加载器 对于从各种来源(本地文件、API、数据库)加载文档至关重要。LangChain 和 LlamaIndex 都提供了用于常见文档类型的内置加载器。

LangChain中的加载器

LangChain有多种加载器,可以加载文本、PDF,甚至网页。

代码示例:在LangChain中加载文本文档

from langchain.document_loaders import TextLoader
## Load a text document
loader = TextLoader("sample.txt")
documents = loader.load()
print(documents[0].page_content)

LangChain加载器返回一个Document对象的列表,可以进一步处理。

LlamaIndex中的加载器

LlamaIndex(前身为GPT Index)在加载文档方面采用类似的方法,并支持额外的格式,如Pandas DataFrames。

代码示例:在LlamaIndex中加载文本文档

from llama_index import SimpleDirectoryReader
## Load a text document from a directory
loader = SimpleDirectoryReader('path/to/docs')
documents = loader.load_data()
print(documents[0].text)

在LlamaIndex中,加载器也返回一个Document对象的列表,但结构可能会根据加载器与LangChain略有不同。

2. LangChain 与 LlamaIndex 中的分割器

分割器帮助将大型文档拆分成更小的块,以确保它们符合 GPT 或 BERT 等模型的令牌限制。

LangChain中的分割器

LangChain的分割器称为TextSplitters,允许您自定义文本的分割方式——按字符、单词或句子进行分割。

代码示例:在LangChain中分割文本

from langchain.text_splitter import CharacterTextSplitter

## Define a character splitter
splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(documents)
print(chunks[0].page_content)

在这里,文档被分割成1000个字符的块,连续块之间有200个字符的重叠。

LlamaIndex中的分割器

LlamaIndex使用TokenTextSplitter根据令牌数量分割文档,确保分块符合模型的令牌限制。

代码示例:在LlamaIndex中分割文本

from llama_index import TokenTextSplitter

## Define a token splitter
splitter = TokenTextSplitter(chunk_size=1000)
chunks = splitter.split(documents)
print(chunks[0].text)

在LlamaIndex中,您可以指定每个分块包含多少个令牌,从而对分块大小进行细粒度控制。

3. LangChain与LlamaIndex中的索引

索引是RAG系统的核心。它允许基于用户查询快速有效地检索相关数据块。

在LangChain中的索引

LangChain的VectorStoreIndex用于从文档嵌入创建索引,使基于相似性搜索的检索成为可能。

代码示例:在LangChain中进行索引

from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings

## Create embeddings
embedding_model = OpenAIEmbeddings()

## Create FAISS index
index = FAISS.from_documents(chunks, embedding_model)

在这里,LangChain使用文档嵌入创建FAISS索引,以便快速进行相似性搜索。

LlamaIndex中的索引

LlamaIndex通过其GPTTreeIndex简化了索引,使用树状结构进行高效检索。

代码示例:在LlamaIndex中索引

from llama_index import GPTTreeIndex

## Create an index
index = GPTTreeIndex(documents)
query_engine = index.as_query_engine()

在LlamaIndex中,GPTTreeIndex创建了层次结构,允许复杂查询和高效检索。

4. LangChain 与 LlamaIndex 中的链

在 RAG 中指的是结合检索和生成的操作序列。LangChain 和 LlamaIndex 都允许您将组件串联起来,例如先进行检索,然后使用生成模型。

LangChain中的链

LangChain允许灵活的链,支持使用不同组件构建复杂的工作流,例如LLMChain将语言模型与其他任务结合。

代码示例:LangChain中的检索增强生成链

from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

## Combine FAISS index and OpenAI for RAG
llm = OpenAI()
qa_chain = RetrievalQA(llm=llm, retriever=index.as_retriever())
result = qa_chain.run("What is the content of the document?")
print(result)

LangChain的RetrievalQA将文档检索与语言生成相结合,创建了一个RAG工作流。

LlamaIndex中的链

LlamaIndex提供了一种类似的方法,其查询引擎结合了检索和语言模型生成。

代码示例:LlamaIndex中的检索增强生成链

response = query_engine.query("What is the content of the document?")
print(response)

LlamaIndex在query方法中抽象了许多复杂性,使得实现RAG变得更加简单,而无需像在LangChain中那样进行大量自定义。

何时选择 LangChain 或 LlamaIndex 进行检索增强生成 (RAG)

在选择 LangChain 和 LlamaIndex 进行检索增强生成 (RAG) 时,取决于项目的复杂性、所需的灵活性以及每个框架的特定功能。让我们分析一下何时应选择其中一个,并提供实际示例以帮助澄清每个框架的优势和局限性。

1. 控制与自定义

LangChain 提供了对 RAG 流水线中不同组件的更细粒度控制。它允许您通过将语言模型、检索机制和自定义逻辑等不同部分串联在一起来构建高度灵活的工作流。如果您的应用涉及各种类型的数据源(例如文本、API、PDF),并且需要处理不同的检索策略,LangChain 的灵活性将非常有用。

示例:想象一下,您正在构建一个多模态 RAG 系统,其中一些查询需要从 PDF 中获取信息,而其他查询则需要网络抓取和 API 访问。使用 LangChain,您可以串联多个加载器,为每种类型使用不同的检索器,并结合结果。

LangChain 中复杂工作流的代码示例:

from langchain.chains import SequentialChain
from langchain.llms import OpenAI
from langchain.document_loaders import WebPageLoader, TextLoader
from langchain.vectorstores import FAISS

## Step 1: Load data from multiple sources
pdf_loader = TextLoader("docs/sample.pdf")
web_loader = WebPageLoader(url="https://example.com")
documents = pdf_loader.load() + web_loader.load()

## Step 2: Create embeddings and index
embedding_model = OpenAIEmbeddings()
index = FAISS.from_documents(documents, embedding_model)

## Step 3: Build a chain that retrieves and generates responses
llm = OpenAI()
qa_chain = RetrievalQA(llm=llm, retriever=index.as_retriever())

## Run the chain
response = qa_chain.run("What are the key points in the PDF and website?")
print(response)

在这里,LangChain 能够无缝集成不同文档源,并将检索与生成串联在一起,非常适合这样的用例。

LlamaIndex 则更为简单,结构围绕较简单的工作流。它在处理较小范围时效率极高,例如基于文本的文档或层次文档结构。如果您的用例围绕文本密集型数据,或者您希望快速实现且设置最小,LlamaIndex 会简化该过程。

示例:对于仅需在结构化文档(例如法律文件、医疗报告)上执行 RAG 的项目,LlamaIndex 可以快速完成任务,配置最少。

LlamaIndex 中简单工作流的代码示例:

from llama_index import SimpleDirectoryReader, GPTTreeIndex

## Load documents from a directory
loader = SimpleDirectoryReader('docs/')
documents = loader.load_data()

## Build a tree index and query
index = GPTTreeIndex(documents)
query_engine = index.as_query_engine()

## Query the system
response = query_engine.query("Summarize the legal document.")
print(response)

这个示例展示了 LlamaIndex 处理层次文档结构的简易性,专注于快速设置,而无需对每个步骤进行广泛自定义。

2. 集成与生态系统支持

LangChain 在需要更广泛的集成支持时表现出色。它内置了多种向量数据库(FAISS、Pinecone、Chroma)、语言模型(OpenAI、GPT-4、Anthropic 的 Claude)和 API(Hugging Face、Cohere)的连接器。这使得 LangChain 在涉及复杂工作流程或集成不同类型的语言模型和检索系统的应用中非常灵活。

例如,如果您需要在 RAG 工作流中为不同任务在 OpenAI 的 GPT-4 和 Hugging Face 的 BERT 之间切换,LangChain 的多 LLM 和多检索器支持将是一个很大的优势。

代码示例:在 LangChain 中集成多个 LLM

from langchain.chains import SimpleSequentialChain
from langchain.llms import OpenAI, HuggingFaceHub

## Use GPT-4 and Hugging Face BERT sequentially
gpt_chain = LLMChain(llm=OpenAI(model="gpt-4"), prompt="What is AI?")
bert_chain = LLMChain(llm=HuggingFaceHub(model="bert-large-uncased"), prompt="Translate the response.")

## Chain them together
chain = SimpleSequentialChain(chains=[gpt_chain, bert_chain])
result = chain.run("What is the future of AI?")
print(result)

在这种情况下,LangChain 允许您在同一管道中轻松切换模型。

LlamaIndex 虽然功能强大,但缺乏 LangChain 的广泛集成功能。然而,如果您的需求集中在快速高效的文档摄取和查询(不需要多个检索模型或 API)上,LlamaIndex 提供了一种稳健、简化的方法。

3. 复杂查询与检索

LangChain 更适合于检索复杂且需要自定义逻辑的情况,例如根据数据类型路由查询、使用混合搜索(将关键词搜索与向量相似性结合)或集成后检索排名系统。LangChain 允许您使用其高级工具(如 MultiRetriever 和生成模型的自定义提示)定义更复杂的检索链。

示例:考虑一个场景,您想将基于关键词的法律文档检索与基于嵌入的科学论文检索相结合。LangChain 允许您根据文档类型将查询路由到适当的检索器。

代码示例:LangChain 中的自定义检索

from langchain.retrievers.multi_retriever import MultiRetriever
from langchain.retrievers import FAISSRetriever, KeywordRetriever

## Define keyword and embedding-based retrieval systems
keyword_retriever = KeywordRetriever(documents=legal_documents)
embedding_retriever = FAISSRetriever(index=scientific_index)

## Combine them in a MultiRetriever
retriever = MultiRetriever(retrievers={
    'legal': keyword_retriever,
    'science': embedding_retriever
})

## Query the retriever with a legal question
response = retriever.retrieve("What are the recent changes in contract law?")
print(response)

LlamaIndex 提供的查询处理能力较为有限,但对于简单任务,如在文档中查找相关部分或总结文本,已经足够。其基于树的索引对于具有清晰层次结构的文档效率很高。

示例:对于像导航复杂合同这样的用例,其中条款以层次方式组织,LlamaIndex 的 GPTTreeIndex 表现优异。

代码示例:LlamaIndex 中的基于树的检索

from llama_index import GPTTreeIndex

## Load and index legal contracts
documents = SimpleDirectoryReader('contracts/').load_data()
index = GPTTreeIndex(documents)

## Query specific clauses within a contract
response = index.query("What are the termination clauses?")
print(response)

LlamaIndex 的树形结构使您能够在大型结构化文档中进行有针对性的检索。

4. 生态系统与社区支持

LangChain 拥有一个更活跃且不断增长的社区,这得益于其广泛的应用场景、集成和先进的功能。如果您的项目依赖于最新的 NLP 创新,或者您需要支持系统的扩展(例如,在 AWS 等云基础设施上部署),LangChain 的生态系统更加成熟。

LlamaIndex 相对较新,但在涉及简单工作流程或层次数据结构的场景中正在获得关注。如果您正在寻找一个轻量级的文档检索解决方案,而不需要大规模基础设施,LlamaIndex 可能更具吸引力。

结论:LangChain 还是 LlamaIndex 用于 RAG?

总之,LangChain 和 LlamaIndex 都是构建 RAG 系统的优秀框架,但它们的理想使用场景有所不同。

  • 选择 LangChain 如果您需要:
  • 对工作流中每个组件的细粒度控制(例如,链接不同类型的检索器和 LLM)。
  • 多模态数据处理,您的文档来自不同的格式或来源(例如,文本、PDF、API)。
  • 高级检索策略(例如,结合关键词和嵌入的混合搜索、检索后排序)。
  • 与各种模型和存储系统的多重集成(例如,OpenAI、Hugging Face、Pinecone、FAISS)。
  • 如果您想构建具有自定义行为的复杂管道,LangChain 是更 强大和灵活 的选择。它旨在用于检索策略和生成模型行为需要深度定制的场景。
  • 选择 LlamaIndex 如果您需要:
  • 一个 简单且轻量级 的解决方案,以便快速实现 RAG,您的主要目标是文档检索和摘要。
  • 一个 基于树的索引系统,适用于合同或法律报告等层次文档。
  • 最小的设置和配置,使您能够快速构建一个功能齐全的 RAG 系统,而无需广泛的定制。
  • 当您处理简单的基于文档的任务且不需要与 LangChain 相同级别的灵活性时,LlamaIndex 是更 精简和高效 的选择。

最终,选择 LangChain 还是 LlamaIndex 取决于您项目的复杂性。如果您正在构建一个复杂的多源系统并具有高级检索需求,LangChain 是您的首选。对于具有层次结构的快速且简单的基于文档的 RAG 系统,LlamaIndex 提供了简单性和性能的良好平衡。

Related Posts

使用 ChatGPT 搜索网络功能的 10 种创意方法

使用 ChatGPT 搜索网络功能的 10 种创意方法

例如,提示和输出 你知道可以使用 ChatGPT 的“搜索网络”功能来完成许多任务,而不仅仅是基本的网络搜索吗? 对于那些不知道的人,ChatGPT 新的“搜索网络”功能提供实时信息。 截至撰写此帖时,该功能仅对使用 ChatGPT 4o 和 4o-mini 的付费会员开放。 ![](https://images.weserv.nl/?url=https://cdn-im

阅读更多
在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和科技这样一个动态的行业中,保持领先意味着不断提升你的技能。无论你是希望深入了解人工智能模型性能、掌握数据分析,还是希望通过人工智能转变传统领域如法律,这些课程都是你成功的捷径。以下是一个精心策划的高价值课程列表,可以助力你的职业发展,并让你始终处于创新的前沿。 1. 生成性人工智能简介课程: [生成性人工智能简介](https://genai.works

阅读更多
10 个强大的 Perplexity AI 提示,让您的营销任务自动化

10 个强大的 Perplexity AI 提示,让您的营销任务自动化

在当今快速变化的数字世界中,营销人员总是在寻找更智能的方法来简化他们的工作。想象一下,有一个个人助理可以为您创建受众档案,建议营销策略,甚至为您撰写广告文案。这听起来像是一个梦想? 多亏了像 Perplexity 这样的 AI 工具,这个梦想现在成为现实。通过正确的提示,您可以将 AI 转变为您的 个人营销助理。在本文中,我将分享 10 个强大的提示,帮助您自动

阅读更多
10+ 面向 UI/UX 设计师的顶级 ChatGPT 提示

10+ 面向 UI/UX 设计师的顶级 ChatGPT 提示

人工智能技术,如机器学习、自然语言处理和数据分析,正在重新定义传统设计方法。从自动化重复任务到实现个性化用户体验,人工智能使设计师能够更加专注于战略思维和创造力。随着这一趋势的不断增长,UI/UX 设计师越来越多地采用 AI 驱动的工具来促进他们的工作。利用人工智能不仅能提供基于数据的洞察,还为满足多样化用户需求的创新设计解决方案开辟了机会。 1. 用户角色开发 目的

阅读更多
在几分钟内完成数月工作的 100 种人工智能工具

在几分钟内完成数月工作的 100 种人工智能工具

人工智能(AI)的快速发展改变了企业的运作方式,使人们能够在短短几分钟内完成曾经需要几周或几个月的任务。从内容创作到网站设计,AI工具帮助专业人士节省时间,提高生产力,专注于创造力。以下是按功能分类的100个AI工具的全面列表,以及它们在现实世界中的使用实例。 1. 研究工具 研究可能耗时,但人工智能工具使查找、分析和组织数据变得更加容易。**ChatGPT, Cop

阅读更多
你从未知道的 17 个令人惊叹的 GitHub 仓库

你从未知道的 17 个令人惊叹的 GitHub 仓库

Github 隐藏的宝石!! 立即收藏的代码库 学习编程相对简单,但掌握编写更好代码的艺术要困难得多。GitHub 是开发者的宝藏,那里“金子”是其他人分享的精心编写的代码。通过探索 GitHub,您可以发现如何编写更清晰的代码,理解高质量代码的样子,并学习成为更熟练开发者的基本步骤。 1. notwaldorf/emoji-translate *谁需

阅读更多