Search

Prompt

대분류
인공지능/데이터
프레임워크
소분류
LangChain/RAG
유형
LangChain
부유형
Introduction LangChain
최종 편집 일시
2024/10/29 05:24
생성 일시
2024/10/28 05:27
14 more properties

Prompt

언어 모델에 대한 프롬프트는 사용자가 제공하는 지침이나 입력의 집합이다.
모델의 응답을 안내하고 문맥을 이해하며 질문에 답하거나 문장을 완성하거나 대화를 나누는 등 관련성 있고 일관된 언어 기반 출력을 생성하는 데 도움을 주는 역할을 한다.
하지만 일반적으로 사용자들이 일반적인 질문을 하게 되면 원하는 결과가 나오지 않는 경우가 많이 나온다.
그래서 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

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
복사