LlamaIndex 简介
LlamaIndex 是一个为开发「上下文增强」的大语言模型应用的框架(也就是 SDK)。上下文增强,泛指任何在私有或特定领域数据基础上应用大语言模型的情况。例如:
- Question-Answering Chatbots (也就是 RAG)
- Document Understanding and Extraction (文档理解与信息抽取)
- Autonomous Agents that can perform research and take actions (智能体应用)
LlamaIndex 有 Python 和 Typescript 两个版本,Python 版的文档相对更完善。
- Python 文档地址:
https://docs.llamaindex.ai/en/stable/ - Python API 接口文档:
https://docs.llamaindex.ai/en/stable/api_reference/ - TS 文档地址:
https://ts.llamaindex.ai/ - TS API 接口文档:
https://ts.llamaindex.ai/api/
LlamaIndex 是一个开源框架,Github 链接:
https://github.com/run-llama
1 | pip install llama-index |
数据加载
加载本地数据
SimpleDirectoryReader
是一个简单的本地文件加载器。它会遍历指定目录,并根据文件扩展名自动加载文件(文本内容)。
默认的 PDFReader
效果并不理想,我们可以更换文件加载器:
1 | pip install pymupdf |
更多的 PDF 加载器还有 SmartPDFLoader 和 LlamaParse, 二者都提供了更丰富的解析能力,包括解析章节与段落结构等。但不是 100%准确,偶有文字丢失或错位情况,建议根据自身需求详细测试评估。
Data Connectors
对图像、视频、语音类文件,默认不会自动提取其中文字。如需提取, 需要对应读取器。
处理更丰富的数据类型,并将其读取为 Document
的形式(text + metadata)。
文本切分与解析(Chunking)
LlamaIndex 中,Node
被定义为一个文本的「chunk」。
使用 TextSplitters 对文本做切分
1 | from llama_index.core.node_parser import TokenTextSplitter |
LlamaIndex 提供了丰富的 TextSplitter
,例如:
- SentenceSplitter: 在切分指定长度的 chunk 同时尽量保证句子边界不被切断;
- CodeSplitter: 根据 AST(编译器的抽象句法树)切分代码,保证代码功能片段完整;
- SemanticSplitterNodeParser: 根据语义相关性对将文本切分为片段
使用 NodeParsers 对有结构的文档做解析
更多的 NodeParser
包括 HTMLNodeParser,JSONNodeParser等等。
索引(Indexing)与检索(Retrieval)
基础概念:在「检索」相关的上下文中,「索引」即 index
, 通常是指为了实现快速检索而设计的特定「数据结构」。
向量检索
- SimpleVectorStore 直接在内存中构建一个 Vector Store 并建索引
LlamaIndex 默认的 Embedding 模型是 OpenAIEmbedding(model="text-embedding-ada-002")
。
- 使用自定义的 Vector Store,以
Chroma
为例:
1 | pip install llama-index-vector-stores-chroma |
更多索引与检索方式
LlamaIndex 内置了丰富的检索机制,例如:
关键字检索
- BM25Retriever:基于 tokenizer 实现的 BM25 经典检索算
- KeywordTableGPTRetriever:使用 GPT 提取检索关键字
- KeywordTableSimpleRetriever:使用正则表达式提取检索关键字
- KeywordTableRAKERetriever:使用RAKE算法提取检索关键字(有语言限制)
- RAG-Fusion QueryFusionRetriever
还支持 KnowledgeGraph、SQL、Text-to-SQL 等等
Ingestion Pipeline 自定义数据处理流程
LlamaIndex 通过 Transformations
定义一个数据(Documents
)的多步处理的流程(Pipeline)。
这个 Pipeline 的一个显著特点是,它的每个子步骤是可以缓存(cache)的,即如果该子步骤的输入与处理方法不变,重复调用时会直接从缓存中获取结果,而无需重新执行该子步骤,这样即节省时间也会节省 token (如果子步骤涉及大模型调用)。
此外,也可以用远程的 Redis 或 MongoDB 等存储 IngestionPipeline
的缓存,具体参考官方文档:Remote Cache Management。
IngestionPipeline
也支持异步和并发调用,请参考官方文档:Async Support、Parallel Processing。
检索后处理
LlamaIndex 的 Node Postprocessors
提供了一系列检索后处理模块。
更多的 Rerank 及其它后处理方法,参考官方文档:Node Postprocessor Modules
生成回复(QA & Chat)
单轮问答(Query Engine)
1 | qa_engine = index.as_query_engine() |
流式输出
1 | qa_engine = index.as_query_engine(streaming=True) |
多轮对话(Chat Engine)
1 | chat_engine = index.as_chat_engine() |
流式输出
1 | chat_engine = index.as_chat_engine() |
底层接口:Prompt、LLM 与 Embedding
Prompt 模板
PromptTemplate
定义提示词模板
1 | prompt = PromptTemplate("写一个关于{topic}的笑话") |
ChatPromptTemplate
定义多轮消息模板
1 | from llama_index.core.llms import ChatMessage, MessageRole |
语言模型
1 | from llama_index.llms.openai import OpenAI |
设置全局使用的语言模型
1 | from llama_index.core import Settings |
除 OpenAI 外,LlamaIndex 已集成多个大语言模型,包括云服务 API 和本地部署 API,详见官方文档:Available LLM integrations
Embedding 模型
1 | from llama_index.embeddings.openai import OpenAIEmbedding |
全局设定
1 | Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small", dimensions=512) |
LlamaIndex 同样集成了多种 Embedding 模型,包括云服务 API 和开源模型(HuggingFace)等,详见官方文档。
1 | 基于 LlamaIndex 实现一个功能较完整的 RAG 系统 |
LlamaIndex 的更多功能
- 智能体(Agent)开发框架:
https://docs.llamaindex.ai/en/stable/module_guides/deploying/agents/ - RAG 的评测:
https://docs.llamaindex.ai/en/stable/module_guides/evaluating/ - 过程监控:
https://docs.llamaindex.ai/en/stable/module_guides/observability/
以上内容涉及较多背景知识,暂时不在本课展开,相关知识会在后面课程中逐一详细讲解。
此外,LlamaIndex 针对生产级的 RAG 系统中遇到的各个方面的细节问题,总结了很多高端技巧(Advanced Topics),对实战很有参考价值,非常推荐有能力的同学阅读。