← Quay lại bài viết
Web 2026-04-17 · rev. 2026-05-10 ProtoMedia

Một trang web nói hàng chục ngôn ngữ, không cần người dịch

Dịch tự động từ tiếng Ý · đọc bản gốc

Cách chúng tôi xây dựng hệ thống dịch thuật hoạt động dưới những trang này: AI khi cần thiết, bộ nhớ cache luôn được sử dụng, không có độ trễ nhận thấy được.

Vấn đề của i18n truyền thống

Trong nhiều năm, việc quốc tế hóa một trang web là một cuộc hành trình nhỏ của quy trình làm việc: tệp .po, người dịch, khóa bị quên, triển khai bị trì hoãn vì "vẫn thiếu bản tiếng Đức". Việc thêm một ngôn ngữ tốn thời gian và tiền bạc; thêm mười ngôn ngữ là điều không thể đối với bất kỳ công ty nhỏ nào.

Với các LLM thế hệ mới nhất, chất lượng dịch tự động đã đạt đến mức đủ tốt — cho một trang web doanh nghiệp, không phải văn học. Câu hỏi không còn là "chúng ta có thể dịch tự động không", mà là "làm thế nào để tích hợp nó mà không làm hỏng trải nghiệm người dùng".

Kiến trúc, tóm tắt

Trang web được phục vụ tĩnh bằng tiếng Ý. Khi người dùng chọn một ngôn ngữ khác, một công cụ nhỏ sẽ hoạt động trên ba bộ sưu tập MongoDB:

  • i18n_base: các văn bản nguồn ở ngôn ngữ đã chọn (hiện tại là tiếng Ý), mỗi văn bản kèm theo khai báo ngôn ngữ, mô tả vị trí và lý do xuất hiện trên trang web (điều này rất quan trọng để đảm bảo chất lượng bản dịch), giọng văn và giới hạn ký tự. Mô tả này trở thành một phần của prompt gửi đến LLM, giúp LLM biết liệu nó đang dịch một nút hay một đoạn văn.
  • i18n_human: các bản dịch được biên tập thủ công, khi chúng ta muốn chất lượng biên tập cho một số trang thay vì kết quả từ LLM. Chúng có ưu tiên cao hơn bộ nhớ đệm tự động và tự động được "đánh dấu" khi văn bản nguồn thay đổi.
  • i18n_cache: các bản dịch đã được tạo, được lập chỉ mục theo (trường, ngôn ngữ). Mỗi mục lưu trữ dấu thời gian của văn bản gốc tại thời điểm tạo.
  • articoli_i18n: cùng một logic được áp dụng cho các nội dung dài hơn, chẳng hạn như bài viết này.

Khi truy cập lần đầu tiên bằng một ngôn ngữ mới, hệ thống chỉ yêu cầu LLM các trường thực sự còn thiếu, lưu câu trả lời vào bộ nhớ đệm và trả về cho trình duyệt. Trong các lần truy cập tiếp theo, cùng một ngôn ngữ sẽ hiển thị ngay lập tức, không cần gọi AI thêm nữa.

Vô hiệu hóa hoạt động hiệu quả

Bộ nhớ đệm là một lời nói dối có trật tự: nó nói "sự thật của tôi là như thế này" cho đến khi ai đó chứng minh nó sai. Cơ chế bác bỏ ở đây rất đơn giản: mỗi bản dịch được lưu trong bộ nhớ đệm sẽ lưu dấu thời gian của văn bản gốc đã tạo ra nó. Khi bạn sửa đổi văn bản tiếng Ý và cập nhật updated_at, tất cả các bản dịch của trường đó trong tất cả các ngôn ngữ sẽ tự động trở nên lỗi thời và được tái tạo khi cần thiết. Không cần phải thực hiện các thao tác thủ công, không cần phải xóa bộ nhớ đệm.

Người dùng không chờ đợi

Phần thú vị nhất không phải là bản dịch — mà là cách hiển thị nó. Khi thay đổi ngôn ngữ, trình duyệt hiển thị một trang tiếng Ý với các biểu tượng spinner nhỏ bên cạnh mỗi khối văn bản cần cập nhật. Thật dễ dàng để thực hiện một cuộc gọi duy nhất để dịch tất cả mọi thứ cùng một lúc: đơn giản, sạch sẽ và khiến người dùng phải chờ LLM hoàn thành tất cả trước khi thấy bất kỳ thay đổi nào.

Chúng tôi đã đi theo hướng ngược lại. Văn bản được nhóm theo phần (navbar, thân, footer) và chia thành các lô nhỏ gồm ba trường mỗi lần. Các cuộc gọi được gửi theo trình tự: trước tiên là một vài trường của navbar, xuất hiện trong vài giây — người dùng thấy rằng có điều gì đó đang xảy ra và bắt đầu đọc. Trong khi đọc, phần đầu tiên của thân bài xuất hiện, sau đó là phần thứ hai và cuối cùng là footer.

Bài học ngắn gọn: Vận tốc cảm nhận không phải là tổng vận tốc. Dịch từng phần một, theo thứ tự hiển thị, quan trọng hơn là hoàn thành trước.

Công việc ban đêm

Bộ nhớ cache chỉ có một kẻ thù thực sự: lần truy cập đầu tiên. Người dùng Đức đầu tiên phải trả giá cho tất cả các bản dịch trong tương lai, và trải nghiệm của họ là điều đọng lại trong tâm trí họ. Để loại bỏ (hoặc gần như loại bỏ) vấn đề này, một tác vụ chạy nền sẽ thức dậy mỗi phút, chọn ngôn ngữ được mong đợi nhất trong số những ngôn ngữ chưa hoàn thành, lấy một đoạn văn bản chưa được dịch và đưa nó đến LLM. Đến phút tiếp theo, lại đoạn văn bản khác. Trong vài ngày, các ngôn ngữ phổ biến nhất đã được "làm nóng" hoàn toàn.

Tác vụ ban đêm còn làm một công việc thứ hai: tự động xem xét các bản dịch có chất lượng đáng ngờ, thử lại chúng với một mô hình AI khác. Khi sự liên kết giữa các ngôn ngữ là quan trọng, một bản dịch kém chất lượng sẽ không ở lại như vậy.

Nếu bạn là người Đức đầu tiên trong ngày và đến trong khi hệ thống vẫn đang hoàn thiện bộ nhớ cache, bạn vẫn có thể tải theo tiến trình để giữ mình bận rộn. Nếu bạn là người thứ hai, bạn thậm chí không nhận ra điều đó.

Bạn nhận được gì

Một trang web đa ngôn ngữ mà không cần người dịch, không cần quản lý tệp, không cần triển khai để thêm một ngôn ngữ. Người dùng nhập một mã — ja, ca, eu, bất cứ mã nào họ muốn — và trang web sẽ được dịch. Lần thứ hai sẽ ngay lập tức. Lần thứ ba, rất có thể chúng tôi đã thực hiện điều đó rồi, được dịch trong thời gian thích hợp bởi một tác vụ không ngừng nghỉ.

Chính trang này, nếu bạn đang đọc nó bằng tiếng Đức, tiếng Tây Ban Nha, tiếng Hàn, thì không hề được viết bởi bất kỳ người dịch nào. Nó đã được dịch một lần duy nhất bởi một LLM, và kể từ đó nó đã được phục vụ từ bộ nhớ cache. Điều duy nhất được viết bằng tay là những gì bạn đang đọc bây giờ nếu nó bằng tiếng Ý.

Bạn có quan tâm đến việc mang kiến trúc này lên trang web của mình không? Hãy nói chuyện với chúng tôi.

Liên hệ với chúng tôi

Có nhận xét? Hãy viết cho chúng tôi

Tin nhắn này chỉ dành cho chúng tôi. Nếu bình luận của bạn hay, chúng tôi có thể đăng ở cuối bài viết sau khi xem xét.

Trong khi bạn nhập liệu, trình duyệt sẽ tự động giải một bài toán nhỏ – đây là cách chúng tôi chặn thư rác mà không cần dịch vụ bên ngoài hay yêu cầu bạn chọn đèn giao thông. Bạn không cần thực hiện thao tác nào và không có dữ liệu rời khỏi trang web này.