여러 서비스의 다양한 기능에 프롬프트 엔지니어링을 해보면서 습득한 프롬프트 스킬과 팁을 정리해 보고자한다.
목차
- 공통 스킬
- 상황별 스킬
- 추가 Tip
프롬프트 엔지니어링도 코딩과 같다. 요구사항이 정해지면 그에 필요한 것들을 정의하고 설계하고 해결해 나가야 한다. 그리고 하나 하나 정교하게 명령을 풀어나가면 보다 좋은 결과를 얻을 수 있다.
아래의 스킬은 단순한 대화, 요약, 번역부터 AI 리포트, 캐릭터가 반영된 AI, 정확한 품질과 실시간 답변을 요하는 서비스까지 다양한 경험을 토대로 얻은 스킬이다. 당장 서비스에 적용할 수 있을 뿐만 아니라 일상에서 Chat GPT 같은 서비스를 이용할 때에도 도움이 될 것이다. 추가로 세부적인 제어를 위한 스킬들이 있지만, 이러한 부분은 기회가 되면 차차 다뤄보고자한다.
1. 공통 스킬
먼저, 어떤 목적이든지 두루두루 사용할 수 있는 공통적인 스킬들을 살펴보자. 프롬프트를 많이 만져본 사람이라면 많이 사용하고 있는 방법일 것이다. 각자 필요에 맞는 것들을 종합해 사용하면 된다.
1.1 역할 부여와 사용자 정보 제시하기
가장 먼저 제시할 수 있는 것은 AI가 해야하는 역할이다. 내가 원하는 AI의 역할은 무엇인지, 이 프롬프트가 전반적으로 어떤 역할에 대한 것인지 먼저 짚고 들어가는 것이 좋다.
이에 추가로 필요한 경우, 사용자에 대한 정의를 같이 주는 것도 도움이 된다. 예를 들어, 블로그를 쓴다면 이에 대한 구독자는 누구인지 명확하게 제시해주는 것이 좋다.
다음 예시를 살펴보자.
- 당신은 OOO 하는 전문가입니다.
- 당신은 OOO으로서 주어진 페르소나에 맞게 대화 해야 합니다.
- 당신은 OOO 하는 AI입니다. 당신은 XXX한 사람들에게 적합한 답변을 제공해야합니다.
1.2 구체적이고 명확한 표현과 긍정적 지시 사용하기
프롬프트에 내가 얻고자하는 것에 대해 최대한 명확하고 자세히 제시할 수록 원하는 목적에 맞는 결과를 얻을 수 있다. 그냥 해줘가 아니라 어떤 것이 필요하고 어떻게 해야하는지 제시해야한다. 생각해보면 당연한 것이다. 추가로 부정적인 언어가 포함된 명령보다 긍정적인 언어가 포함된 명령을 사용하는 것이 좋다. 예를 들어, “~ 하면 안돼” 보다 “~해야해” 라고 제시하는 것이다.
예시를 살펴보자.
- 내가 쓴 글 어때? (X)
- ~에 대한 기술블로그 글을 작성했어. 이 글을 보고 목차의 구성과 내용이 적합한지 알려줘. (O)
- 너무 길게 쓰지마 (X)
- 핵심 내용을 3문장 이내로 간략하게 요약해주세요.(O)
1.3 보상/책임 제시하기
AI도 상과 벌에 대해 인식하고 있다. 잘하면 보상을 주고, 못하면 책임을 지게 하는 것, 이 부분을 이용할 수도 있다.
예시로 살펴보자. 보상과 책임에 대해 다음과 같이 제시할 수 있다.
- 만약, 내가 제시한 조건들을 모두 만족하는 결과를 만들어준다면 5000만원을 드립니다.
- 만약, 내가 제시한 조건을 모두 지키지 못한다면 당신은 처벌을 받을 것입니다.
간혹 ChatGPT와 Claude와 같은 서비스를 이용하다 보면 말을 번복하거나 불확실한 답변을 할 때가 있다. 이럴 때에 보상과 책임을 강하게 써보는 것을 추천한다.
1.4 재검토/확인 요청을 통한 품질 강화
내가 제시한 조건에 만족하는 좋은 품질을 얻기 위해서 프롬프트에 재검토와 재확인에 대한 요청을 추가할 수 있다. 모든 요구 사항을 제시한 후 마지막에 조건에 맞는지 재검토를 통해 조건에 맞지 않는 부분을 삭제 또는 수정해 달라고 하면 된다.
예시를 보자.
- 위의 제시한 조건에 적합한지 재 검토를 통해 조건에 맞지 않는 내용이 있다면 수정해주세요.
1.5 예제 제시하기 (Few-shot Prompting)
프롬프트에 입력에 대한 예시와 내가 원하는 결과에 대한 예시를 제시할 수 있다. 이 방법을 Few-shot Prompting이라고 부른다. 단, 주의할 점이 있는데 gpt-4o-mini와 같은 모델을 사용할 경우 프롬프트에 있는 예시를 실제 상황에 적합하지 않은데 그대로 답변에 사용하는 경우가 종종 발생한다. 모델에 대한 이해와 테스트가 필요한 이유이다.
1.6 단계적 방법 제시하기 (zero-shot CoT)
결과를 만드는데 과정이 존재한다면 “단계적으로 생각하세요"와 같은 표현을 추가해 추론 능력을 높일 수 있다. 단순히 프롬프트에 해당 표현만 추가했을 뿐인데 효과가 있다. 이 방법을 zero-shot Cot (Chain-of-Thought) 라 부른다.
단계적으로 생각하라는 단순한 표현 뿐이 아닌 단계적 절차에 대한 설명을 추가해 주는 방법도 있는데 이를 Chain-of-Thought (CoT) Prompting 방법이라고 부른다.
1.7 구조화하기
이 부분이 가장 고민해봐야 하는 부분이다. 프롬프트에 단순히 명령들을 나열하는 것이 아니라 필요한 요구 사항을 잘 정돈하여 구조화하는 것이 좋다. 쉽게 말해서 역할에 대한 정의, 세부 조건, 주의 사항, 입력과 출력의 형태, 답변에 참고해야 하는 정보 등등 이러한 것들을 어떻게 위치하고 구성할 지에 대한 것이다.
먼저, 특수기호를 사용하거나 세부 항목을 구분지을 이름을 붙여 구조화하고 이를 지칭해 사용할 수 있다. 예를 들어 #을 이용한다면 #지시#, #주의 사항#, #응답 형식# 등으로 구분하고 언급하면 된다. 특수기호를 쓰지 않더라도 잘 구분할 수 있도록 하면 된다.
그리고 강조하고 싶은 것이 있다면 특정 단어나 문장을 여러 번 언급하는게 좋은데, 특별히 강조하고 싶은 조건에 대한 문장이 있다면 처음, 중간, 끝에 필요에 맞게 골고루 넣어두는 것이 좋다. 어떤 항목을 어디에 두고 또 어디에 한번 더 추가해 강조할 수 있는지 고민해보자.
응답 형식을 지정할 때, 단순한 문장을 받을 수도 있지만 복잡한 구조의 json 형태로 요청하고 응답을 생성할 수도 있다. 단, gpt-4o-mini나 gemini-1.5-flash-8b 모델을 사용한다면 특수기호를 넣을 때나 복잡한 json 구조로 응답을 받을 때 주의가 필요하다. 답변에 불필요하게 특수기호가 포함되거나 원하는 json 형식대로 생성하지 못하기도 한다. 충분한 테스트를 통해 적합한 방법을 적용하길 바란다.
이 외에도 여러가지 방법과 기법들이 존재한다. 중요한 건 내가 원하는 결과를 만들어 내도록 잘 구성하는 것이다.
2. 상황별 스킬
이번엔 특정 상황에 대한 프롬프트 스킬들을 살펴보자. 다양한 상황들이 존재하겠지만, 일단 몇 가지 소개해보고자 한다.
2.1 대화 유도하기
대화하는 AI를 만들 때, 답변만하고 끝나는게 아닌 서로 상호 작용이 이루어지며 대화가 이어져야하는 경우가 있다. 이러한 경우 대화가 이어지도록 유도하라는 지시가 필요하다. 만일 대화의 주제가 정해져 있고, 이 주제에서 멀어지면 안되는 상황이라면 이에 대한 지시도 필요하다. 예시를 보자.
- 사용자와의 대화가 이어지도록 답변을 유도하거나 질문을 통해 이어지도록 하세요.
- 대화의 주제는 반드시 ~에 해당해야 합니다. 주제에 벗어난다면 자연스럽게 다시 ~에 대한 답변 또는 질문을 유도해 주세요.
2.2 때론 거짓말 보다는 솔직함이 낫다
LLM은 자연스럽게 할 수 없는 일도 할 수 있다고 거짓말을 하곤 한다. 그런데, 자연스러운 거짓말이 도움이 될 때도 있지만 해서는 안 될 거짓말까지 하는 경우도 있다.
예를 들어, 알람 설정에 대한 기능을 제공하지 않는데 “7시에 알람 설정해줘.”라는 질문에 "알람을 7시로 설정해드릴게요. 확인하신 후 필요하시면 언제든지 말씀해 주세요."라고 답하기도 한다. 이런 경우는 못한다고 솔직히 답변하는 것이 낫다.
따라서 이런 경우 할 수 있는 기능에 대한 정의를 제시해주고, 이외에는 제공하지 않음에 대한 제시를 해주는 것이 좋다.
2.3 중립적인 모호함에서 벗어나기
OpenAI의 경우, 논란의 여지가 있는 주제에 대한 답변은 윤리적 문제가 있어 편향적이지 않도록 방지하며 중립적으로 대응한다. AI 윤리 문제는 중요한 부분이기 때문에 OpenAI에서도 중요하게 다루고 있는 부분임을 알 수 있다. (참고: https://openai.com/safety/)
그런데 윤리적 문제를 해치지 않는 선에서 조금 명확한 답변이 나왔으면 하는 순간들이 존재할 것이다. 이러한 경우 윤리적 판단의 근거를 제시하며 이에 대한 명확한 답변을 달라고 추가하는 방법을 사용할 수 있다. 추가로 답변에 필요한 관련 정보를 제대로 제시한다면 도움이 될 것이다.
2.4 속도 개선하기
LLM의 응답 속도는 토큰 사이즈에 따라 다르기도 하지만 같은 요청이라도 제각각이다. 빠르면 3초 이내로 답변이 나오기도 하지만 길면 7초 이상 소요되기도 한다. 스트림을 사용하는 방법도 있지만, 모든 상황에 적합한 것은 아니다. 이러한 문제를 제어하는 것은 우리의 힘으로 하기 어렵다. 그러나 우리는 프롬프트에 명령할 수 있다.
빠른 속도를 요구하는 서비스라면 속도 강화에 대한 프롬프트를 넣어 개선할 수 있다. 물론, 프롬프트를 넣는다고 모든 응답이 빠르게 나온다는 것을 보장할 수 없지만 개선 됨을 확인하였다. 아래는 같은 요청에 대해 속도 강화에 대한 프롬프트를 넣지 않은 것과 넣지 않은 것의 응답 속도 결과이다. 확연히 차이가 나는 것을 볼 수 있다. 단, 주의할 점은 속도는 빨라지나 응답 결과의 토큰 사이즈는 평균적으로 감소한다. 답변 품질에 영향을 미치지 않는지 확인하며 적용해야한다.
- 속도 강화 프롬프트를 넣지 않은 경우
- 4.50s 소요
- prompt_tokens: 1373
- completion_tokens: 117 (테스트 결과마다 차이 있음)
- 속도 강화 프롬프트를 넣은 경우
- 1.11s 소요
- prompt_tokens: 1457
- completion_tokens: 85 (테스트 결과마다 차이 있음)
또 다른 방법으로는 답변의 출력 형식을 간결하도록 하는 것이다. 복잡한 구조의 json 형태로 받고 있다면 조금 더 단순한 구조 혹은 단순 string 형태로 받을 수 있는지 확인해보는 것도 좋다.
2.5 페르소나 주입하기
요즘 특정 인물, 캐릭터 등의 특징이 반영된 AI를 만드는 서비스들이 생겨나고 있다. 이렇게 캐릭터를 만들 때 원하는 캐릭터에 대해 단순한 페르소나 정보만 넣어서는 좋은 품질을 기대할 수 없다.
특정 페르소나가 담긴 좋은 품질의 AI를 만들기 위해서는 그 캐릭터에 대한 이해를 할 수 있는 정보를 풍부하게 넣어줘야 한다. 배우들이 연기를 하기 위해서도 캐릭터에 대해 성격, 말투, 배경, 관계 등등 깊게 분석한다. AI도 마찬가지다. 캐릭터를 이해시킬 수 있는 정보를 넣어보자. 이에 대한 자세한 방법을 추후 기회가 되면 다뤄보고자 한다.
2.6 AI 리포트 생성하기
AI 리포트 생성은 리포트의 종류에 따라 복잡도가 다르겠지만 비교적 복잡한 절차를 가지고 있다. 리포트는 목적에 맞는 제목과 개요에 대한 설명이 필요하고, 목차가 정해져야 하며, 각각의 목차에 해당하는 내용이 주제에 맞도록 잘 생성되어야 한다. 추가적으로 시각적 자료도 생성이 필요하다. 이에 대한 방법도 기회가 되면 다뤄보고자 한다.
3. 추가 Tip
3.1 사용하는 모델에 대한 이해
모델에 대한 이해는 서비스에 적용할 때 가장 중요한 부분이다. 각 모델마다 특징이 존재하고, 내가 원하는 결과를 만드는데 있어 결과에 차이를 가져오기 때문이다. 사용 방법과 더불어 다른 서비스의 유사 모델에 대해 알고 있는 것도 중요하다. 대체 가능한 모델을 알고 있다면 장애에 유연한 서비스를 만들 수 있다. 토큰 사이즈도 고려해서 불필요하게 과한 프롬프트가 있지는 않은지도 체크해보자.
3.2 LLM 서비스에서 제시하는 프롬프트 활용하기
만약, 프롬프트를 어떻게 작성해야하는지 모르겠다면 일단 만들어진 예시를 보고 사용해보며 요구사항을 덧붙여보자.
다음은 OpenAI와 Google에서 제공하는 예시이다.
- OpenAI: https://platform.openai.com/docs/examples
- Google: https://cloud.google.com/vertex-ai/generative-ai/docs/prompt-gallery?hl=ko
3.3 LLM을 활용해 프롬프트 만들기
우리가 잘 모르는 대상 혹은 주제가 반영된 프롬프트를 작성해야 하는 상황이 있다. 프롬프트를 만들기 위해 해당 대상에 대한 정보를 수집하거나 이해해야 한다면 일단 LLM한테 물어보며 불필요한 시간을 낭비하지 말자. LLM이 알고 있는 지식이라면, 해당 대상에 대한 정보를 물어보고 프롬프트를 만들어 달라고 해보자. 만들어준 프롬프트 기반으로 재구성해 보는 것도 도움이 될 것이다. 단, 할루시네이션에 주의해야 한다. 반드시 그냥 그대로 갖다 쓰지 말고 한 문장 한 문장 직접 검토해야 한다.
적용하려는 용도와 서비스에 따라 조금씩 차이가 있겠지만, 활용할 수 있는 스킬들을 정리해 보았다. 좋은 품질의 답변을 내기 위해서는 세밀한 제어와 많은 테스트가 필요하다. 위의 내용이 도움이 되길 바란다.
'AI' 카테고리의 다른 글
[AI] MCP(Model Context Protocol), AI와 앱을 연결하는 새로운 표준 (2) | 2025.04.20 |
---|