프롬프트 체이닝은 작업을 프롬프트의 순서로 나누고, 한 프롬프트의 출력이 다음 프롬프트 입력의 일부가 되게 하는 방법입니다. 모델에게 리뷰 50개를 읽고, 문제를 찾고, 순위를 매기고, 보고서를 쓰는 일을 한 번에 시키는 대신, 하나씩 차례로 요청합니다. 각 프롬프트에는 할 일이 하나뿐이고, 단계 사이에서 여러분(또는 코드)이 결과를 보고, 고치고, 멈출 수 있습니다.
아래 블록은 고객 리뷰를 제품 팀에 보낼 메모로 바꾸는 3단계 체인입니다. 탭 하나가 한 단계입니다. 2단계의 입력은 1단계의 답을 붙여 넣은 것이고, 3단계의 입력은 2단계의 답입니다.
[
{"review": 1, "complaint": "배터리가 4시간 만에 방전"},
{"review": 1, "complaint": "충전 케이블이 너무 짧음"},
{"review": 2, "complaint": "앱이 자꾸 로그아웃됨"},
{"review": 3, "complaint": "배터리가 퇴근길도 못 버팀"},
{"review": 4, "complaint": "페어링 중 앱 튕김"},
{"review": 4, "complaint": "배터리가 빨리 닳음"},
{"review": 5, "complaint": "케이블이 짧아 충전 중 사용 불가"}
]
1단계는 읽고 추출하기만 합니다. 2단계는 리뷰를 전혀 보지 않고 목록만 보므로, 리뷰를 요약하는 쪽으로 흘러갈 수 없습니다. 3단계는 쓰기만 합니다. 3단계의 말투가 틀리게 나오면 3단계만 다시 실행하면 되고, 추출과 묶기는 그대로 남습니다.
3단계가 말하지 않는 것도 눈여겨보세요. 한 배터리가 4시간 만에 나갔다는 것, 앱 문제가 로그아웃과 튕김이었다는 것입니다. 3단계는 주제 이름만 받았기 때문에 그런 세부 사항은 입력에 없었습니다. 각 단계가 무엇을 받을지 정하는 것이 체인 설계의 핵심 선택이고, 최종 답에 넣고 싶은 세부 사항은 끝까지 넘겨줘야 합니다.
큰 프롬프트 하나 대신 체이닝을 쓰는 이유
각 단계에 할 일 하나와 기준 하나가 있습니다. 추출, 분석, 다듬어진 글쓰기를 한꺼번에 요청하는 프롬프트는 균형을 맞춰야 할 목표가 세 개이고, 그중 무엇을 줄였는지 알려 주는 것은 없습니다. 할 일이 하나인 프롬프트는 그 일에서 좋은 결과가 어떤 모습인지 정확히 말할 수 있고, 여러분은 그 기준으로 답을 판단할 수 있습니다.
중간을 확인할 수 있습니다. 프롬프트 하나에서는 놓친 불만이 잘 쓴 문단 속으로 사라져서 보이지 않습니다. 체인에서는 1단계의 목록이 바로 눈앞에 있습니다. 확인하는 데 몇 초면 되고, 2단계 전에 고치는 것이 최종 보고서에서 오류를 찾는 것보다 쌉니다.
단계마다 설정을 따로 쓸 수 있습니다. 추출과 묶기에는 낮은 temperature와 코드가 파싱할 수 있는 구조화된 출력이 필요합니다. 글쓰기 단계는 더 자유로워도 됩니다. 코드에서는 추출에는 작고 빠른 모델을 쓰는 것처럼 단계마다 다른 모델을 쓸 수도 있습니다.
실패가 한 곳에 머뭅니다. 체인이 깨지면 어느 단계가 깨졌는지 알 수 있고, 그 단계만 다시 실행하면 됩니다.
비용도 분명히 있습니다. 체인은 호출이 많아서 프롬프트 하나보다 오래 걸리고 비용도 더 듭니다. 그리고 앞 단계에서 빠져나간 실수는 뒤의 모든 단계로 이어지므로, 단계 사이를 확인할 가치가 있습니다.
체인을 설계하는 방법
- 손으로 할 때 거칠 단계를 적어 보세요. 먼저 목록을 만들고, 정렬하고, 정리해서 쓴다면 프롬프트 세 개입니다. 서로 다른 종류의 생각이 필요한 단계가 자연스럽게 나누는 지점입니다.
- 프롬프트를 쓰기 전에 각 단계의 출력 형식을 정하세요. 다음 단계가 받는 것은 무엇이든 읽기 쉽고 확인하기 쉬워야 합니다. JSON 배열, 번호 목록, 표 같은 것입니다. 자유로운 산문은 마지막 단계에서만 괜찮습니다.
- 다음 단계에 필요한 것만 넘기세요. 위의 2단계는 리뷰가 아니라 불만 목록을 받습니다. 입력이 적을수록 주의를 흩트릴 것도 적고, 각 단계를 따로 테스트할 수 있습니다.
- 단계 사이에 확인을 넣으세요. 코드에서는 JSON을 파싱하고 필드가 있는지 확인하세요. 판단이 필요한 확인은 그 자체를 프롬프트로 만들 수 있습니다. "이 목록에 리뷰의 모든 불만이 들어 있어? 예나 아니요로 답하고, 빠진 것이 있으면 나열해 줘."
- 붙여 넣은 자료를 분명히 표시하세요. 각 단계의 입력은 앞 단계가 만든 텍스트이고, 구분자는 모델이 그것을 새로운 지시로 읽지 않게 해 줍니다.
아래는 위 체인을 위한 확인 단계로, 불만 하나를 놓친 1단계 출력에 대해 실행한 것입니다. 이런 확인은 좁은 질문 하나만 하는 별도의 프롬프트이므로, 추출 자체보다 제대로 하기 쉽습니다.
누락 있음
- 리뷰 4: 배터리가 빨리 닳음
확인 결과가 "누락 있음"이면 2단계를 실행하기 전에 1단계를 다시 실행하거나 빠진 항목을 직접 추가하세요.
코드로 만드는 체인
코드에서 체인은 각 프롬프트가 이전 답으로 만들어지는 호출의 순서입니다. 이 버전은 Anthropic Python SDK를 쓰지만, 어떤 제공사든 같은 모양으로 동작합니다.
import json
import anthropic
client = anthropic.Anthropic()
MODEL = "your-model-id" # e.g. from your provider's model list
def ask(prompt):
response = client.messages.create(
model=MODEL,
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return response.content[0].text
reviews = open("reviews.txt", encoding="utf-8").read()
complaints = ask(
"List every complaint in the reviews inside the <reviews> tags. Ignore praise. "
'Return a JSON array of objects with the keys "review" and "complaint". '
"Return only the JSON, with no code fence.\n\n"
f"<reviews>\n{reviews}\n</reviews>"
)
json.loads(complaints) # raises an error here if step 1 did not return valid JSON
themes = ask(
"Group these complaints into themes. Return only a JSON array with the keys "
'"theme", "count" and "reviews", sorted by count, highest first.\n\n'
f"<complaints>\n{complaints}\n</complaints>"
)
note = ask(
"Write a note of at most four sentences to the product team based on these "
f"themes. Lead with the most common one.\n\n<themes>\n{themes}\n</themes>"
)
print(note)
json.loads 줄은 가장 단순한 확인입니다. 1단계가 산문으로 답했다면 잘못된 입력을 넘기지 않고 체인이 거기서 멈춥니다. 실제 서비스용 체인이라면 필드도 확인하고, 실패한 단계를 한 번 다시 시도하고, 각 중간 결과를 기록해서 잘못된 최종 답을 원인이 된 단계까지 추적할 수 있게 할 것입니다.
채팅 앱에서 체이닝하기
프롬프트를 체이닝하는 데 코드가 꼭 필요하지는 않습니다. 1단계를 실행하고, 답을 읽고, 틀린 것이 있으면 고친 다음, 2단계 프롬프트에 붙여 넣으세요. 단계마다 새 대화에서 하면 이전 대화가 컨텍스트에 들어가지 않아서, 한 단계를 위해 쓴 지시가 다음 단계에 영향을 주지 않습니다. 한 대화 안에서 계속하는 것이 더 빠르고, 단계들이 서로 밀접할 때는 그것도 괜찮지만, 새 메시지마다 대화 기록 전체가 함께 따라갑니다.
비슷한 기법과의 비교
생각의 사슬은 답변 하나 안에 쓰인 추론이고, 프롬프트 체인은 그 사이에 무엇을 넘길지 여러분이 통제하는 여러 개의 답변입니다. 둘은 잘 어울립니다. 체인의 어느 단계에서든 단계별 추론을 요청할 수 있습니다.
체인에서는 단계를 여러분이 미리 정합니다. 검색하고, 결과를 읽고, 다른 행동을 고르는 것처럼 모델 스스로 다음 단계를 정한다면, 그것은 에이전트 루프라는 다른 패턴이며 ReAct 프롬프팅에서 설명합니다. 고정된 체인이 테스트하고 예측하기 더 쉬우므로, 단계를 이미 알고 있다면 체인이 더 나은 출발점입니다.
자주 묻는 질문
프롬프트 체이닝이란 무엇인가요?
프롬프트 체이닝은 작업을 차례로 실행되는 여러 프롬프트로 나누고, 각 프롬프트의 출력을 다음 프롬프트에 넣는 기법입니다. 예를 들어 첫 번째 프롬프트가 리뷰에서 불만을 뽑고, 두 번째가 불만을 주제별로 묶고, 세 번째가 그 주제로 보고서를 씁니다.
프롬프트 체이닝과 생각의 사슬은 어떻게 다른가요?
생각의 사슬은 응답 하나 안에서 일어납니다. 모델이 답 앞에 추론을 씁니다. 프롬프트 체이닝은 여러 번의 별도 호출을 쓰고, 여러분이나 코드가 한 호출의 결과를 다음 호출로 넘깁니다. 체인에서는 어느 단계든 하나만 살펴보고, 고치고, 다시 실행할 수 있지만, 답변 하나 안의 추론은 그렇게 할 수 없습니다.
코드 없이 ChatGPT나 Claude에서 프롬프트 체이닝을 할 수 있나요?
네. 첫 번째 프롬프트를 실행하고 답을 확인한 다음, 같은 대화나 새 대화에서 그 답을 다음 프롬프트에 붙여 넣으면 됩니다. 단계마다 새 대화를 시작하면 이전 초안과 지시가 뒤 단계에 영향을 주지 않습니다.
프롬프트 하나 대신 체이닝을 써야 할 때는 언제인가요?
프롬프트 하나가 추출, 분석, 글쓰기처럼 서로 다른 종류의 일을 여러 개 요청할 때, 또는 중간 결과를 확인하거나 재사용해야 할 때 체인을 쓰세요. 프롬프트 하나로 이미 안정적인 답이 나온다면 체인은 호출, 비용, 대기 시간만 늘립니다.