Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
338 changes: 338 additions & 0 deletions technical-writing-level4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,338 @@
# 좋은 답은 좋은 질문에서: Claude 문서로 본 프롬프트 설계법

> **같은 AI를 쓰는데, 왜 결과는 이렇게 다를까? 답은 ‘어떻게 질문하느냐’에 있다.**

## **같은 도구, 다른 결과?**

우아한테크코스(이하 우테코)에 들어온 이후, 나는 AI를 자주 활용했다.

코드 점검, 테스트 작성뿐 아니라 정보 탐색과 글 정리에도 AI를 사용했다.

하지만 같은 질문을 던져도 AI의 답은 매번 달랐다. 원하던 결과와 전혀 다른 답이 나오기도 했다.

처음에는 “AI니까 어쩔 수 없지.”라며 대수롭지 않게 넘겼다.

그런데 시간이 지나면서, 같은 도구를 사용해도 훨씬 나은 결과를 만들어내는 사람들이 눈에 들어왔다.

똑같은 AI를 쓰는데도 결과는 완전히 달랐다.

그 차이는 어디서 비롯된 걸까?

## **무엇이 달랐을까?**

곰곰이 생각해보니, 차이는 결국 “어떻게 질문하느냐”에서 비롯되었다.

그때까지의 나는 AI를 잘 활용하는 법보다, 잘못된 답을 수정하는 데 더 익숙했다.

좋은 답을 이끌어내는 방법보다 잘못된 답을 보완하는 데 집중했던 것이다.

하지만 레벨 3 후반, 프론트엔드 코치 준과의 커피챗을 계기로 좋은 답을 이끌어내는 법, 즉 프롬프트 설계에 관심을 갖게 되었다.

## **준과의 커피챗 ☕️**

레벨 3이 끝날 무렵, 우테코에서 학습한 내용을 정리하기 위해 사이드 프로젝트를 시작했다.

하지만 팀원은 백엔드 개발자 두 명뿐이었다.

프론트엔드를 맡을 사람이 없었기에 우리는 Lovable과 Cursor를 활용해 프론트를 구현하기로 했다.

문제는 제한된 시간과 자원이었다. Lovable에는 코인 5개 제한이 있어, 한 번의 시도로 원하는 결과를 얻어야 했다.

그래서 AI 활용 경험이 풍부한 프론트엔드 코치 준에게 조언을 구했다.

그 만남은 내가 ‘프롬프트 엔지니어링(Prompt Engineering)’을 이해하게 된 전환점이었다.

> **프롬프트란?**
>
> 프롬프트(Prompt) 는 생성형 AI에게 특정 작업을 수행하도록 지시하는 질문 혹은 명령문이다.
>
> 즉, 사용자가 원하는 결과를 얻기 위해 AI에게 전달하는 언어 기반 입력이다.
>
> AI는 자연어로 소통할 수 있게 되었고, 프롬프트는 인간과 AI 사이의 맥락적 이해와 협업을 가능하게하는, 핵심 인터페이스가 되었다.

## 프롬프트 엔지니어링, 그게 뭔데?

> “AI를 통해 결과를 얻는 과정은 Input → Process → Output이다.
>
> 그중 우리가 통제할 수 있는 건 Input뿐이다.”

준의 이 말이 머릿속에 오래 남았다.

AI의 ‘지능’ 자체는 우리가 통제할 수 없지만, 그 지능이 작동하기 전 단계인 입력(Input)은 우리가 전적으로 통제할 수 있는 영역이였다.

즉, AI에게 무엇을, 어떻게 요청하느냐가 결과의 품질을 결정짓는다.

대부분의 사람들은 이 ‘입력’을 다루는 법을 배우지 않는다.

좋은 답을 얻으려면 좋은 질문을 설계하는 법을 익혀야 하지만, 많은 이들이 그 과정을 건너뛴 채 잘못된 답을 고치는 데 집중한다.

프롬프트 엔지니어링(Prompt Engineering)은 AI가 올바르게 사고하고 응답하도록 좋은 질문(입력)을 설계하는 기술이다.

이는 단순한 문장 작성이 아니라, 언어학·심리학·논리학 등 다양한 인문학적 원리를 활용해 AI의 사고 흐름을 유도하는 과정이다.

결국, 우리가 조정할 수 있는 유일한 영역인 ‘입력(Input)’을 설계하는 방법이 바로 프롬프트 엔지니어링이다.

이때 준이 추천해준 문서가 바로 Anthropic의 [Claude Prompt Engineering Guide](https://docs.claude.com/ko/docs/build-with-claude/prompt-engineering/overview)였다.

## **Claude Docs: 프롬프트 설계의 핵심**

이 문서는 “AI를 잘 쓰는 요령”이 아니라, AI가 논리적으로 사고하게 만드는 구조적 대화법을 다룬다.

즉, AI의 성능은 모델 자체보다 입력의 설계(Input Design) 에 달려 있다는 점을 강조한다.

해당 문서의 여러 원칙 중에서도 ChatGPT, Cursor 등 다른 모델에도 적용할 수 있다고 판단한 다섯가지 원칙을 소개해 보겠다.

### 1️⃣ 역할 부여하기 (System Prompt)

> “AI를 도우미로 쓰지 말고, 전문가로 대화하라.”

AI에게 역할(role)을 부여하면, 출력의 톤, 정확도, 일관성이 달라진다.

```text
❌ 역할을 부여하지 않은 문장
“이 코드를 개선해줘.”

⭕️ 역할을 부여한 문장
“당신은 Java 리팩터링 전문가입니다. 코드의 가독성과 유지보수성을 높이는 방향으로 개선해주세요.”
```

이런 식으로 역할을 명확히 정의하면, AI는 불필요한 설명을 줄이고, 도메인 지식에 맞는 답변을 제공한다.

### 2️⃣ 명확하고 직접적으로 말하기

> “복잡한 문장은 AI뿐 아니라 사람에게도 혼란을 준다.”

AI도 모호한 표현에 약하다.

좋은 프롬프트의 출발점은 불필요한 수식어를 줄이고, 핵심만 남기는 것이다.

```text
❌ 명확하지 않은 문장
“이 문장을 다듬어줘.”

⭕️ 명확한 문장
“이 문장을 간결하고 자연스럽게 수정해줘. 줄임말은 사용하지 말고, 문어체로 유지해줘.”
```

핵심은 AI가 해야 할 일을 명확하게 지시하는 것이다.

- 작업의 목적: 이 문장은 어디에 사용되는가
- 결과물의 형태: 요약, 번역, 수정 중 어떤 작업인가
- 제약 조건: 길이, 어조, 형식 등

### 3️⃣ 예시로 학습시키기 (Few-shot / Multi-shot)

> “예시는 AI가 당신의 의도를 가장 빠르게 배우는 방법이다.”

AI는 예시를 통해 패턴을 학습한다.

프롬프트에 직접 예시를 포함하면 모델의 이해도와 일관성이 크게 높아진다.

```text
❌ 예시를 포함하지 않은 문장
“리뷰를 긍정 / 중립 / 부정으로 분류해줘.”

⭕️ 예시를 포함한 문장
아래 리뷰를 감정에 따라 분류해줘.

예시:
‘최고예요!’ → 긍정
‘그냥 그래요.’ → 중립
‘별로예요.’ → 부정

이제 다음 리뷰를 분류해줘: {{REVIEW}}
```

예시는 다양할수록 좋지만, 지나치게 구체적이면 오히려 일반화가 어렵다.

따라서 실제 데이터와 유사하면서도 다양한 케이스를 포함하는 게 좋다.

### 4️⃣ **생각하게 하기 (Chain of Thought)**

> “정답만 묻지 말고, 이유를 함께 생각하게 하라.”
>

AI가 단순히 결과만 내놓는 대신, 사고의 과정을 따라가며 이유를 함께 제시하도록 유도하면 훨씬 정교한 결과를 얻을 수 있다.

```text
❌ 결과만을 요구하는 문장
“이 코드가 왜 느린지 알려줘.”

⭕️ 사고의 과정을 따라가며 이유를 제시하도록 유도하는 문장
“이 코드가 느린 이유를 단계별로 분석하고, 병목 구간을 짚어줘.”
```

이 방식을 사고 연쇄(Chain of Thought, CoT)라고 부른다.

수학적 문제, 논리 분석, 코드 리팩터링 등 복잡한 작업일수록 “단계별로 생각하라”는 지시를 추가하면 효과적이다.

⚙️ **모델별 활용**

- Claude는 스스로 사고 과정을 전개하는 데 능숙하다.
- 반면 ChatGPT는 명시적 지시가 더 효과적이다.

→ “단계별로 분석해줘” 대신 이유를 함께 설명해줘”, “근거를 단계별로 보여줘”처럼 구체적으로 요청하면 논리 전개가 풍부해진다.

즉, 원칙은 동일하되 모델의 이해 방식에 맞게 구조를 조정해야 한다.


### 5️⃣ 구조화하기 (Structured Prompting)

AI는 단순 텍스트보다 구조화된 입력을 더 잘 이해한다.

**Claude에 적합한 형식**

```xml
<context>
이 모델은 고객 문의를 자동 분류하는 시스템입니다.
</context>

<instruction>
고객의 문의를 "환불, 배송, 상품, 기타" 중 하나로 분류하세요.
</instruction>

<example>
입력: "상품이 도착하지 않았어요."
출력: 배송
</example>
```

**ChatGPT에 적합한 형식**

```json
{
"context": "이 모델은 고객 문의를 자동 분류하는 시스템입니다.",
"instruction": "고객의 문의를 환불, 배송, 상품, 기타 중 하나로 분류하세요.",
"example": {
"input": "상품이 도착하지 않았어요.",
"output": "배송"
}
}
```

💡 모델별 구조 인식 차이

- Claude는 XML 태그 기반 구조를 매우 잘 해석한다.
- 그러나 ChatGPT는 Markdown, JSON, 번호 리스트 형식에 더 강하다.

즉, 원칙은 같지만 구조는 모델에 맞게 변형해야 한다.

## **사이드 프로젝트(코스잇다)에 적용하기**

### **프롬프트 제너레이터 만들기**

Claude 문서에서 배운 원칙을 실제로 적용하기 위해 가장 먼저 시도한 것은 Lovable 전용 프롬프트 생성기(Lovable Prompt Generator) 를 설계하는 일이었다.

AI마다 언어 모델의 성격이 다르기 때문에 같은 문장을 입력해도 결과가 달랐다.

그래서 Lovable이 이해하기 쉬운 구조화된 입력 문서(*Structured Prompt*)를 자동으로 만들어주는 시스템을 직접 설계했다.

### 1️⃣ 역할(Role) 정의

AI가 모호하게 답하지 않도록, 먼저 AI의 역할을 명시하였다.

단순히 “도와줘”가 아니라,

“너는 Lovable 전용 프롬프트 엔지니어야. 사용자의 입력을 Lovable이 이해할 수 있는 구조로 변환해.”

처럼 역할을 제한했다.

### 2️⃣ 응답 구조(Output Format)

프롬프트 생성기의 응답 구조를 두 단계로 고정했다.

- Lovable에 전달할 구조화된 입력 문서
- 프롬프트 개선 및 리스크 코멘트

첫 번째는 생성기로 만들어진 ‘결과’,

두 번째는 그 결과를 평가하고 개선 포인트를 제시하는 ‘리뷰’ 역할을 할 수 있도록 설계했다.

이 구조 덕분에, 한 번의 응답으로 결과 생성과 자체 점검을 동시에 수행할 수 있었다.

### 3️⃣ CLEAR 원칙

CLEAR 원칙(Concise, Logical, Explicit, Adaptive, Reflective)을 프롬프트 작성의 기준으로 삼았다.

- **Concise (간결성):** 불필요한 수식어 제거, 핵심적인 문장 중심
- **Logical (논리성):** ‘목적 → 조건 → 출력’ 순서로 구조화
- **Explicit (명시성):** 색상, 속성, 폰트 등 세부 조건을 구체적으로 기술
- **Adaptive (적응성):** 사용자의 상황별, 환경별 차이를 반영
- **Reflective (성찰성):** 오류 가능성, 성능 리스크를 미리 검토

### 4️⃣ 구조화된 레이블

Context / Task / Guidelines / Constraints / Steps 라는 다섯 가지 고정 섹션으로 프롬프트를 생성하도록 하였다.

이 구조를 통해 AI가 “무엇을 위해 / 무엇을 / 어떤 방식으로 / 어떤 제약 안에서 / 어떤 순서로” 작업해야 하는지를 알 수 있게 하였다.

### 5️⃣ 제약 조건과 재현성

AI는 종종 예측 불가능한 결과를 만들어낸다. 이를 막기 위해 프롬프트에 금지 항목과 기술 스택을 명시하도록 설계 했다.

또한 “동일한 input → 동일한 output”를 보장하기 위해 구체적인 스타일·이름·구조를 명시하도록 했다.

### 6️⃣ 디버깅 가능성

AI가 실패했을 때, “다시 처음부터 요청”하지 않아도 되도록 프롬프트 내에 AI가 스스로 오류를 진단하고 수정하도록 유도하는 구조(Self-debugging Loop)를 작성할 수 있게 설계했다.

### **리버스 프롬프팅을 통해 프롬프트 라이브러리 만들기**

> **리버스 프롬프팅이란?**
>
> 리버스 프롬프팅(Reverse Prompting)은 우수한 출력물(Output)을 분석해,
>
> 그 결과를 재현할 수 있는 프롬프트 구조와 제약(입력 사양)을 가설 → 검증 방식으로 복원·표준화하는 방법이다.
>
> 단순히 “원래 프롬프트를 맞히는 놀이”가 아니라, 출력이 나오기까지의 맥락 · 제약 · 평가기준을 체계화해 재현 가능성을 높이는 것이 목적이다.

이전에는 좋은 결과를 얻은 날이면, 그저 “오늘 운이 좋았다”라고 넘겼다.

하지만, 그 ‘운’을 재현하기 위해 우리는 ‘운을 복제할 수 있는 실험’을 시작했다.

프롬프트 생성기로 만든 프롬프트를 Lovable에게 주어 얻어낸 결과 중 가장 마음에 드는 부분을 리버스 프롬프팅했다.

이 과정을 반복하면서, 우리 팀만의 **프롬프트 라이브러리**가 만들어졌고, 각 상황에 맞는 최적의 템플릿을 재사용할 수 있게 되었다.

### **팀의 프롬프트 학습 패턴: HERA**

이 모든 과정을 정리하면서 우리는 AI와 협업하는 흐름에 이름을 붙였다.

> HERA는 Hypothesis–Experiment–Reverse–Apply의 약어로,
프롬프트 실험을 체계화한 팀 내부 프로세스 입니다.

| **단계** | **설명** |
| --- | --- |
| **H (Hypothesis)** | 어떤 방식의 프롬프트가 효과적일지 가설을 세운다. |
| **E (Experiment)** | 모델에 가설을 통해 얻어낸 프롬프트를 입력한다. |
| **R (Reverse)** | 얻어낸 결과 중 마음에 드는 결과를 리버스 프롬프트한다. |
| **A (Apply)** | 표준 프롬프트로 정리해 라이브러리화 한다. |

이와 같이 가설을 세우고, 실험하고, 분석하고, 그 결과를 팀의 자산으로 축적하는 반복 구조를 통해 점점 더 일관된 언어로 AI와 협업할 수 있게 되었다.

## **마치며…**

현재 진행 중인 사이드 프로젝트 코스잇다(CourseItda)에서는 위 과정을 통해 프론트엔드 코드를 구현하고 관리하고 있다.

프롬프트 생성기를 도입한 이후, 일관된 결과물을 얻는 비율이 눈에 띄게 높아졌고, 요구사항 충족률도 거의 100%에 가까워졌다.

최근 WOOWACON 2025에서도 다수의 세션이 AI 활용을 주제로 다뤘다.

이처럼 많은 서비스 기업이 생산성 향상과 효율적인 자원 관리를 위해 AI를 적극 도입하고 있다.

이 흐름 속에서 개발자에게 필요한 역량은 점점 더 명확해지고 있다.

이제 개발자는 단순히 AI를 사용하는 사람(User)이 아니라, AI와 함께 사고하고 설계하는 사람(Thinker & Designer)이 되어야 한다.

즉, 앞으로의 개발자는 “답을 찾는 사람”이 아니라 “질문을 설계하는 사람”이 되어야 한다.

좋은 질문이 좋은 답을 만든다.

그리고 그 질문을 설계하는 능력이, 앞으로의 개발자를 구분 짓는 진짜 경쟁력이 될 것이다.

## **참고 자료**

- [Anthropic — Claude Prompt Engineering Guide](https://docs.claude.com/ko/docs/build-with-claude/prompt-engineering/overview)
- [Reverse Prompt Engineering (LearnMore)](https://www.learnmore.co.kr/education/ai-literacy/open-ai/prompt-example/reverse-prompt-engineering)
- [[우아한기술블로그]프롬프트 엔지니어링으로 메뉴 이미지 품질 검수하기: GPT 기반 업무 자동화](https://techblog.woowahan.com/20408/)
- 2025 WOOWACON 중 AI 프롬프트 - 임동준 프론트엔드 개발자님