为LLM 选择合适的RAG框架:LlamaIndex或LangChain

2024年06月11日 由 alex 发表 65 0

大型语言模型(LLM)是当今时代最重要的新兴人工智能技术之一。早在 2022 年 11 月,OpenAI 就发布了自己的生成式人工智能聊天机器人,引起了人们对这种前沿技术应用的热议和兴奋。看到 ChatGPT 的神奇之处后不久,企业、开发者和个人都希望拥有自己的定制版 ChatGPT。这导致了对促进开发、集成和管理 Gen AI 模型的工具/框架的需求激增。


面对这样的市场缺口,有两个著名的框架处于领先地位: LlamaIndex 和 LangChain。不过,这两个框架的目标都是帮助开发人员创建自己的定制 LLM 应用程序。这两个框架各有优缺点。本篇博文旨在揭示 LlamaIndex 和 LangChain 之间的主要区别,帮助你根据具体使用情况选择合适的框架。


LlamaIndex 简介


13


它能通过各种来源连接数据,如结构化数据(如关系数据库)、非结构化数据(如 NoSQL 数据库)和半结构化数据(如 LlamaIndex 是一个框架,旨在根据你自己的自定义数据对 LLM 进行索引Salesforce CRM 数据)。


尽管你的数据是专有的,但它可以被索引为最先进的大规模 LLM 可以理解的嵌入式数据,从而无需重新训练模型。


LlamaIndex 如何工作?


14


LlamaIndex 为下一级 LLM 定制提供了便利。它可以获取你的专有数据并将其嵌入到内存中,从而使模型在提供基于上下文的响应方面逐渐变得更好。LlamaIndex 可将大型语言模型转化为领域知识专家;它可以充当人工智能助理或对话聊天机器人,根据真实来源(例如,包含特定业务信息的 PDF 文档,只有销售副总裁才能回答)回答你的询问。


为了根据专有数据定制 LLM,LlamaIndex 使用了一种称为检索增强生成(RAG)的技术。RAG 主要包括两个关键阶段:


  1. 索引阶段: 专有数据被有效地转换为矢量索引。在索引阶段,数据被转换成具有语义的向量嵌入或数字表示。
  2. 查询阶段:在这一阶段,每当系统被查询时,语义相似度最高的查询就会以信息块的形式返回。这些信息块与原始的提示性查询一起被发送到 LLM,以获得最终的响应。在这种机制的帮助下,RAG 可以用来生成高度准确和相关的输出,否则 LLM 的基础知识不可能做到这一点。


开始使用 LlamaIndex

首先,安装 llama-index:


pip install llama-index index 


使用 OpenAI 的 LLM 需要一个 OpenAI API 密钥。获得秘钥后,请在 .env 文件中这样设置:


import osos
os.environ["OPENAI_API_KEY"] = "your_api_key_here"


使用 LlamaIndex 构建 QnA 应用程序

为了现场演示 LlamaIndex 的功能,我将对开发 QnA 应用程序进行代码演练,该应用程序可以回答基于自定义文档的查询。


首先,让我们安装所有必要的依赖项:


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)


在 “文档 ”文件夹中,我上传了我的 Python 课程资格详细信息的 PDF 文件:


查询索引并检查响应:


# Query engine
query_engine = index.as_query_engine()
response = query_engine.query("If i miss my assignments and projects, 
what grade and percentage will i end up with?")
print(response)


15


查询引擎将搜索数据索引,并返回相关片段作为回应。


我们还可以通过修改函数将这个查询引擎变成一个带内存的聊天引擎:


chat_engine = index.as_chat_engine()
response = chat_engine.chat("If i miss my assignments and projects, "If i miss my assignments and projects, 
what grade and percentage will i end up with?")
print(response)
follow_up = chat_engine.chat("And if i only miss my projects, 
then what grade would i get?")
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)


上面显示的代码是 QnA 聊天机器人 Gradio 应用程序的一部分,部署在hugging face空间。源代码和数据集可在此处获取。


LangChain 简介


16


LangChain 是另一个用于根据自定义数据源构建定制 LLM 的框架。LangChain 可以连接各种来源的数据,如关系数据库(如表格数据)、非关系数据库(如文档)、程序源(如 API),甚至是自定义知识库。


LangChain 利用一种形成链的机制,这种链只不过是向 LLMs 和其他集成工具发送的一长串请求,其中一个步骤的输出将被转发,成为下一个步骤的输入。


LangChain 可使用你的专有数据,并确保向 LLM 提供相关上下文,以生成适当的响应。无论是为公司数据定制的 QNA 聊天机器人,还是内部分析工具,或者是与数据源协同工作的人工智能助手。LangChain 内置了连锁机制,可帮助开发人员将其他工具集成到 LLM 应用程序中,并将它们连锁在一起,这有助于构建一个更全面的系统。


LangChain 如何工作?


17


LangChain 包含以下相关组件:


  1. 提示是我们向模型发出的暗示,以获得所需的输出/响应。
  2. LangChain 为用户提供了一个可以即时更改语言模型的界面。此外,还提供了在它们之间进行切换的简便方法。Langchain 可与一些最新的 LLM 配合使用,如 GPT-4、Gemini 1.5 pro、Hugging Face LLM、Claude 3 等。
  3. LangChain 利用了嵌入、内存向量存储等索引技术。
  4. LangChain 可以轻松实现各种组件的连锁。
  5. LangChain 提供一系列人工智能代理,帮助用户为其分配任务和工具。


开始使用 LangChain

开始使用 LangChain 的第一步是安装 LangChain 软件包:


pip install langchain


在本LangChain教程中,我们将使用cohere API密钥。在 .env 文件中使用 API 密钥设置 cohere 环境变量:


import osos
os.environ["cohere_apikey"] = "your_api_key_here"


使用 LangChain 构建 QnA 应用程序

为了现场演示 Langchain 的功能,我将用代码演示如何开发一个 QnA 应用程序,它可以回答基于你自定义文档的查询。


第一步是安装所有依赖项:


pip install langchain cohere chromadb ## instead of openai's LLM we'll' go for cohere## instead of openai's LLM we'll' go for cohere


随后,我们将加载文档数据并创建索引。我们还将使用 cohere 嵌入生成嵌入:


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 = "Compare indian constitution's approach to secularism with "Compare indian constitution's approach to secularism with 
that of other countries?"
result = db.query(query)
print(result)


18


查询将对数据进行语义搜索,并检索出对查询的适当响应。


如果需要,可以使用 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:

  • 构建具有特定知识库的基于查询和搜索的信息检索系统。
  • 开发 QnA 聊天机器人,只提供相关的信息块作为对用户查询的回复。
  • 总结大型文档、文本补全、语言翻译等。


LangChain:

  • 构建端到端对话式聊天机器人和人工智能代理
  • 将自定义工作流集成到 LLM 中
  • 扩展 LLM 与 API 和其他数据源的数据连接选项。


Langchain 和 LlamaIndex 的组合使用案例:


19


  • 构建专家人工智能代理: 其中,LangChain 可以整合多种数据源,而 LlamaIndex 则可以对数据进行整理、汇总,并通过相似性语义搜索功能生成更快的响应。
  • 先进的研发工具: 使用 LangChain 的链式管理工具和同步工作流程,而使用 LlamaIndex 则有助于生成更具语境意识的 LLM,并获得最相关的响应。


LlamaIndex 与 LangChain: 选择正确的框架


20


在选择合适的框架之前,有几个重要问题需要注意:


  • 项目需求是什么?对于原始的索引、查询搜索和检索应用程序,我们可以选择 LlamaIndex。但如果是需要集成自定义工作流的应用,LangChain 则是更好的选择。
  • 使用起来有多简单方便?LlamaIndex 提供了更简单的界面,而 LangChain 则需要对 NLP 概念和组件有更深入的了解。
  • 你想要进行多少定制?LangChain 采用模块化设计,便于定制和工具集成,但 LlamaIndex 更像是一个基于搜索和检索的框架。


21


结论

LlamaIndex 和 LangChain 对于想要构建基于 LLM 的自定义应用程序的开发人员来说,都是非常有用的框架。LlamaIndex 的独特之处在于其卓越的搜索和检索能力,可为用户提供精简的索引和查询解决方案。LangChain 的独特之处在于其模块化设计以及与 LLM 领域各种工具和组件的可集成性。

文章来源:https://medium.com/generative-ai/choosing-the-right-rag-framework-for-your-llm-llamaindex-or-langchain-a89b9ffd7e41
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消