RAG

[RAG] Llama 3.1 프롬프트 형식

moonzoo 2024. 9. 9. 17:29

0. 프롬프트란?

프롬프트는 사용자가 모델에 원하는 답을 이끌어내기 위해 작성하는 질문이나 명령문입니다.

프롬프트를 어떻게 작성하느냐에 따라 LLM이 생성하는 답변이 달라지고, 정확도 역시 크게 차이납니다.


1. Base RAG Prompt

기본적으로 RAG 프로세스에 사용하는 프롬프트는 다음과 같습니다. 이를 통해 ChatGPT, Claude, Llama 등 다양한 LLM을 사용해 Question을 통해 Context를 검색하고 Context 내에서 Answer를 생성하는 RAG 프로세스로 유도할 수 있습니다.

 

rlm/rag-prompt

You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.
Question: {question} 
Context: {context} 
Answer:

 


2. Llama 3.1 Prompt Format

https://llama.meta.com/docs/model-cards-and-prompt-formats/llama3_1/

 

Llama 3.1 | Model Cards and Prompt formats

Llama 3.1 - the most capable open model.

llama.meta.com

 

그러나, 각 Model에 따라 프롬프트를 작성하는 형식에 차이가 있습니다. 그 이유는 특수 토큰 때문입니다.

Llama 3.1 특수 토큰을 사용하여 프롬프트를 작성하면 모델이 대화의 시작, 끝, 헤더 등을 명확히 구분할 수 있어, 모델이 맥락을 더 잘 이해하고 적절한 응답을 생성할 수 있습니다. 

다른 LLM과 특수 토큰이 다른 이유는 Llama 3.1은 모델의 목적에 맞춘 최적화, 토큰화 방식의 차이 때문입니다.

 

 

이러한 이유로 Llama  3.1은 이전 버전과 호환되지만, 최상의 결과를 얻기 위해 새로운 형식을 사용하는 것을 권장하고 있습니다.

주요 토큰

  • <|begin_of_text|>: 프롬프트의 시작을 나타냄
  • <|end_of_text|>: 모델의 생성 중단을 나타냄
  • <|start_header_id|>, <|end_header_id|>: 헤더의 시작과 끝
  • <|eom_id|>: 내장 도구 호출 시 사용
  • <|eot_id|>: 턴의 끝을 나타냄
  • <|python_tag|>: 도구 호출을 나타내는 특수 태그

지원되는 역할

  1. system: 모델과의 상호작용 맥락 설정
  2. user: 인간 사용자의 입력 표현
  3. ipython: 도구 출력을 모델에 전달하는 새로운 역할
  4. assistant: AI 모델의 응답 표현

프롬프트 작성 가이드라인

  1. 기본 대화 형식: 사용자와 어시스턴트 간의 간단한 대화에 적합
  2. 내장 도구 사용: 'brave_search', 'wolfram_alpha', 'code interpreter' 등의 도구를 system 프롬프트에서 활성화 가능
  3. 사용자 정의 도구: JSON 형식으로 새로운 도구를 정의하고 호출 가능
  4. 복수 도구 정의: 시스템 또는 사용자 프롬프트에서 여러 도구를 정의할 수 있으며, 모델은 이에 따라 다중 도구 호출 생성 가능

주요 특징

  • 환경 설정: 'Environment: ipython' 지시를 시스템 프롬프트에 포함시켜 특정 기능 활성화
  • 도구 호출 형식: Python 또는 JSON 형식으로 도구 호출 가능
  • 사용자 정의 형식: 시스템 및 사용자 프롬프트에서 새로운 도구 정의 및 호출 형식 지정 가능

해당 가이드라인을 참고하여 Base RAG-Prompt를 수정한 Llama의 프롬프트는 다음과 같습니다.

 

Llama Prompt

<|begin_of_text|><|start_header_id|>system<|end_header_id|> You are an assistant for question - answering tasks. Please answer in Korean. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise. Let's think step-by-step.<|eot_id|><|start_header_id|>user<|end_header_id|>
Question: {question} 
Context: {context} 
Answer: <|eot_id|><|start_header_id|>assistant<|end_header_id|>

 

이를 통해 Llama3.1 모델 invoke 시 Base RAG Prompt와 Llama Prompt를 비교해보면 Llama Prompt를 사용하여 생성한 답변이 반복 생성, 생성 종료 시점 등을 확실히 잘 잡아내 적절한 답변을 생성하는 것을 확인할 수 있습니다.


3. 결론

LLM을 사용할 때 성능을 개선할 수 있는 가장 빠르고 정확한 수단은 Prompt입니다.

그렇기 때문에 사용하려고 하는 LLM의 모델의 특성(주요 토큰)을 잘 파악하고 Prompt를 작성한다면 빠르게 성능 개선을 이뤄낼 수 있습니다.

 

그러나, Prompt로 커버가 되지 않는 부분은 RAG를 사용해보고, RAG로도 커버가 되지 않는 부분은 Finetuning을 진행하거나 추가적인 기능을 도입하여 성능을 개선하는 등 다양한 방법을 시도해보는 것이 좋습니다.