# 프롬프트 실습

같은 커밋 메시지 과제로 역할, 출력 형식, 예시 개수와 부정 지시를 비교한다.

원본 URL: https://abc.noco.kr/practice/prompt-lab

[컨텍스트와 프롬프트](/concepts/context-prompt#제로샷·퓨샷-비교)의 구분을 같은 과제에 적용한다. 조건을 하나씩 바꾸고 실제 출력에서 무엇이 달라졌는지 센다. 실행 결과는 실행 후 기록한다.

기준일: 2026-10-02.

## 공통 과제

로그인 실패 시 오류 메시지를 표시하도록 수정한 변경에 대해 커밋 메시지를 한 줄 작성한다. 형식은 `fix(영문 범위): 한국어 설명`이다. 실습의 목적은 특정 문장을 정답으로 외우는 것이 아니라, 같은 과제의 조건과 출력을 나란히 비교하는 데 있다.

```text
변경: 로그인 실패 시 오류 메시지를 표시하도록 수정했다.
커밋 메시지를 한 줄로 작성해.
형식은 fix(영문 범위): 한국어 설명으로 해.
```

[공개 실습 파일](https://github.com/qus0in/agentic-basic-practice/tree/951e1a2fe164e29f5190f7441aba0bfc19103c0f/practice/prompt-lab)에는 복사할 프롬프트 8개와 빈 기록 양식이 있다. 코드는 [MIT 라이선스](https://github.com/qus0in/agentic-basic-practice/blob/951e1a2fe164e29f5190f7441aba0bfc19103c0f/LICENSE)로 제공한다. 모바일에서는 파일 내용을 복사해 모델의 대화 화면에 붙여 넣고, 컴퓨터에서는 파일 비교기를 함께 쓸 수 있다.

## 연결과 기록

기본 경로는 개인 계정으로 무료 API 또는 제공자의 대화 화면을 쓰는 것이다. 공개 업무 자료 대신 위 공통 과제만 넣는다. 키는 개인별로 관리하며 프롬프트·기록 파일에 적지 않는다. [보안](/harness-basics/security#비밀값은-환경-변수로)의 커밋 제외 원칙을 따른다.

::: details 보충: 연결 방식과 무료 조건
아래 ID와 조건은 2026-10-02 공식 문서·공개 모델 목록에서 확인했다. 실행 직전에 같은 링크를 다시 열어 제공 여부와 자신의 한도를 확인한다. 무료 표시는 무제한 실행이나 모델 버전 고정을 뜻하지 않는다. 사용 가능한 모델이 바뀌면 새 기록으로 분리한다.

| 연결 | 모델 ID·선택 | 조건과 공식 근거 |
|---|---|---|
| Google AI Studio / Gemini API | `gemma-4-31b-it` 또는 `gemma-4-26b-a4b-it` | [지원 ID·개인 API 키](https://ai.google.dev/gemma/docs/core/gemma_on_gemini_api), [Gemma 4 가격](https://ai.google.dev/gemini-api/docs/pricing#gemma-4): 무료 계층 입력·출력 무료, 계정별 제한 확인. 확인일 2026-10-02 |
| OpenRouter | `google/gemma-4-31b-it:free` | [모델 소개·현재 가격](https://openrouter.ai/google/gemma-4-31b-it%3Afree), [무료 변형 조건](https://openrouter.ai/docs/guides/routing/model-variants/free), [공개 모델 목록](https://openrouter.ai/api/v1/models): 현재 입력·출력 가격 0인 무료 항목을 선택한다. `:free`가 존재하는 모델만 가능하며 제공·요청 제한은 바뀔 수 있다. 확인일 2026-10-02 |
| OpenCode Zen | API `space-bunny-free`, OpenCode 설정 `opencode/space-bunny-free` | [공식 ID·가격·기간 조건](https://opencode.ai/docs/zen/): 기간 한정 무료다. 공개 가중치·내부 모델 버전은 미확인이므로 오픈 모델과 동일한 것으로 취급하지 않는다. 확인일 2026-10-02 |
| Groq | `openai/gpt-oss-20b` | [지원 모델](https://console.groq.com/docs/models), [Free Plan 제한](https://console.groq.com/docs/rate-limits): 무료 계층에 포함된 ID를 골라 계정의 Limits를 확인한다. 유료 계층 가격은 [공식 가격표](https://groq.com/pricing)에서 확인한다. 확인일 2026-10-02 |
| 로컬 Ollama·LM Studio | Gemma 4 후보, 실제 설치 ID·양자화는 설치 후 기록 | [Gemma 4 모델 개요](https://ai.google.dev/gemma/docs/core): 로컬 가중치 실행은 API 비용과 구분한다. 기기 자원이 필요하다. Ollama 태그 목록·LM Studio 카탈로그 등재는 미확인이며, 실행 명령을 추측해 쓰지 않는다. 확인일 2026-10-02 |

API마다 필드 이름과 지원 파라미터가 다르다. 대화 UI에서 설정을 노출하지 않으면 API 실험과 같은 조건이라고 단정하지 않는다. 이 페이지에는 추론 코드나 키 공유 프록시를 넣지 않는다.
:::

### 조건 고정

각 조건은 새 대화에서 최소 두 번 실행한다. 이전 대화나 에이전트의 룰·도구 출력이 붙으면 그 내용도 컨텍스트이므로 비교에서 제외하거나 함께 기록한다.

- 요청한 모델 ID와 응답에 나타난 버전·ID를 각각 적는다. 응답에 버전이 없으면 `미노출`로 적는다.
- 실행 시각, 복사한 프롬프트 파일과 내용, 연결 방식을 남긴다.
- temperature, top-p, 최대 출력 토큰, seed, thinking 설정은 지원하는 범위에서 같은 값으로 유지한다. 실습용 선택값은 temperature 0, top-p 1이며 제공자의 기본값을 뜻하지 않는다.
- 지원하지 않거나 UI에서 보이지 않는 값은 `미지원`·`미노출`로 적고 추정값을 채우지 않는다. 낮은 temperature도 두 출력이 같다는 보장은 아니다.

모바일에서는 메모 앱에 두 원문과 설정을 기록한다. 파일 기록을 쓰려면 공개 폴더의 `records/template.json`을 조건별로 복사한다. null은 실행 전 빈칸이며 통과를 뜻하지 않는다.

## 다섯 실험

### 1. 제로샷 기본선

`prompts/01-zero-shot.txt`의 전체 내용을 그대로 복사한다. 역할이나 예시는 추가하지 않는다. 새 대화 두 개의 출력에서 줄 수와 형식, 문자 수를 센다. 다른 조건을 비교할 기준선으로 보관한다.

### 2. 역할 지정

`prompts/02-role.txt`는 기본선 앞에 다음 한 문장을 붙인다.

```text
커밋 메시지를 검토하는 역할로 다음 요청을 수행해.
```

나머지 과제와 설정은 유지한다. 기본선과 비교해 설명이 추가됐는지, 형식이 바뀌었는지 센다. 역할 문장이 항상 품질을 높인다고 가정하지 않는다.

### 3. 출력 형식 지정

`prompts/03-format.txt`는 같은 과제에 다음 조건을 추가한다.

```text
출력은 fix(<영문 범위>): <한국어 설명> 한 줄만 남겨.
코드 블록이나 추가 설명은 붙이지 마.
```

파일 전체를 복사해 실행한다. 메시지 외에 설명·코드 울타리가 붙었는지, 실제 줄이 하나인지 확인한다. 형식을 자세히 지정해도 출력 검사 자체를 생략하지 않는다.

### 4. 퓨샷 개수

`prompts/04-few-shot-0.txt`부터 `04-few-shot-3.txt`까지 순서대로 실행한다. 0개 파일은 기본선과 같다. 1개는 장바구니 기능, 2개는 비밀번호 재설정 오류, 3개는 결제 중복 전송 오류 예시까지 붙인다. 이미 들어 있는 예시를 수정하지 않고 각 파일의 전체 내용을 복사한다.

예시 수마다 두 번 실행한다. 예시의 범위명이나 설명이 과제에 그대로 섞였는지, 원하는 형식이 유지됐는지 센다. 예시가 많을수록 좋다는 결론을 미리 정하지 않는다.

### 5. 부정 지시

`prompts/05-negative.txt`는 기본선에 금지 조건을 붙인다.

```text
설명에 완벽, 무조건, 항상이라는 단어를 쓰지 마.
코드 블록이나 추가 설명은 붙이지 마.
```

금지 단어가 출력에 몇 번 나타나는지 센다. 금지 문장을 넣었다는 사실과 출력이 조건을 지켰는지는 따로 확인한다.

## 확인표

각 조건마다 아래 네 열을 채운다. 형식은 한 줄의 `fix(scope): 설명`이며 범위는 영문 소문자·숫자·하이픈, 설명에는 한국어가 있는지 검사한다. 의미상 로그인 오류를 설명하는지와 입력에 없는 내용을 덧붙였는지는 원문과 사람이 대조한다.

| 형식 준수 | 금지 항목 없음 | 길이 | 두 번 돌려 같은가 |
|---|---|---|---|
| 실행 후 두 출력의 줄 수·형식을 기록 | ⑤에서는 금지 단어 발생 수를 세고 기록. 나머지는 적용 여부도 적음 | 두 출력의 문자 수 기록 | 두 원문이 같은지 기록 |

길이는 토큰 수가 아니라 Unicode code point 수다. 앞뒤 공백을 제거한 뒤 두 출력을 비교한다. 한 조건에서 두 번 같았다는 사실을 다른 모델·시각의 재현 보장으로 넓히지 않는다.

컴퓨터에서는 실행한 원문 두 파일을 개인 작업 사본에 저장한 뒤 검사한다.

```sh
cd practice/prompt-lab
pnpm compare records/run-1.txt records/run-2.txt
```

출력은 위 네 열을 JSON으로 채운다. 실제 모델 결과가 없는 상태를 검사기의 합성 테스트 문자열로 대신 채우지 않는다. 공유하기 전에는 출력에 키·개인 경로·계정 정보가 섞이지 않았는지 검토한다.

## 반복할 기준

차이는 먼저 관찰한 조건의 범위로 기록한다. 프롬프트 하나가 모든 작업에 통한다고 일반화하지 않는다. 반복해서 필요한 형식과 검사 기준은 [룰](/harness-basics/rules)·[스킬](/harness-basics/skills)로 옮기고, 다음 작업에서도 같은 검증을 적용한다.
