What is JSONL, and why do RAG tools export it?
JSONL is one JSON object per line, and it became the working standard for RAG corpora because there is no formal one - every vector database has its own binary format, but nearly all of them import newline-delimited JSON.
There is no standard, so JSONL became one
Qdrant has snapshots, Chroma has SQLite and Parquet, LanceDB has Lance files, FAISS has an index plus a sidecar. None of them read each other. What they all accept, directly or through a five-line script, is one JSON object per line.
The shape everyone converged on
An id, the passage text, its embedding as an array of numbers, and a metadata object carrying the source file, page and chunk kind. That is enough to import anywhere and enough to cite an answer back to a document.
Why it is line-delimited rather than one big array
A JSON array has to be parsed whole before you can read the first element. Line-delimited records stream: you can process a corpus larger than memory, resume a failed import, and inspect the first record with head. For files that routinely run to gigabytes, that matters.
Keep the manifest separate
A JSONL file cannot describe itself - there is no header, and adding one breaks every naive reader. Which embedding model produced the vectors, and whether anything was truncated, belong in a sibling manifest.json. Without it, nobody can tell semantic vectors from keyword ones by looking.