1 功能
大模型学习的主要是通用数据,而用户可能需要让ChatGPT在本地的知识库中寻找答案。
普通用户不太可能训练大模型;由于本地数据格式丰富,内容烦多,且考虑到使用成本和token大小限制,也不可能在每次提问时都将所有数据传给ChatGPT。
llamaindex提供了解决此问题的方法:通过ChatGPT把本地文本转成Embedding,然后在本地建立数据索引;询问时先在本地查询,再用ChatGPT将查询结果合成答案,llamaindex是用户数据和大模型之间的接口。
2 原理
2.1 模块
llama_index由三个主要模块组成:
- 数据模块:用于读取本地或网络数据,并将大块文本切分成Node块。
- 索引和存储模块:将文本块通过ChatGPT转换成Embedding嵌入表示存储在本地,构建本地知识库。
- 搜索模块:根据使用者提出的问题,在本地知识库中定位可能的答案,然后将问题和答案传给ChatGPT整合出最终答案。
2.2 组织数据
当用户提出问题时,需要与本地知识库进行匹配,如果数据库中内容很多,会花费大量匹配时间。为节约时间,可以对文章中的章、节、文本文件整体内容、目录内容等生成总结,逐层构造树结构,图结构,或者关键字映射表,以节约搜索时间。
llamaindex提供了各种结构支持,需要开发者自行调用。
2.3 核心概念
-
Node & Index
Node指切分后的文本块;Index索引可以理解为Node数据块通过ChatGPT转换后在本地的存储方式。索引结构支持List, Tree, Keyword方式;除了创建index以外,还提供对其中的子块进行增删的编辑操作,以节约token。另外,除了对纯文本进行索引,还提供图索引,表索引,SQL中数据索引。 -
Embedding & Vector
这里的Embedding和Vector指的都是通过ChatGPT转换后的数据;当前版本嵌入的维度是 1536(问题的和Node一样长);假设将每个块设成最大600(Node: chunk size),如果是18K大小的文本文件,存储了utf-8的中文文字,每字占3字节,6000多字,约使用10来个Node存储;每个Node被转换成1538个float值,存储在本地,即Vector store。 -
Query & Response Synthesis
Query询问指的是用户提出的问题;Response Synthesis指的是从索引中定位出可选答案后,组织答案的方法。
3 文档
3.1 文档内容
代码中的docs目录数据用于生成网页版的说明文档,也可通过以下网址直接查看文档:
https://gpt-index.readthedocs.io/en/latest/
通过操作界面左上图标可调出帮助目录,操作左下角切换不同版本文档。
3.2 学习路径
文档内容很多,包含文本和源码示例,推荐使用以下顺序阅读文档:
- gallery: 看别人用该库实现的功能
- getting_started: 最简单的安装方法和示例
- guides: 一般用户使用方法
- use_case: 使用案例(做了什么,怎么做,相对简单)
- how_to (KEY COMPONENTS): 原理和用法的主索引,从上到下由浅入深(前三项最重要)
- reference: 细节的详细信息, 大部分是源码自动生成的文档 (具体使用时查看)
4 代码分析
- benchmarks: 用于评测
- build/dist/scripts: 打包过程中产生的目录文件
- tests: 测试用例
- llama_index: 核心源码 (200多个源码文件)
- readers: 从各种数据源读入数据的解析工具, 其file支持多种模式
- index, storage, query等,建议以文档为入口开始学习
- examples: 分门别类的示例
- experimental: 一些不重要的实验
- README.md:示例了最简单的使用方法
4.1 安装
4.1.1 pip安装
llamaindex 是个 python库,用pip安装即可(需要Python 3.8及以上版本)。
pip install llama-index
4.1.2 源码安装
由于版本更替太快,建议使用源码安装。
源码地址:https://github.com/jerryjliu/llama_index
5 注意事项
- 使用ChatGPT需要设置APIKEY
- 需要指定数据在本地存放的目录
- 如果需要可以做多个索引
- 注意安装的版本和源码一致,否则example将无法运行
- 推荐使用最新版本,目前最新版本0.6.x的数据模式以及log信息都优于之前版本