
文章目录
- 一、前言
- [二、初步认识 LlamaIndex](#二、初步认识 LlamaIndex)
-
- [2.1 LlamaIndex 介绍](#2.1 LlamaIndex 介绍)
-
- [2.1.1 什么是 LlamaIndex?](#2.1.1 什么是 LlamaIndex?)
- [2.1.2 LlamaIndex 的核心优势](#2.1.2 LlamaIndex 的核心优势)
- [2.1.3 LlamaIndex 的应用场景](#2.1.3 LlamaIndex 的应用场景)
- [2.2 LlamaIndex 快速入门](#2.2 LlamaIndex 快速入门)
-
- [2.2.1 前置准备与环境搭建](#2.2.1 前置准备与环境搭建)
-
- [1. 环境要求](#1. 环境要求)
- [2. 安装依赖](#2. 安装依赖)
- [3. 准备LLM API Key](#3. 准备LLM API Key)
- [2.2.2 第一个LlamaIndex实例:文档问答](#2.2.2 第一个LlamaIndex实例:文档问答)
-
- [1. 准备测试文档](#1. 准备测试文档)
- [2. 核心代码(带详细注释)](#2. 核心代码(带详细注释))
- [2.2.3 代码解析与运行说明](#2.2.3 代码解析与运行说明)
-
- [1. 核心代码解析](#1. 核心代码解析)
- [2. 运行注意事项](#2. 运行注意事项)
- [3. 运行结果预期](#3. 运行结果预期)
- [2.2.4 入门拓展:多文档问答](#2.2.4 入门拓展:多文档问答)
- [2.3 什么是代理?(Agent)](#2.3 什么是代理?(Agent))
-
- [2.3.1 代理的核心原理](#2.3.1 代理的核心原理)
- [2.3.2 代理的核心组件](#2.3.2 代理的核心组件)
- [2.3.3 代理实例:复杂任务自动化(可运行代码)](#2.3.3 代理实例:复杂任务自动化(可运行代码))
- [2.3.4 代理实例解析](#2.3.4 代理实例解析)
- [2.4 工作流是什么?(Workflow)](#2.4 工作流是什么?(Workflow))
-
- [2.4.1 工作流的核心特点](#2.4.1 工作流的核心特点)
- [2.4.2 工作流的核心组件](#2.4.2 工作流的核心组件)
- [2.4.3 工作流实例:固定流程自动化(可运行代码)](#2.4.3 工作流实例:固定流程自动化(可运行代码))
- [2.4.4 工作流实例解析](#2.4.4 工作流实例解析)
- 三、本章练习题及其答案
-
- [3.1 选择题(每题5分,共25分)](#3.1 选择题(每题5分,共25分))
- [3.2 填空题(每空3分,共15分)](#3.2 填空题(每空3分,共15分))
- [3.3 简答题(每题10分,共30分)](#3.3 简答题(每题10分,共30分))
- [3.4 实操题(每题15分,共30分)](#3.4 实操题(每题15分,共30分))
- [3.5 练习题答案](#3.5 练习题答案)
-
- [3.5.1 选择题答案](#3.5.1 选择题答案)
- [3.5.2 填空题答案](#3.5.2 填空题答案)
- [3.5.3 简答题答案](#3.5.3 简答题答案)
- [3.5.4 实操题答案](#3.5.4 实操题答案)
- 四、总结
一、前言
随着大语言模型(LLM)的普及,越来越多的开发者、AI爱好者开始尝试将LLM应用于实际项目,但在落地过程中,普遍面临"外部知识接入难""复杂任务无法拆解""多工具协同效率低"等痛点。LlamaIndex(曾用名GPT
Index)作为一款专为LLM应用开发设计的框架,恰好解决了这些问题,它能帮助开发者快速连接LLM与外部数据,实现复杂任务的拆解与自动化执行,降低LLM应用的开发门槛。
二、初步认识 LlamaIndex
在学习LlamaIndex之前,我们先明确一个核心定位:LlamaIndex不是一款大语言模型,而是一个"LLM应用开发框架"------它如同一个"桥梁",连接大语言模型(如GPT、LLaMA、豆包等)与外部数据(文档、数据库、API等),同时提供代理、工作流等核心功能,帮助开发者快速构建复杂的LLM应用,无需从零搭建数据接入、任务拆解、工具协同的逻辑。
2.1 LlamaIndex 介绍
2.1.1 什么是 LlamaIndex?
LlamaIndex 是一个开源的LLM应用开发框架,由 Jerry Liu 团队开发,核心目标是"让LLM更好地理解和使用外部知识"。它提供了一套完整的工具链,帮助开发者解决LLM应用开发中的核心痛点:
-
外部数据接入:支持多种数据源(PDF、Word、Excel、数据库、API、网页等)的快速接入,无需手动编写复杂的数据解析代码;
-
知识结构化:将非结构化/半结构化数据转化为LLM可理解的结构化知识,提升LLM对外部数据的利用率;
-
复杂任务拆解:通过代理(Agent)功能,将复杂任务自动拆解为多个简单子任务,调用相应工具完成执行;
-
多工具协同:支持集成各类工具(数据库查询工具、API调用工具、文件处理工具等),实现多工具自动化协同工作;
-
低代码开发:提供简洁的API接口和丰富的预置组件,开发者无需从零开发,快速搭建LLM应用。
简单来说,LlamaIndex
的核心价值是"降低LLM应用的开发门槛",让无论是后端、前端、运维工程师,还是AI爱好者、在校学生,都能快速上手,将LLM与实际需求结合,开发出实用的AI应用。
2.1.2 LlamaIndex 的核心优势
相比其他LLM开发框架(如LangChain),LlamaIndex 具有以下核心优势,更适合新手入门:
1. 上手简单:API设计简洁直观,文档完善,即使是新手,也能在1-2小时内完成基础入门,搭建第一个LLM应用;
2. 数据接入能力强:内置多种数据源的解析器,支持PDF、Word、TXT、CSV、数据库(MySQL、Neo4j等)、API等,无需手动处理数据格式;
3. 轻量灵活:核心依赖少,可灵活集成不同的LLM(OpenAI、豆包、LLaMA等),支持本地部署和云端部署,适配不同场景;
4. 专注实用:聚焦"数据+LLM"的核心场景,功能模块精简,避免冗余,开发者可快速聚焦核心需求,无需学习复杂的额外功能;
5. 开源免费:完全开源,社区活跃,遇到问题可快速获取解决方案,同时支持自定义扩展,满足个性化需求。
2.1.3 LlamaIndex 的应用场景
LlamaIndex 适用于各类LLM应用场景,尤其适合需要接入外部数据、处理复杂任务的场景,常见应用包括:
-
智能问答系统:接入企业文档、知识库,实现精准的问答(如员工手册问答、产品文档问答);
-
数据分析助手:连接数据库、Excel文件,自动分析数据,生成分析报告;
-
自动化办公工具:拆解办公任务(如邮件处理、文档生成、数据统计),自动调用工具完成;
-
知识管理系统:将非结构化文档转化为结构化知识,实现知识的检索、整理和复用;
-
多工具协同应用:如"查询数据库→生成报告→发送邮件"的全流程自动化。
2.2 LlamaIndex 快速入门
本小节将通过"环境搭建→基础实例→代码解析"的步骤,帮助读者快速上手LlamaIndex,所有代码均经过测试可运行,带详细注释,新手可直接复制操作。
2.2.1 前置准备与环境搭建
1. 环境要求
确保已安装 Python 3.8+(推荐3.10版本),避免版本兼容问题。
2. 安装依赖
执行以下命令,安装LlamaIndex及核心依赖(包含LLM依赖、数据解析依赖):
bash
# 安装核心LlamaIndex(稳定版)
pip install llama-index==0.10.18
# 安装OpenAI依赖(用于调用GPT模型,若使用其他LLM可跳过)
pip install openai==1.13.3
# 安装文档解析依赖(支持PDF、Word等文件解析)
pip install pypdf==4.0.1 python-docx==1.1.0
# 安装可视化依赖(可选,用于查看数据结构)
pip install llama-index-visualizer==0.1.0
3. 准备LLM API Key
本入门实例使用OpenAI的GPT-3.5-turbo模型,需要获取OpenAI API Key(可在OpenAI官网注册获取);若无法访问OpenAI,可替换为国内LLM(如豆包),后续会给出替换方法。
2.2.2 第一个LlamaIndex实例:文档问答
我们将实现一个简单的文档问答应用:读取本地TXT文档,通过LlamaIndex连接GPT模型,实现对文档内容的问答,快速体验LlamaIndex的核心功能。
1. 准备测试文档
在本地创建一个名为 test_doc.txt 的文本文件,输入以下内容(可自定义内容):
txt
LlamaIndex 是一款开源的LLM应用开发框架,核心目标是让LLM更好地理解和使用外部知识。
它支持多种数据源的接入,包括PDF、Word、数据库、API等,能够将非结构化数据转化为结构化知识。
LlamaIndex 提供了代理(Agent)和工作流(Workflow)功能,可实现复杂任务的拆解和多工具协同。
LlamaIndex 的优势是上手简单、轻量灵活,适合各类开发者快速搭建LLM应用。
2. 核心代码(带详细注释)
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
LlamaIndex 快速入门:文档问答实例
功能:读取本地TXT文档,实现对文档内容的问答
依赖:llama-index、openai
"""
# 1. 导入所需依赖
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
# 2. 配置LLM(OpenAI GPT-3.5-turbo)
# 替换为自己的OpenAI API Key
OPENAI_API_KEY = "your_openai_api_key"
# 初始化OpenAI LLM(温度越低,回答越稳定)
llm = OpenAI(
api_key=OPENAI_API_KEY,
model="gpt-3.5-turbo",
temperature=0.3
)
# 3. 读取本地文档(SimpleDirectoryReader 可读取指定目录下的所有文档)
# 此处读取当前目录下的 test_doc.txt 文件
reader = SimpleDirectoryReader(input_files=["test_doc.txt"])
# 将文档转化为LlamaIndex可处理的文档对象(Document)
documents = reader.load_data()
print(f"成功读取文档,共 {len(documents)} 个文档对象")
# 4. 构建索引(核心步骤:将文档转化为结构化知识)
# VectorStoreIndex 是LlamaIndex最基础的索引类型,基于向量存储文档内容
index = VectorStoreIndex.from_documents(
documents=documents,
llm=llm # 关联LLM,用于生成文档的向量表示
)
# 5. 创建查询引擎(用于对索引进行查询,实现问答)
query_engine = index.as_query_engine()
# 6. 执行查询(问答)
# 可自定义查询问题,需与文档内容相关
test_queries = [
"LlamaIndex 是什么?",
"LlamaIndex 支持哪些数据源?",
"LlamaIndex 的优势是什么?",
"LlamaIndex 有哪些核心功能?"
]
# 逐个执行查询,输出结果
for idx, query in enumerate(test_queries, 1):
print(f"n=== 查询 {idx} ===")
print(f"问题:{query}")
# 执行查询,获取回答
response = query_engine.query(query)
print(f"回答:{response}")
# 7. 扩展:替换为国内LLM(以豆包为例)
# 若无法访问OpenAI,可注释上面的代码,执行以下代码
# 安装豆包依赖:pip install doubao-api
# from llama_index.llms.doubao import Doubao
# llm = Doubao(api_key="your_doubao_api_key", model="doubao-pro")
# 后续步骤(读取文档、构建索引、查询)与上面一致
2.2.3 代码解析与运行说明
1. 核心代码解析
-
依赖导入:
SimpleDirectoryReader用于读取本地文档,VectorStoreIndex用于构建文档索引,OpenAI用于集成OpenAI模型; -
LLM配置:初始化OpenAI模型,设置API Key、模型名称和温度(temperature),温度越低,回答越稳定,适合问答场景;
-
文档读取:
SimpleDirectoryReader可读取指定文件或目录下的文档,支持TXT、PDF、Word等格式,自动解析文档内容; -
索引构建:将文档转化为结构化的向量索引,便于后续快速检索相关内容,这是LlamaIndex实现"外部知识接入"的核心步骤;
-
查询引擎:通过索引创建查询引擎,调用
query方法即可实现问答,LlamaIndex会自动检索文档中与问题相关的内容,结合LLM生成回答。
2. 运行注意事项
-
API Key替换:必须将代码中的
your_openai_api_key替换为自己的OpenAI API Key,否则无法调用LLM; -
文档路径:确保
test_doc.txt文件与代码文件在同一目录下,若路径不同,需修改input_files中的路径; -
版本兼容:若出现导入错误,需确保安装的LlamaIndex版本为0.10.18,可执行
pip install llama-index==0.10.18固定版本; -
国内LLM替换:若无法访问OpenAI,可使用豆包、文心一言等国内LLM,只需修改LLM的初始化代码,替换API Key即可,后续步骤完全一致。
3. 运行结果预期
运行代码后,会依次输出每个查询的回答,回答内容均来自 test_doc.txt 文档,例如:
text
成功读取文档,共 1 个文档对象
=== 查询 1 ===
问题:LlamaIndex 是什么?
回答:LlamaIndex 是一款开源的LLM应用开发框架,核心目标是让LLM更好地理解和使用外部知识。它支持多种数据源的接入,能够将非结构化数据转化为结构化知识,还提供了代理(Agent)和工作流(Workflow)功能,可实现复杂任务的拆解和多工具协同,且具有上手简单、轻量灵活的优势,适合各类开发者快速搭建LLM应用。
2.2.4 入门拓展:多文档问答
若需要读取多个文档(如多个TXT、PDF文件),只需修改文档读取部分的代码,将 input_files 改为目录路径,SimpleDirectoryReader 会自动读取目录下的所有支持格式的文档:
python
# 读取指定目录下的所有文档(如 docs 目录)
reader = SimpleDirectoryReader(input_dir="docs")
documents = reader.load_data()
print(f"成功读取 {len(documents)} 个文档")
其他步骤与单文档问答完全一致,LlamaIndex会自动整合所有文档的内容,构建统一的索引,实现多文档的联合问答。
2.3 什么是代理?(Agent)
在LlamaIndex中,代理(Agent)是实现"复杂任务自动化"的核心组件,也是LlamaIndex区别于简单文档问答工具的重要功能。很多新手会混淆"代理"和"查询引擎",这里先明确两者的区别:
查询引擎(Query Engine):只能执行单一的查询任务(如文档问答、数据库查询),无法处理复杂任务;
代理(Agent):可以理解为"LLM驱动的智能助手",能够接收复杂任务,自动拆解为多个简单子任务,选择合适的工具(如查询引擎、数据库工具、API工具)执行每个子任务,最终整合所有子任务的结果,生成最终答案。
2.3.1 代理的核心原理
LlamaIndex中的代理,核心是"LLM + 工具集 + 任务规划",其工作流程如下:
-
接收用户需求:用户提出一个复杂任务(如"读取本地文档,统计文档中提到的LlamaIndex功能,并生成一份markdown格式的报告");
-
任务拆解:代理调用LLM,将复杂任务拆解为多个子任务(如子任务1:读取本地文档;子任务2:统计LlamaIndex功能;子任务3:生成markdown报告);
-
工具选择:针对每个子任务,代理自动选择合适的工具(如子任务1用文档读取工具,子任务2用查询引擎,子任务3用LLM生成工具);
-
执行子任务:调用对应工具,执行每个子任务,获取子任务结果;
-
结果整合:将所有子任务的结果整合,调用LLM生成最终的回答或报告。
简单来说,代理的核心价值是"让LLM具备自主决策和执行能力",无需开发者手动拆解任务、调用工具,实现复杂任务的全自动化。
2.3.2 代理的核心组件
LlamaIndex中的代理由以下3个核心组件组成,缺一不可:
-
LLM(核心驱动):负责任务拆解、工具选择和结果整合,是代理的"大脑";
-
工具集(执行单元):代理可调用的各类工具,如文档查询工具、数据库工具、API工具、文件生成工具等,LlamaIndex内置了多种常用工具,也支持自定义工具;
-
代理控制器(决策单元):负责协调LLM和工具集,确保任务拆解、工具调用、结果整合的流程顺畅,避免出现任务遗漏或工具调用错误。
2.3.3 代理实例:复杂任务自动化(可运行代码)
我们将实现一个简单的代理实例:接收复杂任务"读取test_doc.txt文档,统计文档中提到的LlamaIndex核心功能,生成一份markdown格式的报告,保存到本地",代理自动拆解任务、调用工具完成执行。
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
LlamaIndex 代理(Agent)实例:复杂任务自动化
功能:自动拆解复杂任务,调用工具完成文档读取、统计、报告生成
依赖:llama-index、openai
"""
# 1. 导入所需依赖
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
from llama_index.core.agents import ReActAgent
from llama_index.core.tools import QueryEngineTool, ToolMetadata
from llama_index.core.output_parsers import StrOutputParser
# 2. 配置LLM
OPENAI_API_KEY = "your_openai_api_key"
llm = OpenAI(
api_key=OPENAI_API_KEY,
model="gpt-3.5-turbo",
temperature=0.3
)
# 3. 构建文档查询工具(作为代理可调用的工具之一)
# 读取文档,构建索引
reader = SimpleDirectoryReader(input_files=["test_doc.txt"])
documents = reader.load_data()
index = VectorStoreIndex.from_documents(documents=documents, llm=llm)
query_engine = index.as_query_engine()
# 封装查询工具(给工具命名和描述,方便代理识别)
query_tool = QueryEngineTool(
query_engine=query_engine,
metadata=ToolMetadata(
name="document_query_tool", # 工具名称(唯一)
description="用于查询test_doc.txt文档中的内容,可获取LlamaIndex的相关信息,如功能、优势、数据源等" # 工具描述(关键,代理通过描述判断是否使用该工具)
)
)
# 4. 定义自定义工具:生成markdown报告并保存到本地
from llama_index.core.tools import BaseTool, ToolOutput
import os
class MarkdownReportTool(BaseTool):
"""自定义工具:生成markdown报告并保存到本地"""
name = "markdown_report_tool"
description = "用于将给定的内容生成markdown格式的报告,并保存到本地文件,输入为报告内容,输出为文件保存路径"
def _run(self, content: str) -> ToolOutput:
"""工具执行逻辑:将内容写入markdown文件"""
# 定义报告保存路径
report_path = "llama_index_report.md"
# 写入内容
with open(report_path, "w", encoding="utf-8") as f:
f.write(content)
# 返回执行结果
return ToolOutput(
content=f"markdown报告已生成,保存路径:{os.path.abspath(report_path)}",
tool_name=self.name
)
# 实例化自定义工具
report_tool = MarkdownReportTool()
# 5. 初始化代理(ReActAgent是LlamaIndex最常用的代理类型)
agent = ReActAgent(
llm=llm,
tools=[query_tool, report_tool], # 代理可调用的工具集
output_parser=StrOutputParser(), # 输出解析器,确保输出格式规范
verbose=True # 开启verbose模式,可查看代理的任务拆解、工具调用过程(便于调试和教学)
)
# 6. 提交复杂任务,执行代理
complex_task = """
请完成以下任务:
1. 读取test_doc.txt文档,统计文档中提到的LlamaIndex的核心功能;
2. 将统计结果整理成markdown格式的报告,报告标题为"LlamaIndex核心功能统计";
3. 将报告保存到本地。
"""
print("提交的复杂任务:", complex_task)
print("n=== 代理执行过程 ===")
# 执行代理,获取结果
response = agent.chat(complex_task)
print("n=== 代理执行结果 ===")
print(response)
# 验证:查看生成的markdown报告
if os.path.exists("llama_index_report.md"):
with open("llama_index_report.md", "r", encoding="utf-8") as f:
report_content = f.read()
print("n=== 生成的markdown报告内容 ===")
print(report_content)
2.3.4 代理实例解析
-
工具封装:将查询引擎封装为
QueryEngineTool,自定义报告生成工具继承BaseTool,每个工具都需要明确名称和描述,代理通过描述判断该工具是否适合执行当前子任务; -
代理初始化:使用
ReActAgent(LlamaIndex最常用的代理类型,基于ReAct思维链),传入LLM和工具集,开启verbose=True,可直观查看代理的任务拆解和工具调用过程; -
任务执行:代理接收复杂任务后,会自动拆解为3个子任务,依次调用
document_query_tool(统计核心功能)、markdown_report_tool(生成并保存报告),最终返回执行结果; -
自定义工具:通过继承
BaseTool,可实现任意自定义工具(如邮件发送工具、API调用工具),拓展代理的能力。
运行代码后,会生成
llama_index_report.md文件,同时在控制台输出代理的执行过程,清晰展示任务拆解和工具调用的细节,帮助读者理解代理的工作原理。
2.4 工作流是什么?(Workflow)

工作流(Workflow)是LlamaIndex中另一个核心功能,与代理(Agent)类似,都用于处理复杂任务,但两者的核心区别在于:
代理(Agent) :动态拆解任务,任务拆解和工具调用由LLM自主决策,适合任务流程不固定、需要灵活调整的场景;
工作流(Workflow ):静态定义流程,开发者提前定义好任务的执行步骤、工具调用顺序,代理按照固定流程执行,适合任务流程固定、可重复执行的场景。
简单来说,工作流是"固定流程的自动化",而代理是"灵活流程的自动化",两者可结合使用,适配不同的复杂任务场景。
2.4.1 工作流的核心特点
-
流程固定:开发者提前定义好任务的执行步骤、每个步骤调用的工具、步骤之间的依赖关系,工作流按照固定流程执行,不会随意调整;
-
可复用性强:一旦定义好工作流,可重复执行相同类型的任务,无需重复编写代码;
-
易于调试:流程固定,出现问题时可快速定位到具体步骤,便于调试和优化;
-
低代码配置:LlamaIndex提供了简洁的API,可通过代码快速定义工作流,无需复杂的配置。
2.4.2 工作流的核心组件
LlamaIndex中的工作流,核心由以下2个组件组成:
1. 步骤(Step):工作流的最小执行单元,每个步骤对应一个工具调用或一个简单任务,如"读取文档""查询数据""生成报告";
2. 流程控制器(Workflow Controller):负责按照提前定义的顺序,执行每个步骤,处理步骤之间的依赖关系(如"必须先读取文档,才能查询数据"),确保流程顺畅执行。
2.4.3 工作流实例:固定流程自动化(可运行代码)
我们将实现一个固定流程的工作流:"读取文档→查询文档内容→生成markdown报告→保存报告",流程固定,可重复执行,对比代理的动态拆解,感受工作流的特点。
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
LlamaIndex 工作流(Workflow)实例:固定流程自动化
功能:按照固定步骤执行任务:读取文档→查询内容→生成报告→保存报告
依赖:llama-index、openai
"""
# 1. 导入所需依赖
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
from llama_index.core.workflow import (
Workflow,
step,
Context,
Input,
Output
)
from llama_index.core.tools import QueryEngineTool, ToolMetadata
import os
# 2. 配置LLM
OPENAI_API_KEY = "your_openai_api_key"
llm = OpenAI(
api_key=OPENAI_API_KEY,
model="gpt-3.5-turbo",
temperature=0.3
)
# 3. 定义工作流(继承Workflow,通过@step装饰器定义每个步骤)
class LlamaIndexWorkflow(Workflow):
"""LlamaIndex 固定流程工作流:读取文档→查询内容→生成报告→保存报告"""
# 步骤1:读取本地文档,返回文档对象列表
@step
def read_document(self, context: Context, input: Input[str]) -> Output[list]:
"""步骤1:读取本地文档"""
print("=== 执行步骤1:读取文档 ===")
# input为文档路径
reader = SimpleDirectoryReader(input_files=[input])
documents = reader.load_data()
print(f"成功读取文档,共 {len(documents)} 个文档对象")
# 返回文档对象列表,供下一个步骤使用
return documents
# 步骤2:构建索引,查询文档中的LlamaIndex核心功能
@step
def query_document(self, context: Context, input: Input[list]) -> Output[str]:
"""步骤2:查询文档内容,统计LlamaIndex核心功能"""
print("=== 执行步骤2:查询文档内容 ===")
# input为步骤1返回的文档对象列表
index = VectorStoreIndex.from_documents(documents=input, llm=llm)
query_engine = index.as_query_engine()
# 固定查询:统计LlamaIndex核心功能
query = "请统计test_doc.txt文档中提到的LlamaIndex核心功能,用简洁的语言总结"
response = query_engine.query(query)
print(f"查询结果:{response}")
# 返回查询结果,供下一个步骤使用
return str(response)
# 步骤3:将查询结果生成markdown格式的报告
@step
def generate_report(self, context: Context, input: Input[str]) -> Output[str]:
"""步骤3:生成markdown报告"""
print("=== 执行步骤3:生成markdown报告 ===")
# input为步骤2返回的查询结果
report_content = f"# LlamaIndex核心功能统计nn{input}"
print(f"报告内容:n{report_content}")
# 返回报告内容,供下一个步骤使用
return report_content
# 步骤4:将报告保存到本地
@step
def save_report(self, context: Context, input: Input[str]) -> Output[str]:
"""步骤4:保存报告到本地"""
print("=== 执行步骤4:保存报告 ===")
# input为步骤3返回的报告内容
report_path = "llama_index_workflow_report.md"
with open(report_path, "w", encoding="utf-8") as f:
f.write(input)
save_path = os.path.abspath(report_path)
print(f"报告已保存到:{save_path}")
# 返回保存路径,作为工作流最终结果
return save_path
# 4. 初始化工作流并执行
if __name__ == "__main__":
# 初始化工作流
workflow = LlamaIndexWorkflow()
# 执行工作流,传入初始输入(文档路径)
# 工作流会按照步骤1→步骤2→步骤3→步骤4的顺序执行
result = workflow.run(input="test_doc.txt")
# 输出工作流最终结果
print("n=== 工作流执行完成 ===")
print(f"最终结果:报告已保存到 {result}")
# 验证报告
if os.path.exists("llama_index_workflow_report.md"):
with open("llama_index_workflow_report.md", "r", encoding="utf-8") as f:
print("n=== 生成的报告内容 ===")
print(f.read())
2.4.4 工作流实例解析
-
工作流定义:通过继承
Workflow类,使用@step装饰器定义每个步骤,每个步骤的输入是上一个步骤的输出,形成固定的流程链路; -
步骤依赖:步骤1的输出(文档对象列表)作为步骤2的输入,步骤2的输出(查询结果)作为步骤3的输入,步骤3的输出(报告内容)作为步骤4的输入,流程固定,不可随意调整;
-
执行方式:调用
workflow.run()传入初始输入(文档路径),工作流会自动按照定义的步骤顺序执行,无需手动干预; -
与代理的区别:该工作流的步骤、查询内容、工具调用都是固定的,适合重复执行"读取指定文档→生成固定格式报告"的任务,而代理可根据不同的任务动态调整步骤和工具。
运行代码后,会按照"读取文档→查询内容→生成报告→保存报告"的固定流程执行,生成
llama_index_workflow_report.md文件,对比代理实例,可清晰感受到工作流"固定流程、可复用"的特点。
三、本章练习题及其答案
为帮助读者巩固本章所学知识,结合LlamaIndex基础介绍、快速入门、代理、工作流的核心内容,设计以下练习题,涵盖选择、填空、简答、实操四种题型,所有题目均贴合教学重点,答案详细易懂,适合自我检测和教学使用。
3.1 选择题(每题5分,共25分)
-
以下关于LlamaIndex的描述,正确的是( )
-
A. LlamaIndex是一款大语言模型,可直接生成回答
-
B. LlamaIndex是一个LLM应用开发框架,用于连接LLM与外部数据
-
C. LlamaIndex只能处理PDF文档,无法处理其他格式的文档
-
D. LlamaIndex不支持国内LLM,只能使用OpenAI模型
-
-
LlamaIndex中,用于读取本地文档的组件是( )
-
A. VectorStoreIndex
-
B. SimpleDirectoryReader
-
C. ReActAgent
-
D. Workflow
-
-
以下关于代理(Agent)和工作流(Workflow)的区别,正确的是( )
-
A. 代理是固定流程,工作流是动态流程
-
B. 代理和工作流都只能处理简单任务
-
C. 代理动态拆解任务,工作流固定流程
-
D. 代理不支持工具调用,工作流支持工具调用
-
-
LlamaIndex中,构建文档索引最基础的索引类型是( )
-
A. TreeIndex
-
B. VectorStoreIndex
-
C. ListIndex
-
D. KeywordTableIndex
-
-
以下哪项不是LlamaIndex的核心优势( )
-
A. 上手简单,API简洁
-
B. 数据接入能力强,支持多种数据源
-
C. 只能部署在云端,无法本地部署
-
D. 开源免费,社区活跃
-
3.2 填空题(每空3分,共15分)
-
LlamaIndex的核心目标是________________,帮助开发者快速连接LLM与外部数据。
-
LlamaIndex中,________________是实现复杂任务动态拆解的核心组件,而________________是实现固定流程自动化的核心组件。
-
构建文档问答应用时,需要先通过________________读取文档,再通过________________构建索引,最后通过查询引擎执行问答。
-
代理(Agent)的核心组件包括LLM、工具集和________________。
3.3 简答题(每题10分,共30分)
-
简述LlamaIndex的核心优势,至少列出3点。
-
简述代理(Agent)的工作流程,分步骤说明。
-
简述LlamaIndex中查询引擎(Query Engine)、代理(Agent)、工作流(Workflow)三者的区别与联系。
3.4 实操题(每题15分,共30分)
-
实操任务:使用LlamaIndex实现PDF文档问答。要求:① 读取本地一个PDF文档(自定义内容);② 构建索引;③ 实现3个相关问题的问答,代码带详细注释,确保可运行。
-
实操任务:使用LlamaIndex的工作流,实现"读取TXT文档→查询文档中提到的LLM模型→生成txt格式的查询报告→保存到本地"的固定流程,代码带详细注释,确保可运行。
3.5 练习题答案
3.5.1 选择题答案
-
B(解析:A错误,LlamaIndex是框架,不是LLM;C错误,支持多种格式文档;D错误,支持国内LLM如豆包)
-
B(解析:SimpleDirectoryReader用于读取本地文档,VectorStoreIndex用于构建索引,ReActAgent是代理,Workflow是工作流)
-
C(解析:代理动态拆解任务,工作流固定流程,A错误;两者都能处理复杂任务,B错误;两者都支持工具调用,D错误)
-
B(解析:VectorStoreIndex是LlamaIndex最基础、最常用的索引类型,基于向量存储文档内容)
-
C(解析:LlamaIndex支持本地部署和云端部署,C选项描述错误)
3.5.2 填空题答案
-
让LLM更好地理解和使用外部知识
-
代理(Agent);工作流(Workflow)
-
SimpleDirectoryReader;VectorStoreIndex
-
代理控制器(决策单元)
3.5.3 简答题答案
-
答:LlamaIndex的核心优势包括:
-
上手简单:API设计简洁直观,文档完善,新手可快速入门;
-
数据接入能力强:内置多种数据源解析器,支持PDF、Word、数据库、API等,无需手动处理数据格式;
-
轻量灵活:核心依赖少,可灵活集成不同LLM,支持本地和云端部署;
-
专注实用:聚焦"数据+LLM"核心场景,功能精简,避免冗余;
-
开源免费:社区活跃,支持自定义扩展,遇到问题可快速获取解决方案。(答出3点及以上即可)
-
-
答:代理(Agent)的工作流程分为5个步骤:
-
接收用户需求:用户提出复杂任务;
-
任务拆解:代理调用LLM,将复杂任务拆解为多个简单子任务;
-
工具选择:针对每个子任务,代理根据工具描述,选择合适的工具;
-
执行子任务:调用对应工具,执行每个子任务,获取子任务结果;
-
结果整合:将所有子任务结果整合,调用LLM生成最终回答。
-
-
答:区别:
联系:三者都是LlamaIndex的核心组件,查询引擎可作为代理和工作流的工具,代理和工作流都依赖LLM,都用于处理复杂任务,可结合使用(如工作流中嵌入代理,实现固定流程中的灵活任务处理)。-
查询引擎:只能执行单一查询任务(如文档问答),无法处理复杂任务,无任务拆解能力;
-
代理:动态拆解复杂任务,自主选择工具,流程灵活,适合任务流程不固定的场景;
-
工作流:提前定义固定流程,按步骤执行任务,流程固定,适合可重复执行的场景。
-
3.5.4 实操题答案
实操题1:PDF文档问答(可运行代码)
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
实操题1:LlamaIndex PDF文档问答
功能:读取本地PDF文档,构建索引,实现问答
依赖:llama-index、openai、pypdf
"""
# 1. 导入所需依赖
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
# 2. 配置LLM(替换为自己的API Key)
OPENAI_API_KEY = "your_openai_api_key"
llm = OpenAI(
api_key=OPENAI_API_KEY,
model="gpt-3.5-turbo",
temperature=0.3
)
# 3. 读取PDF文档(确保本地有test_doc.pdf文件,可自定义PDF内容)
# SimpleDirectoryReader 自动识别PDF格式,无需额外处理
reader = SimpleDirectoryReader(input_files=["test_doc.pdf"])
documents = reader.load_data()
print(f"成功读取PDF文档,共 {len(documents)} 个文档对象")
# 4. 构建索引(与TXT文档问答一致,LlamaIndex自动处理PDF内容解析)
index = VectorStoreIndex.from_documents(
documents=documents,
llm=llm
)
# 5. 创建查询引擎,执行问答
query_engine = index.as_query_engine()
# 6. 测试3个相关问题(根据PDF内容自定义)
test_queries = [
"PDF文档中提到的LlamaIndex应用场景有哪些?",
"PDF文档中介绍了LlamaIndex的哪些核心组件?",
"如何使用LlamaIndex构建文档索引?"
]
# 执行查询并输出结果
for idx, query in enumerate(test_queries, 1):
print(f"n=== 查询 {idx} ===")
print(f"问题:{query}")
response = query_engine.query(query)
print(f"回答:{response}")
说明:需提前准备test_doc.pdf文档(可将之前的TXT内容复制到PDF中),安装pypdf依赖(已在入门部分的依赖安装中包含),替换API Key即可运行。
实操题2:工作流实现固定流程(可运行代码)
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
实操题2:LlamaIndex 工作流实操
功能:固定流程:读取TXT文档→查询LLM模型→生成txt报告→保存报告
依赖:llama-index、openai
"""
# 1. 导入所需依赖
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
from llama_index.core.workflow import (
Workflow,
step,
Context,
Input,
Output
)
import os
# 2. 配置LLM(替换为自己的API Key)
OPENAI_API_KEY = "your_openai_api_key"
llm = OpenAI(
api_key=OPENAI_API_KEY,
model="gpt-3.5-turbo",
temperature=0.3
)
# 3. 定义工作流
class LLMQueryWorkflow(Workflow):
# 步骤1:读取TXT文档
@step
def read_txt(self, context: Context, input: Input[str]) -> Output[list]:
print("=== 步骤1:读取TXT文档 ===")
reader = SimpleDirectoryReader(input_files=[input])
documents = reader.load_data()
print(f"成功读取文档:{input}")
return documents
# 步骤2:查询文档中提到的LLM模型
@step
def query_llm(self, context: Context, input: Input[list]) -> Output[str]:
print("=== 步骤2:查询LLM模型 ===")
index = VectorStoreIndex.from_documents(documents=input, llm=llm)
query_engine = index.as_query_engine()
query = "请列出文档中提到的所有LLM模型,简要说明每个模型的特点"
response = query_engine.query(query)
return str(response)
# 步骤3:生成txt格式报告
@step
def generate_txt_report(self, context: Context, input: Input[str]) -> Output[str]:
print("=== 步骤3:生成txt报告 ===")
report_content = f"LLM模型查询报告n{'='*20}n{input}"
return report_content
# 步骤4:保存报告到本地
@step
def save_txt_report(self, context: Context, input: Input[str]) -> Output[str]:
print("=== 步骤4:保存报告 ===")
report_path = "llm_query_report.txt"
with open(report_path, "w", encoding="utf-8") as f:
f.write(input)
save_path = os.path.abspath(report_path)
return save_path
# 4. 执行工作流
if __name__ == "__main__":
# 初始化工作流
workflow = LLMQueryWorkflow()
# 执行工作流,传入TXT文档路径(确保本地有test_doc.txt)
result = workflow.run(input="test_doc.txt")
# 输出结果
print(f"n工作流执行完成,报告保存路径:{result}")
# 验证报告
with open("llm_query_report.txt", "r", encoding="utf-8") as f:
print("n报告内容:")
print(f.read())
说明:使用之前的
test_doc.txt文档(可在文档中添加LLM模型相关内容,如"GPT-3.5-turbo是OpenAI的轻量型大模型,适合日常问答;LLaMA是Meta开源的大模型,支持本地部署"),替换APIKey即可运行,运行后会生成
llm_query_report.txt报告文件。
四、总结
本文围绕"初步认识LlamaIndex"展开,从前言引入,详细介绍了LlamaIndex的核心定位、优势和应用场景,通过可运行的代码实例,讲解了LlamaIndex的快速入门(文档问答)、代理(Agent)和工作流(Workflow)的核心概念与实操方法,最后搭配配套练习题及答案,形成完整的教学体系。
通过本文学习,读者可快速建立对LlamaIndex的初步认知,掌握基础的文档接入、索引构建、问答实现,以及代理和工作流的核心用法,能够独立完成简单的LLM应用开发。LlamaIndex的核心价值是降低LLM应用的开发门槛,无论是后端、前端、运维工程师,还是AI爱好者、在校学生,都能借助LlamaIndex快速将LLM与实际需求结合,实现各类AI应用。后续可进一步深入学习LlamaIndex的高级特性,逐步提升LLM应用的开发能力,更好地发挥框架的价值。
本文作为LlamaIndex的入门教学教案,旨在为读者搭建完整的基础认知框架,提供可落地的实操方法和配套练习,帮助读者快速上手。LLM应用开发是一个持续学习、不断实践的过程,希望读者能够以本文为起点,不断探索、深入学习,充分发挥LlamaIndex的优势,开发出更多实用、高效的AI应用,在AI技术快速发展的浪潮中,提升自身的核心竞争力。
🌟 感谢您耐心阅读到这里!
🚀 技术成长没有捷径,但每一次的阅读、思考和实践,都在默默缩短您与成功的距离。
💡 如果本文对您有所启发,欢迎点赞👍、收藏📌、分享📤给更多需要的伙伴!
🗣️ 期待在评论区看到您的想法、疑问或建议,我会认真回复,让我们共同探讨、一起进步~
🔔 关注我,持续获取更多干货内容!
🤗 我们下篇文章见!