[LLM] 프롬프트(Prompt) 템플릿에 대한 이해

안녕하세요 오늘은 BESPIN GLOBAL SRE실 노예원님이 작성해주신 ‘[LLM] 프롬프트(Prompt) 템플릿에 대한 이해’ 대해 소개해드리도록 하겠습니다.

목차

  1. 프롬프트 작성 원칙
  2. 프롬프트 템플릿 (PromptTemplate)
  3. 챗 프롬프트 템플릿 (ChatPromptTemplate)

1. 프롬프트 작성 원칙

  • 프롬프트(Prompt): 프롬프트는 사용자의 언어 모델 간의 대화에서 질문이나 요청의 형태로 제시되는 입력문. 모델이 어떤 유형의 응답을 제공할지 결정하는 데 중요한 역할

모델이 최대한 정확하고 유용한 정보를 제공할 수 있도록 효과적인 프롬프트를 작성하는 것이 매우 중요합니다. 좋은 프롬프트를 만들기 위해서 다음과 같은 원칙을 고려합니다.

1-1. 명확성과 구체성

  • 질문은 명확하고 구체적이어야 합니다. 모호한 질문은 LLM 모델의 혼란을 초래할 수 있기 때문입니다.
  • 예시: “다음 주 주식 시장에 영향을 줄 수 있는 예정된 이벤트들은 무엇일까요?”는 “주식 시장에 대해 알려주세요.”보다 더 구체적이고 명확한 질문입니다.

1-2. 배경 정보를 포함

  • 모델이 문맥을 이해할 수 있도록 필요한 배경 정보를 제공하는 것이 좋습니다. 이는 환각 현상(hallucination)이 발생할 위험을 낮추고, 관련성 높은 응답을 생성하는 데 도움을 줍니다.
  • 예시: “2020년 미국 대선의 결과를 바탕으로 현재 정치 상황에 대한 분석을 해주세요.”

1-3. 간결함

  • 핵심 정보에 초점을 맞추고, 불필요한 정보는 배제합니다. 프롬프트가 길어지면 모델이 덜 중요한 부분에 집중하거나 상당한 영향을 받는 문제가 발생할 수 있습니다.
  • 예시: “2021년에 발표된 삼성전자의 ESG 보고서를 요약해주세요.”

1-4. 열린 질문 사용

  • 열린 질문을 통해 모델이 자세하고 풍부한 답변을 제공하도록 유도합니다. 단순한 ‘예’ 또는 ‘아니오’로 대답할 수 있는 질문보다는 더 많은 정보를 제공하는 질문이 좋습니다.
  • 예시: “신재생에너지에 대한 최신 연구 동향은 무엇인가요?”

1-5. 명확한 목표 설정

  • 얻고자 하는 정보나 결과의 유형을 정확하게 정의합니다. 이는 모델이 명확한 지침에 따라 응답을 생성하도록 돕습니다.
  • 예시: “AI 윤리에 대한 문제점과 해결 방안을 요약하여 설명해주세요.”

1-6. 언어와 문체

  • 대화의 맥락에 적합한 언어와 문체를 선택합니다. 이는 모델이 상황에 맞는 표현을 선택하는데 도움이 됩니다.
  • 예시: 공식적인 보고서를 요청하는 경우, “XX 보고서에 대한 전문적인 요약을 부탁드립니다.”와 같이 정중한 문체를 사용합니다.

2. 프롬프트 템플릿 (PromptTemplate)

PromptTemplate은 단일 문장 또는 간단한 명령을 입력하여 단일 문장 또는 간단한 응답을 생성하는 데 사용되는 프롬프트를 구성할 수 있는 문자열 템플릿입니다. Python의 문자열 포맷팅을 사용하여 동적으로 특정한 위치에 입력 값을 포함시킬 수 있습니다.

2-1. 문자열 템플릿

  • PromptTemplate + LLMs (단일 문장 입력 -> 단일 문장 출력)
  • 문자열 프롬프트를 위한 템플릿을 생성. Python 의 문자열 포맷팅 구문을 사용.
  • 내용: 지시사항, 몇 가지 예시, 특정 맥락 및 질문 등

문자열 템플릿

2-2. 프롬프트 템플릿 간의 결합

PromptTemplate 클래스는 문자열을 기반으로 프롬프트 템플릿을 생성하고, + 연산자를 사용하여 직접 결합하는 동작을 지원합니다. PromptTemplate 인스턴스 간의 직접적인 결합뿐만 아니라, 이들 인스턴스와 문자열로 이루어진 템플릿을 결합하여 새로운 PromptTemplate 인스턴스를 생성하는 것도 가능합니다.

  • 문자열 + 문자열
  • PromptTemplate + PromptTemplate
  • PromptTemplate + 문자열

 PromptTemplate + 문자열

format 메소드를 사용하여 앞에서 생성한 템플릿의 매개변수에 입력 값을 지정합니다. LLM에게 전달할 프롬프트가 완성되는데, 주어진 문장을 “영어로 번역해주세요.” 라는 지시사항을 포함하고 있습니다.

format 메소드를 사용하여 앞에서 생성한 템플릿의 매개변수에 입력 값을 지정합니다. LLM에게 전달할 프롬프트가 완성되는데, 주어진 문장을 "영어로 번역해주세요." 라는 지시사항을 포함하고 있습니다.

ChatOpenAI 인스턴스를 생성하여 프롬프트 텍스트를 전달하고, 모델의 출력을 StrOutputParser를 통해 문자열로 변환하는 LLM 체인을 구성합니다. invoke 메소드를 사용하여 파이프라인을 실행하고, 최종적으로 문자열 출력을 얻습니다. 모델의 응답은 프롬프트에 주어진 문장을 영어로 번역한 텍스트가 출력됩니다.

ChatOpenAI 인스턴스를 생성하여 프롬프트 텍스트를 전달하고, 모델의 출력을 StrOutputParser를 통해 문자열로 변환하는 LLM 체인을 구성합니다. invoke 메소드를 사용하여 파이프라인을 실행하고, 최종적으로 문자열 출력을 얻습니다. 모델의 응답은 프롬프트에 주어진 문장을 영어로 번역한 텍스트가 출력됩니다.

3. 챗 프롬프트 템플릿 (ChatPromptTemplate)

ChatPromptTemplate은 대화형 상황에서 여러 메시지 입력을 기반으로 단일 메시지 응답을 생성하는 데 사용됩니다. 이는 대화형 모델이나 챗봇 개발에 주로 사용됩니다. 입력은 여러 메시지를 원소로 갖는 리스트로 구성되며, 각 메시지는 역할(role)과 내용(content)으로 구성됩니다.

3-1. Message 유형

  • SystemMessage: 시스템의 기능을 설명합니다.
  • HumanMessage: 사용자의 질문을 나타냅니다.
  • AIMessage: AI 모델의 응답을 제공합니다.

3-2. 튜플 형태의 메시지 리스트

  • ChatPromptTemplates + ChatModels (여러 메시지 입력 -> 단일 메시지 출력)
  • 채팅 메시지를 원소로 갖는 리스트 형태
  • 구성: 각 채팅 메시지는 역할(role) 과 내용(content) 이 짝을 이루는 형태

다음 실습에서 ChatPromptTemplate.from_messages 메서드는 전달된 메시지들을 기반으로 프롬프트를 구성합니다. 그리고 format_messages 메서드는 사용자의 입력을 프롬프트에 동적으로 삽입하여, 최종적으로 대화형 상황을 반영한 메시지 리스트를 생성합니다. 시스템은 자신의 기능을 설명하고, 사용자는 천문학 관련 질문을 합니다.

튜플 형태의 메시지 리스트

3-3. MessagePromptTemplate 활용

다음 예제는 SystemMessagePromptTemplate와 HumanMessagePromptTemplate를 사용하여 천문학 질문에 답변할 수 있는 시스템에 대한 대화형 프롬프트를 생성합니다. ChatPromptTemplate.from_messages 메소드를 통해 시스템 메시지와 사용자 메시지 템플릿을 포함하는 챗 프롬프트를 구성합니다. 이후, chat_prompt.format_messages 메서드를 사용하여 사용자의 질문을 포함한 메시지 리스트를 동적으로 생성합니다.

3. MessagePromptTemplate 활용

이렇게 생성된 메시지 리스트는 대화형 인터페이스나 언어 모델과의 상호작용을 위한 입력으로 사용될 수 있습니다. 각 메시지는 role (메시지를 말하는 주체, 여기서는 system 또는 user)과 content (메시지의 내용) 속성을 포함합니다. 이 구조는 시스템과 사용자 간의 대화 흐름을 명확하게 표현하며, 언어 모델이 이를 기반으로 적절한 응답을 생성할 수 있도록 돕습니다.

이렇게 생성된 메시지 리스트는 대화형 인터페이스나 언어 모델과의 상호작용을 위한 입력으로 사용될 수 있습니다. 각 메시지는 role (메시지를 말하는 주체, 여기서는 system 또는 user)과 content (메시지의 내용) 속성을 포함합니다. 이 구조는 시스템과 사용자 간의 대화 흐름을 명확하게 표현하며, 언어 모델이 이를 기반으로 적절한 응답을 생성할 수 있도록 돕습니다.

여기까지 ‘[LLM] 프롬프트(Prompt) 템플릿에 대한 이해’에 대해 소개해드렸습니다. 유익한 정보가 되셨길 바랍니다. 감사합니다. 

Written by 노 예원 / SRE실

BESPIN GLOBAL