LlamaIndex 是什么?
从字面上理解,是 Llama + Index,Llama 是大语言模型,Index 是索引,Index for Llama 就是为大语言模型做索引,那么大语言模型为什么需要索引,索引的作用是什么?
我们先看大语言模型都有什么,大语言模型主要分为开源还是闭源两个阵营,开源包括 Qwen 、Llama、Gemma 等模型,闭源包括文心一言、ChatGPT、Gemini 等模型。大语言模型都是预训练模型,各模型在已有数据集上进行训练,这种通用模型通常都具备全域知识,普遍的问题都可以进行问答。但是对于最新的知识,或者一些专有知识,模型就会出现幻觉或者回答不正确的情况。如果想要让模型更新知识或者采用私域知识,最直接的方法就是对模型进行训练,训练需要具备一定的经验,需要数据和提供相应的计算资源。
什么是 RAG
有没有其他相对容易并节省资源的方式呢?答案是肯定的,RAG 是一种被普遍采用的策略,RAG (Retrieval-Augmented Generation),检索增强,通过包括通过三步进行实现:
- 检索 (Retrieval): 根据用户输入查询,从知识库中检索相关的文档或段落。
- 增强 (Augmentation): 将检索到的信息与输入内容结合,提供额外的上下文。
- 生成 (Generation): 语言模型利用输入和检索到的信息生成回答。
通过以上这三步,借助外部知识的填充,模型就是根据最新的上下文信息对数据进行回答。有了策略,接下来就是怎么实现,我们主角 LlamaIndex 就要登场了,LlamaIndex 相当于一个框架,可以集成各种工具完成以上三步,包括知识库的搜索、上下文准备到最后调用大模型进行回答。
搜索
搜索知识库包括企业私有知识库或者互联网上最新的知识,由于成本问题(模型是按 Token 收费,1-1.5个中文是一个 Token)和上下文长度的限制,通常不会将所有的知识都放到模型的上下文当中,而是找到与查询内容相关联的内容。
怎么搜索是一个核心问题?最简单的方式就是全文检索,但是基于分词的全文检索有很大的局限性,分词是无法完成语意搜索的,需要对字典进行维护。NLP 会使用语意相似度进行语意搜索,将一段文字转为 Embedding,在通过 Query 的 Embedding 与段落的 Embedding 进行比较找到相似度高的内容。
LlamaIndex 提供了相关工具对文档进行切分,并进行 Embedding,随后保存到本地文件或者向量数据中,为后续搜索做准备。
数据增强
当查询到本地知识库相关知识后,下一步就是要进行数据增强了,这步是通过提示词进行的,要告诉大语言模型,对查询的回答要在上下文中寻找答案,我们可以看下面这个例子,该例子来自 QQ 音乐开源项目 supersonic,通过文字生成 SQL,需要将数据库结构传给模型。
+ "#Role: You are a data product manager experienced in data requirements.\n"
+ "#Task: Your will be provided with current and history questions asked by a user,"
+ "along with their mapped schema elements(metric, dimension and value),"
+ "please try understanding the semantics and rewrite a question.\n"
+ "#Rules: "
+ "1.ALWAYS keep relevant entities, metrics, dimensions, values and date ranges. "
+ "2.ONLY respond with the rewritten question.\n"
+ "#Current Question: %s\n"
+ "#Current Mapped Schema: %s\n"
+ "#History Question: %s\n"
+ "#History Mapped Schema: %s\n"
+ "#History SQL: %s\n"
+ "#Rewritten Question: ";
调用 LLM
最后,将拼接完成的提示词传给 LLM进行回答,这步 LlamaIndex 集成了所有的主流包括开源、闭源,大大提高了效率。
总结
LlamaIndex 是一个优秀的大语言 LLM 集成框架,从文档索引、提示词管理到大语言模型集成,让开发 AI 的效率提高不少,在后续的文章中,我将继续介绍如果使用 LlamaIndex 实现 RAG、对接数据库和语言模型等内容。