728x90

반복학습이 중요한것!

프롬프트 설계는 어렵습니다. --> 개발자들이 서비스를 상용화 하기 까지 고객들의 니즈를 잘 파악하여 원하는 결과값을 얻기까지 많은 시행착오와 반복적인 작업은 필수임을 명심해야합니다. 

앞서, 간단한 프롬프트로 시작하여 더 나은 결과를 위해 요소나 문맥을 계속해서 추가해 나가야합니다. 많은것들을 고려해야 하지만, 이 기술은 일반적으로 나온지 얼마 되지 않아서 빠르게 버전업이 이루어지고있습니다. 즉 버전 관리가 중요하다는 이야기입니다. 

 

구체성, 단순성, 간결함을 통해 더 나은 결과를 얻을 수 있는 많은 예시를 제시하고 있습니다. 

 

여러 하위 작업을 포함한 큰 단위 작업을 실행해야 하는 경우, 작업을 보다 작은 단위로 세분화 하고 결과가 개선됨에 따라 점진적으로 구축해 나가야합니다.  이런 방식을 통해 프롬프트 설계 초기 과정에 너무 많은 복잡성이 추가되는 것을 방지할 수 있습니다.

 

명확한 지시가 필요하다.

'작성하기','분류하기', '요약하기', '번역하기' , '정렬하기' 등의 명령어를 사용하여 달성하고자 하는 결과를 모델에 지시함으로써 다양한 간단 작업에 대해 효과적인 프롬프트를 설계할 수 있습니다.

 

어떤 것이 가장 효율적인지 실험이 필요하다고 강조를 드리고싶습니다. 다양한 키워드, 문맥 및 데이터를 활용하여 다양한 지시를 내려 보고, 특정 사용 사례와 작업에 가장 적합한 방법을 찾아야합니다. 항상 질문과 지시는 명확해야합니다. 명심하세요! 

 

예시 ) 

Prompt : 

### 지시 ###
다음 텍스트를 한글로 번역해 줘.
text: Nice to Meet you

Output : 

만나서 반갑습니다.

특이점

앞서 설명 드렸듯이 모델을 실행시킬 지시와 작업을 좀 더 구체적으로 설명해야합니다. 왜냐하면 프롬프트가 상세하고 구체적일수록 더 좋은 결과를 출력하기 때문입니다. 아직까지 더 좋은, 더 나은 결과를 주는 특정한 토큰이나 키워드는 존재하지 않습니다. 좋은 형식과 상세한 프롬프트를 준비하는 것이 중요합니다. 예시를 제공함으로써 특정한 형식으로 출력을 얻는데 매우 효과적입니다.

 

Prompt : 

다음 텍스트에서 장소의 이름을 알려줘
원하는 형식:
Place: <comma_separated_list_of_places>
입력: "이러한 발전은 연구자들에게 격려가 되지만, 많은 것들이 여전히 수수께끼입니다. 
리스본에 있는 샴팔리마우드 센터(CCU: Champalimaud Centre for the Unknown)의 
신경면역학자인 Henrique Veiga-Fernandes는" 뇌와 주변부에서 보이는 효과 사이에 블랙박스가 있는 
경우가 종종 있습니다."라고 말합니다. 그리고 다음과 같이 덧붙입니다. "치료적 맥락에서 이를 사용하고자 할 경우, 
그 메커니즘을 실제로 이해할 필요가 있습니다."

 

Output : 

장소: 샴팔리마우드 센터(CCU: Champalimaud Centre for the Unknown), 리스본

 

 

정확성을 떨어 트리는 것

상세하게 기술하고 형식을 개선하는 방법에 대한 위 내용을 고려해볼때, 프롬프트를 교모하게 다루려 하거나 부정확한 설명을 작성하는 등의 함정에 빠지기 쉽습니다. 프롬프트는 구체적이고 직접적이어야 더욱 좋은 결과를 얻을 수 있습니다. 직접적일수록 메시지가 더 효과적으로 전달됩니다. 사람과의 대화처럼 원하는 답을 얻으려면 좀 더 구체적인 질문을 해야하는것과 같습니다.

프롬프트 엔지니어링의 개념을 설명해줘. 설명은 간결하게 몇 문장으로만 하고 너무 자세히는 하지 말아줘

 

위에 질문을 만약 상사가 부하 직원에게 했다고 생각해 봅시다. 아찔하지 않나요? 얼마나 간결해야하며 어느정도가 너무 자세하지 않는지 부하직원은 예측해야하고, 본인 뜻대로 했다가 상사에게 꾸중을 들을수 있습니다. 이처럼, 프롬프트도 구체적이고 간결하며 정곡을 찌르는 질문이 중요합니다. 프롬프트도 저 위와 같은 문장으로도 답을 줄순 있지만 우리가 원치 않는 상황이 올수도 있습니다. 

그럼 다시 질문을 줘보겠습니다.

회사 상사에게 프롬프트 엔지니어링의 개념을 2~3개의 문장으로 설명해줘

 

 

해야 하는 것과 하지 말아야 할것

프롬프트를 설계할 때 적용할 수 있는 또 다른 일반적인 팁은 '하지 말아야 할것' 보다는 '해야 하는 것'에 초점을 두는것입니다. 이렇게 하면  보다 구체적이고 모델로부터 좋은 답변을 이끌어 내는 세부 사항에 집중할 수 있습니다. 

 

하지말아야할 것의 예시)

우리가 금융상품을 추천 받으려고 챗봇을 사용하지만 실패하는 사례

Prompt : 

다음은 고객에게 금융상품을 추천하는 상담원입니다. 연봉을 묻지마세요, 개인정보를 묻지마세요.
고객: 제 연봉을 바탕으로 금융상품을 추천해 주세요.
상담원 :

 

Output : 

네, 당신의 연봉을 바탕으로 금융상품을 추천해 드리겠습니다. 청년우대적금, 직장인우대적금, 매달이자적립적금,
이 외에 어떤 금융상품을 원하시나요?

 

잘 질문한 프롬프트 예시를 다시 보자!

Prompt : 

다음은 고객에게 금융상품을 추천하는 상담원입니다. 상담원은 요즘 30대에게 인기 있는 금융상품을 추천해야합니다.
사용자의 연봉을 묻지 않고 개인 정보를 요구하지 않아야 합니다. 상담원이 추천할 금융상품이 없는 경우
"죄송합니다. 추천할 금융상품을 찾을 수 없습니다" 라고 응답해야합니다.
고객: 제 연봉을 바탕으로 금융상품을 추천해 주세요.
상담원 :

 

Output : 

죄송합니다만, 당신의 관심사에 관한 정보를 찾을 수 없습니다. 하지만 지금 30대에게 가장 인기 있는 금융상품에
대한 목록이 있습니다 : [금융상품 목록].
원하시는 금융 상품을 찾기 바랄게요.!

 

원하지 않는 답변이 나올수 있기때문에 좀 더 구체적으로 모르면 모른다. 라고 지시를 해줘야합니다 그렇지 않으면 말도 안되는 오답을 내오는경우도 있습니다. 아마 ChatGPT를 사용해본 경험자라면 잘 알 수 있을거같습니다.

728x90
728x90

들어가기에 앞서....

작년부터 핫해진 랭체인+LLM을 이용한 다양한 기술들이 나오고있습니다.

솔직히 국내에서 랭체인 강의들이 존재하지만(패캠,인프런,노마드코더 그리고 유데미) 대다수 기본적인 랭체인에 대해서 설명을 해주는게 아직까지는 다 인 상황입니다.

저 또한 마찬가지고 아직까지 배우고있으며 배운 내용을 토대로 조금 더 사람들에게 내용을 공유하고싶어서 이 글을 작성하게 되었습니다.


 

기초 프롬프트


프롬프트 엔지니어링은 다양한 어플리케이션 연구 주제에 언어 모델(LMs) 을 효율적으로 사용할 수 있도록 프롬프트를 개발하고 최적화하는 비교적 새로운 분야입니다. 프롬프트 엔지니어링 기술은 대규모 언어모델(LLMs)의 기능과 한계를 더 잘 이해하는데 도움이 됩니다. 

 

현재 많은 연구자분들께서 프롬프트 엔지니어링을 사용해서 질문 답변 및 산술 추론과 같은 일반적이고 복잡한 다양한 작업에서 LLMs의 역량을 향상시키고 있습니다. 

그러한 기술들을 토대로 이 글을 읽으시는 개발자분들은 프롬프트 엔지니어링을 사용하여 LLMs 및 기타 도구와 강력하고 효과적인 프롬프트 기술을 설계하고 고객을 위한 서비스를 만들어나아갑니다.

 

간단하고 작은 프롬프트만으로도 많은 일들을 할 수 있습니다 가령, 특정 보험에 특화 되어있는 프롬프트가 있다면 다른 일반적인 프롬프트에 비해 정보의 양과 퀄리티가 뛰어나 더 정확한 답변을 할수 있을것입니다. 

 

모델에게 전달하는 프롬프트는 지시나 질문과 같은 정보와 맥락, 입력 또는 예시와 같은 다른 세부 사항을 포함할 수 있습니다. 

이러한 구성 요소를 사용하여 모델에게 더욱 절적하게 지시하고 더 나은 결과를 얻을 수 있습니다.

 

간단한 예시

 

Prompt :

하늘은

 

Output : 

푸른색입니다.
하늘은 맑은 날에는 푸른색입니다. 흐린 날엔 하늘은 회색 혹은 하얀색을 띌 수 있습니다.

 

언어 모델은 "하늘은" 이라는 짧은 문장의 맥락을 파악하고 글을 이어 나갑니다. 결과물은 예상하지 못했거나 우리가 달성하려던 작업과는 조금 동 떨어진, 즉 오답을 줄 수 도 있습니다.

 

하지만 사용자는 모델에게 더 자세한 문맥과 구체적으로 원하는 것에 대한 지시를 내리는 일이 중요합니다.

 

다시, 자세한 문맥과 구체적인 지시를 포함한 예시를 다시 보여드리겠습니다.

 

Prompt :

문장을 완성해 줘 :
하늘은

 

 

Output : 

오늘 매우 아름답습니다.

 

답변이 조금 더 깔끔하지 않나요? "하늘은" 위에 문장을 완성해 줘: 라는 구체적인 문장을 붙여서 모델은 좀 더 정확한 답변을 출력했습니다.

 

모델에게 작업을 수행 하도록 지시하기 위해 최적의 프롬프트를 설계하는 이러한 접근 방식을 프롬프트 엔지니어링 이라고 합니다.


프롬프트 형식

위에 간단한 프롬프트를 입력했습니다. 일반적으로 프롬프트는 다음과 같은 형식을 따릅니다.

 

<질문>?

혹은

<지시>

 

또한 질의 응답 형식으로도 작성이 가능하며, 다음과 같이 많은 QA 데이터 세트에서 표준 형식으로 사용합니다.

 

Q : <질문>?
A :

 

위와 같이 프롬프트를 수행하는 방식을, Zero-shot Prompting 이라고 합니다. (shot prompting 은 예제의 수를 나타냅니다.) 즉 0개의 예제의 수 입니다. 

어떤 예시나 설명이 없이 직접 모델에 응답을 요구합니다. 그렇다면 Chat-GPT 처럼 방대한 양을 가지고 있어서 답을 유추할수 있지만 다른 프롬프트는 확실한 답을 줄 수 없을 수도 있습니다.

 

위에 표준 형식을 고려할 때, 인기 있고 효과적인 프롬프팅 기술 중 하나는 모범 예시를 제공하는 Few-shot Prompting 입니다. 

 

<질문>?
<답변>
<질문>?
<답변>
<질문>?
<답변>
<질문>?
<답변>

 

QA 형식에 따른다면 ....

Q : <질문>?
A : <답변>
Q : <질문>?
A : <답변>
Q : <질문>?
A : <답변>
Q : <질문>?
A :

 

이러한 형식이 정답은 아닙니다. 주어진 업무에 따른 적절한 프롬프트 형식을 사용할 수 있습니다. 

예를 들어, 간단한 분류 작업 혹시 연산등의 T or F 를 나타낼때도 답변을 잘 해 줍니다. 

 

Prompt : 

멋지다! //긍정
나빠! //부정
그 영화는 굉장했어! // 긍정
이 얼마나 맛이 없는가! //

답변은 ???

Output : 

부정

 

Few-shot 프롬프팅은 문맥에 맞는 학습을 할 수 있습니다 그러므로 위에 예시들을 통해 답변을 조금 더 정확하게 유추해서 제공해줍니다.

 

GPT 처럼 방대한 질문을 위한 것이 아닌 특수한(관리자용, 정보가 방대하지 않는 곳) 상황에서 학습을 시켜 쓰이는것도 좋아보입니다.

 

위와 같은 글들을 보다 보니 그럼 프롬프트의 구성 요소들은 무엇이 있을까 생각을 하실수 있습니다.

 

프롬프트 엔지니어링을 접목한 여러 애플리케이션을 반복해서 사용하다 보면 특정 구성 요소들이 존재하는것을 알 수 있습니다. 

 

지시 모델이 수행할 특정 작업 또는 지시
문맥 더 나은 응답을 위해 모델을 조종할 수 있는 외부 정보나 추가 문백
입력 데이터 응답 받고자 하는 입력이나 질문
출력 출력의 유형이나 형식

 

각각 다시 설명 드리겠지만 출력을 설명 드리자면 String 형식의 글도 가능하지만 그래프나 통계 자료등 원하는 방향으로 답을 가져다 줄수도 있습니다.

728x90

+ Recent posts