Docpick について
Docpickは、文書から構造化JSONを得たい開発者やデータチーム向けのローカル文書抽出パイプラインです。OCRとLLM抽出をカスタムスキーマと組み合わせ、フィールド間や文書間の検証にも対応します。
主な機能
- 01ローカルOCRとLLMによる文書抽出
- 02PydanticとJSON Schemaに対応
- 038種類の組み込み文書スキーマ
- 04フィールド規則と文書間検証
- 05ディレクトリの並列バッチ処理
活用シーン
- 01請求書やレシートから構造化データを抽出
- 02金額、日付、識別番号の抽出結果を検証
- 03貿易書類や税務書類を一括処理
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Docpick
ドキュメントを入力し、構造化 JSON を出力。ローカルで。独自のスキーマを使用できます。
docpick は、ローカル OCR エンジンとローカル LLM を組み合わせ、請求書、領収書、船荷証券、税務フォームなど、あらゆるドキュメントから構造化 JSON を抽出する、軽量でスキーマ駆動型のドキュメント抽出パイプラインです。
- クラウド依存ゼロ — マシン上で完全に動作します(CPU または GPU)
- カスタムスキーマ — 独自の Pydantic モデルを定義するか、組み込みの 8 種類のドキュメントスキーマを使用できます
- 検証機能を内蔵 — チェックディジットの検証、フィールド間ルール、ドキュメント間の整合性
- Apache 2.0 — GPL/AGPL 依存関係なし
インストール
pip install docpick # core (LLM extraction only)
pip install docpick[paddle] # + PaddleOCR (recommended)
pip install docpick[easyocr] # + EasyOCR (Korean-optimized)
pip install docpick[got] # + GOT-OCR2.0 (GPU, vision-language)
pip install docpick[all] # all OCR backends
要件: Python 3.11 以降/LLM エンドポイント(vLLM、Ollama、または OpenAI 互換)
クイックスタート
Python API
from docpick import DocpickPipeline
from docpick.schemas import InvoiceSchema
pipeline = DocpickPipeline()
result = pipeline.extract("invoice.pdf", schema=InvoiceSchema)
print(result.data) # Structured dict matching schema
print(result.validation) # Validation errors/warnings
print(result.confidence) # Per-field confidence scores
CLI
# Extract structured data
docpick extract invoice.pdf --schema invoice --output result.json
# OCR only (no LLM)
docpick ocr document.png --lang ko,en
# Validate extracted JSON
docpick validate result.json --schema invoice
# Batch process a directory
docpick batch ./documents/ --schema invoice --output ./results/ --concurrency 4
# List available schemas
docpick schemas list
# Show schema details
docpick schemas show invoice
組み込みスキーマ
| スキーマ | ドキュメントの種類 | 主な検証 |
|---|---|---|
invoice | 商業請求書 | 明細の合計、税 ID のチェックディジット、日付の順序 |
receipt | 小売店/レストランの領収書 | 合計 = 小計 + 税額 + チップ |
bill_of_lading | 海上/航空 B/L | コンテナ重量の合計、ISO 6346、HS コード形式 |
purchase_order | 発注書 | PO 合計 = 明細、納入日の順序 |
kr_tax_invoice | 韓国の電子税務請求書(세금계산서) | 事業者番号のチェックディジット(x2)、供給額/税額/合計額 |
bank_statement | 銀行取引明細書 | IBAN mod97、期間の日付順 |
id_document | パスポート/ID(ICAO 9303) | MRZ、ISO 3166 国コード、日付範囲 |
certificate_of_origin | 原産地証明書 | ISO 3166 alpha-2 国コード |
カスタムスキーマ
Pydantic で独自のスキーマを定義できます。
from pydantic import BaseModel
from docpick import DocpickPipeline
from docpick.validation.rules import SumEqualsRule, RequiredFieldRule
class MyDocument(BaseModel):
"""Custom document schema."""
company_name: str | None = None
total_amount: float | None = None
tax_amount: float | None = None
net_amount: float | None = None
items: list[dict] | None = None
class ValidationRules:
rules = [
RequiredFieldRule("company_name"),
SumEqualsRule(["net_amount", "tax_amount"], "total_amount"),
]
pipeline = DocpickPipeline()
result = pipeline.extract("my_document.pdf", schema=MyDocument)
または、JSON Schema ファイルを使用できます。
docpick extract document.pdf --schema my_schema.json
検証
チェックディジットアルゴリズム
| アルゴリズム | 用途 |
|---|---|
kr_business_number | 韓国の事業者登録番号(10 桁) |
luhn | クレジットカード番号 |
iso_6346 | 輸送コンテナ番号 |
iban_mod97 | 国際銀行口座番号 |
awb_mod7 | 航空貨物運送状番号 |
mrz | 機械読取領域(パスポート/ID) |
フィールド間ルール
| ルール | 説明 |
|---|---|
SumEqualsRule | フィールドの合計が目標値と等しい(許容誤差あり) |
DateBeforeRule | 日付 A は日付 B より前である必要があります |
RequiredFieldRule | フィールドは null 以外かつ空でない必要があります |
FieldEqualsRule | 2 つのフィールドは等しい必要があります |
RangeRule | 数値フィールドが最小値/最大値の範囲内にあること |
RegexRule | フィールドが正規表現パターンに一致すること |
ドキュメント間の検証
関連するドキュメント(例:請求書 + B/L + 梱包明細書)間の整合性を検証します。
from docpick.validation.cross_document import create_trade_document_validator
validator = create_trade_document_validator()
result = validator.validate({
"invoice": invoice_data,
"bl": bl_data,
"packing_list": packing_list_data,
"certificate": certificate_data,
})
print(result.is_valid)
OCR エンジン
| エンジン | 種類 | GPU | 言語 | 最適な用途 |
|---|---|---|---|---|
| PaddleOCR | 従来型 OCR | 任意 | 111 | 一般的なドキュメント(デフォルト) |
| EasyOCR | 従来型 OCR | 任意 | 80+ | 韓国語テキスト |
| GOT-OCR2.0 | 視覚言語 | 必須 | 複数 | 複雑なレイアウト |
| VLM | 視覚言語 | 必須 | 複数 | 画像から直接 JSON を生成 |
2 階層の自動エンジン
デフォルトの auto エンジンは、信頼度に基づいてフォールバックします。
- Tier 1(CPU): PaddleOCR → EasyOCR
- Tier 2(GPU): GOT-OCR2.0 → VLM
Tier 1 の平均信頼度がしきい値(デフォルト 0.7)を下回ると、自動的に Tier 2 にエスカレーションします。
LLM プロバイダー
| プロバイダー | エンドポイント | デフォルトモデル |
|---|---|---|
| vLLM | http://localhost:8000/v1 | Qwen/Qwen3.5-32B-AWQ |
| Ollama | http://localhost:11434 | qwen3.5:7b |
CLI または YAML で設定できます。
docpick config set llm.provider ollama
docpick config set llm.base_url http://localhost:11434
docpick config set llm.model qwen3.5:7b
エラー処理
このパイプラインは、障害に強い設計になっています。
- OCR の失敗 → 次に利用可能なエンジンへ自動的にフォールバックします
- LLM の JSON 解析の失敗 → 修正プロンプトで自動的に再試行します(再試行は最大 1 回)
- 部分的な結果 → 抽出できたデータを返し、エラーは
result.errorsに記録します - ドキュメントの読み込みの失敗 → エラーメッセージとともに空の結果を返します
result = pipeline.extract("damaged.pdf", schema=InvoiceSchema)
if result.errors:
print("Pipeline warnings:", result.errors)
if result.data:
print("Partial extraction:", result.data)
バッチ処理
並列ワーカーを使ってディレクトリ全体を処理します。
from docpick.batch import BatchProcessor
from docpick.schemas import InvoiceSchema
processor = BatchProcessor(concurrency=4)
result = processor.process_directory(
"./invoices/",
schema=InvoiceSchema,
recursive=True,
)
print(f"Processed {result.succeeded}/{result.total} files")
for path, extraction in result.results.items():
print(f"{path}: {extraction.data.get('total_amount')}")
アーキテクチャ
flowchart TD
A["📄 Document\n(PDF / Image)"] --> B["DocumentLoader\n(pypdfium2)"]
B --> C["Tier 1: OCR\n(PaddleOCR / EasyOCR)\nCPU"]
C --> D{"Confidence\n≥ threshold?"}
D -->|"yes"| F["LLM Extractor\n(vLLM / Ollama)\nSchema prompt"]
D -->|"no"| E["Tier 2: VLM\n(GOT / VLM)\nGPU"]
E --> F
F --> G["Pydantic Validation"]
G --> H["✅ ExtractionResult"]
ライセンス
Apache 2.0 — すべての依存関係は Apache 2.0 または MIT ライセンスです。
QuartzUnit エコシステムの一部です。データ収集、抽出、検索、AI エージェントの安全性を実現する、組み合わせ可能な Python ライブラリを提供しています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。