역전된 상호작용 (Flipped Interaction): LLM이 행동하기 전에 한 번에 하나씩 당신을 인터뷰하게 만드세요
요약
사용자가 정보를 모두 제공해야 하는 기존 프롬프팅의 한계를 극복하기 위해, LLM이 사용자에게 질문을 던져 정보를 수집하는 '역전된 상호작용(Flipped Interaction)' 패턴을 소개합니다. 역할, 리듬, 중단 조건을 명시하여 모델이 필요한 정보를 모두 모은 후 결과물을 생성하도록 유도하는 방법론을 다룹니다.
핵심 포인트
- 역전된 상호작용은 LLM이 사용자에게 질문을 던져 정보를 수집하는 방식입니다.
- 역할, 리듬(한 번에 하나씩), 중단 조건을 명시하는 것이 핵심입니다.
- 슬롯 채우기(Slot-filling) 개념을 활용해 누락된 정보 없이 정확한 결과를 도출합니다.
- 모델의 추측으로 인한 오류를 방지하고 결정론적인 정보 수집이 가능합니다.
일반적인 프롬프팅 (Prompting)에서는 _당신_이 질문하고 모델이 답변합니다. 이는 모델이 필요로 하는 모든 것을 알고 있어야 하며, 이를 하나의 메시지에 쏟아부어야 하는 부담을 당신이 짊어진다는 것을 의미합니다. 범위가 잘 정해진 질문이라면 괜찮습니다. 하지만 "여행 계획을 세워줘" 또는 "스키마 (Schema)를 설계해줘"와 같이 개방형 질문의 경우, 이는 함정이 됩니다. 모든 세부 사항을 사전에 열거할 수 없으며, 당신이 잊어버린 모든 세부 사항에 대해 모델은 조용히 _추측 (Guessing)_을 하기 때문입니다. 말하지 않은 잘못된 가정 위에 구축된 유창한 답변은 답변이 없는 것보다 더 나쁩니다. 왜냐하면 그것이 옳아 보이기 때문입니다.
**역전된 상호작용 (Flipped Interaction)**은 역할을 뒤집습니다. 당신은 모델에게 행동에 필요한 충분한 정보를 수집할 때까지 당신에게 질문을 하나씩 던지도록 지시하며, 그 후에만 결과를 생성하도록 합니다. 이는 White 등의 _프롬프트 패턴 카탈로그 (Prompt Pattern Catalog)_에 등장하는 패턴이며, 과거에 당신의 역할이었던 유도 (Elicitation) 작업이 모델의 역할이 됩니다.
세 가지 (P) 문맥적 진술 (Contextual Statements)
카탈로그는 각 패턴을 일련의 근본적인 문맥적 진술로 설명합니다. 역전된 상호작용에는 정확히 세 가지가 필요합니다:
- (P1) 역할 + 목표 (role + goal) — "당신은 여행 계획을 세우기 위한 요구사항을 수집하고 있습니다."
- (P2) 리듬 (cadence) — "나에게 질문을 한 번에 하나씩 던지고 내 답변을 기다리세요."
- (P3) 중단 조건 (stop condition) — "충분한 정보가 모일 때까지 계속 질문하고, 그 후에 출력을 생성하세요."
이 세 가지를 명시적으로 설정하면 동작이 신뢰할 수 있게 됩니다. 하나라도 암시적으로 남겨두면 동작이 어긋납니다. 질문 8개를 한꺼번에 묶어서 던지거나, 멈추지 않거나, 혹은 당신 대신 답변을 해버릴 수 있습니다.
내부적으로는 슬롯 채우기 (Slot-filling)입니다
"충분한 정보를 모을 때까지"라는 말은 사실 슬롯 채우기 (Slot-filling)입니다. 목표 달성을 위해 필요한 사실들의 집합이 존재하며, 당신은 어떤 것이 아직 누락되었는지 실행 중인 체크리스트를 유지합니다. 매 턴마다, 아직 채워지지 않은 다음 슬롯을 질문하고 답변을 기록합니다. 모델이 "충분함"이 무엇을 의미하는지 알 수 있도록 프롬프트에 슬롯의 이름을 지정하세요. 그리고 흐름이 결정론적 (Deterministic)이고 모델의 기억력에 의존하지 않도록 _당신의 자체 코드_에서 이를 추적하세요:
const SLOTS = ["destination", "duration", "budget", "company", "pace"];
function nextSlot(filled) { // 아직 답변되지 않은 첫 번째 슬롯
...
이 중단 조건 (stop condition)은 두 가지 역할을 수행합니다. 인터뷰가 영원히 계속되는 것을 방지할 뿐만 아니라, 모델이 체크리스트가 절반만 채워진 상태에서 조기에 종료되는 것을 막아줍니다. nextSlot(filled)가 null이 아닌 동안에는 말 그대로 종합 (synthesis) 분기로 도달할 수 없습니다. 따라서 누락된 사실을 바탕으로 자신 있게 틀린 결과물을 만들어내는 일이 발생하지 않습니다.
if (nextSlot(filled)) askNext(); // 여전히 수집 중
else synthesize(filled); // 충분함 → 결과 생성
복사-붙여넣기 템플릿
이 내용을 system 필드에 그대로 넣고 대괄호 부분을 채우세요. 세 개의 (P) 문구는 구조를 파악할 수 있도록 라벨이 지정되어 있으며, 슬롯 리스트는 "충분함"의 기준을 모호하지 않게 만들어 줍니다.
지금부터, 당신은 나에게 다음과 같은 목적을 위한 질문을 해주길 바랍니다:
[목표 — 예: 여행 계획 / 데이터베이스 스키마 설계 / 오류 디버깅].
...
꼭 기억해야 할 한 가지가 더 있습니다. 모델은 질문을 묶어서 던지거나(batch) 앞서 나가려는 경향이 있습니다. 리듬을 두 번 강제하세요. 프롬프트에서 명시하고, 한 번에 하나의 질문만 렌더링하도록 설정하십시오. 그리고 여러분의 코드 내 nextSlot()을 통해 순서를 제어함으로써, 수다스러운 모델이 UI를 건너뛰고 질문 묶음을 던지지 못하게 해야 합니다. filled는 단순한 데이터이므로, 이를 저장했다가 인터뷰 도중 중단된 세션을 재개할 수도 있습니다.
사용자가 진실의 원천(source of truth)이지만 무엇이 관련이 있는지 미리 알지 못하는 경우—요구사항 수집 (requirement gathering), 온보딩 마법사 (onboarding wizards), 접수 양식 (intake forms), 디버깅 인터뷰 등—에 이 패턴을 활용하십시오. 여행, 스키마, 또는 버그 진단을 향해 사용자를 인터뷰하는 실시간 결정론적 (deterministic) 데모를 여기서 확인해 보세요 — https://dev48v.infy.uk/prompt/day55-flipped-interaction.html
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기