•
언어 모델에 대한 프롬프트는 사용자가 제공하는 지침이나 입력의 집합이다.
•
모델의 응답을 안내하고 문맥을 이해하며 질문에 답하거나 문장을 완성하거나 대화를 나누는 등 관련성 있고 일관된 언어 기반 출력을 생성하는 데 도움을 주는 역할을 한다.
•
하지만 일반적으로 사용자들이 일반적인 질문을 하게 되면 원하는 결과가 나오지 않는 경우가 많이 나온다.
그래서 prompt engineering이라는 것이 필요하게 된다.
Prompt Engineering
•
프롬프트 엔지니어링의 주요 목표는 사용자의 의도와 원하는 결과를 전달하는 프롬프트를 만들어 모델의 성능, 정확성, 유용성을 극대화하는 것이다.
•
프롬프트 엔지니어링이 필요한 이유는 현재 LLM의 동작 방식의 한계와 인간과 컴퓨터의 상호 작용을 위해 자연어를 사용하고 있기 때문이다.
•
프롬프트는 일반적으로 여러 부분으로 구성된다.
◦
좋은 프롬프트는 일반적으로 두 개 이상의 구성 요소를 사용한다.
프롬프트 작성방법
1.
명확성과 구체성
•
모호한 질문은 LLM 모델의 혼란을 초래할 수 있기 때문에 질문은 명확하고 구체적이어야 함.
•
예시: "다음 주 주식 시장에 영향을 줄 수 있는 예정된 이벤트들은 무엇일까요?"는 "주식 시장에 대해 알려주세요."보다 더 구체적이고 명확한 질문이다.
2.
배경 정보를 포함
•
모델이 문맥을 이해할 수 있도록 필요한 배경 정보를 제공하는 것이 좋다. 이는 환각 현상(hallucination)이 발생할 위험을 낮추고, 관련성 높은 응답을 생성하는 데 도움을 준다.
•
예시: "2020년 미국 대선의 결과를 바탕으로 현재 정치 상황에 대한 분석을 해주세요."
3.
간결함
•
핵심 정보에 초점을 맞추고, 불필요한 정보는 배제한다.
•
프롬프트가 길어지면 모델이 덜 중요한 부분에 집중하거나 상당한 영향을 받는 문제가 발생할 수 있다.
•
예시: "2021년에 발표된 삼성전자의 ESG 보고서를 요약해주세요."
4.
열린 질문 사용
•
열린 질문을 통해 모델이 자세하고 풍부한 답변을 제공하도록 유도한다.
•
단순한 '예' 또는 '아니오'로 대답할 수 있는 질문보다는 더 많은 정보를 제공하는 질문이 좋다.
•
예시: "신재생에너지에 대한 최신 연구 동향은 무엇인가요?"
5.
명확한 목표 설정
•
얻고자 하는 정보나 결과의 유형을 정확하게 정의한다. 이는 모델이 명확한 지침에 따라 응답을 생성하도록 돕는다.
•
예시: "AI 윤리에 대한 문제점과 해결 방안을 요약하여 설명해주세요."
6.
언어와 문체
•
대화의 맥락에 적합한 언어와 문체를 선택한다.
•
이는 모델이 상황에 맞는 표현을 선택하는데 도움이 된다.
•
예시: 공식적인 보고서를 요청하는 경우, "XX 보고서에 대한 전문적인 요약을 부탁드립니다."와 같이 정중한 문체를 사용합니다.
•
PromptTemplate은 단일 문장 또는 간단한 명령을 입력하여 단일 문장 또는 간단한 응답을 생성하는 데 사용되는 프롬프트를 구성할 수 있는 문자열 템플릿이다.
•
Python의 문자열 포맷팅을 사용하여 동적으로 특정한 위치에 입력 값을 포함시킬 수 있다.
프롬프트 템플릿 결합
•
PromptTemplate 클래스는 문자열을 기반으로 프롬프트 템플릿을 생성하고, + 연산자를 사용하여 직접 결합하는 동작을 지원한다.
•
PromptTemplate 인스턴스 간의 직접적인 결합뿐만 아니라, 이들 인스턴스와 문자열로 이루어진 템플릿을 결합하여 새로운 PromptTemplate 인스턴스를 생성하는 것도 가능하다.
◦
문자열 + 문자열
◦
PromptTemplate + PromptTemplate
◦
PromptTemplate + 문자열
# 문자열 템플릿 결합 (PromptTemplate + PromptTemplate + 문자열)
combined_prompt = (
prompt_template
+ PromptTemplate.from_template("\n\n아버지를 아버지라 부를 수 없습니다.")
+ "\n\n{language}로 번역해주세요."
)
> combined_prompt
PromptTemplate(input_variables=['age', 'language', 'name'], input_types={}, partial_variables={}, template='안녕하세요, 제 이름은 {name}이고, 나이는 {age}살입니다.\n\n아버지를 아버지라 부를 수 없습니다.\n\n{language}로 번역해주세요.')
Python
복사
◦
format 메소드를 사용하여 앞에서 생성한 템플릿의 매개변수에 입력 값을 지정
◦
LLM에게 전달할 프롬프트가 완성되는데, 주어진 문장을 "영어로 번역해주세요." 라는 지시사항을 포함하고 있다.
> print(combined_prompt.format(name="홍길동", age=30, language="영어"))
안녕하세요, 제 이름은 홍길동이고, 나이는 30살입니다.
아버지를 아버지라 부를 수 없습니다.
영어로 번역해주세요.
Python
복사
> combined_prompt.invoke({"name":"홍길동", "age":30, "language":"영어"})
StringPromptValue(text='안녕하세요, 제 이름은 홍길동이고, 나이는 30살입니다.\n\n아버지를 아버지라 부를 수 없습니다.\n\n영어로 번역해주세요.')
Python
복사
•
ChatPromptTemplate은 대화형 상황에서 여러 메시지 입력을 기반으로 단일 메시지 응답을 생성하는 데 사용
•
이는 대화형 모델이나 챗봇 개발에 주로 사용
•
입력은 여러 메시지를 원소로 갖는 리스트로 구성되며, 각 메시지는 역할(role)과 내용(content)으로 구성
•
SystemMessage: 시스템의 기능을 설명합니다.
from langchain_core.messages import HumanMessage, SystemMessage
messages = [
SystemMessage(
content="You are a helpful assistant! Your name is Bob."
)
]
chat_prompt = ChatPromptTemplate.from_messages(
messages
)
> chat_prompt
ChatPromptTemplate(input_variables=[], input_types={}, partial_variables={}, messages=[SystemMessage(content='You are a helpful assistant! Your name is Bob.', additional_kwargs={}, response_metadata={})])
Python
복사
> chat_prompt.messages
[SystemMessage(content='You are a helpful assistant! Your name is Bob.', additional_kwargs={}, response_metadata={})]
> chat_prompt.messages[0].content
You are a helpful assistant! Your name is Bob.
Python
복사
•
HumanMessage: 사용자의 질문을 나타낸다.
from langchain_core.messages import SystemMessage
from langchain_core.prompts import HumanMessagePromptTemplate
chat_template = ChatPromptTemplate.from_messages(
[
SystemMessage(
content=(
"이 시스템은 천문학 질문에 답변할 수 있습니다."
)
),
HumanMessagePromptTemplate.from_template("{user_input}"),
]
)
> chat_template
ChatPromptTemplate(input_variables=['user_input'], input_types={}, partial_variables={}, messages=[SystemMessage(content='이 시스템은 천문학 질문에 답변할 수 있습니다.', additional_kwargs={}, response_metadata={}), HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['user_input'], input_types={}, partial_variables={}, template='{user_input}'), additional_kwargs={})])
> chat_template.messages[0].content
이 시스템은 천문학 질문에 답변할 수 있습니다.
> chat_template.invoke({"user_input": "태양계에서 가장 큰 행성은 무엇인가요?"})
ChatPromptValue(messages=[SystemMessage(content='이 시스템은 천문학 질문에 답변할 수 있습니다.', additional_kwargs={}, response_metadata={}), HumanMessage(content='태양계에서 가장 큰 행성은 무엇인가요?', additional_kwargs={}, response_metadata={})])
Python
복사
튜플 형태의 메시지 리스트
•
ChatPromptTemplate.from_messages 메서드를 사용하여 메시지 리스트로부터 ChatPromptTemplate 인스턴스를 생성하는 방식은 대화형 프롬프트를 생성하는 데 유용하다.
•
이 메서드는 2-튜플 형태의 메시지 리스트를 입력 받아, 각 메시지의 역할(type)과 내용(content)을 기반으로 프롬프트를 구성한다.
•
다음 예시에서 ChatPromptTemplate.from_messages 메서드는 전달된 메시지들을 기반으로 프롬프트를 구성
•
그리고 format_messages 메서드는 사용자의 입력을 프롬프트에 동적으로 삽입하여, 최종적으로 대화형 상황을 반영한 메시지 리스트를 생성한다.
•
시스템은 자신의 기능을 설명하고, 사용자는 천문학 관련 질문을 한다.
from langchain_core.prompts import ChatPromptTemplate
> chat_prompt = ChatPromptTemplate.from_messages([
> ("system", "이 시스템은 천문학 질문에 답변할 수 있습니다."),
> ("human", "{user_input}"),
> ])
ChatPromptValue(messages=[SystemMessage(content='이 시스템은 천문학 질문에 답변할 수 있습니다.', additional_kwargs={}, response_metadata={}), HumanMessage(content='태양계에서 가장 큰 행성은 무엇인가요?', additional_kwargs={}, response_metadata={})])
Python
복사