AI 인공지능/OpenAI-API

[OpenAI API-5] Prompt Engineering

에하유 2023. 8. 2. 09:58

파이썬으로 도메인 특화 챗봇 모델 만들기 - 5

 

프롬프트 엔지니어링에 대해 간략하게 기재하고

내가 했던 시도들에 대해 정리하고자 한다.

 

- 목 차 -

  • Prompt Engineering 이란?
  • Prompt Engineering 하는법
  • Try and Errors

 


 

Prompt Engineering 이란?

  • 프롬프트란 자연어를 사용해 생성형 AI가 이해하고 실행할 수 있게 지시하고 상기시켜주는 말로, 이 프롬프트를 활용하여 AI의 성능을 최대로 끌어올릴 수 있도록 만드는 것이 프롬프트 엔지니어링입니다.
  • Chat-GPT가 인기를 끌면서 주목을 받기 시작한 기술로,생성형 AI인 챗봇의 성능과 가장 밀접한 연관을 가지고 있습니다. OpenAI GPT-3 모델과 같은 대규모 언어 모델을 활용한 작업에 널리 사용되며, 다양한 분야에서 적용될 수 있습니다. 예를 들어, 번역, 요약, 질문 답변, 콘텐츠 생성, 챗봇 개발 등의 작업에서 프롬프트 엔지니어링을 사용할 수 있습니다.

 

 

Prompt Engineering 하는법

익숙한 chat-gpt 화면을 통해 프롬프트의 효과를 먼저 살펴보자,

 

프롬프팅 하지 않은 대화

프롬프팅을 전혀 하지 않은 일반적인 chat-gpt의 대화이다.

우리가 질문을 하면 챗쥐피티는 열심히 구구절절 설명을 해준다.

일반적인 대화

 

프롬프팅 대화 1

아주 간단하게 2가지의 지시를 부여하였다.

1) 초등학생에게 설명할것

2) 대답은 3문장 이내로 할것

위의 지시를 그냥 대화로만 작성하여도, 결과는 확연히 달라진다. 프롬프트 매직-⭐

프롬프트 엔지니어링 대화 1

 

프롬프팅 대화 2

여기서 첫번째 설정인 대상을 초등학생 → 대학생으로 변경시켜 차이점을 살펴 보자.

프롬프트 엔지니어링 대화 2

초등학생에게 설명하는 것보다는 전문적인 어휘를 사용하는 것을 확인할 수 있습니다.

생각보다 간단하죠? 이러한 프롬프팅을 적절하게 활용 하면 보다 폭넓게 커스터마이징하여 생성형 ai를 사용할 수 있습니다.

 

근데 이걸 막상 내 프롬프트에 적용하려니...

어떤 문장, 어떤 단어로 인해 이 프롬프트가 작동하는지 파악할 수 없어서...

참 애먹었다 ㅠ

 

Try and Errors

나의 시도들을 정리해보고자 한다..... 살짝 얘기 했듯이, 프롬프트 테크닉을 열심히 살펴봐도 막상 내꺼에 적용하려니 쉽지 않았습니당... 프롬프트엔지니어링 쉬워보이는데 ㅠ.... 

여러 시도를 통해 얻은 노하우...대방출 

 

 

1) 프롬프트 언어 설정

 

① 한글 + 영어 혼합

"You are a friendly and professional public data diagnostic assessment Counseling chatbot, 'b2en-bot'. You should answer the customer's inquiry kindly.Given a question, have to answer it using the content of the file extracts below, and if you cannot answer, or find a relevant file, just output \"공공데이터 품질 관리 수준 진단 평가 관련된 질문을 입력해주세요\". 
... 
\n\n 문의주신 <"+question+">에 대한 답변입니다.\" The last word of the answer should end with \"감사합니다.\""

OpenAI에서 제공하는 베이스 코드라인을 이용하였는데, 거기에 영어로 작성된 프롬프트가 포함되어 있었습니다. 저희가 만드는 챗봇은 한국어를 기반으로 하기 때문에 챗봇이 대답해야하는 부분을 한글로 수정하여 프롬프트를 작성하였습니다. 한글과 영어 혼합 설정은 초반의 시도로 단점이나 문제를 느낄 수 없었지만, 더 좋은 방법을 강구하기 위해 다양한 언어 설정을 시도하였습니다.

 

② 한글

한글로만 작성해도 챗봇이 원활하게 돌아간다는걸 확인하였습니다. 아무래도 한글로 작성하는게 프롬프트 수정하거나 삽입하기에 용이하여 한글로 수정하였습니다. 토큰 계산에서도 확인했듯이, 한국어는 토큰을 너무 많이 잡아먹습니다. 이로 인해, 대화문이 끝까지 나오지 않거나 연결이 끊기는 상황이 발생하여, 수정하게되었습니다.

 

"너는 친근하고 전문적인 이라는 이름을 가진 상담사야. 너는 고객의 문의에 친절하게 답변해야해. 질문이 주어지면 아래 주어진 문서의 내용을 사용하여 최대한 보기 좋게 정리해서 답변을 해야하며,|
...
대답을 할 때는 항상 제일 앞에 \. \n문의주신 <"+question+">에 대한 답변입니다.\"를 붙이고 제일 뒤에 \"감사합니다.\"를 말해."

 

 ③ 영어

챗봇이 대답해야하는 부분까지 영어로 작성 후 이를 한글로 대답해라 라는 문구를 추가하였습니다. 토큰 제한을 해결하고 성능도 더 좋아졌기 때문에 최종적으로 영어로 선택하였습니다.

"You are a friendly and professional counselor named . You should answer the customer's inquiry kindly. \
...
. \n\nIf the question is unrelated to the document, \n\n\n\"I'm only dealing with the public data quality control level diagnostic assessment. \nPlease ask me only related questions or ask me only specific questions. Thank you.\"\n\nAnswer in Korean like this.

 

 

 

2) 답변 속도 관련 설정

 

“3문장 내 요약 문구 추가

Sprint1를 마무리하며 성능체크를 하였을 때, 굉장히 느리다는 이슈가 있었습니다. 그 원인은-gpt 처럼 실시간으로 한글자씩 산출하는 것이 아닌 답변 전체가 다 완성되어야 산출이 되기 때문에 답변의 길이가 길면 길수록, 대답을 받기까지의 대기시간이 오래걸렸습니다. 실시간 산출은 프론트,백 단의 기술문제로 기간내에 구현하기 힘들었습니다.

고민 끝에, 프롬프트의 설정으로 답변 속도를 조절하는 방향으로 설정하였습니다.

 

"“The important thing is to answer quickly and briefly, with only the main points, within 3 sentences or less.”

 

 

방법은 단순하게, “3문장 내로 요약 답변문구 한마디만 추가한것입니다.

5어절밖에 안되는 문장을 추가함으로써, 평균 10초가량을 단축하게 되었습니다.

구분 정확도
Sprint 1 24.45
Sprint 2 14.53

프롬프트의 위력…. 너무 신기하지 않나요?

 

3) 답변 성능 관련 설정

 

스코어를 추가하여 0.83 미만의 스코어는 대답을 하지 않도록 설정

Sprint1 의 성능 이슈 중 제공된 정보와 관련 없는 질문에 대답하지 않아야 하는데, 챗쥐피티 자체적인 뛰어난 능력으로 대답을 해버린다는 문제와,

챗봇의 구조 상 질문의 내용과 유사한 정보를 챗봇에게 임베딩시킨 문서내에서 찾아 대답하는데, 이 과정에서 유사하지 않은 정보를 매핑 시켜 엉뚱한 대답을 해버린다는 문제가 발생했습니다.

저희는 챗봇이 제공된 정보에 대한 질의에만 응대하고, 주어지지 않은 정보 세상에서 가장 높은산은?”, 유사도가 낮은 정보에 대해서는 공공데이터 품질 관리 수준 진단 평가 관련된 질문을 입력해주세요또는구체적으로 질문 해주세요등으로 대답을 하길 원했습니다.

 

따라서 유사도 점수를 일일이 평가하여 평균 0.83점 일 때, 올바른 문서로 맵핑시켜 대답한다는걸 파악하였고, 이를 프롬프트에 적용하였습니다.

"If the question is unrelated to the information or if the score is less than 0.83, it's okay if you don't answer it, just say it like this"
 
"\n\"I'm only dealing with the public data quality control level diagnostic assessment.\nPlease ask me only related questions

...

이 설정을 통해, 주어진 정보 외의 질문에 대한 엉뚱한 대답을 줄여 정확도를 스프린트1 32% 에서 62%로 상승시켰습니다.

구분 정확도
Sprint 1 32%
Sprint 2 62%

 

4) 기타 설정 : name 설정

 

앞선, ChatCompletion 모델 변수 설명하면서,'name'프로퍼티를 통해 role에 이름을 부여할 수 있다고 설명드렸었는데요,

Open ai 참고문서 중 시스템에 이름을 설정하면 성능이 좋아질 수도 있다 라는 문구를 확인하고, 이또한 시도를 해보았습니다.
그러나, 설정 후의 성능이 차이를 느끼지 못해 제거하였습니다.

{"role": "system", "content": ….,
{"role": "system","name":"example_user", "content": "...."},
{"role": "system", "name":"chatbot", "content": "... \n\n\n 감사합니다."},