프롬프트 엔지니어링으로 컨텍스트 제공
AI 모델에 컨텍스트를 제공하면 모델이 요구되는 내용 또는 최상의 답변을 제공하기 위해 알아야 할 사항을 더 잘 이해할 수 있습니다. 컨텍스트는 여러 가지 방법으로 제공할 수 있습니다.
요청 출력 컴퍼지션
출력의 구조를 지정하면 결과에 큰 영향을 미칠 수 있습니다. 여기에는 모델에 원본을 인용하고, 응답을 전자 메일로 작성하고, 응답을 SQL 쿼리로 형식을 지정하고, 감정을 특정 구조로 분류하는 등의 메시지가 포함될 수 있습니다. 예:
프롬프트
Write a table in markdown with 6 animals in it, with their genus and species
응답
| Animal | Genus | Species |
| ---------------- |:--------------:|:--------------:|
| Red Panda | Ailurus | fulgens |
| African Elephant | Loxodonta | africana |
| Snow Leopard | Panthera | uncia |
| Arctic Fox | Vulpes | lagopus |
| Chimpanzee | Pan | troglodytes |
| Siberian Tiger | Panthera | tigris altaica |
이 기술은 JSON 구조와 같은 사용자 지정 형식과 함께 사용할 수 있습니다.
프롬프트
Put two fictional characters into JSON of the following format
{
firstNameFictional:
jobFictional:
}
응답
Here's an example of how you can put two fictional characters into JSON format:
{
"firstNameFictional": "Henry",
"jobFictional": "Wizard"
},
{
"firstNameFictional": "Frank",
"jobFictional": "Hero"
}
시스템 메시지
시스템 메시지는 프롬프트의 시작 부분에 포함되며 모델 지침, 답변 큐브 뷰 또는 모델의 응답을 안내하는 데 도움이 되는 기타 정보를 제공하도록 설계되었습니다. 이 시스템 메시지에는 톤 또는 성격, 포함해서는 안 되는 항목 또는 답변 방법의 구체적인 내용(예: 서식)이 포함될 수 있습니다.
예를 들어 다음 시스템 메시지 중 일부를 제공할 수 있습니다.
- "명령 줄 터미널처럼 행동해 줘. 다른 것이 아닌 하나의 고유 코드 블록에서 cmd.exe가 하듯 정확히 명령에 응답해 줘."
- "영어->스페인어로 번역하는 번역가처럼 행동해 줘. 내가 말하거나 묻는 것에 응답하지 말고, 두 언어 간을 번역하고 번역된 텍스트로 회신해 줘."
- "목표와 도전 과제에 대해 격려와 조언을 자유롭게 제공하는 동기부여하는 연사 역할을 해 줘. 최종 목표에 도달하기 위해 많은 긍정적인 지지와 제안된 활동을 포함해야 돼."
다른 예제 시스템 메시지는 프롬프트 샘플 단추를 선택하여 Azure AI 파운드리의 채팅 창 맨 위에서 사용할 수 있습니다. 고유한 응답을 지정하는 고유한 시스템 프롬프트를 정의하고 모델과 채팅하여 응답이 어떻게 다른지 확인해 보세요.
ChatCompletion
엔드포인트에서는 System
채팅 역할을 사용하여 시스템 메시지를 포함할 수 있습니다.
var chatCompletionsOptions = new ChatCompletionsOptions()
{
Messages =
{
new ChatRequestSystemMessage("You are a casual, helpful assistant. You will talk like an American old western film character."),
new ChatRequestUserMessage("Can you direct me to the library?")
}
};
응답
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "Well howdy there, stranger! The library, huh?
Y'all just head down the main road till you hit the town
square. Once you're there, take a left and follow the street
for a spell. You'll see the library on your right, can’t
miss it. Happy trails!",
"role": "assistant"
}
}
],
...
}
response = openai.ChatCompletion.create(
model="gpt-35-turbo",
messages=[
{"role": "system", "content": "You are a casual, helpful assistant. You will talk like an American old western film character."},
{"role": "user", "content": "Can you direct me to the library?"}
]
)
Response
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "Well howdy there, stranger! The library, huh?
Y'all just head down the main road till you hit the town
square. Once you're there, take a left and follow the street
for a spell. You'll see the library on your right, can’t
miss it. Happy trails!",
"role": "assistant"
}
}
],
...
}
시스템 메시지는 형식과 콘텐츠 모두에서 응답을 크게 변경할 수 있습니다. 모델에 대한 명확한 시스템 메시지를 정의하여 예상되는 응답 종류와 포함할 작업 또는 포함하지 않으려는 작업을 정확히 설명합니다.
대화 내용
시스템 메시지와 함께 다른 메시지를 모델에 제공하여 대화를 향상시킬 수 있습니다. 대화 기록은 모델이 비슷한 방식(톤 또는 형식 등)으로 계속 응답하고 사용자가 후속 쿼리에서 이전 콘텐츠를 참조할 수 있도록 합니다. 이 기록은 실제 채팅 기록 또는 사용자 정의 예제 대화의 두 가지 방법으로 제공할 수 있습니다.
ChatGPT 및 Azure AI 파운드리의 채팅 플레이그라운드와 같은 OpenAI 모델을 사용하는 채팅 인터페이스에는 대화 기록이 자동으로 포함되어 보다 풍부하고 의미 있는 대화가 생성됩니다. 채팅 플레이그라운드의 매개 변수 섹션에서 포함할 과거 메시지 수를 지정할 수 있습니다. 이를 1로 줄이거나 최대로 늘려 다양한 양의 기록이 대화에 미치는 영향을 확인합니다.
참고
프롬프트에 포함된 대화 기록이 많을수록 입력 토큰 수가 더 많이 사용됩니다. 사용 중인 모델의 토큰 제한을 고려하여 사용 사례에 대해 올바른 남은 기록을 결정해야 합니다.
채팅 시스템은 모델의 요약 기능을 활용하여 입력 토큰에 저장할 수도 있습니다. 앱은 과거 메시지를 요약하고 대화 기록에 해당 요약을 포함하도록 선택한 다음, 모델에 이전 몇 가지 메시지만 그대로 제공할 수 있습니다.
퓨샷 러닝
사용자 정의 예제 대화를 사용하는 것은 지정된 쿼리에 응답하는 방법에 대한 모델 예제를 제공하는 퓨샷 학습이라고 합니다. 이러한 예제는 모델 응답 방법을 학습하는 역할을 합니다.
예를 들어 모델에 몇 가지 프롬프트와 예상 응답을 제공하여 수행할 작업을 지시하지 않고 동일한 패턴으로 계속됩니다.
User: That was an awesome experience
Assistant: positive
User: I won't do that again
Assistant: negative
User: That was not worth my time
Assistant: negative
User: You can't miss this
Assistant:
퓨샷 학습에서 추가 컨텍스트 없이 You can't miss this
모델을 제공하는 경우 응답이 유용하지 않을 수 있습니다.
실질적으로 대화 기록과 몇 가지 샷 학습이 동일한 방식으로 모델에 전송됩니다. 각 사용자 메시지 및 도우미 응답은 메시지 개체의 개별 메시지입니다. ChatCompletion
엔드포인트는 이 메시지 기록이 퓨샷 학습 또는 실제 대화 기록으로 제공되는지 여부에 관계없이 메시지 기록을 포함하도록 최적화됩니다.
var chatCompletionsOptions = new ChatCompletionsOptions()
{
Messages =
{
new ChatRequestSystemMessage("You are a helpful assistant."),
new ChatRequestUserMessage("That was an awesome experience"),
new ChatRequestAssistantMessage("positive"),
new ChatRequestUserMessage("I won't do that again"),
new ChatRequestAssistantMessage("negative"),
new ChatRequestUserMessage("That was not worth my time"),
new ChatRequestAssistantMessage("negative"),
new ChatRequestUserMessage("You can't miss this")
}
};
response = openai.ChatCompletion.create(
model="gpt-35-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "That was an awesome experience"},
{"role": "assistant", "content": "positive"},
{"role": "user", "content": "I won't do that again"},
{"role": "assistant", "content": "negative"},
{"role": "user", "content": "That was not worth my time"},
{"role": "assistant", "content": "negative"},
{"role": "user", "content": "You can't miss this"}
]
)
복잡한 작업 나누기
상호 작용을 개선하기 위한 또 다른 기술은 복잡한 프롬프트를 여러 쿼리로 나누는 것입니다. 이를 통해 모델은 각 개별 부분을 더 잘 이해하고 전반적인 정확도를 향상시킬 수 있습니다. 프롬프트를 분할하면 이후 프롬프트에 이전 프롬프트의 응답을 포함하고 모델의 기능 외에도 해당 정보를 사용하여 흥미로운 응답을 생성할 수 있습니다.
예를 들어 모델에 Doug can ride down the zip line in 30 seconds, and takes 5 minutes to climb back up to the top. How many times can Doug ride the zip line in 17 minutes?
을(를) 요청할 수 있습니다. 결과는 3
일 가능성이 높은데, 이는 더그가 집 라인의 정상에서 출발하는 경우 마지막으로 탄 후 정상으로 돌아갈 필요가 없기 때문입니다.
더 유익한 대답은 여러 질문을 하는 것에서 올 수 있습니다. 짚라인의 상단으로 돌아가기 위한 왕복 시간과 Doug 상단에 시작한다는 사실을 어떻게 설명해야 하는지에 대한 질문일 수 있습니다. 이 문제를 나누면 Doug가 실제로 짚라인을 네 번 탈 수 있음을 알 수 있습니다.
생각의 사슬
작업을 효과적으로 분해하는 데 도움이 되는 한 가지 유용한 방법은 모델에 생각의 사실을 설명하도록 요청하는 것입니다.
모델에게 반응을 결정하는 단계별 프로세스로 반응하도록 요청하는 것은 모델이 프롬프트를 해석하는 방식을 이해하는 데 유용합니다. 이렇게 하면 모델이 잘못된 논리적 회전을 수행한 위치를 확인하고 오류를 방지하기 위해 프롬프트를 변경하는 방법을 더 잘 이해할 수 있습니다. 이 기술에는 Bing 채팅처럼(GPT-4 세대 모델을 사용하는) 원본을 인용하도록 요청하고 대답을 결정한 이유에 대한 추론을 제공하는 것이 포함될 수 있습니다.
생각 프롬프트 기술 체인은 모델에서 최고 품질의 답변을 얻기 위해 프롬프트를 반복하고 개선하는 데 가장 적합합니다.
예를 들어 What sport is easiest to learn but hardest to master?
모델에 요청하면 답변과 그 이유에 대한 작은 설명이 표시됩니다. 그러나 What sport is easiest to learn but hardest to master? Give a step by step approach of your thoughts, ending in your answer
과(와) 함께 메시지가 표시되면 응답은 응답이 어떻게 응답에 도착했는지에 대한 완전한 설명이 됩니다.
Sure, here's a step-by-step approach to answering the question:
1. Identify sports that are popular and have a large following.
2. Consider the basic mechanics of each sport and how easy they are to learn.
3. Think about the various techniques and skills required to play each sport at a high level, and how difficult they are to master.
4. Compare the relative ease of learning each sport to the difficulty of mastering it.
5. Based on the above analysis, determine which sport is easiest to learn but hardest to master.
Using this approach, I would say that the sport of golf is easiest to learn but hardest to master. Here's why:
1. Golf is a popular sport with a large following.
2. The basic mechanics of hitting a golf ball are relatively simple and can be learned quickly with some practice.
3. However, achieving consistency and mastering the various shots and techniques required to play at a high level can take years of practice and dedication.
4. Compared to other sports, the difference between a beginner and an intermediate golfer is relatively small, while the difference between an intermediate and an advanced golfer is much larger.
5. Therefore, I would say that golf is the sport that is easiest to learn but hardest to master.
모델이 응답을 형성하는 데 사용된 이유의 단계를 알면 프롬프트를 분할하거나, 자세한 정보를 제공하거나, 지침을 명확히 해야 하는 위치를 식별할 수 있습니다.