Life and Tech Talk

생성형 AI를 다루는 기술 2. LLM의 원리와 프롬프트 엔지니어링

생성형 AI라는 메기가 나타났다. 이를 잘 다루지 못하면 도태될 것이고, 이를 잘 다루면 더욱 숙련된 전문가가 되는 것이다. 그렇다면 생성형 AI라는 메기를 다루는 기술은 어떤 것들이 있을까? 프롬프트 엔지니어링, 랭체인(Langchain), 라마인덱스(LlamaIndex), 파인튜닝 등 새로운 용어와 기술들이 계속해서 등장하고 있다.

 

일단 LLM의 원리를 이해하고 이를 잘 다루는 기술들을 살펴보자.

 

LLM의 원리와 프롬프트에 대한 이해


LLM(Large Language Model)의 원리는 한마디로 말하면 Next token prediction이다. 쉽게 설명하면 다음 단어를 잘 예측하도록 학습되어진 모델이다. 


  • 'token': 컴퓨터가 이해하는 단어라고 생각하면 된다. chatGPT는 사람에게는 1개의 단어로 보이지만 컴퓨터는 3개의 단어(chat, G, PT)로 인식한다.
  • 토큰 수 계산기 가기


The sky is   


보통은 위 문장이 나오면 아래와 같은 단어를 생각한다.

 

The sky is blue  


그런데 The students opened their …. 라는 문장이 나오면 약간 복잡해 진다.


 

 

the students opened their 다음에 오는 단에 대해 확률적으로 높은 가능성을 가진 단어 중에 선택하는 형태가 될 것이다. 이런 상황에서 다음 단어를 잘 맞춘다는 것은 1. 문법을 이해하고, 2. 세상의 다양한 분야에 대해 이해를 하고 있으며. 3. 상황(Context)에 대한 이해를 하고 있어야 한다.

 

LLM은 일단 세상의 많은 글들이 사전에 학습 되어 있어서, 1번과 2번 조건은 충족되어 있다고 보아야 할 것 같다. 3번에 대해서는 사용자가 입력하는 프롬프트로 상황을 파악해서 답변하는 원리이다.


프롬프트는 chatGPT같은 어플리케이션에서 답변을 잘 할 수 있도록 상황(Context)과 실제 궁금한 내용을 구분하지 않고 질문을 던지는 형태이나, LLM을 활용한 어플리케이션을 개발할 때는 이런 상황 설명을 구분해서 처리하게 된다. 즉, LLM과의 연결 시 사용되는 파라미터 중 메시지와 관련해서는 role과 content로 구성되는데 사용자가 입력하는 프롬프트는 system_prompt와 user_prompt로 나누어 처리하게 되어 있다.


"messages": [ 
 {"role": "system", "content": system_prompt}, 
 {"role": "user", "content": user_prompt} 
]

  

User_prompt는 사용자가 질문을 하거나 지시하는 내용이고, System_prompt는 LLM 입장에서 사전에 인지하고 있어야 할 상황(Context)이다. 즉, 프롬프트에서 위 3번 조건을 충족하게 되는 것이다.


더불어, GPT 파라미터 중에 top_k, top_p 등이 있는데, top_k는 확률적으로 높은 top_k개의 단어들을 선정하는 것이고, top_p는 확률적으로 상위 top_p에 해당하는 단어들이 후보로 선택된다.

즉, top_k=5 & top_p=0.7 이면 확률이 높은 상위 5개의 단어 중에서 누적 확률이 70%에 도달할 때까지의 단어들만 후보로 선택된다. (* 추가 참고)

 

프롬프트 엔지니어링을 잘하는 방법


그렇다면 좋은 프롬프트를 만드는 방법이란 무엇일까? LLM 입장에서 상황 파악이 잘 될 수 있도록 하는 것이 그 원리인데, 크게 3가지 정도로 볼 수있다.

 

1.  역할 부여

LLM의 작동방식을 너무 장황하게 설명하지 않는 방법으로 역할을 지정하는 것은 매우 중요하다.


예) “넌 지금부터 ㅇㅇ분야에서 아주 뛰어난 전문가야. 다음 묻는 말에 전문가로서 답해줘”

 

2.  간결하고 명확하게 지시

프롬프트 엔지니어링의 기법은 다양하게 있으나 우선 기억해야 할 것은 다음과 같다.


원하는 내용을 간결하고 명확하게 지시하되 답변 형식, 길이, 예시를 주면 좋다.


1)  답변 형식

  • 템플릿(Template)를 주거나 표 형태로 요청하거나, JSON 포맷 등 니즈에 따라서 답변 형식을 요청한다. LLM의 답변을 데이터화 처리를 하고자 하는 개발자는 JSON 포맷으로 요청한다.


2)  답변 길이

  • 답변 길이는 비용과 연계되니 적절하게 지정해 주는 것이 좋다.


3)  예시

  • LLM은 주어진 예시를 잘 따른다. 1개의 예를 주는 one shot prompting, 여러 개를 주는 few shot prompting, 질문/답변의 예(Q&A set)를 보여주는 방법 등을 사용하자.

 

3.  기타 옵션

1)  언어

  • LLM과 우리말로 대화하는 것이 좋을까? 영어로 대화하는 것이 좋을까? LLM은 영어로 된 데이터를 더 많이 학습했기 때문에 영어로 물어볼 때 더 답변을 잘한다고 보는 것이 맞을 것 같다. 다만 사용자가 우리말에 더 익숙하고 성능의 차이가 크지 않기 때문에 우리말로 프롬프트를 해도 무방하다.
  • 만약 프롬프트를 활용해서 사업 용으로 계속 쓰는 경우라면 영어로 사용하는 것이 좋겠다. 미세하나마 성능의 차이가 있고, 토큰 당 과금을 고려하면, 우리 말의 토큰이 영어로 된 토큰 보다 약 2배 정도 크기 되기 때문에 비용 측면에서도 영어로 하는 것이 더 좋을 것 같다.


2)  문체/어투

  • LLM을 활용한 어플리케이션의 성격에 따라 다양한 문체/어투를 예로 보여주면 그에 맞는 문체/어투로 답변해 준다.


프로그래밍 개발 시에는 보통 system_prompt에 위와 같은 요소들을 고려해서 입력해 놓는다.


다음 편에서는 프롬프트 엔지니어링의 기법과 이를 다루는 기술에 대해 설명하고자 한다.

올린날: 2024년 4월 11일

* 올린이: 마이클

* VIEW: 179       2           위키홈     게시판     수정