프롬프트 변수
Read Frog 프롬프트가 쓸 수 있는 모든 변수와, 각 변수가 실제로 치환되는 값입니다.
변수는 {{name}} 형태로 씁니다. 요청이 전송되기 직전에 Read Frog는 알고 있는 변수를 각각 문자열로 치환합니다. 그 외에는 아무것도 건드리지 않습니다. {{url}}처럼 모르는 이름은 {{url}}이라는 문자 그대로 프롬프트에 남습니다.
아래 예시는 모두 같은 페이지에서 가져왔습니다. https://devblog.example.com/posts/timestamps에 있는 영어 글이며, 간체 중국어로 번역되는 중입니다.
어떤 변수를 어디에서 쓸 수 있나요
| 변수 | 페이지 프롬프트 | 자막 프롬프트 |
|---|---|---|
{{targetLanguage}} | 사용 가능 | 사용 가능 |
{{input}} | 사용 가능 | 사용 가능 |
{{webTitle}} | 사용 가능 | 사용 가능 |
{{webDescription}} | 사용 가능 | 사용 가능 |
{{webContent}} | 사용 가능 | — |
{{webSummary}} | 사용 가능 | — |
{{videoSummary}} | — | 사용 가능 |
{{videoSummary}}를 쓴 페이지 프롬프트나 {{webContent}}를 쓴 자막 프롬프트에는 그 문자 그대로가 남습니다. 편집기의 각 필드 아래에 있는 변수 버튼은 그 목록이 값을 채울 수 있는 변수만 제공합니다.
{{targetLanguage}}
번역해 넣을 언어의 영어 이름입니다. 언어 코드가 아니며, 인터페이스 언어에 맞춰 번역되지도 않습니다.
Simplified Mandarin Chinese다른 예: English, Traditional Mandarin Chinese, Japanese, Spanish. 그래서 Translate to {{targetLanguage}}:라고 쓴 프롬프트는 Translate to Simplified Mandarin Chinese:로 도착합니다.
{{input}}
번역할 텍스트입니다. 프롬프트가 없어서는 안 될 유일한 변수입니다.
한 번에 한 문단 — 앞뒤 공백은 제거되고, 보이지 않는 문자는 걸러집니다.
Every timestamp you store without a zone is a bug waiting for a plane ticket.한 번에 여러 문단. LLM 제공업체에서 배치 번역을 켰을 때 실제로 이렇게 됩니다. 문단은 %% 하나만 있는 줄로 이어지고, 그 줄 양쪽에는 빈 줄이 하나씩 놓입니다.
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.모델은 같은 개수의 문단을 같은 순서로, 같은 방식으로 구분해 돌려주어야 합니다. Read Frog는 그 %% 줄을 기준으로 응답을 다시 나눕니다. 프롬프트를 고쳐 쓰면서 구분자를 바꾸거나, 문단에 번호를 붙이거나 문단을 합치도록 요구하면 분할이 실패하고, 해당 배치 전체를 재시도한 뒤 문단을 하나씩 다시 보냅니다.
HTML이 있을 때, 즉 문단에 인라인 마크업이 들어 있는 경우입니다. 반드시 살아남아야 하는 속성은 따로 빼내고 요소에는 data-rf-attr 표시를 붙이므로, 모델은 URL 대신 표시 하나를 보게 됩니다.
The fix is <a data-rf-attr="0">boring</a>: store <code data-rf-attr="1">UTC</code>, render local.수식이나 인라인 기호가 있을 때는 번호가 붙은 자리표시자로 바뀌고, 번역이 끝난 뒤 원래 요소가 그 자리에 복제되어 돌아옵니다.
Converting is just {{0}}, which is why nobody gets it wrong twice.프롬프트를 쓰는 동안 이 두 가지 형태를 직접 보는 일은 거의 없지만, 요청에 규칙 블록이 더 붙는
이유를 설명해 줍니다. Read Frog는 이번에 보내는 텍스트에 실제로 data-rf-attr 표시나 번호가 붙은
자리표시자가 들어 있을 때에만 그에 대한 지시를 추가합니다.
{{webTitle}}
페이지의 <title>이며, 브라우저 탭에 보이는 것과 완전히 같습니다.
Why your timestamps are eight hours off — devblog자막 프롬프트에서는 대신 동영상의 제목이 들어갑니다.
{{webDescription}}
페이지가 직접 선언한 설명이며, <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.자막 프롬프트에서는 동영상의 설명이 들어갑니다.
{{webContent}}
페이지 본문을 Markdown으로 추출한 뒤 앞의 2000자까지 자른 값입니다. 내비게이션, 사이드바, 푸터는 버립니다. 내장 프롬프트 중에 이것을 쓰는 것은 없습니다. 제목만으로는 부족한 프롬프트를 위해 마련해 둔 변수입니다.
# 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자르는 기준은 문장이나 문단 경계가 아니라 단순한 글자 수이므로, 값은 보통 단어 중간에서 끊깁니다. 위의 예시가 바로 그렇습니다. 본문이 완전하다고 모델에게 알려 주는 프롬프트는 한두 화면을 넘는 페이지에서는 모두 틀린 말이 됩니다.
{{webSummary}}
내 LLM 제공업체가 작성한 페이지 요약입니다. 별도의 모델 호출이며, 페이지 단위로 캐시되고, 한 번만 만들어 그 페이지의 모든 문단에 재사용됩니다.
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.이 변수에는 AI 스마트 컨텍스트가 필요합니다(설정 → 페이지 번역). 꺼 두면 넣을 요약이 없으므로 변수는 아래의 대체 문자열이 됩니다. 기본 프롬프트가 {{webSummary}}를 쓰기 때문에, 스마트 컨텍스트를 꺼 두면 기본 시스템 프롬프트에는 항상 Webpage summary: No summary available이 적힙니다.
{{videoSummary}}
자막 쪽의 대응물입니다. 동영상 요약이며, 이것도 AI 스마트 컨텍스트가 필요하고, 꺼 두면 역시 대체 문자열이 됩니다.
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.값이 없을 때
변수는 비어 있는 상태로 남지도, 사라지지도 않습니다. 값이 없거나, 비어 있거나, 공백뿐이면 Read Frog는 고정된 영어 문장으로 치환합니다.
| 변수 | 대신 치환되는 값 |
|---|---|
{{webTitle}} | No title available |
{{webDescription}} | No description available |
{{webContent}} | No content available |
{{webSummary}}, {{videoSummary}} | No summary available |
그래서 메타데이터가 하나도 없고 스마트 컨텍스트를 꺼 둔 페이지에서는 기본 시스템 프롬프트가 이렇게 도착합니다.
## Document Metadata for Context Awareness
Webpage title: No title available
Webpage summary: No summary available이 점은 퓨샷 예시를 쓸 때 가장 크게 작용합니다. 페이지 제목으로 예시를 만들어 보여 주는 프롬프트는 제목이 없는 페이지에서 "No title available"이라는 제목의 페이지에 대한 예시를 모델에게 보여 주게 되고, 모델은 그 문장을 번역하거나 그에 대해 언급합니다. 프롬프트가 메타데이터 변수에 기대고 있다면, 값이 "No ... available"로 읽힐 때 어떻게 해야 하는지를 프롬프트 안에 직접 적어 두세요.
{{input}}과 {{targetLanguage}}에는 대체 값이 없습니다. {{targetLanguage}}는 항상 값이 있고, {{input}}은 바로 그 문단입니다. 빈 텍스트로는 요청을 보내지 않습니다.
그다음에 일어나는 일
치환된 텍스트가 요청의 전부는 아닙니다. 그 뒤에 추가 규칙 블록과 내 용어집 용어가 붙고, 완성된 결과가 번역 캐시 키가 됩니다. 요청이 조립되는 과정을 참고하세요.
