-
프롬프트 엔지니어링LLM 2024. 9. 27. 03:01
프롬프트 엔지니어링
📌 프롬프트 엔지니어링은 생성형 AI 모델에게 제공되는 입력(prompt)을 디자인하고, 모델의 반응을 가이드하여 원하는 결과를 얻을 수 있도록 하는 과정이다.
프롬프트의 구성요소는 크게 4가지로 분류할 수 있다. 물론 네 가지 요소가 모두 반드시 필수적인 건 아니다.
1. Instruction (지시)
LLM 모델이 수행하기를 원하는 구체적인 목표
2. Context (문맥)
LLM이 해야 할 작업을 이해하는 데 필요한 배경 정보(외부 정보나 추가 문맥)
3. Input Data (입력데이터)
응답 받고자 하는 것에 대한 입력 데이터나 질문
4. Output Indicator (출력 표시기)
결과물의 유형 또는 출력 형식(format)
프롬프트 작성 가이드
프롬프트를 작성할때 사용자가 의도한대로 좀더 나은 응답을 얻기위해 고려하면 좋은 요소들
1. 주제(Topic) 는 무엇이고 수행해야할 작업(Task)은 무엇인가?
- AI에게 물어볼 궁금한 주제가 무엇이고 어떤 작업을 시킬것 인지를 명확하고 간단명료하게 규정하는 일이 중요하다. 수행해야할 작업이 난해하고 복잡할수록 AI 모델이 이해하기 어려울 수가 있기 때문이다.
2. 어떤 역할(Role) 을 부여해야 하는가?
- 답변자로써 페르소나를 지정. 답변에 대한 배경 지식을 가지고 답하기 때문에 더 높은 정확도로 답하게 된다.
- 예시) 당신은 영어 선생님입니다. 영어의 문법에 대해 설명해주세요.
3. 청중(Audience)은 누구인가?
- 답변의 대상이 되는 특정 인구, 그룹, 또는 개인의 페르소나
- 예시) 일식 요리사를 위한 일본 전통요리 레시피를 작성해주세요.
4. 필요한 정책( Policy )은 무엇인가?
- 응답을 만들때 따라야 하는 특정 정책이나 규칙
Style : 응답에 사용해야 할 특정 톤,유머,감정 등의 스타일
예시) 공손하고 정중한 말투로 사과 메일을 작성해주세요Constraint : 응답이 따라야 하는 특정 제한 사항이나 조건
예시 ) 3분 내로 읽을 수 있는 간략한 연설문을 만들어주세요.5. 응답결과에 대한 예시(Examples)를 제공할 수 있는가?
- 원하는 응답의 예시를 제공하여 원하는 출력을 더 잘 이해하도록 돕습니다.
프롬프트 설계에 관한 일반적인 팁과 주의사항
1) 시작은 간단하게
프롬프트 설계를 시작할 때는 프롬프트 설계가 최적의 결과를 얻기 위해 많은 실험이 필요한 반복적인 과정이다.
일단 OpenAI 또는 Cohere에서 제공하는 간단한 플레이그라운드로 시작해 보는 것이 좋다.
간단한 프롬프트로 시작해서 요소나 문맥을 계속해서 추가하면서 프롬프트의 버전 관리를 잘 하는게 중요하다.
여러 하위 작업을 포함한 큰 단위 작업을 실행해야 하는 경우, 작업을 보다 작은 단위로 세분화하고 결과가 개선됨에 따라 점진적으로 구축해 나갈 수 있다. 구체성, 단순성, 간결함을 통해 더 나은 결과를 얻을 수 있고, 이러한 방식을 통해 프롬프트 설계 초기 과정에 너무 많은 복잡성이 추가되는 것을 방지할 수 있다.
2) 지시
‘작성하기’, ‘분류하기’, ‘요약하기’, ‘번역하기’, ‘정렬하기’ 등의 명령어를 사용하여 달성하고자 하는 결과를 모델에 지시함으로써 다양한 간단 작업에 대해 효과적인 프롬프트를 설계할 수 있다.
또한, 무엇이 가장 효과적인지 확인하기 위해서는 여러 차례의 실험이 필요하다. 다양한 키워드, 문맥 및 데이터를 활용하여 다양한 지시를 내려 보고, 특정 사용 사례와 작업에 가장 적합한 방법을 확인해야 한다. 일반적으로, 수행하고자 하는 작업과 관련된 문맥이 구체적이고 적절할수록 더 좋은 결과를 얻을 수 있다.
프롬프트의 시작 부분에 지시 사항을 명시하는 것도 좋은 아이디어다.
Prompt:
### 지시 ### 다음 텍스트를 스페인어로 번역해 줘. 텍스트: "안녕하세요!"
Output:
¡Hola!
3) 특이성
모델에 실행시킬 지시와 작업을 구체적으로 설명해야 한다. 프롬프트가 상세하고 구체적일수록 결과는 더 좋아지기 때문이다. 특정한 출력이나 스타일을 얻고자 하는 경우에는 특히 중요하다. 더 나은 결과를 내는 특정한 토큰이나 키워드는 존재하지 않는다. 좋은 형식과 상세한 프롬프트를 준비해야 한다. 프롬프트에 예시를 제공하는 것은 특정한 형식으로 출력을 얻는 데 실제로 매우 효과적이다.
프롬프트의 길이에는 제한이 있기 때문에 프롬프트를 설계할 때는 꼭 염두에 두어야 한다. 얼마나 구체적이고 상세하게 작성해야 하는지 생각해야 하며, 불필요한 세부 사항이 많은 건 좋지 않다. 관련성이 있어야 하고, 당면한 과제에 기여해야 한다.
프롬프트의 최적화를 위해 많은 실험과 반복을 거듭해야 한다.
Prompt:
다음 텍스트에서 장소의 이름을 추출해 줘. 원하는 형식:Place: <comma_separated_list_of_places> 입력: "이러한 발전은 연구자들에게 격려가 되지만, 많은 것들이 여전히 수수께끼입니다. 리스본에 있는 샴팔리마우드 센터(CCU: Champalimaud Centre for the Unknown)의 신경면역학자인 Henrique Veiga-Fernandes는 "뇌와 주변부에서 보이는 효과 사이에 블랙박스가 있는 경우가 종종 있습니다."라고 말합니다. 그리고 다음과 같이 덧붙입니다. "치료적 맥락에서 이를 사용하고자 할 경우, 그 메커니즘을 실제로 이해할 필요가 있습니다."
Output:
장소: 샴팔리마우드 센터(CCU: Champalimaud Centre for the Unknown), 리스본
4) 부정확성 피하기
상세하게 기술하고 형식을 개선하는 방법에 대한 위 내용을 고려할 경우, 프롬프트를 교묘하게 다루려 하거나 부정확한 설명을 작성하는 등의 함정에 빠지기 쉽다. 프롬프트는 구체적이고 직접적이어야 더욱 좋은 결과를 얻을 수 있다. 직접적일수록 메시지가 더 효과적으로 전달된다. 사실상 효과적인 커뮤니케이션 방식과 매우 유사하다.
예시) 프롬프트 엔지니어링의 개념을 배우고자 하는 경우
프롬프트 엔지니어링의 개념을 설명해 줘. 설명은 간결하게 몇 문장으로만 하고 너무 자세히는 하지 말아 줘.
위의 프롬프트에서는 몇 문장을 사용해야 하는지, 어떤 스타일을 사용해야 하는지 명확하게 지시되어 있지 않다. 물론 이 프롬프트로도 괜찮은 답을 얻을 수 있겠지만, 아래와 같이 구체적이고 간결하며 보다 정확한 프롬프트가 더 좋다.
고등학교 1학년 학생에게 프롬프트 엔지니어링의 개념을 2~3줄의 문장으로 설명해 줘.
5) 해야 하는 것과 하지 말아야 할 것
프롬프트를 설계할 때 적용할 수 있는 또 다른 팁은 ‘하지 말아야 할 것’보다는 ‘해야 하는 것’에 초점을 두는 거다.
다음은 ‘하지 말아야 할 것’에 초점을 두어 영화 추천 챗봇이 실패한 예시이다.
Prompt:
다음은 고객에게 영화를 추천하는 상담원입니다. 관심사를 묻지 마세요. 개인정보를 묻지 마세요. 고객: 제 관심사를 바탕으로 영화를 추천해 주세요. 상담원:
Output:
네, 당신의 관심사를 바탕으로 영화를 추천해 드리겠습니다. 액션, 코미디, 로맨스, 아니면 그 밖의 장르, 어떤 종류의 영화를 좋아하세요?
👌 해야하는 것에 초점을 맞춰 개선된 프롬프트는 다음과 같다.
Prompt:
다음은 고객에게 영화를 추천하는 상담원입니다. 상담원은 글로벌 인기 영화 중에서 영화를 추천해야 합니다. 사용자의 관심사를 묻지 않고, 개인 정보를 요구하지 않아야 합니다. 상담원이 추천할 영화가 없는 경우 "죄송합니다.오늘 추천할 영화를 찾을 수 없습니다." 라고 응답해야 합니다. 고객: 제 관심사를 바탕으로 영화를 추천해 주세요. 상담원:
Output:
죄송합니다만, 당신의 관심사에 관한 정보를 찾을 수 없었습니다. 하지만 지금 가장 인기 있는 영화에 대한 목록이 있습니다: [영화 목록]. 좋아하는 것을 찾으시길 바랄게요!
약간 말장난같기도 하지만..
결론은 '간결하고 직관적인 표현방식으로 핵심'을 말해야 하며
'역할이나 지켜야 할 룰이 있다면 그 또한 명확하게 인지시켜줘야 한다'는 거다.
이번 최종 프로젝트에서 유저 기능 외에, LLM기능 붙여서 gpt로 유저 채팅 기능에 나쁜말 하는 유저들을 가려내는 기능 구현을 맡았다. 그래서 프롬프로 엔지니어링에 대해 알아봤다. 잘 만들어보고 싶다.
이번주 내내 기획만 했다. 기획을 하며 SRS, API명세서, ERD, 와이어프레임, WBS 문서들을 만들었다.
기획은 재밌으면서도 기능 구현보다 훨씬 피곤한 작업인 것 같다는 생각이 들었다🫠
'LLM' 카테고리의 다른 글
LangChain 과 RAG (4) 2024.09.13