카테고리 없음

스파르타 AI-8기 TIL(11/24) -> 처음부터 계속하기

kimjunki-8 2024. 11. 24. 21:47
프롬프트 작성 원칙
효과적인 프롬프트를 통해 모델이 최대한 질이 좋고 정확한 정보를 제공할 수 있게 해야합니다. 그러기 위해서는 다음과 같은 원칙들이 존재합니다.
1. 명확성과 구체성
질문은 명확하고 구체적으로. 모호한 질문은 오히려 모델의 계산을 힘들게 할 수 있습니다.
예시:
'2024년 전세계 경제 지표를 통해 2024년 11월 25일에 주식 시장에 대한 설명을 해줘'는 '내일 주식 시장에 대해 설명해줘'보다 더 정확한 값을 불러올 수 있습니다.

2. 배경 정보를 포함
모델이 문맥을 이해하고 정보를 이해할 수 있도록 필요한 기본 바탕이 되는 정보를 줘야합니다. 이는 환각 현상(hallucination)을 방지할 수 있으며, 관련성 높은 응답을 생성하는 데 도움을 줍니다.
예시: "2020년 미국 대선의 결과를 바탕으로 현재 정치 상황에 대한 분석을 해주세요."

 

3. 간결하게
불필요한 정보는 뺴고, 핵심에 중점을 두어 핵심 정보에 모델이 집중할 수 있도록 합니다.
예시: "2021년에 발표된 삼성전자의 ESG 보고서를 요약해주세요."

4. 열린 질문 사용
단답형 혹은 '예', '아니요'로 대답할 수 있는 질문은 피하고, 더 여러가지로 대답할 수 있는 질문이 좋습니다.
예시: "신재생에너지에 대한 최신 연구 동향은 무엇인가요?"

프롬프트 템플릿 (PromptTemplate)
PromptTemplate은 단일 문장 또는 간단한 명령을 입력하여 단일 문장 또는 간단한 응답을 생성하는 데 사용되는 프롬프트를 구성할 수 있는 문자열 템플릿입니다.


LLM 모델에 입력할 프롬프트를 구성할 때 "지시", "예시", "맥락", "질문" 과 같은 다양한 구성요소들을 조합할 수 있습니다. 
1. 지시 - 모델에게 어떠한 작업을 하도록 하는 구체적 지시
2. 예시 - 요청된 작업을 하는 방법, 혹은 추가적 지시에 대한 하나 이상의 예시
3. 맥락 - 특정 작업을 수행하기 위한 추가적인 맥락
4. 질문 -어떤 답변을 요구하는 구체적인 질문.

예시:

1. 지시: '아래 제공된 정보를 바탕으로 현 한국 경제를 요약해주세요'
2. 예시: '예를 들어, IMF, 한국 경제성장률 올해 2.2%, 내년 2.0% 전망 그렇기에..' 혹은 '2025년 우리 경제는 내수 부진이 점차 완화되겠으나, 수출 증가세가 둔화되면서 2024년(2.2%)보다 낮은 2.0% 성장할 전망.'
3. 맥락: '리뷰는 현재 대한민국의 2024년 경제 현황과 2025년의 경기 상태를 예상하는 것에 초점을 맞추고 있습니다.
4. 질문: 이 리뷰를 바탕으로 앞으로의 대한민국의 경제 지표를 2~3줄로 요약해서 설명해주세요.

문자열 템플릿
langchain_core.prompts 모듈의 PromptTemplate 클래스를 사용
예시:
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
import asyncio
template_text = '안녕하세요 저는 {name}이고, 나이는 {age} 입니다'
prompt_template = PromptTemplate.from_template(template_text)
fillted_template = prompt_template.format(name = 'Kevin', age = '22')
print(fillted_template)
출력:
안녕하세요 저는 Kevin이고, 나이는 22 입니다

설명:
1. PromptTemplate.from_template 메서드를 사용하여 문자열 템플릿으로부터 PromptTemplate 인스턴스를 생성합니다. 이때, template_text 변수에 정의된 템플릿 문자열이 사용됩니다.
2. 생성된PromptTemplate인스턴스의format 메서드를 사용하여, 실제 'name'과 'age' 값으로 템플릿에 채워서 프롬프트를 구성합니다. 참고로 {name}과 {age}는 플레이스홀더로 작동합니다. Python의 문자열 포맷팅 방식 중 하나인 .format() 메서드를 사용하면, 이 플레이스홀더에 원하는 값을 넣을 수 있습니다.

3. 최종적으로 안녕하세요 저는 Kevin이고, 나이는 22입니다.라는 문구가 출력됩니다.
참고로 여기서 fillter_template 줄 자체를 주석으로 처리하고 실행해도 정상적으로 작동합니다.
# 문자열 템플릿 결합 (PromptTemplate + PromptTemplate + 문자열)
combined_prompt = (
    prompt_template +
    PromptTemplate.from_template('\n\n인생이란 {word}하다.') +
    '\n\n{language}로 번역 해주세요'
)
combined_prompt.format(name = 'Kevin', age = 22, word = '공허', language = 'English')


위에서 설명하듯 플레이스홀더를 .format으로 값을 넣을 수 있기 때문입니다.

프롬프트 템플릿 간의 결합
PromptTemplate 클래스는 문자열을 기반으로 프롬프트 템플릿을 생성하고, + 연산자를 사용하여 직접 결합하는 동작을 지원합니다. PromptTemplate 인스턴스 간의 직접적인 결합뿐만 아니라, 이들 인스턴스와 문자열로 이루어진 템플릿을 결합하여 새로운 PromptTemplate 인스턴스를 생성하는 것도 가능합니다.
  • 문자열 + 문자열
  • PromptTemplate + PromptTemplate
  • PromptTemplate + 문자열
# 문자열 템플릿 결합 (PromptTemplate + PromptTemplate + 문자열)
combined_prompt = (
    prompt_template +
    PromptTemplate.from_template('\n\n인생이란 {word}하다.') +
    '\n\n{language}로 번역 해주세요'
)
combined_prompt.format(name = 'Kevin', age = 22, word = '공허', language = 'English')

'안녕하세요 저는 Kevin이고, 나이는 22 입니다\n\n인생이란 공허하다.\n\nEnglish로 번역 해주세요'


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

parser = StrOutputParser()
llm = ChatOpenAI(model = 'gpt-4o')
chain = combined_prompt | llm | parser
print(chain.invoke({'name' : 'Kevin', 'age' : 22, 'word' : '공허', 'language' : 'English'}))
출력:
Hello, I am Kevin, and I am 22 years old.

Life is empty.

그렇게 출력을 하면 됩니다.


챗 프롬프트 템플릿 (ChatPromptTemplate)
ChatPromptTemplate은 대화형 상황에서 여러 메시지 입력을 기반으로 단일 메시지 응답을 생성하는 데 사용됩니다. 이는 대화형 모델이나 챗봇 개발에 주로 사용됩니다. 
Message 유형
  1. SystemMessage: 시스템의 기능을 설명합니다.
  2. HumanMessage: 사용자의 질문을 나타냅니다.
  3. AIMessage: AI 모델의 응답을 제공합니다.
  4. FunctionMessage: 특정 함수 호출의 결과를 나타냅니다.
  5. ToolMessage: 도구 호출의 결과를 나타냅니다.

여기까지..