Prompt 엔지니어링

이 가이드는 GPT-4와 같은 대형 언어 모델(때로는 GPT 모델이라고 함)에서 더 나은 결과를 얻기 위한 전략과 전술을 공유합니다. 여기서 설명하는 방법은 때로는 더 큰 효과를 위해 병행하여 적용될 수 있습니다. 당신에게 가장 적합한 방법을 찾기 위해 실험을 장려합니다.

여기에서 따라온 예는 현재 우리의 가장 능숙한 모델 'gpt-4'에서만 작동되는 것으로 확인됩니다. 일반적으로 작업에 실패하는 모델을 발견하면, 더 능숙한 모델이 사용 가능하다면 더 나은 성과를 위해 다시 시도하는 것이 종종 가치가 있습니다.

팁: 이 튜토리얼은 공식 OpenAI 팁 엔지니어링 가이드의 번역입니다. 이 튜토리얼은 팁 단어를 작성하는 전략/전술 및 어떻게하여 LLM에게 원하는 결과를 반환하도록 지시하는 방법을 설명합니다.

더 나은 결과를 얻기 위한 여섯 가지 전략

명확한 지시사항 작성

이러한 모델은 당신의 마음을 읽을 수 없습니다. 출력물이 너무 길면 간단한 답변을 요청하라. 출력물이 너무 간단하면 전문가 수준의 글쓰기를 요청하라. 포맷을 싫어한다면 본인이 원하는 형식을 보여주라. 당신이 원하는 것이 무엇인지 모델이 추측해야 할 수록 그것을 더 얻을 확률이 높아집니다.

전술:

  • 더 관련이 있는 답변을 얻기 위해 질문에 세부 사항을 포함시키기
  • 모델에게 특정 인격을 취하도록 지시하기
  • 입력의 명확한 구분을 나타내기 위해 구분자 사용하기
  • 작업을 완료하는 데 필요한 단계 지정하기
  • 예시 제공하기
  • 출력물의 원하는 길이 지정하기

참조 텍스트 제공

언어 모델은 특히 난해한 주제에 대해 묻거나 인용 및 URL에 대해 물어볼 때 가짜 답변을 자신있게 창조할 수 있습니다. 마찬가지로 학생이 시험을 더 잘 볼 수 있도록 메모지가 도와주는 것처럼, 이러한 모델에게 참조 텍스트를 제공하면 거짓말을 최소화하며 답변할 수 있습니다.

전술:

  • 모델에게 참조 텍스트를 사용하여 대답하도록 지시하기
  • 모델에게 참조 텍스트에서 인용구로 대답하도록 지시하기

복잡한 작업을 간단한 하위 작업으로 분할하기

소프트웨어 엔지니어링에서 복잡한 시스템을 모듈화된 구성 요소 집합으로 분해하는 것이 좋은 실천 방법인 것처럼, 언어 모델에 제출된 작업에도 동일한 원칙이 적용됩니다. 복잡한 작업은 일반적으로 단순한 작업보다 오류율이 높을 수 있습니다. 더구나, 복잡한 작업은 종종 이전 작업의 출력물을 사용하여 후속 작업의 입력을 구성하는 간단한 작업의 워크플로우로 재정의될 수 있습니다.

전술:

  • 사용자 질문에 가장 관련 있는 지시사항을 식별하기 위해 의도 분류 사용하기
  • 매우 긴 대화가 필요한 대화 애플리케이션의 경우 이전 대화를 요약하거나 걸러내기
  • 긴 문서를 작은 조각으로 요약하고 전체 요약을 재귀적으로 만들기

모델에게 "생각할 시간"을 주기

17을 28로 곱해달라고 하면 당신은 즉시 알 수 없지만, 시간을 들여 계산할 수 있습니다. 비슷하게, 모델은 답변을 즉시 찾으려고 하는 것보다 답변을 찾기 위해 시간을 들여 노력할 때 더 많은 추론 오류를 일으키게 됩니다. 답변 앞에 "생각의 과정"을 요구함으로써 모델이 올바른 답변으로 더 신뢰성 있게 추론할 수 있도록 도와줄 수 있습니다.

전술:

  • 모델에게 결론에 도달하기 전에 자체 솔루션을 찾아보도록 지시하기
  • 내면적 대화나 일련의 질문을 사용하여 모델의 추론 과정을 숨기도록 하기
  • 이전 패스에서 모델이 놓친 것이 있는지 묻기

외부 도구 활용하기

모델의 약점을 보완하기 위해 다른 도구의 출력을 모델에 공급함으로써 보다 나은 결과를 얻을 수 있습니다. 예를 들어, 텍스트 검색 시스템(가끔 RAG나 검색 증강 생성이라고 함)은 모델에게 관련 있는 문서에 대해 알려줄 수 있습니다. OpenAI의 코드 해석기와 같은 코드 실행 엔진은 모델이 수학을 하거나 코드를 실행하는 데 도움을 줄 수 있습니다. 언어 모델보다 도구로 더 신뢰성 있거나 효율적으로 작업을 수행할 수 있는 경우, 언어 모델이 아닌 도구에게 작업을 맡겨 더 나은 결과를 얻을 수 있습니다.

전술:

  • 효율적인 지식 검색을 구현하기 위해 임베딩 기반 검색 사용하기
  • 보다 정확한 계산이나 외부 API 호출을 실행하기 위해 코드 실행 사용하기
  • 모델이 특정 함수에 접근할 수 있도록 하기

체계적으로 변경 사항 테스트하기

성능을 개선하는 것은 측정할 수 있다면 더 쉽습니다. 경우에 따라서 프롬프트에 대한 수정은 일부 격리된 예제에서 더 나은 성능을 달성할 수 있지만, 더 대표적인 예제 집합에서는 더 나쁜 성능을 보일 수 있습니다. 따라서 변경이 성능에 긍정적인지를 정확히 확인하기 위해서는 종합적인 테스트 스위트(또는 "평가"로도 알려짐)를 정의해야 할 수도 있습니다.

전술:

  • 골드 표준 답변을 참조하여 모델 출력물을 평가하기

전술

위에 나열된 각 전략은 특정 전술로 구체화될 수 있습니다. 이러한 전술은 시도해볼 아이디어를 제공하기 위한 것으로, 완전히 포괄적인 것은 아니며 여기에 표시되지 않은 창의적인 아이디어를 시도해도 괜찮습니다.

Prompt word example description

모두가 OpenAI를 호출하는 Chat Model API에는 SYSTEM, USER, 그리고 ASSISTANT 세 가지 메시지 유형이 있다는 것을 알고 있습니다. 각각의 메시지에 대한 기능은 다음과 같습니다.

메시지 유형 (api의 role 매개변수에 해당) 설명
SYSTEM 시스템 메시지는 어시스턴트의 동작을 설정하는 데 도움이 됩니다. 예를 들어, 어시스턴트의 성격을 수정하거나 대화 전체에 걸쳐 어떻게 행동해야 하는지에 대한 구체적인 지침을 제공할 수 있습니다. 그러나 시스템 메시지는 선택 사항이며, 시스템 메시지 없이 모델의 동작은 "도움이 되는 어시스턴트입니다."와 같은 일반적인 메시지를 사용하는 것과 유사할 수 있습니다.
USER 사용자 메시지는 사용자 입력 사항입니다.
ASSISTANT 어시스턴트 메시지는 GPT가 반환하는 내용을 나타냅니다.

이 튜토리얼에서 프롬프트 단어 예제는 다음 형식으로 설명됩니다.

// SYSTEM Message
시스템 메시지 프롬프트 단어를 설정하는 방법을 보여줍니다.

// USER Message
사용자 메시지의 프롬프트 단어를 설정하는 방법을 보여줍니다.

// ASSISTANT Message
GPT가 반환하는 내용을 보여줍니다.

전략: 명확한 지침 작성

전술: 더 관련성 높은 답변을 받기 위해 세부 사항 포함

더 관련성 높은 응답을 받기 위해서는, 요청에서 중요한 세부 사항이나 맥락을 제공해야 합니다. 그렇지 않으면 모델이 무엇을 의도하는지 추측하게 됩니다.

나쁨 좋음
엑셀에서 숫자를 더하는 방법? 엑셀에서 달러 금액을 한 행에 합하는 방법을 알려주세요. 전체 시트의 모든 행에 대해 이를 자동으로 수행하고 총합을 "합계"라는 열에 모두 오른쪽에 두고 싶습니다.
대통령은 누구야? 2021년 멕시코 대통령은 누구이며, 선거는 얼마나 자주 진행되나요?
피보나치 수열을 계산하라. 효율적으로 피보나치 수열을 계산하는 TypeScript 함수를 작성하세요. 각 부분이 무엇을 하는지 설명하고 작성된 방식에 대해 자세히 주석을 다세요.
회의 메모를 요약하라. 회의 메모를 한 단락으로 요약하세요. 그런 다음 발화자와 각각의 주요 포인트에 대한 마크다운 목록을 작성하세요. 마지막으로 발화자가 제안한 다음 단계 또는 액션 아이템을 나열하세요.

전술: 모델에게 특정 인격을 취하도록 요청

시스템 메시지를 사용하여 모델의 회신에서 사용할 인격을 지정할 수 있습니다.

// SYSTEM Message
나에게 무언가를 쓰는 데 도움을 요청하면, 각 단락에 최소한 하나의 장난거리나 장난스러운 코멘트를 포함하는 문서로 회신해주세요.

// USER Message
철거너가 배달을 제 시간에 하고 짧은 시간 안에 해 주어서 감사 인사를 써주세요. 이로써 저희가 중요한 주문을 처리할 수 있었어요.

전술: 구분 기호 사용하여 입력의 명확한 부분 지정

삼중 따옴표나 XML 태그, 섹션 제목 등과 같은 구분 기호는 텍스트의 서로 다른 부분을 명확하게 구분하는 데 도움을 줄 수 있습니다.

// USER Message
삼중 따옴표로 구분된 텍스트를 하이쿠로 요약해주세요.

"""여기에 텍스트를 삽입하세요"""
// SYSTEM Message
동일한 주제에 대한 기사 쌍(각각 XML 태그로 구분)이 제공됩니다. 먼저 각 기사의 주장을 요약하세요. 그런 다음 더 낫다고 생각되는 기사를 지적하고 그 이유를 설명해주세요.

// USER Message
<article> 여기에 첫 번째 기사를 삽입하세요 </article>
<article> 여기에 두 번째 기사를 삽입하세요 </article>
// SYSTEM Message
논문 개요와 그에 대한 제안된 제목이 제공됩니다. 논문 제목은 독자에게 논문의 주제에 대한 좋은 아이디어를 주어야 하지만 눈길을 끌어야 합니다. 제목이 이러한 기준을 충족하지 않는 경우 5가지 대안을 제시해주세요.

// USER Message
요약: 여기에 논문 개요를 삽입하세요

제목: 여기에 제목을 삽입하세요

각 작업이 복잡할수록, 구분 기호를 사용하여 작업 세부 정보를 명확하게 구분하는 것이 더 중요합니다. 모델이 정확히 무엇을 요구하는지 이해하는 데 모델이 작업하지 않도록 하세요.

전술: 작업 완료에 필요한 단계 지정

몇 가지 작업은 단계별로 명시하는 것이 가장 좋습니다. 단계를 명시적으로 쓰는 것은 모델이 이해하기 쉽도록 만들 수 있습니다.

// 시스템 메시지
사용자 입력에 대답하기 위해 다음의 단계별 지침을 사용합니다.

단계 1 - 사용자가 세 개의 따옴표로 텍스트를 제공합니다. 이 텍스트를 "요약: "이라는 접두어가 있는 한 문장으로 요약합니다.

단계 2 - 단계 1의 요약을 "번역: "이라는 접두어가 있는 스페인어로 번역합니다.

// 사용자 메시지
"""여기에 텍스트 삽입"""

전술: 예시 제공

일반적인 지침을 제공하는 것이 모든 예시의 모든 경우를 명시하는 것보다 효율적일 수 있지만, 어떤 경우에는 모델이 어려움 없이 따를 수 있는 특정한 스타일로 대답하는 것을 명시적으로 설명하는 것보다 예시를 제공하는 것이 더 쉬울 수 있습니다. 이를 "퓨-샷(few-shot)" 프롬프팅이라고 합니다.

// 시스템 메시지
일관된 스타일로 답변하세요.

// 사용자 메시지
인내에 대해 가르쳐줘.

// 어시스턴트 메시지
가장 깊은 계곡을 깎는 강은 겸손한 샘에서 흐르고; 가장 웅장한 교향곡은 단 하나의 음표에서 시작하며; 가장 복잡한 태피스트리는 외로운 실로부터 시작됩니다.

// 사용자 메시지
바다에 관해 가르쳐줘.

전술: 출력물의 원하는 길이 지정

모델에게 주어진 대상 길이로 출력물을 생성하도록 할 수 있습니다. 대상 출력물의 길이를 단어, 문장, 문단, 글머리 기호 수 등으로 지정할 수 있습니다. 그러나 모델에게 특정 단어 수를 생성하도록 지시하는 것은 높은 정밀도로 작동하지 않습니다. 모델은 보다 정확하게 특정 단락이나 글머리 기호 수로 출력물을 생성할 수 있습니다.

// 사용자 메시지

삼중 따옴표로 구분된 텍스트를 대략 50단어로 요약하세요.

"""여기에 텍스트 삽입"""
// 사용자 메시지

삼중 따옴표로 구분된 텍스트를 2단락으로 요약하세요.

"""여기에 텍스트 삽입"""
// 사용자 메시지

삼중 따옴표로 구분된 텍스트를 3개의 글머리 기호로 요약하세요.

"""여기에 텍스트 삽입"""

전략: 참고 텍스트 제공

전술: 모델이 참조 텍스트를 사용하여 답변하도록 지시

현재 쿼리와 관련된 신뢰할 수 있는 정보를 모델에 제공할 수 있다면, 모델에게 제공된 정보를 사용하여 답변을 구성하도록 지시할 수 있습니다.

// 시스템 메시지
삼중 따옴표로 구분된 제공된 기사를 사용하여 질문에 답변하십시오. 기사에서 답변을 찾을 수 없는 경우 "답을 찾을 수 없습니다."라고 작성하십시오.

// 사용자 메시지
삼중 따옴표로 둘러싸인 기사를 삽입하십시오.

질문: <여기에 질문 삽입>

현재 모든 모델은 제한된 컨텍스트 창을 갖고 있기 때문에, 현재 질문과 관련된 동적으로 검색할 수 있는 정보를 제공해야 합니다. 임베딩은 효율적인 지식 검색을 구현하는 데 사용할 수 있습니다. 효율적인 지식 검색을 구현하는 방법에 대한 자세한 내용은 "임베딩 기반 검색 사용하여 효율적인 지식 검색 구현" 전술을 참조하십시오.

전술: 모델이 참조 텍스트에서 인용하여 답변하도록 지시

입력이 관련 지식으로 보충된 경우, 모델에게 제공된 문서에서의 구문을 참조함으로써 답변에 인용을 추가하도록 요청할 수 있습니다. 답변의 인용은 제공된 문서 내의 문자열 일치로 프로그램적으로 확인할 수 있습니다.

// 시스템 메시지
세 개의 따옴표로 구분된 문서와 질문이 제공됩니다. 귀하의 임무는 제공된 문서만 사용하여 질문에 답변하고 해당 질문에 대답하기 위해 사용된 문서의 구문을 인용하는 것입니다. 문서에 필요한 정보가 포함되어 있지 않다면 단순히 "정보가 충분하지 않음"이라고 작성하십시오. 질문에 대한 답변이 제공된 경우, 관련된 구절에 대한 인용을 반드시 추가해야 합니다. 관련 부분을 인용하기 위해 다음 형식을 사용하십시오 ({"인용": ...}).

// 사용자 메시지

"""여기에 문서를 삽입하십시오."""

질문: <여기에 질문 삽입하십시오>

전술: 의도 분류를 사용하여 사용자 쿼리에 가장 관련된 지침 식별

독립적인 여러 세트의 지침이 필요한 작업의 경우, 먼저 쿼리 유형을 분류하고 해당 분류를 사용하여 필요한 지침을 결정하는 것이 유용할 수 있습니다. 이는 고정된 범주를 정의하고 해당 범주에서 작업을 처리하는 데 필요한 지침을 하드코딩함으로써 달성할 수 있습니다. 이 프로세스는 재귀적으로 작업을 일련의 단계로 분해하는 데도 적용될 수 있습니다. 이 접근 방식의 장점은 각 쿼리가 작업의 다음 단계를 수행하는 데 필요한 지침만 포함하게 되어 단일 쿼리를 사용하는 것보다 오류율이 낮아질 수 있다는 것입니다. 이는 또한 더 큰 프롬프트가 더 많이 실행되어 더 높은 비용이 발생하는 것에 비해 비용이 낮아질 수도 있습니다.

예를 들어, 고객 서비스 응용 프로그램의 경우 쿼리를 다음과 같이 유용하게 분류할 수 있다고 가정해 봅시다:

// SYSTEM Message
고객 서비스 쿼리가 제공됩니다. 각 쿼리를 주요 범주와 보조 범주로 분류하십시오. 키: 주요 및 보조를 사용하여 json 형식으로 출력하십시오.

주요 범주: 청구, 기술 지원, 계정 관리 또는 일반 문의.

청구 보조 범주:
- 해지 또는 업그레이드
- 결제 수단 추가
- 청구에 대한 설명
- 청구 분쟁

기술 지원 보조 범주:
- 문제 해결
- 장치 호환성
- 소프트웨어 업데이트

계정 관리 보조 범주:
- 비밀번호 재설정
- 개인 정보 업데이트
- 계정 해지
- 계정 보안

일반 문의 보조 범주:
- 제품 정보
- 가격
- 피드백
- 직원에게 연락

고객 쿼리의 분류에 따라 모델에게 다음 단계를 수행하기 위한 더 구체적인 지침 세트가 제공될 수 있습니다. 예를 들어, 고객이 "문제 해결"에 도움이 필요한 경우에 대비하여 더 구체적인 지침이 포함될 수 있습니다.

// SYSTEM Message
기술 지원 문맥에서 문제 해결이 필요한 고객 서비스 문의가 제공될 예정입니다. 사용자에게 다음과 같이 도움을 제공하십시오:

- 모든 라우터와 연결된 케이블이 연결되어 있는지 확인하도록 요청하십시오. 케이블이 시간이 지남에 따라 늘 빠지는 것이 일반적이라는 점을 감안하십시오.
- 모든 케이블이 연결되어 있고 문제가 지속될 경우, 사용자가 사용 중인 라우터 모델을 물어보십시오.
- 이제 사용자에게 기기를 다시 시작하는 방법을 안내하십시오:
-- 모델 번호가 MTD-327J라면 빨간 버튼을 누르고 5초 동안 누른 후 연결을 테스트하기 전 5분을 기다릴 것을 권장하십시오.
-- 모델 번호가 MTD-327S이라면 플러그를 뽑고 다시 꽂은 후 연결을 테스트하기 전 5분을 기다릴 것을 권장하십시오.
- 기기를 다시 시작하고 5분을 기다렸지만 고객의 문제가 지속될 경우, {"IT 지원 요청됨"}을 출력하여 그들을 IT 지원에 연결하십시오.
- 사용자가 이 주제와 관련 없는 질문을 시작하면 현재의 문제 해결 채팅을 종료하고 다음 체계에 따라 그들의 요청을 분류하도록 확인하십시오:

<위에 언급된 주요/보조 분류 체계 삽입>

// USER Message
인터넷을 다시 작동시켜야 합니다.

모델에게 대화 상태가 변경되었음을 나타내기 위해 특별한 문자열을 출력하도록 지시되었다는 점에 주목하십시오. 이를 통해 시스템을 상태 기계로 변환하여 상태가 다음에 주입될 지침을 결정하게 할 수 있습니다. 상태를 추적함으로써 해당 상태에서 어떤 지침이 관련되며 선택 사항으로 해당 상태에서 어떤 상태 전이가 허용되는지에 대한 보호막을 두어 보다 구조화된 접근 방식보다 어렵게 달성될 수 있는 사용자 경험을 보호할 수 있습니다.

전술: 매우 긴 대화가 필요한 대화 응용 프로그램의 경우, 이전 대화를 요약하거나 필터링

모델은 고정된 문맥 길이를 가지고 있기 때문에 사용자와 어시스턴트 사이의 대화가 전체 대화가 계속해서 문맥 창에 포함되는 경우 무한히 지속될 수는 없습니다.

이러한 문제에는 다양한 해결책이 있으며, 그 중 하나는 이전 대화를 요약하는 것입니다. 입력 크기가 미리 결정된 임계 길이에 도달하면 대화의 일부를 요약하고 이전 대화의 요약본을 시스템 메시지의 일부로 포함시킬 수 있습니다. 또는 이전 대화를 대화의 전체 기간 동안 비동기적으로 요약할 수도 있습니다.

대안적인 해결책은 현재 쿼리와 가장 관련이 있는 이전 대화의 부분을 동적으로 선택하는 것입니다. 효율적인 지식 검색을 구현하기 위해 임베딩 기반 검색 사용 전술을 참조하십시오.

전략: 모델에게 "생각할 시간"을 주기

전술: 결론을 서두르지 말고 모델에게 스스로 해결책을 찾도록 지시하기

가끔은 모델에게 결론에 이르기 전에 원칙부터 충분히 고민하도록 명시적으로 지시하면 더 나은 결과를 얻을 수 있습니다. 예를 들어 학생의 수학 문제 풀이를 평가하도록 모델에게 지시하려면 가장 명백한 방법은 학생의 해답이 맞는지 아닌지 단순히 묻는 것입니다.

// 시스템 메시지
학생의 해답이 맞는지 아닌지를 결정하세요.

// 사용자 메시지
문제 설명: 내가 태양열 발전 설비를 건설하고 재무를 처리하는 데 도움이 필요합니다.
- 토지 비용: 1제곱피트 당 $100
- 태양광 패널 구매 비용: 1제곱피트 당 $250
- 유지보수를 위한 계약 조건: 고정비로 연간 $100,000 및 1제곱피트 당 추가 $10 비용
제곱피트 수에 대한 첫 해 운영 총 비용을 함수로 나타내세요.

학생의 해법: x를 설비 크기(제곱피트)로 둡시다.
1. 토지 비용: 100x
2. 태양광 패널 비용: 250x
3. 유지보수 비용: 100,000 + 100x
총 비용: 100x + 250x + 100,000 + 100x = 450x + 100,000

// 비서 메시지
학생의 해답은 맞습니다.

그러나 학생의 해법은 실제로 틀렸습니다! 우리는 모델이 자신의 해법을 먼저 생성하도록 유도함으로써 이를 성공적으로 발견할 수 있습니다.

// 시스템 메시지
문제에 대한 자신의 해답을 먼저 찾으세요. 그 후 학생의 해답과 비교하여 학생의 해결책이 맞는지 아닌지를 평가하세요. 문제를 스스로 해 보기 전까지 학생의 해답이 맞는지 결정하지 마세요.

// 사용자 메시지
문제 설명: 내가 태양열 발전 설비를 건설하고 재무를 처리하는 데 도움이 필요합니다.
- 토지 비용: 1제곱피트 당 $100
- 태양광 패널 구매 비용: 1제곱피트 당 $250
- 유지보수를 위한 계약 조건: 고정비로 연간 $100,000 및 1제곱피트 당 추가 $10 비용
제곱피트 수에 대한 첫 해 운영 총 비용을 함수로 나타내세요.

학생의 해법: x를 설비 크기(제곱피트)로 둡시다.
1. 토지 비용: 100x
2. 태양광 패널 비용: 250x
3. 유지보수 비용: 100,000 + 100x
총 비용: 100x + 250x + 100,000 + 100x = 450x + 100,000

// 비서 메시지
x를 설비 크기(제곱피트)로 두세요.
1. 토지 비용: 100x
2. 태양광 패널 비용: 250x
3. 유지보수 비용: 100,000 + 10x
총 비용: 100x + 250x + 100,000 + 10x = 360x + 100,000

학생의 해답은 틀렸습니다. 유지보수 비용 계산에서 100x 대신 10x를 사용한 오류가 있습니다. 첫 해 운영 총 비용은 360x + 100,000입니다.

전략: 내면의 몽타주 또는 일련의 쿼리를 사용하여 모델의 추론 과정을 숨기기

이전의 전략은 때때로 모델이 특정 질문에 대답하기 전에 문제에 대해 자세히 추론하는 것이 중요할 수 있다는 것을 보여 줍니다. 어떤 응용 프로그램의 경우에는 모델이 최종 답변에 이르기 위해 사용하는 추론 과정을 사용자와 공유하는 것이 적절하지 않을 수 있습니다. 예를 들어, 가르치기 응용 프로그램에서는 학생들이 자신의 답을 연구하도록 격려하고, 모델이 학생의 해결책에 대한 추론 과정을 공개하게 되면 학생에게 정답이 공개될 수 있습니다.

내면의 몽타주는 이를 완화하는 데 사용할 수 있는 전략입니다. 내면의 몽타주의 아이디어는 모델에게 사용자와 숨겨져야 하는 출력의 일부를 구조화된 형식으로 넣고, 사용자에게 표시하기 전에 출력을 구문 분석하고 일부분만 보이게 하는 것입니다.

// 시스템 메시지
사용자 질문에 답변하기 위해 다음 단계를 따르세요.

단계 1 - 먼저 문제에 대한 자신만의 해결책을 찾으세요. 학생의 해결책에 의지하지 마세요. 이 단계의 모든 작업을 삼중 따옴표 (""")로 묶어주세요.

단계 2 - 학생의 해결책과 여러분의 해결책을 비교하여 학생의 해결책이 올바른지 여부를 평가하세요. 이 단계의 모든 작업을 삼중 따옴표 (""")로 묶어주세요.

단계 3 - 학생이 실수를 했다면 답을 알려주지 않고 학생에게 힌트를 어떻게 제공할지 결정하세요. 이 단계의 모든 작업을 삼중 따옴표 (""")로 묶어주세요.

단계 4 - 학생이 실수를 했다면, 이전 단계에서 생성된 힌트를 학생에게 제공하세요 (삼중 따옴표 바깥에서). "단계 4 - ..." 대신에 "힌트:"라고 작성해주세요.

// 사용자 메시지
문제 설명: <문제 설명 입력>

학생의 해결책: <학생의 해결책 입력>

반대로, 여기에는 마지막을 제외한 모든 출력이 최종 사용자에게 숨겨진 일련의 쿼리로도 이를 달성할 수 있습니다.

먼저, 모델에게 문제를 직접 해결하도록 요청할 수 있습니다. 이 초기 쿼리는 학생의 해결책을 필요로하지 않으므로 생략될 수 있습니다. 이렇게 하면 모델의 해결이 학생의 시도한 해결책에 영향을 받을 가능성이 없어지는 추가적인 이점이 있습니다.

// 사용자 메시지
<문제 설명 입력>

다음으로, 모델이 모든 가능한 정보를 사용하여 학생의 해결책의 정확성을 평가하도록 할 수 있습니다.

// 시스템 메시지
여러분의 해결책을 학생의 해결책과 비교하여 학생의 해결책이 올바른지 여부를 평가하세요.

// 사용자 메시지
문제 설명: """<문제 설명 입력>"""

여러분의 해결책: """<모델이 생성한 해결책 입력>"""

학생의 해결책: """<학생의 해결책 입력>"""

마지막으로, 모델이 친절한 과외교사의 역할을 수행하여 자신의 분석을 사용하여 회답을 작성할 수 있습니다.

// 시스템 메시지

여러분은 수학 과외교사입니다. 학생이 실수를 했다면 답을 드러내지 않는 방식으로 학생에게 힌트를 제공하세요. 학생이 실수를 하지 않았다면, 그들에게 격려의 말을 전하세요.

// 사용자 메시지

문제 설명: """<문제 설명 입력>"""

여러분의 해결책: """<모델이 생성한 해결책 입력>"""

학생의 해결책: """<학생의 해결책 입력>"""

분석: """<이전 단계에서 생성된 모델의 분석 입력>"""

전략: 이전 단계에서 빠뜨린 부분이 있는지 모델에게 물어보기

가정해보자, 모델이 특정 질문과 관련된 축삭물을 나열하는 데 사용되고 있습니다. 각 축삭물을 나열한 후에 모델은 다른 축삭물을 작성할 지 여부를 결정해야 합니다. 문서가 크다면, 모델이 너무 일찍 중단하고 모든 관련 축삭물을 나열하지 못할 수 있습니다. 이 경우, 모델이 이전 단계에서 놓친 축삭물을 찾기 위해 후속 쿼리로 모델에게 프롬프트하는 것이 더 나은 성능을 얻을 수 있습니다.

// 시스템 메시지
삼중 따옴표로 구분된 문서가 제공됩니다. 다음 질문과 관련된 축삭물을 선택하는 것이 여러분의 작업입니다: "인공지능의 역사에서 어떤 중요한 패러다임 변화가 일어났습니까."

축삭물이 해석하는 데 필요한 모든 관련 맥락이 포함되도록 하세요 - 다시 말해 중요한 맥락이 빠진 작은 단편을 추출하지 마세요. 다음의 형식으로 JSON 형식으로 출력을 제공하세요:

[{"축삭물": "..."},
...
{"축삭물": "..."}]

// 사용자 메시지
"""<여기에 문서를 삽입하세요>"""

// 어시스턴트 메시지
[{"축삭물": "모델이 여기에 축삭물을 작성합니다"},
...
{"축삭물": "모델이 다른 축삭물을 여기에 작성합니다"}]

// 사용자 메시지
더 많은 관련 축삭물이 있나요? 축복을 반복하지 않도록 주의하세요. 또한 축삭물이 해석하는 데 필요한 모든 관련 맥락이 포함되도록 하세요 - 다시 말해 중요한 맥락이 빠진 작은 단편을 추출하지 마세요.

전략: 외부 도구 사용

전술: 임베딩 기반 검색 활용하여 효율적인 지식 검색 구현

모델은 입력의 일부로 제공될 경우 외부 정보를 활용할 수 있습니다. 이를 통해 모델은 더 많은 정보를 활용하여 보다 더 정보가 풍부하고 최신의 응답을 생성할 수 있습니다. 예를 들어 사용자가 특정 영화에 관한 질문을 할 경우, 영화에 대한 고품질 정보(예: 배우, 감독 등)를 모델의 입력에 추가하는 것이 유용할 수 있습니다. 임베딩을 사용하여 효율적인 지식 검색을 구현할 수 있어서 실행 시에 관련 정보를 모델 입력에 동적으로 추가할 수 있습니다.

텍스트 임베딩은 텍스트 문자열 간의 관련성을 측정할 수 있는 벡터입니다. 유사하거나 관련된 문자열은 관련이 없는 문자열보다 가까이 위치합니다. 이 사실과 빠른 벡터 검색 알고리즘의 존재로 임베딩은 효율적인 지식 검색을 구현하는 데 사용될 수 있습니다. 특히 텍스트 말뭉치는 청크로 분할되고 각 청크는 임베딩되어 저장될 수 있습니다. 그런 다음 특정 쿼리가 임베딩되고 벡터 검색이 수행되어 쿼리와 가장 관련된 말뭉치의 임베딩 청크를 찾을 수 있습니다(즉, 임베딩 공간에서 서로 가장 가까이 위치한 것).

전술: 코드 실행을 통해 보다 정확한 계산 또는 외부 API 호출 수행

언어 모델은 스스로 정확하게 산술이나 긴 계산을 수행하는 데 의존해서는 안 됩니다. 이런 경우에는 모델에게 자체 계산을 수행하는 대신 코드를 작성하고 실행하도록 지시할 수 있습니다. 특히 모델에게 실행할 코드를 삼중 역따옴표와 같은 지정된 형식으로 넣도록 지시할 수 있습니다. 출력이 생성된 후 코드를 추출하고 실행할 수 있습니다. 마지막으로 필요한 경우, 코드 실행 엔진(즉, Python 해석기)에서의 출력을 다음 쿼리를 위한 모델 입력으로 제공할 수 있습니다.

// 시스템 메시지

여러분은 삼중 역따옴표로 Python 코드를 작성하고 실행할 수 있습니다. 예: ```코드를 입력하세요```. 이를 사용하여 계산을 수행하세요.

// 사용자 메시지

다음 다항식의 모든 실수 근을 찾아주세요: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.

코드 실행의 또 다른 좋은 사용 사례는 외부 API를 호출하는 것입니다. 모델이 API의 올바른 사용법에 대해 지시를 받으면, 해당 API를 활용하는 코드를 작성할 수 있습니다. 모델에게 API의 사용 방법에 대한 설명서 및/또는 코드 샘플을 제공하여 API를 사용하는 방법을 지시할 수 있습니다.

// 시스템 메시지

여러분은 삼중 역따옴표로 Python 코드를 작성하고 실행할 수 있습니다. 또한 다음 모듈을 사용하여 친구에게 메시지를 보낼 수 있습니다:

\`\`\`python
import message
message.write(to="John", message="안녕, 일 끝나고 만나자!)\`\`\`

경고: 모델이 생성한 코드를 실행하는 것은 본질적으로 안전하지 않으며, 이에 대한 조심이 필요합니다. 특히, 믿을 수 없는 코드가 일으킬 수 있는 피해를 제한하기 위해 격리된 코드 실행 환경이 필요합니다.

전술: 모델에게 특정 함수에 대한 액세스 권한 부여

채팅 완성 API를 통해 요청에 함수 설명 목록을 전달할 수 있습니다. 이를 통해 모델은 제공된 스키마에 따라 함수 인수를 생성할 수 있습니다. 생성된 함수 인수는 API에서 JSON 형식으로 반환되며 함수 호출을 실행하는 데 사용할 수 있습니다. 함수 호출에서 제공된 출력은 다음 요청에 모델로 다시 제공되어 루프를 닫을 수 있습니다. 이것은 외부 기능을 호출하기 위한 OpenAI 모델의 권장 방법입니다.

전략: 체계적으로 변화를 테스트하자

시스템이 더 좋아졌는지 아니면 더 나빠졌는지를 가려내는 것은 가끔 어려울 수 있습니다. 새로운 지침이나 새로운 디자인과 같은 변화가 어느 쪽이 더 좋은지 암시해주는 몇 가지 예시를 살펴봐도, 샘플 크기가 작을 경우 실제로 개선되었는지 아니면 운이 좋았는지를 구분하는 것은 어려울 수 있습니다. 어떤 변화는 몇 가지 입력에서 성능을 향상시킬 수 있지만, 다른 입력에서는 성능을 저하시킬 수도 있습니다.

평가 절차(또는 "평가")는 시스템 설계를 최적화하는 데 유용합니다. 좋은 평가는 다음과 같습니다:

  • 실제 사용 예를 대표적으로 다루는 (또는 다양성 있는)
  • 통계적 파워를 높이기 위해 많은 테스트 케이스를 포함하는 (가이드라인은 아래 표 참조)
  • 자동화하거나 반복하기 쉬운
감지할 차이 95% 신뢰 수준에 필요한 샘플 크기
30% ~10
10% ~100
3% ~1,000
1% ~10,000

컴퓨터, 인간, 또는 혼합으로 평가 출력을 수행할 수 있습니다. 컴퓨터는 객관적 기준(예: 단일 올바른 답변이 있는 질문)으로 평가를 자동화할 수 있으며, 어떤 주관적이거나 모호한 기준들도 평가할 수 있습니다. 이 경우 모델 출력은 다른 모델 쿼리에 의해 평가됩니다. OpenAI Evals는 자동화된 평가를 생성하기 위한 도구를 제공하는 오픈소스 소프트웨어 프레임워크입니다.

모델 기반 평가는 질문에 긴 답변이 필요한 경우와 같이 동등한 수준의 출력 범위가 있는 경우 유용할 수 있습니다. 모델 기반 평가와 모델을 평가하는 데 인간이 필요한 구분은 모호하며, 모델이 더 능력이 높아질수록 변화합니다. 귀하의 사용 사례에 모델 기반 평가가 얼마나 잘 작동하는지 알아내기 위해 실험을 장려합니다.

전략: 골드 표준 답변에 대한 모델 출력 평가

특정 질문에 대한 올바른 답변이 특정 알려진 사실을 참조해야 한다고 가정하면, 우리는 모델 쿼리를 사용하여 필요한 사실 중 얼마나 많은 부분이 답변에 포함되어 있는지 세어볼 수 있습니다.

예를 들어, 다음과 같은 시스템 메시지를 사용합니다:

// 시스템 메시지
삼중 따옴표로 구분된 텍스트가 주어지고, 이 텍스트가 특정 질문에 대한 답변이라고 가정합니다. 다음 정보가 답변에 직접 포함되어 있는지 확인하십시오:

- Neil Armstrong은 달에 처음으로 걸어간 사람이었습니다.
- Neil Armstrong이 달에 처음으로 걸어간 날짜는 1969년 7월 21일입니다.

각각의 포인트에 대해 다음 단계를 수행하십시오:

1 - 포인트를 다시 설명합니다.
2 - 이 포인트와 가장 가까운 답변에서 인용을 제공합니다.
3 - 해당 지식이 없는 사람도 이 인용을 읽고 해당 포인트를 직접 추론할 수 있는지 여부를 고려하십시오. 이유를 설명한 후에 결론을 내리십시오.
4 - 3번 질문에 대한 답이 "예"라면 "예", 그렇지 않다면 "아니오"라고 작성하십시오.

마지막으로 "예" 답변이 몇 개인지 세어줍니다. 이 개수를 다음과 같이 제공하십시오: {"count": <여기에 개수 삽입>}

여기에 두 가지 포인트가 모두 충족되는 예제 입력이 있습니다:

// 시스템 메시지
<상기 시스템 메시지 삽입>

// 사용자 메시지
"""Neil Armstrong은 달에 처음으로 발을 디뎠다는 것으로 유명합니다. 이 역사적인 사건은 1969년 7월 21일, 아폴로 11 임무 중에 일어났습니다."""

여기에 하나의 포인트만 충족되는 예제 입력이 있습니다:

// 시스템 메시지

<상기 시스템 메시지 삽입>

// 사용자 메시지

"""Neil Armstrong은 두 번째로 달에 걸어든 사람이 되어 역사를 썼습니다."""

모든 내용이 충족되지 않는 예제 입력이 있습니다:

// 시스템 메시지

<상기 시스템 메시지 삽입>

// 사용자 메시지

"""69년 여름, 위대한 항해가 있었네,
아폴로 11, 전설처럼 대담했네.
아름다운 신기록 역사를 펼쳐놨네,
"새로운 세계를 위해," 그 말이었네."""

이 유형의 모델 기반 평가에는 많은 변형이 있을 수 있습니다. 후보 답변과 골드 표준 답변 사이의 종류를 추적하고 후보 답변이 골드 표준 답변의 어떤 부분과도 모순되지 않는지 추적하는 다음 변형을 고려하십시오.

// 시스템 메시지
사용자 입력에 대해 다음 단계를 사용하여 응답하십시오. 진행하기 전에 각 단계를 완전히 재설명하십시오. 즉, "단계 1: ...".

단계 1: 제출된 답변의 정보가 전문가 답변과 비교했을 때 서로 겹치지 않거나 같거나, 부분집합 또는 포함집합, 또는 겹치지만 부분집합/포함집합이 아닌 경우에 대해 단계별로 이유를 설명하십시오.

단계 2: 제출된 답변이 전문가 답변의 어떤 측면과도 모순되는지 단계별로 이유를 설명하십시오.

단계 3: 다음과 같은 구조의 JSON 객체를 출력하십시오: {"type_of_overlap": "중복되지 않음" 또는 "동일" 또는 "부분집합" 또는 "포함집합" 또는 "겹침", "모순": 참 또는 거짓}

전문가 답변과 모순되지 않지만 품질이 떨어지는 답변이 있는 예제 입력이 있습니다:

// 시스템 메시지

<상기 시스템 메시지 삽입>

// 사용자 메시지

질문: """Neil Armstrong은 무엇으로 가장 유명하며 어느 날에 그것이 발생했나요? 세계 표준시로 가정합니다."""

제출된 답변: """그는 뭔가 달에 걸어다닌 거 아니야?"""

전문가 답변: """Neil Armstrong은 달에 처음으로 걸어간 사람으로 가장 유명합니다. 이 역사적인 사건은 1969년 7월 21일에 발생했습니다."""

전문가 답변과 직접 모순되는 답변이 있는 예제 입력이 있습니다:

// 시스템 메시지

<상기 시스템 메시지 삽입>

// 사용자 메시지
질문: """Neil Armstrong은 무엇으로 가장 유명하며 어느 날에 그것이 발생했나요? 세계 표준시로 가정합니다."""

제출된 답변: """1969년 7월 21일에, 버즈 오우든에 이은 두 번째로 달에 걸어다니는 인간이 된 날입니다."""

전문가 답변: """Neil Armstrong은 달에 처음으로 걸어간 사람으로 가장 유명합니다. 이 역사적인 사건은 1969년 7월 21일에 발생했습니다."""

필요 이상의 세부 정보를 제공하면서 올바른 답변이 주어진 예제 입력이 있습니다:

// 시스템 메시지
<위에 시스템 메시지 삽입>

// 사용자 메시지

질문: """Neil Armstrong이 가장 유명한 이벤트는 무엇이며 어느 날에 발생했나요? 세계 표준시(UTC)로 가정합니다."""

제출한 답변: """대략 1969년 7월 21일 02:56 UTC에, Neil Armstrong은 달 표면에 처음으로 발을 디뎠으며, 이는 인류 역사상 거대한 성취를 표시했습니다."""

전문가 답변: """Neil Armstrong은 달에 처음으로 걸어간 사람으로 가장 유명합니다. 이 역사적인 사건은 1969년 7월 21일에 발생했습니다."""