大型语言模型(LLM)是当今时代最重要的新兴人工智能技术之一。早在 2022 年 11 月,OpenAI 就发布了自己的生成式人工智能聊天机器人,引起了人们对这种前沿技术应用的热议和兴奋。看到 ChatGPT 的神奇之处后不久,企业、开发者和个人都希望拥有自己的定制版 ChatGPT。这导致了对促进开发、集成和管理 Gen AI 模型的工具/框架的需求激增。
面对这样的市场缺口,有两个著名的框架处于领先地位: LlamaIndex 和 LangChain。不过,这两个框架的目标都是帮助开发人员创建自己的定制 LLM 应用程序。这两个框架各有优缺点。本篇博文旨在揭示 LlamaIndex 和 LangChain 之间的主要区别,帮助你根据具体使用情况选择合适的框架。
LlamaIndex 简介
它能通过各种来源连接数据,如结构化数据(如关系数据库)、非结构化数据(如 NoSQL 数据库)和半结构化数据(如 LlamaIndex 是一个框架,旨在根据你自己的自定义数据对 LLM 进行索引Salesforce CRM 数据)。
尽管你的数据是专有的,但它可以被索引为最先进的大规模 LLM 可以理解的嵌入式数据,从而无需重新训练模型。
LlamaIndex 如何工作?
LlamaIndex 为下一级 LLM 定制提供了便利。它可以获取你的专有数据并将其嵌入到内存中,从而使模型在提供基于上下文的响应方面逐渐变得更好。LlamaIndex 可将大型语言模型转化为领域知识专家;它可以充当人工智能助理或对话聊天机器人,根据真实来源(例如,包含特定业务信息的 PDF 文档,只有销售副总裁才能回答)回答你的询问。
为了根据专有数据定制 LLM,LlamaIndex 使用了一种称为检索增强生成(RAG)的技术。RAG 主要包括两个关键阶段:
开始使用 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)
查询引擎将搜索数据索引,并返回相关片段作为回应。
我们还可以通过修改函数将这个查询引擎变成一个带内存的聊天引擎:
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 简介
LangChain 是另一个用于根据自定义数据源构建定制 LLM 的框架。LangChain 可以连接各种来源的数据,如关系数据库(如表格数据)、非关系数据库(如文档)、程序源(如 API),甚至是自定义知识库。
LangChain 利用一种形成链的机制,这种链只不过是向 LLMs 和其他集成工具发送的一长串请求,其中一个步骤的输出将被转发,成为下一个步骤的输入。
LangChain 可使用你的专有数据,并确保向 LLM 提供相关上下文,以生成适当的响应。无论是为公司数据定制的 QNA 聊天机器人,还是内部分析工具,或者是与数据源协同工作的人工智能助手。LangChain 内置了连锁机制,可帮助开发人员将其他工具集成到 LLM 应用程序中,并将它们连锁在一起,这有助于构建一个更全面的系统。
LangChain 如何工作?
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)
查询将对数据进行语义搜索,并检索出对查询的适当响应。
如果需要,可以使用 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:
Langchain 和 LlamaIndex 的组合使用案例:
LlamaIndex 与 LangChain: 选择正确的框架
在选择合适的框架之前,有几个重要问题需要注意:
结论
LlamaIndex 和 LangChain 对于想要构建基于 LLM 的自定义应用程序的开发人员来说,都是非常有用的框架。LlamaIndex 的独特之处在于其卓越的搜索和检索能力,可为用户提供精简的索引和查询解决方案。LangChain 的独特之处在于其模块化设计以及与 LLM 领域各种工具和组件的可集成性。