김수진 강사님
프롬프트 엔지니어링 구현
프롬프트 엔지니어링 개요
프롬프트의 품질
- 프롬프트의 구체성과 명확성은 모델 성능에 큰 영향을 미친다.
- 잘 설계된 프롬프트는 관련 있고 정확한 응답을 생성하도록 돕는다.
프롬프트 설계의 중요성
- 모델의 성능은 주어진 프롬프트에 의해 결정된다.
- 모델의 편향을 완화하고 공정성을 유지하기 위해 적절한 프롬프트를 설계해야 한다.
프롬프트의 구성 요소
- 기본 콘텐츠: 작업의 주제를 나타내는 주요 정보.
- 지원 콘텐츠: 추가적이지만 핵심이 아닌 정보.
- 그라운딩 콘텐츠: 모델의 신뢰성을 높이는 정보.
기술 활용
- 명확한 지침 제공: 세부 정보를 포함한 프롬프트로 원하는 결과를 유도.
- 컨텍스트 제공: 작업 요구 사항과 구조를 명확히 전달.
- 출력 구조 지정: 응답을 이메일, SQL 쿼리 등 특정 형식으로 요청.
- 퓨샷 러닝: 몇 가지 예제를 포함해 모델이 패턴을 학습하도록 유도.
- 생각의 사슬: 모델이 단계별로 사고를 표현하도록 유도.
매개변수 조정
- Temperature와 Top-p를 조정하여 응답의 창의성과 일관성을 제어.
모델 매개변수 조정
주요 매개변수
- Temperature: 모델 응답의 임의성(randomness) 을 제어한다.
- 값 범위: 0.0 ~ 1.0
- 낮은 값
- 응답이 더 일관되고 예측 가능하게 된다.
- 논리적이고 객관적인 작업에 적합.
- 높은 값
- 응답이 더 창의적이고 다양하다.
- 창의적인 작업에 적합.
- Top-p (Top Probability): 모델이 단어를 선택할 때, 확률 분포의 상위 일부만 고려하도록 제한한다.
- 값 범위: 0.0 ~ 1.0
- 낮은 값
- 상위 몇 개의 단어만 선택한다.
- 더 제한적이고 일관된 응답을 생성.
- 높은 값
- 더 많은 단어를 고려하여 응답이 다양해질 수 있다.
- 창의적인 작업에 유용.
매개 변수 조정 원칙
- 한 번에 하나만 변경: Temperature와 Top-p는 상호작용하기 때문에 동시에 변경하지 말고 하나씩 변경해 결과를 확인한다.
- 사용 사례에 따라 조정: 창의적인 작업과 일관성이 필요한 작업 간 요구사항에 따라 값을 조정한다.
- 초기 테스트 후 최적값 설정: 다양한 값을 시도하며 가장 적합한 설정을 찾는다.
효과적인 프롬프트 작성
명확한 지침 제공
- 구체적으로 작성: 프롬프트는 명확하고 세부적인 지침을 포함해야 한다.
- 의도 전달: 모델이 의도를 오해하지 않도록 분명히 작성.
- 정보 강조: 가장 중요한 정보를 마지막에 배치하거나 반복하여 모델이 주목하도록 유도.
출력 구조 지정
- 모델이 특정 형식으로 응답하도록 출력 형식을 정의.
- 이메일, 보고서, 또는 코드 등의 형식 지시를 포함하면 정확한 출력 가능성이 높아진다.
명령 분할
- 복잡한 작업을 단일 프롬프트에 포함하는 대신 여러 단계로 나눈다.
컨텍스트 제공
- 프롬프트에 관련 정보를 포함하면 모델의 이해도를 높일 수 있다.
- 문맥 정보를 충분히 제공하면 더 정확하고 구체적인 응답을 얻을 수 있다.
퓨샷 러닝(Few Shot Learning)
- 모델이 수행해야 할 작업의 예제를 프롬프트에 포함하여 학습시킨다.
프롬프트 지침
프롬프트 지침의 구성요소
- 명확성 강조
- 구체적이고 명확한 문구 사용: 추상적이거나 모호한 표현을 피한다.
- 정보 배치
- 프롬프트의 끝부분에 중요한 정보를 배치: 최신 정보가 응답에 더 많은 영향을 미친다.
- 모델은 프롬프트의 맨 끝 부분을 더 강하게 반영하므로, 핵심 지침은 마지막에 반복하거나 명확히 적는다.
- 중요 정보 반복
- 지침을 명확히 하기 위해 반복적 표현 사용: 중요한 내용을 두 번 이상 언급하여 모델이 이를 간과하지 않도록 한다.
대화형 프롬프트 설계
- 회신 편향 관리
- 대화형 프롬프트에서는 사용자의 최근 메시지가 응답에 더 큰 영향을 미친다.
- 따라서 중요한 대화 주제를 마지막 메시지에 포함시켜야 한다.
- 적절한 대화 컨텍스트 제공
- 프롬프트가 이전 대화 내용을 잘 반영하도록 컨텍스트를 유지한다.
섹션 표식 사용
- 지침과 콘텐츠 구분:
---
, ###
등의 구분자를 사용하여 모델이 지침과 콘텐츠를 명확히 구분하도록 돕는다.
기본 지원 및 그라운딩 콘텐츠 & 큐
기본 콘텐츠 (Core Contents)
- 작업의 핵심 주제와 관련된 주요 정보로, 모델이 직접적으로 응답을 생성하는 데 필요한 콘텐츠.
- 기본 콘텐츠는 프롬프트의 시작 또는 끝에 배치되어 모델이 작업의 주제를 명확히 이해하도록 돕는다.
지원 콘텐츠 (Supporting Contents)
- 주제와 직접적으로 관련은 없지만 응답의 품질을 높이기 위해 추가적으로 제공하는 정보.
- 모델이 더 안전하고 정확하며, 요구 사항에 맞는 응답을 생성하도록 유도.
그라운딩 콘텐츠 (Grounding Contents)
- 모델이 학습한 데이터 외의 신뢰할 수 있는 정보를 제공하여 보다 정확하고 신뢰성 있는 응답을 생성하도록 도움.
큐 (Cue)
- 큐(Cue) 는 모델이 응답을 생성하는 데 참고할 수 있도록 제공되는 선행 단어나 지침을 말한다.
- 모델이 응답의 방향성과 구조를 이해하는 데 도움.
- 큐는 단독으로 사용할 수도 있고, 지침과 함께 결합하여 더 명확한 응답을 생성할 수도 있다.
정확도를 개선하기 위한 컨텍스트 제공
컨텍스트 제공의 주요 방법
- 출력 구조 지정
- 출력의 형태와 구조를 명시: 모델이 응답을 작성할 때 특정 형식을 따르도록 요청한다.
- 시스템 메시지
- 모델의 역할과 지침을 명확히 설명: 모델이 어떻게 행동해야 하는지, 어떤 스타일로 응답해야 하는지 알려준다.
- 대화 내용
- 대화의 문맥을 제공하여 흐름 유지: 이전 메시지나 관련된 대화 내용을 포함해 모델이 현재 요청을 더 잘 이해할 수 있도록 한다.
- 퓨샷 러닝 (Few Shot Learning)
- 예제를 통해 모델을 학습시켜 패턴을 이해하도록 유도: 모델이 수행해야 할 작업과 원하는 응답의 형태를 예제로 제공한다.
- 복잡한 작업 나누기
- 작업을 세분화하여 모델이 하나씩 처리하도록 요청: 복잡한 요청은 단계별로 나누어 처리하면 더 나은 결과를 얻을 수 있다.
- 생각의 사슬 (Chain of Thought)
- 모델에게 사고 과정을 설명하도록 요청: 응답의 논리적 순서를 명확히 하고, 잘못된 응답 가능성을 줄인다.
컨텍스트 제공의 효과
- 명확한 요청: 모델이 작업을 더 잘 이해하고, 의도에 맞는 결과를 생성.
- 정확성 향상: 필요한 정보가 명확히 전달되어 응답의 정확도가 높아짐.
- 일관성 유지: 시스템 메시지와 대화 문맥을 통해 톤과 내용이 일관된 응답 제공.
요청에 대한 출력구조 지정
출력구조 지정의 중요성
- 명확한 형식 제공: 모델이 어떤 방식으로 정보를 전달해야 할지 구체적으로 이해할 수 있도록 도움.
- 일관성 유지: 구조화된 결과를 제공하여 후속 작업에 용이.
- 효율성 향상: 사용자가 원하는 형식으로 직접 응답이 생성되므로 추가적인 수정 작업이 필요 없음.
출력 구조 지정 방법
- 응답의 형식 지시: 응답을 특정 형식으로 작성하도록 요청.
- 특정 언어 또는 코드 요청: 코드나 명령어로 출력하도록 요청.
- 단계별 출력 요청: 작업을 단계별로 분리하여 출력하도록 요청.
- 세부사항 강조: 출력에 반드시 포함해야 하는 요소를 지정.
출력 구조 지정의 효과
- 예측 가능한 결과 제공: 사용자는 모델 응답을 쉽게 활용할 수 있다.
- 작업 후처리 감소: 응답을 재구성할 필요 없이 바로 사용 가능.
- 응답 일관성 보장: 다양한 요청에서도 동일한 형식을 유지할 수 있다.
시스템 메시지 & 퓨샷 러닝
시스템 메시지
- 정의
- 시스템 메시지는 AI 모델이 작업을 수행할 때 기본적인 역할, 스타일, 응답 방향을 명확히 지정하는 초기 지침이다.
- 모델의 응답을 형식화하거나 특정 톤과 방식으로 제공하도록 유도한다.
- 시스템 메시지의 역할
1. 모델의 역할 설정: 모델이 수행해야 할 가상의 역할을 설정한다.
- 응답의 형식 및 스타일 정의: 결과물을 특정 방식으로 작성하도록 유도한다.
- 금지 사항 명시: 포함해서는 안되는 정보나 응답 방식을 제한한다.
- 효과
- 모델의 응답 방향과 품질을 통제 가능.
- 예측 가능성과 신뢰성을 높여 작업 효율성을 극대화.
퓨샷 러닝 (Few Shot Learning)
- 정의
- 퓨샷 러닝은 AI 모델에게 몇 가지 예제를 제공하여 응답 패턴을 학습시키는 기술이다.
- 명시적인 지침 없이도 모델이 제공된 예제를 바탕으로 적절한 응답을 생성한다.
- 퓨샷 러닝의 구성
1. 예제 제공: 작업 유형을 설명하는 예제 프롬프트와 예상 응답을 포함.
- 작업 지시: 예제를 기반으로 새 요청에 대한 응답을 생성하도록 모델에 요청.
- 퓨샷 러닝의 효과
1. 작업 예제를 통한 모델 학습: 모델이 작업의 맥락과 패턴을 쉽게 이해.
- 명시적 지시 없이도 적합한 응답 생성: 다양한 작업에 적응 가능.
- 응답 품질 향상: 모델이 제공된 예제를 기반으로 일관성 있는 결과를 생성.
시스템 메시지와 퓨샷 러닝의 차이점 및 조합
- 시스템 메시지는 AI의 역할과 응답 스타일을 설정.
- 퓨샷 러닝은 모델에게 작업 예제를 제공해 응답 패턴을 학습.
- 조합 활용: 시스템 메시지로 역할과 스타일을 설정한 후, 퓨샷 러닝으로 예제를 제공하여 구체적이고 일관성 있는 결과를 얻을 수 있음.
복잡한 작업 나누기 & 생각의 사슬
복잡한 작업 나누기
- 정의
- 단일한 큰 작업을 여러 하위 작업으로 분리하여 AI 모델이 각 단계를 차례로 처리하도록 유도하는 기법이다.
- 이를 통해 모델이 더 나은 이해와 정확도를 가지고 문제를 해결하도록 한다.
- 사용 방법
1. 작업을 세분화하여 단계별로 나누기: 복잡한 문제를 작은 부분으로 나눠 해결하도록 유도.
- 이전 단계 결과를 후속 프롬프트에 활용: 단계별 응답을 연결하여 최종 결과를 생성.
- 효과
- 정확성 향상: 모델이 작은 단위를 처리하기 때문에 오류 가능성이 줄어듦.
- 복잡한 요청 처리 가능: 복잡한 작업도 단게별 접근으로 간소화 가능.
생각의 사슬 (Chain of Thought)
- 정의
- 생각의 사슬(Chain of Thought) 은 모델이 논리적인 사고 과정을 단계별로 설명하도록 요청하는 프롬프트 기법이다.
- 이를 통해 모델이 작업의 논리적인 구조를 명확히 하고, 응답의 품질과 신뢰성을 높인다.
- 사용 방법
1. 단계별 사고 요청: 모델이 응답을 생성할 때 각 단계를 명확히 설명하도록 요구.
- 결론 도출 방식 강조: 응답이 도출된 근거를 구체적으로 제시하도록 유도.
- 효과
1. 오류 감소: 단계별 사고를 통해 논리적인 실수를 줄임.
- 모델 신뢰성 향상: 모델의 사고 과정을 검증 가능.
- 복잡한 문제 해결 가능: 단순히 결과만 제공하는 것이 아니라, 도출 과정을 설명하여 이해도를 높임.
- 두 기법의 차이점과 조합
- 복잡한 작업 나누기: 작업을 작은 단계로 나눠 독립적으로 해결.
- 생각의 사슬: 모델이 각 단계의 논리를 명시하며 진행.
- 조합 활용: 복잡한 문제를 나누고, 각 단계에서 생각의 사슬을 적용해 높은 품질의 응답 도출.
실습



import os
import asyncio
from dotenv import load_dotenv
os.chdir(os.path.dirname(__file__))
# Add Azure OpenAI package
from openai import AsyncAzureOpenAI
# Set to True to print the full response from OpenAI for each call
printFullResponse = False
async def main():
try:
# Get configuration settings
load_dotenv()
azure_oai_endpoint = os.getenv("AZURE_OAI_ENDPOINT")
azure_oai_key = os.getenv("AZURE_OAI_KEY")
azure_oai_deployment = os.getenv("AZURE_OAI_DEPLOYMENT")
# Configure the Azure OpenAI client
client = AsyncAzureOpenAI(
azure_endpoint=azure_oai_endpoint,
api_key=azure_oai_key,
api_version='2024-08-01-preview'
)
while True:
# Pause the app to allow the user to enter the system prompt
print("------------------\nPausing the app to allow you to change the system prompt.\nPress enter to continue...")
input()
# Read in system message and prompt for user message
system_text = open(file="system.txt", encoding="utf8").read().strip()
user_text = input("Enter user message, or 'quit' to exit: ")
if user_text.lower() == 'quit' or system_text.lower() == 'quit':
print('Exiting program...')
break
print("\nAdding grounding context from grounding.txt")
ground_text = open(file='grounding.txt', encoding='utf-8').read().strip()
user_text = user_text + ground_text
await call_openai_model(system_message = system_text,
user_message = user_text,
model=azure_oai_deployment,
client=client
)
except Exception as ex:
print(ex)
async def call_openai_model(system_message, user_message, model, client):
# Format and send the request to the model
messages = [
{"role": "system", "content": system_message},
{"role":"user", "content":user_message}
]
print("\nSending request to Azure Open AI model.....\n")
response = await client.chat.completions.create(
model=model,
temperature=0.7,
max_tokens=1200,
messages=messages
)
generated_txt = response.choices[0].message.content
messages.append({"role":"assistant", "content": generated_txt})
if printFullResponse:
print(response)
print("Response:\n" + generated_txt + "\n")
if __name__ == '__main__':
asyncio.run(main())
경로 문제로 고통받고 있었는데 한분이 os.chdir
코드를 알려주셨다.
햄복,,