주간 SaaS 이번주 소개글
🐧 (LLM 노동자) : LLM prompt 에 대한 소개와 이를 SaaS product 에 적용하는 방법에 대해서 설명하는 글입니다. 글 내용 중에 서비스에 대한 홍보가 있어서 이 내용을 빼고 실제 현업에서 경험했던 이야기를 섞어서 글을 구성해 보았습니다. 이따금씩 등장하는 펭귄에 너무 놀라지 마세요!
프롬프트 엔지니어링 소개
최근 몇 년 동안, 특히 최근 몇 달 동안 자연어 처리(NLP)와 생성형 AI 에서는 점점 더 정교해지는 언어 모델들이 나타났습니다.
Open AI에서 개발 → GPT-3, InstructGPT, GPT-3.5-Turbo, GPT-4
Google에서 개발 → LaMDA, PaLM
메타 개발 → LLaMA
허깅페이스와 빅사이언스 그룹에서 개발 → BLOOM
이러한 LLM 중 다수는 텍스트 생성에 있어 뛰어난 기능뿐만 아니라 간단한 분류부터 세계에서 가장 까다로운 시험 통과에 이르기까지 거의 모든 유형의 작업을 수행할 수 있는 능력으로 화제가 되고 있습니다.
🐧 : 최근 Claude AI 도 장안의 화제가 되기도 했었습니다. 이런 정확도 높은 '제너럴리스트' 모델들이 계속 등장하면서, AI model 을 Full fine-tuning(리소스가 많이 소요되며, 일반 기업에서는 비용 이슈때문에 하기 힘든 방식이기도 합니다. 모델을 전체 교환한다고 생각하시면 됩니다.) 하거나 , 직접 만드는 것이 아닌 만들어진 모델을 살짝만 고쳐서 사용하는 LoRA 방식과 같은 기법을 사용하기도 합니다. 그것도 상황이 되지 않는다면, 아예 GPT-4 처럼 api 를 제공하는 모델을 사용하면서 'prompt engineering' 으로 모델을 튜닝한 효과를 가져가기도 합니다. 오늘은 이 prompt engineering 에 대해서 다루어 보고자 합니다.
프롬프트 엔지니어링은 LLM의 공통점, 즉 어떤 작업을 수행하려면 텍스트로 구성된 프롬프트가 필요하다는 점에서 점점 더 귀중한 기술이 되어가고 있습니다. 간단한 분류 작업을 수행하든 복잡한 Q&A 시스템을 위한 프롬프트를 구축하든 관계없이 프롬프트는 모델이 원하는 작업을 수행하도록 안내합니다.
먼저 프롬프트란 무엇인가요? 간단히 말해서 프롬프트는 LLM으로부터 특정 응답이나 작업을 트리거하는 텍스트입니다. 프롬프트의 목표는 모델의 행동을 안내하는 것이며, 다양한 프롬프트 기법을 사용하여 이를 수행할 수 있습니다.
위의 프롬프트에서 볼 수 있듯이 모델에 정보 추출 작업을 수행하도록 지시 (Extract the most important information in the meetings notes and convey it into bullets points 부분) 하고 있습니다. 그런 다음 {meeting_notes}라는 변수를 이용해서 회의 노트를 전달하고 있습니다.
이 프롬프트와 LLM, 약간의 코드만 있으면 회의 노트를 작성하고 회의 중에 논의된 가장 중요한 정보가 포함된 글머리 기호를 생성하는 작은 애플리케이션을 아주 쉽게 만들 수 있습니다.
이제 프롬프트를 엔지니어링했다고 말할 수 있습니다! 프롬프트 엔지니어링은 NLP 분야의 새로운 패러다임입니다. 사전 학습된 대규모 언어 모델을 갖추기 전에는 사전 학습된 모델을 다운스트림 작업에 맞게 미세 조정하는 것이 사실상의 접근 방식이었습니다.
현재 '사전 학습 및 미세 조정'하는 방식에서 '사전 학습, 프롬프트 및 예측'으로의 전환이 이루어지고 있으며, 이는 '사전 학습, 프롬프트 및 예측' 이라는 논문에서도 언급된 바가 있습니다.
신중하게 설계된 프롬프트의 도움으로 모델이 특별히 학습되지 않은 작업을 수행하도록 사전 학습된 모델 동작을 변경할 수 있습니다. ( 🐧 : 예를 들면 원래 요약만 하던 모델에게 주문을 받게끔 동작시킬 수 있습니다. 모델에게 주문을 받아야 한다는 role 을 지정하고, 이 role 에 연결된 동작들을 알려주면 됩니다. LLM 은 좋은 학생입니다.)
따라서 프롬프트 엔지니어링의 목표는 LLM이 당면한 작업을 해결할 수 있는 최적의 프롬프트를 찾는 것입니다. 텍스트 생성 AI의 영역에서는 적절한 프롬프트를 제공하는 것이 생성된 콘텐츠의 품질과 관련성에 큰 차이를 만들 수 있습니다.
🐧 : 이따가 언급될 LLM 오케스트레이션 서비스인 Langchain 의 서비스 중 하나인 Langsmith에는 프롬프트를 올리고 다운받을 수 있는 Hub 를 제공하기도 합니다.
프롬프트 엔지니어링은 예술과 과학의 결합으로 볼 수 있습니다. 잘 알려진 몇 가지 프롬프트 방법이 있으며 그 중 몇 가지를 살펴보겠습니다.
Zero-shot prompting
위에서 회의 노트에서 정보를 추출하기 위해 만든 프롬프트는 Zero-shot 프롬프트입니다. Zero-shot 학습은 모델의 사전 훈련 또는 지침 미세 조정을 활용하여 훈련 중에 특정 작업의 예를 보지 않고도 작업을 수행합니다. (즉, 정답을 직접적으로 알려주지 않아도 작업을 수행합니다. )
텍스트 생성 경험에 따르면 Zero-shot 프롬프트는 다양하고 창의적인 결과물을 생성하는 데 탁월합니다. 그러나 원하는 결과를 뽑아내기는 사실상 힘듭니다.
좋은 전략은 Zero-shot 프롬프트 엔지니어링을 시작하고 원하는 출력을 얻을 수 없는 경우에만 Few-shot 프롬프트로 이동하거나 복잡한 프롬프트 엔지니어링 기법 ( 🐧 : 최근에는 LLM 이 사고하는 방식을 바꾸는 ReAct 방법이 유행입니다. Prompt 를 만드는 방법이 계속해서 변하므로, 또 새로운 기법이 나올 수도 있습니다.) 으로 넘어가는 것입니다.
아래는 Zero-shot 프롬프트의 예시입니다.
Classify the text into neutral, negative or positive.
Text: I think the vacation is okay.
Sentiment:
이처럼 문제를 정의하고 바로 답을 내놓도록 유도 하고 있습니다.
Few-shot prompting
원하는 대로 LLM 이 동작하지 않거나, 작고 빠른 모델로 작업해야 할 때 Few-Shot 프롬프트가 매우 효과적입니다. Few-Shot 프롬프트를 사용하면 상황에 맞는 학습을 통해 모델을 원하는 출력으로 안내할 수 있습니다.
제목 줄에서 키워드를 추출하기 위한 간단한 예는 아래에서 확인할 수 있습니다:
앞의 Zero-shot 과 다른 점을 눈치채셨나요? 해당 프롬프트에는 '정답' 이 있습니다. 그래서 'Few' 라는 단어가 들어가게 됩니다. 몇 개의 정답을 LLM 에게 주었는지에 따라 이 Few 는 달라집니다. 이것은 4-shot 예시로, 예시 4개를 모델에 전달하고 있습니다.
경험상 소수 샷 프롬프트는 작은 모델이나 기본 모델, 그리고 창의성이나 다양한 결과물이 많이 필요하지 않은 작업에서 비교적 잘 작동합니다. (🐧 : 정확도가 중요한 작업에서 특히 유용합니다!)
이 프롬프트 기법을 사용하면 정확도는 올라가지만, 생성된 대답은 다양하지 않게됩니다. 이는 애플리케이션에 따라 고려해야 할 사항입니다.
프롬프트 체인
플로우라이트에서 사용하는 고급 프롬프트 기법을 프롬프트 체인이라고 합니다. 간단히 말해 프롬프트의 출력이 체인에서 다음 프롬프트의 입력이 되는 것입니다.
이 기법은 복잡한 작업에 도움이 되며, 지연 시간이 길어지고(모델에 대한 호출이 많아짐) 잠재적으로 비용이 더 많이 드는 대신 LLM을 더 잘 제어할 수 있습니다.
회의 노트에서 글머리 기호를 추출하기 위해 만든 제로 샷 프롬프트로 돌아가서, 글머리 기호를 가져와서 지정된 형식의 문서를 생성하는 프롬프트를 만들 수 있습니다. 이것이 프롬프트 연쇄의 예가 될 수 있습니다.
프롬프트 출력이 독립적인 경우, 체인의 한 단계에서 동시 호출을 실행한 다음 다음 프롬프트의 입력으로 합산하는 것도 가능합니다.
LLM을 기반으로 SaaS 제품을 구축하는 경우에 줄 수 있는 조언
다음은 신속한 엔지니어링을 시작하고 LLM을 기반으로 제품을 구축하려는 경우 유용할 수 있는 몇 가지 팁입니다.
- LangChain과 같은 라이브러리를 사용하여 애플리케이션 개발
- 처음 시작할 당시에는 LangChain과 같은 라이브러리나 Dust와 같은 플랫폼이 없었습니다. 모든 것을 처음부터 코딩해야 했습니다. 이러한 도구를 사용하면 더 빠르게 실험하고, 체계적으로 관리하며, 프로덕션 환경에서 프롬프트를 배포할 수 있습니다.
- 🐧 : LangChain 과 더불어 LlamaIndex 도 많이 쓰는 라이브러리입니다. 라이브러리마다 같은 프롬프트여도 다르게 동작하기도 하고, 이에 따라 정확도가 달라지기도 하므로, 다양한 라이브러리를 검토해 보셔도 좋습니다.
2. Application 요구 사항 파악
- 더 강력한 LLM은 더 나은 품질의 결과물을 생성하지만 지연 시간이 길고 비용도 더 많이 듭니다. 애플리케이션에 따라 허용 가능한 수준의 품질을 유지할 수 있다면 지연 시간과 비용이 더 중요한 요소가 될 수 있습니다. 이는 새 모델로 새 프롬프트 개발을 시작하기 전에 내려야 하는 중요한 결정입니다.
3. 프롬프트를 배포하기 전에 프로덕션 데이터를 사용해서 광범위하게 테스트
- 개방형 텍스트 생성에서는 생성된 결과물의 품질을 측정할 수 있는 신뢰할 수 있는 자동 측정지표가 없습니다. 평가 프로세스의 중요한 부분은 사람의 평가입니다. 따라서 팀원들과 공유하거나 상당한 양의 프로덕션 데이터에 대해 테스트하기 전까지는 완벽한 프롬프트를 만들었다고 생각할 수 있습니다. 개발자는 편견이 있고 이러한 모델이 어떻게 작동하는지 잘 알고 있습니다. 이는 잘못된 평가로 이어질 수 있습니다. 항상 회사의 다른 팀과 함께 내부 테스트를 실행하고 프로덕션 데이터를 가져와서 결과물을 평가하는 온라인 평가를 실행하세요. 이렇게 하면 예상치 못한 동작을 얼마나 많이 발견할 수 있는지 놀랄 것입니다.
- 🐧 : 하나의 데이터셋으로 Few-shot 을 하게 되면 그 데이터셋에 맞춰진 prompt 가 나오게 되므로 다른 데이터셋으로 테스트 할 때 정확도가 떨어지는 경우가 많이 발생합니다. 따라서 최대한 다양한 데이터를 가지고 테스트해야 합니다.
4. 모델 출력에 대한 사용자 피드백 수집
- 텍스트 생성에 대한 신뢰할 수 있는 지표가 없기 때문에 사용자 피드백은 모델이 어떻게 작동하는지 알 수 있는 가장 중요한 지표 중 하나입니다. 이 피드백을 사용하여 모델을 비교하거나 A/B 테스트 실험을 실행하여 프롬프트를 테스트 해 볼 수 있습니다.
5. 새 모델이 출시되면 재작업이 필요합니다.
- davinci-003에서는 잘 작동하는 프롬프트가 GPT-3.5 turbo에서는 제대로 작동하지 않을 수 있습니다. 실제로 이것이 저희의 경험에 따르면 그렇습니다. 더 새롭거나 더 강력한 모델이라도 다른 모델로 전환하려는 경우 프롬프트 엔지니어링 또는 Hyper parameter 튜닝 측면에서 약간의 재작업이 필요할 것으로 예상됩니다.
- 🐧 : GPT-4 에서는 잘 돌아가던 프롬프트가 GPT-3.5 에서는 Token limit 이슈로 돌아가지 않을 수도 있습니다. GPT 에 최대한 보낼 수 있는 프롬프트 토큰 갯수는 버젼마다 다르게 설정되어 있어서, 이 토큰을 넘어서면 Token limit 이 걸리게 되며 에러가 나게 됩니다. 따라서 GPT-3.5 에서 Few-shot 을 하기 위해 많은 양의 프롬프트를 작성하게 되면 limit error 가 발생할 수 있습니다.
댓글
의견을 남겨주세요