隐藏的宝石——LlamaIndex生态系统简介

1,335 阅读24分钟

现在你已经对大型语言模型(LLM)有了扎实的了解,知道它们能做什么以及不能做什么。是时候发现LlamaIndex如何将你的交互式AI应用提升到一个新高度了。我们将探讨如何利用LlamaIndex进行检索增强生成(RAG),提供LLM广泛知识与专有数据之间的缺失环节。

在本章中,我们将涵盖以下主要主题:

  • 优化语言模型——微调、RAG和LlamaIndex的共生关系
  • 逐步揭示复杂性的优势
  • 介绍个性化智能辅导系统(PITS)——我们的LlamaIndex实践项目
  • 准备我们的编码环境
  • 熟悉LlamaIndex代码库的结构

技术要求

本章需要以下元素:

本书中展示的所有示例代码片段以及整个项目代码库均可在此GitHub仓库中找到:github.com/PacktPublis…

优化语言模型——微调、RAG和LlamaIndex的共生关系

在上一章中,我们看到原始的大型语言模型(LLM)存在一些开箱即用的局限性。它们的知识是静态的,有时会输出一些无意义的内容。我们还了解了检索增强生成(RAG),这是解决这些问题的一种潜在方法。通过将提示工程技术与编程方法结合,RAG可以优雅地解决许多LLM的缺点。

什么是提示工程?

提示工程涉及设计文本输入,使其能够被生成式AI(GenAI)模型有效处理。这些提示以自然语言编写,描述了AI需要执行的具体任务。在第10章《提示工程指南和最佳实践》中,我们将深入讨论这个话题。

RAG是唯一的解决方案吗?

当然不是。另一种方法是微调AI模型,即在专有数据上进行额外训练,以调整LLM并嵌入新的数据。这种方法利用在通用数据集上预训练的模型,并在一个更专业的数据集上继续训练。这个专业的数据集可以根据特定领域、语言或任务进行定制。结果是一个既保留了广泛知识基础又在特定领域具备专业知识的模型。

image.png

微调可以提高性能,但也存在一些缺点,比如成本高、需要大量数据集以及难以用新信息更新。微调还存在永久性改变原始AI模型的缺点,这使其不适合个性化需求。将原始AI模型比作一道经典菜肴的食谱,微调这个模型就像是修改传统食谱以适应特定口味或需求。虽然这些变化可以使菜肴更适合某些人,但也从根本上改变了原始食谱。

注意:

并不是所有的微调方法都会永久性地改变基础AI模型。以低秩适应(LoRA)为例,LoRA是一种用于大型语言模型(LLM)的微调方法,与传统的全微调方法相比,它提供了一种更高效的方法。在全微调中,神经网络的所有层都被优化,虽然有效,但资源密集且耗时。而LoRA方法仅涉及微调两个较小的矩阵,这些矩阵近似于预训练LLM的较大权重矩阵。在LoRA方法中,模型的原始权重被冻结,即在微调过程中不会直接更新。模型行为的变化是通过添加这些低秩矩阵实现的。这种方法允许保留原始模型,同时仍能使其适应新任务或提高性能。你可以在这里找到有关该方法的更多信息:ar5iv.labs.arxiv.org/html/2106.0…

尽管LoRA在内存使用方面比全微调更高效,但它仍然需要计算资源和专业知识来有效实施和优化,这可能对一些用户构成障碍。使用微调来为大量不同用户创建更个性化的体验,需要为每个用户重新运行微调过程,这显然不是成本有效的。

我并不是说RAG(检索增强生成)比LLM微调更好。事实上,RAG和微调是互补的技术,通常一起使用。然而,为了快速整合不断变化的数据和个性化,RAG是更好的选择。

LlamaIndex的作用

利用LlamaIndex,你可以快速创建能够适应特定用例的智能大型语言模型(LLM)。与仅依赖其通用的预训练知识不同,你可以注入有针对性的信息,使其提供准确、相关的答案。它提供了一种简单的方法,将外部数据集连接到诸如GPT-4、Claude和Llama等LLM。LlamaIndex在你的定制知识和LLM的广泛能力之间建立了一座桥梁。

注意:

LlamaIndex框架由普林斯顿大学毕业生和企业家Jerry Liu于2022年创建,很快就在开发者社区中广受欢迎。LlamaIndex允许你利用LLM的计算能力和语言理解能力,同时将其响应集中在特定的、可靠的数据上。这种独特的组合使企业和个人能够最大限度地发挥其AI投资的价值,因为他们可以使用相同的基础技术来进行各种专业化应用。

例如,你可以对公司的文档集合进行索引。然后,当你问到与业务相关的问题时,通过LlamaIndex增强的LLM会基于真实数据提供响应,而不是仅仅给出模糊的答案!

结果是,你既能获得LLM的全部表达能力,又能大大减少错误或无关信息的数量。LlamaIndex引导LLM从你提供的可信来源中获取信息,而这些来源可以包含结构化和非结构化数据。事实上,正如我们将在后续章节中看到的那样,该框架几乎可以从任何可用的数据源中获取数据。很酷,对吧?

如果你还没有想到这个框架的众多可能用途,让我给你一些快速的想法。利用LlamaIndex,你可以:

  • 为你的文档集合构建一个搜索引擎: 其最强大的应用之一是能够索引你所有的文档——它们可以是PDF、Word文件、Notion文档、GitHub仓库或其他格式。一旦索引完成,你可以查询LLM以搜索特定信息,使其成为专为你的资源定制的强大搜索引擎。
  • 创建一个具有定制知识的公司聊天机器人: 如果你的业务有特定的行话、政策或专业知识,你可以让LLM理解这些细微差别。这个聊天机器人可以处理从基本客户服务问题到通常需要人工专业知识的更复杂的互动。
  • 生成大报告或论文的摘要: 如果你的组织处理冗长的文档或报告,LlamaIndex可以将其内容提供给LLM。然后,你可以让LLM生成简明的摘要,捕捉最重要的要点。
  • 开发用于复杂工作流程的智能助手: 通过让LLM了解你组织独特的多步骤任务或程序的细微差别,你可以将其转变为智能助手数据代理,提供有价值的见解和指导。

这些只是冰山一角。

此外,图2.2展示了如何通过实施智能RAG策略,可以抵消与在特定领域微调模型相关的一些成本。

image.png

在深入探讨LlamaIndex框架的应用和使用案例之前,让我们先谈一谈它的架构和背后的设计原则吧!

逐步揭示复杂性的优势

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

documents = SimpleDirectoryReader('files').load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("summarize each document in a few sentences")
print(response)

LlamaIndex的创建者希望它对所有人都能易于使用——从刚开始接触LLM的新手到构建复杂系统的专家开发人员。因此,LlamaIndex采用了一种叫做逐步揭示复杂性的设计原则。别担心这个复杂的名称——它的意思只是框架从简单开始,当你需要更高级功能时,逐渐揭示出来。

当你第一次使用LlamaIndex时,它感觉就像魔法一样!只需几行代码,你就可以连接数据并开始查询LLM。在底层,LlamaIndex将数据转换为LLM可以使用的高效索引。

看看这个非常简单的例子,它首先从本地目录加载一组文本文件,然后对这些文档建立索引,并查询该索引以基于自然语言查询获取文档的摘要:

就是这么简单,只需六行代码!

注意:

暂时不要尝试运行这段代码。它主要是用于说明目的。在此之前,我们需要进行一些环境准备。别担心,我们会在本章稍后介绍这些内容,然后你就可以开始了。

随着你对LlamaIndex的使用增多,你会发现它更强大的功能。有很多参数可以调整。你可以选择为不同用途优化的专门索引结构,进行不同提示策略的详细成本分析,自定义查询算法等等。

但是,LlamaIndex总是先从简单入手,在深入更详细的操作之前,对于快速和简单的项目,你不需要深入了解太多。这样,无论是初学者还是专家都能从它的多功能性和能力中受益。

现在,让我们快速浏览一下我们的动手项目,然后开始准备最有趣的部分:编写代码。

一个重要的考虑点

随着你深入阅读本书,并且很可能会基于其中的示例进行实验,你需要牢记一个非常重要的点。默认情况下,LlamaIndex框架配置为使用OpenAI提供的AI模型。虽然这些模型非常强大和多功能,但它们会产生成本。本书中介绍的许多LlamaIndex功能,无论是元数据提取、索引、检索还是响应合成,都是基于LLM或嵌入模型。我尽量使用尽可能简单的示例和小样本数据集,以尽量限制这些成本。

注意:

我强烈建议你密切关注OpenAI API的使用情况。如果你还没有,可以在这里监控API的使用情况:platform.openai.com/usage。我还建议你从隐私角度谨慎行事。这些问题将在第4章和第5章中更详细地讨论。

或者,如果你想避免使用外部LLM的成本和潜在的隐私风险,你可以应用第9章中描述的方法,定制和部署我们的LlamaIndex项目。但是需要注意的是,本书中提供的所有示例都是使用OpenAI提供的默认模型编写和测试的。运行在本地托管的替代方案上时,有些示例可能效果不佳,甚至无法运行。

介绍PITS——我们的LlamaIndex动手项目

没有什么比实战学习更有效了。 所以,我为我们准备了一个有趣且有用的项目,开始使用LlamaIndex! 在这里,我们将介绍PITS。拥有一个可以帮助你互动学习新概念的AI导师是不是很酷?那么,我们将一起构建一个这样的系统!

其工作原理如下:

首先,你会向PITS自我介绍。你可以描述你想学习的主题,并指定任何个人学习偏好。

然后,你将能够上传任何现有的学习材料。PITS将接受并摄取你提供的任何PDF、Word文档或文本文件。

根据提供的文档,导师首先会生成一个测验。你可以选择完成这个测验。这样,导师就能评估你对该主题的当前了解程度,并调整学习体验。

我们的智能导师接下来会为你生成学习材料。这将包括每张幻灯片的讲解和旁白。培训材料将被划分为章节。

然后,你的学习旅程就开始了。在每次学习过程中,PITS将根据你的知识水平和偏好,以你喜欢的方式展示每个主题并适应你的知识水平。

在每个概念解释之后,你将有机会要求更多的解释或示例,以进一步了解该主题。它会回答你的问题,创建测验,解释概念,并根据你的需求调整回应。

最棒的是,你与这个智能体的整个对话都会被记录下来。它会记住你的问题和它的回答,因此不会重复自己或失去对话上下文。

一次学习太累了?没问题。当你准备好开始另一堂课时,它会从你上次停下的地方继续,并给你一个上次讨论的总结。

但是,嘿!他们说一图胜千言,对吧?

image.png

这真的没有比这更定制化的体验了。这是终极学习体验。

正如你所想,PITS需要在多个方面都表现出智能。它需要能够做到以下几点:

  • 理解并索引我们提供的学习材料
  • 与用户流利对话并保持上下文
  • 根据索引知识有效教学

LlamaIndex将通过摄取学习材料来帮助实现第一部分。用户可以上传任何相关的培训材料,例如手册、幻灯片,甚至学生笔记和示例问题。

对于第二部分,我们将主要利用GPT-4的能力来驱动实际的教学互动。

然而,基础将是LlamaIndex的知识增强能力。挺不错吧?我们将拥有一个个性化定制的导师!

注意:

我不确定你是否看过我的简介,但我是一名培训师。当我第一次了解到生成性AI的力量并发现GPT-3时,我就知道,几年后像PITS这样的系统迟早会出现。我对它们为世界各地的人们提供免费优质教育的潜力感到兴奋,无论他们的地理位置、背景或经济状况如何。后来,当我发现RAG和像LlamaIndex这样的工具时,我更加确信它们会很快出现。

好了,够了,不再白日做梦了——让我们开始搭建这个系统吧。

准备我们的编码环境

pip install llama-index
pip install streamlit
pip install pypdf
pip install docx2txt
python --version
git --version
pip show llama-index
echo %OPENAI_API_KEY%
pip show streamlit
pip show pypdf
pip show docx2txt
python sample1.py

在我们开始LlamaIndex编码之旅之前,正确设置我们的开发环境是至关重要的。这是确保我们能顺利运行我为你准备的示例和练习的第一步。

注意 为了保持简单并确保所有示例的一致性,我设计的示例代码是在本地Python环境中运行的。我知道你们中有很多人喜欢使用Google Colab和Jupyter Notebooks等基于网络的编码环境来进行编码项目,因此如果这些示例不能直接转换或在这些平台上运行,请理解我的用意。我希望我们的设置能够保持简单,让我们专注于学习体验,而无需担心兼容性问题。感谢你的理解,祝编码愉快!

让我们快速设置计算机以进行一些酷炫的LlamaIndex编码。

安装Python

你需要一个Python 3.7+的环境。我推荐使用Python 3.11(如果可能)。 如果你还没有安装Python,请从Python官网下载安装。如果你已经有一个旧版本,你可以升级或并行安装一个更新的Python版本。 对于编码环境,我个人偏好使用NotePad++,它不是一个IDE,但非常快速。不过,你也可以使用Microsoft的VSCodePyCharm或你喜欢的任何其他工具。

安装Git

在我们继续之前,安装Git是很重要的。Git是一个版本控制系统,可以让你管理代码的更改并与他人协作。它对于克隆代码库也是必不可少的,比如我们将在本书中使用的代码库。 前往Git官网并下载适用于你操作系统的安装程序。 按照安装步骤,你很快就能启动并运行Git。 本书中展示的所有示例代码片段以及整个项目代码库都可以在这个GitHub仓库中找到。 所以,如果你想在本地下载项目文件,在安装完Git后,你可以简单地按照以下步骤操作:

  1. 导航到所需目录:打开一个新的命令提示符或终端窗口。使用cd命令导航到你想存储项目的目录。例如:
cd path/to/your/directory
  1. 克隆仓库:运行以下命令来克隆GitHub仓库:
git clone https://github.com/PacktPublishing/Building-Data-Driven-Applications-with-LlamaIndex.git

这将把项目的副本下载到你的本地机器上。

  1. 进入项目目录:导航到新创建的项目文件夹中:
cd Building-Data-Driven-Applications-with-LlamaIndex

随着我们项目的推进,你有两种选择:

  • 你可以自己编写代码,然后与仓库中的代码进行比较。
  • 或者你可以直接浏览仓库中的代码文件,以更好地理解代码结构。

如果你正确执行了所有上述步骤,列出当前文件夹的内容应该会返回几个名为chX的子文件夹——其中X是章节编号,另有一个名为PITS_APP的单独子文件夹。章节文件夹包含每个章节对应的所有示例源文件。PITS_APP文件夹包含我们主要项目的源代码。

安装LlamaIndex

接下来,让我们安装LlamaIndex库。在命令提示符中运行以下命令:

pip install llama-index

这将包括一个LlamaIndex包,其中包含核心LlamaIndex组件以及一些有用的集成。为了实现尽可能高效的部署,还有只安装最小核心组件和必要集成的选项,但为了本书的目的,提供的选项就足够了。

注意 如果你已经运行的是v0.10之前的版本,建议在虚拟环境中进行全新安装,以避免与旧版本的冲突。你可以在这里找到详细的说明。

我们现在可以导入并开始使用它了。

注册OpenAI API密钥

由于我们将通过LlamaIndex使用OpenAI的GPT模型,你需要一个API密钥来进行身份验证。前往OpenAI平台并注册。登录后,你可以创建一个新的秘密API密钥。确保保管好它! LlamaIndex每次与OpenAI的模型交互时都会使用此密钥。由于需要保密,最好将其存储在本地计算机的环境变量中。

Windows用户简短指南

在Windows上,你可以按以下步骤操作:

  1. 打开环境变量:打开“开始”菜单并搜索“环境变量”或右键单击“此电脑”或“我的电脑”,然后选择“属性”。
  2. 点击“高级系统设置”,然后在“高级”选项卡中点击“环境变量”按钮,如图2.4所示:

image.png

创建新的环境变量:在环境变量窗口的用户变量部分,点击“新建”按钮。

输入变量详细信息:在“变量名”中输入 OPENAI_API_KEY。在“变量值”中粘贴你从OpenAI收到的秘密API密钥。参见图2.5进行说明。

image.png

确认并应用:点击“确定”关闭所有对话框。你需要重启计算机以使更改生效。

验证环境变量:为了确保变量设置正确,打开一个新的命令提示符,并运行以下命令:

echo %OPENAI_API_KEY%

这应该会显示你刚刚存储的API密钥。

Linux/Mac用户简短指南

在Linux/Mac上,你可以通过以下步骤注册OpenAI API密钥: 在终端中运行以下命令,将<yourkey>替换为你的API密钥:

export OPENAI_API_KEY=<yourkey>

更新shell以包含新的变量:

source ~/.bashrc # 或 source ~/.zshrc,取决于你使用的shell

确保你已经使用以下命令设置了环境变量:

echo $OPENAI_API_KEY

你的OpenAI API密钥现在已安全地存储在环境变量中,可以在需要时轻松地被LlamaIndex访问,而无需在代码或系统中暴露它。

注意 虽然OpenAI通过其API为其GPT模型提供免费试用选项,但你只能获得有限数量的免费积分。目前,免费积分限于$5,并在3个月后过期。对于我们项目的实验和阅读这本书来说,这应该是足够的。然而,如果你想认真构建基于LLM的应用程序,你需要在其平台上注册一个付费账户。或者,你可以选择使用另一个AI模型进行LlamaIndex。我们将在第10章“提示工程指南和最佳实践”中更详细地讨论自定义AI模型。

安装Streamlit – 快速构建和部署的完美工具!

在我们构建像PITS这样酷炫的应用程序之前,我们需要一个地方来构建和运行它们!这就是Streamlit的用武之地。Streamlit是一个非常棒的开源Python库,使创建和部署Web应用程序和仪表板变得非常简单。 只需几行Python代码,你就可以构建完整的Web界面并立即看到结果。最棒的是,Streamlit应用程序几乎可以部署到任何地方——在服务器上、在Heroku等平台上,甚至直接从GitHub部署! 我喜欢Streamlit,因为它让我可以专注于有趣的部分——比如使用LlamaIndex创建PITS,而无需为复杂的Web开发烦恼。对于AI实验来说,它是完美的!

我们将主要使用它来创建上传学习指南和与我们的PITS导师交互的界面。为了下一章的目的,我们将使用Streamlit在本地运行和测试我们的应用程序。然而,在第9章“自定义和部署我们的LlamaIndex项目”中,我们还将发现如何使用Streamlit Share或你喜欢的任何其他托管服务轻松部署我们的应用程序。 Streamlit具有许多很酷的功能,如数据框架、图表和小部件——但现在不要担心学习所有这些功能。在我们构建功能时,我会解释相关部分,这样你就可以在此过程中掌握Streamlit技能!

安装Streamlit

最后,我们需要安装Streamlit库:

pip install streamlit

太棒了!我们有了后端工具(LlamaIndex)、前端层(Streamlit)和我们的目标(PITS)。现在是最后的润色时间。

完成设置

因为我们的项目应该能够摄取PDF和DOCX文档,所以我们还需要安装两个附加库:

pip install pypdf
pip install docx2txt

就是这样!我们的环境已经准备好使用LlamaIndex了。

总结

我们已经安装了:

  • Python 3.11
  • Git
  • LlamaIndex包
  • OpenAI账户和API密钥
  • 用于构建应用程序的Streamlit
  • PyPDF和DOC2Txt库

最后检查

为了验证一切是否正确安装,打开一个新的命令提示符或终端窗口,并运行以下命令:

python --version
git --version
pip show llama-index
echo %OPENAI_API_KEY%
pip show streamlit
pip show pypdf
pip show docx2txt

简单的方法是尝试导航到本地git文件夹的ch2子文件夹并运行名为sample1.py的文件:

cd path/to/your/local/git/folder/ch2
python sample1.py

如果一切安装正确,你应该会得到ch2/files子文件夹中提供的两个示例文档的摘要。 如果有任何缺失,请返回并重新执行必要步骤,然后再继续。相信我,这将避免你在后续过程中遇到很多痛苦和挫折。

我们已经准备好开始摄取数据、使用LlamaIndex构建索引并构建我们的PITS导师应用程序了!我不知道你怎么样,但我已经迫不及待想开始实验了。 在接下来的章节中,我们将动手编写我们的第一个LlamaIndex程序。这才是最有趣的部分开始的地方!我们将探索数据摄取、构建索引、执行查询等内容。 我会用简单的术语解释每个概念和代码行。很快你就会像LlamaIndex专业人士一样实现基础知识!一旦我们掌握了这些基础知识,我们就可以开始扩展我们的导师应用程序的功能。 但首先,让我们明确一下框架的GitHub仓库的整体代码结构。

熟悉LlamaIndex代码仓库的结构

from llama_index.llms.mistralai import MistralAI
pip install llama-index.llms.mistralai

由于你可能会花费大量时间浏览LlamaIndex框架的官方代码仓库,了解其总体结构是非常有益的。你可以随时在这里查看仓库:github.com/run-llama/l…

从0.10版本开始,代码已经彻底重组为更模块化的结构。这个新结构的目的是提高效率,通过避免加载任何不必要的依赖,同时也提高了可读性和开发人员的整体用户体验。

图2.6描述了代码结构的主要组件:

image.png

llama-index-core 文件夹是 LlamaIndex 的基础包,允许开发人员安装必要的框架,然后从300多个集成包和不同的Llama包中选择,以根据特定应用需求定制功能。

llama-index-integrations 文件夹包含各种扩展核心框架功能的附加包。这些包允许开发人员通过特定元素(如自定义LLM、数据加载器、嵌入模型和向量存储提供商)来定制他们的构建,以最佳适应应用的要求。我们将在本书后面的章节中讨论其中一些集成,从第四章“将数据摄取到我们的RAG工作流”开始。

llama-index-packs 文件夹包含超过50个Llama包。这些包由LlamaIndex开发者社区开发并不断改进,作为现成的模板,旨在启动用户的应用程序。我们将在第九章“自定义和部署我们的LlamaIndex项目”中更详细地讨论它们。

llama-index-cli 文件夹用于LlamaIndex命令行界面,我们将在第九章“自定义和部署我们的LlamaIndex项目”中简要介绍。

图2.6中的最后一部分称为OTHERS,由两个文件夹组成,目前包含微调抽象和一些我们在本书中不会介绍的实验功能。

注意 llama-index-integrations 和 llama-index-packs 中的子文件夹代表单独的包。文件夹名称对应于包名称。例如,llama-index-integrations/llms/llama-index-llms-mistralai 文件夹对应于 llama-index-llms-mistralai PyPI 包。 按照这个例子,你需要在代码中导入和使用 mistralai 包之前,先运行以下命令安装相应的 PyPI 包:

pip install llama-index-llms-mistralai

不要太担心遗漏书中示例所需的任何必要包,因为你会在每章开头的“技术要求”部分找到它们的详细列表。

总结

在本章中,我们介绍了LlamaIndex,这是一个将LLMs连接到外部数据集的框架。我们发现LlamaIndex如何允许LLMs将现实世界的知识纳入其响应中。

本章讨论了LlamaIndex相对于微调的好处,例如更容易更新和个性化。介绍了渐进披露复杂性的概念,即LlamaIndex从简单开始,但在需要时揭示高级功能。

接下来,本章概述了动手项目PITS,一个个性化智能辅导系统。它涵盖了设置所需工具(如Python、Git和Streamlit)以及获取OpenAI API密钥的过程。最后,通过验证环境是否已准备好构建LlamaIndex应用程序来结束本章。

我们现在准备继续我们的旅程,并进一步了解LlamaIndex框架的内部工作原理。下一章见!