BookTranslator
BookTranslator

Cách dịch tài liệu dài bằng LLM cục bộ: Chia đoạn và kiểm tra

Chúng tôi đã dịch 3.179 từ bằng LLM cục bộ trong LM Studio theo ba cách, và mỗi cách đều ẩn chứa một lỗi âm thầm. Kích thước đoạn, cài đặt và các bước kiểm tra giúp phát hiện chúng.

BookTranslator

BookTranslator Team

17 min read

Người ta dịch tài liệu bằng LLM cục bộ vì một lý do: tệp không thể rời khỏi máy của họ. Một mô hình cục bộ có thể làm được việc đó, nhưng nó chỉ trả về văn bản thuần, không phải tệp đã dịch, và những lỗi tồi tệ nhất của nó lại rất âm thầm. Trong thử nghiệm của chúng tôi, một yêu cầu duy nhất cho đoạn trích 3.179 từ trả về đúng số đoạn và tín hiệu kết thúc sạch sẽ, vậy mà một đoạn đã mất hơn một phần ba nội dung và có thêm những câu không hề có trong bản gốc.

Câu trả lời ngắn gọn: chia văn bản tại ranh giới đoạn thành các khối khoảng 600 từ, đưa bảng thuật ngữ gồm tên riêng và các thuật ngữ lặp lại vào chỉ dẫn hệ thống, tắt chế độ suy nghĩ của mô hình, và so sánh từng khối với đoạn gốc tương ứng theo từng đoạn trước khi tin tưởng nó. Mỗi cách trong ba cách chúng tôi chạy thử đều thất bại ở đâu đó, và không có lỗi nào tạo ra thông báo lỗi. Hãy dự kiến một mô hình cỡ trung bình trên máy tính xách tay sẽ mất hàng giờ cho cả một cuốn sách, và bạn sẽ phải tự dựng lại định dạng.

Tất cả nội dung dưới đây đến từ một lần chạy vào ngày 23 tháng 10 năm 2026: Qwen 3.6 27B (Q4_K_M GGUF) trong LM Studio 0.4.8 trên Apple M4 Max với 64 GB bộ nhớ, dịch phần mở đầu của Die Verwandlung của Kafka từ tiếng Đức sang tiếng Anh. Kịch bản thử nghiệm, kết quả và các ví dụ lỗi thô được tải miễn phí để bạn có thể lặp lại với mô hình của riêng mình.

Khi nào LLM cục bộ là công cụ phù hợp

Hãy chạy dịch cục bộ khi các quy định về tài liệu, chứ không phải sự tiện lợi, quyết định điều đó:

  • hợp đồng khách hàng, thỏa thuận nghiên cứu hoặc chính sách của người sử dụng lao động cấm tải tệp lên dịch vụ bên ngoài;
  • văn bản mang tính cá nhân hoặc bảo mật và bạn không thể loại bỏ trước các phần nhạy cảm; hoặc
  • bạn cần xử lý nhiều tệp mà không tốn chi phí cho từng tài liệu và bạn đã có sẵn phần cứng phù hợp.

Nếu không có trường hợp nào ở trên, mô hình cục bộ thường là con đường chậm hơn dẫn đến kết quả kém hơn. Bạn đánh đổi ba thứ mà một dịch vụ dịch tài liệu cung cấp: tệp đã dịch giữ nguyên định dạng gốc, một mô hình lớn hơn khả năng chứa của máy bạn, và một quy trình được thiết kế để đảm bảo tính nhất quán trên toàn bộ cuốn sách. Trước khi chọn một trong hai hướng, hãy xem qua danh sách kiểm tra quyền riêng tư khi dịch tài liệu. Nó bao gồm thẩm quyền xử lý tệp, bản sao làm việc tối thiểu và những gì dịch vụ làm với tệp tải lên.

"Cục bộ" cũng cần một định nghĩa chính xác. Mô hình chạy trên máy tính của bạn, và trong thử nghiệm của chúng tôi, các yêu cầu chỉ đi đến localhost. Điều đó không cho bạn biết ứng dụng xung quanh mô hình ghi nhật ký, cập nhật hoặc báo cáo những gì. Nếu quy định của bạn yêu cầu bằng chứng rằng không có gì rời khỏi thiết bị, hãy kiểm tra cài đặt và chính sách của chính môi trường chạy, hoặc chạy nó trên một máy không có kết nối mạng.

Những gì chúng tôi đã thử nghiệm

Chúng tôi đã dịch 19 đoạn đầu của Die Verwandlung (3.179 từ tiếng Đức) từ bản in Project Gutenberg thuộc phạm vi công cộng. Tiếng Đức văn học là một bài kiểm tra căng thẳng công bằng: các đoạn dài, câu lồng nhau, và cùng những nhân vật và chức danh lặp đi lặp lại.

Cả ba lần chạy đều dùng cùng một mô hình và cài đặt: nhiệt độ 0,2, tối đa 12.000 token đầu ra và cửa sổ ngữ cảnh 16.384 token. Chỉ dẫn yêu cầu mỗi đoạn tiếng Đức tương ứng với một đoạn tiếng Anh và không gì khác.

Lần chạyNhững gì chúng tôi gửiSố đoạn đầu ra (nguồn: 19)Số từ đầu raThời gian
A. Chia khối6 khối khoảng 600 từ, chỉ có chỉ dẫn193,31910,4 phút
B. Chia khối + bảng thuật ngữ + ngữ cảnhCùng các đoạn như vậy, một bảng thuật ngữ 7 mục và đoạn nguồn trước đó được đánh dấu "KHÔNG dịch"203,44610,5 phút
C. Một yêu cầuCả 19 đoạn cùng một lúc193,3099,5 phút

Mọi lần chạy đều kết thúc bằng tín hiệu dừng bình thường, và mỗi lần chạy đều chứa một lỗi âm thầm khác nhau. Lần chạy C đã bỏ sót và bịa thêm văn bản. Lần chạy B đã dịch đoạn văn bản được yêu cầu bỏ qua. Lần chạy A, sạch nhất, đã gán sai vai trò cho một nhân vật trong đoạn cuối cùng.

Lỗi 1: Một yêu cầu lớn duy nhất đã làm rơi mất một phần đoạn văn

Lần chạy C kết thúc bình thường và trả về đúng 19 đoạn. Một bước kiểm tra số lượng đoạn sẽ cho nó đạt. Tuy nhiên, đoạn 6 trả về chỉ có 214 từ so với nguồn 260 từ.

Trong nguyên bản, Gregor nhìn đồng hồ, nhận ra mình đã lỡ chuyến tàu, rồi cân nhắc gọi điện xin nghỉ ốm: sếp của anh sẽ đến cùng bác sĩ bảo hiểm y tế, người luôn coi mọi người đều khỏe mạnh nhưng lười làm việc, và Gregor thừa nhận rằng anh thực ra vẫn thấy khỏe, chỉ hơi buồn ngủ và có cảm giác thèm ăn lạ thường. Lần chạy C đã dịch phần đầu, rồi bỏ toàn bộ đoạn xin nghỉ ốm, tức 98 trong số 260 từ tiếng Đức của đoạn. Thay vào đó, nó viết rằng Gregor "lẽ ra đã bị sa thải ngay lập tức", rằng trợ lý văn phòng có xu hướng "coi mọi thứ được báo cáo cho mình là cơ hội để thể hiện bản thân", và rằng ý nghĩ đó "khiến anh mỉm cười". Không có điều nào trong số đó có trong bản tiếng Đức.

Lần chạy chia đoạn đã dịch trọn vẹn đoạn văn đó, với 267 từ.

Một mẫu không chứng minh rằng các yêu cầu dài luôn thất bại. Nó cho thấy điều cần kiểm tra: một yêu cầu dài duy nhất có thể âm thầm nén hoặc bịa thêm văn bản trong khi vẫn trông có vẻ đầy đủ về cấu trúc. Một độc giả không biết tiếng Đức sẽ không có lý do gì để nhận ra.

Lỗi 2: Mô hình đã dịch phần "ngữ cảnh" được yêu cầu bỏ qua

Một mẹo phổ biến là gửi kèm đoạn trước đó với mỗi đoạn để mô hình giữ mạch. Trong lần chạy B, chúng tôi đã thêm nó vào tin nhắn dưới nhãn "Ngữ cảnh (đã dịch, KHÔNG dịch)".

Trong đoạn thứ 4, mô hình vẫn dịch nó. Đoạn trả về bốn đoạn cho ba đoạn nguồn, và đoạn đầu tiên là bản dịch thứ hai của đoạn cuối cùng trong đoạn thứ 3. Khi ghép lại, cuốn sách sẽ chứa đoạn đó hai lần, mỗi lần một cách diễn đạt khác nhau.

Nguyên tắc thực tế: nếu bạn gửi ngữ cảnh, hãy giữ nó ngoài phần văn bản được yêu cầu dịch, giữ nó ngắn, và kiểm tra số lượng đoạn của từng phần. Nếu bạn không thể kiểm tra, hãy bỏ nó đi.

Lỗi 3: Một đoạn gửi riêng lẻ đã gán sai vai trò cho một nhân vật

Lần chạy A gửi từng đoạn mà không có bảng thuật ngữ và không có ngữ cảnh. Với năm đoạn đầu, cách này hiệu quả: Prokurist trở thành "chief clerk" trong cả 16 lần xuất hiện. Đoạn thứ sáu là một đoạn duy nhất trong đó viên chief clerk mắng Gregor qua cánh cửa. Khi nhìn riêng lẻ, mô hình đã dịch der Prokurist thành "the traveling salesman", tức công việc của chính Gregor. Số lượng đoạn khớp và tỷ lệ độ dài là 1,00, nên cả hai bước kiểm tra cấu trúc đều không phát hiện ra.

Trong lần chạy B, với bảng thuật ngữ trong chỉ dẫn hệ thống và đoạn trước đó làm ngữ cảnh, cùng đoạn văn đó đã dùng đúng "chief clerk". Thử nghiệm này không thể nói yếu tố nào trong hai đã sửa được lỗi. Vì ngữ cảnh cũng gây ra lỗi 2, bảng thuật ngữ là nơi an toàn hơn để mang tên và vai trò qua các đoạn: nó ngắn, nằm trong chỉ dẫn, và bạn có thể kiểm tra nó một cách máy móc.

Quy trình đã trụ vững

1. Trước tiên, trích xuất văn bản thuần từ tệp

Một LLM cục bộ dịch văn bản, không dịch tệp. Hãy chuyển đổi tài liệu trước khi bắt đầu:

  • DOCX hoặc EPUB: xuất sang văn bản thuần hoặc Markdown với mỗi khối là một đoạn, giữ các tiêu đề thành dòng riêng.
  • PDF có lớp văn bản: trích xuất văn bản, rồi sửa các dòng bị ngắt và gạch nối. Hướng dẫn của chúng tôi về sửa ngắt dòng và gạch nối OCR cũng đề cập đến việc dọn dẹp tương tự. Một công cụ chuyển đổi như Docling có thể tạo Markdown từ PDF và tệp Office.
  • PDF quét: chạy OCR trước. Nếu bạn không chắc một PDF có văn bản dùng được hay không, hãy xem Trích xuất văn bản PDF so với OCR.

Giữ nguyên cấu trúc đoạn văn. Mọi bước kiểm tra sau đó đều dựa vào việc khớp một-một giữa đoạn nguồn và đoạn dịch.

2. Tắt chế độ suy luận và xác nhận lại

Nhiều mô hình mở hiện nay suy luận trước khi trả lời. Với dịch thuật, điều này lãng phí thời gian và token đầu ra. Trong thiết lập của chúng tôi, một yêu cầu thử nghiệm 200 token đã dùng 199 token cho suy luận và trả về câu trả lời rỗng.

Chúng tôi đã thử ba cách chuyển đổi phổ biến. Thêm /no_think vào lời nhắc không có tác dụng, và chat_template_kwargs với enable_thinking: false cũng không có tác dụng. Gửi "reasoning_effort": "none" trong yêu cầu đã tắt suy luận: phản hồi báo cáo 0 token suy luận và trả về bản dịch trực tiếp. Tham số này không được liệt kê trên trang chat completions của LM Studio, nên hãy coi đây là hành vi chúng tôi quan sát được ở phiên bản 0.4.8 với mô hình này. Hãy kiểm tra số lượng reasoning_tokens trong phản hồi của chính bạn thay vì tin vào bất kỳ công tắc nào.

3. Đặt kích thước cửa sổ ngữ cảnh trước khi chia đoạn

Cửa sổ ngữ cảnh phải chứa chỉ dẫn, đoạn văn và toàn bộ bản dịch. Trong các lần chạy chia đoạn của chúng tôi, một đoạn tiếng Đức 500–670 từ dùng khoảng 800–1.500 token đầu vào, tùy thuộc vào bảng thuật ngữ và ngữ cảnh, và 640–870 token đầu ra, vì vậy vài nghìn token là đủ. Yêu cầu đơn lẻ 3.179 từ cần 4.953 token đầu vào và 3.930 token đầu ra.

Ollama đặt độ dài ngữ cảnh mặc định theo bộ nhớ khả dụng: 4k token dưới 24 GiB VRAM, 32k từ 24 đến 48 GiB, và 256k từ 48 GiB trở lên, theo tài liệu về độ dài ngữ cảnh được kiểm tra vào ngày 23 tháng 10 năm 2026. Bạn có thể tăng nó bằng OLLAMA_CONTEXT_LENGTH. Trong LM Studio, hãy đặt độ dài ngữ cảnh khi bạn tải mô hình. Nếu một đoạn cộng với bản dịch của nó không vừa, đầu ra có thể bị cắt cụt.

4. Chia đoạn tại ranh giới đoạn văn, khoảng 600 từ

Không bao giờ chia bên trong một đoạn văn hoặc câu. Các đoạn của chúng tôi nhắm mục tiêu 700 từ và kết thúc tại ranh giới đoạn văn gần nhất, tạo ra sáu đoạn từ 243 đến 667 từ. Các đoạn nhỏ hơn tốn ít chi phí: lần chạy A mất 10,4 phút so với 9,5 phút cho yêu cầu đơn lẻ, và một đoạn bị lỗi thì chạy lại rất rẻ.

Giữ chỉ dẫn ngắn gọn và giống hệt nhau cho mọi đoạn. Chỉ dẫn của chúng tôi là: dịch sang tiếng Anh, giữ chính xác một đoạn đầu ra cho mỗi đoạn đầu vào được phân tách bằng một dòng trống, và chỉ xuất bản dịch. Thêm một bảng thuật ngữ vào cùng chỉ dẫn: một dòng cho mỗi tên, chức danh hoặc thuật ngữ lặp lại, theo dạng Prokurist = chief clerk. Hướng dẫn của chúng tôi về xây dựng bảng thuật ngữ dịch thuật đề cập đến những gì cần bao gồm. Các đoạn ngắn làm mất câu chuyện xung quanh, và bảng thuật ngữ là thứ mang nó theo.

5. Kiểm tra từng đoạn trước khi ghép chúng lại

Chạy ba bước kiểm tra trên mỗi đoạn:

  1. Số lượng đoạn văn. Đầu ra phải có cùng số đoạn văn với đầu vào. Điều này đã phát hiện lỗi 2.
  2. Tỷ lệ độ dài trên mỗi đoạn văn. So sánh số từ của mỗi đoạn dịch với nguồn của nó. Điều này đã phát hiện lỗi 1, mà kiểm tra số lượng đoạn văn đã bỏ sót.
  3. Thuật ngữ trong bảng thuật ngữ trên mỗi đoạn văn. Ở nơi một thuật ngữ nguồn xuất hiện, bản dịch yêu cầu của nó phải xuất hiện cùng số lần. Điều này đã phát hiện lỗi 3, mà cả hai kiểm tra kia đều bỏ sót. Các ngôn ngữ biến đổi hình thái sẽ cần một chút phán đoán ở đây, vì một thuật ngữ tiếng Đức hoặc tiếng Nga thay đổi hình thức.

Đối với văn xuôi tiếng Đức sang tiếng Anh, các đoạn của lần chạy A nằm trong khoảng 0,98 đến 1,17 từ ra trên mỗi từ vào. Đoạn bị hỏng của lần chạy C là 0,82. Hãy đặt phạm vi của riêng bạn bằng cách kiểm tra một vài đoạn bạn tin tưởng trong cặp ngôn ngữ của bạn; các giá trị mặc định trong tập lệnh của chúng tôi là điểm khởi đầu, không phải tiêu chuẩn.

Một đoạn bị gắn cờ là nơi cần đọc trước, không phải bằng chứng về lỗi. Sau đó đọc chính bản dịch, đặc biệt là tên, số, phủ định và bất cứ điều gì người đọc sẽ hành động dựa trên đó. Danh sách kiểm tra QA dịch sách đề cập đến việc đánh giá đó.

6. Xây dựng lại tài liệu

Mô hình trả về văn bản. Tiêu đề, chú thích, bảng, hình ảnh, bố cục trang và kiểu dáng phải được đặt lại bằng tay hoặc bằng công cụ chuyển đổi. Đối với một báo cáo ngắn, điều này là nhỏ. Đối với một cuốn sách có chú thích và bảng, nó có thể mất nhiều thời gian hơn cả việc dịch.

Một cuốn sách hoàn chỉnh mất bao lâu

Lần chạy chia đoạn của chúng tôi đã dịch 3.179 từ trong 10,4 phút, khoảng 300 từ mỗi phút trên máy này. Với tốc độ đó, một cuốn tiểu thuyết 90.000 từ sẽ mất khoảng năm giờ tạo, trước khi kiểm tra và chạy lại. Đó là phép tính đơn giản từ một lần chạy, không phải một phép đo chuẩn. Tốc độ thay đổi theo kích thước mô hình, lượng tử hóa, phần cứng, cặp ngôn ngữ và mức độ máy đang làm việc khác.

Tệp mô hình là 17,5 GB trên đĩa, và bộ nhớ đệm ngữ cảnh cùng bộ đệm thời gian chạy cần thêm bộ nhớ, vì vậy một máy cần bộ nhớ trống nhiều hơn đáng kể so với kích thước tệp. Một mô hình nhỏ hơn sẽ chạy nhanh hơn và trên ít bộ nhớ hơn, thường với một số chi phí về chất lượng. Hãy kiểm tra nó trên một mẫu đại diện trước khi cam kết cả một cuốn sách. Hướng dẫn của chúng tôi về LLM tốt nhất cho dịch thuật giải thích cách xây dựng mẫu đó và so sánh các mô hình một cách công bằng.

LLM cục bộ hay Dịch vụ dịch tài liệu

Câu hỏiLLM cục bộDịch vụ dịch tài liệu
Tệp có thể rời khỏi máy của bạn không?Không bắt buộcBắt buộc
Kết quả trả vềVăn bản thuần túy bạn tự ghép lạiMột tệp đã dịch
Kích thước mô hìnhGiới hạn bởi bộ nhớ của bạnGiới hạn bởi nhà cung cấp
Tính nhất quán trong toàn bộ cuốn sáchViệc của bạn: bảng thuật ngữ, chia đoạn, kiểm traĐược tích hợp trong một số dịch vụ
Chi phí mỗi tài liệuPhần cứng và thời gian của bạnGiá theo tài liệu hoặc theo từ

Nếu quy định của bạn cho phép tải tệp lên, một dịch vụ tài liệu sẽ loại bỏ phần lớn công việc ở trên. BookTranslator dịch toàn bộ tệp PDF, EPUB và DOCX và trả về một tệp đã dịch, và FAQ của nó nói rằng tệp tải lên và kết quả dịch không được dùng để huấn luyện mô hình AI. Đây là dịch vụ đám mây, nên không phải là lựa chọn khi tệp phải ở lại trên máy của bạn. Nếu bạn đang cân nhắc giữa tự chạy mô hình và trả tiền cho dịch vụ, chi phí thực tế của dịch thuật bằng LLM sẽ hướng dẫn cách lập ngân sách cho phần token.

Tải các tệp kiểm thử

Tất cả các tệp đều nằm trong thư mục /files/blog/translate-with-local-llm/:

  • local_llm_translation_test.py: bài kiểm thử đầy đủ với API cục bộ của LM Studio, gồm cả ba lần chạy. Trỏ nó vào một mô hình hoặc văn bản nguồn khác để lặp lại bài kiểm thử.
  • check_translation.py: so sánh văn bản nguồn và bản dịch theo từng đoạn và in ra các điểm không khớp về số đoạn, tỷ lệ độ dài ngoài phạm vi, và các thuật ngữ trong bảng thuật ngữ bị thiếu (với --term "Prokurist=chief clerk"). Nó hoạt động với đầu ra từ bất kỳ công cụ nào.
  • results.csv: mọi yêu cầu với số đoạn, số từ, số token và thời gian tương ứng.
  • failure-examples.txt: văn bản nguồn tiếng Đức và đầu ra thô của mô hình cho cả ba lỗi.

Hãy chạy check_translation.py với các thuật ngữ trong bảng thuật ngữ của bạn trên bất kỳ bản dịch dài nào trước khi bạn tin dùng nó. Việc này chỉ mất vài giây, và nó đã phát hiện cả ba lỗi trong bài kiểm tra này. Nó không thể cho bạn biết một câu trôi chảy có sai hay không, vì vậy những đoạn bị gắn cờ là nơi bạn bắt đầu đọc, chứ không phải nơi bạn kết thúc.

Bài viết liên quan