使用 LlamaIndex 构建数据驱动型应用——LlamaIndex:隐藏的宝石——LlamaIndex 生态系统简介

既然你已经对 LLM 是什么,以及它们能做什么、不能做什么,有了扎实的理解,现在是时候看看 LlamaIndex 如何将你的交互式 AI 应用提升到新的层次了。我们将看到,使用 LlamaIndex 实现的 RAG,如何在 LLM 的庞大知识与专有数据之间架起桥梁。

本章将帮助你理解,为什么以及如何使用 LlamaIndex 来增强 LLM 的标准能力。

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

  • 优化语言模型------流行方法概览
  • 如何充分利用本书
  • 介绍我们的实战项目:Contract Review Expert
  • 准备编码环境
  • 熟悉 LlamaIndex 代码仓库的结构

技术要求

本章需要以下内容:

本书中展示的所有示例代码片段,以及完整的项目代码库,都可以在这个 GitHub 仓库中找到:

github.com/PacktPublis...

优化语言模型------流行方法概览

在上一章中,我们看到,原生 LLM 从一开始就存在一些限制。它们的知识是静态的,并且偶尔会吐出一些毫无意义的内容。我们也学习了 RAG,作为一种潜在技术,可以缓解这些问题。将提示工程技术与 RAG 结合起来,可以优雅地解决 LLM 的许多短板。

但是,RAG 是唯一可能的解决方案吗?当然不是。让我们来探索一些常见的替代方法和互补方法。

LLM 微调

对 LLM 进行微调,指的是在专有数据上对 LLM 进行额外训练,通过强化从专门数据中学习到的新模式或优先级,使其适应特定领域或任务。在微调中,一个已经在通用数据集合上预训练过的模型,会继续在更加专门化的数据集上训练。这个专门化数据集可以针对你感兴趣的某个特定领域、语言或任务集合进行定制。其结果是,模型既能保持广泛的知识基础,又能获得某个特定领域的专业能力。

请看图 2.1,它用图示方式解释了这个过程:

图 2.1 ------ LLM 微调过程示意图

尽管微调可以提升 LLM 的性能,但它也有一些缺点:成本高、需要大型数据集,并且很难用新信息进行更新。它还有一个缺点,就是会永久改变原始 AI 模型。对于可扩展的个性化来说,这种方法不太实用,因为它需要为每一个单独用户执行一次独立的微调过程。你可以把原始 AI 模型想象成一道经典菜肴的传统菜谱。微调这个模型,就类似于修改这份传统菜谱,以适应特定口味或要求。虽然这些改动可能让这道菜更适合某些人,但它们也从根本上改变了原始菜谱。

并不是所有微调方法都会永久改变基础 AI 模型。以低秩适配(Low-Rank Adaptation,LoRA)为例。LoRA 是一种用于 LLM 的微调方法,相比传统的完整微调,它提供了一种更高效的方式。在完整微调中,神经网络的所有层都会被优化;这种方式虽然有效,但资源消耗大,也很耗时。而 LoRA 则避免修改完整模型。它不会重新训练模型全部的内部参数,这些参数可能多达数十亿个,而是引入两个小型的可训练层,让它们学习特定任务的调整,同时保持原始模型冻结不变。这种方式既能保留原始模型,又能让模型适配新任务或获得更好的性能。关于这一方法,你可以在以下研究中找到更多信息:Hu 等人,2021,LoRA: Low-Rank Adaptation of Large Language Modelsdoi.org/10.48550/ar...

虽然与完整微调相比,LoRA 在内存使用方面更加高效,但它仍然需要计算资源和专业知识,才能被有效实现和优化,这对某些用户来说可能是一个门槛。如果使用微调为大量不同用户创建更个性化的体验,就需要为每个用户重新运行一次调优过程,这显然并不具备成本效益。

我并不是说 RAG 天然优于 LLM 微调。事实上,两者通常是互补的,并且经常会组合使用。不过,在快速集成持续变化的数据以及实现个性化方面,RAG 往往是更实际的选择。

提示工程

提示工程是在 LLM 时代被创造出来的一个新术语,它代表了一种在不修改这些强大系统,也就是 LLM,底层架构的情况下,引导其行为的技术。它也被称为提示设计(prompt design),这种方法涉及编写文本输入,使其能够被生成式 AI 模型有效处理。这些提示词以自然语言编写,描述 AI 需要执行的具体任务。

虽然这并不能完全弥补上一章提到的所有 LLM 固有限制,但根据你的使用场景设计一个好的提示词,会显著增强模型性能,减少幻觉,并提高输出的可靠性。在构建聊天机器人、问答系统或任何其他由 GenAI 驱动的应用时,提示工程通常是最快、最容易上手的方式,用来优化 LLM 的输出,使其满足你的需求。然而,与 RAG、微调以及本章讨论的其他替代方法相比,提示工程更像是一种战术工具,而不是一种全面或系统性的方法。

我们将在第 13 章"提示工程指南与最佳实践"中,对这个主题进行更深入的讨论。

知识蒸馏

另一个值得提及的方法是知识蒸馏。这项技术涉及将知识从一个大型复杂模型,通常被称为教师模型,转移到一个更小、更高效的模型,也就是学生模型。这个过程通常是通过训练学生模型,使其在给定数据集上复现教师模型的输出。这个蒸馏后的模型旨在保留原始模型的大部分准确性和性能,同时在部署时显著更快、更轻量。

你可以把教师模型想象成一位专家教授,把学生模型想象成一位高级学徒。虽然学生可能无法接触教授头脑中所有深层内部运作,但它仍然可以通过仔细观察教授的解题方式,并模仿其行为,学会解决问题。

知识蒸馏在边缘部署、低延迟应用,或计算资源受限的场景中特别有用。不过,需要注意的是,这种方法并不是为了集成新知识或领域专业能力。它关注的是压缩并优化原始模型已经知道的内容。正因为如此,当需要领域特定知识时,它通常会与微调或其他方法结合使用。

知识蒸馏已经成为压缩 LLM 并保留其性能的一种关键方法,例如下面这篇综述所展示的那样:Yang 等人,2024,Survey on Knowledge Distillation for Large Language Models: Methods, Evaluation, and Applicationarxiv.org/abs/2407.01...

工具使用与函数调用

工具使用,包括函数调用这类机制,是一种越来越流行的方法,用来在不重新训练 LLM 的情况下扩展其能力。与其试图让模型在孤立状态下变得更聪明,这项技术会让模型能够访问外部工具。这些工具可能包括外部 API、数据库、搜索引擎,甚至系统函数。借助这些工具,模型可以将任务中的某些部分委托给更适合处理它们的系统。

想象一个语言模型就像一位熟练的助手,它知道什么时候该拿起电话,联系某个主题专家。LLM 负责协调流程,理解用户意图,并在必要时将特定请求委托给外部系统。这会创建一个混合系统,将推理和自然语言生成,与访问最新能力或专业能力结合起来。

工具使用是一种高度模块化且灵活的方法,能够支持类似智能体的行为,也就是模型可以决定使用哪些外部系统来完成多步骤任务。它非常适合那些需要实时数据、流程步骤,或模型内部知识库之外动作的使用场景。不过,它确实需要稳健的后端基础设施和谨慎的集成。你需要清楚地定义函数,并确保模型能够优雅地处理失败或意外响应。它并不是 RAG 或微调的独立替代方案;相反,它通过提供实时知识访问来补充 RAG,并通过支持面向行动的工作流来增强微调。在这种工作流中,模型不只是生成回答,而是主动采取步骤来完成任务并产出结果。

这一领域近期的一个进展是模型上下文协议(Model Context Protocol,MCP)。这是一个开放标准,旨在形式化并简化 LLM 与外部工具交互的方式。函数调用允许模型以结构化输出调用特定函数,而 MCP 则增加了一个发现与协调层,使模型能够在运行时查询哪些工具可用,以及如何使用它们。MCP 为智能体软件的商品化和标准化铺平了道路,可以被视为一个框架,它将工具使用从预定义集成提升为一个即插即用能力的生态系统。关于 MCP 的更多信息可以在这里找到:github.com/modelcontex...

如果想更深入探索工具使用和智能体行为,请参阅第 10 章"探索高级智能体使用场景"。

在继续之前,下面是我们讨论过的方法的一个快速对比,帮助你理解每种方法在什么情况下有意义:

方法 它做什么 是否容易更新? 成本 最适合
微调 在专门数据上重新训练模型 否,需要重新训练 高,计算 + 数据 适配特定领域或语气
LoRA 训练小型适配器层,保持基础模型冻结 比完整微调更容易 中等 在有限硬件上进行轻量级领域适配
知识蒸馏 将大模型压缩成小模型 否,需要重新蒸馏 中到高 以更低延迟和成本部署有能力的模型
提示工程 编写指令来引导模型行为 是,只需编辑提示词 快速调整、原型设计、简单任务
工具 / 函数调用 让模型访问外部 API 和系统 是,可以添加或替换工具 低到中等 需要实时数据或外部动作的任务
RAG 检索相关数据并将其注入提示词 是,只需更新数据 将回答锚定在大型或频繁变化的数据集上

表 2.1 ------ 常见 LLM 优化方法对比

尽管上述所有技术都提供了增强和定制语言模型行为的方式,但它们都没有真正解决这样一个问题:如何系统性地将 LLM 连接到你自己的数据。提示工程非常适合短指令,但它无法处理成千上万份文档。微调可以把新知识加入模型权重中,但每次数据变化时都更新它,祝你好运。工具可以获取外部信息,但它们并不会给你一条结构化流水线,用于索引、搜索,并在正确时间检索正确片段。这正是 LlamaIndex 这类框架发挥作用的地方。

LlamaIndex 做了什么

借助 LlamaIndex,你可以快速创建智能的、基于 LLM 的应用,并使其适配你的特定使用场景。你不必只依赖 LLM 通用的预训练知识,而是可以通过编程方式注入有针对性的信息,让它们给出准确、相关的回答。它提供了一种简单方式,用来将专有数据集连接到本地或托管的 LLM。

这之所以可行,是因为现代 LLM 有一个关键特性:当信息被直接放入它们的上下文窗口时,它们往往会优先使用这些信息,而不是通用训练知识。这正是 RAG 如此有效的原因。通过检索正确数据,并在查询时将其提供给模型,我们实际上是在用自己的数据锚定模型回答。

LlamaIndex 在你的自定义知识与 LLM 的巨大能力之间架起了一座桥梁。

LlamaIndex 框架由普林斯顿大学毕业生、创业者 Jerry Liu 于 2022 年创建,最初名为 GPT Index,很快就在开发者社区中变得非常流行。LlamaIndex 允许你利用 LLM 的计算能力和语言理解能力,同时将其回答聚焦在特定、可靠的数据上。这种独特组合使企业和个人能够充分发挥 AI 投资的价值,因为他们可以将同一种底层技术用于大量专门化应用。

例如,你可以索引公司的一组文档。然后,当你提出与业务相关的问题时,经过 LlamaIndex 增强的 LLM 会基于真实数据给出回答,而不是随便编出一些模糊答案!

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

如果你还没有想过如何使用这个框架,我来给你一些快速想法。借助 LlamaIndex,你可以做这些事情:

为你的文档集合构建搜索引擎:它最强大的应用之一,是能够索引你的所有文档。这些文档可以是 PDF、Word 文件、Notion 文档、GitHub 仓库或其他格式。一旦完成索引,你就可以查询 LLM 来搜索特定信息,让它成为一个专门针对你自己资源定制的强大搜索引擎。

创建拥有定制知识的公司聊天机器人:如果你的业务有特定术语、政策或专业知识,你可以让 LLM 理解这些细微差别。然后,这个聊天机器人就可以处理一系列查询,从基础客户服务问题,到通常需要人类专业能力才能处理的更专门化交互。

生成大型报告或论文的摘要:如果你的组织需要处理冗长文档或报告,LlamaIndex 可以用于将它们的内容提供给 LLM。然后,你可以要求 LLM 生成简洁摘要,抓住最重要的要点。

为复杂工作流开发智能助手:通过引导 LLM 理解你组织中特有的多步骤任务或流程细节,你可以把它转变成一个智能助手型数据智能体,提供有价值的洞察和指导。

而这些只是冰山一角。

图 2.2 展示了实现 LlamaIndex 这类智能 RAG 策略,如何抵消一部分与针对特定领域微调模型相关的成本。本质上,每当你的专有知识发生变化时,你并不需要重新微调模型。

图 2.2 ------ 通过 RAG 更新数据(左)比通过微调重新训练模型(右)便宜且快速得多

在我们深入 LlamaIndex 框架的应用和使用场景之前,先花一点时间理解本书是如何组织的,以及每一部分如何建立在前一部分之上。

如何充分利用本书

LlamaIndex 框架旨在同时提供高级、开箱即用的函数,以及可用于深度定制的低层组件。这种双层方法,让初学者和有经验的开发者都能以最少的工作量实现自己的想法,同时充分利用框架的灵活性和能力。本书也秉承同样思路:先从可快速实现的高级概念开始,然后再进入框架中可用的更高级定制技术。

也就是说,在开始编码之前,我们需要先考虑一些事情。

LlamaIndex 的许多功能,无论是元数据提取、索引、检索,还是响应合成,都是基于 LLM 或嵌入模型的。随着你阅读本书并开始尝试其中提供的示例,有一点非常重要,需要牢记:虽然 LlamaIndex 框架默认配置为使用 OpenAI 的模型,但本书采用了不同的方法。

为了让学习体验完全免费且完全私密,除非另有说明,本书中的所有示例都被配置为通过 Ollama 使用本地托管模型:ollama.com/。这包括用于响应生成的语言模型,也包括用于文档索引和检索的嵌入模型。我们将在第 11 章"定制和部署我们的 LlamaIndex 项目"中进一步讨论 Ollama。

本书选择以下模型来运行代码示例:

通过 Ollama 在本地运行这些模型,你可以避免与云端托管 API 相关的成本、速率限制和隐私影响。这种设置非常适合实验、测试,甚至适合简单应用的原型开发。我有意让示例保持简单,使用小型样例数据集,以尽量降低计算需求,并使所需系统配置保持最低。配置过程很直接,并会通过一个共享代码模块自动应用到所有示例中。你将在本章的"设置 Ollama"部分找到关于如何安装和运行 Ollama 的详细说明。

重要免责声明

本书中提供的所有示例,都是使用这些特定模型编写并测试的。当在其他替代设置上运行时,一些示例可能表现不佳,甚至完全无法工作,这是可以预期的。

另一个需要考虑的关键方面是,虽然本地 LLM 提供了独立性和完全控制权,但它们可能无法匹配 OpenAI、Google、Anthropic 或 Mistral 等公司提供的大型云端托管模型在原始能力或理解广度上的水平。尽管这些最先进模型极其强大且用途广泛,但它们会产生成本,也可能带来隐私风险。如果你选择改用它们,也可以通过调整 LlamaIndex Settings 很容易地做到。这将在第 11 章"定制和部署我们的 LlamaIndex 项目"中介绍。

如果你决定在项目或实验中使用云端托管 LLM,我强烈建议你密切关注 API 使用量,并考虑隐私问题,尤其是在你计划使用自己的数据运行代码示例时。这些潜在问题将在第 4 章"将数据摄取到我们的 RAG 工作流中"和第 5 章"使用 LlamaIndex 进行索引"中进一步讨论。

记住这些之后,让我们快速浏览一下我们的实战项目,然后开始为有趣的部分做准备:写代码。

介绍我们的实战项目:Contract Review Expert

没有什么比边做边学更有效。

所以,我为我们准备了一个实用且有影响力的案例研究,用来探索 LlamaIndex 的实际应用!

让我介绍我们的主项目:Contract Review Expert。想象一下,有一个注入了 AI 能力的应用,它可以审查合同,并将合同与你的内部政策文档进行对比------智能、快速,并且提供详细的、带引用的反馈。这正是我们将一起构建的东西。

用户首先会上传一份想要审查的合同,以及一个或多个代表内部指南、监管标准或最佳实践的政策文档。

然后,应用会执行两个主要任务:

  • 对合同进行通用风险分析,以显示潜在有问题的条款或危险信号
  • 进行合规性审查,将合同与上传的政策文档进行评估,以发现不一致或违规之处

它真正强大的地方在于,所有发现都可以追踪。系统会引用合同或政策文档中的确切段落,以证明其结论。除此之外,用户还可以访问一个聊天机器人界面,并提出如下问题:

  • 这份合同中的终止条件是什么?
  • 这是否符合我们的数据保留政策?
  • 哪些条款在 GDPR 下可能存在问题?

聊天机器人会从合同和政策材料中提取答案,保持完整上下文,并在回答时引用相关段落。

图 2.3 ------ Contract Review Expert 工作流概览

这是一个实用的真实世界项目,旨在帮助你以有意义的方式应用我们即将学习的一切。正如你可以想象的那样,我们的应用需要在几个方面足够智能:

  • 它必须能够摄取和索引多份包含复杂法律或政策语言的文档
  • 它必须执行检索增强分析,以在文档之间找到并关联相关段落
  • 它必须支持与用户进行流畅且具备上下文意识的对话

LlamaIndex 将通过处理文档摄取、索引和检索,帮助我们构建基础。你将学习如何构建、定制和查询文档索引,从而创建一个模拟专家法律审查,并支持人工合同分析的系统。图 2.4 展示了项目实际 UI 的预览:

图 2.4 ------ 这是本书结束时我们将构建出的内容

作为一个亲眼见过合同分析多么繁琐且高风险的人,我非常兴奋能展示 GenAI 和 LlamaIndex 这类工具,如何让更多人获得这种专业能力。话虽如此,鉴于合同解释涉及法律和伦理影响,对于这种敏感使用场景,强烈建议采用人在回路中的方式。这个应用被设计为一种辅助工具,而不是专业法律审查的替代品。任何输出都应被视为建议性内容,并在真实场景中依赖之前,由合格人员进行验证。

接下来,让我们开始设置必要组件。

准备编码环境

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

为了保持简单,并确保所有示例的一致性,我设计的示例代码会在本地 Python 环境中运行。我知道你们很多人都喜欢使用 Google Colab 和 Jupyter Notebooks 这类基于 Web 的编码环境来做项目,所以如果这些示例不能直接迁移到这些平台,或者不能在其中运行,还请理解。我的目标是让设置尽量直接,让我们能够专注于学习体验,而不必担心兼容性问题。感谢理解,祝编码愉快!

让我们快速把电脑设置好,准备进行一些很酷的 LlamaIndex 编码。

安装 Python

你需要一个 Python 3.8.1+ 环境。如果可以,我推荐 Python 3.11。在本书第二版写作时,对 Python 3.12 以及更新版本的支持目前仍然有限,并且可能在安装或运行时导致兼容性问题。

如果你没有 Python,请从 www.python.org 安装。如果你已经有较旧版本,可以升级,或者并行安装一个更新版本的 Python。

对于编码环境,我个人偏好 NotePad++:notepad-plus-plus.org/。它不完全是一个 IDE,但速度非常快。不过,你也可以使用 Microsoft 的 VSCode:code.visualstudio.com/,PyCharm:ht...,或者任何你喜欢的工具。

安装 Git

在继续之前,安装 Git 很重要。Git 是一个版本控制系统,可以让你管理代码变更,并与他人协作。它对于克隆代码仓库也非常重要,例如本书将使用的那个仓库。

前往 Git 官方网站:git-scm.com/book/en/v2/...,下载适合你操作系统的安装程序。按照安装步骤操作,很快就可以让 Git 正常运行。

本书中展示的所有示例代码片段,以及完整项目代码库,都可以在这个 GitHub 仓库中找到:

github.com/PacktPublis...

因此,如果你想将项目文件下载到本地,在完成 Git 安装之后,可以按照以下步骤操作:

导航到目标目录 :打开一个新的命令提示符或终端窗口。使用 cd 命令导航到你想存放项目的目录。下面是一个示例:

bash 复制代码
cd path/to/your/directory

克隆仓库:运行以下命令克隆 GitHub 仓库:

bash 复制代码
git clone https://github.com/AG-ITAcademy/Building-Data-Driven-Applications-with-LlamaIndex-2nd-Edition

这会将项目的一份副本下载到你的本地机器。

进入项目目录:进入新创建的项目文件夹:

bash 复制代码
cd Building-Data-Driven-Applications-with-LlamaIndex-2nd-Edition

随着项目推进,你有两个选择:

  • 自己编写代码,并将其与仓库中的代码进行对比
  • 直接探索仓库中的代码文件,以更好地理解代码结构

如果你正确完成了前面的所有步骤,列出当前文件夹内容时,应该会看到几个名为 chX 的子文件夹,其中 X 是章节编号,以及一个单独名为 Project 的子文件夹。章节文件夹中包含与每章对应的所有示例源文件。Project 文件夹中包含我们主项目的源代码。

安装 LlamaIndex

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

perl 复制代码
pip install llama-index

这会安装一个 LlamaIndex 包,其中包含核心 LlamaIndex 组件,以及一组有用的集成。为了实现尽可能高效的部署,也可以选择只安装最小核心组件和必要集成,但对于本书目的来说,上面展示的安装方式已经完全够用。

如果你已经在运行低于 v0.10 的 LlamaIndex 版本,建议你在虚拟环境中进行一次全新安装,以避免与旧版本发生冲突。

因为我们将使用本地托管的 LLM 和嵌入模型,所以还需要安装所需的 Ollama 集成:

perl 复制代码
pip install llama-index-llms-ollama
pip install llama-index-embeddings-ollama

现在,我们已经准备好导入并开始使用 LlamaIndex 框架了。

设置 Ollama

由于本书中的所有示例都将在本地运行,不依赖云 API,也不会产生使用成本,你需要安装 Ollama。Ollama 是一个工具,可以让你在自己的机器上运行 LLM 和嵌入模型。要安装 Ollama,只需访问 Ollama 官方网站:ollama.com/,并按照你的操作系统,也就是 Windows、macOS 或 Linux,对应的安装说明进行操作。他们网站上的设置流程很直接,文档也很完善。

拉取所需模型

安装好 Ollama 后,你需要下载本书示例所使用的特定模型:

arduino 复制代码
ollama pull gemma3:4b
ollama pull nomic-embed-text

这些命令会下载模型,并使它们可以在本地使用。它们大约会占用 3.5 GB 磁盘空间,所以请确保你有足够空间。

这是两种不同类型的模型:gemma3:4b 是一个小型但有能力的 LLM,拥有 40 亿参数,将负责文本生成;而 nomic-embed-text 是一个嵌入模型,拥有 1.37 亿参数,用于将文本转换为可用于搜索和检索的数值表示。在接下来的章节中,你会看到它们如何协同工作。

你可能会想,为什么我选择这些特定模型。对于 LLM,我选择 gemma3:4b,是因为它在能力和硬件需求之间取得了不错的平衡。它有 40 亿参数,足够聪明,可以处理合同分析这类任务,同时又足够小,可以在大多数消费级机器上舒适运行,而不需要高端 GPU。对于嵌入模型,我选择 nomic-embed-text,因为它是一个可靠且成熟的选项,在各种检索任务中表现稳定。

也就是说,LlamaIndex 是模型无关的,所以你可以根据自己的硬件或使用场景,自由替换为更合适的替代模型,因为你将在本书中学习到的技术,不管你使用哪种模型,都同样适用。

启动 Ollama

要开始使用 Ollama,请运行以下命令启动服务:

复制代码
ollama serve

这个命令会初始化 Ollama 服务器,让你的应用可以与模型交互。

请确保在你处理本书示例时,ollama serve 一直在后台运行。

好了,后端已经全部设置完毕。接下来我们来谈谈技术栈的其余部分。

发现 Streamlit------快速构建和部署的完美工具!

在我们能够构建合同审查系统这类很酷的应用之前,需要有一个地方来......嗯,构建并运行它们!这就是 Streamlit 发挥作用的地方。Streamlit 是一个很棒的开源 Python 库,可以非常轻松地创建和部署 Web 应用与仪表板。

只需要几行 Python 代码,你就可以构建完整的 Web 界面,并立即看到结果。最棒的是,Streamlit 应用几乎可以部署到任何地方:本地服务器、Docker 容器,或者 Heroku、AWS、Microsoft Azure 这类云平台。

我喜欢 Streamlit,因为它让我可以专注于用 LlamaIndex 应用构建真正有用的功能,而不是纠结复杂的 Web 开发。对于 AI 实验来说,它非常完美!

我们将主要使用它来为合同审查项目创建 UI,并用它在本地运行和测试我们的应用。不过,在第 11 章"定制和部署我们的 LlamaIndex 项目"中,我们也会了解如何使用 Streamlit Share,或者任何你喜欢的其他托管服务,轻松部署应用。

Streamlit 拥有大量很酷的能力,例如数据框、图表和小部件,但现在不必担心要全部学会。随着我们逐步构建功能,我会解释相关部分,这样你可以在过程中逐渐掌握 Streamlit 技能。

要安装 Streamlit 库,请运行以下命令:

复制代码
pip install streamlit

很好!现在我们已经有了平台,也就是 LlamaIndex;前端层,也就是 Streamlit;以及目标,也就是合同审查应用。让我们回顾一下到目前为止安装的所有内容:

  • Python 3.11+
  • Git
  • LlamaIndex 包
  • Streamlit,用于应用前端
  • Ollama,用于运行本地 LLM 和嵌入模型

最后检查一次

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

sql 复制代码
python --version
git --version
pip show llama-index
pip show streamlit
ollama --version

检查你的环境是否准备就绪的一个简单方式,是尝试进入本地 Git 文件夹中的 ch2 子文件夹,并运行名为 sample1.py 的文件:

复制代码
python sample1.py

如果所有内容都正确安装,你应该会得到 ch2/files 子文件夹中两个示例文档的漂亮摘要:

第一份文档详细介绍了古罗马的历史,强调了它作为庞大帝国中心的重要性。它描述了这个帝国在建筑、工程和军事征服方面的成就,以及它对现代社会的持久影响。

第二份文档关注狗作为深受喜爱的伴侣动物。它讨论了犬种的多样性,以及狗对人类生活的积极影响,强调了它们的忠诚、保护天性,以及它们给主人带来的快乐。

如果缺少任何内容,请返回并重新执行必要步骤,然后再继续。相信我,这会让你在后续少经历很多痛苦和挫败。

我们现在已经准备好开始摄取数据、使用 LlamaIndex 构建索引,并构建我们的合同审查应用了!我不知道你是不是这样,但我已经像进了糖果店的小孩一样,迫不及待想开始实验了。

在第 3 章"开启你的 LlamaIndex 之旅"中,我们将亲手编写第一个 LlamaIndex 程序。真正有趣的部分就从这里开始!我会一路用简单的话解释每个概念和每一行代码。很快,你就会像 LlamaIndex 专家一样实现基础功能!一旦掌握这些基础,我们就可以开始扩展应用能力。

不过首先,让我们先弄清楚这个框架 GitHub 仓库的整体代码结构。

熟悉 LlamaIndex 代码仓库的结构

因为你可能会花很多时间浏览 LlamaIndex 框架的官方代码仓库,所以对它的总体结构有一个整体印象会很有帮助。你随时可以在这里查看该仓库:

github.com/run-llama/l...

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

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

图 2.5 ------ LlamaIndex GitHub 仓库代码结构

llama-index-core 文件夹是 LlamaIndex 的基础包,使开发者能够安装核心框架,然后从 300 多个集成包和不同的 Llama packs 中选择性添加内容,以便为特定应用需求定制功能。

LlamaIndex 的 llama-index-integrations 文件夹由各种附加包组成,用来扩展核心框架的功能。这些包允许开发者使用特定元素来定制自己的构建,例如自定义 LLM、数据加载器、嵌入模型和向量存储提供商,从而最大程度适配应用需求。我们将在本书后面介绍其中一些集成,从第 4 章"将数据摄取到我们的 RAG 工作流中"开始。

llama-index-packs 文件夹包含 50 多个 Llama packs。这些包由 LlamaIndex 开发者社区开发并持续改进,作为现成模板,帮助用户快速启动自己的应用。

llama-index-cli 文件夹由 LlamaIndex 命令行界面使用,我们也将在第 11 章"定制和部署我们的 LlamaIndex 项目"中简要介绍。

最后一个部分,在图 2.5 中称为 OTHERS,由两个文件夹组成,目前包含微调抽象和一些实验性功能,本书不会覆盖这些内容。

llama-index-integrationsllama-index-packs 中的子文件夹代表单独的包。文件夹名称与包名称对应。例如,llama-index-integrations/llms/llama-index-llms-mistralai 文件夹对应的是 llama-index-llms-mistralai PyPI 包。

按照这个例子,在你像下面这样在代码中导入并使用 mistralai 包之前:

javascript 复制代码
from llama_index.llms.mistralai import MistralAI

你必须先运行下面的命令安装对应的 PyPI 包:

复制代码
pip install llama-index.llms.mistralai

不用太担心本书示例中会缺少任何必要包,因为你会在每一章开头的"技术要求"部分看到它们被清楚地列出来。

总结

在本章中,我们介绍了 LlamaIndex,这是一个用于将 LLM 连接到外部数据集的框架。我们了解到,LlamaIndex 如何让 LLM 将真实世界知识纳入其回答中。本章说明了 RAG 和微调并不是互斥的,而是在生产系统中经常互补使用;同时也讨论了 LlamaIndex 相比微调的优势,例如更容易更新和个性化,并探索了 LoRA 和知识蒸馏等替代方法。我们强调了 LlamaIndex 的双层设计:它既提供用于快速开发的开箱即用函数,也提供适合高级使用场景的可定制组件。我们还简要介绍了 LlamaIndex 生态系统的模块化结构,这种结构使针对特定使用场景定制和优化解决方案变得很容易。

最后,我们介绍了我们的实战项目:Contract Review Expert,一个简单但非常有用的合同审查应用。最后几节介绍了如何设置所需工具,例如 Python、Git、Streamlit 和 Ollama,并验证我们的环境已经准备好,可以构建 LlamaIndex 应用。现在,我们已经准备好继续旅程,并进一步从技术层面理解 LlamaIndex 框架的内部工作机制。下一章见!

相关推荐
dong_junshuai10 分钟前
每天一个开源项目#99 OpenResearch:2.2K星的本地研究Agent工作台
开源·github·agent
花椒技术20 分钟前
把 AI 视频接进直播:提前生成、按次生成、持续生成怎么选?
agent·音视频开发
用户80825986668725 分钟前
用 LangGraph 重写自己手写的 Agent:框架替你解决了什么,什么它不管
agent
能不能静下心来看26 分钟前
从 RAG 到 Agent:跑通两个 Demo 后,我终于分清了这两个词
agent
ZGi.ai33 分钟前
知识库权限变了,怎样避免答错?
agent·权限管理·知识库·工作流·zgi·客服运营
大模型真好玩1 小时前
DeepSeek Harness 入门很简单(四)——DeepSeek Harness接入插件
人工智能·agent·deepseek
掰头战士1 小时前
MCP、Skill、Plugin,都是给agent拓展能力,到底有何区别?
typescript·llm·agent
嘟嘟嘟95272 小时前
AI Agent 的边缘困境
人工智能·架构·agent
HYDtomako2 小时前
Agent checkpoint设计
ai·agent·checkpoint·claude code
梦在远山后3 小时前
从需求到架构:我的企业研发 Agent 整体设计
langchain·agent