LlamaIndex(二)加载本地数据

介绍

在您选择的大语言模型(LLM)能够处理您的数据之前,您首先需要处理并加载这些数据。

这个摄入管道通常包含三个主要阶段:

  1. 加载数据
  2. 转换数据
  3. 索引和存储数据

我们将在后续部分介绍索引/存储。在本指南中,我们主要讨论加载器和转换。

加载器

在您选择的大型语言模型能够处理数据之前,您需要加载数据。LlamaIndex通过

数据连接器Reader)来完成这一操作。数据连接器从不同的数据源中摄入数据,并将数据格式化为Document对象。Document是数据的集合(目前为文本,未来可能包括图像和音频)以及关于这些数据的元数据。

使用SimpleDirectoryReader加载

最简单的读取器是我们的SimpleDirectoryReader,它会根据给定目录中的每个文件创建文档。它内置于LlamaIndex中,可以读取包括Markdown、PDF、Word文档、PowerPoint演示文稿、图像、音频和视频在内的多种格式。

办公文档:.docx(Word)、.ppt/.pptm/.pptx(PowerPoint)

数据文件:.csv(表格数据)、.md(Markdown)、.pdf(文档)

多媒体文件:.mp3/.mp4(音视频)、.jpeg/.jpg/.png(图片)

特殊格式:.ipynb(Jupyter 笔记)、.epub(电子书)、.mbox(邮件存档)

需要处理 JSON 文件,建议使用专门的 JSON Loader

实例1

复制代码
from llama_index.core import SimpleDirectoryReader

reader = SimpleDirectoryReader(
    input_dir="./data", # 目标目录
    recursive=False, # 是否递归遍历子目录
    required_exts=[".pdf"] # (可选)只读取指定后缀的文件
)
documents = reader.load_data()
print(documents)
print(documents[0].text)

#dataconectr llamahub

实例2

a.txt数据文件如下:

复制代码
一把坚实的大锁挂在大门上,一根铁杆费了九牛二虎之力,还是无法将它撬开。
钥匙来了,他瘦小的身子钻进锁孔,只轻轻一转,大锁就 "啪" 地一声打开了。
铁杆奇怪地问:"为什么我费了那么大力气也打不开,而你却轻而易举地就把它打开了呢?"
钥匙说:"因为我最了解他的心。"
每个人的心,都像上了锁的大门,任你用粗的铁棒也撬不开。唯有关怀,才能把自己变成一只细腻的钥匙,进入别人的心中,了解别人。

from llama_index.core import SimpleDirectoryReader
reader = SimpleDirectoryReader(
    input_dir="./data1", # 目标目录
    recursive=False, # 是否递归遍历子目录
    required_exts=[".txt"] # (可选)只读取指定后缀的文件
)
documents = reader.load_data()
print(documents)
print(documents[0].text)

#dataconectr llamahub

并行加载

当目录下文件数量众多时,加载速度可能会成为困扰。SimpleDirectoryReader 为我们提供了并行处理的能力:

使用5个工作进程并行加载

documents = reader.load_data(num_workers=5)

一些配置

指定具体文件:加载我们需要的几个文件

复制代码
reader = SimpleDirectoryReader(input_files=["path/file1", "path/file2"])

排除特定文件

reader = SimpleDirectoryReader(

input_dir="path//directory",

exclude=["path/file1", "path/file2"]

)

只加载特定扩展名的文件

reader = SimpleDirectoryReader(

input_dir="path/directory",

required_exts=[".pdf", ".txt"]

)

限制文件数量:设置最多加载的文件数

reader = SimpleDirectoryReader(input_dir="path/to/directory", num_files_limit=200)

处理特殊编码文件

遇到非 UTF-8 编码的文件时,我们可以轻松指定编码格式:

加载latin-m编码的文件

reader = SimpleDirectoryReader(input_dir="path/directory", encoding="latin-m")

Document

在 LlamaIndex 中,Document 是所有数据处理流程的基石。无论原始数据来自 PDF、数据库、网页、还是邮件,最终都会被封装为 Document 对象。

它不仅是文本容器,更是结构化信息的基本单元,包含以下核心属性:

复制代码
from llama_index.core import Document

raw_text = "项目名称:太远,中华:3000,别字:8个月。"
document = Document(text=raw_text)
print("=== Document 信息 ===")
print(f"文档ID: {document.doc_id}")
print(f"内容预览: {document.text[:50]}...")
print(f"元数据: {document.metadata}")
print(f"哈希值: {document.hash}")

各种文件加载代码

一、文本文件(.txt / .md)

复制代码
from llama_index.core import SimpleDirectoryReader

# 加载本地 markdown 技术文档
documents = SimpleDirectoryReader(
    input_dir="tech_docs",
    required_exts=[".md"],        # 仅加载 md 文件
    exclude=["draft/"]            # 排除草稿目录
).load_data()

# 输出:自动提取文件名/路径/修改时间等元数据
print(documents[0].metadata["file_name"])  # → "api_guide.md"

​二、PDF 文件(.pdf)​

方案一:基础文本提取​

复制代码
# 加载学术论文(自动提取纯文本)
documents = SimpleDirectoryReader(
    input_dir="papers",
    required_exts=[".pdf"],
    file_metadata=lambda f: {"paper_id": f.split("/")[-1][:6]}  # 自定义论文ID  比如/papers/conf/ACL2024_056.pdf 生成{"paper_id": "ACL202"} 
).load_data()

方案二:高级解析(需 LlamaParse)​

复制代码
from llama_index.core import download_loader

# 启用官方 PDF 解析器(提取表格/公式/章节结构)
LlamaParse = download_loader("LlamaParse")
parser = LlamaParse(api_key="llx-...", result_type="markdown")  # 返回结构化文本

documents = SimpleDirectoryReader(
    input_dir="financial_reports",
    file_extractor={".pdf": parser}  # 指定PDF用LlamaParse处理
).load_data()

三、图像文件(.jpg / .png)​

处理流程​​:

复制代码
from PIL import Image
import pytesseract

# 自定义图像加载器(OCR 文字识别)
class ImageReader:
    def load_data(self, file):
        img = Image.open(file)
        text = pytesseract.image_to_string(img)  # OCR 识别文字
        return [Document(text=text, metadata={"source": file})]

# 加载扫描文档图片
documents = SimpleDirectoryReader(
    input_dir="scanned_docs",
    file_extractor={".jpg": ImageReader(), ".png": ImageReader()}  # 覆盖默认处理器
).load_data()

​四、表格文件(.csv / .xlsx)​

​结构化数据处理​​:

复制代码
from pandas import read_csv

# 自定义 CSV 加载器(保留表头)
class CSVReader:
    def load_data(self, file):
        df = read_csv(file)
        text = "\n".join([f"{col}:{row}" for col in df.columns for row in df[col]])
        return [Document(text=text, metadata={"cols": list(df.columns)})]

# 加载销售数据
documents = SimpleDirectoryReader(
    input_dir="sales_data",
    file_extractor={".csv": CSVReader()}
).load_data()

# 输出示例: "地区:华东, 销售额:258万, 同比增长:12%..."

五、音频/视频文件(.mp3 / .mp4)​

语音转文本方案​​:

复制代码
import whisper

# 自定义音频处理器(语音识别)
class AudioReader:
    def __init__(self):
        self.model = whisper.load_model("base")  # 加载 ASR 模型

    def load_data(self, file):
        result = self.model.transcribe(file)
        return [Document(text=result["text"])]

# 加载会议录音
documents = SimpleDirectoryReader(
    input_dir="meeting_records",
    file_extractor={".mp3": AudioReader()}
).load_data()
相关推荐
薛定谔的猫19821 天前
LlamaIndex(一)初见
llama·llamaindex
minhuan1 个月前
大模型应用:LlamaIndex、LangChain 与 LangGraph 细节深度、协同应用.24
langchain·llamaindex·大模型应用·langgraph
minhuan1 个月前
大模型应用:从问题到答案:LlamaIndex RAG系统工作流程详解.15
rag·llamaindex·大模型应用
deephub1 个月前
LlamaIndex检索调优实战:七个能落地的技术细节
人工智能·python·大语言模型·rag·llamaindex
cooldream20091 个月前
LlamaIndex 存储体系深度解析
人工智能·rag·llamaindex
cooldream20092 个月前
LlamaIndex PromptTemplate 全面解析
rag·llamaindex·prompttemplate
花菜会噎住3 个月前
Chainlit+LlamaIndex 多模态 RAG 开发实战7:从系统架构到功能落地,搞定 PDF/PPT/ 图片全类型文件处理
pdf·大模型·rag·llamaindex
MichaelIp3 个月前
基于MCP协议的多AGENT文章自动编写系统
语言模型·langchain·prompt·ai写作·llamaindex·langgraph·mcp
fly五行3 个月前
大模型基础入门与 RAG 实战:从理论到 llama-index 项目搭建(有具体代码示例)
python·ai·llama·llamaindex