doc7: 視覚的理解で任意のドキュメントをAI対応Markdownに変換
doc7は、独自のマルチモーダルモデルを使用してPDF、Officeファイル、スキャン、図をAI対応Markdownに変換し、OCRスタックやページごとの料金を不要にします。
doc7: 視覚的理解で任意のドキュメントをAI対応Markdownに変換
PDFやスキャン文書をAIパイプラインに取り込もうとしたことがあるなら、その苦労を知っているでしょう。従来の抽出ツールはOCRやレイアウトパーサーに依存しており、表を壊したり、数式を落としたり、図の意味を完全に見逃したりすることがよくあります。doc7は異なるアプローチを取ります。ドキュメントを文字ごとに解析する代わりに、各ページを画像としてレンダリングし、視覚言語モデル(VLM)にページ全体を読ませて、レイアウト、関係性、文脈を理解させます。その結果、AIが実際に推論できるクリーンで検索可能なMarkdownが得られます。
なぜ視覚的理解が従来の抽出より優れているのか
ほとんどのドキュメントからMarkdownへの変換ツールは、次の3つのカテゴリのいずれかに分類されます。
- フォーマットとテキスト抽出(MarkItDownのデフォルトパスなど):ファイル固有のパーサーを使用してテキストと基本構造を抽出します。単純なテキストファイルには機能しますが、複雑なレイアウト、スキャンされたページ、または視覚的な意味を持つものには失敗します。
- ビジョンモデルOCRラッパー(Zeroxなど):ページを画像に変換してビジョンAPIに送信しますが、特定のプロバイダーに縛られることが多く、GraphicsMagickなどの追加の依存関係が必要です。
- 専用ドキュメントAIスタック(MinerUやDoclingなど):OCR、レイアウト、テーブル、数式モデルのパイプラインを実行します。これらは強力ですが、重く、複数のモデルウェイトとインフラストラクチャを管理する必要があります。
doc7はこれらすべてをスキップします。各ページを画像にレンダリングし、選択した任意のOpenAI互換マルチモーダルモデルに送信します。モデルはページ全体(テキスト、表、グラフ、図、要素間の空間的関係も)を見て、Markdownを直接出力します。つまり、OCRスタックも、ページごとの料金も、ドキュメント処理サービスへのロックインもありません。
クイックスタート: ゼロからMarkdownまで数分で
始めるのは驚くほど簡単です。doc7をワンライナーでインストールし、ローカルのビジョンモデル(LM StudioやOllamaで実行中のものなど)を指定して、最初のドキュメントを変換します。
# macOSまたはLinux
curl -fsSL https://raw.githubusercontent.com/magicrew/doc7/main/scripts/install.sh | bash
# Windows PowerShell
irm https://raw.githubusercontent.com/magicrew/doc7/main/scripts/install.ps1 | iex
# ドキュメントを変換
doc7 report.pdf
初回実行時には、ローカルモデルのエンドポイント(LM StudioとOllama)が自動的に検出され、複数のモデルがある場合は選択でき、選択を保存する前に画像理解が検証されます。ローカルエンドポイントにはAPIキーは不要です。
実世界ベンチマーク: doc7 vs. MarkItDown vs. Docling
このプロジェクトには、視覚的理解がなぜ重要なのかを正確に示すオープンベンチマークが含まれています。彼らは2つのラスタのみのPDF(テキストレイヤーなし)を取り、15の機械検証可能な視覚的事実をチェックしました。同じqwen3.5-9bモデルを同じローカルエンドポイントで使用して、doc7は15/15の事実を回復しましたが、OCRプラグインを使用したMarkItDownは9/15、Doclingの標準パイプラインはわずか3/15でした。
内訳は次のとおりです。
| システム | Attentionペーパー | ビジュアルレポート | 合計 | 生のMarkdown |
|---|---|---|---|---|
| doc7 + qwen3.5-9b | 7/7 | 8/8 | 15/15 | 5,293バイト |
| MarkItDown 0.1.6 + OCR 0.1.0 + qwen3.5-9b | 3/7 | 6/8 | 9/15 | 13,142バイト |
| Docling 2.113.0標準 | 1/7 | 2/8 | 3/15 | 2,571,445バイト |
| MarkItDown 0.1.6デフォルト | N/A | N/A | N/A | 0バイト |
MarkItDownのデフォルトパスは、両方のラスタのみの入力に対して空のファイルを返したため、N/Aとマークされています。Doclingの生のMarkdownが大きいのは、ページ画像をBase64として埋め込むためです。これは品質スコアではなく、診断情報です。
ベンチマークは完全に再現可能です。すべての生の出力、SHA-256ダイジェスト、スコアリングルール、機械可読な結果がリポジトリにコミットされています。自分で実行して結果を検証できます。
すべてのフォーマットに対応する単一パイプライン
doc7の強みの1つは、フォーマットのカバレッジです。PDF、Officeドキュメント、スキャン、スクリーンショット、チャート、数式、図のいずれを扱う場合でも、すべて同じ視覚的理解パイプラインを通過します。出力は単一のMarkdownドキュメントで、以下を保持します。
- 見出し、段落、リスト、引用、コード → ネイティブなMarkdown構造
- 表とスプレッドシート → 値と単位を含むMarkdownまたはHTMLテーブル
- 数式 → インラインまたは表示LaTeX
- チャート → ラベル、値、トレンド、結論を検索可能なテキストとして
- 図とワークフロー → ノード、順序、グループ化、関係性
- スクリーンショットとアプリケーション状態 → 表示されるステータス、エラー、コントロール、アクション
- メールメッセージ → ヘッダー、HTMLまたはテキスト本文、インライン画像、添付ファイルの一覧
- Jupyterノートブック → Markdownセル、ソースコード、実行数、テキスト出力、トレースバック、視覚的出力
サポートされる入力形式には、PDF、DOCX、PPTX、XLSX、EPUB、EML、MHTML、MSG、IPYNB、画像(PNG、JPEG、GIF、WebP、BMP、TIFF、SVG)、およびMarkdown、CSV、JSON、XML、YAMLなどのネイティブテキスト/データ形式が含まれます。OfficeおよびOpenDocumentファイルにはLibreOfficeが必要です。PDFレンダリングには、利用可能な場合はMuPDFを使用します。HTML、SVG、EPUB、メール形式には、Chrome、Chromium、またはEdgeが必要です。
CLIを中心に設計
コマンドラインインターフェースはdoc7の中心です。単純な変換から、ページ選択、再開、バッチ処理などの高度な機能まで、すべてを提供します。
ページ選択と再開
長いドキュメントはチャンクで処理でき、失敗したページは最初からやり直すことなく再試行できます。
# 5ページと7ページのみを処理
doc7 read report.pdf -o report-pages-5-7 --pages 5,7
# 前回の実行を再開し、失敗したページを再試行
doc7 read report.pdf -o report-doc7 --resume
マニフェストにはソースページ数とページ選択が記録され、成功したページはバイト単位で変更されません。失敗したページが残っていない場合、--resumeはアーティファクトを検証し、モデルを呼び出さずにマージされたMarkdownを再構築します。
パイプと標準入力
マージされたMarkdownを別のツールに直接パイプできます。
doc7 read report.pdf --stdout > report.md
# または標準入力から読み取る
cat report.pdf | doc7 read - --stdin-name report.pdf --stdout > report.md
リモートドキュメントとディレクトリ
# ディレクトリを再帰的に読み取る
doc7 read ./documents -o ./knowledge
# リモートドキュメントを読み取る
doc7 read https://example.com/report.pdf -o ./report-doc7
サービスとして実行
大規模なシステムへの統合のために、doc7は非同期HTTPサービスとして実行できます。
doc7 serve --addr 127.0.0.1:8787 --data-dir ./doc7-server
ドキュメントまたはZIPアーカイブを送信します。
curl -F [email protected] http://127.0.0.1:8787/v1/jobs
応答にはジョブIDが含まれます。ステータスURLをポーリングし、マージされたMarkdownまたは完全なアーティファクトZIPをダウンロードします。
curl http://127.0.0.1:8787/v1/jobs/<job-id>
curl -o report.md http://127.0.0.1:8787/v1/jobs/<job-id>/markdown
curl -o report-artifacts.zip http://127.0.0.1:8787/v1/jobs/<job-id>/artifacts
ジョブ内の失敗したページを再開することもできます。
curl -X POST -H 'Content-Type: application/json' -d '{}' http://127.0.0.1:8787/v1/jobs/<job-id>/resume
セキュリティが組み込まれています。サービスはデフォルトでlocalhostにバインドされ、非ローカルバインドアドレスにはベアラートークンが必要で、アップロードサイズを制限し、各ジョブディレクトリを分離します。
AIツールから使用: MCPサーバー
doc7には、型付きのconvert_to_markdownツールを備えたMCPサーバーが含まれています。MCPクライアントを構成して、stdioでバイナリを起動します。
{
"mcpServers": {
"doc7": {
"command": "/absolute/path/to/doc7",
"args": ["mcp"],
"env": {
"DOC7_BASE_URL": "http://127.0.0.1:1234/v1",
"DOC7_MODEL": "qwen3.5-0.8b",
"DOC7_CREDENTIAL_STORE": "env"
}
}
}
}
このツールは、ローカルパス、ディレクトリ、HTTP(S) URL、またはZIPアーカイブを受け入れ、Markdownと構造化された変換メタデータを返します。
Goに埋め込む
公開Goパッケージは、同じ変換エンジンを公開しています。最小限の例を次に示します。
package main
import (
"context"
"log"
"github.com/magicrew/doc7"
)
func main() {
options := doc7.DefaultReadOptions()
options.OutputDir = "report-doc7"
options.BaseURL = "http://127.0.0.1:1234/v1"
options.Model = "qwen3.5-4b"
result, err := doc7.Read(context.Background(), "report.pdf", options)
if err != nil {
log.Fatal(err)
}
if result.Document != nil {
log.Println(result.Document.MergedMarkdown)
}
}
明示的な単一ドキュメントまたはディレクトリ専用APIには、ConvertとConvertBatchを使用することもできます。
コストとプライバシー: あなたのモデル、あなたのインフラストラクチャ
doc7はドキュメントクレジットを販売したり、ページごとに課金したりしません。独自のマルチモーダルモデル(ローカルまたはプライベート)を持ち込み、ハードウェアが処理できるだけのドキュメントを処理できます。追加のドキュメントの限界費用は、電気代と運用時間だけです。
これは、クラウドドキュメントAPIとは根本的に異なるコスト構造です。
| オプション | 一般的な課金単位 | ドキュメント量が増えたときのコスト | ドキュメントの場所 |
|---|---|---|---|
| doc7 + ローカル量子化VLM | doc7のページごとの料金なし | 主に既存のハードウェア、電気代、運用 | ローカルまたはプライベートインフラストラクチャ |
| AWS Textract | ページ、APIと分析機能ごとに価格設定 | 使用量はページと機能に応じて増加 | クラウドAPI |
| Google Document AI | ページ、通常はプロセッサとボリューム層ごとに価格設定 | 使用量はページとプロセッサタイプに応じて増加 | クラウドAPI |
| Azure Document Intelligence | ページ、モデル、価格層 | 使用量はページと選択した機能に応じて増加 | クラウドAPI |
| Alibaba Cloud OCR | 従量課金またはプリペイドパッケージ | 継続的な処理は呼び出しまたはクォータを消費 | クラウドAPI |
| Tencent Cloud OCR | プリペイドまたはポストペイド請求によるAPI呼び出し | 継続的な処理は呼び出しまたはクォータを消費 | クラウドAPI |
| Baidu AI Cloud OCR | API呼び出し、無料クォータ、有料使用 | 継続的な処理は呼び出しまたはクォータを消費 | クラウドAPI |
クラウドAPIは、管理された容量が必要で、モデルを運用したくない場合に依然として役立ちます。しかし、繰り返し発生するドキュメントパーサー請求を排除し、ドキュメントをプライベートに保ちたい場合は、doc7が最適です。
高度な機能
テキストグラウンディング
埋め込みテキストレイヤーを持つPDFおよびOfficeファイルの場合、オプションの正確な値チェックを有効にできます。
doc7 read report.pdf --text-grounding
これは、視覚的な結果を抽出されたテキストに置き換えるものではありません。代わりに、埋め込みテキストレイヤーからの正確な数値、コード、識別子をチェックし、視覚モデルに候補修正の確認を求めます。デフォルトではオフで、追加のモデルリクエストを行う場合があります。
コンテキストフォールバック
モデルのコンテキストウィンドウがページに対して小さすぎる場合、doc7は自動的に低解像度の画像で再試行します。これは--context-fallbacksと--min-image-dimensionで構成できます。すべてのフォールバックが使い果たされた場合、ページは切り詰められたMarkdownを書き込むのではなく、失敗としてマークされます。
カスタムプロンプト
doc7を変更せずにドメイン固有の変換プロンプトを使用できます。
doc7 read ./reports --prompt-file ./prompt.md
Docker
Dockerイメージには、LibreOffice、MuPDF、Chromium、CJKフォントが含まれています。HTTPサービスを非rootユーザーとして実行し、構成とジョブを名前付きボリュームに永続化します。
export DOC7_MODEL=qwen3.5-0.8b
export DOC7_SERVER_TOKEN=replace-me
docker compose pull
docker compose up --no-build
公開イメージはghcr.io/magicrew/doc7:latestで、linux/amd64とlinux/arm64の両方をサポートしています。
セキュリティに関する考慮事項
doc7は、LibreOfficeやChromeなどのローカルレンダラーを現在のユーザーの権限で実行します。信頼できないOfficeファイル、HTML、SVG、EML、MSG、IPYNB、アーカイブはアクティブな入力として扱い、信頼できないワークロードには分離されたアカウントまたはコンテナを使用してください。メールとノートブックのHTMLはサニタイズされ、リモートリソースは削除され、埋め込まれたBMP/TIFF画像はレンダリング前に正規化されます。APIキーはベアラークレデンシャルとして設定されたエンドポイントに送信されるため、機密ファイルを処理する前にエンドポイントを確認してください。
結論
doc7は、ドキュメント変換に対する新鮮なアプローチです。視覚的理解を活用することで、従来のパーサーが苦労する複雑なドキュメントを処理し、単純で統一されたパイプラインでそれを実現します。RAGシステム、エージェント知識ベースを構築している場合でも、ドキュメントを検索可能にする必要がある場合でも、doc7は真剣に検討する価値があります。オープンベンチマークと再現可能な結果はその機能に自信を与え、MITライセンスは自由に統合できることを意味します。
自分のドキュメントで試して、視覚的理解がもたらす違いを確認してください。
ソース
magicrew/doc7: Turn documents into AI-ready Markdown with visual understanding