คำถามที่พบบ่อย

คำถามทั่วไปเกี่ยวกับตัวแยกวิเคราะห์ใบแจ้งยอดบัญชีธนาคาร

ความเป็นส่วนตัวของข้อมูลและการปฏิบัติตามกฎระเบียบ

มีข้อมูลใดออกจากโครงสร้างพื้นฐานของฉันหรือไม่?

ไม่ — แม้แต่สำหรับการดึงข้อมูล PDF Bank Statement Parser ทำงานเป็นไลบรารีแบบ stateless การประมวลผลทั้งหมด — การแยกวิเคราะห์ การปกปิด PII การแยกไฟล์เก็บถาวร — เกิดขึ้นภายในหน่วยความจำรันไทม์ในเครื่อง ไปป์ไลน์ PDF แบบไฮบริดใช้ Ollama สำหรับ LLM inference ในเครื่อง — ไม่มี cloud API XML parser ถูกเสริมความแข็งแกร่งด้วย no_network=True เพื่อบล็อกการเข้าถึงขาออกทั้งหมดในระดับ parser ข้อมูลทางการเงินของคุณจะไม่ออกจากสภาพแวดล้อมของคุณ

การปกปิด PII ทำงานอย่างไร?

ฟิลด์ที่ละเอียดอ่อนจะถูกปกปิดก่อนที่จะถึงลอจิกแอปพลิเคชันของคุณ parser ระบุชื่อผู้ชำระ ชื่อผู้รับ IBAN และที่อยู่ไปรษณีย์ แทนที่ด้วย ***REDACTED*** ในเอาต์พุตคอนโซลและโหมดสตรีม

  • การปกปิดเปิดตามค่าเริ่มต้น ในเอาต์พุต CLI และโหมดสตรีม
  • การส่งออกไฟล์ (CSV, JSON, Excel) เก็บข้อมูลที่ไม่ได้ปกปิดสำหรับการประมวลผลปลายทาง
  • เลือกแสดง ข้อมูลเต็มด้วย --show-pii บน CLI หรือ redact_pii=False ใน API

กระบวนการดึงข้อมูลเป็นแบบ deterministic หรือไม่?

ใช่ สำหรับรูปแบบที่มีโครงสร้าง — เอาต์พุตเหมือนกันทุกไบต์ทุกครั้งที่รัน เมื่อได้รับไฟล์อินพุตเดียวกัน deterministic parsers (CAMT, PAIN.001, CSV, OFX, QFX, MT940) จะให้ผลลัพธ์เดียวกันทุกครั้ง ไม่มีการสุ่ม ไม่มีการ inference โมเดล ไม่มีการสุ่มตัวอย่างแบบ heuristic

สำหรับไปป์ไลน์ PDF แบบไฮบริด เส้นทางการดึงข้อมูลแบบ LLM อาจมีความแตกต่างเล็กน้อยระหว่างการรัน ด้วยเหตุนี้ การดึงข้อมูล PDF ทุกครั้งจึงถูกตรวจสอบด้วย Golden Rule (opening + credits − debits == closing) และความคลาดเคลื่อนที่ถูกแจ้งเตือนสามารถตรวจสอบแบบโต้ตอบได้

CI บังคับใช้ determinism ด้วย 718 การทดสอบที่ 100% branch coverage รวมถึง property-based fuzzing ผ่าน Hypothesis

โครงการปฏิบัติตามมาตรฐานอะไรบ้าง?

โครงการดูแลเอกสารตามมาตรฐาน ISO 13485 พร้อมการตรวจสอบย้อนกลับอย่างสมบูรณ์:

  • Risk Register เชิงปริมาณพร้อมการให้คะแนนความรุนแรง/ความน่าจะเป็นและการประเมินความเสี่ยงคงเหลือ
  • Verification and Validation Plan พร้อม 19 ขั้นตอนที่มีเกตใน 5 เฟส
  • Change Control Procedure พร้อมการประเมินผลกระทบและโปรโตคอลการย้อนกลับ
  • SOUP Register ครอบคลุม dependencies ทั้งหมดพร้อมระดับความเสี่ยงและการติดตาม EOL
  • Traceability Matrix แมป design inputs ไปยัง implementation และ verification

ทุกรีลีสมี CycloneDX SBOM, SHA-256 checksums และ GitHub build provenance attestation

ประสิทธิภาพและความสามารถในการขยายขนาด

Bank Statement Parser เร็วแค่ไหน?

เกณฑ์ประสิทธิภาพได้รับการตรวจสอบใน CI ทุกคอมมิต:

เมตริก ค่า
ปริมาณงาน CAMT.053 27,000+ ธุรกรรม/วินาที
ปริมาณงาน PAIN.001 52,000+ ธุรกรรม/วินาที
เวลาแฝงต่อธุรกรรม (CAMT) 37 ไมโครวินาที
เวลาแฝงต่อธุรกรรม (PAIN.001) 19 ไมโครวินาที
เวลาจนถึงผลลัพธ์แรก < 2 ms

ความเร็วในการดึงข้อมูล PDF ขึ้นอยู่กับเส้นทาง: deterministic (ต่ำกว่าวินาที), text-LLM (วินาที), vision-LLM (วินาทีต่อหน้า)

ไฟล์ขนาดใหญ่ถูกจัดการอย่างไร?

สตรีมด้วยหน่วยความจำคงที่ — ทดสอบที่ 50,000 ธุรกรรมต่อไฟล์ ใช้ parse_streaming() เพื่อประมวลผลไฟล์ XML แบบ incremental ธุรกรรมแต่ละรายการถูก yield เป็น dictionary องค์ประกอบจะถูกล้างหลังประมวลผลเพื่อป้องกันการเติบโตของหน่วยความจำ หน่วยความจำไม่ปรับขนาดตามขนาดไฟล์ — การทดสอบ 50K ธุรกรรม (25+ MB) ใช้หน่วยความจำน้อยกว่า 2 เท่าของการทดสอบ 10K ธุรกรรม

สำหรับไฟล์ที่เกิน 50 MB (เช่น ชุด PAIN.001 แบบ host-to-host ที่มีการชำระเงิน 100K+ รายการ) parser จะสตรีมผ่านไฟล์ชั่วคราวพร้อมการตัด namespace แบบ chunk — เอกสารทั้งหมดจะไม่ถูกโหลดเข้าหน่วยความจำ

ไฟล์ ZIP ถูกประมวลผลอย่างปลอดภัยอย่างไร?

iter_secure_xml_entries() ตรวจสอบสมาชิกแต่ละรายการก่อนแยก:

  • ขีดจำกัดขนาดรายการ (ค่าเริ่มต้น 10 MB ต่อรายการ)
  • ขีดจำกัดขนาดรวมที่ไม่บีบอัด (ค่าเริ่มต้น 50 MB)
  • ขีดจำกัดอัตราส่วนการบีบอัด (ค่าเริ่มต้น 100:1) เพื่อป้องกัน ZIP bomb
  • ปฏิเสธรายการที่เข้ารหัส

ไม่มีไฟล์ถูกเขียนลงดิสก์ ไบต์ XML ส่งผ่านไปยัง parser โดยตรงผ่าน from_bytes()

สามารถแยกวิเคราะห์หลายไฟล์พร้อมกันได้หรือไม่?

ได้ ใช้ parse_files_parallel() ซึ่งกระจายงานผ่าน ProcessPoolExecutor:

from bankstatementparser import parse_files_parallel

results = parse_files_parallel([
    "statements/jan.xml",
    "statements/feb.xml",
    "statements/mar.xml",
])
for r in results:
    print(r.path, r.status, len(r.transactions), "rows")

สำหรับการนำเข้า PDF จำนวนมาก ใช้ scan_and_ingest() ซึ่งประมวลผลโฟลเดอร์ทั้งหมดพร้อมการขจัดข้อมูลซ้ำอัตโนมัติ

รูปแบบที่รองรับ

รองรับรูปแบบใบแจ้งยอดธนาคารใดบ้าง?

รูปแบบ มาตรฐาน ประเภทไฟล์ Parser/Method
CAMT.053 ISO 20022 Bank-to-Customer Statement .xml CamtParser
PAIN.001 ISO 20022 Credit Transfer Initiation .xml Pain001Parser
CSV การส่งออกทั่วไปของธนาคาร .csv CsvStatementParser
OFX Open Financial Exchange .ofx OfxParser
QFX Quicken Financial Exchange .qfx QfxParser
MT940 มาตรฐาน SWIFT .mt940, .sta Mt940Parser
PDF ใบแจ้งยอดดิจิทัลและสแกน .pdf smart_ingest()

ไปป์ไลน์ PDF แบบไฮบริดทำงานอย่างไร?

ไปป์ไลน์ไฮบริด (v0.0.5+) ส่ง PDF ผ่านสามเส้นทางการดึงข้อมูลอย่างชาญฉลาด:

  • เส้นทาง A (Deterministic): ตาราง PDF ที่มีโครงสร้างถูกแยกวิเคราะห์โดยตรง — ฟรี เร็วที่สุด ไม่ต้องใช้ LLM
  • เส้นทาง B (Text-LLM): PDF ดิจิทัลที่มีเลย์เอาต์ซับซ้อน ดึงข้อมูลผ่าน LLM ในเครื่อง (LiteLLM/Ollama)
  • เส้นทาง C (Vision-LLM): ใบแจ้งยอดที่สแกนหรือถ่ายเอกสาร ประมวลผลด้วยโมเดล vision แบบ multimodal

การดึงข้อมูลทุกครั้งจะถูกตรวจสอบด้วย Golden Rule (opening + credits − debits == closing) ความคลาดเคลื่อนสามารถตรวจสอบแบบโต้ตอบด้วย --type review

parser รองรับ dialect เฉพาะธนาคารของ CAMT.053 หรือไม่?

ใช่ — ออกแบบให้ไม่ขึ้นกับ namespace parser จะตัด XML namespace ก่อนประมวลผล รองรับ CAMT.053 ทุกเวอร์ชัน (camt.053.001.02, camt.053.001.04 หรือ wrapper เฉพาะธนาคาร) โดยไม่ต้องกำหนดค่าเฉพาะ namespace XPath query กำหนดเป้าหมายโครงสร้างองค์ประกอบ ไม่ใช่ namespace URI

สำหรับธนาคารที่ห่อ CAMT ใน envelope แบบกำหนดเอง ใช้ from_string() หรือ from_bytes() เพื่อป้อนเอกสารภายในโดยตรง

สามารถแมปหัวคอลัมน์ CSV แบบกำหนดเองกับ schema มาตรฐานได้หรือไม่?

ได้ — ปรับมาตรฐานอัตโนมัติ ไม่ต้องกำหนดค่า CsvStatementParser รู้จักรูปแบบหัวคอลัมน์ทั่วไป: "Date", "Transaction Date", "Booking Date" ทั้งหมดแมปไปที่ฟิลด์ date "Amount", "Value", "Sum" แมปไปที่ amount คอลัมน์เครดิต/เดบิตแยก (เช่น "Credit" และ "Debit") จะถูกตรวจจับและรวมเป็นจำนวนเงินที่มีเครื่องหมายโดยอัตโนมัติ

รูปแบบเอาต์พุตคืออะไร?

parser ทุกตัวสร้าง pandas DataFrames มาตรฐานพร้อมประเภทคอลัมน์ที่สอดคล้องกัน:

รูปแบบ คอลัมน์สำคัญ
CAMT Amount, Currency, DrCr, Debtor, Creditor, Reference, ValDt, BookgDt, AccountId
PAIN.001 PmtInfId, PmtMtd, InstdAmt, Currency, CdtrNm, EndToEndId, MsgId, CreDtTm, NbOfTxs
CSV/OFX/QFX/MT940 date, description, amount (ปรับมาตรฐานแล้ว)

คุณยังสามารถส่งออกเป็น CSV, JSON, Excel, Polars DataFrames, hledger หรือ beancount journal format

คุณสมบัติ PDF และ LLM

ไปป์ไลน์ไฮบริดรองรับโมเดล LLM ใดบ้าง?

ไปป์ไลน์ใช้ LiteLLM เป็นชั้น model abstraction พร้อม Ollama bridge สำหรับ vision prompts โมเดลที่แนะนำ:

  • การดึงข้อความ: โมเดลใดก็ได้ที่เข้ากันได้กับ LiteLLM (ในเครื่องหรือ remote)
  • การดึงด้วย vision: ollama/minicpm-v (แนะนำ) สำหรับ PDF ที่สแกน
  • การจัดหมวดหมู่: โมเดลใดก็ได้ที่เข้ากันได้กับ LiteLLM

โมเดลทั้งหมดสามารถทำงานในเครื่อง 100% ผ่าน Ollama — ไม่ต้องใช้ API keys

Golden Rule verification คืออะไร?

การดึงข้อมูล PDF ทุกครั้งจะถูกตรวจสอบด้วยสมการ: opening balance + credits − debits == closing balance ผลลัพธ์จะถูกแท็กเป็น:

  • VERIFIED: ยอดคงเหลือตรงกันทุกประการ
  • DISCREPANCY: ยอดคงเหลือไม่ตรงกัน — แนะนำให้ตรวจสอบ
  • FAILED: ไม่สามารถทำการตรวจสอบได้ (ข้อมูลยอดคงเหลือไม่ครบ)

สามารถจัดหมวดหมู่ธุรกรรมอัตโนมัติได้หรือไม่?

ได้ โมดูล enrichment (v0.0.6+) ให้การจัดหมวดหมู่ธุรกรรมด้วย LLM:

from bankstatementparser.enrichment import Categorizer

categorizer = Categorizer()
enriched = categorizer.categorize_batch(transactions)

schema ค่าเริ่มต้นใช้ 13 หมวดหมู่ที่เข้ากันได้กับ Plaid คุณสามารถกำหนด category schema เองได้

สามารถส่งออกเป็น hledger หรือ beancount ได้หรือไม่?

ได้ (v0.0.8+) ส่งออกธุรกรรมเป็นรูปแบบ plaintext-accounting journal พร้อมการแมปบัญชี:

from bankstatementparser.export import to_hledger, to_beancount

journal = to_hledger(transactions, account="Assets:Bank:Checking")

เวิร์กโฟลว์คลัง

parser จัดการใบแจ้งยอดหลายสกุลเงินอย่างไร?

ธุรกรรมแต่ละรายการคงสกุลเงินเดิม — ไม่มีการแปลงโดยนัย ฟิลด์ Currency ถูกดึงจาก XML attribute Ccy ต่อธุรกรรม ใบแจ้งยอดหลายสกุลเงินจะคงอยู่ตามเดิม method get_account_balances() จะส่งคืนยอดเปิดและปิดต่อบัญชีพร้อมรหัสสกุลเงินเดิม

ตั้งแต่ v0.0.8 verify_balance_multi_currency() จัดกลุ่มธุรกรรมตามสกุลเงินและรัน Golden Rule แยกต่างหากต่อกลุ่ม — มีประโยชน์สำหรับบัญชีที่ถือหลายสกุลเงิน

parser รองรับทั้งรูปแบบขาออกและขาเข้าหรือไม่?

ใช่ Pain001Parser จัดการไฟล์ ISO 20022 PAIN.001 credit transfer initiation (การชำระเงินขาออก) CamtParser จัดการไฟล์ CAMT.053 bank-to-customer statement (การรายงานขาเข้า) ทั้งสองรองรับสตรีม การปกปิด PII และส่งออกเป็น CSV, JSON, Excel, hledger และ beancount ใช้ detect_statement_format() เพื่อระบุรูปแบบโดยอัตโนมัติ

เกิดอะไรขึ้นเมื่อรายการธุรกรรมมีรูปแบบไม่ถูกต้อง?

พฤติกรรมขึ้นอยู่กับโหมดการแยกวิเคราะห์:

  • parse() (โหมด batch) -- รายการที่มีรูปแบบไม่ถูกต้องซึ่งขาดฟิลด์ที่จำเป็น (Amount, Currency หรือ CdtDbtInd) จะถูกข้ามพร้อมบันทึกคำเตือน ส่วนที่เหลือของใบแจ้งยอดจะแยกวิเคราะห์ตามปกติ
  • parse_streaming() (โหมดสตรีม) -- ข้อผิดพลาดในการแยกวิเคราะห์จะเผยแพร่ทันทีเป็น exception ไม่มีการสูญเสียข้อมูลแบบเงียบ พฤติกรรม fail-fast นี้ตั้งใจสำหรับเวิร์กโฟลว์ทางการเงินที่ทุกธุรกรรมต้องถูกบันทึก
  • smart_ingest() (PDF ไฮบริด) -- ข้อผิดพลาดในการดึงข้อมูลจะถูกบันทึกใน IngestResult พร้อมสถานะการตรวจสอบ ช่วยให้ตรวจสอบแบบโต้ตอบได้

การขจัดข้อมูลซ้ำทำงานอย่างไร?

ธุรกรรมแต่ละรายการจะได้รับ transaction_hash แบบ idempotent (MD5 fingerprint) ตามฟิลด์สำคัญ สิ่งนี้ช่วยให้นำเข้าแบบ incremental ได้อย่างปลอดภัย — การประมวลผลไฟล์เดิมซ้ำจะสร้าง hash เดียวกัน ดังนั้นรายการซ้ำจะถูกตรวจจับโดยอัตโนมัติ

from bankstatementparser import CamtParser, Deduplicator

parser = CamtParser("statement.xml")
dedup = Deduplicator()
result = dedup.deduplicate(dedup.from_dataframe(parser.parse()))

print(f"Unique: {len(result.unique_transactions)}")
print(f"Exact duplicates: {len(result.exact_duplicates)}")
print(f"Suspected matches: {len(result.suspected_matches)}")

การติดตั้งและความเข้ากันได้

ติดตั้ง Bank Statement Parser อย่างไร?

# ติดตั้งแบบพื้นฐาน (deterministic parsers เท่านั้น)
pip install bankstatementparser

# ไปป์ไลน์ PDF แบบไฮบริด
pip install 'bankstatementparser[hybrid]'         # เส้นทาง Text-LLM
pip install 'bankstatementparser[hybrid-vision]'   # เส้นทาง Vision-LLM

# ตัวเลือกเสริม
pip install 'bankstatementparser[enrichment]'      # การจัดหมวดหมู่ธุรกรรม
pip install 'bankstatementparser[api]'             # REST API microservice
pip install 'bankstatementparser[polars]'          # รองรับ Polars DataFrame

รองรับ Python เวอร์ชันใด?

Python 3.10 ถึง 3.14 การรองรับ Python 3.9 ถูกยกเลิกใน v0.0.6 (EOL 2025-10-31) ทุกเวอร์ชันถูกทดสอบใน CI ด้วย 718 การทดสอบที่ 100% branch coverage

Dependencies มีอะไรบ้าง?

ไลบรารีหลักมี dependencies โดยตรง 5 รายการ:

  • lxml -- การแยกวิเคราะห์ XML พร้อมการเสริมความปลอดภัย
  • pandas -- DataFrames และการจัดการข้อมูล
  • openpyxl -- การส่งออก Excel
  • pydantic -- การตรวจสอบข้อมูลและโมเดล
  • defusedxml -- การป้องกัน XXE

ตัวเลือกเสริมเพิ่ม: litellm, pypdf, pdfplumber, pypdfium2, fastapi, uvicorn, polars

Dependencies ทั้งหมดมีเวอร์ชันที่ล็อกด้วย SHA-256 hash CycloneDX SBOM แมปทุกองค์ประกอบรันไทม์

ใช้งานได้บน macOS, Linux และ Windows หรือไม่?

ใช่ ไลบรารีใช้งานได้บน macOS, Linux และ Windows (ผ่าน WSL) ไม่มี dependencies เฉพาะแพลตฟอร์ม

มี REST API หรือไม่?

มี (v0.0.8+) ติดตั้งด้วย pip install 'bankstatementparser[api]' แล้วรัน:

bankstatementparser-api --port 8000

Endpoints: POST /ingest (แยกวิเคราะห์ใบแจ้งยอด) และ GET /health (ตรวจสอบสถานะ)

ความสามารถในการทำซ้ำและความปลอดภัย

ตรวจสอบความสามารถในการทำซ้ำได้อย่างไร?

python -m pytest                              # 718 tests, 100% branch coverage
python scripts/verify_locked_hashes.py        # SHA-256 hash verification
git log --show-signature -1                   # Verify commit signature

มีการป้องกันความปลอดภัยอะไรในตัวบ้าง?

  • การป้องกัน XXE: resolve_entities=False, no_network=True, load_dtd=False
  • การป้องกัน ZIP Bomb: จำกัดอัตราส่วนการบีบอัด ขีดจำกัดขนาดรายการ ปฏิเสธรายการที่เข้ารหัส
  • การป้องกัน Path Traversal: บล็อกรูปแบบอันตรายและแก้ไข symlink
  • การตรวจสอบอินพุต: ขีดจำกัดขนาดไฟล์ (ค่าเริ่มต้น 100 MB) การตรวจสอบนามสกุล/รูปแบบ
  • Supply Chain: Dependencies ล็อกด้วย SHA-256 hash, CycloneDX SBOM, build provenance attestation
  • Signed Commits: บังคับใช้ใน CI
  • LLM ในเครื่อง: ไปป์ไลน์ PDF แบบไฮบริดใช้ Ollama — ไม่มีการเรียก cloud API

Bank Statement Parser เปรียบเทียบกับ pyiso20022 อย่างไร?

pyiso20022 เป็นชุดเครื่องมือ ISO 20022 แบบกว้างที่สร้าง Python dataclasses จาก ISO XML schemas ครอบคลุมข้อความ ISO 20022 หลายประเภท (PACS, PAIN, CAMT, ADMI) พร้อมการตรวจสอบ schema Bank Statement Parser สร้างขึ้นเฉพาะสำหรับการแยกวิเคราะห์ใบแจ้งยอดธนาคารพร้อมรองรับ PDF แบบไฮบริด การตรวจสอบยอดคงเหลือ การเสริมข้อมูล การส่งออก ledger และ API แบบรวมในเจ็ดรูปแบบรวมถึงรูปแบบที่ไม่ใช่ ISO (CSV, OFX, QFX, MT940, PDF) หากต้องการแยกวิเคราะห์ใบแจ้งยอดธนาคารลงใน DataFrames พร้อมความปลอดภัยระดับใช้งานจริง ใช้ Bank Statement Parser หากต้องการทำงานกับแค็ตตาล็อกข้อความ ISO 20022 ทั้งหมด ใช้ pyiso20022

เส้นตายการย้ายข้อมูล SWIFT ISO 20022 คืออะไร?

SWIFT ได้เผยแพร่ไทม์ไลน์การย้ายข้อมูลแบบเป็นขั้นตอน:

  • พฤศจิกายน 2026: ที่อยู่แบบมีโครงสร้างและแบบผสมมีผลบังคับ ข้อความ MT101 แบบหลายคำสั่งจะถูกปฏิเสธ Case Management Phase 1 เริ่มต้น
  • พฤศจิกายน 2027: สถาบันการเงินทุกแห่งต้องสามารถรับใบแจ้งยอด CAMT.053 ได้ SWIFT จะหยุดแปลงรูปแบบ MT เป็น ISO
  • พฤศจิกายน 2028: เลิกใช้ MT940, MT942, MT950, MT900 และ MT910 ทั้งหมด จะถูกแทนที่ด้วย CAMT.052, CAMT.053 และ CAMT.054 ที่เทียบเท่า

Bank Statement Parser รองรับทั้งรูปแบบ MT940 แบบเดิมและรูปแบบ CAMT.053/PAIN.001 สมัยใหม่ จึงเหมาะสมสำหรับช่วงการเปลี่ยนผ่าน