Generative AI/Prompt Engineering & Tuning

[Prompt Engineering] Best Practices of Prompt Engineering

데이터 세상 2023. 7. 17. 16:08

출처: https://towardsdatascience.com/summarising-best-practices-for-prompt-engineering-c5e86c483af4

 

Prompt Engineering

프롬프트 엔지니어링은 OpenAI의 ChatGPT와 같은 LLM(Large Language Models)에 대한 프롬프트라는 명령을 만드는 프로세스를 말합니다. 광범위한 작업을 해결할 수 있는 LLM의 엄청난 잠재력을 통해 프롬프트 엔지니어링을 활용하면 상당한 시간을 절약하고 인상적인 응용 프로그램을 쉽게 개발할 수 있습니다. 이 거대한 모델의 모든 기능을 최대한 활용하여 우리가 상호 작용하고 혜택을 받는 방식을 변화시키는 열쇠를 쥐고 있습니다.


Best Practices for Prompt Engineering

여기서 주목해야 할 한 가지 중요한 점은 ChatGPT가 LLM만이 아니라는 것입니다.
RLHF(Reinforcement Learning from Human Feedback)로 더욱 finetuned된 SFT(Supervised Fine-Tuning) 모델이기도 합니다. 현재 많은 개발자가 실험 프로젝트 및 개인 탐색을 위해 OpenAI의 모델을 활용하고 있지만 개인 정보 보호 및 기타 이유로 인해 대기업의 생산 환경에 배포하기에 더 적합한 다른 모델이 있습니다.

기본 모델(예: GPT-3, Chinchilla, LLaMA)이 fine-tuning 및 RLHF 교육을 받은 비서(예: ChatGPT, Koala, Alpaca)와 동일한 방식으로 작동하지 않는 이유를 알고 싶다면 Andrej Karpathy가 GPT와 유사한 모델을 훈련하고 사용하는 방법에 대해 설명합니다. 더 깊은 이해를 위해 확인하는 것이 좋습니다. 

 

State of GPT

 

Microsoft Build: Highlights from 2023

Keep sharpening your skills with the event’s best on-demand sessions and find upcoming opportunities to spark your interest. Be sure to join us next year for the latest on developer innovations.

build.microsoft.com


Iterative Prompt Development

머신 러닝 모델이 반복 프로세스를 통해 구축되는 것처럼 효과적인 프롬프트도 유사한 반복 접근 방식을 통해 구성됩니다.

가장 재능 있는 개발자라도 첫 번째 시도에서 완벽한 프롬프트를 만들지 못할 수 있으므로 원하는 목표를 달성하기 위해 수십 번의 시도가 필요할 수 있는 현실에 대비하십시오.

Building data-based applications is always an iterative process.

 

예를 통해 사물을 이해하는 것이 항상 더 좋습니다. 작업 설명에서 정보를 추출하는 시스템 구축을 시작하겠습니다.

 

초기 프롬프트는 모델에 특정 정보를 추출하도록 요청하는 것처럼 간단할 수 있습니다. 또한 구분 기호를 사용할 것입니다.

로컬 애플리케이션이 프롬프트 인젝션 공격(prompt injection attacks)에 취약할 가능성은 낮지만 이는 좋은 습관입니다.

 

* Prompt Injection

prompt injection은 언어 모델의 출력을 하이재킹하는 프로세스입니다.

이를 통해 해커는 모델이 원하는 모든 것을 말할 수 있습니다.

신뢰할 수 없는 텍스트가 프롬프트의 일부로 사용될 때 발생할 수 있습니다.

 


Asking for a Structural Output

논의하고 싶은 두 번째 요점은 모델이 예상되는 구조적 형식으로 결과를 출력하도록 요청하는 것입니다.

웹 인터페이스를 통해 LLM과 상호 작용하는 데 중요하지 않을 수 있지만(예: ChatGPT에서 수행하는 작업) 결과를 구문 분석하는 프로세스가 훨씬 쉽기 때문에 LLM 기반 애플리케이션에 매우 유용합니다.

일반적인 방법 중 하나는 JSON 또는 XML과 같은 형식을 사용하고 특정 키를 정의하여 출력 데이터를 구성하는 것입니다. 

 

LMQL과 같은 언어는 언어 모델 프롬프트에 프로그래밍과 유사한 접근 방식을 제공합니다.

이러한 도구는 지속적으로 발전하고 개선됨에 따라 우리가 LLM과 상호 작용하는 방식을 혁신하여 보다 정확하고 구조화된 응답을 얻을 수 있는 잠재력을 가지고 있습니다.

LMQL query example

 


Chain-of-Thought Reasoning

CoT(Chain-of-Thought) 추론은 추론이 필요한 작업에 매우 유용한 것으로 밝혀졌습니다.

따라서 LLM에 훌륭한 접근 방식이 될 수 있는 여러 개의 간단한 단계로 나누어 작업을 해결할 기회가 있다면...

원본 논문의 예를 살펴보십시오.

문제를 더 작은 단계로 나누고 명시적인 지침을 제공함으로써 모델이 올바른 출력을 생성하도록 도울 수 있습니다.

 

논문출처: https://arxiv.org/pdf/2201.11903.pdf

Introducing CoT prompting

흥미롭게도 프롬프트 끝에 간단하고 마법 같은 'let’s think step by step(단계적으로 생각해 봅시다)'를 추가하면 결과가 향상될 수 있다는 사실이 나중에 드러납니다. 이 기술은 zero-shot CoT로 ​​알려져 있습니다. 따라서 토큰을 생성하는 것 외에는 생각을 표현할 수 있는 다른 기능이 없기 때문에 모델이 'think out loud(소리내어 생각)'할 수 있도록 프롬프트를 구성하십시오.

지금까지 가장 좋은 zero-shot CoT 프롬프트는

'Let’s work this out in a step by step way to be sure we have the right answer(정답을 얻을 수 있도록 단계별로 해결해 봅시다)'입니다.

 

Best zero-shot prompts, 출처: LLMs Are Human-Level Prompt Engineers paper


훨씬 더 복잡한 작업을 해결하기 위한 보다 정교한 접근 방식이 현재 활발히 개발되고 있습니다. 일부 시나리오에서는 훨씬 뛰어난 성능을 발휘하지만 실제 사용은 다소 제한적입니다. 자기 일관성(self-consistency)과 생각의 나무(Tree of Thoughts)라는 두 가지 기술을 언급하겠습니다.

자기 일관성 논문(self-consistency paper)의 저자는 다음과 같은 접근 방식을 제안했습니다.

초기 모델 출력에 의존하는 대신 여러 번 샘플링하고 다수결 투표를 통해 결과를 집계할 것을 제안했습니다.

이 기술은 고전적인 머신 러닝에서 직관과 앙상블의 성공에 의존함으로써 모델의 견고성을 향상시킵니다.

 

출처: Self-Consistency Improves CoT Reasoning in Language Models paper

Self-consistency(출처: Self-Consistency Improves CoT Reasoning in Language Models paper)

 

집계(aggregation) 단계를 구현하지 않고 자체 일관성을 적용할 수도 있습니다. 출력이 짧은 작업의 경우 모델에 몇 가지 옵션을 제안하고 가장 좋은 옵션을 선택하도록 요청합니다.

 

 

ToT(Tree of Thoughts)는 이 개념을 한 단계 더 발전시킵니다.

그것은 모델의 '추론적 생각(resoning thoughts)'에 대해 트리 검색 알고리즘을 적용하는 아이디어를 제시하며, 기본적으로 잘못된 가정을 발견했을 때 역추적합니다.

 

출처: Tree of Thoughts: Deliberate Problem Solving with LLMs paper

Tree of Thoughts (출처:Tree of Thoughts: Deliberate Problem Solving with LLMs paper)

 

특정 시나리오의 경우 사고 연쇄 추론(Chain-of-Thought reasoning)을 사용할 필요는 없지만 두 단계로 요약 작업을 수행하도록 모델을 유도할 수 있습니다. 처음에는 전체 직무 설명을 요약한 다음 직무 책임에 초점을 맞춰 도출된 요약을 요약할 수 있습니다.


Few-shot Learning

우리가 다룰 마지막 기술은 상황 내 학습이라고도 하는 few-shot 학습입니다. 작업에 대한 명확한 그림을 모델에 제공하기 위해 몇 가지 예를 프롬프트에 통합하는 것만큼 간단합니다.

 

이러한 예는 작업과 관련이 있을 뿐만 아니라 데이터의 다양성을 요약할 수 있도록 다양해야 합니다. 특히 파이프라인에 단계가 많거나 입력이 긴 경우 CoT를 사용할 때 few-shot 학습을 위한 데이터 '레이블 지정'이 조금 더 어려울 수 있습니다. 그러나 일반적으로 결과는 노력할 가치가 있습니다. 또한 몇 가지 예에 레이블을 지정하는 것이 기존 ML 모델 개발에서와 같이 전체 훈련/테스트 세트에 레이블을 지정하는 것보다 훨씬 저렴합니다.

프롬프트에 예제를 추가하면 요구 사항을 더 잘 이해할 수 있습니다. 예를 들어 글머리 기호 형식의 최종 요약을 선호한다는 것을 입증하면 모델이 템플릿을 미러링합니다.

 


Summarizing Best Practices

프롬프트 엔지니어링을 위한 모범 사례를 요약하려면 다음을 고려하십시오.

  • 실험하는 것을 두려워하지 마십시오. 다양한 접근 방식을 시도하고 점진적으로 반복하면서 모델을 수정하고 한 번에 작은 단계를 수행합니다.
  • 입력에 구분 기호를 사용하고(예: ) 구조화된 출력을 요청합니다(예: JSON)
  • 작업을 완료하기 위한 작업 목록을 제공합니다. 가능할 때마다 모델에 일련의 작업을 제공하고 '내부 생각'을 출력하도록 합니다.
  • 짧은 출력의 경우 여러 제안을 요청하십시오.
  • 예를 제공하십시오. 가능하면 원하는 출력으로 데이터를 나타내는 여러 가지 다양한 예를 모델에 보여줍니다.

이 프레임워크가 정보 추출, 요약, 이메일과 같은 텍스트 생성 등과 같은 광범위한 일상 작업을 자동화하기 위한 충분한 기반을 제공한다고 말하고 싶습니다. 성능을 더욱 향상시키기 위해 특정 데이터 세트에서 모델을 fine-tuning하여 모델을 최적화합니다. 또한 플러그인에이전트가 빠르게 개발되고 있지만 완전히 다른 이야기입니다.


References

반응형