개요
회사에 퍼블리셔로 입사 후 AI에이전트(ChatGPT, Claude 등)를 사용하는 빈도가 급격히 증가했다.
물론 이전에도 자주 사용했지만 특히 더 사용하게 되는 것 같다는 생각이 들었다.
이전부터 AI에게 질문을 날리는 것에 대해 크게 생각하지 않고 생각하는 대로 적어 질문을 날리곤 했고, 지금도 마찬가지다.
그러다보니 원하는 답변을 빠른 시간 내 얻는데 문제가 생기는 경우가 종종 발생했고, 그럴 때마다 조건을 하나하나 추가하면서 추가질문을 던졌다.
이것이 반복되다보니 총 답변 양도 길어지고 그래서 결론적으로 내가 어떤 질문을 했는지, 어디의 어느 코드가 내가 원하는 코드인지 헷갈리는 경우가 많아졌다.
대형언어모델(LLM)에게 질문을 하는 이유가 빠른 시간 내 원하는 해결책, 답변을 얻는 것인데 그 장점이 약간 사라지는 것이다. (물론 인터넷 검색보다는 빠른 경우가 대부분이긴 하다.)
아무튼 나는 LLM에 질문을 던질 때 더 확실하고 정확한 값을 적은 프롬프트로 얻기 위해 프롬프트 엔지니어링에 대해 공부해 보기로 했다.
이 문서는 프롬프트 엔지니어링에 대한 기본적인 개념과 원리를 이해하고, 실제 프롬프트를 작성하는 방법을 정리한다.
참고문서
프롬프트의 기초
기초 프롬프트
평소의 나는 LLM을 다룰 때 간단한, 거의 1차원적인 프롬프트로 질문한다.
그렇기 때문에 어느 때는 한 번에 만족스럽고 양질의 결과를 얻지만 또 어느 때는 아무리 연속질문을 해도 같은 말만 반복, 원하는 정보를 어지 못할 때도 많다.
모델에 전달하는 프롬프트는 지시나 질문과 같은 정보와 맥락, 입력 또는 예시와 같은 세부사항을 포함할 수 있다.
이러한 구성요소를 사용하여 적절하게 지시하고 더 나은 결과를 얻을 수 있다.
간단한 예시로 시작해보자!
Prompt.
| |
Output. (OpenAI ChatGPT-4.5 / 2025.03.26 17:44)
| |
위와같이 LLM은 “하늘은"이라는 한 단어만 가지고 맥락을 파악하고 글을 이어나간다.
이 결과물은 화자가 예상하지 못한 답변을 내거나 원하는 답과는 거리가 있을 수 있다.
이를 통해 LLM에게 더 자세한 문맥과 구체적인 요구사항을 지시하는 것이 얼마나 중요한 것인지 알 수 있게 됐다.
한 발자국 더 나아가 보자!
Prompt.
| |
Output. (OpenAI ChatGPT-4.5 / 2025.03.26 17:44)
| |
출력조건 한 줄을 추가한 것으로도 화자가 의도한 답변에 근접해진 것을 볼 수 있다.
이와같이 LLM에게 작업을 수행하도록 지시하기 위해 최적의 프롬프트를 설계는 접근 방식을 프롬프트 엔지니어링이라고 한다.
프롬프트 형식
일반적으로 LLM에게 던지는 프롬프트는 다음과 같은 형식을 따른다.
| |
그리고 이번에 공부하며 새롭게 알게된 사실로 질의응답(QA) 형식으로도 작성이 가능하다는 것이다.
| |
이런 방식의 프롬프트 수행을 **제로샷 프롬프팅(zero-shot prompting)**이라 한다고 한다.
즉, 어떤 예시나 설명 없이 직접 LLM에게 응답을 요구하는 것…
대부분의 LLM에는 제로샷 프롬프팅을 수행할 수 있는 기능이 있지만 해당 작업의 복잡성과 모델이 가진 지식에 따라 다른 결과를 만들어 내기도 한다.
위를 응용한 인기 있고 효과적인 프롬프팅 기술 중 하나는 모범예시(시연 등)를 제공하는 **퓨샷 프롬프팅(few-shot prompting)**이다.
| |
물론 무조건 QA 형식을 따라야 하는 것은 아니다. 주어진 작업에 따른 적절한 형식을 사용하는 것이 좋다.
예시로 간단한 분류를 통해 모범 예시를 제공할 수도 있다.
Prompt.
| |
Output. (OpenAI ChatGPT-4.5 / 2025.03.26 22:42)
| |
(참고로 예시의 답을 반대로 적으면 결과는 “긍정"으로 나온다) 이와 같이 LLM에게 몇 번의 모범 예시를 보이면 퓨삿 프롬프팅은 문맥에 맞는 학습을 하는 것을 알 수 있다.
프롬프트의 구성 요소
여러 AI에이전트를 사용하다 보면 프롬프트에는 특정 구성 요소들이 있다는 것을 알 수 있다.
프롬프트에는 대표적으로 다음 구성요소가 있는데:
- 지시(Instruction): 모델이 수행할 특정 작업 또는 지시
- 문맥: 더 나은 응답을 위해 모델을 조종할 수 있는 외부 정보나 추가 문맥(예시 등)
- 입력 데이터: 응답받고자 하는 입력이나 질문(코드 등)
- 출력 지시자: 출력의 유형이나 형식
위 네 가지 요소가 프롬프트에 모두 필요한 것은 아니지만 분명 도움은 될 것이다.
프롬프트 설계에 관한 일반적인 팁
시작은 간단하게
프롬프트 설계를 시작할 때는 이 과정이 최적의 결과를 얻기 위해 많은 실험이 필요한 반복과정임을 명심해야 한다.
OpenAI에서 제공하는 Playground로 간단하게 시작해보자!
지시
‘작성하기’, ‘분류하기’, ‘요약하기’, ‘번역하기’, ‘정렬하기’ 등의 명령어를 사용하여 달성하고자 하는 결과를 지시해 효과적인 프롬프트를 설계할 수 있다.
물론 무엇이 가장 효과적인지 확인하기 위해서는 여러 시도와 시행착오를 겪어야 한다는 것을 명힘하자…
다양한 키워드, 문백과 데이터를 활용하여 다양한 명령을 내려보고, 특정 사용 사례와 작업에 적합한 방법을 찾는 것이 중요하다.
어쩌면 당연한 말일 수도 잆지만 수행하고자 하는 작업과 관련된 문맥이 구체적이고 적합할수록 더 좋은 결과를 얻을 확률이 높아진다.
프롬프트의 시작 부분에서 지시 사항을 명시하는 것이 좋다는 의견도 있다.
‘###‘과 같이 명확한 구분기호를 사용하여 명령어와 지시사항을 구부하는 것을 예로 들 수 있다.
Prompt.
| |
Output. (OpenAI ChatGPT-4.5)
| |
특이성
이것 또한 당연한 말일 수 있지만 실행시킬 지시와 작업을 구체적으로 설명하는 것도 중요하다.
프롬프트가 상세하고 구체적을수록 결과는 더 좋아지고 특정 출력이나 스타일을 얻고자 하는 경우에 특히 더 중요하다.
더 나은 결과를 내는 특정한 토큰이나 키워드는 존재하지 않으며 좋은 형식과 상세한 프롬프트를 준비하는 것이 키포인트.
프롬프트의 길이는 제한이 있기 때문에 프롬프트를 설계할 때 그 상항을 염두에 두고 있어야 한다.
얼마나 구체적으로, 상세하게 작성해야 할지 생각할 필요가 있으며 불필요한 세부사항을 많이 포함하는 것이 꼭 좋은 접근법은 아니다.
프롬프트 최적화를 위해 많은 실험과 반복을 거듭할 것을 권장한다.
Prompt.
| |
Output. (OpenAI ChatGPT-4.5)
| |
부정확성 피하기
무조건 구체적으로 설명하는 것을 고려하다가 부정확한 설명을 작성하는 등의 실수를 저지르기 쉽다.
프롬프트는 직접적이어야 더욱 좋은 결과물을 얻을 수 있으며 특히 직접적일수록 메시지가 더 효과적으로 전달된다.
돌려말하거나 애매한 표현을 사용하는 등의 프롬프트는 피하는 것이 좋다.
| |
이 프롬프트를 예로 들어보면 몇 문장을 사용해야 하는지, 어떤 스타일(타겟)을 사용해야 하는지 명확하게 명시되어 있지 않다.
물론 이 프롬프트로도 충분한 답변을 얻을 수 있겠지만, 매우 구체적이고 간결하며(??) 정곡을 찌르는(?!) 프롬프트일수록 좋다.
| |
해야 하는 것과 하지 말아야 할 것
프롬프트를 설계할 때 적용할 수 있는 또 다른 팁은 ‘하지 말하야 할 것’ 보다는 **‘해야 하는 것’**에 초점을 두는 것이다.
보통 질문을 할 때 **"~는 하지 말고 답변해줘”와 같은 표현을 사용할 때가 있는데 이런 표현과 함께 *해야 할 것도 같이 명시를 해주는 것이 좋다.
Prompt.
| |
Output. (OpenAI ChatGPT-4)
| |
(OpenAI ChatGPT-4o)
| |
(OpenAI ChatGPT-4.5)
| |
여기서 다른 점은 LLM의 발전에 따라 답변의 정확성이 훨씬 올라갔다는 것이다.
본인은 OpenAI의 ChatGPT를 사용해서 테스트를 진행했는데 2025년 3월 27일 기준 가장 최신버전인 GPT-4.5, GPT-4o 모델은 위의 프롬프트 만으로도 만족스러운 답변을 얻을 수 있었던 반면, 공개된지 시간이 지난 GPT-4 모델에서는 틀린 답변이 나온 것을 알 수 있다.
다음은 개선된 프롬프트를 사용하여 GPT-4 모델에서도 적절한 답변을 얻을 수 있는 예시이다.
Prompt.
| |
Output. (OpenAI ChatGPT-4)
| |
프롬프트 예시
문장 요약
문장 요약은 여러 주제와 도메인을 포함한다.
LLM이 처음 공개되었을 때 사실 대중에게 가장 와닿았던 것은 자연어 처리와 기사와 개념을 빠르고 읽기 쉽게 요약할 수 있는 능력일 것이다.
프롬프트를 사용하여 간단한 요약 작업을 시도해 보자.
Prompt.
| |
Output. (OpenAI ChatGPT-4o)
| |
**“A:”**는 질의응답에서 사용되는 명시적 프롬프트 형식을 가지고 있다.
허나 이 출력이 우리가 원했던 것보다 많은 양의 정보라서 추가적인 요약이 필요하다고 가정해 보자.
물론 다음과 같이 한 문장으로 요약하도록 지시할 수 있다.
Prompt.
| |
Output. (OpenAI ChatGPT-4o)
| |
정보 추출
LLM은 자연어 생성과 관련된 작업을 수행하도록 훈련되었지만 분류나 다양한 자연어 처리기 작업을 수행할 수도 있다.
주어진 단락에서 정보를 추출하는 프롬프트의 예시를 살펴보자.
Prompt.
| |
Output. (OpenAI ChatGPT-4o)
| |
이 결과를 더 개선할 수 있겠지만, 이미 꽤 만족스러운 결과를 배출했다.
이제 우리는 단순히 무엇을 할지 지시하는 것으로도 다양한 작업을 수행하도록 할 수 있다는 사실을 알게 됐다.
원본 출처: Apple Newsroom: Apple, 세계개발자회의 6월 9일 주간에 개최
질의응답
모델로부터 원하는 답변을 끌어내는 가장 좋은 방법 중 하나는 프롬프트 형식을 개선하는 것이다.
앞서 살펴본 바와 같이 프롬프트는 지시, 문맥, 입력 데이터와 출력 지시자를 조합하여 더 나은 겨로가를 얻을 수 있다.
이는 필수적은 것은 아니지만, 지시가 구체적일수록 더 좋은 결과를 얻을 수 있다.
Prompt.
| |
Output. (OpenAI ChatGPT-4o)
| |
텍스트 분류
지금보다 더 까다로운 작업을 수행하기 위해서는 지시만으로는 충분하지 않다.
문맥과 여러 요소를 고려하여 적절한 프롬프트를 사용할 필요가 있고, 입력 데이터나 예시 또한 요소로 지정할 수 있다.
Prompt.
| |
Output. (OpenAI ChatGPT-4o)
| |
지시에 대한 답변은 일단 올바르다…오답은 아니지만 모델이 우리가 원하는 정확한 값을 반환해야 한다고 가정했을 때 Netural (중립) 대신 netural을 반환하도록 해보자.
어떻게 하면 될까? 방법은 여러 가지가 있지만 한 에시를 추가하여 정확성에 초점을 맞출 수 있도록 해보자.
Prompt.
| |
Output. (OpenAI ChatGPT-4o)
| |
(이건 좀 신기했다) 아주 정확한 답변을 반환했다!
이를 통해 프롬프트에 예시를 제공한다면 원하는 답변을 이끌어 낼 수 있다는 것을 알게 됐다.
대화
이제 주어진 질문에 대해 기술적이고 전문적인 대답을 반환할 수 있는 대화형 시스템을 구축해보자.
역할 프롬프팅이라 불린다.
Prompt.
| |
Output. (OpenAI ChatGPT-4o)
| |
음…조금은 이해하기 어려운 것 같다.
더 쉬운 답변을 요구해보자!
Prompt.
| |
Output. (OpenAI ChatGPT-4o)
| |
위와 같이 훨씬 이해하기 쉬운 답변을 얻어 결과를 개선할 수 있다.
더 많은 예시를 추가한다면 훨씬 나은 결과도 얻을 수 있을 것이다.
코드 생성
우리의 주된 목표, LLM을 통한 코드 생성이다.
먼저, 유저에게 인사를 건네는 단순한 프로그램을 생성해보자.
Prompt.
| |
Output. (OpenAI ChatGPT-4o)
| |
어느 프로그래밍 언어를 사용해야 하는지 지정할 필요도 없이 JavaScript로 답변을 줬다.
조금 더 수준을 올려보자.
프롬프트를 어떻게 디자인 하느냐에 따라 LLM이 훨씬 더 강력해질 수 있다.
Prompt.
| |
Output. (OpenAI ChatGPT-4o)
| |
(사실 MySQL 쿼리도 모르고 DB에 대한 지식도 거의 없어서 적절한 답변인지 모르겠다. 공부가 필요하다….)
추론
지금이야 추론에 특화된 모델이 계속 출시되고 있지만 많은 레거시 모델들에게 가장 어려운 작업을 고르라면 추론이라 할 수 있을 것이다.
간단하게 산술 능력을 증명할 몇 가지 기본 예시를 다뤄보자.
Prompt.
| |
Output. (OpenAI ChatGPT-4o)
| |
이정도는 계산기 프로그램으로도 할 수 있으니 더 어려운 문제를 시도해 보자.
Prompt.
| |
Output. (OpenAI ChatGPT-4o)
| |
LLM의 발전이 눈부시다… 공부 중인 문서에서는 틀린 결과를 반환했지만 나름 단계별로 해결한 흔적을 보인다.
마무리
일단 참고 문서의 소개 부분만 학습했지만 처음 알게된 사실도 있었고, 실제로 AI에이전트를 사용할 때 크게 도움이 될만한 요소도 있었다.
이 포스트는 참고문서 따라적기로 보일 수 있고 반은 맞는 말이지만 예시 프롬프트는 조금 바꿔 제시하거나 내 관심사로 돌려 질문하는 등 최대한 학습하며 결과를 더 와닿을 수 있도록 노력하며 임했던 것 같다.
이렇게 이론을 학습하고 정리했으니 다음 포스트에서는 실제 예제 프롬프트를 작성해보자.
- 프롬프트를 작성해 Vanilla JavaScript 코드를 만들고 HTML, CSS 코드 등을 리펙토링
- React의 작동 원리를 설명하고 Vanilla JavaScript와의 차이점 서술
