Docpick

io.github.ArkNill由 GitHub 账号 ArkNill 发布v0.1.2更新于 Oct 25, 2026

Schema-driven document extraction with local OCR + LLM. Document in, Structured JSON out.

已验证STDIO仅桌面文件与存储数据与分析

概览

AI 生成的概览

Docpick 是一个本地运行、以模式驱动的文档抽取工具,借助本地 OCR 与本地 LLM 将发票、收据和表单转换为经过校验的结构化 JSON。

可以做什么
使用内置或自定义 Pydantic/JSON 模式从 PDF 和图片中抽取结构化 JSON,并提供逐字段置信度与失败时的部分结果。仅执行 OCR,支持韩文、英文等多种语言,并在 PaddleOCR、EasyOCR、GOT-OCR2.0 与 VLM 引擎间自动回退。通过校验位算法、跨字段规则和跨文档一致性检查验证抽取结果。以并行工作进程批量处理整个目录,并列出或查看八个内置模式。
适用场景
适合需要把发票、收据、提单、税务表单、银行对账单或身份证件等业务文档转换为结构化数据,同时让数据完全留在本机的场景。也适合批量处理文档目录以及校验一组成套贸易单据。
运行要求
以 Python 包形式本地运行(Python 3.11+),通过 pip 安装,可选装 OCR 附加组件。需要本地或兼容 OpenAI 的 LLM 端点,例如 vLLM 或 Ollama,并通过 CLI 或 YAML 配置。GOT-OCR2.0 与 VLM 引擎需要 GPU,PaddleOCR 与 EasyOCR 用 CPU 即可。
安装前请注意
抽取结果可能包含身份证件、银行对账单和税务表单中的敏感个人与财务信息,应保护本地 LLM 端点与输出文件。流程会写入结果文件和批量输出目录。抽取可能返回部分或未通过校验的数据,依赖结果前应查看校验错误与置信度。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Docpick,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

Docpick

[PyPI] [Python] [License] [Tests]

한국어 문서 · llms.txt

Document in, Structured JSON out. Locally. With your schema.

docpick is a lightweight, schema-driven document extraction pipeline that combines local OCR engines with local LLMs to extract structured JSON from any document — invoices, receipts, bills of lading, tax forms, and more.

  • Zero cloud dependency — runs entirely on your machine (CPU or GPU)
  • Custom schemas — define your own Pydantic models or use 8 built-in document schemas
  • Validation built-in — checkdigit verification, cross-field rules, cross-document consistency
  • Apache 2.0 — no GPL/AGPL dependencies

Install

bash
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

Requirements: Python 3.11+ / LLM endpoint (vLLM, Ollama, or OpenAI-compatible)

Quick Start

Python API

python
from docpick import DocpickPipelinefrom docpick.schemas import InvoiceSchema
pipeline = DocpickPipeline()result = pipeline.extract("invoice.pdf", schema=InvoiceSchema)
print(result.data)           # Structured dict matching schemaprint(result.validation)     # Validation errors/warningsprint(result.confidence)     # Per-field confidence scores

CLI

bash
# Extract structured datadocpick extract invoice.pdf --schema invoice --output result.json
# OCR only (no LLM)docpick ocr document.png --lang ko,en
# Validate extracted JSONdocpick validate result.json --schema invoice
# Batch process a directorydocpick batch ./documents/ --schema invoice --output ./results/ --concurrency 4
# List available schemasdocpick schemas list
# Show schema detailsdocpick schemas show invoice

Built-in Schemas

SchemaDocument TypeKey Validations
invoiceCommercial invoicesLine item sums, tax ID checkdigit, date order
receiptRetail/restaurant receiptsTotal = subtotal + tax + tip
bill_of_ladingOcean/air B/LContainer weight sums, ISO 6346, HS code format
purchase_orderPurchase ordersPO total = line items, delivery date order
kr_tax_invoiceKorean e-tax invoice (세금계산서)Business number checkdigit (x2), supply/tax/total sums
bank_statementBank statementsIBAN mod97, period date order
id_documentPassport/ID (ICAO 9303)MRZ, ISO 3166 country codes, date ranges
certificate_of_originCertificate of OriginISO 3166 alpha-2 country codes

Custom Schemas

Define your own schema with Pydantic:

python
from pydantic import BaseModelfrom docpick import DocpickPipelinefrom 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)

Or use a JSON Schema file:

bash
docpick extract document.pdf --schema my_schema.json

Validation

Check Digit Algorithms

AlgorithmUse Case
kr_business_numberKorean business registration number (10 digits)
luhnCredit card numbers
iso_6346Shipping container numbers
iban_mod97International bank account numbers
awb_mod7Air waybill numbers
mrzMachine Readable Zone (passport/ID)

Cross-Field Rules

RuleDescription
SumEqualsRuleSum of fields equals target (with tolerance)
DateBeforeRuleDate A must precede Date B
RequiredFieldRuleField must be non-null and non-empty
FieldEqualsRuleTwo fields must be equal
RangeRuleNumeric field within min/max bounds
RegexRuleField matches regex pattern

Cross-Document Validation

Validate consistency across related documents (e.g., Invoice + B/L + Packing List):

python
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 Engines

EngineTypeGPULanguagesBest For
PaddleOCRTraditional OCROptional111General documents (default)
EasyOCRTraditional OCROptional80+Korean text
GOT-OCR2.0Vision-LanguageRequiredMultiComplex layouts
VLMVision-LanguageRequiredMultiDirect image → JSON

2-Tier Auto Engine

The default auto engine uses confidence-based fallback:

  1. Tier 1 (CPU): PaddleOCR → EasyOCR
  2. Tier 2 (GPU): GOT-OCR2.0 → VLM

If Tier 1 average confidence falls below threshold (default 0.7), automatically escalates to Tier 2.

LLM Providers

ProviderEndpointDefault Model
vLLMhttp://localhost:8000/v1Qwen/Qwen3.5-32B-AWQ
Ollamahttp://localhost:11434qwen3.5:7b

Configure via CLI or YAML:

bash
docpick config set llm.provider ollamadocpick config set llm.base_url http://localhost:11434docpick config set llm.model qwen3.5:7b

Error Handling

The pipeline is designed to be resilient:

  • OCR failure → automatic fallback to next available engine
  • LLM JSON parse failure → automatic retry with correction prompt (up to 1 retry)
  • Partial results → returns whatever was extracted, with errors logged in result.errors
  • Document load failure → returns empty result with error message
python
result = pipeline.extract("damaged.pdf", schema=InvoiceSchema)if result.errors:    print("Pipeline warnings:", result.errors)if result.data:    print("Partial extraction:", result.data)

Batch Processing

Process entire directories with parallel workers:

python
from docpick.batch import BatchProcessorfrom 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')}")

Architecture

mermaid
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"]

License

Apache 2.0 — all dependencies are Apache 2.0 or MIT licensed.


Part of the QuartzUnit ecosystem — composable Python libraries for data collection, extraction, search, and AI agent safety.

来源:README.md,提交 173a35d

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.2最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分