Read Frog

요청이 조립되는 과정

Read Frog가 전송할 프롬프트를 어떤 순서로 만들어 내는지, 그리고 모델이 돌려준 텍스트로 무엇을 하는지 설명합니다.

내가 채운 두 프롬프트 필드가 그대로 브라우저를 떠나는 것은 아닙니다. Read Frog는 규칙 블록을 붙이고, 변수를 치환하고, 용어집 용어를 붙입니다. 그리고 모델의 응답이 페이지에 닿기 전에 그 응답에도 적잖은 작업을 합니다. 이 페이지는 두 절반을 순서대로 따라갑니다.

여기 나오는 모든 내용은 LLM 제공업체에 관한 것입니다. Google 번역, Microsoft 번역, DeepL은 프롬프트를 받지 않으므로 이 단계들은 그들에게 적용되지 않습니다.

요청 만들기

1. 문단 고르기

콘텐츠 스크립트는 문단이 뷰포트에 가까워지면 수집하고, 건너뛰기 규칙이나 짧은 문단 필터가 제외하는 것을 걸러낸 다음 나머지를 대기열에 넘깁니다. LLM 제공업체에서는 대기열이 서로 어울리는 문단을 하나의 요청으로 묶습니다. 같은 제공업체, 같은 언어 쌍, 같은 페이지 컨텍스트라는 조건으로, 요청 제어 및 일괄 번역 페이지에 있는 글자 수와 문단 수 상한까지 묶습니다. 그렇게 묶인 한 묶음이 {{input}}이 됩니다.

2. 프롬프트 선택

Read Frog는 내가 선택한 프롬프트 id를 찾습니다. 그것이 내장 프롬프트를 가리키면 내장 프롬프트가 쓰이고, 그렇지 않으면 내가 만든 프롬프트를 살펴봅니다. 어느 쪽에도 없으면 — 예컨대 사용 중이던 프롬프트를 삭제한 경우 — 실패하는 대신 기본으로 되돌아갑니다.

3. 규칙 블록 추가

추가 지시는 시스템 프롬프트 에 붙으며, 필요할 때에만 붙습니다. 같은 프롬프트가 문단에 따라 다른 요청을 만들어 내는 이유가 이것입니다.

규칙 블록추가되는 조건
여러 문단 규칙요청에 문단이 두 개 이상 담긴 경우
이미 번역된 입력 규칙요청에 문단이 두 개 이상 담긴 경우, 페이지 번역 전용
HTML 표시 보호 규칙텍스트에 data-rf-attr 표시가 있는 경우
자리표시자 보호 규칙텍스트에 번호가 붙은 수식 자리표시자가 있는 경우

문단이 하나뿐인 요청에는 하나도 붙지 않습니다. 자막 번역은 여러 문단 규칙은 받지만 이미 번역된 입력 규칙은 절대 받지 않습니다.

4. 변수 치환

이제 {{...}} 이름들이 두 필드 모두에서 프롬프트 변수에 설명된 값으로 치환됩니다. 알려진 이름만 치환되고, 그 밖의 것은 적힌 그대로 남습니다.

5. 용어집 붙이기

마지막으로, 내 용어집에 있는 용어 중 이 텍스트에 실제로 나타나는 것이 시스템 프롬프트 뒤에 붙습니다. 마지막에 붙는 것은 의도된 것입니다. 용어는 내가 입력한 텍스트이고, 치환보다 먼저 붙는다면 변수 이름을 우연히 포함한 용어가 그 주변의 프롬프트를 고쳐 쓸 수 있기 때문입니다.

완성된 요청

영어 글의 두 문단을 간체 중국어로 번역하며, 기본 프롬프트에 AI 스마트 컨텍스트는 꺼 둔 경우입니다. 나가는 시스템 프롬프트는 이렇습니다.

You are a professional Simplified Mandarin Chinese native translator who needs to fluently translate text into Simplified Mandarin Chinese.

## Translation Rules
1. Output only the translated content, without explanations or additional content ...
2. The returned translation must maintain exactly the same number of paragraphs and format as the original text.
3. If the text contains HTML tags, consider where the tags should be placed in the translation while maintaining fluency.
4. For content that should not be translated (such as proper nouns, code, etc.), keep the original text.

## Document Metadata for Context Awareness
Webpage title: Why your timestamps are eight hours off — devblog
Webpage summary: No summary available

## Multi-paragraph Translation Rules
1. If input contains a standalone line containing only %%, use a standalone %% line in your output ...
2. **CRITICAL**: Treat %% as a separator only when it appears on its own line ...

## OUTPUT FORMAT:
- **Single paragraph input** → Output translation directly (no separators, no extra text)
- **Multi-paragraph input** → Put %% on its own line between translations

## Already-translated Input Rule
Output only {{NO_TRANSLATION_NEEDED}} when only non-translatable names, brands, handles, URLs, numbers, or code differ from Simplified Mandarin Chinese. A foreign-language phrase or clause must be translated.

그리고 프롬프트는 이렇습니다.

Translate to Simplified Mandarin Chinese:


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.

콜론 뒤의 빈 줄 두 개를 보세요. 그것은 프롬프트 필드 자체에서 온 것입니다. 그 필드는 Translate to {{targetLanguage}}: 다음에 빈 줄 두 개, 그다음 {{input}}으로 되어 있습니다.

응답 읽기

1. 다듬고 나누기

응답은 먼저 앞뒤 공백을 다듬고, 그다음 %% 하나만 있는 줄을 기준으로 나눕니다. 각 조각은 다시 한 번 다듬어지고, 요청에서 같은 위치에 있던 문단과 짝지어집니다. 문장 안, 코드 예시 안, 인용문 안에 있는 %%는 구분자가 아닙니다. 그 줄에 다른 것이 하나도 없을 때에만 구분자입니다.

2. 개수 확인

Read Frog는 보낸 것과 정확히 같은 개수의 조각을 기대합니다. 개수가 맞지 않으면 부분 성공이 아니라 묶음 전체의 완전한 실패입니다. 해당 요청은 간격을 늘려 가며 최대 세 번까지 재시도하고, 그래도 맞지 않으면 그 묶음의 모든 문단을 하나씩 따로 다시 보냅니다. 그쪽이 더 느리고 비용도 더 들기 때문에, 모델에게 설명을 덧붙이게 하거나 문단을 합치게 하는 프롬프트는 단정하지 못한 정도가 아니라 실제로 돈이 드는 문제입니다.

3. "번역할 것이 없음" 처리

{{NO_TRANSLATION_NEEDED}}는 문단이 이미 대상 언어로 쓰여 있을 때 모델이 내놓도록 지시받은 답입니다. 어떤 조각이 정확히 그 표시뿐이면 Read Frog는 번역을 비어 있는 것으로 취급하고, 비어 있는 번역은 아무것도 렌더링하지 않습니다. 이중 언어 모드에서는 그 문단 아래에 두 번째 줄이 나타나지 않고, 번역만 모드에서는 원문이 그대로 보입니다.

이 표시는 캐시에 그대로 저장되므로, 이렇게 정리된 문단은 다음 방문 때 다시 전송되지 않습니다. 표시를 변수처럼 생긴 모양으로 만든 것은 의도적입니다. 변수 치환은 알고 있는 이름만 바꾸므로, 이 표시는 프롬프트 조립 과정을 아무 손상 없이 통과해 매번 똑같은 표기로 모델에 도착합니다.

4. 아무 말도 하지 않는 번역 버리기

같은 언어로 된 텍스트를 받은 모델은 위의 표시를 쓰는 대신 겉모습만 조금 다르게 바꿔 그대로 되돌려 주는 일이 많습니다. 공백이 재배치되거나, 곧은 인용 부호가 둥근 것으로 바뀌거나, 문장 부호가 전각으로 바뀝니다. Read Frog는 그런 차이를 접어 없앤 뒤 응답과 원문을 비교하고, 일치하면 결과를 역시 비어 있는 것으로 취급합니다. 여러 언어가 섞인 페이지에서 요청을 보냈는데도 어떤 문단에는 번역이 보이지 않는 이유가 이것입니다.

5. 표시 검증

텍스트가 data-rf-attr 표시를 싣고 갔다면, 응답은 각 표시를 정확히 한 번씩, 같은 종류의 요소에 붙여 돌려주어야 합니다. 표시가 빠지거나, 중복되거나, 없던 것이 생기거나, 다른 태그로 옮겨 갔으면 엉뚱한 곳을 가리키는 링크를 렌더링하는 대신 그 문단을 실패로 처리합니다.

번호가 붙은 수식 자리표시자는 더 느슨하게 확인합니다. 하나를 잃거나 중복한 응답도 그대로 보여 주고 — 빠진 수식은 뒤에 덧붙입니다 — 다만 캐시에는 기록하지 않습니다. 그래서 다음 방문 때 그 문단이 영구히 나빠진 상태로 남는 대신 새로 시도합니다.

6. 저장

살아남은 결과는 번역 캐시에 기록되고, 페이지가 갱신됩니다.

캐시 키

캐시된 번역의 키에는 여러 요소 가운데 완성된 시스템 프롬프트와 완성된 프롬프트가 들어갑니다. 규칙 블록을 붙이고, 치환하고, 용어집까지 붙인 뒤의 그 두 텍스트입니다.

여기서 알아 둘 만한 결과가 세 가지 나옵니다.

  • 프롬프트를 수정하면 예전 프롬프트로 만든 모든 번역이 버려집니다. 이미 읽은 페이지도 다시 번역되고, 비용도 다시 듭니다.
  • 용어집을 바꾸면 일치한 용어가 들어 있던 문단만 버려집니다. 아무것도 일치하지 않은 문단은 용어집이 아예 없는 경우와 바이트 단위로 동일한 프롬프트를 만들어 내므로, 그 캐시 항목은 그대로 남습니다.
  • AI 스마트 컨텍스트를 켜거나 끄면 모든 키가 바뀝니다. 요약 변수가 실제 요약에서 No summary available로, 또는 그 반대로 바뀌기 때문입니다.

설정 → 페이지 번역에서 캐시를 지우면 저장된 번역과 페이지 요약이 삭제됩니다. 내 프롬프트, 제공업체, 용어집은 건드리지 않습니다.

On this page