RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine developed by Infiniflow that specializes in deep document understanding through advanced parsing capabilities including OCR, table structure recognition, and document layout analysis. With over 76,000 GitHub stars, it excels at handling complex documents that other RAG systems struggle with.
Visual Model Flexibility – Autonomous selection of visual models per task (OCR/TSR/DLR) to balance speed and accuracy
Table of Contents Extraction – Uses LLMs during indexing to enable long-context RAG with structural context
Multi-Format Support – PDF, DOCX, XLSX, CSV, images, emails, and plain text
Architecture
RAGFlow decouples data extraction from chunking (since v0.17.0), allowing independent selection of visual models for each processing task. The pipeline flows through ingestion, parsing, embedding, retrieval, and generation stages.
Parser Layer – DeepDoc for advanced PDF handling, PlainParser for text, VisionParser for image-heavy documents
Extraction Layer – Separate OCR, TSR, and DLR models that can be independently configured
Chunking Layer – Structure-preserving strategies that maintain table rows with headers as self-contained units
Retrieval Layer – Hybrid search combining vector similarity with structural context from table of contents
Generation Layer – LLM-based answer generation with source attribution
RAGFlow's parsing capabilities are the core differentiator:
PDF Parsing – The most robust capability; DeepDoc handles layout analysis, figure extraction, and auto-detects rotation (90/180/270 degrees) via OCR
Table Extraction – Identifies complex tables including single-column and borderless layouts, outputting HTML/Markdown to preserve structure and relationships
Spreadsheets – RAGFlowExcelParser with openpyxl/pandas extracts cell values while retaining structure as HTML
DOCX – Uses python-docx for text and table extraction
Images – OCR and optional Vision Language Model processing
Code Example
import requests
RAGFLOW_API ="http://localhost:9380/api/v1"
API_KEY ="ragflow-your-api-key"
HEADERS ={"Authorization": f"Bearer {API_KEY}","Content-Type": "application/json"}# Create a knowledge base (dataset)
dataset = requests.post(f"{RAGFLOW_API}/datasets",
headers=HEADERS,
json={"name": "technical_docs","chunk_method": "naive"}).json()
dataset_id = dataset["data"]["id"]# Upload a documentwithopen("complex_report.pdf","rb")as f:
upload = requests.post(
f"{RAGFLOW_API}/datasets/{dataset_id}/documents",
headers={"Authorization": f"Bearer {API_KEY}"},
files={"file": f}).json()# Query the knowledge base with RAG
answer = requests.post(f"{RAGFLOW_API}/chats",
headers=HEADERS,
json={"question": "What were the Q3 revenue figures?","dataset_ids": [dataset_id]}).json()print(answer["data"]["answer"])