แปล PDF ด้วย BabelDOC บน custom OpenAI base URL

Updated 2026-07-30

ตัวแปลของ BabelDOC ออกแบบมาให้ OpenAI-compatible ตั้งแต่ต้น: สาม flag (--openai, --openai-base-url, --openai-api-key) บวก --openai-model เลือก endpoint และโมเดล ตั้ง base URL เป็น https://api.apisrouter.com/v1 แล้วแปลเอกสารด้วย Claude, DeepSeek, GLM หรือ Gemini ผ่าน key เดียว

คำตอบสั้น ๆ: สาม flag route ทุกการเรียกแปล

command line ของ BabelDOC รับ endpoint ตรง ๆ: --openai เปิดใช้ตัวแปลด้วย LLM, --openai-base-url ตั้งว่า request ไปที่ไหน, --openai-api-key ยืนยันตัวตน และ --openai-model เลือก id ของโมเดล ตัวอย่างใน README เองก็แสดง flag ชุดนี้เป๊ะ ๆ และหมายเหตุเรื่อง translation-service ของมันระบุว่ารองรับเฉพาะ LLM ที่ OpenAI-compatible เท่านั้น ซึ่งทำให้ gateway หลาย vendor ที่ OpenAI-compatible เป็นทางเลือกที่เข้ากันได้โดยธรรมชาติ ไม่ใช่ทางแก้ขัด เพราะ id ของโมเดลถูกส่งต่อเป็นสตริงธรรมดา อะไรก็ตามที่ endpoint เสิร์ฟก็ใช้ได้: เอกสารต้นทางเองก็แนะนำโมเดลตระกูล GLM และ DeepSeek ที่เป็นมิตรกับ OpenAI-compatible และผ่าน APIsRouter โมเดลเหล่านั้นก็อยู่เคียงข้าง id ของ Claude และ Gemini หลัง base URL เดียวกัน

babeldoc --files paper.pdf \
  --lang-in en --lang-out zh \
  --openai \
  --openai-model "deepseek-v4-flash" \
  --openai-base-url "https://api.apisrouter.com/v1" \
  --openai-api-key "$APISROUTER_API_KEY"

BabelDOC เปลี่ยน PDF ให้เป็นการเรียกโมเดลอย่างไร

BabelDOC (funstory-ai บน GitHub มีดาวประมาณ 9K จากทีมเดียวกับ Immersive Translate) เป็นตัวแปลเอกสาร PDF ที่รักษา layout ไว้: มัน parse โครงสร้างเอกสาร ป้องกันสูตรและรูปภาพ หาย่อหน้า แปลด้วย LLM แล้วประกอบ PDF กลับเป็นเวอร์ชันแปลอย่างเดียวและเวอร์ชันคู่ขนาน มันมาในรูปแบบ CLI และ Python API และเป็นคู่แบบ self-hosted ของบริการ BabelDOC ที่โฮสต์ไว้ เฟสการแปลคือจุดที่ endpoint สำคัญ เอกสารหนึ่งฉบับกลายเป็น request แบบ chat-completions ขนาดย่อหน้าจำนวนมาก ถูก throttle ด้วย flag --qps (ค่าเริ่มต้น 4 query ต่อวินาที) และประมวลผลด้วย worker pool (pool-max-workers ค่าเริ่มต้นตามค่า QPS) รูปทรงนั้นมีผลสองอย่าง อย่างแรก การแปลคือ workload แบบปริมาณ: PDF ยาวหนึ่งฉบับคือ call เล็ก ๆ หลายร้อยครั้ง ดังนั้นราคาต่อ token ทบต้นเร็ว อย่างที่สอง ต่างจาก workload แบบ retrieval ที่โมเดลส่วนใหญ่แค่อ่าน การแปลเขียนพอ ๆ กับที่อ่าน ดังนั้นราคา output token สำคัญพอ ๆ กับราคา input เวลาเปรียบเทียบ id BabelDOC ยังแคชการแปลด้วย ดังนั้นการรันเอกสารซ้ำจะใช้ผลลัพธ์เดิมนอกจากคุณส่ง --ignore-cache glossary CSV (--glossary-files) pin คำศัพท์ตลอดการรัน และ --max-pages-per-part แบ่งเอกสารขนาดใหญ่มากออกเป็นส่วน ๆ ที่แปลแล้วรวมกลับอัตโนมัติ

ตั้งค่าแบบเต็ม: flag ของ CLI หรือไฟล์ TOML config

สำหรับการใช้งานซ้ำ ค่าตั้งเดียวกันอยู่ในไฟล์ TOML ที่ส่งผ่าน --config ตาราง [babeldoc] รับ key เดียวกันในรูป kebab-case: openai, openai-model, openai-base-url, openai-api-key บวกตัวเลือก throughput และ output ซึ่งช่วยเก็บ key ให้พ้นจากประวัติ shell และทำให้ profile การแปลทำซ้ำได้ข้ามเอกสาร config ด้านล่างคือ profile ปริมาณที่ใช้งานจริง: id ที่เร็วสำหรับเอกสารส่วนใหญ่ QPS ที่ยกขึ้นให้ตรงกับ gateway แบบ pooled และคง output ทั้งสองโหมดไว้ สลับ openai-model เป็น id ที่แข็งแกร่งกว่าสำหรับเอกสารที่ nuance สำคัญกว่า throughput

[babeldoc]
lang-in = "en-US"
lang-out = "zh-CN"
qps = 10
pool-max-workers = 10

# Translation service
openai = true
openai-model = "deepseek-v4-flash"
openai-base-url = "https://api.apisrouter.com/v1"
openai-api-key = "sk-YOUR-APISROUTER-KEY"

# Output control
no-dual = false
no-mono = false
watermark-output-mode = "no_watermark"

เลือกโมเดลสำหรับการแปล

workflow การเปรียบเทียบเป็นรูปธรรม: แปลสิบหน้าเดียวกันด้วย id สองตัว (แคชที่ key ตาม run แยกกันไว้) อ่านคู่ขนานเทียบกัน แล้วดู usage log ต่อ key ว่าแต่ละรอบมีต้นทุนเท่าไหร่ ทีมส่วนใหญ่ลงเอยที่ default แบบเร็วบวกกับ profile แบบพรีเมียมสำหรับเอกสารที่คุ้มค่า ทั้งคู่เป็นไฟล์ TOML

  • เอกสารปริมาณมาก (คู่มือ, paper ที่อ่านครั้งเดียว) เหมาะกับ deepseek-v4-flash: คุณภาพการแปลยังคงอยู่สำหรับร้อยแก้วเชิงเทคนิค และต้นทุนต่อหน้าแทบไม่มีนัยสำคัญ
  • การแปลเป็นภาษาจีนเป็นสนามเหย้าของ glm-5.2 และตระกูล DeepSeek เอกสารต้นทางเองก็ชี้ไปที่โมเดล GLM และ DeepSeek ว่าเป็นตัวเลือกที่ประพฤติตัวดีแบบ OpenAI-compatible
  • เอกสารที่ nuance สำคัญ (สัญญา, งานแปลที่เผยแพร่) คุ้มค่ากับ claude-sonnet-4-6 หรือ claude-haiku-4-5-20251001 ซึ่งตามคำศัพท์และ register ได้ซื่อตรงกว่าตลอดเอกสารยาว
  • output token สำคัญที่นี่ การแปลเขียนพอ ๆ กับที่อ่าน ดังนั้นเปรียบเทียบ id ที่คอลัมน์ราคา output ด้วย ไม่ใช่แค่ input
  • จับคู่ glossary กับ id ที่เร็ว glossary CSV pin คำศัพท์ที่โมเดลเร็วบางครั้งเบี่ยงเบน ซึ่งปิดช่องว่างคุณภาพส่วนใหญ่บนข้อความเชิงเทคนิค

จ่ายตามการใช้งาน · ถูกกว่าราคาทางการ

Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.

โมเดลราคาทางการราคาของเรา
DeepSeek V4 Flash$0.14 / $0.28 per M$0.10 / $0.30 per M
GLM-5.2$1.14 / $4.00 per M$1.10 / $4.00 per M
Gemini 3.5 Flash$1.50 / $9.00 per M$1.20 / $7.20 per M
Claude Haiku 4.5 20251001$1.00 / $5.00 per M$0.80 / $4.00 per M
Claude Sonnet 4.6$3.00 / $15.00 per M$2.40 / $12.00 per M

รูปแบบความล้มเหลวและการปรับ throughput

QPS คือปุ่มที่โต้ตอบกับ gateway ค่าเริ่มต้น 4 query ต่อวินาทีค่อนข้างระมัดระวัง ความจุ upstream แบบ pooled มักรองรับได้มากกว่า และการยก --qps ขึ้น (พร้อม pool-max-workers ตามไป) คือวิธีที่เอกสาร 300 หน้าเลิกกินเวลาทั้งบ่าย ค่อย ๆ ปรับขึ้นพร้อมเฝ้าดู response 429 แทนที่จะกระโดดไปตัวเลขใหญ่ทันที เพราะย่อหน้าที่ถูก rate-limit จะ retry และทำให้ทั้งการรันช้าลง flag เหล่านี้ใช้ได้ก็ต่อเมื่อตั้ง --openai แล้ว การส่ง base URL โดยไม่มี --openai จะทำให้ตัวแปลปิดอยู่ ซึ่งแสดงออกมาเป็นการรันที่ parse PDF ได้แต่ไม่เคยแปล id ของโมเดลเป็นสตริงที่ต้องตรงเป๊ะกับรายการ /v1/models ของ endpoint การพิมพ์ผิดจะทำให้ call ย่อหน้าแรกล้มเหลวด้วย model-not-found 401 หมายความว่า key และ base URL ไม่ได้อยู่คู่กัน ปัญหา layout ไม่ใช่ปัญหา endpoint ข้อความซ้อนทับกัน สูตรหาย หรือตารางพัง สืบไปที่ฝั่ง parsing ของ PDF (ลอง --enhance-compatibility, --ocr-workaround สำหรับเอกสารที่สแกน หรือ toggle rich-text) และการเปลี่ยนโมเดลจะไม่แก้มัน ในทางกลับกัน คำศัพท์ที่แปลผิดคือปัญหาโมเดลหรือ glossary ไม่ใช่ปัญหา parser แคชสามารถบดบังการเปลี่ยนแปลงได้ หลังเปลี่ยนโมเดล ให้ส่ง --ignore-cache ถ้าต้องการให้ id ใหม่แปลเนื้อหาที่ id เก่าครอบคลุมไว้แล้วซ้ำ ไม่เช่นนั้นย่อหน้าที่แคชไว้จะคงเดิม

ใครที่ route BabelDOC ผ่าน gateway

  • นักวิจัยที่แปล paper เป็นจำนวนมาก ที่ call เล็ก ๆ หลายร้อยครั้งต่อเอกสารทำให้ราคาแบบปริมาณและการมองเห็น usage ต่อ key เป็นเกมทั้งหมด
  • ทีมที่ทำมาตรฐานเอกสารสองภาษา รัน profile แบบเร็วเป็น default และ profile แบบพรีเมียมกับ endpoint เดียวกันด้วยสตริงโมเดลต่างกัน
  • ผู้ใช้ในตลาดที่โมเดลแปลที่แข็งแกร่งที่สุดสำหรับคู่ภาษาของพวกเขาอยู่กับ vendor ต่างกัน: id ของ GLM, DeepSeek, Claude และ Gemini ทั้งหมดอยู่หลัง key เดียว
  • self-hoster ที่แทนที่บริการที่โฮสต์ไว้สำหรับเอกสารลับ เก็บ parsing ไว้ในเครื่องและส่งแค่ข้อความย่อหน้าไปยัง endpoint เดียวที่ตรวจสอบได้
  • นักพัฒนาที่ไม่มีสิทธิ์เข้าถึงระบบเก็บเงินของ vendor รายหนึ่ง การเข้าถึงแบบเติมเงินโดยไม่ต้องใช้บัตรตัดการพึ่งพาการสมัครต่อ provider ออกไป

ตรวจสอบ endpoint และ debug เอกสารแรก

ลิสต์โมเดลที่ key ของคุณเรียกใช้ได้ก่อนเริ่มการรันยาว --openai-model ต้องตรงกับ id ที่เสิร์ฟจริงเป๊ะ จากนั้นแปลอะไรเล็ก ๆ (PDF หนึ่งหน้า หรือ --pages 1 บนไฟล์ใหญ่กว่า) จากต้นจนจบ 401 บนย่อหน้าแรกหมายความว่า key ไม่ตรงกับ base URL model-not-found คือ id พิมพ์ผิด การรันที่ parse ได้แต่ไม่เคยเรียก endpoint คือขาด --openai การค้างบ่อย ๆ พร้อมข้อความ retry ชี้ไปที่ QPS ที่ตั้งสูงกว่าที่ endpoint รองรับ ให้ลดแล้วค่อยปรับขึ้นใหม่ เมื่อเอกสารไหลลื่นแล้ว console ของ APIsRouter แสดงโมเดลต่อ request, จำนวน token และค่าใช้จ่าย ต้นทุนการแปลขยายตามความยาวเอกสารทั้งสองทิศทาง (input และ output) และ usage log ต่อ key คือที่ที่คุณเรียนรู้ต้นทุนจริงต่อหน้าของแต่ละโมเดลแทนการประมาณ

curl -s https://api.apisrouter.com/v1/models \
  -H "Authorization: Bearer $APISROUTER_API_KEY" | head -50

# then a one-page smoke test
babeldoc --config babeldoc.toml --files sample.pdf --pages 1

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

BabelDOC รองรับ custom OpenAI-compatible endpoint ไหม?

รองรับโดยตรง CLI มี --openai-base-url และ --openai-api-key คู่กับ --openai-model และไฟล์ TOML config รับ key เดียวกัน README ต้นทางระบุว่า LLM ที่ OpenAI-compatible เป็นประเภทตัวแปลที่รองรับ

BabelDOC แปลด้วยโมเดล Claude, GLM หรือ DeepSeek ได้ไหม?

ได้ id ของโมเดลถูกส่งต่อเป็นสตริงธรรมดาไปยัง endpoint หลัง --openai-base-url ดังนั้น id ในแคตตาล็อกใดก็ใช้ได้ เอกสารต้นทางเองก็แนะนำโมเดลตระกูล GLM และ DeepSeek ว่าเป็นตัวเลือกที่ประพฤติตัวดี

PDF หนึ่งฉบับใช้ API call กี่ครั้ง?

BabelDOC แปลเป็นชิ้นขนาดย่อหน้า ดังนั้นเอกสารหนึ่งฉบับกลายเป็น call แบบ chat-completions เล็ก ๆ หลายร้อยครั้งที่ถูก throttle ด้วย --qps ทั้ง input และ output token ขยายตามความยาวเอกสาร usage log ต่อ key แสดงต้นทุนที่แน่นอนต่อเอกสาร

ควรตั้ง QPS เท่าไหร่กับ gateway?

เริ่มใกล้ค่าเริ่มต้น 4 แล้วค่อย ๆ ปรับขึ้นพร้อมเฝ้าดู response 429 endpoint แบบ pooled มักรองรับได้มากกว่า และ pool-max-workers จะตามค่า QPS นอกจากตั้งแยก QPS ที่สูงขึ้นอย่างมั่นคงคือความต่างระหว่างนาทีกับชั่วโมงบนเอกสารยาว

ฉันเปลี่ยนโมเดลแล้วแต่การแปลไม่เปลี่ยน ทำไม?

แคชการแปล BabelDOC ใช้ผลลัพธ์ที่แคชไว้ซ้ำต่อเอกสาร ส่ง --ignore-cache หลังเปลี่ยน --openai-model เพื่อให้ id ใหม่แปลเนื้อหาที่เคยครอบคลุมไว้ซ้ำ

การเลือก endpoint มีผลต่อ layout, สูตร หรือตารางไหม?

ไม่มีผล การ parse, การวิเคราะห์ layout และการประกอบ PDF กลับรันในเครื่องไม่ว่าจะเลือก endpoint ไหน ปัญหา layout มี flag ของตัวเอง (--enhance-compatibility, --ocr-workaround) base URL ตัดสินแค่ว่าโมเดลไหนแปลข้อความ