OpenAI에서 GPT 모델을 잘 활용하기 위한 프롬프트 가이드를 공개 하였다. GPT 모델을 사용할 때 답변이 이상하거나 나만 GPT를 잘 활용하지 못하고 있는 것 같다면 프롬프트 가이드를 보고 질문 방법을 바꿔보는 것도 좋은 생각으로 보인다. 이 프롬프트 엔지니어링이 GPT 모델에만 효과적인 것이 아니라 다른 대화형 모델에도 좋은지 테스트 해보는 것도 재미있는 실험이 될 것 같다.
원문: Prompt engineering - OpenAI API
이 가이드에서는 GPT-4와 같은 대규모 언어 모델(GPT 모델이라고도 함)에서 더 나은 결과를 얻기 위한 전략과 전술을 공유합니다. 여기에 설명된 방법은 더 큰 효과를 위해 조합하여 배포할 수도 있습니다. 귀하에게 가장 적합한 방법을 찾기 위해 실험을 권장합니다.
여기에 설명된 일부 예는 현재 가장 유능한 모델인 gpt-4에서만 작동합니다. 일반적으로 모델이 처리에 실패하거나 더 성능이 뛰어난 모델을 사용할 수 있는 경우 더 유능한 모델로 다시 시도할 가치가 있는 경우가 많습니다.
또한 모델의 기능을 보여주는 예시 프롬프트를 탐색할 수도 있습니다.
더 나은 결과를 얻기 위한 6가지 전략
1. 명확한 지침을 작성하세요
이 모델은 당신의 마음을 읽을 수 없습니다. 출력 내용이 너무 길면 간단한 답변을 요청하세요. 출력이 너무 단순하다면 전문가 수준의 글쓰기를 요청하고, 형식이 마음에 들지 않으면 보고 싶은 형식을 보여주세요. 모델이 원하는 것을 추측하는 횟수가 적을수록 원하는 것을 얻을 가능성이 높아집니다.
전술:
- 더 관련성이 높은 답변을 얻으려면 쿼리에 세부정보를 포함하세요.
- 모델에게 페르소나 채택을 요청하세요.
- 구분 기호를 사용하여 입력의 개별 부분을 명확하게 나타내세요.
- 작업을 완료하는 데 필요한 단계를 지정하세요.
- 예시를 제공하세요.
- 원하는 출력 길이를 지정하세요.
2. 참조 텍스트를 제공하세요
언어 모델은 특히 난해한 주제나 인용 및 URL에 대한 질문을 받을 때 자신 있게 가짜 답변을 만들어낼 수 있습니다. 노트가 학생의 시험 성적을 높이는 데 도움이 되는 것과 마찬가지로 이러한 모델에 참조 텍스트를 제공하면 더 적은 수의 입력에도 답변하는 데 도움이 될 수 있습니다.
전술:
3. 복잡한 작업을 더 간단한 하위 작업으로 분할하세요
복잡한 시스템을 일련의 모듈식 구성 요소로 분해하는 것이 소프트웨어 엔지니어링에서 좋은 관행인 것처럼 언어 모델에 제출된 작업도 마찬가지입니다. 복잡한 작업은 단순한 작업보다 오류율이 더 높은 경향이 있습니다. 더욱이, 복잡한 작업은 종종 이전 작업의 출력을 사용하여 이후 작업에 대한 입력을 구성하는 간단한 작업의 절차로 재정의될 수 있습니다.
전술:
- 의도 분류 (Intent classification)를 사용하여 사용자 쿼리와 가장 관련성이 높은 지침을 식별하세요.
- 매우 긴 대화가 필요한 대화 애플리케이션의 경우 이전 대화를 요약하거나 필터링 하세요.
- 긴 문서를 부분적으로 요약하고 재귀적으로 전체 요약을 구성하세요.
4. 모델에게 "생각"할 시간을 주세요
17에 28을 곱하라고 하면 즉시 알지 못할 수도 있지만 시간이 지나면 해결할 수 있습니다. 마찬가지로, 모델은 답변을 찾는 데 시간을 들이기보다는 즉시 답변하려고 할 때 더 많은 추론 오류를 범합니다. 대답하기 전에 "생각의 사슬"을 요청하면 모델이 정답을 향해 더 확실하게 추론하는 데 도움이 될 수 있습니다.
전술:
- 성급하게 결론을 내리기 전에 모델에게 자체 솔루션을 찾도록 지시하세요.
- 내부 독백이나 일련의 쿼리를 사용하여 모델의 추론 프로세스를 숨기세요.
- 이전 패스에서 누락된 것이 있는지 모델에게 물어보세요.
5. 외부 도구를 사용하세요
다른 도구의 출력을 모델에 공급하여 모델의 약점을 보완합니다. 예를 들어, 텍스트 검색 시스템 (RAG 또는 검색 증강 생성이라고도 함)은 모델에 관련 문서에 대해 알려줄 수 있습니다. OpenAI의 Code Interpreter와 같은 코드 실행 엔진은 모델이 수학을 수행하고 코드를 실행하는 데 도움을 줄 수 있습니다. 언어 모델이 아닌 도구를 사용하여 작업을 더 안정적이고 효율적으로 수행할 수 있는 경우 해당 작업을 모델로만 해결하려 하지 말고 두 가지 모두를 최대한 활용하세요.
전술:
- 임베딩 기반 검색을 사용하여 효율적인 지식 검색을 구현하세요.
- 코드를 실행하여 보다 정확한 계산을 수행하거나 외부 API를 호출하세요.
- 모델에 특정 기능에 대한 액세스 권한을 부여하세요.
6. 변경 사항을 체계적으로 테스트하세요
측정할 수 있으면 성능을 개선하는 것이 더 쉽습니다. 경우에 따라 프롬프트를 수정하면 몇 가지 제한된 예제에서는 더 나은 성능을 얻을 수 있지만 보다 대표적인 예제 집합에서는 전반적인 성능이 저하될 수 있습니다. 따라서 변경 사항이 성능에 긍정적인지 확인하려면 포괄적인 테스트 모음("평가"라고도 함)을 정의해야 할 수도 있습니다.
전술:
전술
위에 나열된 각 전략은 특정 전술로 예시될 수 있습니다. 이러한 전술은 시도해 볼 만한 아이디어를 제공하기 위한 것입니다. 이는 완전히 포괄적인 것은 아니며 여기에 제시되지 않은 창의적인 아이디어를 자유롭게 시도해 볼 수 있습니다.
1. 전략: 명확한 지침을 작성하세요
전술: 더 관련성이 높은 답변을 얻으려면 쿼리에 세부정보를 포함하세요.
관련성이 높은 응답을 얻으려면 요청이 중요한 세부 정보나 컨텍스트를 제공하는지 확인하세요. 그렇지 않으면 의미하는 바를 추측하기 위해 모델에 맡기게 됩니다.
나쁜 예 | 좋은 예 |
Excel에서 숫자를 어떻게 추가하나요? | Excel에서 달러 금액 행을 어떻게 합산하나요? "Total"이라는 열의 오른쪽에 모든 합계가 끝나는 전체 행 시트에 대해 이 작업을 자동으로 수행하고 싶습니다. |
대통령은 누구입니까? | 2021년 멕시코 대통령은 누구였으며, 선거는 얼마나 자주 치러지나요? |
피보나치 수열을 계산하는 코드를 작성하세요. | 피보나치 수열을 효율적으로 계산하는 TypeScript 함수를 작성하세요. 코드에 자유롭게 주석을 달아 각 부분이 무엇을 하는지, 왜 그렇게 작성되었는지 설명하세요. |
회의록을 요약하세요. | 회의록을 한 문단으로 요약하세요. 그런 다음 발표자와 각 핵심 사항에 대한 마크다운 목록을 작성합니다. 마지막으로, 발표자가 제안한 다음 단계나 실행 항목이 있으면 나열하세요. |
전술: 모델에게 페르소나 채택을 요청하세요.
시스템 메시지는 응답에서 모델이 사용하는 페르소나를 지정하는 데 사용될 수 있습니다.
SYSTEM | 내가 글을 쓰기 위해 도움을 요청하면, 당신은 모든 문단에 적어도 하나의 농담이나 장난스러운 코멘트가 포함된 문서로 답장을 보낼 것입니다. |
USER | 짧은 시간 안에 배송을 완료한 강철 볼트 공급업체에 감사 편지를 작성하세요. 이를 통해 우리는 중요한 주문을 전달할 수 있었습니다. |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
전술: 구분 기호를 사용하여 입력의 개별 부분을 명확하게 나타내세요.
삼중 따옴표, XML 태그, 섹션 제목 등과 같은 구분 기호는 다르게 처리될 텍스트 섹션을 구분하는 데 도움이 될 수 있습니다.
SYSTEM | haiku를 사용하여 삼중따옴표로 구분된 텍스트를 요약합니다. |
USER | """여기에 텍스트를 삽입하세요""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
SYSTEM | 동일한 주제에 대한 한 쌍의 기사(XML 태그로 구분됨)가 제공됩니다. 먼저 각 기사의 주장을 요약해 보세요. 그런 다음 그들 중 어느 것이 더 나은 주장인지 표시하고 그 이유를 설명하십시오. |
USER | <article> 여기에 첫 번째 기사를 삽입하세요 </article> <article> 여기에 두 번째 기사를 삽입하세요 </article> |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
SYSTEM | 논문 초록과 추천 제목이 제공됩니다. 논문 제목은 독자에게 논문 주제에 대한 좋은 아이디어를 제공하면서 시선을 사로잡아야 합니다. 제목이 이러한 기준을 충족하지 않는 경우 5가지 대안을 제안하세요. |
USER | 초록: 여기에 초록을 삽입하세요. 제목: 여기에 제목을 삽입하세요 |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
이와 같은 간단한 작업의 경우 구분 기호를 사용해도 출력 품질에 차이가 없을 수 있습니다. 그러나 작업이 복잡할수록 작업 세부 사항을 명확하게 하는 것이 더 중요합니다. 당신이 그들에게 요구하는 것을 정확하게 이해하기 위해 모델이 작동하도록 만들지 마십시오.
전술: 작업을 완료하는 데 필요한 단계를 지정하세요.
일부 작업은 일련의 단계로 지정하는 것이 가장 좋습니다. 단계를 명시적으로 작성하면 모델이 단계를 더 쉽게 따라갈 수 있습니다.
SYSTEM | 사용자 입력에 응답하려면 다음 단계별 지침을 따르십시오. 1단계 - 사용자는 삼중따옴표로 묶인 텍스트를 제공합니다. "요약: "이라는 접두어를 사용하여 이 텍스트를 한 문장으로 요약합니다. 2단계 - 1단계의 요약을 "번역: "이라는 접두어를 사용하여 스페인어로 번역합니다. |
USER | """여기에 텍스트를 삽입하세요""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
전술: 예시를 제공하세요.
모든 예에 적용되는 일반 지침을 제공하는 것은 일반적으로 예를 통해 작업의 모든 순열을 보여주는 것보다 더 효율적이지만, 경우에 따라 예를 제공하는 것이 더 쉬울 수도 있습니다. 예를 들어 명시적으로 설명하기 어려운 사용자 쿼리에 응답하는 특정 스타일을 모델에서 복사하려는 경우입니다. 이를 "few-shot" 프롬프트라고 합니다.
SYSTEM | 일관된 스타일로 대답하세요. |
USER | 인내심을 가르쳐 주세요. |
ASSISTANT | 가장 깊은 계곡을 만드는 강은 적당한 샘에서 흘러나온다. 가장 장엄한 교향곡은 단 하나의 음표에서 비롯됩니다. 가장 복잡한 태피스트리는 하나의 실에서 시작됩니다. |
USER | 바다에 대해 가르쳐 주세요. |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
전술: 원하는 출력 길이를 지정하세요.
주어진 목표 길이의 출력을 생성하도록 모델에 요청할 수 있습니다. 목표 출력 길이는 단어, 문장, 단락, 글머리 기호 개수 등을 기준으로 지정할 수 있습니다. 그러나 특정 수의 단어를 생성하도록 모델에 지시하는 것은 높은 정밀도로 작동하지 않습니다. 모델은 특정 수의 단락 또는 글머리 기호가 포함된 출력을 보다 안정적으로 생성할 수 있습니다.
USER | 삼중따옴표로 구분하여 텍스트를 약 50단어로 요약합니다. """여기에 텍스트를 삽입하세요""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
USER | 삼중따옴표로 구분하여 2문단으로 텍스트를 요약하세요. """여기에 텍스트를 삽입하세요""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
USER | 3개의 글머리 기호로 삼중따옴표로 구분된 텍스트를 요약합니다. """여기에 텍스트를 삽입하세요""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
2. 전략: 참조 텍스트를 제공하세요
전술: 참조 텍스트를 사용하여 응답하도록 모델에 지시하세요.
현재 쿼리와 관련된 신뢰할 수 있는 정보를 모델에 제공할 수 있다면 제공된 정보를 사용하여 답변을 구성하도록 모델에 지시할 수 있습니다.
SYSTEM | 질문에 답하려면 삼중따옴표로 구분된 제공된 기사를 사용하세요. 기사에서 답변을 찾을 수 없는 경우 "답변을 찾을 수 없습니다."라고 기재하세요. |
USER | <기사 삽입(각각 삼중따옴표로 구분)> 질문: <여기에 질문 삽입> |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
모든 모델에는 제한된 컨텍스트 창이 있으므로 질문과 관련된 정보를 동적으로 조회할 수 있는 방법이 필요합니다. 임베딩을 사용하여 효율적인 지식 검색을 구현할 수 있습니다. 이를 구현하는 방법에 대한 자세한 내용은 "임베딩 기반 검색을 사용하여 효율적인 지식 검색 구현" 전술을 참조하세요.
전술: 참조 텍스트의 인용으로 답변하도록 모델에 지시하세요.
입력이 관련 지식으로 보완된 경우 제공된 문서의 구절을 참조하여 답변에 인용을 추가하도록 모델에 요청하는 것은 간단합니다. 그러면 출력의 인용은 제공된 문서 내의 문자열 일치를 통해 프로그래밍 방식으로 확인할 수 있습니다.
SYSTEM | 세 개의 따옴표로 구분된 문서와 질문이 제공됩니다. 귀하의 임무는 제공된 문서만을 사용하여 질문에 답하고 질문에 답하는 데 사용된 문서의 구절을 인용하는 것입니다. 문서에 이 질문에 답하는 데 필요한 정보가 포함되어 있지 않으면 "정보가 부족합니다."라고 적으십시오. 질문에 대한 답변이 제공되면 인용 주석을 달아야 합니다. 관련 구절을 인용하려면 다음 형식을 사용하십시오({"citation": …}). |
USER | """<여기에 문서 삽입>""" 질문: <여기에 질문 삽입> |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
3. 전략: 복잡한 작업을 더 간단한 하위 작업으로 분할하세요
전술: 의도 분류 (Intent classification)를 사용하여 사용자 쿼리와 가장 관련성이 높은 지침을 식별하세요.
다양한 사례를 처리하기 위해 많은 독립적인 지침 세트가 필요한 작업의 경우 먼저 쿼리 유형을 분류하고 해당 분류를 사용하여 필요한 지침을 결정하는 것이 도움이 될 수 있습니다. 이는 특정 범주의 작업 처리와 관련된 고정 범주 및 하드코딩 지침을 정의하여 달성할 수 있습니다. 이 프로세스는 작업을 일련의 단계로 분해하기 위해 재귀적으로 적용될 수도 있습니다. 이 접근 방식의 장점은 각 쿼리에 작업의 다음 단계를 수행하는 데 필요한 지침만 포함되므로 단일 쿼리를 사용하여 전체 작업을 수행하는 것에 비해 오류율이 낮아질 수 있다는 것입니다. 프롬프트가 클수록 실행 비용이 더 많이 들기 때문에 비용이 절감될 수도 있습니다(가격 정보 참조).
예를 들어 고객 서비스 애플리케이션의 경우 쿼리를 다음과 같이 유용하게 분류할 수 있다고 가정해 보겠습니다.
SYSTEM | 고객 서비스 문의 사항이 제공됩니다. 각 쿼리를 기본 카테고리와 보조 카테고리로 분류합니다. 기본 및 보조 키를 사용하여 json 형식으로 출력을 제공합니다. 기본 카테고리: 결제, 기술 지원, 계정 관리 또는 일반 문의. 결제 보조 카테고리: - 구독 취소 또는 업그레이드 - 결제 수단 추가 - 요금 설명 - 청구에 대한 이의 제기 기술 지원 보조 카테고리: - 문제 해결 - 장치 호환성 - 소프트웨어 업데이트 계정 관리 보조 카테고리: - 비밀번호 초기화 - 개인정보 업데이트 - 계정 해지 - 계정 보안 일반 문의 보조 카테고리: - 제품정보 - 가격 - 피드백 - 상담원과 대화 |
USER | 인터넷을 다시 작동시켜야 해요. |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
고객 문의 분류에 따라 모델이 다음 단계를 처리할 수 있도록 보다 구체적인 지침 세트를 제공할 수 있습니다. 예를 들어, 고객이 "문제 해결"에 대한 도움을 필요로 한다고 가정해 보겠습니다.
SYSTEM | 기술 지원 맥락에서 문제 해결이 필요한 고객 서비스 문의가 제공됩니다. 다음과 같이 사용자를 도와주세요. - 라우터와 라우터 사이의 모든 케이블이 연결되어 있는지 확인하도록 요청하세요. 시간이 지남에 따라 케이블이 느슨해지는 것은 흔한 일입니다. - 모든 케이블이 연결되어 있는데도 문제가 지속되면 어떤 라우터 모델을 사용하고 있는지 물어보세요. - 이제 기기를 다시 시작하는 방법을 알려줄 것입니다. -- 모델 번호가 MTD-327J인 경우 빨간색 버튼을 5초 동안 누른 후 5분 정도 기다린 후 연결을 테스트하라고 안내합니다. -- 모델 번호가 MTD-327S인 경우 플러그를 뽑았다가 다시 연결한 다음 5분 정도 기다린 후 연결을 테스트하도록 안내합니다. - 기기를 다시 시작하고 5분 동안 기다린 후에도 고객의 문제가 지속되면 {"IT 지원 요청됨"}을 출력하여 IT 지원팀에 연결하세요. - 사용자가 이 주제와 관련 없는 질문을 하기 시작하면 문제 해결에 대한 현재 채팅을 종료할지 확인하고 다음 구성표에 따라 요청을 분류합니다. <여기에 위의 1차/2차 분류 체계 삽입> |
USER | 인터넷을 다시 작동시켜야 해요. |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
모델은 대화 상태가 변경되는 시기를 나타내기 위해 특수 문자열을 내보내도록 지시받았습니다. 이를 통해 시스템을 상태에 따라 주입되는 명령이 결정되는 상태 머신으로 전환할 수 있습니다. 해당 상태와 관련된 명령 및 선택적으로 해당 상태에서 허용되는 상태 전환을 추적함으로써 덜 구조화된 접근 방식으로는 달성하기 어려운 사용자 경험을 제공할 수 있습니다.
전술: 매우 긴 대화가 필요한 대화 애플리케이션의 경우 이전 대화를 요약하거나 필터링 하세요.
모델은 컨텍스트 길이가 고정되어 있기 때문에 컨텍스트 창에 전체 대화가 포함되는 사용자와 어시스턴트 간의 대화가 무한정 지속될 수는 없습니다.
이 문제에 대한 다양한 해결 방법이 있으며 그 중 하나는 대화의 이전 차례를 요약하는 것입니다. 입력 크기가 미리 결정된 임계 길이에 도달하면 대화의 일부를 요약하는 쿼리가 트리거될 수 있으며 이전 대화의 요약이 시스템 메시지의 일부로 포함될 수 있습니다. 또는 이전 대화가 전체 대화 전반에 걸쳐 백그라운드에서 비동기적으로 요약될 수 있습니다.
대체 솔루션은 현재 쿼리와 가장 관련성이 높은 대화의 이전 부분을 동적으로 선택하는 것입니다. "임베딩 기반 검색을 사용하여 효율적인 지식 검색 구현" 전술을 참조하세요.
전술: 긴 문서를 부분적으로 요약하고 재귀적으로 전체 요약을 구성하세요.
모델은 고정된 컨텍스트 길이를 가지므로 단일 쿼리에서 생성된 요약의 길이를 뺀 컨텍스트 길이보다 긴 텍스트를 요약하는 데 사용할 수 없습니다.
책과 같이 매우 긴 문서를 요약하려면 일련의 쿼리를 사용하여 문서의 각 섹션을 요약할 수 있습니다. 섹션 요약을 연결하고 요약하여 요약의 요약을 생성할 수 있습니다. 이 프로세스는 전체 문서가 요약될 때까지 반복적으로 진행될 수 있습니다. 이후 섹션을 이해하기 위해 이전 섹션에 대한 정보를 사용해야 하는 경우, 책의 특정 지점 앞에 있는 텍스트의 연속 요약을 포함하는 동시에 해당 지점의 내용을 요약하는 것이 유용할 수 있는 추가 방법입니다. 책을 요약하기 위한 이 절차의 효율성은 GPT-3의 변형을 사용하는 OpenAI의 이전 연구에서 연구 되었습니다.
4. 전략: 모델에게 "생각"할 시간을 주세요
전술: 성급하게 결론을 내리기 전에 모델에게 자체 솔루션을 찾도록 지시하세요.
때로는 결론에 도달하기 전에 첫 번째 원칙을 토대로 추론하도록 모델에 명시적으로 지시할 때 더 나은 결과를 얻을 수도 있습니다. 예를 들어 수학 문제에 대한 학생의 해결책을 평가하는 모델을 원한다고 가정해 보겠습니다. 이에 접근하는 가장 확실한 방법은 단순히 모델에게 학생의 해법이 올바른지 물어보는 것입니다.
SYSTEM | 학생의 해결 방법이 올바른지 확인하십시오. |
USER | 문제 설명: 저는 태양광 발전소를 건설하고 있는데 재정 문제를 해결하는 데 도움이 필요합니다. - 토지 비용 $100/평방피트 - 평방피트당 250달러에 태양광 패널을 구입할 수 있습니다. - 연간 고정 $100,000의 비용과 평방피트당 $10의 추가 비용이 드는 유지 관리 계약을 협상했습니다. 평방피트 수에 따른 운영 첫 해의 총 비용은 얼마입니까? 학생의 해결 방법: x를 설치 면적(평방 피트)이라고 하겠습니다. 1. 토지 비용: 100x 2. 태양광 패널 비용: 250x 3. 유지비 : 100,000 + 100x 총 비용: 100x + 250x + 100,000 + 100x = 450x + 100,000 |
ASSISTANT | 학생의 답이 맞습니다. |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
하지만 학생의 해법은 실제로는 옳지 않습니다! 모델이 먼저 자체 솔루션을 생성하도록 유도하여 모델이 이를 성공적으로 인식하도록 할 수 있습니다.
SYSTEM | 먼저 문제에 대한 자신만의 해결책을 찾아보세요. 그런 다음 여러분의 해법을 학생의 해법과 비교하고 학생의 해법이 올바른지 평가해 보세요. 문제를 직접 해결하기 전에는 학생의 해결책이 올바른지 결정하지 마십시오. |
USER | 문제 설명: 저는 태양광 발전소를 건설하고 있는데 재정 문제를 해결하는 데 도움이 필요합니다. - 토지 비용 $100/평방피트 - 평방피트당 250달러에 태양광 패널을 구입할 수 있습니다. - 연간 고정 $100,000의 비용과 평방피트당 $10의 추가 비용이 드는 유지 관리 계약을 협상했습니다. 평방피트 수에 따른 운영 첫 해의 총 비용은 얼마입니까? 학생의 해결 방법: x를 설치 면적(평방피트)이라고 하겠습니다. 1. 토지 비용: 100x 2. 태양광 패널 비용: 250x 3. 유지비 : 100,000 + 100x 총 비용: 100x + 250x + 100,000 + 100x = 450x + 100,000 |
ASSISTANT | x를 평방 피트 단위의 설치 크기로 설정합니다. 1. 토지 비용: 100x 2. 태양광 패널 비용: 250x 3. 유지비 : 100,000 + 10x 총 비용: 100x + 250x + 100,000 + 10x = 360x + 100,000 학생의 답이 틀렸습니다. 그들은 10x 대신 100x를 사용하여 유지 관리 비용 계산에 오류를 범했습니다. 운영 첫해의 정확한 총 비용은 360x + 100,000입니다. |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
전술: 내부 독백이나 일련의 쿼리를 사용하여 모델의 추론 프로세스를 숨기세요.
이전 전략은 모델이 특정 질문에 대답하기 전에 문제에 대해 자세히 추론하는 것이 때로는 중요하다는 것을 보여줍니다. 일부 애플리케이션의 경우 모델이 최종 답변에 도달하기 위해 사용하는 추론 프로세스는 사용자와 공유하기에 부적절합니다. 예를 들어, 개인교습 애플리케이션에서 우리는 학생들이 스스로 답을 찾도록 격려하고 싶을 수 있지만, 학생의 솔루션에 대한 모델의 추론 과정을 통해 학생에게 답이 공개될 수 있습니다.
내면의 독백은 이를 완화하는 데 사용할 수 있는 전술입니다. 내부 독백의 개념은 사용자에게 숨겨야 하는 출력 부분을 쉽게 구문 분석할 수 있는 구조화된 형식으로 배치하도록 모델에 지시하는 것입니다. 그런 다음 사용자에게 출력을 제공하기 전에 출력을 구문 분석하고 출력의 일부만 표시합니다.
SYSTEM | 사용자 쿼리에 응답하려면 다음 단계를 따르세요. 1단계 - 먼저 문제에 대한 자신만의 해결책을 찾아보세요. 학생의 해결책이 틀릴 수 있으므로 의존하지 마십시오. 이 단계의 모든 작업을 삼중따옴표(""")로 묶습니다. 2단계 - 학생의 솔루션과 자신의 솔루션을 비교하고 학생의 솔루션이 올바른지 평가합니다. 이 단계의 모든 작업을 삼중따옴표(""")로 묶습니다. 3단계 - 학생이 실수를 했다면 답을 표기하지 않고 학생에게 어떤 힌트를 줄 수 있는지 결정합니다. 이 단계의 모든 작업을 삼중따옴표(""")로 묶습니다. 4단계 - 학생이 실수한 경우 이전 단계의 힌트를 학생에게 제공합니다(삼중따옴표 제외). "4단계 - ..."라고 쓰는 대신 "힌트:"라고 쓰세요. |
USER | 문제 설명: <문제 설명 삽입> 학생 솔루션: <학생 솔루션 삽입> |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
또는 마지막 쿼리를 제외한 모든 쿼리의 출력이 최종 사용자에게 숨겨지는 일련의 쿼리를 사용하여 이를 수행할 수 있습니다.
첫째, 모델이 스스로 문제를 해결하도록 요청할 수 있습니다. 이 초기 질문에는 학생의 답이 필요하지 않으므로 생략할 수 있습니다. 이는 모델의 솔루션이 학생이 시도한 솔루션에 의해 편향될 가능성이 없다는 추가적인 이점을 제공합니다.
USER | <문제 설명 삽입> |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
다음으로, 모델이 사용 가능한 모든 정보를 사용하여 학생 솔루션의 정확성을 평가하도록 할 수 있습니다.
SYSTEM | 여러분의 해법을 학생의 해법과 비교하고 학생의 해법이 올바른지 평가해 보세요. |
USER | 문제 설명: """<문제 설명 삽입>""" 귀하의 솔루션: """<모델 생성 솔루션 삽입>""" 학생의 해결 방법: """<학생의 해결 방법 삽입>""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
마지막으로, 모델이 자체 분석을 사용하여 도움이 되는 교사의 모습으로 답변을 구성하도록 할 수 있습니다.
SYSTEM | 당신은 수학 교사입니다. 학생이 실수를 했다면 답이 드러나지 않는 방식으로 학생에게 힌트를 제공하십시오. 학생이 실수를 하지 않았다면 칭찬의 말을 해 주십시오. |
USER | 문제 설명: """<문제 설명 삽입>""" 귀하의 솔루션: """<모델 생성 솔루션 삽입>""" 학생의 해결 방법: """<학생의 해결 방법 삽입>""" 분석: """<이전 단계에서 생성된 분석 모델 삽입>""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
전술: 이전 패스에서 누락된 것이 있는지 모델에게 물어보세요.
특정 질문과 관련된 소스에서 발췌한 내용을 나열하기 위해 모델을 사용한다고 가정해 보겠습니다. 각 발췌문을 나열한 후 모델은 다른 내용을 쓰기 시작해야 할지 아니면 중단해야 할지 결정해야 합니다. 소스 문서가 큰 경우 모델이 너무 일찍 중지되어 관련 발췌문을 모두 나열하지 못하는 경우가 많습니다. 이 경우 후속 쿼리를 통해 모델에게 이전 단계에서 누락된 발췌 내용을 찾도록 하면 더 나은 성능을 얻을 수 있는 경우가 많습니다.
SYSTEM | 삼중따옴표로 구분된 문서가 제공됩니다. 귀하의 임무는 "인공지능의 역사에서 어떤 중요한 패러다임 변화가 일어났는가"라는 질문과 관련된 발췌문을 선택하는 것입니다. 발췌문에는 해석에 필요한 모든 관련 컨텍스트가 포함되어 있는지 확인하세요. 즉, 중요한 컨텍스트가 누락된 짧은 발췌문을 추출하지 마세요. 다음과 같이 JSON 형식으로 출력을 제공합니다. [{"발췌": "..."}, ... {"발췌": "..."}] |
USER | """<여기에 문서 삽입>""" |
ASSISTANT | [{"excerpt": "모델이 여기에 발췌문을 작성합니다"}, ... {"excerpt": "모델이 여기에 또 다른 발췌문을 작성합니다"}] |
USER | 더 관련성이 높은 발췌문이 있나요? 발췌 내용을 반복하지 않도록 주의하세요. 또한 발췌문에 해석에 필요한 모든 관련 컨텍스트가 포함되어 있는지 확인하십시오. 즉, 중요한 컨텍스트가 누락된 짧은 발췌문을 추출하지 마십시오. |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
5. 전략: 외부 도구를 사용하세요
전술: 임베딩 기반 검색을 사용하여 효율적인 지식 검색을 구현하세요.
모델은 입력의 일부로 제공되는 경우 외부 정보 소스를 활용할 수 있습니다. 이는 모델이 더 많은 정보를 바탕으로 최신 응답을 생성하는 데 도움이 될 수 있습니다. 예를 들어 사용자가 특정 영화에 대해 질문하는 경우 모델의 입력에 영화에 대한 고품질 정보(예: 배우, 감독 등)를 추가하는 것이 유용할 수 있습니다. 임베딩을 사용하면 효율적인 지식 검색을 구현하여 관련 정보를 런타임 시 모델 입력에 동적으로 추가할 수 있습니다.
텍스트 임베딩은 텍스트 문자열 간의 관련성을 측정할 수 있는 벡터입니다. 유사하거나 관련된 문자열은 관련되지 않은 문자열보다 서로 더 가깝습니다. 이 사실은 빠른 벡터 검색 알고리즘의 존재와 함께 임베딩을 사용하여 효율적인 지식 검색을 구현할 수 있음을 의미합니다. 특히, 말뭉치 (text corpus)를 여러 개의 조각로 분할하고, 각 조각을 내장하여 저장할 수 있습니다. 그런 다음 주어진 쿼리를 삽입하고 벡터 검색을 수행하여 쿼리와 가장 관련이 있는(즉, 삽입 공간에서 가장 가까운) 말뭉치에서 삽입된 텍스트 덩어리를 찾을 수 있습니다.
구현 예는 OpenAI Cookbook에서 찾을 수 있습니다. 모델이 잘못된 사실을 구성할 가능성을 최소화하기 위해 지식 검색을 사용하는 방법에 대한 예는 "참조 텍스트를 사용하여 응답하도록 모델에 지시" 전술을 참조하세요.
전술: 코드를 실행하여 보다 정확한 계산을 수행하거나 외부 API를 호출하세요.
언어 모델은 자체적으로 산술 계산이나 긴 계산을 정확하게 수행하는 데 적합하지 않습니다. 이것이 필요한 경우, 자체 계산을 수행하는 대신 코드를 작성하고 실행하도록 모델에 지시할 수 있습니다. 특히, 실행될 코드를 삼중 역따옴표 (triple backtick, ```)와 같은 지정된 형식으로 배치하도록 모델에 지시할 수 있습니다. 출력이 생성된 후 코드를 추출하여 실행할 수 있습니다. 마지막으로 필요한 경우 코드 실행 엔진(예: Python 인터프리터)의 출력을 다음 쿼리를 위한 모델의 입력으로 제공할 수 있습니다.
SYSTEM | Python 코드를 삼중 역따옴표로 묶어서 작성하고 실행할 수 있습니다. ```여기에 코드가 들어갑니다```. 이를 사용하여 계산을 수행합니다. |
USER | 다음 다항식의 모든 실수 근을 구합니다: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10. |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
코드 실행의 또 다른 좋은 사용 사례는 외부 API를 호출하는 것입니다. 모델에 API를 적절하게 사용하도록 지시하면 이를 활용하는 코드를 작성할 수 있습니다. API 사용 방법을 보여주는 문서 또는 코드 샘플을 모델에 제공하여 API 사용 방법을 모델에 알려줄 수 있습니다.
SYSTEM | 세 개의 역따옴표로 묶어서 Python 코드를 작성하고 실행할 수 있습니다. 또한 사용자가 친구에게 메시지를 보내는 데 도움이 되는 다음 모듈에 액세스할 수 있습니다. ```python import message message.write(to="John", message="Hey, want to meetup after work?")``` |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
경고: 모델에서 생성된 코드를 실행하는 것은 본질적으로 안전하지 않으며 이를 수행하려는 모든 애플리케이션에서는 예방 조치를 취해야 합니다. 특히 신뢰할 수 없는 코드로 인해 발생할 수 있는 피해를 제한하려면 샌드박스 코드 실행 환경이 필요합니다.
전술: 모델에 특정 기능에 대한 액세스 권한을 부여하세요.
Chat Completions API를 사용하면 요청에 함수 설명 목록을 전달할 수 있습니다. 이를 통해 모델은 제공된 스키마에 따라 함수 인수를 생성할 수 있습니다. 생성된 함수 인수는 API에서 JSON 형식으로 반환되며 함수 호출을 실행하는 데 사용할 수 있습니다. 함수 호출에 의해 제공된 출력은 루프를 닫는 다음 요청에서 모델로 다시 피드백될 수 있습니다. 이는 OpenAI 모델을 사용하여 외부 기능을 호출하는 데 권장되는 방법입니다. 자세히 알아보려면 입문 텍스트 생성 가이드의 함수 호출 섹션과 OpenAI Cookbook의 더 많은 함수 호출 예제를 참조하세요.
6. 전략: 변경 사항을 체계적으로 테스트하세요
때로는 변경(예: 새로운 지침이나 새로운 설계)으로 인해 시스템이 좋아졌는지 나빠졌는지 판단하기 어려울 수 있습니다. 몇 가지 예를 보면 어느 것이 더 나은지 힌트를 얻을 수 있지만, 표본 크기가 작으면 진정한 개선과 우연한 행운을 구별하기 어려울 수 있습니다. 변경 사항이 일부 입력에서는 성능에 도움이 되지만 다른 입력에서는 성능이 저하될 수도 있습니다.
평가 절차(또는 "평가")는 시스템 설계를 최적화하는 데 유용합니다. 좋은 평가는 다음과 같습니다:
- 실제 사용량(또는 적어도 다양함)을 대표합니다.
- 통계적 검정력을 높이기 위해 많은 테스트 사례를 포함합니다(지침은 아래 표 참조).
- 자동화 또는 반복이 용이함
감지할 차이점 | 95% 신뢰도에 필요한 샘플 크기 |
30% | ~10 |
10% | ~100 |
3% | ~1,000 |
1% | ~10,000 |
출력 평가는 컴퓨터, 사람 또는 혼합하여 수행할 수 있습니다. 컴퓨터는 객관적인 기준(예: 단일 정답이 있는 질문)뿐만 아니라 일부 주관적이거나 모호한 기준을 사용하여 평가를 자동화할 수 있으며, 여기서 모델 출력은 다른 모델 쿼리에 의해 평가됩니다. OpenAI Evals는 자동화된 평가를 생성하기 위한 도구를 제공하는 오픈 소스 소프트웨어 프레임워크입니다.
모델 기반 평가는 품질 면에서 동일하게 높은 것으로 간주될 수 있는 다양한 출력이 존재할 때 유용할 수 있습니다(예: 답변이 긴 질문의 경우). 모델 기반 평가를 통해 현실적으로 평가할 수 있는 것과 인간이 평가해야 하는 것 사이의 경계는 모호하며 모델의 능력이 향상됨에 따라 끊임없이 변화하고 있습니다. 모델 기반 평가가 귀하의 사용 사례에 얼마나 잘 작동할 수 있는지 알아보기 위해 실험을 권장합니다.
전술: 최적의 답변을 참조하여 모델 결과를 평가하세요.
질문에 대한 정답이 특정 사실 집합을 참조해야 한다는 것이 알려져 있다고 가정해 보겠습니다. 그런 다음 모델 쿼리를 사용하여 답변에 포함된 필수 사실 수를 계산할 수 있습니다.
예를 들어 다음 시스템 메시지를 사용합니다.
SYSTEM | 질문에 대한 답변으로 간주되는 삼중따옴표로 구분된 텍스트가 제공됩니다. 답변에 다음 정보가 직접 포함되어 있는지 확인하십시오. - 닐 암스트롱은 달에 발을 디딘 최초의 사람입니다. - 닐 암스트롱이 처음 달에 발을 디딘 날짜는 1969년 7월 21일입니다. 이러한 각 지점에 대해 다음 단계를 수행하십시오. 1 - 요점을 다시 설명합니다. 2 - 이 지점에 가장 가까운 답변을 인용해 주세요. 3 - 주제를 모르는 사람이 인용문을 읽고 요점을 직접적으로 추론할 수 있는지 생각해 보세요. 결정하기 전에 왜 그렇게 생각하는지에 대한 이유를 설명하십시오. 4 - 3번에 대한 대답이 '예'이면 '예'라고 적고, 그렇지 않으면 '아니요'라고 적습니다. 마지막으로 "예"라고 대답한 답변이 몇 개인지 알려주세요. 이 개수를 {"count": <여기에 개수 삽입>}으로 제공하세요. |
다음은 두 점이 모두 충족되는 입력 예시입니다.
SYSTEM | <위의 시스템 메시지 삽입> |
USER | """닐 암스트롱은 달에 발을 디딘 최초의 인류로 유명합니다. 이 역사적인 사건은 아폴로 11호 임무 중인 1969년 7월 21일에 일어났습니다.""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
다음은 단 하나의 점만 충족되는 입력의 예입니다.
SYSTEM | <위의 시스템 메시지 삽입> |
USER | """닐 암스트롱은 달 탐사선에서 내려 달 위를 걷는 최초의 인물이 되면서 역사를 만들었습니다.""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
다음은 어느 것도 만족되지 않는 입력의 예입니다.
SYSTEM | <위의 시스템 메시지 삽입> |
USER | """69년 여름, 항해 그랜드, 전설의 손처럼 대담한 아폴로 11호. 암스트롱이 한 걸음 내딛었습니다. 역사는 펼쳐졌습니다. 새로운 세상을 향한 작은 한 걸음”이라고 말했다.""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
이러한 유형의 모델 기반 평가에는 다양한 변형이 가능합니다. 후보 답변과 최적 표준 답변 간의 중복 유형을 추적하며, 후보 답변이 최적 표준 답변의 일부와 모순되는지 여부도 추적하는 등의 변형들을 고려하세요.
SYSTEM | 사용자 입력에 응답하려면 다음 단계를 따르세요. 계속하기 전에 각 단계를 완전히 다시 설명하세요. 즉, "1단계: 이유...". 1단계: 전문가 답변과 비교하여 제출된 답변의 정보가 분리됨, 같음, 하위 집합, 상위 집합 또는 중복(예: 일부 교차점이지만 하위 집합/상위 집합이 아님)인지 여부를 단계별로 추론합니다. 2단계: 제출된 답변이 전문가 답변의 어떤 측면과 모순되는지 단계별로 추론합니다. 3단계: 다음과 같은 구조의 JSON 객체 출력: {"type_of_overlap": "disjoint" 또는 "equal" 또는 "subset" 또는 "superset" 또는 "overlapping", "contradiction": true 또는 false} |
그럼에도 불구하고 전문가 답변과 모순되지 않는 품질이 낮은 답변이 포함된 입력 예는 다음과 같습니다.
SYSTEM | <위의 시스템 메시지 삽입> |
USER | 질문: """닐 암스트롱(Neil Armstrong)은 어떤 사건으로 가장 유명하며, 언제 일어났습니까? UTC 시간으로 가정하세요.""" 제출된 답변: """그 사람은 달 위를 걷거나 그런 게 아니었나요?""" 전문가 답변: """닐 암스트롱(Neil Armstrong)은 최초로 달에 발을 디딘 사람으로 가장 유명합니다. 이 역사적인 사건은 1969년 7월 21일에 일어났습니다.""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
다음은 전문가 답변과 직접적으로 모순되는 답변이 포함된 입력 예시입니다.
SYSTEM | <위의 시스템 메시지 삽입> |
USER | 질문: """닐 암스트롱(Neil Armstrong)은 어떤 사건으로 가장 유명하며, 언제 일어났습니까? UTC 시간으로 가정하세요.""" 제출된 답변: """1969년 7월 21일, 닐 암스트롱은 버즈 올드린에 이어 두 번째로 달에 발을 디딘 사람이 되었습니다.""" 전문가 답변: """닐 암스트롱(Neil Armstrong)은 최초로 달에 발을 디딘 사람으로 가장 유명합니다. 이 역사적인 사건은 1969년 7월 21일에 일어났습니다.""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
다음은 필요한 것보다 더 자세한 정보를 제공하는 정답이 포함된 입력 예시입니다.
SYSTEM | <위의 시스템 메시지 삽입> |
USER | 질문: """닐 암스트롱(Neil Armstrong)은 어떤 사건으로 가장 유명하며, 언제 일어났습니까? UTC 시간으로 가정하세요.""" 제출된 답변: """1969년 7월 21일 약 02:56 UTC에 닐 암스트롱(Neil Armstrong)은 달 표면에 발을 디딘 최초의 인간이 되어 인류 역사상 기념비적인 성과를 거두었습니다.""" 전문가 답변: """닐 암스트롱(Neil Armstrong)은 최초로 달에 발을 디딘 사람으로 가장 유명합니다. 이 역사적인 사건은 1969년 7월 21일에 일어났습니다.""" |
Playground - OpenAI API (영문으로 예시를 보여줍니다.) |
'IT와 개발 > AI 이야기' 카테고리의 다른 글
Command R+: GPT-4 Turbo의 대항마가 될까? (0) | 2024.04.23 |
---|---|
2024년 MAD (Machine Learning, AI, Data) 생태계 (1) | 2024.04.16 |
OpenAI의 GPT4.5 유출 소문 (1) | 2024.04.02 |
OpenAI와 Figure의 협업으로 개발된 "AGI Robot" (1) | 2024.03.26 |
베네딕트 에반스가 바라본 2024년 기술 트렌드 (1) | 2024.03.15 |