Education*
Devops
Architecture
F/B End
B.Chain
Basic
Others
CLOSE
Search For:
Search
BY TAGS
linux
HTTP
golang
flutter
java
fintech
개발환경
kubernetes
network
Docker
devops
database
tutorial
cli
분산시스템
www
블록체인
AWS
system admin
bigdata
보안
금융
msa
mysql
redis
Linux command
dns
javascript
CICD
VPC
FILESYSTEM
S3
NGINX
TCP/IP
ZOOKEEPER
NOSQL
IAC
CLOUD
TERRAFORM
logging
IT용어
Kafka
docker-compose
Dart
Prompt engineering
Recommanded
Free
YOUTUBE Lecture:
<% selectedImage[1] %>
yundream
2024-07-20
2024-07-20
434
## 프롬프트 엔지니어링 이란 자연어 처리 모델과 상호 작용 할 때 원하는 결과를 얻기 위해 질문이나 명령을 구성하는 기술이다. 프롬프트 엔지니어링의 주요 요소들은 아래와 같다. 1. 명확성 2. 맥락(Context) 제공 3. 구체적 지시 4. 예제 제공 5. 제한 사항 설정 ## 프롬프트 엔지니어링의 주요 파라미터 **temperatur**: 선택하는 토큰의 무작위성을 결정한다. 0~1 까지의 값을 가진다. temperatur가 높으면 무작위성이 증가한다. 이 경우 보다 다양하고 창조적인 결과를 촉진한다. 사실을 기반으로 하는 질의응답과 같은 작업에서는 낮은 temperatur를 사용하면 도움이 된다. **top_p**: 모델이 응답을 생성하는 결정성을 제어한다. 정확하고 사실적인 답변을 원한다면 낮게 유지한다. 일반적으로는 temperatur와 top_p 중 하나를 사용한다. **Max Length**: 모델이 생성하는 토큰의 수를 관리한다. **Stop Sequence**: 모델의 토큰 생성을 중지하는 문자열을 지정한다. 목록을 출력하는 응답의 경우 stop sequence에 11을 추가하면 응답이 10개를 초과하지 않도록 모델에 지시할 수 있다. **Frequence Penalty**: 응답에 등장한 빈도에 비례하여 다음에 등장할 토큰에 불이익을 적용한다. 값이 높을 수록 단어가 다시 등장할 가능성이 줄어든다. **Presense Penalty**: Frequence Penalty 와 비슷하지만, 모든 토큰에 동일한 패널티가 적용된다. 다양하고 창의적인 텍스트를 생성하기 위해서 더 높은 presence penalty를 사용할 수 있다. Ferequence Penalty 둘 중 하나를 변경하는게 일반적이다. 결과값은 사용하는 LLM 에 따라서 달라질 수 있으며 또한 동일한 LLM 이라도 매번 결과가 달라질 수 있다. ## Prompt 기초 아래와 같이 프롬프트를 입력해보자. *Prompt* ``` 하늘은 ``` *Output* ``` 하늘은 지구의 대기권을 구성하는 부분 중 하나로, 지표에서부터 약 50km 상공까지의 구역을 말합니다. 이 구역에는 대기 중의 여러 가지 성분이 포함되어 있으며, 주로 질소와산소의 이온화된 상태의 가스들이 많이 존재합니다. 하늘의 색깔은 태양의 빛과 대기 중의 입자 사이의 상호작용에 따라 달라집니다. 예를 들어, 태양빛이 대기의 작은 입자들과 상호작용할 때는 푸른색으로 보이고, 더 큰 입자들과 상호작용하면 적색으로 보입니다. 하늘은 그 주변 환경과 태양의 각도에 따라 다양한 색깔을 나타낼 수 있습니다 ``` LLM은 "하늘은"이라는 짧은 문장의 맥락을 파악해서 글을 이어갔지만, 우리가 예상했던 그런 결과물은 아닐 것이다. 우리가 원하는 결과를 얻기 위해서는 원하는 바를 **구체적으로** 지시를 해야 한다. *Prompt* ``` 아래 단어로 하나의 문장을 완성해줘: 하늘은 ``` *Output* ``` 하늘은 푸르고 맑음을 주는 자연의 아름다움입니다 ``` 훨씬 좋아졌다. 구체적으로 지시를 하자 모델은 좀 더 정확하게 수행(문장의 완성)했다. 이렇게 원하는 답을 얻기 위해서 최적의 프롬프트를 설계하는 접근 방식을 **프롬프트 엔지니어링**이라고 한다. ## 프롬프트의 형식 일반적으로 프롬프트는 **질문** 혹은 **지시**의 형식을 따른다. ``` 질문 ? 지시 ``` 혹은 QA 데이터 셋 형식을 따를 수도 있다. ``` <질문> ? <답변> <질문> ? <답변> <질문> ? <답변> ``` 이러한 프롬프팅 방식을 **제로샷 프롬프팅(Zero-shot prompting)** 이라고도 한다. 즉, 어떠한 예시나 설명없이 직접 모델에게 응답을 요구하고 있다. 어떠한 설명도 없기 때문에 제로샷 프롬프팅을 실행 할 수 있는 기능이 있어야만 한다. ChatGPT 와 같은 LLM 들은 제로샷 프롬프팅을 실행 할 수 있는 기능이 있지만 그렇지 않은 모델들도 있다. 가장 인기있고 확실한 프롬프팅 기술은 **예제**를 제공하는 퓨샷 프롬프팅(few-shot prompting)이다. 퓨샷 프롬프팅은 아래와 같은 형식을 가진다. ``` <질문>? <답변> <질문>? <답변> <질문>? <답변> <질문>? <답변> ``` 혹은 ``` Q: <질문>? A: <답변> Q: <질문>? A: <답변> Q: <질문>? A: <답변> Q: <질문>? A: <답변> ``` 항상 QA 형식을 따라야 하는 것은 아니다. 예를 들어 아래와 같은 형식으로 만들 수도 있다. *Prompt* ``` Translate the following English sentences to Korean. Example 1: English: I love learning new languages. Korean: 나는 새로운 언어를 배우는 것을 좋아한다. Example 2: English: The weather is nice today. Korean: 오늘 날씨가 좋다. Example 3: English: Could you help me with my homework? Korean: 제 숙제 좀 도와주시겠어요? Now, translate the following sentence. English: She is reading a book. Korean: ``` *Output* ``` 그녀는 책을 읽고 있다. ``` ## 프롬프트의 구성요소 다양한 모델들에 대해서 프롬프트 엔지니어링을 사용하다 보면, 특정 구성요소들이 있다는 것을 알 수 있다. 1. 지시(instruction): 모델이 수행할 특정 작업 혹은 지시 2. 문맥: 더 나은 응답을 위해 모델에 외부 정보를 추가 제시 3. 입력데이터: 응답받고자 하는 입력이나 질문 4. 출력지시자: 출력의 유형이나 형식 ## 프롬프트 설계를 위한 일반적인 팁 ##### 시작은 간단하게 LLM은 인간의 추론을 모방하며, 모방 방식이 모델마다 다르기 때문에 원하는 결과를 얻기 위해서는 많은 실험이 필요한 반복적인 과정임을 명시해야 한다. 따라서 "간단하게" 시작하는게 좋다. 간단한 프롬프트로 시작해서 더 나은 결과가 나오도록 여러 요소나 문맥을 계속 추가하면서 관리를 해야 한다. 따라서 프롬프트에 대한 버전관리를 위한 툴을 가지고 있어야 한다. ##### 지시 작성하기, 분류하기, 요약하기, 번역하기, 정렬하기 등 구체적인 명령을 모델에게 지시함으로써 효과적으로 프롬프트를 설계할 수 있다. 모델에 따라서 **구분 기호**를 사용해서 명령어과 지시사항을 구분할 수 있다. *Prompt* ``` ### 지시 ### 다음 텍스트를 영어로 번역해줘. 텍스트: "안녕하세요! 만나서 반갑습니다." ``` *Output* ``` Hello! Nice to meet you ``` ##### 특이성 모델에 실행시킬 지시와 작업을 구체적으로 설명해야 한다. 구체적일 수록 결과가 더 좋아진다. 특히 일정한 형식을 얻고 싶을 때 더욱 중요하다. 반드시 이런 프롬프트를 써야 한다는 그런 규칙은 없다. 모델에 따라서 얻고자 하는 데이터에 따라서 달라질 수 있으므로 테스트를 통해서 프롬프트를 준비해야 한다. *Prompt* ``` 다음 텍스트에서 장소의 이름을 추출해 줘. 원하는 형식: Place: <comma_separated_list_of_places> 입력: "이러한 발전은 연구자들에게 격려가 되지만, 많은 것들이 여전히 수수께끼입니다. 리스본에 있는 샴팔리마우드 센터(CCU: Champalimaud Centre for the Unknown)의 신경면역학자인 Henrique Veiga-Fernandes는 "뇌와 주변부에서 보이는 효과 사이에 블랙박스가 있는 경우가 종종 있습니다."라고 말합니다. 그리고 다음과 같이 덧붙입니다. "치료적 맥락에서 이를 사용하고자 할 경우, 그 메커니즘을 실제로 이해할 필요가 있습니다." ``` *Output* ``` Place: 리스본, 샴팔리마우드 센터 ``` #### 부정확성 피하기 프롬프트 엔지니어링은 "사람과의 대화"와 유사한 측면이 있다. 때때로 대화 상대방은 자신의 경험이나 성향에 따라서 부정확한 부연설명을 넣는 식의 함정에 빠질 수 있다. 이럴때 제약조건등을 직접적으로 전달하면 원하는 정보를 얻을 확률이 높아진다. *Prompt* ``` 프롬프트 엔지니어링의 개념을 설명해 줘. 설명은 간결하게 몇 문장으로만 하고 너무 자세히는 하지 말아 줘. ``` 위 프롬프트에는 몇 개의 문장을 사용해야 하는지, 어떤 스타일을 사용해야 하는지 명확하게 지시되어 있지 않다. 물론 이 프롬프트로도 좋은 답변을 얻을 수 있는 확률이 있지만, 구체적일 수록 그 확률을 높일 수 있다. 아래의 예시를 보자. ``` 고등학생에게 프롬프트 엔지니어링의 개념을 2~3개의 문장으로 설명해 줘. ``` #### 해야 할 것과 하지 말아야 할 것 프롬프트를 설계 할 때는 "하지 말아야 할 것" 보다는 "해야 하는 것"에 촛점을 두는 것이 더 낫다. 즉 해야 할 것을 구체적으로 지시하는 것이다. 아래는 하지 말아야 할 것에 촛점을 둔 지시어로 추천 챗봇의 실패 사례다. *Prompt* ``` 다음은 고객에게 영화를 추천하는 상담원입니다. 관심사를 묻지 마세요. 개인정보를 묻지 마세요. 고객: 제 관심사를 바탕으로 영화를 추천해 주세요. 상담원: ``` *Output* ``` 네, 당신의 관심사를 바탕으로 영화를 추천해 드리겠습니다. 액션, 코미디, 로맨스, 아니면 그 밖의 장르, 어떤 종류의 영화를 좋아하세요? ``` 챗봇은 고객의 관심사를 모르기 때문에 "모른다"라고 응답을 해야 하지만, "해야 할 것"을 지시하지 않았기 때문에 추측해서 영화를 추천하고 있다. 프롬프트를 개선해보자. ``` 다음은 고객에게 영화를 추천하는 상담원입니다. 상담원은 글로벌 인기 영화 중에서 영화를 추천해야 합니다. 사용자의 관심사를 묻지 않고, 개인 정보를 요구하지 않아야 합니다. 상담원이 추천할 영화가 없는 경우 "죄송합니다. 오늘 추천할 영화를 찾을 수 없습니다." 라고 응답해야 합니다. 고객: 제 관심사를 바탕으로 영화를 추천해 주세요. 상담원: ``` *Output* ``` 죄송합니다만, 당신의 관심사에 관한 정보를 찾을 수 없었습니다. 하지만 지금 가장 인기 있는 영화에 대한 목록이 있습니다: [영화 목록]. 좋아하는 것을 찾으시길 바랄게요! ``` ## 프롬프트 예시 #### 문장 요약 *Prompt* ``` 항생제에 대해 설명해 줘 ``` *Output* ``` A: 항생제는 세균 감염을 치료하거나 예방하기 위해 사용하는 약물입니다. 이 약물은 세균의 성장을 억제하거나 죽이는 작용을 합니다. 페니실린, 아목시실린, 테트라사이클린 등이 대표적인 항생제입니다. 항생제는 바이러스에 의한 감염에는 효과가 없으며, 과도한 사용은 항생제 내성을 유발할 수 있으므로 필요한 경우에만 사용해야 합니다. ``` 모델의 답변을 한 문장으로 요약하도록 지시 해보자. *Prompt* ``` 항생제는 세균 감염을 치료하기 위해 사용되는 약물의 일종입니다. 세균을 죽이거나 번식을 방지하여 신체의 면역 체계가 감염에 대항할 수 있도록 합니다. 항생제는 보통 알약, 캡슐, 액체의 형태로 경구 복용하거나 때때로 정맥 주사로 투여되기도 합니다. 항생제는 바이러스 감염에는 효과적이지 않고, 남용할 경우 항생제 내성이 생길 수 있습니다. 위 내용을 한 문장으로 요약해 줘: ``` *Output* ``` 항생제는 세균 감염을 치료하기 위해 사용되며, 세균을 죽이거나 번식을 방지하지만, 바이러스 감염에는 효과가 없고 남용 시 항생제 내성이 생길 수 있습니다. ``` 응답의 정확성에 대해서는 따로 논의해보도록하자. 일단 모델이 단락을 한 문장으로 요약했다는 것에 촛점을 맞춰보자. 다른 문서에서 더 나은 결과를 얻는 방법에 대해서 살펴볼 것이다. #### 정보 추출 언어 모델은 "자연어 생성"을 수행하도록 훈련되었지만 분류나 다양한 자연어처리 작업도 수행 할 수 있다. 주어진 문장에서 정보를 추출하는 프롬프트의 예시다. *Prompt* ``` 연구 논문의 저자 기여도 진술서과 사사는 저자들이 원고 작성과 분석에 ChatGPT 등 AI 기술을 사용했는지 여부와 범위를 명확하고 구체적으로 명시해야 합니다. 또한 어떤 LLM이 사용되었는지 표기해야 합니다. 이를 통해 편집자와 심사자가 잠재적 편향, 부정확성 및 부적절한 출처 등의 문제를 고려해 원고를 보다 신중하게 검토하도록 유도할 수 있습니다. 마찬가지로, 과학 저널은 투고된 원고 선정 시 LLM 사용 여부를 투명하게 공개해야 합니다. 위 단락에서 언급한 대규모언어모델 기반 제품을 알려줘. ``` *Output* ``` 위 단락에서 언급한 대규모언어모델(LLM) 기반 제품으로는 ChatGPT가 포함됩니다. ChatGPT는 OpenAI에서 개발한 대표적인 LLM 기반 AI 기술입니다. ``` #### 질의 응답 모델로부터 원하는 답변을 이끌어내는 가장 좋은 방법은 **좋은 프롬프트**를 만드는 것이다. 프롬프트의 구성요소인 지시, 문맥, 입력, 출력 지시자를 조합하여 더 나은 결과를 얻을 수 있다. 좀 더 구조화된 프롬프트를 실행해 보자. *Prompt* ``` 아래 문맥을 고려해서 질문에 답변해 줘. 답변은 짧고 간결하게 해 줘. 답변이 정확하지 않다면, 「확실치 않은 대답」이라고 응답해 줘. 문맥: Teplizumab은 Ortho Pharmaceutical이라는 뉴저지의 제약 회사에서 유래했다. 그곳에서, 과학자들은 OKT3라는 항체의 초기 버전을 만들어 냈다. 원래 쥐에서 유래된 이 분자는 T 세포의 표면에 결합하여 세포를 죽이는 잠재력을 제한할 수 있다. 1986년, 신장 이식 후 장기 거부 반응 예방을 위해 승인되어 인간이 사용할 수 있는 최초의 치료용 항체가 되었다. 질문: OKT3는 어디서 유래했는가? 답변: ``` *Output* ``` OKT3는 쥐에서 유래했습니다. ``` #### 텍스트 분류 프롬프트의 구성요소들을 기반으로 구조화된 프롬프트를 만들면 더 나은 응답을 얻을 수 있지만 이것은 "기본"일 뿐이다. 더 복잡한 작업을 수행하기 위해서는 지시어 만으로는 충분하지 않다는 것을 깨닫게 될 것이다. **입력 데이터**나 **예시**를 통해서 프롬프트를 개선 할 수 있다. *Prompt* ``` 문장을 neutral, 부정 혹은 긍정으로 분류해 줘. 문구: 그 음식은 그럭저럭이었어. 감정: ``` *Output* ``` Neutral ``` Neutral은 올바른 답변이긴 하지만 소문자(neutral)로 반환하도록 유도해 보자. 여러가지 방법이 있겠지만 프롬프트에 더 많은 정보를 제공할 수록 더 나은 결과를 얻을 수 있다. *Prompt* ``` 문장을 neutral, 부정 혹은 긍정으로 분류해 줘. 문구: 이번 휴가는 그럭저럭이었어. 감정: neutral 문구: 그 음식은 그럭저럭이었어. 감정: ``` *Output* ``` 감정: neutral ``` #### 대화 프롬프트 엔지니어링을 통해서 챗봇과 같은 대화형 시스템을 구축 할 수 있다. 예를 들어 주어진 질문에 기술적인 대답을 반환할 수 있는 대화형 시스템을 구축해 보겠다. 흔히 **역할 프롬프팅** 이라고 불리는 방법이다. *Prompt* ``` 다음은 AI 연구 보조원과의 대화입니다. 이 보조원의 어조는 기술적이고 과학적입니다. 인간: 안녕, 너는 누구니? AI: 반갑습니다! 저는 AI 연구 보조원입니다. 오늘은 무엇을 도와드릴까요? 인간: 블랙홀 생성에 대해 설명해 줄래? AI: ``` *Output* ``` 블랙홀은 매우 높은 밀도와 중력으로 인해 빛조차 탈출할 수 없는 천체입니다. 일반적으로 블랙홀은 대량의 별이 자신의 중력으로 붕괴하면서 형성됩니다. 이 과정에서 별의 중심부가 매우 압축되어 강력한 중력을 생성하게 되며, 이로 인해 블랙홀이 형성됩니다. 블랙홀의 경계는 사건의 지평선으로, 이 경계를 넘으면 아무것도 빠져나올 수 없습니다. ``` 올바른 답을 주기는 하지만 너무 기술적인 것 같다. 좀 더 쉽게 이해할 수 있도록 지시해보자. *Prompt* ``` 다음은 AI 연구 보조원과의 대화입니다. 보조원은 초등학생도 이해할 수 있는 수준으로 답변해야 합니다. 인간: 안녕, 너는 누구니? AI: 반갑습니다! 저는 AI 연구 보조원입니다. 오늘은 무엇을 도와드릴까요? 인간: 블랙홀 생성에 대해 설명해줄래? AI: ``` *Output* ``` 블랙홀은 아주 강한 중력이 있는 곳으로, 주변의 모든 것을 빨아들이는 것처럼 보입니다. 보통 큰 별이 연료를 다 써서 폭발한 후, 그 중심 부분이 너무 많이 모여서 블랙홀이 됩니다. 그래서 블랙홀 주위는 아무것도 빠져나올 수 없는 강한 중력을 가지고 있습니다. ``` #### 코드 생성 LLM은 코드를 생성하는 효과적인 도구다. 프롬프트를 이용해서 코드를 생성하는 다양한 방법들이 있다. 몇 가지 예를 살펴보자. *Prompt* ``` /* 유저의 이름을 입력받고 "안녕"이라고 해 줘 */ ``` *Output* ``` # 유저의 이름을 입력받고 "안녕"이라고 인사하는 코드 user_name = input("이름이 무엇인가요? ") print(f"안녕, {user_name}!") ``` 이번에는 SQL 문을 만들어내는 더 복잡한 프롬프트 예제다. *Prompt* ``` """ DB테이블 departments, columns = [DepartmentId, DepartmentName] DB테이블 students, columns = [DepartmentId, StudentId, StudentName] 컴퓨터과학부에 속한 모든 학생에 대한 MySQL 쿼리를 작성해 줘 """ ``` *Output* ``` SELECT s.StudentId, s.StudentName FROM students s JOIN departments d ON s.DepartmentId = d.DepartmentId WHERE d.DepartmentName = '컴퓨터과학부'; ``` #### 추론 추론은 LLM이 가장 어려워하는 작업에 속한다. 수학적인 능력을 필요로 하는 작업에서 눈에 띄는 개선을 보여주고 있기는 하지만 여전히 LLM은 추론 작업을 수행하는데 어려움을 겪기 때문에 향상된 프롬프트 엔지니어링 기술이 필요하다. 몇 가지 예를 다뤄보자. *Prompt* ``` 9,000 * 9,000는 뭐야? ``` *Output* ``` 9,000 * 9,000은 81,000,000입니다. ``` 좀 더 어려운 문제를 시도해 보자. *Prompt* ``` 주어진 수 중에서 홀수를 모두 더해서 짝수를 만들어 줘: 15, 32, 5, 13, 82, 7, 1. A: ``` *Output* ``` 아니요, 주어진 수 중 홀수를 모두 더한 값은 홀수입니다: 119. ``` 잘못된 결과가 나왔다. 프롬프트를 개선해보자. *Prompt* ``` 주어진 수 중에서 홀수를 모두 더해서 짝수를 만들어 줘: 15, 32, 5, 13, 82, 7, 1. 문제를 단계별로 해결해 봐. 먼저 주어진 수 중 홀수를 찾아낸 뒤, 그것들을 합해서, 결과가 홀수인지 짝수인지 판별해 줘. ``` *Output* ``` 홀수: 15, 5, 13, 7, 1 총합: 41 41은 홀수입니다. ``` ## Promptbase 프롬프트는 LLM 품질을 높이기 위한 매우 중요한 기술이기 때문에, 관련된 모범사례를 제공하는 많은 문서들이 있다. **Medprompt 방법론**은 MS가 개발한 미세조정을 거친 전문 의학용 LLM의 성능을 뛰어넘을 수 있는 프롬프트 엔지니어링 기술이다. 즉 효과적인 프롬프트를 만드는 것으로 많은 시간과 비용이 들어가는 미세조정 과정을 생략할 수 있다는 것이다. |Benchmark|GPT-4 Prompt|GPT-4 Results|Gemini Ultra Results| |---|---|---|---| |MMLU|Medprompt+|90.10%|90.04%| |GSM8K|Zero-shot|95.3%|94.4%| |MATH|Zero-shot|68.4%|53.2%| |HumanEval|Zero-shot|87.8%|74.4%| |BIG-Bench-Hard|Few-shot + CoT|89.0%|83.6%| |DROP|Zero-shot + CoT|83.7%|82.4%| |HellaSwag|10-shot|95.3%|87.8%| ## 참고 * https://www.promptingguide.ai/kr/introduction/basics * https://github.com/microsoft/promptbase
Recent Posts
MLOps with Joinc - Kubeflow 설치
Vertex Gemini 기반 AI 에이전트 개발 05. 첫 번째 LLM 애플리케이션 개발
LLama-3.2-Vision 테스트
Vertex Gemini 기반 AI 에이전트 개발 04. 프롬프트 엔지니어링
Vertex Gemini 기반 AI 에이전트 개발 03. Vertex AI Gemini 둘러보기
Vertex Gemini 기반 AI 에이전트 개발 02. 생성 AI에 대해서
Vertex Gemini 기반 AI 에이전트 개발 01. 소개
Vertex Gemini 기반 AI 에이전트 개발-소개
생성 AI 모델 Flux.1 설치 및 사용
GPT를 이용한 Reranker 테스트
Archive Posts
Tags
AI
LLM
Copyrights © -
Joinc
, All Rights Reserved.
Inherited From -
Yundream
Rebranded By -
Joonphil
Recent Posts
Archive Posts
Tags