거대언어모델(LLM) 사용 전략 (1)
프롬프트 엔지니어링 - 명령만 잘해도 일의 능률이 향상된다
2022년 말 공개된 ChatGPT 가 얼마나 세계적인 충격을 줬는지는 이미 모두가 알고 있을 것이라고 생각하므로 설명을 건너뛴다. ChatGPT와 그 친구들(Meta Llama, Google Gemini)을 통칭 거대언어모델 (Large Language Model - LLM)이라고 하는데, 앞으로 LLM의 발전이 얼마나 빠르게 이루어질지 알 수 없지만 한 가지 확실한 것은, 원리는 이해하기 힘들더라도 최소한 사용법은 알고 있어야 우리의 생산성을 최대한 높일 수 있다는 것이다. 자동차의 원리를 이해하고 운전할 필요가 없듯, LLM의 내부가 어떻게 생겨먹은 녀석인지 모두가 이해할 필요는 없을 것이다.
이 글에서는 LLM의 사용전략에 대해서만 이야기한다. 현재까지의 LLM 은 사람과 소통하는 방법이 주로 프롬프트 (텍스트 입력창)인데, 그래서 입력창에 텍스트를 잘 써서 원하는 결과를 잘 이끌어내는 공학적 접근을 "프롬프트 엔지니어링"이라고 부른다. 말이 엔지니어링이지 사실상 삽질(반복시도의 속어)을 통해 교훈들을 얻어내는 일에 가깝다. 글만 잘 써도 웬만한 유료 프로그램들보다 훨씬 좋은 결과 값을 도출할 수 있으며 시간 소모와 반복작업을 획기적으로 줄여줄 수 있다는 점에서 이 프롬프트 엔지니어링을 익혀야 할 이유는 충분하다. 개발/비개발 직군을 나눌 일이 아니며, 앞으로는 프롬프트 엔지니어링을 최소한으로라도 알고 있어야 시대에 뒤떨어지지 않을 것이다.
(아래의 원칙과 예시들은 Deeplearning.ai 의 무료 강의인 ChatGPT Prompt Engineering for Developers 의 Guidelines 부분을 편집하여 쉽게 읽히도록 바꾼 것이다. 비개발자라면 이 글을 읽는 것이 좋고, 개발자라면 직접 강의를 듣는 것이 가장 효과적이다.)
전략 1-1. 구분자를 잘 사용한다.
이를 위해선 구분자를 명확하게 써주는 것이 도움이 된다. 예를 들면 아래와 같이 따옴표와 ""를 쓸 수 있다.
또한 개발팀과의 협업을 위해 ```, """, < >, <tag> </tag> 등 다양하게 사용하는 것이 가능하다.
전략 1-2. JSON이나 HTML로 표현된 구조화된 데이터를 요청해 본다.
예를 들면 구조화된 데이터 샘플을 얻기 위해 아래처럼 프롬프트를 쓸 수 있다.
이렇게 하면 데이터 관리나 개발팀과의 협업이 매우 용이해진다.
전략 1-3. 지시사항에 따른 답변이 조건을 만족하는지 체크하는 일까지 함께 요구한다.
말이 좀 어려운데, 예시를 보면 금방 이해가 된다. 예를 들어 긴 문장들의 연속에서 '지시사항의 순서'를 뽑아내는 일을 시킨다고 가정하자. 그러면 아래와 같이 써본다.
따옴표 세 개로 묶인 텍스트가 제공됩니다. 만약 그 안에 만약 순서가 있는 지시 사항이 있다면, 다음 형식으로 다시 작성해 주세요:
단계 1 - ...
단계 2 - …
…
단계 N - …
만약 텍스트에 순서가 없는 지시 사항이 포함되어 있지 않다면, 그냥 "단계가 제공되지 않았습니다."라고 작성해 주세요.
여기서 지시사항이 포함되어 있지 않다면, 즉 조건이 충족되지 않는다면 '단계가 제공되지 않았습니다'라는 말을 대신 써달라고 하는 것이다. 아래의 예시를 보자.
이 경우는 조건이 충족되었기 때문에 단계별 지시사항이 잘 나왔다. 그러나 아래의 예시의 경우를 보자.
이것이 우리가 원하는 답변이다. 이 조건 체크가 왜 필요하냐 하면, 이 정도로 구체적으로 지시해주지 않으면 이상한 답변을 내놓는 일이 잦기 때문이다. 조건 체크 없이, 즉 "단계가 제공되지 않았습니다"에 대한 부분을 빼고 지시하면 아래와 같은 희한한 답변이 나온다.
전략 1-4. Few-shot (퓨샷) 프롬프팅을 사용한다.
퓨샷 프롬프팅 (Few-shot Prompting) 은 쉽게 말하면, "지시가 성공적으로 이루어진 예시를 같이 제공하는 것"이다. 아래의 예시를 보자.
퓨샷 프롬프팅은 원하는 답변을 끌어내기 위한 좋은 시도이긴 하지만 원하는 결괏값을 얻어내기까지 상당한 노력이 필요할 수 있다. 프롬프트 엔지니어링이 삽질(반복시도의 속어)인 이유다.
무슨 이야기냐면, 모델이 지금 너무 어려운 일을 하고 있다고 판단될 때는 질문을 바꿔야 한다는 것이다. 모델이 서둘러서 결론에 도달하다가 추론 오류를 일으키고 있다면, 질문을 다시 구성하여 모델이 최종 답변을 제공하기 전에 추론의 과정을 함께 요청해 보는 것이 도움이 된다. 모델에게 너무 복잡한 작업을 부여하고 이걸 적은 시간과 적은 단어 수로 해결하길 요구하면 모델이 부정확한 결론을 낼 수 있다.
이것은 사람에게도 일어날 수 있는 일이다. 어떤 사람에게 복잡한 수학 문제를 풀라고 요구해 놓고 시간을 충분히 주지 않으면 그 사람은 오류를 범할 가능성이 높다. 이런 상황에서는 모델에게 문제에 대해 더 오랜 시간을 고민하도록 지시할 수 있다. 이를 통해 작업 계산에 더 많은 노력을 들이게 할 수 있다.
전략 2-1. 일을 하기 위해 필요한 과정들을 함께 제시한다.
아래의 예시를 보자. 각 일들의 단계를 구분하여 요구하고 있다.
전략 2-2. 모델이 뭔가 결론을 내리기 전에 스스로 문제를 풀어보라고 강제한다.
이게 대체 무슨 말인가 싶을 수 있는데, "결론을 너무 일찍 내지 말라"는 문장을 조건에 포함하는 것이다. 아래의 예시를 보자.
이런 조건을 달아두면 모델이 너무 서둘러서 결론을 내버리는 일을 방지하는 데에 도움이 된다.
LLM은 정말 신기한 기술이며 잘 사용하면 생산성이 극대화될 수 있으니 적극 활용해 보자. 또한 LLM에서 나오는 정보는 100%로 신뢰하지 않고 꼭 사실 여부를 다시 체크해 보자. Hallucination이라고 알려진, 너무 그럴듯하게 거짓말하는 현상이 있으므로, LLM의 답변은 꼭 다시 한번 체크해 보는 것이 좋다.