共计 3478 个字符,预计需要花费 9 分钟才能阅读完成。
“能够将 LlamaIndex 视为内部数据和 LLM 连贯在一起的黑匣子。”在 Zilliz 组织的网络研讨会中,LlamaIndex 的联结创始人兼首席执行官 Jerry Liu 曾这样说道。
对于 Jerry Liu 的这个比喻,相熟 LLMs 的开发者会感觉颇为贴切,尤其是对于那些想要用公有数据要训练本人大模型的开发者而言,LlamaIndex 相对是晋升大模型性能,让其更加易用、晦涩的不二抉择。
为了不便更多开发者理解和应用 LlamaIndex,咱们明天将从概念谈起,着重介绍它的索引局部及应用办法。
什么是 LlamaIndex?
在应用 LLMs 的过程中,开发者往往会遇到诸多挑战,例如 LLM 不足特定畛域的常识。为此,咱们引入了 CVP Stack,以便将不同畛域的常识注入 LLM 利用之中。和 CVP Stack 一样,LlamaIndex 通过注入数据来帮忙解决 LLM 对特定畛域认知有余的状况。能够说,LlamaIndex 是开发者和 LLM 交互的一种工具。LlamaIndex 接管输出数据并为其构建索引,随后会应用该索引来答复与输出数据相干的任何问题。不止如此,LlamaIndex 还能够依据手头的工作构建许多类型的索引,例如向量索引、树索引、列表索引或关键字索引。
LlamaIndex 中的各式索引
实质上,LlamaIndex 中的所有索引类型都由“节点”组成,节点代表了文档中的一段文本。接下来,咱们能够具体理解一下 LlamaIndex 构建的索引类型、索引工作流程、以及不同索引的适配场景。
- 列表索引
顾名思义,列表索引是一种以列表模式来示意的索引。首先,输出数据被分成节点;随后这些节点会按顺序排列。如果在查问时未指定其余参数,则会依照同一个节点程序进行查问。除了根本程序查问之外,咱们还能够应用关键字或 embedding 来查问节点。
列表索引为用户提供了一种依据输出程序进行查问的办法,即便超出了 LLM 的 token 限度,LlamaIndex 也会提供一种接口,可能主动应用输出数据的所有内容。原理是什么?事实上,LlamaIndex 会应用每个节点的文本进行查问,并依据附加数据逐渐优化答案。
- 向量存储索引
向量存储索引将节点存储为向量嵌入,而 LlamaIndex 能够反对这些向量 embedding 进行本地存储或应用专门的向量数据库(如 Milvus)存储。在查问时,LlamaIndex 会查找与节点最类似的 top_k
节点,并将其返回给响应合成器。
简言之,应用向量存储索引能够为 LLM 利用引入相似性检索,当使用者须要比拟文本的语义相似性时,向量存储索引最为适合,例如,对特定类型的开源软件发问[1]。
- 树索引
LlamaIndex 的树形索引依据用户的输出数据构建树形构造。树形索引从叶节点即原始输出数据块开始自下而上构建,每个父节点蕴含叶节点。LlamaIndex 用 GPT 对节点进行总结来构建树形构造,在构建响应查问时,树形索引能够从根节点向下遍历到叶节点或间接从抉择的叶节点构建。
树形索引不仅对于查问长文本块卓有成效,还能够从文本的不同局部提取信息。与列表索引不同,树形索引不须要按程序查问。
- 关键词索引
关键词索引是关键词到蕴含这些关键词的节点的映射。它是多对多的映射,每个关键词可能指向多个节点,每个节点可能有多个映射到它的关键词。在查问时,从查问中提取关键词,只查问映射的节点。
关键词索引适宜查问大量数据中的特定关键词,尤其是在通晓用户的查问偏好时颇为实用。例如,用户在查问与衰弱保健相干的文件进行查问,且只关怀与 COVID 19 相干的文档,此时抉择关键词索引再适合不过了。
应用 LlamaIndex 的筹备工作
首先,获取相干代码,咱们把它们放在了 Google Colab[2] 笔记本,大家能够先获取提供的数据或者克隆 LlamaIndex repo[3],并关上 examples/paul_graham_essay
应用提供的示例代码。
其次,须要一个可能拜访的 LLM。默认状况下,LlamaIndex 应用 GPT。大家能够从 OpenAI 网站取得 OpenAI API 密钥[4]。在示例代码中,咱们是从 .env
文件中加载 OpenAI API 密钥的。不过,大家也能够间接在本地示例中输出密钥。无论上传到任何中央,记得先从代码中删除你的密钥!
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader
from dotenv import load_dotenv
import os
load_dotenv()
open_api_key = os.getenv("OPENAI_API_KEY")
随后,须要从 LlamaIndex 导入两个库,即 GPTVectorStoreIndex
和SimplyDirectoryReader
。
接下来的示例用的是 LlamaIndex 仓库所提供的 Paul Graham Essay example[5] 的数据和文件夹构造。如果没有克隆该 repo,须要在工作目录中创立一个名为data
的文件夹,以便上面的代码可能失常运行。
加载数据。咱们调用 SimplyDirectoryReader
中的 load_data()
函数,并传入蕴含数据的目录名称。在本例中,是 data
。能够在此处传入相对或绝对文件门路。
接下来,须要索引。能够通过在刚刚加载的文档上调用 GPTVectorStoreIndex
中的from_documents
来创立索引。
documents = SimpleDirectoryReader('data').load_data()
index = GPTVectorStoreIndex.from_documents(documents)
查问 LlamaIndex 向量存储索引
我曾经在上文中提到,向量存储索引十分实用于相似性搜寻。
例如,咱们提出了这样一个问题“作者成长过程中做了什么?”。这须要 LlamaIndex 解读文本并了解“成长过程中”是什么意思,随后再进行查问。
query_engine = index.as_query_engine()
response=query_engine.query("What did the author do growing up?")
print(response)
响应如下:
The author grew up writing short stories, programming on an IBM 1401, and nagging his father to buy a TRS-80 microcomputer. …
保留和加载索引
在理论利用中,大多数状况下都须要用户保留索引。保留索引能够节俭 GPT token,并升高 LLM 应用老本。
保留索引非常容易,只需在索引上调用.storage_context.persist()
。
index.storage_context.persist()
调用后,将创立一个名为 storage
的文件夹,其中蕴含三个文件:docstore.json
、index_store.json
和vector_store.json
。这些文件别离蕴含文档、索引元数据和向量 embedding。如果须要可扩大的版本,可能须要将向量数据库作为向量索引存储。
如果想要加载索引,须要从 llama_index
导入另外两个模块 StorageContext
和load_index_from_storage
,并将长久存储目录传给 StorageContext
类。一旦加载了存储的上下文,就能够在下面调用 load_index_from_storage
函数从新加载索引。
from llama_index import StorageContext, load_index_from_storage
# rebuild storage context
storage_context = StorageContext.from_defaults(persist_dir="./storage")
# load indexindex = load_index_from_storage(storage_context)
当然,除了在不同场景下构建各式索引,LlamaIndex 还能够构建许多不同类型的我的项目,例如问答机器人、全栈 Web 应用程序、文本剖析我的项目等。想要理解更多 LlamaIndex 构建的应用程序[6],可参考相干链接进行查问。
- 如果在应用 Milvus 或 Zilliz 产品有任何问题,可增加小助手微信“zilliz-tech”退出交换群。
• - 欢送关注微信公众号“Zilliz”,理解最新资讯。
•
本文由 mdnice 多平台公布