개발을 위한 prompt 엔지니어링: 효율적인 가이드라인과 적용
개발을 위한 prompt 엔지니어링 에 대하여 Deeplearning AI와 OpenAI 사가 공동으로 준비한 강의내용에 대한 리뷰를 써 보았습니다.
개발과 관련된 LLM 적용은 이른바 Copilot과 관련된 자동 코드 작성 툴을 생각하기 쉬우나 의외로 기본적인 prompt engineering을 사용하여 많은 어플리케이션을 빠르게 작성하고 배포할 수 있습니다.
현업에 적용할 수 있는 경우는 실제로 prompt engineering을 개발에 적용하는 경우 내부에서 공유할 수 있는 check list에 대한 초안을 얻을 수 있다는 것이 될 수 있습니다.
Instruction Tuned LLM

그냥 ChatGPT를 사용하는 것을 Base LLM이라고 하고 여기에 사용자의 의도를 제대로 출력할 수 있도록 필요한 작업 지시를 만드는 것을 프롬프트 작성이라고 합니다.
개발을 위한 prompt 엔지니어링 자체는 Instruction tuned LLM방식을 사용합니다.
추가적인 Fine tuning이나 RAG를 위한 추가 비용 소모 없이 빠르게 결과를 확인 할 수 있습니다.
이렇게 작업 지시서의 내용을 포함시켜 LLM에 질의한 결과는 이른바 환각 증상을 줄일 수 있을 뿐만 아니라 우리의 목적대로 안전하게 사용을 할 수 있는 결과물을 만들어 내는 데 도움을 줍니다.
또다른 장점은 사람이 산출물을 내는 경우 품질이 균일하지 않을 수 있으나 LLM을 사용하는 경우 일정한 품질과 문장의 톤을 유지할 수 있다는 장점이 있습니다.
개발을 위한 prompt 엔지니어링 Guidelines

OpenAI 사에서 제공하는 프롬프트를 작성하는 기본적이 가이드라인입니다.
사내에서 프롬프트 작성 rule의 기본 skeleton으로 사용하고 각 회사마다 필요한 부분을 추가하여 업무에 적용하면 좋을 것 같다라는 생각이 들었습니다.
개발을 위한 prompt 엔지니어링 2가지 원칙

- To write clear and particular instruction
- Use delimeters
- ”’, “`,—,<>, <tag></tag>
- prompt injection for model to distinguish between instruction and the content
- Aak for structured output
- Ask the model to check whether conditions are satisfied
- Few shot prompting
- Use delimeters
- Give the model time to think
- Write the prompt for model to conosume more computation time
- Tactic 1
- Specify the steps required to complete a task
- Tactic 2
- Instruct the model to work out its own solution before rushing to a conclusion
- Tactic 1
- Write the prompt for model to conosume more computation time
Iterative

입력은 제품 사양서의 텍스트입니다. 정확해야 하며 굉장히 딱딱하게 표현된 text양식의 문서입니다.
이 입력을 사용하여 최종 출력을 마케팅을 위한 말랑말랑한 표현으로 바꾸되 짧고 간결하게 그리고 구매자의 구매욕구를 불러 일으킬 수 있는 표현으로 바꾸는 일입니다. 문서의 포맷은 HTML입니다.
물론 정확한 정보 전달도 문서의 중요한 부분입니다.
프롬프트를 Iterative하게 작성하는 절차는
- 문장의 길이를 제한하여 요약을 하도록 지시.
- 구매자(문서의 최종 소비자)를 위하여 기술적인 부분을 부각시키되 소재 부분에 집중하도록 한다.
- 마지막으로 중요한 Feature들을 테이블 형태로 정리하도록 지시하며 전체 문서의 포맷을 HTML형태로 하도록 지시한다.
이런 식으로 반복적으로 프롬프트를 완성하면 원하는 톤에 맞추어 임의의 제품 사양서를 마케팅 문서로 변환할 수 있는 API code가 완성됩니다.
적용 예로서는 SW Feature 설명서와 같은 많은 양의 방대한 마케팅자료가 필요한 경우 SW 기능 설명서와 같은 기술문서에서 바로 출력하여 1차 초안을 만들어 내는데 적용할 수 있을 것 같습니다.
Summarizing

입력은 고객들이 웹사이트에 남긴 리뷰 텍스트입니다. 고객에 따라 다양한 표현과 길이가 있는 이른바 정규화 하기 힘든 표현입니다.
이 입력을 사용하여 일정한 길이의 그리고 제품 판매 관리에 대한 가격 및 배송 정보가 반드시 들어가 있는 표현을 얻고자 합니다.
프롬프트를 원하는 요약을 얻을 수 있도록 작성하는 절차는
- 문장의 길이를 제한하여 요약을 하도록 지시.
- 고객 리뷰에서 필요한 배송 및 가격 그리고 밸류에 대한 사항이 들어갈 수 있도록 추가 프롬프트 구문 입력 및 조정.
이렇게 해서 튜닝된 프롬프트는 일정치 않은 고객의 리뷰 텍스트를 필요한 사항이 반드시 들어가되 일정한 크기의 텍스트로 변환할 수 있도록 해줍니다.
경우에 따라 JSON형태의 format으로 출력을 할 수 있게 적용하면 Vector DB 스키마에 맞추어 고객 리뷰사항을 내부 DB화 하는데 적용가능한 툴로 활용할 수 있겠다라는 생각이 들었습니다.
개발을 위한 prompt 엔지니어링 , 그 외의 사항들
그 외 위에 언급된 Summarizing 과정을 응용하여 작성된 리뷰의 내용을 바탕으로 사용자가 제품을 사용하고 어떤 긍정적인지 부정적인지 느낌을 찾아내는 일, 그리고 특정 주제를 뽑아내는 일들도 프롬프트 엔지니어링을 사용한 API code를 사용하여 쉽게 자동화에 적용가능한 tool을 만들어 내는 과정들에 대해 경험해 볼 수 있었습니다.
Conclusion
초창기 LLM을 사용하는 경우 “프롬프트 엔지니어링”이라는 표현이 너무 거창한게 아닌 가라는 생각을 했습니다.
그러나 프롬프트라고 하는 이른바 작업 지시서를 어떻게 잘 작성하고 이것을 API code화 시켜서 사용하느냐에 따라 개발과정에서 발생될 수 있는 많은 작업들을 자동화 하거나 일차 초안을 작성하는데 사용할 수 있다는 가능성을 찾을 수 있었습니다.
교육 내용 중 별도로 챗봇을 프롬프트 엔지니어링을 사용하여 만드는 과정이 있었는데 너무 좋은 느낌을 받아서 별도의 포스팅으로 다뤄보도록 하겠습니다.
![A logo representing a calm, happy Sweden countryside village with only blue color palette [and has a minimalist and modern style] [incorporating elements of nature] [with a touch of Scandinavian design] [that reflects a sense of community]](https://raonstad.com/wp-content/uploads/2024/03/img-rsVXmvlyKd0umO7b2rMmaUnI.png)