AI 입문가이드
모델이 혼동하지 않도록 프롬프트의 모든 문서에 레이블을 붙이세요
붙여 넣은 각 텍스트에 이름과 역할을 부여하는 방법, 전/후 프롬프트와 Python 및 curl로 동작하는 채팅 완료 요청을 소개합니다.

한 메시지에 두 개의 텍스트를 붙여 넣고 모델에게 비교해 달라고 요청했습니다. 어느 것이 어느 것인지 말하지 않았다면, 모델은 추측할 수밖에 없습니다. 해결책은 간단합니다. 모든 텍스트에 이름과 역할을 부여하고, 각각을 자체 태그로 감싸면 됩니다. Anthropic의 프롬프팅 가이드(2026년 10월 31일 확인한 살아있는 페이지)는 각 콘텐츠 유형에 태그를 붙여 모델이 무엇이 지시인지, 무엇이 배경인지, 무엇이 입력인지 잘못 읽지 않도록 권장합니다. 아래는 전/후 프롬프트와 CheapTokens API로 보낼 수 있는 실제 동작하는 채팅 완료 요청입니다.
그냥 붙여 넣으면 무엇이 잘못되는가#
가장 단순한 경우를 봅시다. 공급업체가 새 제품 설명을 보냈고, 쇼핑 페이지에 있는 것과 무엇이 달라졌는지 알고 싶습니다. 둘 다 "무엇이 달라졌나요?" 아래에 붙여 넣고 전송을 누릅니다. 당신에게는 순서가 명백합니다. 모델에게는 사이에 아무것도 없는 두 텍스트 블록일 뿐이고, 질문은 어느 것이 오래된 것인지 전혀 말하지 않습니다. 모델이 맞힐 수도 있습니다. 하지만 새 텍스트를 오래된 것이라고 부르고, 완벽하게 자신감 있는 목소리로 거꾸로 된 변경 목록을 건넬 수도 있습니다.
같은 함정이 일상 업무에도 숨어 있습니다:
- 계약서 두 버전이 있고, 상대방이 무엇을 바꿨는지 묻는 경우;
- 회의록 세 개가 있고, 어떤 결정들이 서로 모순되는지 묻는 경우;
- 스타일 샘플과 초안: 어느 것을 모방하고, 어느 것을 다시 써야 할까요?
- 오류 로그와 코드를 함께 붙여 넣고 "이것을 고쳐줘"라고 묻는 경우.
각 경우에 모델은 텍스트마다 두 가지가 필요합니다: 이름(무엇이고 어디서 왔는지)과 역할(그것으로 무엇을 하길 원하는지).
각 텍스트에 이름과 역할을 부여하세요#
세 가지 작은 조치:
- 각 텍스트를 자체 태그에 넣습니다. Anthropic의 가이드는
<documents>래퍼와 텍스트마다 하나의<document index="1">, 그 안에 이름을 위한<source>와 텍스트 자체를 위한<document_를 제안합니다.content> - 태그 밖의 지시에서 각각이 무엇인지 말합니다: "문서 1은 우리 쇼핑몰의 OLD 텍스트입니다. 문서 2는 공급업체의 NEW 텍스트입니다."
- 같은 단어로 질문합니다. "변경된 모든 사실을 old -> new로 나열하세요"에는 이제 가리킬 old와 new가 있습니다.
다음은 병 예시의 전과 후입니다:
비교하기
같은 요청, 전과 후
전
What changed?
Steel water bottle, 500 ml. Keeps drinks cold for 12 hours. Dishwasher safe.
Steel water bottle, 750 ml. Keeps drinks cold for 24 hours. Hand wash only.후
Document 1 is the OLD text from our shop. Document 2 is the NEW text from the supplier. List every fact that changed, one per line, as old -> new.
<documents>
<document index="1">
<source>old description (current shop page)</source>
<document_content>
Steel water bottle, 500 ml. Keeps drinks cold for 12 hours. Dishwasher safe.
</document_content>
</document>
<document index="2">
<source>new description (from the supplier)</source>
<document_content>
Steel water bottle, 750 ml. Keeps drinks cold for 24 hours. Hand wash only.
</document_content>
</document>
</documents>
레이블은 몇 개의 토큰만 소모하고 추측을 없앱니다. Anthropic은 이 조언을 자사의 Claude 모델을 위해 작성했지만, 레이블은 일반 텍스트이므로 같은 레이아웃을 다른 채팅 모델에 보내는 것을 막을 수 없습니다.
실제 요청으로 보내기#
다음은 "후" 프롬프트를 API 호출로 나타낸 것입니다. 주소는 https:/이고, API는 OpenAI 호환되며, 모델은 deepseek-입니다. 모델 ID는 CheapTokens 문서에서 가져오세요: 제공업체마다 이름이 다릅니다. DeepSeek-V4-Flash는 380K 컨텍스트 윈도우와 답변당 최대 32,768 출력 토큰을 가지고 있어 긴 텍스트를 많이 넣을 여유가 있습니다. 키는 환경 변수에서 가져오며, 코드에서 가져오지 않습니다.
두 도구에서 같은 요청
Python
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.cheaptokens.dev/v1",
api_key=os.environ["CHEAPTOKENS_API_KEY"],
)
old = "Steel water bottle, 500 ml. Keeps drinks cold for 12 hours. Dishwasher safe."
new = "Steel water bottle, 750 ml. Keeps drinks cold for 24 hours. Hand wash only."
prompt = f"""Document 1 is the OLD text from our shop. Document 2 is the NEW text from the supplier. List every fact that changed, one per line, as old -> new.
<documents>
<document index="1">
<source>old description (current shop page)</source>
<document_content>
{old}
</document_content>
</document>
<document index="2">
<source>new description (from the supplier)</source>
<document_content>
{new}
</document_content>
</document>
</documents>"""
response = client.chat.completions.create(
model="deepseek-ai/DeepSeek-V4-Flash-0731",
messages=[{"role": "user", "content": prompt}],
max_tokens=300,
)
print(response.choices[0].message.content)
print(response.usage)curl
curl https://api.cheaptokens.dev/v1/chat/completions \
-H "Authorization: Bearer $CHEAPTOKENS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-ai/DeepSeek-V4-Flash-0731",
"max_tokens": 300,
"messages": [{
"role": "user",
"content": "Document 1 is the OLD text from our shop. Document 2 is the NEW text from the supplier. List every fact that changed, one per line, as old -> new.\n\n<documents>\n<document index=\"1\">\n<source>old description (current shop page)</source>\n<document_content>\nSteel water bottle, 500 ml. Keeps drinks cold for 12 hours. Dishwasher safe.\n</document_content>\n</document>\n<document index=\"2\">\n<source>new description (from the supplier)</source>\n<document_content>\nSteel water bottle, 750 ml. Keeps drinks cold for 24 hours. Hand wash only.\n</document_content>\n</document>\n</documents>"
}]
}'응답은 choices[0].의 일반 텍스트이고, 옆의 usage가 토큰을 계산합니다. 좋은 답변은 세 가지 변경을 나열합니다: 500 ml -> 750 ml, 12시간 -> 24시간, 식기세척기 사용 가능 -> 손세척만 가능. 화살표가 반대 방향으로 향하면 모델이 레이블을 놓친 것입니다. 지시가 문서를 태그와 같은 이름으로 부르는지 확인하세요.
레이블의 비용#
태그는 텍스트이고, 텍스트는 청구됩니다. 팀 리드가 각각 약 2,000 토큰인 회의록 세 개를 입력하고 어떤 결정이 충돌하는지 묻는다고 가정해 봅시다. 세 개의 회의록: 3 × 2,000 = 6,000 토큰. 지시와 태그에 약 150 토큰을 추가하면(가정) 요청은 입력 6,150 토큰을 담고, 출력은 300 토큰입니다. DeepSeek-V4-Flash에서 그 요청 하나는 $0.00012이며, 태그 자체는 회의록에 비해 반올림 오차 수준입니다. 다음은 같은 요청을 1,000번 보낸 경우이며, OpenRouter도 함께 표시했습니다:
| 모델 | 입력 $/1M | 출력 $/1M | 요청당 | 1,000회 요청 | OpenRouter, 1,000회 요청 |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.00014 | $0.135 | $0.231 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.00012 | $0.122 | $0.473 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.00035 | $0.353 | $4.23 |
요청당 입력 6,150개 및 출력 300개 토큰입니다. 100만 토큰당 가격은 현재 기준이며 당사 요금제에 따라 함께 변경됩니다. OpenRouter 열은 동일한 작업량에 대한 참고 가격을 보여줍니다.
6,150 토큰 모두 380K 윈도우에 여유 있게 들어갑니다(컨텍스트 윈도우란 무엇인가). 입력과 출력을 합친 총계로 계산하면 요청은 OpenRouter보다 저렴합니다. 입력과 출력은 다른 요율로 청구되며, 입력 vs 출력 토큰이 그 이유를 설명합니다. 모든 모델의 현재 수치는 가격 페이지에 있습니다.
더 많은 텍스트를 다루는 습관#
텍스트가 두 개를 넘으면 숫자만으로는 충분하지 않습니다: 각각에 고유한 이름이 필요합니다. 아래 그림은 예시의 레이아웃을 보여줍니다: 질문이 있는 지시가 먼저, 그다음 각 문서가 자체 태그에 들어갑니다.

- 숫자만이 아니라 내용으로 이름을 붙이세요. 답변이 그것을 인용해 돌려줄 때
<source>contract v2, sent by the client</가source> document 2보다 낫습니다. - 지시를 태그 밖에 두어, 붙여 넣은 텍스트 안의 한 줄이 명령으로 오해되지 않게 하세요.
- 하나의 텍스트, 하나의 태그. 긴 파일도 하나의 태그이고, 두 파일은 두 개입니다.
- 질문에서 이름을 재사용하세요: "monday-notes의 어떤 결정이 wednesday-notes와 모순되나요?"
- 예시에도 역할을 부여하세요. "문서 1은 스타일 샘플입니다: 사실이 아니라 어조를 모방하세요. 문서 2는 다시 쓸 초안입니다."
직접 해보기시도해 보세요: 하나의 프롬프트에 오류 로그와 그것을 생성한 코드가 있습니다. 각각에 무엇을 추가하시겠습니까?정답 보기
이름과 역할입니다. 로그에는 <source>error log from the last run</와 "이것은 증상이니 편집하지 마세요"를 추가하세요. 코드에는 <source>app.와 "이것이 고칠 대상입니다"를 추가하세요. 그런 다음 그 이름으로 수정을 요청하세요.
프롬프트의 나머지 기본 사항(목표, 컨텍스트, 형식)은 좋은 프롬프트 작성법을 참조하세요.



