文章目录
- 关于 LlamaIndex
- 🚀 为什么要进行上下文增强?
- 🦙 为什么使用 LlamaIndex 进行上下文增强?
- 👨👩👧👦 LlamaIndex 适合谁?
- 入门
- 🗺️生态系统
- 社区
- 相关项目
- 高级概念
- 检索增强生成 (RAG)
- RAG 中的阶段
- 每个步骤中的重要概念
- 装载阶段
- 索引阶段
- 查询阶段
- 把它们放在一起
- 安装和设置
- 从 Pip 快速开始安装
- 重要提示:OpenAI 环境设置
- 从 Pip 进行自定义安装
- 从源安装
- 如何阅读这些文档
- 在你开始之前
- 这些文档的结构
- 入门教程 (OpenAI)
- 下载数据
- 设置您的 OpenAI API 密钥
- 加载数据并建立索引
- 查询您的数据
- 使用日志记录查看查询和事件
- 存储您的索引
- 入门教程(本地型号)
- 下载数据
- 设置
- 加载数据并建立索引
- 查询您的数据
- 探索 LlamaIndex 视频系列
- 自下而上的开发(Llama Docs Bot)
- SubQuestionQueryEngine + 10K 分析
- 不和谐文档管理
- 联合文本到 SQL 和语义搜索
- 常见问题 (FAQ)
- “我想将我的文档解析成更小的块”
- “我想使用不同的矢量存储”
- “我想在查询时检索更多上下文”
- “我想使用不同的LLM ”
- “我想使用不同的响应模式”
- “我想将响应流式传输回来”
- “我想要一个聊天机器人而不是问答”
- 下一步
- 入门工具
- create-llama:全栈 Web 应用程序生成器
- SEC 见解:高级查询技术
- Chat LlamaIndex:全栈聊天应用程序
- LlamaBot:Slack 和 Discord 应用程序
- RAG CLI:与任何文档进行快速命令行聊天
- RAG命令行界面
- 设置
- 用法
- 创建 LlamaIndex 聊天应用程序
- 支持的文件类型
- 定制化
本文翻译整理自:https://docs.llamaindex.ai/en/stable/
关于 LlamaIndex
LlamaIndex 是一个基于LLM的应用程序的数据框架,该应用程序受益于上下文增强。
这种LLM系统被称为RAG系统,代表“检索增强生成”。
LlamaIndex 提供了必要的抽象,可以更轻松地摄取、构建和访问私有或特定领域的数据,以便将这些数据安全可靠地注入 LLM 中,以实现更准确的文本生成。
它可以在 Python(这些文档)和Typescript中使用。
提示 : 更新到 LlamaIndex v0.10.0?查看迁移指南。
🚀 为什么要进行上下文增强?
LLM 在人类和数据之间提供自然语言界面。
广泛可用的模型是 根据大量公开数据(如维基百科、邮件列表、教科书、源代码等)进行预训练的。
然而,虽然LLM 接受了大量数据的训练,但他们并没有接受您的数据的训练,这些数据可能是私有的或特定于您试图解决的问题。
它隐藏在 API 后面、SQL 数据库中,或者隐藏在 PDF 和幻灯片中。
您可以选择用您的数据微调LLM,但是:
- 训练LLM 的费用很高。
- 由于训练成本的原因,很难用最新信息更新LLM 。
- 缺乏可观察性。
当你向LLM 提出问题时,LLM 是如何得出答案的并不明显。
我们可以使用一种称为检索增强生成 (RAG)的上下文增强模式,来获得与您的特定数据相关的更准确的文本生成,而不是进行微调。
RAG 涉及以下高级步骤:
- 首先从数据源检索信息,
- 将其作为上下文添加到您的问题中,并且
- 请LLM 根据丰富的提示进行回答。
通过这样做,RAG 克服了微调方法的所有三个弱点:
- 无需训练,因此价格便宜。
- 仅当您请求时才会获取数据,因此数据始终是最新的。
- LlamaIndex可以向您显示检索到的文档,因此更值得信赖。
🦙 为什么使用 LlamaIndex 进行上下文增强?
首先,LlamaIndex 对您如何使用 LLM 没有任何限制。
您仍然可以将 LLM 用作自动完成、聊天机器人、半自主代理等。
它只会让LLM 与您更相关。
LlamaIndex 提供以下工具来帮助您快速建立可用于生产的 RAG 系统:
- 数据连接器从其本机源和格式获取现有数据。
这些可以是 API、PDF、SQL 等等。 - 数据索引以中间表示形式构建数据,这些中间表示形式对于LLM 来说既简单又高效。
- 引擎提供对数据的自然语言访问。
例如: - 查询引擎是用于知识增强输出的强大检索接口。
- 聊天引擎是用于与数据进行多消息、“来回”交互的对话界面。
- 数据代理是由 LLM 提供支持的知识工作者,并通过工具进行增强,从简单的辅助函数到 API 集成等。
- 应用程序集成将 LlamaIndex 重新融入生态系统的其余部分。
这可以是 LangChain、Flask、Docker、ChatGPT,或者……其他任何东西!
👨👩👧👦 LlamaIndex 适合谁?
LlamaIndex 为初学者、高级用户以及介于两者之间的每个人提供工具。
我们的高级 API 允许初学者使用 LlamaIndex 通过 5 行代码获取和查询他们的数据。
对于更复杂的应用程序,我们的较低级别 API 允许高级用户自定义和扩展任何模块(数据连接器、索引、检索器、查询引擎、重新排名模块)以满足他们的需求。
入门
要安装该库:
pip install llama-index
我们建议从如何阅读这些文档开始,这将根据您的经验水平为您指明正确的位置。
🗺️生态系统
要下载或贡献,请在以下位置找到 LlamaIndex:
- Github
- PyPi
- npm (Typescript/Javascript):
- LlamaIndex.TS Github
- TypeScript Docs
- LlamaIndex.TS
社区
需要帮忙?有功能建议吗?加入 LlamaIndex 社区:
- twitter : https://twitter.com/llama_index
- discord:https://discord.gg/dGcwcsnxhU
相关项目
- 🏡 LlamaHub |大量(且不断增长!)的自定义数据连接器集合
- SEC Insights|由 LlamaIndex 支持的金融研究应用程序
- 创建 llama|用于快速搭建 LlamaIndex 项目的 CLI 工具
高级概念
这是构建 LLM 应用程序时经常遇到的高级概念的快速指南。
提示:如果还没有,请在阅读本文之前安装 LlamaIndex 并完成 入门教程。
它将有助于将这些步骤融入您的经验中。
检索增强生成 (RAG)
LLM 接受过大量数据的训练,但他们没有接受过您的数据的训练。
检索增强生成 (RAG) 通过将您的数据添加到LLM 已经有权访问的数据中来解决这个问题。
您将在本文档中经常看到对 RAG 的引用。
在 RAG 中,您的数据已加载并准备好用于查询或“索引”。
用户查询作用于索引,索引将数据过滤到最相关的上下文。
然后,此上下文和您的查询连同提示一起转到LLM ,LLM 会提供响应。
即使您正在构建的是聊天机器人或代理,您也会想了解将数据导入应用程序的 RAG 技术。
RAG 中的阶段
RAG 中有五个关键阶段,这将成为您构建的任何大型应用程序的一部分。
这些是:
- 加载:这是指将数据从其所在位置(无论是文本文件、PDF、其他网站、数据库还是 API)获取到您的管道中。
LlamaHub提供数百种连接器可供选择。 - 索引:这意味着创建一个允许查询数据的数据结构。
对于LLM 来说,这几乎总是意味着创建vector embeddings
数据含义的数字表示,以及许多其他元数据策略,以便轻松准确地找到上下文相关的数据。 - 存储:一旦数据被索引,您几乎总是希望存储索引以及其他元数据,以避免重新索引。
- 查询:对于任何给定的索引策略,您可以通过多种方式利用 LLM 和 LlamaIndex 数据结构进行查询,包括子查询、多步查询和混合策略。
- 评估:任何管道中的关键步骤是检查它相对于其他策略的有效性,或者何时进行更改。
评估提供客观衡量您对查询的答复的准确性、忠实度和速度的程度。
每个步骤中的重要概念
您还会遇到一些术语,它们指的是每个阶段中的步骤。
装载阶段
节点和文档:ADocument
是任何数据源的容器 - 例如 PDF、API 输出或从数据库检索数据。
ANode
是 LlamaIndex 中数据的原子单位,表示源的“块”Document
。
节点具有将它们与它们所在的文档以及其他节点相关联的元数据。
连接器:数据连接器(通常称为 aReader
)将来自不同数据源和数据格式的数据摄取到Documents
和Nodes
。
索引阶段
索引:获取数据后,LlamaIndex 将帮助您将数据索引到易于检索的结构中。
这通常涉及生成vector embeddings
存储在称为vector store
。索引还可以存储有关数据的各种元数据。
嵌入LLM 生成称为 的数据的数字表示embeddings
。
在过滤数据的相关性时,LlamaIndex 会将查询转换为嵌入,并且您的向量存储将查找在数字上与查询的嵌入相似的数据。
查询阶段
检索器:检索器定义在给定查询时如何从索引有效检索相关上下文。
您的检索策略对于检索数据的相关性和检索效率至关重要。
路由器:路由器确定将使用哪个检索器从知识库中检索相关上下文。
更具体地说,该类RouterRetriever
负责选择一个或多个候选检索器来执行查询。
他们使用选择器根据每个候选人的元数据和查询来选择最佳选项。
节点后处理器:节点后处理器接收一组检索到的节点并对它们应用转换、过滤或重新排序逻辑。
响应合成器:响应合成器使用用户查询和给定的一组检索到的文本块从 LLM 生成响应。
把它们放在一起
有数据支持的 LLM 应用程序有无数的用例,但它们可以大致分为三类:
查询引擎:查询引擎是一个端到端管道,允许您对数据提出问题。
它接受自然语言查询,并返回响应,以及检索并传递给LLM 的参考上下文。
聊天引擎:聊天引擎是一个端到端的管道,用于与您的数据进行对话(多次来回而不是单个问答)。
代理:代理是由LLM 提供支持的自动化决策者,通过一组工具与世界进行交互。
代理可以采取任意数量的步骤来完成给定的任务,动态地决定最佳的行动方案,而不是遵循预先确定的步骤。
这赋予它额外的灵活性来处理更复杂的任务。
提示
- 告诉我如何定制东西
- 通过我们理解的 LlamaIndex指南继续学习
- 准备好深入挖掘了吗?查看组件指南
安装和设置
LlamaIndex 生态系统是使用命名空间包的集合构建的。
这对用户来说意味着 LlamaIndex 附带一个核心入门包,并且可以根据需要安装其他集成。
我们的临时注册表中提供了软件包和可用集成的完整列表,该注册表很快就会转移到LlamaHub!
从 Pip 快速开始安装
要快速开始,您可以安装:
pip install llama-index
这是一个入门包,包含
llama-index-core
llama-index-legacy # temporarily included
llama-index-llms-openai
llama-index-embeddings-openai
llama-index-program-openai
llama-index-question-gen-openai
llama-index-agent-openai
llama-index-readers-file
llama-index-multi-modal-llms-openai
注意: LlamaIndex 可能会下载并存储各种软件包的本地文件(NLTK、HuggingFace 等)。
使用环境变量 LLAMA_INDEX_CACHE_DIR
来控制这些文件的保存位置。
重要提示:OpenAI 环境设置
默认情况下,我们使用 OpenAIgpt-3.5-turbo
模型进行文本生成以及text-embedding-ada-002
检索和嵌入。
为了使用它,您必须将 OPENAI_API_KEY 设置为环境变量。
您可以通过登录您的 OpenAI 帐户并创建新的 API 密钥来获取 API 密钥。
提示:您还可以使用许多其他可用的LLM 之一。
您可能需要额外的环境密钥 + 令牌设置,具体取决于 LLM 提供商。
查看我们的 OpenAI 入门示例 : https://docs.llamaindex.ai/en/stable/getting_started/starter_example/
从 Pip 进行自定义安装
如果您不使用 OpenAI,或者想要更具选择性的安装,您可以根据需要安装单独的软件包。
例如,对于具有 Ollama 和 HuggingFace 嵌入的本地设置,安装可能如下所示:
pip install llama-index-core llama-index-readers-file llama-index-llms-ollama llama-index-embeddings-huggingface
- 查看我们的本地模型入门示例
- 此处提供了使用和配置LLM 的完整指南。
- 此处提供了使用和配置嵌入模型的完整指南。
从源安装
Git 克隆此存储库,然后执行以下操作:
git clone https://github.com/jerryjliu/llama_index.git
- 安装 poetry - 这将帮助您管理包依赖项
poetry shell
- 此命令创建一个虚拟环境,该环境将已安装的软件包包含在该项目中poetry install
- 这将安装核心入门包要求- (可选)
poetry install --with dev, docs
-这将安装大多数本地开发所需的所有依赖项
从那里,您可以根据需要使用 来安装集成pip
,例如:
pip install -e llama-index-integrations/llms/llama-index-llms-ollama
如何阅读这些文档
欢迎来到 LlamaIndex 文档!无论您在 LlamaIndex、LLM 和生成式 AI 方面的经验水平如何,我们都尽力使这些文档变得平易近人。
在你开始之前
LlamaIndex 是一个 Python 库,因此您应该安装Python并且对如何编写它有基本的了解。
如果您更喜欢 JavaScript,我们建议您尝试我们的TypeScript 包。
我们的许多示例都被格式化为Notebook,即 Jupyter 风格的Notebook。
您不必安装 Jupyter;您可以在Google Colab等托管服务上尝试我们的大多数示例。
这些文档的结构
我们的文档是结构化的,因此您只需向下移动左侧的侧边栏,或者只需点击每个页面底部的“下一个”链接,就可以大致了解进度。
- 入门: 您现在所在的部分。
我们可以帮助您摆脱对 LlamaIndex 和 LLM 的一无所知。
安装该库 , 用五行代码编写您的第一个演示,了解有关LLM 应用程序的高级概念的更多信息,然后了解如何自定义五行示例来满足您的需求。 - 学习: 完成入门部分后,这是下一个要去的地方。
在一系列简短的教程中,我们将引导您完成构建生产 LlamaIndex 应用程序的每个阶段,并帮助您总体上提高图书馆和LLM 的概念。 - 用例: 如果您是一名开发人员,试图弄清楚 LlamaIndex 是否适合您的用例,我们概述了您可以构建的事物类型。
- 示例: 我们为几乎所有功能提供了丰富的Notebook示例。
探索这些内容以查找和了解有关 LlamaIndex 的新内容。 - 高级: 已经有了一个可用的 LlamaIndex 应用程序并希望进一步完善它?
我们的高级部分将引导您完成您应该尝试优化的第一件事,例如通过逐渐更复杂和微妙的自定义来优化您的模型,例如嵌入模型和块大小。 - 组件指南: 按照与我们的理解部分构建 LLM 申请相同的顺序排列,这些是关于 LlamaIndex 各个组件以及如何使用它们的全面、较低级别的指南。
入门教程 (OpenAI)
这是我们著名的使用 OpenAI 的“5 行代码”入门示例。
提示:想使用本地模型吗?如果您想仅使用本地模型来完成我们的入门教程,请查看:
https://docs.llamaindex.ai/en/stable/getting_started/starter_example_local/。
下载数据
此示例使用 Paul Graham 的文章 “What I Worked On”的文本。
这个和许多其他示例可以在examples
我们的存储库文件夹中找到。
获取它的最简单方法是通过此链接下载它并将其保存在名为 的文件夹中data
。
设置您的 OpenAI API 密钥
gpt-3.5-turbo
LlamaIndex默认使用 OpenAI 。
通过将 API 密钥设置为环境变量,确保您的代码可使用您的 API 密钥。
在 MacOS 和 Linux 中,命令如下:
export OPENAI_API_KEY=XXXXX
在 Windows 上是
set OPENAI_API_KEY=XXXXX
加载数据并建立索引
在创建data
文件夹的同一文件夹中,创建一个名为starter.py
file 的文件,其中包含以下内容:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
这会在文件夹中的文档上构建索引data
(在本例中仅包含论文文本,但可能包含许多文档)。
您的目录结构应如下所示:
├── 启动器.py
└── 数据
└── paul_graham_essay.txt
查询您的数据
将以下行添加到starter.py
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
print(response)
这将创建一个针对索引的问答引擎并提出一个简单的问题。
您应该得到类似于以下内容的响应:The author wrote short stories and tried to program on an IBM 1401.
使用日志记录查看查询和事件
想看看幕后发生了什么吗?让我们添加一些日志记录。
将这些行添加到顶部starter.py
:
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
您可以将级别设置DEBUG
为详细输出,或使用level=logging.INFO
较少的输出。
存储您的索引
默认情况下,刚刚加载的数据作为一系列向量嵌入存储在内存中。
您可以通过将嵌入保存到磁盘来节省时间(以及对 OpenAI 的请求)。
这可以用这一行来完成:
index.storage_context.persist()
默认情况下,这会将数据保存到目录中storage
,但您可以通过传递参数来更改它persist_dir
。
当然,除非加载数据,否则您无法获得持久化的好处。
因此,让我们修改starter.py
为生成并存储索引(如果不存在),但如果存在则加载它:
import os.path
from llama_index.core import (
VectorStoreIndex,
SimpleDirectoryReader,
StorageContext,
load_index_from_storage,
)
# check if storage already exists
PERSIST_DIR = "./storage"
if not os.path.exists(PERSIST_DIR):
# load the documents and create the index
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
# store it for later
index.storage_context.persist(persist_dir=PERSIST_DIR)
else:
# load the existing index
storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)
index = load_index_from_storage(storage_context)
# Either way we can now query the index
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
print(response)
现在您可以高效地随心所欲地查询了!但这只是 LlamaIndex 功能的开始。
提示
- 了解有关高级概念的更多信息。
- 告诉我如何定制东西。
- 对特定模块感到好奇吗?查看组件指南。
入门教程(本地型号)
提示:确保您首先遵循了自定义安装步骤
。
这是我们著名的 “5行代码”入门示例,其中包含本地 LLM 和嵌入模型。
我们将使用BAAI/bge-small-en-v1.5
作为我们的嵌入模型,并通过Ollama
调用 Mistral-7B
来服务。
下载数据
此示例使用 Paul Graham 的文章 “What I Worked On”的文本。
这个和许多其他示例可以在examples
我们的存储库文件夹中找到。
获取它的最简单方法是通过此链接下载它,并将其保存在名为 的文件夹中data
。
设置
Ollama 是一个帮助您在本地设置 LLM 的工具(目前在 OSX 和 Linux 上受支持。
您可以通过 WSL 2 在 Windows 上安装 Ollama)。
请按照自述文件了解如何安装它。
要加载 Mistral-7B 模型,只需执行以下操作ollama pull mistral
。
注意:您需要一台至少有 32GB RAM 的机器。
加载数据并建立索引
在创建data
文件夹的同一文件夹中,创建一个名为starter.py
file 的文件,其中包含以下内容:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.core.embeddings import resolve_embed_model
from llama_index.llms.ollama import Ollama
documents = SimpleDirectoryReader("data").load_data()
# bge embedding model
Settings.embed_model = resolve_embed_model("local:BAAI/bge-small-en-v1.5")
# ollama
Settings.llm = Ollama(model="mistral", request_timeout=30.0)
index = VectorStoreIndex.from_documents(
documents,
)
这会在文件夹中的文档上构建索引data
(在本例中仅包含论文文本,但可能包含许多文档)。
您的目录结构应如下所示:
├── 启动器.py
└── 数据
└── paul_graham_essay.txt
我们通过 resolve_embed_model
使用BAAI/bge-small-en-v1.5
模型 ,它解析为我们的 HuggingFaceEmbedding 类。
我们还使用Ollama
LLM 包装器加载 Mistra 模型。
查询您的数据
将以下行添加到starter.py
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
print(response)
这将创建一个针对索引的问答引擎并提出一个简单的问题。
您应该得到类似于以下内容的响应:The author wrote short stories and tried to program on an IBM 1401.
您可以查看日志、保留/加载索引,类似于我们的入门示例。
提示
- 了解有关高级概念的更多信息。
- 告诉我如何定制东西。
- 对特定模块感到好奇吗?查看组件指南。
探索 LlamaIndex 视频系列
如果您喜欢通过视频学习,现在是查看我们的“Discover LlamaIndex”系列的好时机。
如果没有,我们建议继续学习我们的了解 LlamaIndex教程。
自下而上的开发(Llama Docs Bot)
这是 Discover LlamaIndex 中的一个子系列,向您展示如何从头开始构建文档聊天机器人。
我们向您展示如何以“自下而上”的方式执行此操作 - 首先使用 LLM 和数据对象作为独立模块。
然后逐渐添加更高级别的抽象,例如索引和高级检索器/重新排序器。
完整仓库 [第 1 部分] LLM 和提示 [第 2 部分] 文档和元数据 [第 3 部分] 评估 [第 4 部分] 嵌入 [第 5 部分] 检索器和后处理器
SubQuestionQueryEngine + 10K 分析
该视频介绍了SubQuestionQueryEngine
如何将其应用于财务文档,以帮助将复杂的查询分解为多个子问题。
- YouTube
- Notebook
不和谐文档管理
该视频介绍了如何管理不断更新的源(即 Discord)中的文档,以及如何避免文档重复并保存嵌入令牌。
- YouTube
- Notebook和补充材料
- 参考文档
联合文本到 SQL 和语义搜索
该视频介绍了 LlamaIndex 中内置的工具,用于将 SQL 和语义搜索组合到单个统一的查询界面中。
- YouTube
- Notebook
常见问题 (FAQ)
在本节中,我们从您为入门示例编写的代码开始,并向您展示您可能希望根据您的用例自定义它的最常见方法:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
print(response)
“我想将我的文档解析成更小的块”
# Global settings
from llama_index.core import Settings
Settings.chunk_size = 512
# Local settings
from llama_index.core.node_parser import SentenceSplitter
index = VectorStoreIndex.from_documents(
documents, transformations=[SentenceSplitter(chunk_size=512)]
)
“我想使用不同的矢量存储”
首先,您可以安装要使用的矢量存储。
例如,要使用 Chroma 作为矢量存储,您可以使用 pip 安装它:
pip install llama-index-vector-stores-chroma
要了解有关所有可用集成的更多信息,请查看LlamaHub。
然后,您可以在代码中使用它:
import chromadb
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext
chroma_client = chromadb.PersistentClient()
chroma_collection = chroma_client.create_collection("quickstart")
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
StorageContext
定义存储文档、嵌入和索引的存储后端。
您可以了解有关存储以及如何自定义存储的更多信息。
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(
documents, storage_context=storage_context
)
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
print(response)
“我想在查询时检索更多上下文”
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(similarity_top_k=5)
response = query_engine.query("What did the author do growing up?")
print(response)
as_query_engine
在索引之上 创建一个默认的retriever
和query engine
。
您可以通过传入关键字参数来配置检索器和查询引擎。
在这里,我们将检索器配置为 返回前 5 个最相似的文档(而不是默认的 2 个)。
您可以了解有关检索器 和 查询引擎的更多信息。
“我想使用不同的LLM ”
# Global settings
from llama_index.core import Settings
from llama_index.llms.ollama import Ollama
Settings.llm = Ollama(model="mistral", request_timeout=60.0)
# Local settings
index.as_query_engine(llm=Ollama(model="mistral", request_timeout=60.0))
您可以了解有关定制LLM 的更多信息。
“我想使用不同的响应模式”
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(response_mode="tree_summarize")
response = query_engine.query("What did the author do growing up?")
print(response)
您可以了解有关查询引擎和响应模式的更多信息。
“我想将响应流式传输回来”
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(streaming=True)
response = query_engine.query("What did the author do growing up?")
response.print_response_stream()
您可以了解有关流式响应的更多信息。
“我想要一个聊天机器人而不是问答”
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_chat_engine()
response = query_engine.chat("What did the author do growing up?")
print(response)
response = query_engine.chat("Oh interesting, tell me more.")
print(response)
了解有关聊天引擎的更多信息。
下一步
- 想要彻底了解(几乎)您可以配置的所有内容吗?开始了解 LlamaIndex。
- 想要更深入地了解具体模块?查看组件指南。
入门工具
我们创建了各种开源工具来帮助您启动生成式人工智能项目。
create-llama:全栈 Web 应用程序生成器
该create-llama
工具是一个 CLI 工具,可帮助您创建全栈 Web 应用程序,并选择前端和后端来索引您的文档并允许您与它们聊天。
运行它就像运行一样简单:
npx create-llama@latest
有关完整文档,请查看npm 上的 create-llama 自述文件。
SEC 见解:高级查询技术
索引和查询财务文件是生成人工智能的一个非常常见的用例。
为了帮助您入门,我们创建并开源了一个全栈应用程序,让您可以选择上市公司多年来的文件,并对它们进行总结和比较。
它使用先进的查询和检索技术来获得高质量的结果。
您可以在SECinsights.ai上自行使用该应用程序或查看GitHub上的代码。
Chat LlamaIndex:全栈聊天应用程序
Chat LlamaIndex 是另一个全栈开源应用程序,具有多种交互模式,包括流式聊天和图像多模式查询。
这是了解高级聊天应用技术的好方法。
您可以在chat.llamaindex.ai使用它或查看GitHub上的代码。
LlamaBot:Slack 和 Discord 应用程序
LlamaBot 是另一个开源应用程序,这次用于构建 Slack 机器人,该机器人可以侦听组织内的消息并回答有关正在发生的情况的问题。
您可以查看[GitHub 上的完整教程和代码]https://github.com/run-llama/llamabot)。
如果您更喜欢 Discord,可以选择社区贡献的 Discord 版本。
RAG CLI:与任何文档进行快速命令行聊天
我们提供了一个命令行工具,可让您快速与文档聊天。
请参阅RAG CLI 文档了解更多信息。
RAG命令行界面
一种常见的用例是与LLM 讨论您本地保存在计算机上的文件。
我们编写了一个 CLI 工具来帮助您做到这一点!您可以将 rag CLI 工具指向您在本地保存的一组文件,它会将这些文件提取到本地矢量数据库中,然后用于终端内的聊天问答 repl。
默认情况下,该工具使用 OpenAI 进行嵌入和 LLM 以及本地 Chroma Vector DB 实例。
警告:这意味着,默认情况下,您使用此工具摄取的本地数据将发送到 OpenAI 的 API。
但是,您确实可以自定义此工具中使用的模型和数据库。
这包括在本地运行所有模型执行的可能性!请参阅下面的自定义部分。
设置
要设置 CLI 工具,请确保您已安装该库:
$ pip install -U llama-index
您还需要安装Chroma:
$ pip install -U chromadb
之后,您可以开始使用该工具:
$ llamaindex-cli rag -h
usage: llamaindex-cli rag [-h] [-q QUESTION] [-f FILES] [-c] [-v] [--clear] [--create-llama]
options:
-h, --help show this help message and exit
-q QUESTION, --question QUESTION
The question you want to ask.
-f FILES, --files FILES
The name of the file or directory you want to ask a question about,such as "file.pdf".
-c, --chat If flag is present, opens a chat REPL.
-v, --verbose Whether to print out verbose information during execution.
--clear Clears out all currently embedded data.
--create-llama Create a LlamaIndex application based on the selected files.
用法
以下是一些帮助您入门的高级步骤:
- 设置
OPENAI_API_KEY
环境变量:
默认情况下,该工具使用OpenAI的API。
因此,
OPENAI_API_KEY
无论何时使用该工具 ,您都需要确保在环境变量下设置 OpenAI API 密钥。
$ export OPENAI_API_KEY=<api_key>
- 提取一些文件:
现在,您需要将工具指向一些可以提取到本地矢量数据库中的本地文件。
在此示例中,我们将提取 LlamaIndex
README.md
文件:
$ llamaindex-cli rag --files "./README.md"
您还可以指定文件 glob 模式,例如:
$ llamaindex-cli rag --files "./docs/**/*.rst"
- 提出问题
您现在可以开始询问有关您在上一步中获取的任何文档的问题:
$ llamaindex-cli rag --question "What is LlamaIndex?"
LlamaIndex is a data framework that helps in ingesting, structuring, and accessing private or domain-specific data for LLM-based applications. It provides tools such as data connectors to ingest data from various sources, data indexes to structure the data, and engines for natural language access to the data. LlamaIndex follows a Retrieval-Augmented Generation (RAG) approach, where it retrieves information from data sources, adds it to the question as context, and then asks the LLM to generate an answer based on the enriched prompt. This approach overcomes the limitations of fine-tuning LLMs and provides a more cost-effective, up-to-date, and trustworthy solution for data augmentation. LlamaIndex is designed for both beginner and advanced users, with a high-level API for easy usage and lower-level APIs for customization and extension.
- 打开聊天 REPL:您甚至可以在终端中打开聊天界面!只需运行
$ llamaindex-cli rag --chat
并开始询问有关您所摄取的文件的问题即可。
创建 LlamaIndex 聊天应用程序
您还可以根据您选择的文件创建具有 FastAPI 后端和 NextJS 前端的全栈聊天应用程序。
要引导应用程序,请确保您的计算机上安装了 NodeJS 和 npx。
如果没有,请参阅LlamaIndex.TS文档以获取说明。
一旦完成所有设置,创建新应用程序就很容易了。
只需运行以下命令:
$ llamaindex-cli rag --create-llama
它将调用我们的create-llama
工具,因此您需要提供几条信息来创建应用程序。
您可以在npmjs - create-llamacreate-llama
上找到更多信息
❯ llamaindex-cli rag --create-llama
Calling create-llama using data from /tmp/rag-data/...
✔ What is your project named? … my-app
✔ Which model would you like to use? › gpt-3.5-turbo
✔ Please provide your OpenAI API key (leave blank to skip): …
? How would you like to proceed? › - Use arrow-keys. Return to submit.
Just generate code (~1 sec)
Generate code and install dependencies (~2 min)
❯ Generate code, install dependencies, and run the app (~2 min)
...
如果您选择该选项Generate code, install dependencies, and run the app (~2 min)
,将安装所有依赖项并且应用程序将自动运行。
然后,您可以通过以下地址访问该应用程序: http://localhost:3000 。
支持的文件类型
在内部,rag
CLI 工具使用SimpleDirectoryReader 将本地文件系统中的原始文件解析为字符串。
该模块具有适用于各种文件类型的自定义阅读器。
其中一些可能需要您pip install
使用解析该特定文件类型所需的另一个模块。
如果遇到SimpleDirectoryReader
没有自定义读取器的文件扩展名的文件类型,它只会将该文件作为纯文本文件读取。
请参阅下一节,了解有关如何添加您自己的自定义文件阅读器 + 自定义 CLI 工具其他方面的信息!
定制化
CLI 工具rag
是高度可定制的。
该工具通过在 RagCLI
模块内组合IngestionPipeline
和 QueryPipeline
模块来提供支持。
要创建您自己的自定义 rag CLI 工具,您只需创建一个脚本,RagCLI
用您自己配置的IngestionPipeline
&实例化该类。
QueryPipeline
从那里,您可以简单地rag_cli_instance.cli()
在脚本中运行,以针对您自己选择的嵌入模型、LLM、矢量数据库等运行相同的摄取和问答命令。
以下是一些显示一般设置的高级代码:
#!/path/to/your/virtualenv/bin/python
import os
from llama_index.core.ingestion import IngestionPipeline, IngestionCache
from llama_index.core.query_pipeline import QueryPipeline
from llama_index.core.storage.docstore import SimpleDocumentStore
from llama_index.cli.rag import RagCLI
# optional, set any API keys your script may need (perhaps using python-dotenv library instead)
os.environ["OPENAI_API_KEY"] = "sk-xxx"
docstore = SimpleDocumentStore()
vec_store = ... # your vector store instance
llm = ... # your LLM instance - optional, will default to OpenAI gpt-3.5-turbo
custom_ingestion_pipeline = IngestionPipeline(
transformations=[...],
vector_store=vec_store,
docstore=docstore,
cache=IngestionCache(),
)
# Setting up the custom QueryPipeline is optional!
# You can still customize the vector store, LLM, and ingestion transformations without
# having to customize the QueryPipeline
custom_query_pipeline = QueryPipeline()
custom_query_pipeline.add_modules(...)
custom_query_pipeline.add_link(...)
# you can optionally specify your own custom readers to support additional file types.
file_extractor = {".html": ...}
rag_cli_instance = RagCLI(
ingestion_pipeline=custom_ingestion_pipeline,
llm=llm, # optional
query_pipeline=custom_query_pipeline, # optional
file_extractor=file_extractor, # optional
)
if __name__ == "__main__":
rag_cli_instance.cli()
从那里,您只需几步即可使用自定义 CLI 脚本:
- 确保将顶部的 python 路径替换为您的虚拟环境正在使用的路径*(
$ which python
在激活虚拟环境时运行)* - 假设您将文件保存在
/path/to/your/script/my_rag_cli.py
。
从那里,您可以使用诸如 之类的行简单地修改 shell 的配置文件*(如.bashrc
或.zshrc
)*$ export PATH="/path/to/your/script:$PATH"
。 - 之后
$ chmod +x my_rag_cli.py
执行该文件的可执行权限。 - 就是这样!您现在只需打开一个新的终端会话并运行
$ my_rag_cli.py -h
.您现在可以使用相同的参数但使用自定义代码配置来运行脚本! - 注意:如果您只想运行命令,则可以
.py
从文件中删除文件扩展名my_rag_cli.py``$ my_rag_cli --chat
2024-04-14(日)