구글의 프롬프트 엔지니어링 백서를 기반으로 한 종합 가이드
대규모 언어 모델(LLM)의 입력과 출력에 대해 생각할 때, 텍스트 프롬프트(때로는 이미지 프롬프트와 같은 다른 양식과 함께)는 모델이 특정 출력을 예측하는 데 사용하는 입력입니다. 데이터 과학자나 기계 학습 엔지니어가 아니어도 누구나 프롬프트를 작성할 수 있습니다. 그러나 가장 효과적인 프롬프트를 작성하는 것은 복잡할 수 있습니다.
프롬프트의 효과에는 여러 측면이 영향을 미칩니다: 사용하는 모델, 모델의 훈련 데이터, 모델 구성, 단어 선택, 스타일과 톤, 구조, 그리고 맥락 모두가 중요합니다. 따라서 프롬프트 엔지니어링은 반복적인 과정입니다. 부적절한 프롬프트는 모호하고 부정확한 응답으로 이어질 수 있으며, 모델이 의미 있는 출력을 제공하는 능력을 저해할 수 있습니다.
이 가이드는 프롬프트 엔지니어링을 자세히 다루며, 시작하는 데 도움이 되는 다양한 프롬프팅 기법과 프롬프트 전문가가 되기 위한 팁과 모범 사례를 공유합니다. 또한 프롬프트를 작성하면서 직면할 수 있는 몇 가지 과제에 대해서도 논의합니다.
LLM이 어떻게 작동하는지 기억해보세요; 이것은 예측 엔진입니다. 모델은 순차적인 텍스트를 입력으로 받고 훈련된 데이터를 기반으로 다음 토큰이 무엇이어야 하는지 예측합니다. LLM은 이것을 반복적으로 수행하도록 운영되며, 다음 토큰을 예측하기 위해 이전에 예측된 토큰을 순차적 텍스트의 끝에 추가합니다. 다음 토큰 예측은 이전 토큰에 있는 내용과 LLM이 훈련 중에 본 내용 사이의 관계를 기반으로 합니다.
프롬프트를 작성할 때, 여러분은 LLM이 올바른 토큰 시퀀스를 예측하도록 설정하려고 시도합니다. 프롬프트 엔지니어링은 LLM이 정확한 출력을 생성하도록 안내하는 고품질 프롬프트를 설계하는 과정입니다. 이 과정에는 최상의 프롬프트를 찾기 위한 조정, 프롬프트 길이 최적화, 작업과 관련된 프롬프트의 작성 스타일 및 구조 평가가 포함됩니다.
프롬프트 엔지니어링은 다음과 같은 작업을 달성하기 위해 다양한 종류의 이해와 생성 작업을 수행할 수 있습니다:
모델을 선택한 후에는 모델 구성을 파악해야 합니다. 대부분의 LLM에는 LLM의 출력을 제어하는 다양한 구성 옵션이 함께 제공됩니다. 효과적인 프롬프트 엔지니어링을 위해서는 이러한 구성을 작업에 맞게 최적으로 설정해야 합니다.
중요한 구성 설정은 응답에서 생성할 토큰의 수입니다. 더 많은 토큰을 생성하려면 LLM에서 더 많은 계산이 필요하며, 이는 더 높은 에너지 소비, 잠재적으로 더 느린 응답 시간, 더 높은 비용으로 이어집니다.
LLM의 출력 길이를 줄이면 LLM이 생성하는 출력에서 스타일적으로나 텍스트적으로 더 간결해지지는 않으며, 단지 한도에 도달하면 LLM이 더 이상 토큰을 예측하지 않게 됩니다. 짧은 출력 길이가 필요한 경우, 이에 맞게 프롬프트를 설계해야 할 수도 있습니다.
LLM은 공식적으로 단일 토큰을 예측하지 않습니다. 오히려 LLM은 다음 토큰이 무엇일 수 있는지에 대한 확률을 예측하며, LLM의 어휘에 있는 각 토큰은 확률을 얻습니다. 그런 다음 이러한 토큰 확률을 샘플링하여 다음에 생성될 토큰을 결정합니다. 온도(temperature), top-K, top-P는 예측된 토큰 확률이 단일 출력 토큰을 선택하기 위해 처리되는 방식을 결정하는 가장 일반적인 구성 설정입니다.
온도는 토큰 선택의 무작위성 정도를 제어합니다. 낮은 온도는 더 결정적인 응답을 기대하는 프롬프트에 좋으며, 높은 온도는 더 다양하거나 예상치 못한 결과로 이어질 수 있습니다. 0의 온도(탐욕적 디코딩)는 결정적입니다: 가장 높은 확률의 토큰이 항상 선택됩니다.
최대값에 가까운 온도는 더 무작위한 출력을 생성하는 경향이 있습니다. 그리고 온도가 높아질수록 모든 토큰이 다음 예측 토큰이 될 가능성이 동일해집니다.
Top-K와 Top-P(핵 샘플링이라고도 함)는 예측된 다음 토큰이 상위 예측 확률을 가진 토큰에서 나오도록 제한하는 데 사용되는 두 가지 샘플링 설정입니다. 온도와 마찬가지로, 이러한 샘플링 설정은 생성된 텍스트의 무작위성과 다양성을 제어합니다.
Top-K, Top-P, 온도, 생성할 토큰 수 중에서 선택하는 것은 특정 응용 프로그램과 원하는 결과에 따라 다르며, 설정은 모두 서로에게 영향을 미칩니다. 또한 선택한 모델이 다른 샘플링 설정을 어떻게 결합하는지 이해하는 것이 중요합니다.
온도, Top-K, Top-P가 모두 사용 가능한 경우(Vertex Studio와 같이), Top-K와 Top-P 기준을 모두 충족하는 토큰이 다음 예측 토큰의 후보가 되며, 그런 다음 온도가 적용되어 Top-K와 Top-P 기준을 통과한 토큰에서 샘플링합니다. Top-K 또는 Top-P만 사용 가능한 경우, 동작은 동일하지만 하나의 Top-K 또는 P 설정만 사용됩니다.
"반복 루프 버그"라고도 알려진, 대규모 언어 모델에서 모델이 싸이클에 갇혀 같은 (채우기) 단어, 구문 또는 문장 구조를 반복적으로 생성하는 일반적인 문제를 본 적이 있나요? 이는 종종 부적절한 온도 및 top-k/top-p 설정에 의해 악화됩니다. 이는 낮은 온도와 높은 온도 설정 모두에서 다른 이유로 발생할 수 있습니다. 낮은 온도에서는 모델이 지나치게 결정적이 되어 가장 높은 확률 경로에 엄격하게 고착되며, 이는 그 경로가 이전에 생성된 텍스트를 다시 방문하는 경우 루프로 이어질 수 있습니다. 반대로, 높은 온도에서는 모델의 출력이 과도하게 무작위가 되어 무작위로 선택된 단어나 구문이 우연히 이전 상태로 돌아갈 확률이 증가하며, 이는 사용 가능한 옵션의 방대한 수로 인해 루프를 생성합니다.
LLM은 지시를 따르도록 조정되고 방대한 양의 데이터로 훈련되어 프롬프트를 이해하고 답변을 생성할 수 있습니다. 그러나 LLM은 완벽하지 않습니다. 프롬프트 텍스트가 명확할수록 LLM이 다음에 나올 가능성이 높은 텍스트를 예측하는 데 더 유리합니다. 또한 LLM이 훈련되는 방식과 작동 방식을 활용하는 특정 기법은 LLM에서 관련 결과를 얻는 데 도움이 됩니다.
이제 프롬프트 엔지니어링이 무엇인지, 그리고 그것이 무엇을 필요로 하는지 이해했으므로, 가장 중요한 프롬프팅 기법의 몇 가지 예를 살펴보겠습니다.
제로 샷 프롬프트는 가장 간단한 유형의 프롬프트입니다. 이것은 단지 작업에 대한 설명과 LLM이 시작할 수 있는 일부 텍스트만 제공합니다. 이 입력은 무엇이든 될 수 있습니다: 질문, 이야기의 시작, 또는 지시사항. 제로 샷이라는 이름은 '예제 없음'을 의미합니다.
프롬프트 예시:
영화 리뷰를 긍정적, 중립적, 부정적으로 분류하세요.
리뷰: "그녀"는 AI가 계속 진화하도록 허용된다면 인류가 향하는 방향을 드러내는 불안한 연구입니다. 이 걸작과 같은 영화가 더 많았으면 좋겠습니다.
감정:
출력:
긍정적
AI 모델을 위한 프롬프트를 만들 때 예제를 제공하는 것이 도움이 됩니다. 이러한 예제는 모델이 요청하는 내용을 이해하는 데 도움이 될 수 있습니다. 예제는 특히 모델을 특정 출력 구조나 패턴으로 유도하고자 할 때 유용합니다.
원 샷 프롬프트는 단일 예제를 제공하므로 원 샷이라는 이름이 붙었습니다. 아이디어는 모델이 작업을 가장 잘 완료하기 위해 모방할 수 있는 예제를 가지고 있다는 것입니다.
퓨 샷 프롬프트는 모델에 여러 예제를 제공합니다. 이 접근 방식은 모델에 따라야 할 패턴을 보여줍니다. 아이디어는 원 샷과 유사하지만, 원하는 패턴의 여러 예제는 모델이 패턴을 따를 가능성을 증가시킵니다.
퓨 샷 프롬프트 예시:
고객의 피자 주문을 유효한 JSON으로 파싱하세요:
예제:
나는 치즈, 토마토 소스, 페퍼로니가 들어간 작은 피자를 원합니다.
JSON 응답:
{
"size": "small",
"type": "normal",
"ingredients": [["cheese", "tomato sauce", "peperoni"]]
}
예제:
토마토 소스, 바질, 모짜렐라가 들어간 큰 피자를 주세요
{
"size": "large",
"type": "normal",
"ingredients": [["tomato sauce", "bazel", "mozzarella"]]
}
이제, 첫 번째 절반에는 치즈와 모짜렐라, 그리고 다른 절반에는 토마토 소스, 햄, 파인애플이 들어간 큰 피자를 원합니다.
JSON 응답:
출력:
{
"size": "large",
"type": "half-half",
"ingredients": [["cheese", "mozzarella"], ["tomato sauce", "ham", "pineapple"]]
}
시스템, 맥락적 및 역할 프롬프팅은 모두 LLM이 텍스트를 생성하는 방식을 안내하는 데 사용되는 기법이지만 다른 측면에 중점을 둡니다:
시스템 프롬프트는 출력을 반환하는 방법에 대한 추가 정보를 지정하는 경우와 같습니다. 시스템 프롬프트는 특정 요구 사항을 충족하는 출력을 생성하는 데 유용할 수 있습니다. '시스템 프롬프트'라는 이름은 실제로 '시스템에 추가 작업 제공'을 의미합니다.
프롬프트 예시:
영화 리뷰를 긍정적, 중립적, 부정적으로 분류하세요. 레이블만 대문자로 반환하세요.
리뷰: "그녀"는 AI가 계속 진화하도록 허용된다면 인류가 향하는 방향을 드러내는 불안한 연구입니다. 너무 불안해서 볼 수 없었습니다.
감정:
출력:
부정적
역할 프롬프팅은 생성 AI 모델에 특정 역할을 할당하는 프롬프트 엔지니어링의 기법입니다. 이는 모델이 할당된 특정 역할에 대한 응답을 조정할 수 있으므로 모델이 더 관련성 있고 유익한 출력을 생성하는 데 도움이 될 수 있습니다.
프롬프트 예시:
여행 가이드 역할을 해주세요. 내 위치에 대해 작성할 것이고 당신은 내 근처에 방문할 3곳을 제안할 것입니다.
내 제안: "나는 암스테르담에 있고 박물관만 방문하고 싶습니다."
여행 제안:
출력:
맥락적 프롬프트를 제공함으로써 AI 상호작용이 가능한 한 원활하고 효율적이 되도록 할 수 있습니다. 모델은 요청을 더 빠르게 이해하고 더 정확하고 관련성 있는 응답을 생성할 수 있습니다.
프롬프트 예시:
맥락: 당신은 레트로 80년대 아케이드 비디오 게임에 관한 블로그를 작성하고 있습니다.
글을 쓸 주제 3가지를 제안하고 이 글에 포함되어야 할 내용에 대해 몇 줄 설명해주세요.
출력:
단계별 프롬프팅은 LLM에게 먼저 특정 작업과 관련된 일반적인 질문을 고려하도록 프롬프트를 제공한 다음, 해당 일반적인 질문에 대한 답변을 후속 프롬프트에 주입하여 성능을 향상시키는 기법입니다. 이 '한 걸음 물러서기'는 LLM이 특정 문제를 해결하기 전에 관련 배경 지식과 추론 과정을 활성화할 수 있게 합니다.
더 넓고 기본적인 원칙을 고려함으로써 LLM은 더 정확하고 통찰력 있는 응답을 생성할 수 있습니다. 단계별 프롬프팅은 LLM이 비판적으로 생각하고 지식을 새롭고 창의적인 방식으로 적용하도록 장려합니다. 그것은 LLM이 직접 프롬프트될 때보다 더 많은 지식이 작동하게 됨으로써 작업을 수행하는 최종 프롬프트를 변경합니다.
1단계 프롬프트:
인기 있는 1인칭 슈터 액션 게임을 기반으로, 1인칭 슈터 비디오 게임에서 도전적이고 매력적인 레벨 스토리라인에 기여하는 5가지 가상의 핵심 설정은 무엇입니까?
출력:
2단계 프롬프트(맥락 포함):
맥락: 1인칭 슈터 비디오 게임을 위한 5가지 매력적인 테마:
1. 폐기된 군사 기지: 변형된 군인과 불량 로봇이 기어 다니는 광활한 종말론적 군사 단지로, 도전적인 총기 전투에 이상적입니다.
2. 사이버펑크 도시: 높은 고층 빌딩과 밀집된 골목길이 있는 네온 불빛이 켜진 미래적인 도시 환경으로, 사이버네틱 강화 적과 해킹 메커니즘을 특징으로 합니다.
3. 외계 우주선: 지구에 좌초된 거대한 외계 선박으로, 기괴한 복도, 무중력 구역, 그리고 만날 외계 생물체가 있습니다.
4. 좀비가 들끓는 마을: 공격적인 좀비 떼로 넘쳐나는 황량한 마을로, 강렬한 근접 전투와 안전한 통로를 찾기 위한 퍼즐 해결이 특징입니다.
5. 수중 연구 시설: 물로 가득 찬 심해 연구소로, 변이된 수생 생물로 가득 차 있으며, 생존하기 위해 스텔스와 수중 탐사 기술이 필요합니다.
테마 중 하나를 선택하여 도전적이고 매력적인 1인칭 슈터 비디오 게임의 새로운 레벨에 대한 한 단락의 스토리라인을 작성하세요.
출력:
탁한 심연의 중심에는 인간의 야망과 그 재앙적 결과의 증거로 서 있는 황폐화된 수중 연구 시설이 있습니다. 어둠에 싸여 있고, 오작동하는 기계의 웅웅거림과 함께 맥동하며, 익사한 영혼들의 메아리가 울려 퍼지는 이 시설은 이제 깊은 바다에서 태어난 악몽의 번식지가 되었습니다. 플레이어는 고급 잠수 장비와 실험적 무기로 무장한 엘리트 해병으로서 공포의 이 수중 영역에 진출하는 임무를 맡았습니다. 회복력과 자원적 능력으로 무장하고, 그들은 위험한 복도를 탐색하고, 암호화된 퍼즐을 해결하며, 깊은 곳에 숨어 있는 끔찍한 바다 괴물들과 맞서야 합니다. 깊은 바다의 압력과 씨름하는 것부터 교활한 수생 포식자를 앞서 생각하는 것까지, 이 미지의 지하 세계에서의 모든 순간은 인간의 인내와 용기의 한계를 시험합니다.
사고 연쇄(CoT) 프롬프팅은 중간 추론 단계를 생성하여 LLM의 추론 능력을 향상시키는 기법입니다. 이는 LLM이 더 정확한 답변을 생성하는 데 도움이 됩니다. 추론이 필요한 더 복잡한 작업에서 더 나은 결과를 얻기 위해 퓨 샷 프롬프팅과 결합할 수 있습니다.
CoT는 많은 장점이 있습니다. 우선, 비교적 적은 노력으로도 매우 효과적이며 기성품 LLM과 잘 작동합니다(미세 조정이 필요 없음). 또한 CoT 프롬프팅을 통해 해석 가능성을 얻을 수 있으며, LLM의 응답을 배우고 따라간 추론 단계를 볼 수 있습니다. 오작동이 있으면 식별할 수 있습니다.
프롬프트 예시:
내가 3살이었을 때, 내 파트너는 내 나이의 3배였습니다. 지금 나는 20살입니다. 내 파트너는 몇 살인가요? 단계별로 생각해봅시다.
출력:
그래서 내 파트너는 26살입니다.
사고 연쇄는 코드 생성, 요청을 몇 가지 단계로 분해하여 특정 코드 라인에 매핑하는 등 다양한 사용 사례에 유용할 수 있습니다. 또는 제품에 "XYZ"라는 이름이 붙은 것과 같은 일종의 시드가 있을 때 합성 데이터를 생성하는 데에도 유용합니다. 일반적으로, '말하면서 해결할 수 있는' 모든 작업은 사고 연쇄의 좋은 후보입니다. 문제를 해결하는 단계를 설명할 수 있다면 사고 연쇄를 시도해보세요.
대규모 언어 모델이 다양한 NLP 작업에서 인상적인 성공을 보여주었지만, 그들의 추론 능력은 종종 모델 크기를 증가시키는 것만으로는 극복할 수 없는 한계로 여겨집니다. 이전 사고 연쇄 프롬프팅 섹션에서 배운 대로, 모델은 문제를 해결하는 인간처럼 추론 단계를 생성하도록 프롬프트될 수 있습니다. 그러나 CoT는 단순한 '탐욕적 디코딩' 전략을 사용하여 그 효과를 제한합니다. 자기 일관성은 샘플링과 다수결 투표를 결합하여 다양한 추론 경로를 생성하고 가장 일관된 답변을 선택합니다. 이는 LLM에 의해 생성된 응답의 정확성과 일관성을 향상시킵니다.
자기 일관성은 답변이 올바른 유사 확률 가능성을 제공하지만, 분명히 높은 비용이 듭니다.
다음 단계를 따릅니다:
프롬프트 예시:
이메일: 안녕하세요, 귀하의 웹사이트에 워드프레스를 사용하는 것을 보았습니다. 훌륭한 오픈 소스 콘텐츠 관리 시스템입니다. 저도 과거에 사용한 적이 있습니다. 많은 훌륭한 사용자 플러그인이 함께 제공됩니다. 그리고 설정하기도 상당히 쉽습니다. 연락 양식에 버그가 있는 것을 발견했는데, 이름 필드를 선택할 때 발생합니다. 이름 필드에 텍스트를 입력하는 제 스크린샷을 첨부했습니다. 제가 inv0k3d한 JavaScript 경고 상자를 확인하세요. 하지만 나머지는 훌륭한 웹사이트입니다. 읽는 것을 즐깁니다. 웹사이트에 버그를 남겨두셔도 됩니다. 제게 더 흥미로운 읽을거리를 제공하니까요. 안녕히 계세요, 해커 해리. 위의 이메일을 중요함 또는 중요하지 않음으로 분류하세요. 단계별로 생각하고 이유를 설명하세요.
이제 사고 연쇄와 자기 일관성 프롬프팅에 익숙해졌으므로, 사고 트리(ToT)를 검토해 보겠습니다. 이는 단일 선형 사고 연쇄를 따르는 대신 LLM이 여러 다른 추론 경로를 동시에 탐색할 수 있도록 하기 때문에 CoT 프롬프팅의 개념을 일반화합니다.
이 접근 방식은 탐색을 필요로 하는 복잡한 작업에 ToT를 특히 적합하게 만듭니다. 이는 사고 트리를 유지함으로써 작동하며, 각 사고는 문제 해결을 향한 중간 단계 역할을 하는 일관된 언어 시퀀스를 나타냅니다. 그런 다음 모델은 트리의 다른 노드에서 분기하여 다른 추론 경로를 탐색할 수 있습니다.
왼쪽의 사고 연쇄 프롬프팅과 오른쪽의 사고 트리 프롬프팅 시각화
이유 및 행동(ReAct) 프롬프팅은 LLM이 복잡한 작업을 자연어 추론과 외부 도구(검색, 코드 해석기 등)를 결합하여 해결할 수 있게 하는 패러다임으로, LLM이 정보를 검색하기 위해 외부 API와 상호 작용하는 것과 같은 특정 작업을 수행할 수 있게 하며, 이는 에이전트 모델링을 향한 첫 단계입니다.
ReAct는 인간이 실제 세계에서 작동하는 방식을 모방합니다. 우리는 언어적으로 추론하고 정보를 얻기 위한 행동을 취할 수 있습니다. ReAct는 다양한 도메인에서 다른 프롬프트 엔지니어링 접근 방식에 비해 잘 수행됩니다.
ReAct 프롬프팅은 추론과 행동을 사고-행동 루프로 결합함으로써 작동합니다. LLM은 먼저 문제에 대해 추론하고 행동 계획을 생성합니다. 그런 다음 계획의 행동을 수행하고 결과를 관찰합니다. 그런 다음 LLM은 관찰을 사용하여 추론을 업데이트하고 새 행동 계획을 생성합니다. 이 과정은 LLM이 문제에 대한 해결책에 도달할 때까지 계속됩니다.
Python 코드 예시:
from langchain.agents import load_tools from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain.llms import VertexAI prompt = "메탈리카 밴드 멤버들은 몇 명의 아이들을 가지고 있나요?" llm = VertexAI(temperature=0.1) tools = load_tools(["serpapi"], llm=llm) agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) agent.run(prompt)
출력:
> 새 AgentExecutor 체인 시작... 메탈리카는 4명의 멤버가 있습니다. 행동: 검색 행동 입력: 제임스 헷필드는 몇 명의 아이들이 있나요? 관찰: 세 명의 아이들 생각: 1/4 메탈리카 밴드 멤버는 3명의 아이들이 있습니다 행동: 검색 행동 입력: 라스 울리히는 몇 명의 아이들이 있나요? 관찰: 3 생각: 2/4 메탈리카 밴드 멤버는 6명의 아이들이 있습니다 행동: 검색 행동 입력: 커크 해밋은 몇 명의 아이들이 있나요? 관찰: 해밋은 1998년부터 두 번째 아내인 라니와 결혼했습니다. 그들은 두 아들, 앤젤(2006년 9월 29일 생)과 빈센조(2008년 6월 28일 생)가 있습니다. 생각: 3/4 메탈리카 밴드 멤버는 8명의 아이들이 있습니다 행동: 검색 행동 입력: 로버트 트루질로는 몇 명의 아이들이 있나요? 관찰: 2 생각: 4/4 메탈리카 밴드 멤버는 10명의 아이들이 있습니다 최종 답변: 10
이 시점에서 프롬프트 작성이 복잡할 수 있다는 것을 깨달았을 것입니다. 이것을 자동화하면 어떨까요(프롬프트를 작성하는 프롬프트를 작성하는 것)? 자동 프롬프트 엔지니어링(APE)이라는 방법이 있습니다. 이 방법은 인간 입력의 필요성을 완화할 뿐만 아니라 다양한 작업에서 모델의 성능을 향상시킵니다.
더 많은 프롬프트를 생성하는 모델에 프롬프트를 입력하고, 이를 평가하고, 좋은 것들을 가능한 변경한 다음 반복합니다.
프롬프트 예시:
밴드 머천다이즈 티셔츠 웹샵이 있으며, 챗봇을 훈련하기 위해 다양한 주문 방법이 필요합니다: "한 개의 메탈리카 티셔츠 S 사이즈". 같은 의미를 유지하면서 의미론적으로 동일한 10가지 변형을 생성하세요.
출력:
Gemini는 주로 텍스트 기반 프롬프트에 초점을 맞추고 있으며, 여기에는 코드를 반환하는 프롬프트 작성도 포함됩니다. 몇 가지 코딩 예제를 살펴보겠습니다.
Gemini는 개발자가 될 수도 있고 선택한 프로그래밍 언어로 코드를 작성하는 데 도움을 줄 수 있습니다. 개발자로서 이는 코드 작성 과정을 가속화하는 데 도움이 될 수 있습니다.
프롬프트 예시:
폴더 이름을 묻는 Bash 코드 스니펫을 작성하세요. 그런 다음 폴더의 내용을 가져와 파일 이름 앞에 "draft"를 붙여 폴더 내의 모든 파일 이름을 바꿉니다.
출력:
#!/bin/bash
# 폴더 이름 요청
echo "폴더 이름을 입력하세요: "
read folder_name
# 폴더가 존재하는지 확인
if [ ! -d "$folder_name" ]; then
echo "폴더가 존재하지 않습니다."
exit 1
fi
# 폴더 내 파일 목록 가져오기
files=( "$folder_name"/* )
# 각 파일의 이름 앞에 "draft"를 붙여 이름 바꾸기
for file in "${files[@]}"; do
new_file_name="draft_$(basename "$file")"
mv "$file" "$new_file_name"
done
echo "파일 이름이 성공적으로 변경되었습니다."
개발자가 팀에서 일할 때 다른 사람의 코드를 읽어야 합니다. Gemini는 이것도 도울 수 있습니다.
프롬프트 예시:
아래 Bash 코드를 설명해주세요:
#!/bin/bash
echo "폴더 이름을 입력하세요: "
read folder_name
if [ ! -d "$folder_name" ]; then
echo "폴더가 존재하지 않습니다."
exit 1
fi
files=( "$folder_name"/* )
for file in "${files[@]}"; do
new_file_name="draft_$(basename "$file")"
mv "$file" "$new_file_name"
done
echo "파일 이름이 성공적으로 변경되었습니다."
출력:
이 Bash 스크립트는 다음 작업을 수행합니다:
Table 16의 bash 코드는 잘 작동하는 것 같습니다. 그러나 이 스크립트는 파일 이름을 프롬프트하는 경우 정말 재사용 가능할 것입니다. 이상적으로는 UI가 있는 별도의 애플리케이션으로 작동해야 합니다. 시작점으로, Bash보다 Python이 (웹) 애플리케이션에 더 나은 언어일 것입니다. LLM은 한 언어에서 다른 언어로 코드를 번역하는 데 도움이 될 수 있습니다.
프롬프트 예시:
아래 Bash 코드를 Python 스니펫으로 번역하세요.
#!/bin/bash
echo "폴더 이름을 입력하세요: "
read folder_name
if [ ! -d "$folder_name" ]; then
echo "폴더가 존재하지 않습니다."
exit 1
fi
files=( "$folder_name"/* )
for file in "${files[@]}"; do
new_file_name="draft_$(basename "$file")"
mv "$file" "$new_file_name"
done
echo "파일 이름이 성공적으로 변경되었습니다."
출력:
import os
import shutil
# 사용자로부터 폴더 이름 가져오기
folder_name = input("폴더 이름을 입력하세요: ")
# 폴더가 존재하는지 확인
if not os.path.isdir(folder_name):
print("폴더가 존재하지 않습니다.")
exit(1)
# 폴더 내 모든 파일 목록 가져오기
files = os.listdir(folder_name)
# 파일 반복
for file in files:
# "draft_" 접두사가 있는 새 파일 이름 생성
new_file_name = f"draft_{file}"
# 파일을 새 이름으로 이동
shutil.move(os.path.join(folder_name, file),
os.path.join(folder_name, new_file_name))
# 성공 메시지 출력
print("파일 이름이 성공적으로 변경되었습니다.")
올바른 프롬프트를 찾는 것은 조정이 필요합니다. Vertex AI의 Language Studio는 다양한 모델을 테스트할 수 있는 능력과 함께 프롬프트를 실험하기에 완벽한 장소입니다.
프롬프트 엔지니어링 전문가가 되려면 다음 모범 사례를 사용하세요.
가장 중요한 모범 사례는 프롬프트 내에 (원 샷 / 퓨 샷) 예제를 제공하는 것입니다. 이것은 강력한 교육 도구 역할을 하기 때문에 매우 효과적입니다. 이러한 예제는 원하는 출력이나 유사한 응답을 보여주어 모델이 이로부터 배우고 자체 생성을 그에 맞게 조정할 수 있습니다. 이는 모델에 참조점이나 목표를 제공하는 것과 같아, 응답의 정확성, 스타일, 톤을 향상시켜 기대에 더 잘 부합시킵니다.
프롬프트는 당신과 모델 모두가 이해하기 쉽도록 간결하고 명확하며 이해하기 쉬워야 합니다. 경험상, 이미 당신에게 혼란스럽다면 모델에게도 마찬가지일 가능성이 높습니다. 복잡한 언어를 사용하지 않도록 하고 불필요한 정보를 제공하지 마세요.
행동을 설명하는 동사를 사용해보세요. 예시: Act, Analyze, Categorize, Classify, Contrast, Compare, Create, Describe, Define, Evaluate, Extract, Find, Generate, Identify, List, Measure, Organize, Parse, Pick, Predict, Provide, Rank, Recommend, Return, Retrieve, Rewrite, Select, Show, Sort, Summarize, Translate, Write.
원하는 출력에 대해 구체적이어야 합니다. 간결한 지시는 LLM을 충분히 안내하지 않거나 너무 일반적일 수 있습니다. 프롬프트에 구체적인 세부 사항을 제공하면(시스템 또는 맥락 프롬프팅을 통해) 모델이 관련된 내용에 집중하는 데 도움이 되어 전반적인 정확성이 향상됩니다.
좋은 예시:
상위 5개 비디오 게임 콘솔에 관한 3 단락 블로그 게시물을 생성하세요. 블로그 게시물은 정보가 풍부하고 매력적이어야 하며, 대화 스타일로 작성되어야 합니다.
나쁜 예시:
비디오 게임 콘솔에 관한 블로그 게시물을 생성하세요.
지시와 제약은 LLM의 출력을 안내하는 데 사용됩니다.
성장하는 연구에 따르면 프롬프팅에서 긍정적인 지시에 초점을 맞추는 것이 제약에 크게 의존하는 것보다 더 효과적일 수 있습니다. 이 접근 방식은 인간이 하지 말아야 할 일 목록보다 긍정적인 지시를 선호하는 방식과 일치합니다.
생성된 LLM 응답의 길이를 제어하려면 구성에서 최대 토큰 제한을 설정하거나 프롬프트에서 특정 길이를 명시적으로 요청할 수 있습니다. 예를 들어:
"트윗 길이 메시지로 양자 물리학을 설명하세요."
프롬프트를 재사용하고 더 동적으로 만들기 위해 다른 입력에 대해 변경할 수 있는 변수를 프롬프트에 사용하세요. 예를 들어, 도시에 대한 사실을 제공하는 프롬프트와 같이. 프롬프트에 도시 이름을 하드코딩하는 대신, 변수를 사용하세요. 변수는 같은 정보를 여러 프롬프트에서 사용해야 할 때 시간과 노력을 절약할 수 있습니다. 프롬프트에서 여러 번 사용해야 하는 동일한 정보가 있다면, 변수에 저장하고 각 프롬프트에서 해당 변수를 참조할 수 있습니다. 이는 자체 애플리케이션에 프롬프트를 통합할 때 많은 의미가 있습니다.
변수:
{city} = "암스테르담"
프롬프트:
당신은 여행 가이드입니다. 다음 도시에 대한 사실을 알려주세요: {city}
다른 모델, 모델 구성, 프롬프트 형식, 단어 선택, 제출은 다른 결과를 낼 수 있습니다. 따라서 스타일, 단어 선택, 프롬프트 유형(제로 샷, 퓨 샷, 시스템 프롬프트)과 같은 프롬프트 속성을 실험하는 것이 중요합니다.
예를 들어, 혁명적인 비디오 게임 콘솔 세가 드림캐스트에 대한 텍스트를 생성하는 것을 목표로 하는 프롬프트는 질문, 진술 또는 지시로 공식화될 수 있으며, 다른 출력을 생성합니다:
일반적으로 말하면, 퓨 샷 예제의 순서는 많이 중요하지 않습니다. 그러나 분류 작업을 수행할 때, 퓨 샷 예제에서 가능한 응답 클래스를 혼합해야 합니다. 이는 예제의 특정 순서에 과적합될 수 있기 때문입니다. 가능한 응답 클래스를 혼합함으로써, 모델이 각 클래스의 주요 기능을 식별하는 법을 배우도록 할 수 있습니다. 특정 순서를 단순히 기억하는 것이 아닙니다. 이는 보지 않은 데이터에 대해 더 강력하고 일반화 가능한 성능으로 이어질 것입니다.
좋은 경험 법칙은 6개의 퓨 샷 예제로 시작하여 거기서부터 정확도를 테스트하는 것입니다.
프롬프트 입력 형식 외에도, 출력 형식을 실험하는 것을 고려하세요. 추출, 선택, 파싱, 정렬, 랭킹, 또는 데이터 분류와 같은 창의적이지 않은 작업의 경우 JSON이나 XML과 같은 구조화된 형식으로 출력을 반환하도록 하세요.
데이터를 추출하는 프롬프트에서 JSON 객체를 반환하는 데에는 몇 가지 이점이 있습니다. 실제 애플리케이션에서는 이 JSON 형식을 수동으로 만들 필요가 없으며, 이미 정렬된 순서로 데이터를 반환할 수 있습니다(datetime 객체로 작업할 때 매우 유용). 그러나 가장 중요한 것은, JSON 형식으로 프롬프트하면 모델이 구조를 만들고 환각을 제한하도록 강제됩니다.
요약하면, 출력에 JSON을 사용하는 이점:
좋은 프롬프트를 만들어야 하는 상황이라면, 여러 사람이 시도하는 것이 좋을 수 있습니다. 모든 사람이 (이 장에 나열된) 모범 사례를 따를 때, 모든 다른 프롬프트 시도 사이에 성능 변동을 볼 수 있을 것입니다.
마지막 팁은 이 장에서 이전에 언급했지만, 잘 되고 그렇지 않은 것을 시간이 지남에 따라 배울 수 있도록 모든 세부 사항으로 프롬프트 시도를 문서화하는 것이 얼마나 중요한지 충분히 강조할 수 없습니다.
프롬프트 출력은 모델, 샘플링 설정, 심지어 동일한 모델의 다른 버전에 걸쳐 다를 수 있습니다. 더욱이, 동일한 모델에 대한 동일한 프롬프트에서도 출력 문장 형식과 단어 선택에 작은 차이가 발생할 수 있습니다.
CoT 프롬프팅의 경우, 추론 후에 답변을 두는 것이 필요합니다. 왜냐하면 추론의 생성이 모델이 최종 답변을 예측할 때 얻는 토큰을 변경하기 때문입니다.
CoT 및 자기 일관성을 통해 프롬프트에서 최종 답변을 추출할 수 있어야 합니다. 최종 답안은 추론과 분리되어야 합니다.
CoT 프롬프팅의 경우, 온도를 0으로 설정하세요.
사고 연쇄 프롬프팅은 언어 모델이 가장 높은 확률을 할당한 시퀀스에서 다음 단어를 예측하는 탐욕적 디코딩을 기반으로 합니다. 일반적으로 말하면, 추론을 사용하여 최종 답변을 도출할 때, 하나의 정답이 있을 가능성이 높습니다. 따라서 추론을 사용할 때는 항상 온도를 0으로 설정해야 합니다.
이 문서에서는 프롬프트 엔지니어링에 대해 논의했습니다. 다음과 같은 다양한 프롬프팅 기법을 배웠습니다:
심지어 프롬프트를 자동화하는 방법도 살펴보았습니다.
이 문서는 프롬프트가 충분하지 않을 때 발생할 수 있는 문제와 같은 생성형 AI의 과제에 대해 논의한 다음, 더 나은 프롬프트 엔지니어가 되는 방법에 대한 모범 사례로 마무리했습니다.
이 문서는 구글의 프롬프트 엔지니어링 백서를 기반으로 작성되었습니다.