여러분은 LLM과 티키타카 수다 많이 떨고 계시나요? 음성으로 얘기할 수도 있지만, 주로 메시지를 주고받는 형태로 쓰는 분들이 많으실텐데요. 그런데 이 메시지에도 3가지 구조가 숨어 있습니다.
웹이나 앱에서만 쓸 때에는 숨겨져 있는, system message. 그리고 사용자가 입력하는 user message, 모델이 응답하는 assistant message. 이렇게 3가지 종류로 구분할 수 있습니다. 이번 레터에서는 이 메시지 종류들과 이를 어떻게 활용할 수 있는지를 살펴보았습니다.
일반적인 채팅 화면에서는 보이지 않지만, 프롬프트를 테스트할 수 있는 플레이그라운드에 들어가면 이렇게 시스템 메시지라는 별도의 입력란을 볼 수 있습니다. 그리고 그 밑에는 추가 메시지를 입력할 수도 있게 선택사항으로 남겨놓았는데요. 추가 메시지를 입력한다면 유저 메시지와 어시스턴트 메시지를 구분하여 입력할 수 있습니다.
# 역할과 규칙을 정하는 System message
시스템 메시지는 LLM에게 어떤 일을 시킬 것인지, 모델이 수행해야 할 작업에 대한 전반적인 맥락과 목적을 설정하는 영역입니다. 예를 들어 영화 리뷰를 긍정과 부정으로 분류하는 작업을 한다고 했을 때, 시스템 메시지에 지시문을 작성하고 유저 메시지에 영화 리뷰를 주어 답변을 받을 수 있습니다.
단순한 작업이나 일회성 작업을 할 때에는 굳이 시스템 메시지를 쓸 필요가 없지만, API나 자동화된 워크플로우 안에서 LLM을 반복적으로 사용할 때에는 시스템 메시지를 분리하는 것이 좋습니다. 시스템 메시지에서 역할과 규칙을 고정시켜놓고, 유저 메시지로 입력값만 계속 바꿔주는 변수처럼 사용하는 것입니다.
# 히스토리를 주는 Additional messages
말 그대로 추가 메시지입니다. 추가 메시지를 쓸 때는 모델에게 본격적인 질문을 하기 전에, “우리는 지금까지 이런 얘기를 해왔어. 그러니까 이 대화의 연장선에서 대답해줘”라고 암시를 주고 싶을 때 사용합니다. 이전의 대화를 “유저: ~~, 어시스턴트: ~~”로 넣어주면 모델이 이전 대화의 자신의 답변을 참고해서 답변할 수 있게 하는 것입니다.
추가 메시지로 어시스턴트 메시지를 넣을 때에는 실제 모델의 답변을 넣을 수도 있고, 내가 모델에게 바라는 이상적인 답변을 직접 만들어 넣을 수도 있습니다. 그러면 모델은 이 추가 메시지를 보고 “내가 이렇게 대답했구나”라고 자신의 이전 답변으로 인식하고 일관성을 위해 그 뒤에도 동일한 스타일을 유지하여 답변하려고 합니다.
아래 예시처럼 모델에게 추가 메시지로 교토 여행에 관련한 대화를 주고 질문을 하면 자연스럽게 이어서 대답하는 모습을 볼 수 있습니다.
추가 메시지는 전략적으로 사용될 수 있습니다. 모델에게 “너 이전 대화에서 이렇게 답했잖아!”라고 히스토리를 주는 용도로 쓸 수 있기 때문입니다. 특히 API로 LLM을 호출하여 사용하는 경우에는 이전 대화 내용을 넣어주지 않으면 모델이 ‘기억’ 하지 못하므로 이렇게 어시스턴트 메시지를 넘겨줘야 연속적인 대화를 만들 수 있습니다.
# 기사 제목만 주고 뉴스 분류하도록 하기
시스템 메시지와 추가 메시지를 활용해 원하는 형식으로 답변을 받고, 구조화하는 예시를 만들어보았습니다. 저는 인공지능 뉴스레터를 만들고 있으니, 기사 제목만 넣어주면 제목, 키워드, 분류까지 한번에 출력하도록 만들어보았습니다.
시스템 프롬프트로 지시문과 출력 포맷을 넣어주고, 추가 메시지로 예시를 하나 넣어줬습니다. 유저 메시지에 기사 제목을 하나 넣었고, 어시스턴트 메시지로 원하는 답변을 적어준 것이죠. 그리고 이 다음부터는 기사 제목만 넣어주면 형식을 잘 지켜서 출력하는 모습을 볼 수 있었습니다. (더 나아가 API 호출로 이 과정을 시스템화할 수도 있겠죠!)
이런 방식으로 데이터를 추가 생성하거나 분류할 때 시스템 메시지와 추가 메시지를 활용해보세요. 특히 형식을 정확히 유지하는 것이 중요할 때에는 어시스턴트 메시지가 잘 먹힌다는 점을 꼭 기억해주세요!