加载器与 Node
LLM 看不到「磁盘上的文件」,只看得到你送进上下文的文本。LlamaIndex 把摄入拆成:Load(读成 Document)→ Transform(切成 Node、抽元数据、Embedding)→ Index / Store。概念上对应本站 RAG 教程 的切块与元数据,只是类名不同。
Document 与 Node
切块太碎:检索碎片化、答案丢上下文。切块太大:噪声进 Prompt、超窗口。先从 chunk_size=512、少量 overlap 试起,用真实问题看 source_nodes。
手写文档:
SimpleDirectoryReader
入门 Reader,能读目录里常见的 Markdown、PDF、Word、PPT、部分音视频。默认只扫顶层;子目录要 recursive=True。
也可 input_files=["./data/a.pdf"] 只喂指定文件。生产上往往改用 LlamaHub 上的专用 Reader(数据库、Notion、S3 等),而不是把所有源都塞进一个目录扫描。
具体包名以 LlamaHub 为准(例如 llama-index-readers-database)。
切分成 Node
VectorStoreIndex.from_documents(documents) 会按全局 Settings(或传入的 transformations)切块。要控制粒度:
也可以声明式 IngestionPipeline(切分、抽标题、Embedding 串成流水线):
直接建 Node 再索引(跳过 Document 切分):
元数据为什么重要
检索后常按部门、日期、文件类型过滤。摄入时就把字段写进 metadata,查询阶段用 metadata filter(见 检索)。自动抽取可用 TitleExtractor 等,但会额外消耗 LLM 调用,适合离线批处理,不适合每次用户提问都跑一遍。
实践要点:
- 中文文档优先按句 / 段切,避免在字中间切开
- PDF 扫描件需要 OCR 或 LlamaParse 一类解析,否则 Reader 只能得到乱码
- 同一语料的 index 与 query 必须用同一 embedding 模型