오늘 배운 것

스스로를 LLM이라고 생각해 보자. LLM에 멘토님이 보내주신 프롬프팅 관련 지식들을 학습시킨 다음, 그 지식을 토대로 프롬프팅을 어떻게 할지, 하위 투두의 퀄리티는 어떻게 높일 수 있을지를 생각해 보는 것이다. 

 

우선 문서를 읽기 전에는 프롬프팅을 그냥 잘 하면 되는거 아닌가? 싶었는데 그건 아닌 모양이다. 여러 가지 프롬프팅에 대한 기본적인 지식과 Claude(여기서는 Claude를 다루는 법을 설명하는데 GPT도 엄청 다르지는 않을 것 같다)를 어떻게 다뤄야 하는지에 대한 매뉴얼과 그에 따른 예시들이 설명되어 있었다. 

 

그리고 '프롬프팅'과 '프롬프트 엔지니어링'의 차이도 명확히 알 수 있었다. '프롬프팅'은 말 그대로 LLM에게 질의를 한 번 던지는 것이고, '프롬프트 엔지니어링'은 세밀하게 짜여진 질의를 던지고, 사용자들이 줄 수 있는 광범위한 질의에 대해서 LLM이 어느 정도 범주에 있는 예측 가능한 응답을 하도록 프롬프트를 만드는 것이었다. 

 

뿐만 아니라 프롬프트 엔지니어링은 초기에 완벽한 프롬프트를 짠다고 끝이 아니었다. 애초에 완벽한 프롬프트라는 게 없기도 하거니와, 분명히 예상하지 못한 오류들이 있을 것이기 때문이다. 그래서 우선은 최대한 이상적인 초기 프롬프트를 짜고, 여러 가지 유저의 테스트 답변을 통해 프롬프트가 정상적으로 작동하는지 계속 확인하면서 프롬프트를 개선하는 과정이 프롬프트 엔지니어링이라고 할 수 있겠다. 

 

아무튼, 프롬프트 엔지니어링을 하려면 제대로 된 초기 프롬프트를 짜는 것도 중요하다. 가이드에서 제시한 프롬프트를 잘 짜는 방법들에는 다음과 같은 것들이 있었다:

1. LLM에게 역할 부여하기

2. XML 등의 태그를 사용하여 LLM이 참고할 만한 정보 등을 구조화해서 표현하기

3. Input, Output의 형식과 길이 등에 대해서 구체적인 정보 제시하기

4. LLM이 자신의 사고과정을 직접 표현하도록 하기

5. 여러 예시들을 같이 제공하기(multi-shot prompting 이라고 한다)

 

즉 앞으로의 작업들은 이렇게 하면 되겠다. 

순서 할 일 마감기한
1 위의 1-5번 원칙을 통해서 초기 프롬프트를 작성하기 8/25
2 프롬프트를 테스트할 여러 인풋을 만든 다음, 점수를 매길 기준을 정해서 테스트하기 8/26
3 2번에서의 문제점을 해결하는, 더 개선된 프롬프트 만들기 8/27

 

그러면 우선은 1번 작업을 해 보자. 참고로 LLM을 API 단에서 사용할 때는 'system' 이라는 파라미터를 사용해서 유저가 원하는 답변의 형식이나 방식 등을 조절하고, 'prompt' 파라미터를 사용해서 그때그때 LLM이 답변해주었으면 하는 것들을 입력하는 것으로 보였다.

 

시스템 프롬프트에는 다음과 같이 입력해 주었다. 

너는 사람들이 계획을 잘 세우도록 도와주는 기획자이자 플래너야. 네가 할 일은 사람들이 너에게 ‘투두(할 일)’을 제시하면 그걸 더 작은 단위인 ‘하위 투두’들로 나눠주는 거야. 

 

이후 일반 프롬프트에는 다음과 같이 입력해 주었다. 

'<examples>' 태그에는 투두를 하위 투두로 쪼개주는 예시들이 있어. 이 예시들을 참고해줘.

<examples>

  <example>
    1. 투두를 하위 투두들로 나누는 데 필요한 정보가 충분한 경우. 이 경우는 바로 해당 투두를 하위 투두로 나눠주면 돼.
    <user_prompt>
      아스랑 저녁 8시에 만나서 집들이하기
    </user_prompt>
    <subtodos type=‘answer’>
      1. 아스한테 오늘 약속이 맞는지 확인하기
      2. 저녁 7시에 아스네 집으로 출발하기
      3. 집들이 선물 사 가기
    </subtodos>
  </example>

  <example>
    2. 투두를 하위 투두들로 나누는 데 필요한 정보가 불충분한 경우. 이 경우는 유저에게 질문을 해서 추가 정보를 얻어야 해. 
    <user_prompt>
      친구랑 약속
    </user_prompt>
    <subtodos type=‘question’>
      1. 친구와 몇 시에 만나기로 했나요?
      2. 친구랑 어디서 만나기로 했나요?
      3. 친구랑 만나는 곳은 여기서 얼마나 떨어져 있나요?
    </subtodos>
  </example>

  <example>
    3. 투두와 관련된 프롬프트가 아닌 경우. 이 경우는 별도로 하위 투두를 나눠주지 않아. 
    <user_prompt>
      파이썬 스크립트를 만들어줘
    </user_prompt>
    <subtodos type=‘invalid’>
      적합한 투두 형식이 아닙니다. 하위 투두로 나눌 수 없습니다.
    </subtodos>
  </example>
</examples>

 

쓰다보니 3번(입력값, 출력값의 형태에 대해서 정보 제공하기)과 4번(LLM이 자신의 사고과정을 직접 표현하도록 하기) 부분은 반영되지 않은 것 같았다. 그리고 예시의 개수가 너무 부족한 것 같았다. 

 

일단은 이 프롬프트를 기준으로 프롬프트를 발전시켜가야 할 것 같다. 우선은 멘토님이 Claude와 달리 GPT는 XML보다 JSON 형식의 입력을 더 잘 인식한다고 하셔서, 그리고 대부분의 응답은 JSON으로 처리하는 게 편하므로 응답의 형태부터 바꿔주자. 

[
   {
      "caseNumber":1,
      "caseDescription":"투두를 하위 투두들로 나누는 데 필요한 정보가 충분한 경우",
      "caseInstruction":"바로 해당 투두를 하위 투두로 나눠준다",
      "userPrompts":[
         {
            "type":"user",
            "content":"아스랑 저녁 8시에 만나서 집들이하기"
         }
      ],
      "subtodos":{
         "type":"answer",
         "content":[
            {
               "subtodoNumber":1,
               "subtodoContent":"아스한테 오늘 약속이 맞는지 확인하기"
            },
            {
               "subtodoNumber":2,
               "subtodoContent":"저녁 7시에 아스네 집으로 출발하기"
            },
            {
               "subtodoNumber":3,
               "subtodoContent":"집들이 선물 사 가기"
            }
         ]
      }
   }
]

 

이런 식으로 응답을 제시하면 될 것 같다.

 

+ Recent posts