LlamaIndex VS LangChain,全方位比较这两个框架
大语言模型(LLMs)是当今时代最顶尖的AI技术之一。早在2022年11月,OpenAI发布了自己的生成式AI聊天机器人,这在当时引起了极大的轰动,大家纷纷讨论这种尖端技术的应用。在见识到ChatGPT的奇迹之后,企业、开发者和个人都想要拥有自己的定制版ChatGPT。这导致了对开发、集成和管理生成式AI模型的工具/框架需求激增。
由于市场上存在这样的缺口,有两个突出的框架正引领潮流:LlamaIndex和LangChain。然而,这两个框架的目标都是帮助开发者创建自己的定制大语言模型(LLM)应用程序。每个框架都有其自身的优点和缺点。本文的目的是揭示LlamaIndex和LangChain之间的关键区别,以帮助你为你的具体使用场景选择合适的框架。
LlamaIndex简介
LlamaIndex 是一个框架,旨在基于自定义数据对大语言模型(LLMs)进行索引和查询。它能够通过多种数据源连接数据,如结构化数据(例如关系数据库)、非结构化数据(例如NoSQL数据库)和半结构化数据(例如Elasticsearch数据库)。
虽然你的数据是专有的,但可以将其索引为嵌入向量,这些向量在大规模上对最先进的LLMs而言是可以理解的,从而消除了重新训练模型的需求。
LlamaIndex 工作原理
LlamaIndex 促进了LLMs的下一级定制化。它将你的专有数据嵌入到内存中,使模型在给出基于上下文的响应时逐渐变得更好。LlamaIndex 将大语言模型转变为领域知识专家;它可以作为AI助手或对话机器人,基于一个真实来源(例如包含业务特定信息的PDF文档)回答你的查询。
为了基于专有数据定制LLMs,LlamaIndex 使用了一种称为检索增强生成(RAG)的技术。RAG主要包括两个关键阶段:
- 索引阶段:专有数据被有效地转换为向量索引。在索引阶段,数据被转换为具有语义意义的向量嵌入或数值表示。
- 查询阶段:在这个阶段,每当系统被查询时,语义相似度最高的查询将以信息块的形式返回。这些信息块与原始查询提示一起被发送到LLM以获得最终响应。借助这种机制,RAG可以生成高度准确且相关的输出,而这些输出是LLMs的基础知识无法实现的。
LlamaIndex 入门
首先,开始安装 llama-index:
pip install llama-index
设置openai的密钥:
import os
os.environ["OPENAI_API_KEY"] = "your_api_key_here"
请查看 LlamaIndex 文档学习更多的示例、指南和用例。更高阶的使用请查看 Llama Hub。
使用 LlamaIndex 构建问答应用程序
为了展示 LlamaIndex 的功能,我将通过代码演练来开发一个基于自定义文档回答查询的问答应用程序。
首先,我们需要安装所有必要的依赖项:
pip install llama-index openai nltk
加载文档并构建索引
接下来,使用 LlamaIndex 的 SimpleDirectoryReader
函数加载你的文档并开始构建索引:
from llama_index.core import (
VectorStoreIndex,
SimpleDirectoryReader
)
# Define the path inside SDR function and then build an index
documents = SimpleDirectoryReader("docs").load_data()
index = VectorStoreIndex.from_documents(documents,show_progress=True)
在 “docs” 文件夹中,上传了一个包含 Python 课程资格详情的 PDF 文件。
查询索引并检查响应:
# Query engine
query_engine = index.as_query_engine()
response = query_engine.query("什么是大模型?")
print(response)
查询索引并检查响应
使用查询引擎搜索数据索引,并返回相关的片段作为响应:
我们还可以通过修改函数,将这个查询引擎变成一个带内存的聊天引擎:
chat_engine = index.as_chat_engine()
response = chat_engine.chat("解释下大模型的使用场景")
print(response)
follow_up = chat_engine.chat("它目前有什么典型的应用?")
print(follow_up)
为了避免每次都重建索引,您可以将其持久化到磁盘:
index.storage_context.persist()
稍后再加载:
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)
langchain 简介
LangChain 是另一个用于基于自定义数据源构建定制大型语言模型(LLMs)的框架。LangChain 可以连接来自各种来源的数据,如关系数据库(如表格数据)、非关系数据库(如文档)、程序化来源(如API)甚至自定义知识库。
LangChain 利用一个链机制,这种机制实际上是一长串的请求序列,这些请求被发送到LLMs以及其他集成的工具中,其中一个步骤的输出被前推,成为下一个步骤的输入
LangChain 使用你的专有数据,确保从中提供相关的上下文给LLMs,以生成适当的响应。无论是公司数据的定制问答聊天机器人、内部分析工具,还是与数据源协作的AI助手,LangChain 内置的链机制帮助开发者将其他工具集成到LLM应用程序中,并将它们链接在一起,从而构建一个更全面的系统。
langchain工作原理
LangChain有以下相关组件:
1. 模型(Model)
LangChain 支持多种语言模型,包括 OpenAI 的 GPT 系列和其他开源模型。模型组件负责处理文本生成、补全、翻译等任务。
2. 提示(Prompt)
提示组件用于管理和优化发送给语言模型的提示词(prompts)。它可以帮助设计和测试不同的提示词模板,以获得最佳的模型响应。
3. 记忆(Memory)
记忆组件允许应用程序保存对话历史或上下文,以便在后续交互中使用。这对于需要保持上下文连续性的对话应用程序非常重要。
4. 链(Chain)
链组件是一种将多个步骤链接在一起的机制,每个步骤可以是模型调用、数据处理、API 请求等。链帮助简化复杂的工作流程,使其更易于管理和调试。
5. 工具(Tools)
工具组件提供了多种实用工具和函数,这些工具可以与语言模型结合使用。例如,文本预处理、数据清洗、结果后处理等。
6. 代理(Agent)
代理组件允许开发者创建更智能的系统,这些系统可以自主决定调用哪些模型或工具来完成任务。代理通常用于构建具有一定自治能力的应用,如虚拟助手。
7. 数据管理(Data Management)
数据管理组件用于处理和存储与语言模型交互的输入输出数据。它支持多种数据格式和存储解决方案,帮助开发者有效管理数据。
8. 评估(Evaluation)
评估组件提供了一些工具,用于衡量和优化语言模型的性能。开发者可以使用这些工具来测试不同模型和提示词的效果,从而选择最佳方案。
Langchain入门
安装 LangChain
依赖:
pip install langchain
在本 LangChain 教程中,我会使用 cohere API 。
import os
os.environ["cohere_apikey"] = "your_api_key_here"
参考Langchain文档学习更多demo和指南。更多高级玩法请参考Langchain Hub。
使用LangChain构建问答应用程序
为了展示 LangChain 的功能,我将通过代码演练来开发一个基于自定义文档回答查询的问答应用程序。
第一步是安装所有依赖项:
pip install langchain cohere chromadb
接下来为文档数据加载并创建索引。我们还将使用相干嵌入生成嵌入:
from langchain.document_loaders import OnlinePDFLoader
from langchain.vectorstores import Chroma
from langchain.embeddings import CohereEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = OnlinePDFLoader(document)
documents = loader.load()
# Initialzing Text Splitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunksize,chunk_overlap=10,
separators=[" ", ",", "\\n"])
# Intializing Cohere Embdedding
embeddings = CohereEmbeddings(model="large", cohere_api_key=st.secrets["cohere_apikey"])
texts = text_splitter.split_documents(documents)
global db
db = Chroma.from_documents(texts, embeddings)
retriever = db.as_retriever()
global qa
查询索引并检查响应:
query = "什么是大模型?"
result = db.query(query)
print(result)
查询将在语义上搜索数据并检索对查询的适当响应。你可以使用 langchain 的 RetrievalQA
模块,这里我也将使用 cohere 的 LLM:
from langchain.llms import Cohere
from langchain.chains import RetrievalQA
qa = RetrievalQA.from_chain_type(
llm=Cohere(
model="command-xlarge-nightly",
temperature=temp_r,
cohere_api_key=st.secrets["cohere_apikey"],
),
chain_type="stuff",
retriever=retriever,
return_source_documents=True,
chain_type_kwargs=chain_type_kwargs,
)
LlamaIndex 与 LangChain 的最佳用例
LlamaIndex:
- 构建具有特定知识库的基于查询和搜索的信息检索系统。
- 开发一个问答聊天机器人,它只能提供相关的信息块作为对用户查询的响应。
- 大型文档的摘要、文本补全、语言翻译等等
LangChain:
- 构建端到端会话聊天机器人和人工智能代理
- 将自定义工作流程集成到llm中
- 扩展 LLM 的数据连接选项(通过 API 和其他数据源)
Langchain 和 LlamaIndex 的组合用例:
- 构建专家人工智能代理:LangChain 可以集成多个数据源,LlamaIndex 可以通过相似语义搜索功能来策划、总结并生成更快的响应。
- 先进的研发工具:使用LangChain的链接来同步管理工具和工作流程,同时使用LlamaIndex有助于生成更具上下文相关性的LLM并获得最相关的回复。
LlamaIndex VS LangChain:怎么选择正确的框架
在选择正确的框架之前,有几个重要问题:
- 项目要求是什么?对于问答和检索应用程序,我们可以使用 LlamaIndex。但如果我们需要集成自定义工作流程的应用程序,那么LangChain是更好的选择。
- 它有多简单易用?LlamaIndex 提供了一个更简单的界面,而 LangChain 则需要对 NLP 概念和组件有更深入的了解。
- 您需要进行多少定制开发? LangChain的模块化设计可以轻松定制和工具集成,但是LlamaIndex更多的是基于搜索和检索的框架。
下面可以通过以下几个方面比较Langchain和LlamaIndex
- 功能特点:
- LlamaIndex:
- 数据加载:可以从150多个不同格式的数据源(如API、PDF、文档、SQL等)加载数据。
- 数据索引:可以将数据存储和索引在40多个向量、文档、图形或SQL数据库提供程序中。
- 查询:可以设计复杂的查询流程,支持检索、后处理和响应合成,可以构建提示链、RAG和代理。
- 评估:最近,LlamaIndex加入了评估模块,用于评估检索和响应质量。
- LangChain:
- 格式化:可以使用组件来格式化用户输入和LLM输出,使用提示模板和输出解析器。
- 数据处理:可以使用各种文档加载器、文本分割器、检索器和嵌入模型。
- 组件链式调用:使用LangChain表达式语言(LCEL),可以将所有这些组件链接在一起,构建上下文感知的应用程序。
- LlamaIndex:
- RAG应用构建:
- LlamaIndex:适用于无缝数据索引和快速检索,更适合用于生产就绪的RAG应用程序。
- LangChain:提供更多开箱即用的组件,更容易创建多样化的LLM架构。
- 提示工程:
- LlamaIndex:没有用于测试提示的沙盒环境,但提供了一些现成的提示模板,适用于基本测试。
- LangChain:提供简单的提示模板和新的LangSmith功能,可以用于测试和添加自定义模板到链式调用中,但目前还不支持比较多个提示版本。
- 应用评估:
- LlamaIndex:提供基于组件的评估方法,可以测试RAG管道的各个组件,如检索器、查询引擎和响应生成。
- LangChain:最近推出了LangSmith评估套件,可以对提示进行测试,支持数百个测试用例。可以使用现成的评估器或构建自定义评估器。
- 可定制性:
- LlamaIndex:支持重新排序结果和跨编码器等高级功能,但在一些基本功能上可能会比较困难。
- LangChain:允许轻松集成,并提供了RAG和其他LLM组件的开箱即用功能。但是,当您开始扩展RAG应用程序时,LangChain可能会变得非常复杂。
结论
LlamaIndex和LangChain都是非常有用的框架,适用于想要构建自定义LLM应用程序的开发者。LlamaIndex的独特优势在于其出色的搜索和检索功能,为用户提供了一个流畅的索引和查询解决方案。而LangChain的独特优势在于其模块化设计,可以与LLM领域的各种工具和组件无缝集成。
如果不知道怎么选,可以考虑这几个问题:项目需求是什么?使用起来有多简单方便?希望进行多少定制?
如果需要使用多种工具,那么LangChain会是更好的选择。它能够支持拥有多任务能力的AI驱动的智能代理。
但是,如果目标是构建一个智能的搜索和检索系统,那么LlamaIndex会是更好的选择。它的强大之处在于信息的索引和检索,因此使用LlamaIndex可以为LLM构建一个深度数据探索应用程序。
最后要记住,在现实世界中,这并不是一个非此即彼的情况。您可以实施一个架构中包含两个框架的系统,每个框架都发挥着自己独特的作用。