From 98c82476d4190b2447beac903831672d80528d4c Mon Sep 17 00:00:00 2001
From: Steve Kwok
Date: Sat, 16 May 2026 12:18:44 +0800
Subject: [PATCH 1/8] docs: tighten README copy and restructure MinerU
references
- Restore original H1 tagline ("Prepare unstructured data for AI Agents")
- Rewrite "What We Are" with a direct, positive opener; remove defensive
parser comparison from the intro
- Remove TIP callout mentioning MinerU from the intro section; move
the relationship context to the FAQ and benchmark sections where it
fits naturally
- Rewrite Chengke's long-form sentences into concise, punchy copy
throughout (What We Are, How it Works, Performance Benchmark, FAQ)
- Remove all em dashes across the file
- Add "What is Knowhere's relationship with MinerU?" as the first FAQ entry
- Surface MinerU as the benchmark baseline in the performance section body
and footnote
Co-authored-by: Cursor
---
README.md | 57 ++++++++++++++++++++++++-------------------------------
1 file changed, 25 insertions(+), 32 deletions(-)
diff --git a/README.md b/README.md
index 0f3429367..e04564880 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-Build AI Agent Memory from Real-World Documents
+Prepare unstructured data for AI Agents
@@ -33,12 +33,9 @@
## What We Are
-**We're not developing the next MinerU, instead, we're building document memory infrastructure that agents can effectively consume.**
+**Knowhere is the memory layer between raw documents and AI agents.**
-Knowhere turns unstructured documents into persistent, navigable memory for AI agents. It handles parsing, hierarchy extraction, multi-modal structuring, and graph construction, giving your agents structured, high-quality context for *Agentic RAG*, *traditional RAG*, or any LLM workflow.
-
-> [!TIP]
-> Knowhere stands on the shoulders of giants like MinerU and Pymupdf. We take their output, optimize it, and then build **hierarchical structure** and **multi-modal cross-document graphs** on top. The result is a persistent, citable memory layer purpose-built for agent consumption.
+It ingests unstructured documents and produces persistent, navigable memory: parsing, hierarchy extraction, multi-modal structuring, and graph construction in a single pipeline. The output is structured, high-quality context ready for *Agentic RAG*, *traditional RAG*, or any LLM workflow.
> [!NOTE]
> **Get started in seconds with Knowhere Cloud.**
@@ -51,7 +48,7 @@ Knowhere turns unstructured documents into persistent, navigable memory for AI a
## How it Works
-Knowhere turns raw documents into a structured memory store that AI agents can navigate and cite. The process follows two steps:
+The pipeline runs in two steps.
### Step 1: Parse and Build Memory
@@ -59,8 +56,6 @@ Knowhere turns raw documents into a structured memory store that AI agents can n
-Parsing, chunking, hierarchy extraction, and graph construction are unified into one outcome: a navigable memory layer for AI agents.
-
- **Parse**: Route PDFs, Office files, images, tables, Markdown, and text to specialized parsers.
- **Structure**: Preserve headings, section paths, multi-modal assets, and chunk relationships.
- **Build Memory**: Store chunks, navigation trees, summaries, and graph links as agent-ready context.
@@ -71,15 +66,13 @@ Parsing, chunking, hierarchy extraction, and graph construction are unified into
-Agents retrieve by navigating memory instead of depending on a single flat vector lookup.
-
- **Discover**: Fuse keyword, path, content, and semantic signals for broad first-pass coverage.
- **Navigate**: Walk section trees and graph links to drill into the most relevant document regions.
-- **Cite Evidence**: Return traceable results with source document, section, chunk, and linked image or table assets.
+- **Cite Evidence**: Return traceable results with source document, section, chunk, and linked assets.
## Performance Benchmark
-Knowhere enhances the accuracy of AI agents when performing tasks (e.g., searching, modifying, and answering) in real-world data. Compared to providing raw documents directly to agents or .md/.json files produced by other parsers, Knowhere achieves higher success rates with fewer resources.
+Agents using Knowhere outperform those working from raw documents or MinerU-parsed output on real-world tasks: searching, modifying, and answering questions.
@@ -87,20 +80,20 @@ Knowhere enhances the accuracy of AI agents when performing tasks (e.g., searchi
### Key Advantages
-- **Superior Accuracy**: Knowhere drastically improves both **First-time Accuracy** (+36% over raw docs) and **Recall** (+10%), ensuring agents find the right evidence faster.
-- **Enhanced Reliability**: With user feedback, agents using Knowhere hit **79% accuracy**βa significant jump compared to the ~53% ceiling of raw documents.
-- **Higher Efficiency**: Agents require **fewer loops**, consume **fewer tokens**, and spend **less time** searching. By navigating a structured memory graph instead of reading monolithic texts, the token overhead drops while precision increases.
+- **Accuracy**: +36% first-try accuracy and +10% recall over raw documents.
+- **Reliability**: 79% accuracy with feedback, vs. a ~53% ceiling on raw docs.
+- **Efficiency**: Fewer loops, fewer tokens, less time. Agents navigate a structured graph instead of reading monolithic text.
-*(Data generated from internal evaluation across identical agentic RAG tasks.)*
+*(Internal evaluation across identical agentic RAG tasks. Baseline: MinerU output fed directly to agents.)*
> [!NOTE]
-> **π Benchmarks are actively expanding.** The comparison above currently covers MinerU as the baseline parser. We are continuously adding more parsing tools and retrieval baselines β stay tuned for updated results.
+> **π Benchmarks are actively expanding.** More parsers and retrieval baselines coming soon.
## Ecosystem
| Repository | Description |
|---|---|
-| [knowhere](https://github.com/Ontos-AI/knowhere) | **This repo.** Backend API and worker β document ingestion, parsing, graph construction, and retrieval. |
+| [knowhere](https://github.com/Ontos-AI/knowhere) | **This repo.** Backend API and worker: document ingestion, parsing, graph construction, and retrieval. |
| π₯οΈ [knowhere-dashboard](https://github.com/Ontos-AI/knowhere-dashboard) | The web UI. Connects to the API for the full product experience. |
| π³ [knowhere-self-hosted](https://github.com/Ontos-AI/knowhere-self-hosted) | Docker Compose stack for self-hosted deployments. Packages the API, worker, and dashboard together. |
| π [knowhere-python-sdk](https://github.com/Ontos-AI/knowhere-python-sdk) | Official Python SDK for the Knowhere Cloud API. |
@@ -115,17 +108,17 @@ Knowhere enhances the accuracy of AI agents when performing tasks (e.g., searchi
## Frequently Asked Questions (FAQ)
-**Q: Is MinerU strictly required for Knowhere to work?**
-A: No. While MinerU is currently our default choice for parsing PDFs and PPT, because it performs the best in our experiments, any tool that can convert documents to Markdown works. Knowhere's real value lies in what happens *alongside and after* the initial conversion: memory-oriented parsing optimizations (fixing real-world parser deficiencies), reconstructing the hierarchical structure, normalizing multi-modal assets, and building the cross-document navigation graph.
+**Q: What is Knowhere's relationship with MinerU?**
+A: Knowhere uses MinerU as its default parser because it performs best in our tests. Any parser only gets you raw Markdown. Knowhere's value is what comes after: hierarchy reconstruction, multi-modal normalization, and cross-document graph construction. Any Markdown-outputting tool works.
-**Q: What are the LLM / VLM dependencies?**
-A: Knowhere requires standard language models to structure the document memory. By default, it uses DeepSeek (`deepseek-chat`) for text/table summarization and hierarchy generation, and Qwen-VL (`qwen3.5-flash`) for image OCR and visual descriptions. However, it is entirely model-agnosticβyou can easily configure it to use OpenAI, DashScope (Ali), Zhipu (GLM), or Volcengine (ARK) via environment variables.
+**Q: What LLM / VLM dependencies does Knowhere have?**
+A: By default, DeepSeek (`deepseek-chat`) handles text and table summarization, and Qwen-VL (`qwen3.5-flash`) handles image OCR and descriptions. Knowhere is model-agnostic. Swap in OpenAI, DashScope, Zhipu, or Volcengine via environment variables.
-**Q: How does Agentic Retrieval differ from traditional RAG?**
-A: Traditional RAG relies on flat vector similarity, which often retrieves isolated, out-of-context text snippets. Knowhere's Agentic Retrieval instead uses a multi-agent workflow to actively navigate the hierarchical section tree and cross-document graph. Agents read the document structure like a human would, drilling down into relevant sections to find precise, well-contextualized evidence.
+**Q: How is Agentic Retrieval different from traditional RAG?**
+A: Traditional RAG does a flat vector lookup and returns isolated snippets. Knowhere's agents navigate the document's section tree and cross-document graph, drilling into the most relevant regions the way a human reader would, returning traceable, well-contextualized evidence.
-**Q: Can it handle multi-modal data like images and tables?**
-A: Yes. Knowhere extracts inline images and tables, passes them through Vision-Language Models (VLMs) for summarization and feature extraction, and explicitly links them back to their original text chunks. This ensures that agents can retrieve and cite multi-modal assets accurately during inference.
+**Q: Does it handle images and tables?**
+A: Yes. Knowhere extracts them, runs them through VLMs for summarization and feature extraction, and links them back to their source chunks so agents can retrieve and cite multi-modal assets at inference time.
## Supported Formats
@@ -205,7 +198,7 @@ uv run scripts/init_user.py --email you@example.com
If you plan to use the dashboard, register through the dashboard instead of
using `scripts/init_user.py`.
-The API is now running at `http://localhost:5005`. If you want the full product experience with a UI, run the [knowhere-dashboard](https://github.com/Ontos-AI/knowhere-dashboard) alongside it β it connects to this API out of the box.
+The API is now running at `http://localhost:5005`. If you want the full product experience with a UI, run the [knowhere-dashboard](https://github.com/Ontos-AI/knowhere-dashboard) alongside it; it connects to this API out of the box.
## Quality Checks
@@ -277,13 +270,13 @@ For general guidelines on branching, commit conventions, and the review process,
Other useful references:
-- [SECURITY.md](SECURITY.md) β how to report vulnerabilities responsibly.
-- [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) β community behavior expectations.
-- [LICENSE](LICENSE) and [NOTICE](NOTICE) β Apache 2.0.
+- [SECURITY.md](SECURITY.md): how to report vulnerabilities responsibly.
+- [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md): community behavior expectations.
+- [LICENSE](LICENSE) and [NOTICE](NOTICE): Apache 2.0.
## π We're Hiring!
-We're building the knowledge layer for the Agent era. If that sounds like work you want to do, reach out β decode the address below and drop us a line:
+We're building the knowledge layer for the Agent era. If that sounds like work you want to do, reach out. Decode the address below and drop us a line:
```bash
echo 'dGVhbUBrbm93aGVyZXRvLmFp' | base64 --decode
From c81100100c67960b68301f64cb6823a84110be2a Mon Sep 17 00:00:00 2001
From: Steve Kwok
Date: Sat, 16 May 2026 12:24:48 +0800
Subject: [PATCH 2/8] docs: polish README copy, restructure FAQ, fix citation
title
- Add context to "How it Works" opener for smoother flow after What We Are
- Move FAQ section up to follow How it Works; rename to "## FAQ"
- Reframe first FAQ entry as "What is Knowhere's relationship with MinerU?"
- Fix citation title to match restored H1 tagline
Co-authored-by: Cursor
---
README.md | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/README.md b/README.md
index e04564880..d9073a783 100644
--- a/README.md
+++ b/README.md
@@ -48,7 +48,7 @@ It ingests unstructured documents and produces persistent, navigable memory: par
## How it Works
-The pipeline runs in two steps.
+Knowhere runs in two steps: build memory from documents, then let agents retrieve from it.
### Step 1: Parse and Build Memory
@@ -70,6 +70,20 @@ The pipeline runs in two steps.
- **Navigate**: Walk section trees and graph links to drill into the most relevant document regions.
- **Cite Evidence**: Return traceable results with source document, section, chunk, and linked assets.
+## FAQ
+
+**Q: What is Knowhere's relationship with MinerU?**
+A: Knowhere uses MinerU as its default parser because it performs best in our tests. Any parser only gets you raw Markdown. Knowhere's value is what comes after: hierarchy reconstruction, multi-modal normalization, and cross-document graph construction. Any Markdown-outputting tool works.
+
+**Q: What LLM / VLM dependencies does Knowhere have?**
+A: By default, DeepSeek (`deepseek-chat`) handles text and table summarization, and Qwen-VL (`qwen3.5-flash`) handles image OCR and descriptions. Knowhere is model-agnostic. Swap in OpenAI, DashScope, Zhipu, or Volcengine via environment variables.
+
+**Q: How is Agentic Retrieval different from traditional RAG?**
+A: Traditional RAG does a flat vector lookup and returns isolated snippets. Knowhere's agents navigate the document's section tree and cross-document graph, drilling into the most relevant regions the way a human reader would, returning traceable, well-contextualized evidence.
+
+**Q: Does it handle images and tables?**
+A: Yes. Knowhere extracts them, runs them through VLMs for summarization and feature extraction, and links them back to their source chunks so agents can retrieve and cite multi-modal assets at inference time.
+
## Performance Benchmark
Agents using Knowhere outperform those working from raw documents or MinerU-parsed output on real-world tasks: searching, modifying, and answering questions.
@@ -106,20 +120,6 @@ Agents using Knowhere outperform those working from raw documents or MinerU-pars
- **Agentic RAG**: A hybrid retrieval engine combining traditional search (RRF) with autonomous agent navigation.
- **Evidence-based Citations**: Every result is backed by traceable source paths, ensuring reliability for AI Agent decision-making.
-## Frequently Asked Questions (FAQ)
-
-**Q: What is Knowhere's relationship with MinerU?**
-A: Knowhere uses MinerU as its default parser because it performs best in our tests. Any parser only gets you raw Markdown. Knowhere's value is what comes after: hierarchy reconstruction, multi-modal normalization, and cross-document graph construction. Any Markdown-outputting tool works.
-
-**Q: What LLM / VLM dependencies does Knowhere have?**
-A: By default, DeepSeek (`deepseek-chat`) handles text and table summarization, and Qwen-VL (`qwen3.5-flash`) handles image OCR and descriptions. Knowhere is model-agnostic. Swap in OpenAI, DashScope, Zhipu, or Volcengine via environment variables.
-
-**Q: How is Agentic Retrieval different from traditional RAG?**
-A: Traditional RAG does a flat vector lookup and returns isolated snippets. Knowhere's agents navigate the document's section tree and cross-document graph, drilling into the most relevant regions the way a human reader would, returning traceable, well-contextualized evidence.
-
-**Q: Does it handle images and tables?**
-A: Yes. Knowhere extracts them, runs them through VLMs for summarization and feature extraction, and links them back to their source chunks so agents can retrieve and cite multi-modal assets at inference time.
-
## Supported Formats
**β
Supported**
@@ -246,7 +246,7 @@ If you use Knowhere in your research, please cite it as:
```bibtex
@software{knowhere2026,
author = {Ontos AI},
- title = {Knowhere: Build AI Agent Memory from Real-World Documents},
+ title = {Knowhere: Prepare Unstructured Data for AI Agents},
year = {2026},
publisher = {GitHub},
url = {https://github.com/Ontos-AI/knowhere},
From e39517dba795fc61ef5c4d403a50d0ab204b8fd3 Mon Sep 17 00:00:00 2001
From: Steve Kwok
Date: Sat, 16 May 2026 12:26:33 +0800
Subject: [PATCH 3/8] docs: add blank lines between FAQ questions and answers
Co-authored-by: Cursor
---
README.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/README.md b/README.md
index d9073a783..c189d6ff4 100644
--- a/README.md
+++ b/README.md
@@ -73,15 +73,19 @@ Knowhere runs in two steps: build memory from documents, then let agents retriev
## FAQ
**Q: What is Knowhere's relationship with MinerU?**
+
A: Knowhere uses MinerU as its default parser because it performs best in our tests. Any parser only gets you raw Markdown. Knowhere's value is what comes after: hierarchy reconstruction, multi-modal normalization, and cross-document graph construction. Any Markdown-outputting tool works.
**Q: What LLM / VLM dependencies does Knowhere have?**
+
A: By default, DeepSeek (`deepseek-chat`) handles text and table summarization, and Qwen-VL (`qwen3.5-flash`) handles image OCR and descriptions. Knowhere is model-agnostic. Swap in OpenAI, DashScope, Zhipu, or Volcengine via environment variables.
**Q: How is Agentic Retrieval different from traditional RAG?**
+
A: Traditional RAG does a flat vector lookup and returns isolated snippets. Knowhere's agents navigate the document's section tree and cross-document graph, drilling into the most relevant regions the way a human reader would, returning traceable, well-contextualized evidence.
**Q: Does it handle images and tables?**
+
A: Yes. Knowhere extracts them, runs them through VLMs for summarization and feature extraction, and links them back to their source chunks so agents can retrieve and cite multi-modal assets at inference time.
## Performance Benchmark
From 564d66f69207030de3593c431fd0fa95ae063bcc Mon Sep 17 00:00:00 2001
From: Steve Kwok
Date: Sat, 16 May 2026 12:29:28 +0800
Subject: [PATCH 4/8] docs: update benchmark chart graphic
Co-authored-by: Cursor
---
docs/assets/benchmark.png | Bin 211146 -> 193531 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/docs/assets/benchmark.png b/docs/assets/benchmark.png
index 1ebd123dc4ee6b8756606d963881924f490033c2..ed5b555f73630d6e915f5c25933986635059f2f2 100644
GIT binary patch
literal 193531
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