데이터 로딩
데이터 로딩 (Readers)
문서 인덱싱을 시작하기 전에, 문서를 메모리로 불러와야 해요. **리더(Reader)**는 파일에서 데이터를 읽어 Document 객체로 만드는 모듈이에요. 문서를 어떤 형식으로 가져와도 리더가 Document로 바꿔주니, 그다음부터는 같은 방식으로 다룰 수 있습니다.
출처: 공식문서
리더 설치
리더 모듈을 쓰려면 @llamaindex/readers를 설치해야 해요.
npm i @llamaindex/readers
여러 파일 형식에 맞는 리더를 제공합니다.
import { CSVReader } from '@llamaindex/readers/csv';
import { DocxReader } from '@llamaindex/readers/docx';
import { HTMLReader } from '@llamaindex/readers/html';
import { ImageReader } from '@llamaindex/readers/image';
import { JSONReader } from '@llamaindex/readers/json';
import { MarkdownReader } from '@llamaindex/readers/markdown';
import { ObsidianReader } from '@llamaindex/readers/obsidian';
import { PDFReader } from '@llamaindex/readers/pdf';
import { TextFileReader } from '@llamaindex/readers/text';
SimpleDirectoryReader
LlamaIndex.TS는 SimpleDirectoryReader 클래스로 폴더에서 파일을 손쉽게 불러올 수 있어요. 디렉터리와 그 하위 디렉터리의 모든 파일을 읽고, 실제 읽기는 fileExtToReader 맵에 지정된 리더에게 위임하는 간단한 리더입니다.
// SimpleDirectoryReader 예시
// (자세한 예시는 LlamaIndexTS 저장소의 examples/readers/src/simple-directory-reader.ts 참고)
현재 다음 리더들이 특정 파일 형식에 매핑돼 있어요.
- TextFileReader:
.txt - PDFReader:
.pdf - CSVReader:
.csv - MarkdownReader:
.md - DocxReader:
.docx - HTMLReader:
.htm,.html - ImageReader:
.jpg,.jpeg,.png,.gif
리더를 세 가지 방법으로 바꿀 수 있어요.
overrideReader: 미지원 형식을 포함해 모든 파일 형식의 리더를 덮어써요.fileExtToReader: 특정 파일 형식에 리더를 매핑해요. 기존 형식의 리더를 바꾸거나 새 형식을 지원하도록 추가할 수 있어요.defaultReader: 미지원 확장자 파일의 폴백 리더를 지정해요. 기본값은TextFileReader예요.
SimpleDirectoryReader는 최대 9개의 동시 요청을 지원해요. numWorkers 옵션으로 동시 요청 수를 설정하세요. 기본값은 순차 모드, 즉 1로 설정돼 있습니다.
Node.js가 아닌 환경에서 쓸 때 팁
@llamaindex/readers를 Vercel Edge, Cloudflare Workers 같은 비-Node.js 환경에서 사용할 때, 일부 클래스는 최상위 엔트리 파일에서 export되지 않아요. 왜냐하면 일부 클래스는 Node.js 런타임 전용(예: PDFReader)이기 때문이에요. (fs, child_process, crypto 같은 Node.js 전용 API를 사용하죠.)
그런 클래스가 필요하다면, 패키지의 해당 파일 경로를 통해 직접 import 해야 합니다.
PDFReader는 Edge 런타임에서 동작하지 않으니, SimpleDirectoryReader를 LlamaParseReader와 함께 써서 PDF를 로드하는 방법을 볼게요.
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import { LlamaParseReader } from "llama-cloud-services";
export const DATA_DIR = "./data";
export async function getDocuments() {
const reader = new SimpleDirectoryReader();
// Load PDFs using LlamaParseReader
return await reader.loadData({
directoryPath: DATA_DIR,
fileExtToReader: {
pdf: new LlamaParseReader({ resultType: "markdown" }),
},
});
}
💡 참고: Edge 버전의
SimpleDirectoryReader에서는 리더 클래스를fileExtToReader맵에 명시적으로 추가해야 해요.
완전한 예시는 여기에서 볼 수 있어요: https://github.com/run-llama/create_llama_projects/tree/main/nextjs-edge-llamaparse
Node.js 커스터마이제이션 훅으로 파일 네이티브 로드
Node.js 스크립트에서 파일을 import 할 수 있게 해주는 헬퍼 유틸리티도 제공해요.
node --import @llamaindex/readers/node ./script.js
import csv from './path/to/data.csv';
const text = csv.getText()