Read Frog

Biến trong câu lệnh

Mọi biến mà một câu lệnh Read Frog dùng được, kèm giá trị thật mà từng biến được thay bằng.

Một biến được viết dưới dạng {{name}}. Ngay trước khi một yêu cầu được gửi đi, Read Frog thay mỗi biến nó biết bằng một chuỗi. Ngoài ra không gì bị đụng tới: một cái tên lạ như {{url}} vẫn nằm trong câu lệnh đúng dưới dạng mấy ký tự {{url}}.

Các ví dụ dưới đây đều lấy từ cùng một trang — một bài viết tiếng Anh ở https://devblog.example.com/posts/timestamps, đang được dịch sang tiếng Trung giản thể.

Biến nào dùng được ở đâu

BiếnCâu lệnh trangCâu lệnh phụ đề
{{targetLanguage}}
{{input}}
{{webTitle}}
{{webDescription}}
{{webContent}}
{{webSummary}}
{{videoSummary}}

Câu lệnh trang mà dùng {{videoSummary}}, hay câu lệnh phụ đề mà dùng {{webContent}}, đều giữ lại nguyên văn bản đó. Các nút biến bên dưới mỗi trường trong trình chỉnh sửa chỉ đưa ra những biến mà danh sách đó điền được.

{{targetLanguage}}

Tên tiếng Anh của ngôn ngữ bạn đang dịch sang — không phải mã ngôn ngữ, và không dịch theo ngôn ngữ giao diện của bạn.

Simplified Mandarin Chinese

Ví dụ khác: English, Traditional Mandarin Chinese, Japanese, Spanish. Nên một câu lệnh viết là Translate to {{targetLanguage}}: khi tới mô hình sẽ là Translate to Simplified Mandarin Chinese:.

{{input}}

Văn bản cần dịch. Đây là biến duy nhất mà một câu lệnh không thể thiếu.

Mỗi lần một đoạn — khoảng trắng đầu và cuối đã bị cắt, ký tự vô hình đã bị loại:

Every timestamp you store without a zone is a bug waiting for a plane ticket.

Nhiều đoạn một lần, tức là tình huống thực tế khi bật dịch theo lô trên một nhà cung cấp LLM. Các đoạn được nối với nhau bằng một dòng không chứa gì ngoài %%, hai bên là một dòng trống:

Every timestamp you store without a zone is a bug waiting for a plane ticket.

%%

The fix is boring: store UTC, render local, and never let the two meet in a database column.

%%

Ordering by a naive timestamp works until the clocks change, and then it works wrongly.

Mô hình được kỳ vọng trả về đúng số đoạn đó theo đúng thứ tự đó, phân tách theo đúng cách đó. Read Frog cắt câu trả lời trở lại theo những dòng %% ấy. Nếu bạn viết lại câu lệnh theo cách làm đổi dấu phân tách, hoặc yêu cầu mô hình đánh số hay gộp các đoạn, việc cắt sẽ thất bại: cả lô được thử lại, rồi gửi lại từng đoạn một.

Kèm HTML, khi đoạn văn có thẻ nội dòng. Những thuộc tính phải giữ lại được bóc ra và phần tử được gắn data-rf-attr, nên mô hình nhìn thấy một dấu hiệu thay cho một URL:

The fix is <a data-rf-attr="0">boring</a>: store <code data-rf-attr="1">UTC</code>, render local.

Kèm công thức hay ký hiệu nội dòng, thứ được thay bằng một chỗ giữ có số thứ tự rồi sau đó được nhân bản trở lại vào bản dịch:

Converting is just {{0}}, which is why nobody gets it wrong twice.

Lúc viết câu lệnh bạn thường không thấy hai dạng này, nhưng chúng giải thích mấy khối quy tắc thêm vào xuất hiện trong một yêu cầu: Read Frog chỉ thêm hướng dẫn về data-rf-attr và về các chỗ giữ có số thứ tự khi văn bản đang gửi thực sự chứa chúng.

{{webTitle}}

Thẻ <title> của trang, y như tab trình duyệt hiển thị.

Why your timestamps are eight hours off — devblog

Trong một câu lệnh phụ đề, đây là tiêu đề của video.

{{webDescription}}

Phần mô tả do chính trang khai báo, lấy từ cái đầu tiên có nội dung trong số <meta name="description">, <meta property="og:description"><meta name="twitter:description">.

A short tour of the three places a naive timestamp can go wrong, and the one rule that prevents all three.

Trong một câu lệnh phụ đề, đây là phần mô tả của video.

{{webContent}}

Phần thân chính của trang, được trích ra dưới dạng Markdown rồi cắt còn 2000 ký tự đầu. Thanh điều hướng, thanh bên và chân trang bị bỏ. Không câu lệnh tích hợp sẵn nào dùng nó — nó dành cho những câu lệnh cần nhiều hơn một cái tiêu đề để làm việc.

# Why your timestamps are eight hours off

Every timestamp you store without a zone is a bug waiting for a plane ticket.
It works on your laptop, it works in CI, and it fails the first time somebody
in another country opens the report.

## Three places it goes wrong

1. **At the boundary.** A form posts `2026-03-14 09:00` and the server decides
   what that means.
2. **In the column.** `timestamp without time zone` is not a moment in time; it
   is a picture of a wall clock.
3. **On the way out.** Formatting in UTC and labelling it local is the same bug
   wearing a hat.

The fix is boring: store UTC, render local, and never let the tw

Chỗ cắt được tính thuần theo số ký tự, không theo ranh giới câu hay đoạn, nên giá trị thường kết thúc ngay giữa một từ — như ở trên. Một câu lệnh nói với mô hình rằng nội dung này là đầy đủ sẽ sai trên bất kỳ trang nào dài hơn một vài màn hình.

{{webSummary}}

Bản tóm tắt trang do nhà cung cấp LLM của bạn viết — một lần gọi mô hình riêng, lưu đệm theo từng trang, tạo một lần rồi dùng lại cho mọi đoạn.

A technical blog post arguing that timestamps should be stored in UTC and rendered in the reader's local zone. It identifies three failure points — form input, database column type, and output formatting — and recommends a single rule for all three. Written for backend developers; uses PostgreSQL column types as examples.

Nó cần Ngữ cảnh thông minh AI (Cài đặt → Dịch). Khi tắt, không có bản tóm tắt nào để chèn và biến này trở thành chuỗi dự phòng ở bảng bên dưới. Câu lệnh mặc định có dùng {{webSummary}}, nên để Ngữ cảnh thông minh tắt nghĩa là câu lệnh hệ thống mặc định luôn ghi Webpage summary: No summary available.

{{videoSummary}}

Bản tương ứng ở phía phụ đề: bản tóm tắt video, cũng cần Ngữ cảnh thông minh AI, và cũng thành chuỗi dự phòng khi nó tắt.

A conference talk on time zone handling in web applications. The speaker walks through a production incident caused by naive timestamps, then demonstrates a UTC-in, local-out pattern. Names mentioned: PostgreSQL, Temporal, Luxon.

Khi không có giá trị

Một biến không bao giờ bị để trống và không bao giờ biến mất. Nếu giá trị thiếu, rỗng, hoặc chỉ có khoảng trắng, Read Frog thay vào một câu tiếng Anh cố định:

BiếnĐược thay bằng
{{webTitle}}No title available
{{webDescription}}No description available
{{webContent}}No content available
{{webSummary}}, {{videoSummary}}No summary available

Nên trên một trang không có siêu dữ liệu nào và Ngữ cảnh thông minh đang tắt, câu lệnh hệ thống mặc định tới mô hình như thế này:

## Document Metadata for Context Awareness
Webpage title: No title available
Webpage summary: No summary available

Chuyện này quan trọng nhất khi bạn viết ví dụ few-shot. Một câu lệnh đưa cho mô hình một ví dụ mẫu dựng từ tiêu đề trang thì trên trang không có tiêu đề sẽ đưa cho nó một ví dụ về trang tên là "No title available" — và mô hình sẽ dịch hoặc bình luận về câu đó. Nếu câu lệnh của bạn dựa vào một biến siêu dữ liệu, hãy nói luôn trong câu lệnh: khi giá trị đọc ra là "No ... available" thì làm gì.

{{input}}{{targetLanguage}} không có giá trị dự phòng. {{targetLanguage}} thì luôn có giá trị, còn {{input}} chính là đoạn văn — không bao giờ có yêu cầu nào được gửi cho văn bản rỗng.

Sau đó là gì

Văn bản đã thay biến chưa phải toàn bộ yêu cầu: sau đó còn các khối quy tắc và các thuật ngữ trong bảng thuật ngữ của bạn được thêm vào, và kết quả cuối cùng trở thành key của bộ nhớ đệm bản dịch. Xem Một yêu cầu được ghép lại như thế nào.

On this page