SCoT 프롬프트 기법을 적용하여 모니터 속의 복잡한 코드를 분석하고 구현하는 개발자의 뒷모습 일러스트
|

LLM이 개발자처럼 생각하게 만드는 기법: SCoT 프롬프트 완벽 가이드

LLM이 개발자처럼 생각하게 만드는 기법: SCoT 프롬프트 완벽 가이드

ChatGPT나 Claude에게 코드를 짜달라고 했는데, 겉보기엔 멀쩡해 보여도 막상 돌려보면 에러가 나거나 로직이 꼬여있던 경험, 다들 있으시죠?

“프롬프트를 더 구체적으로 쓰세요”라는 뻔한 조언은 이제 지겹습니다. 오늘 코드 생성 정확도를 무려 13.79%나 높여주는 확실한 프롬프트 엔지니어링 기법을 소개합니다.

바로 SCoT (Structured Chain-of-Thought, 구조적 생각의 사슬) 입니다.

이 글을 다 읽으시면, 여러분은 LLM이 ‘개발자처럼 생각하고 코드를 짜게 만드는’ 비밀 공식을 얻어가게 됩니다.


왜 ChatGPT는 자꾸 ‘버그 있는 코드’를 짤까?

우리가 흔히 쓰는 ‘Chain-of-Thought(CoT)’ 프롬프트 방식에는 치명적인 약점이 있습니다. CoT는 문제를 풀 때 “단계별로 생각해봐(Let’s think step by step)”라고 유도하는 기법인데, 이는 자연어(Natural Language) 생성에는 강하지만 코드 생성에는 약합니다.

왜냐구요? 소스 코드는 ‘구조(Structure)’가 생명이기 때문입니다.

우리가 글을 쓸 때는 의식의 흐름대로 써도 되지만, 코드를 짤 때는 다릅니다. 변수를 선언하고, 반복문을 돌리고, 조건에 따라 분기하는 논리적 구조가 필수적이죠. 그런데 일반적인 CoT는 이런 구조 없이 줄글로만 생각을 나열하다 보니, LLM이 코드를 짤 때도 구조가 무너진(속칭 스파게티 코드) 결과물을 내놓게 됩니다.

📉일반 CoT의 한계 (예시)

사용자: 리스트의 합을 구하고 최댓값과 비교해서 갱신해.

LLM의 생각:

결과를 -999999로 초기화한다.
리스트를 반복한다.
합계를 0으로 초기화한다.
… (줄글로 나열하다 보니 루프의 범위가 어디까지인지 모호함)

이런 모호함 때문에 코드가 꼬이게 됩니다.


해결책: 생각에도 ‘구조’를 입혀라 (SCoT)

베이징 대학 연구진이 발표한 논문 “Structured Chain-of-Thought Prompting for Code Generation”에 따르면, 해결책은 간단합니다. LLM이 코드를 짜기 전에 프로그래밍의 3대 구조를 사용해서 생각하게 만드는 것입니다.

🛠️SCoT를 구성하는 3가지 핵심 블록

모든 프로그램은 아무리 복잡해도 결국 이 3가지 구조의 조합입니다.

  • 순차 구조 (Sequence Structure): 명령을 위에서 아래로 차례대로 실행
  • 분기 구조 (Branch Structure): if, else if, else를 사용해 조건에 따라 다른 길 선택
  • 반복 구조 (Loop Structure): for, while을 사용해 특정 조건까지 반복

SCoT는 LLM에게 “자연어로 주저리주저리 설명하지 말고, 위 3가지 구조를 명시한 ‘의사코드(Pseudocode)’ 스타일로 먼저 계획을 세워!”라고 강제하는 기법입니다.


실전! SCoT 프롬프트 작성 가이드 (Before & After)

백문이 불여일견, 실제 논문에 나온 예시를 통해 확연한 차이를 느껴보세요.

기존 방식 (CoT)

Q: 주어진 문자열에서 '첫 번째로 반복되는 문자'를 찾는 함수를 짜줘.

(LLM의 중간 생각)
1. 문자열의 각 문자를 확인한다.
2. 만약 문자가 두 번 이상 나오면 그걸 반환한다.
3. 없으면 None을 반환한다.

-> 생각 과정이 너무 단순해서 구체적인 구현(어떻게 카운트할 것인지)이 누락될 가능성이 높음.

SCoT 방식 (구조적 사고)

SCoT 프롬프트를 적용하면 LLM은 코드를 짜기 전에 아래와 같이 구조화된 생각을 먼저 출력합니다.

Input: str (문자열)
Output: ch (반복된 문자)

1: for each character ch in str:  

보이시나요? 들여쓰기(Indentation)와 제어문(for, if)이 명확합니다. 이렇게 사고 과정을 구조화하면, 이후에 실제 코드로 변환할 때 오류가 날 확률이 획기적으로 줄어듭니다.

또한, SCoT에는 반드시 입출력 구조(Input-Output Structure)를 명시해야 합니다.

Input: 변수명(타입), Output: 변수명(타입)을 먼저 정의하게 하면, LLM이 프로그램의 시작과 끝을 명확히 인지하게 되어 성능이 더욱 향상됩니다.


논문으로 검증된 성능: 정확도 13.79% UP

이 방법, 정말 효과가 있을까요? 연구진은 ChatGPT와 Codex 모델에 SCoT를 적용하여 HumanEval(파이썬 코딩 테스트) 벤치마크를 돌려보았습니다.

  • ChatGPT + 기존 CoT: Pass@1 점수 53.29%
  • ChatGPT + SCoT (우리 방식): Pass@1 점수 60.64%

단순히 프롬프트 방식만 바꿨는데 정확도가 약 13.79%나 상승했습니다. 심지어 C++ 언어 테스트(MBCPP)에서도 성능이 향상되어, 언어에 상관없이 통하는 방법임이 증명되었습니다.

또한, 실제 현업 개발자 10명을 대상으로 블라인드 테스트를 진행한 결과, SCoT로 생성한 코드가 유지보수성(Maintainability)과 가독성 측면에서도 훨씬 높은 점수를 받았습니다. 구조적으로 생각을 정리한 뒤 코드를 짜니, 당연히 코드 냄새(Code Smell)가 적고 깔끔할 수밖에 없겠죠.


지금 당장 써먹는 SCoT 프롬프트 템플릿

여러분의 업무 효율을 위해, 논문의 방법론을 적용한 SCoT 전용 시스템 프롬프트를 공유합니다. 복사해서 사용해보세요.

당신은 전문 소프트웨어 엔지니어입니다. 코드를 작성하기 전에, 반드시 다음 규칙에 따라 '구조적 사고 과정(Structured Chain-of-Thought)'을 먼저 작성해주세요.

[규칙]
1. 가장 먼저 **Input(입력 변수와 타입)**과 **Output(출력 변수와 타입)**을 정의하십시오.
2. 문제 해결 과정을 **3가지 기본 구조**를 사용하여 단계별로 서술하십시오.
   - **Sequence**: 순차적 실행
   - **Branch**: if, else if, else (조건 분기)
   - **Loop**: for, while (반복)
3. 각 단계는 자연어와 의사코드(Pseudocode)를 혼합하여 명확히 작성하십시오.
4. 구조적 사고 과정 작성이 끝나면, 이를 바탕으로 최종 코드를 구현하십시오.

요약

  • 코딩은 글쓰기가 아닙니다. 줄글 형태의 일반 CoT 프롬프트는 코딩에 적합하지 않습니다.
  • 구조(Structure)가 핵심입니다. 순차, 분기, 반복(Sequence, Branch, Loop) 3가지 구조를 생각의 단계에 강제로 포함시키세요.
  • 입출력을 정의하세요. Input과 Output 타입을 명시하는 것만으로도 LLM의 이해도가 올라갑니다.

이제 "코드 좀 짜줘"라고 대충 말하지 마세요. "구조적으로 생각한 뒤에 짜줘"라고 요청하세요. 이 작은 차이가 여러분의 퇴근 시간을 앞당겨 줄 것입니다.

Similar Posts