예를 들면 ‘옛날옛적에 유니콘이’를 입력하면 → ‘마법의 숲에 다른 유니콘 친구들과 함께 살았다’를 예측하는 방식
하지만 ‘프랑스의 수도는?’ 라고 입력하면 ‘프랑스의 가장 큰 도시는? 프랑스의 인구는?’ 등 인터넷에 많은 프랑스에 대한 퀴즈 목록으로 답할 수 있다.
명령어 튜닝 LLM (Instruction-tuned LLMs)
기본 LLM에서 명령어를 잘 따르도록 인간 피드백을 통한 강화 학습(Reinforcement learning from human feedback, RLHF)을 통해 fine-tuning
대부분의 애플리케이션에서 명령어 튜닝 LLM이 더욱 안정적이다. (이 코스에서도 주로 명령어 튜닝 LLM에 초점을 맞춘다.)
명령어 튜닝 LLM을 사용할 때는 똑똑하지만 작업의 세부 사항을 모르는 사람에게 지시한다고 생각하면 된다. (예를 들면 ‘앨런 튜링에 대한 글을 써줘’ 보다 글의 초점을 어디에 맞출지, 어조는 어떻게 할지 등을 알려주는 식)
💎 핵심 원칙
명확하고 구체적인 지침을 작성하기
보통은 길수록 더 명확하고 맥락을 제공할 수 있어 좋은 출력을 유도할 수 있다. (짧은 프롬프트 ≠ 명확한 프롬프트)
구분 기호(```, <text></text>, """ 등)를 사용하여 특정 텍스트와 나머지 프롬프트를 분리하기. 프롬프트 주입(prompt injection)을 피하기에도 유용하다.
HTML, JSON 등과 같은 구조화된 출력을 요청하기
조건이 충족되는지 모델에게 확인하도록 요청하기
작업의 성공적인 실행 예를 제공하기 (Few-shot prompting)
모델에게 생각할 시간을 주기
모델이 성급하게 결론에 도달하여 추론 오류를 범하는 경우, 짧은 시간이나 적은 단어로 수행하기에는 너무 복잡한 작업을 요청하고 있는 것은 아닌지 확인해보아야 한다. 모델이 답변을 제공하기 전에 관련된 추론을 순차적으로 수행하도록 쿼리를 재구성할 수 있다.
작업을 위해 필요한 단계를 지정하기
모델이 섣부르게 결론을 내리지 않고 스스로 답을 추론하도록 명시적으로 지시하기
모델의 한계
언어 모델은 학습 과정에서 방대한 양의 지식에 노출되었지만 그 정보를 완벽하게 암기한 것은 아니기 때문에 지식의 경계를 잘 모른다.
모호한 주제에 대해 그럴듯하게 들리지만 사실이 아닌 답을 만들어낼 수 있다. (환각, hallucinations)
환각을 줄이기 위한 전략
모델에게 텍스트와 관련된 인용문을 먼저 찾고, 해당 인용문을 사용하여 질문에 답하도록 요청하기
기존에 존재하는 문서를 기반으로 답하도록 요청하기
♻️ 반복적 프롬프트 개발
LLM을 사용하여 애플리케이션을 구축할 때 잘 동작하는 프롬프트를 한번에 작성하는 것은 매우 어렵고 중요하지도 않다. 프롬프트 개발은 반복적인 과정이다. 중요한 것은 애플리케이션에 효과적인 프롬프트를 개발할 수 있는 좋은 프로세스를 갖추는 것이다. (Iterative prompt development)
머신러닝 개발에서 효과적인 모델을 얻기 위해 학습과 결과를 살펴보는 과정을 반복하는 것처럼, 애플리케이션을 위한 프롬프트를 작성할 때의 프로세스도 매우 유사하다.
수행하려는 작업에 대한 아이디어를 얻고
명확하고 구체적이며 시스템이 생각할 시간을 줄 수 있는 프롬프트(핵심 원칙!)를 작성하고
결과를 확인하고
잘 작동하지 않는다면 원인을 파악하여 1로 돌아간다.
좀 더 성숙하고 정교한 애플리케이션의 경우, 수십 수백개의 예시 집합을 갖춰놓고 프롬프트를 반복적으로 개발하고 테스트하기도 한다. 여러 예시에 대한 평균 또는 최악의 성능을 확인하여 프롬프트를 평가하는 것이 유용할 때가 있다.
✨ 활용 사례
요약하기(Summarizing)
오늘날 세상에는 텍스트가 너무 많아 다 읽을 수 없다. 텍스트가 많은 애플리케이션에서 간단한 요약을 제공하여 사람들이 내용을 빠르게 파악할 수 있도록 도울 수 있다.
특정 정보(예를 들면 사용자의 리뷰에서 배송, 가격에 대한 부분)에 중점을 두고 요약하거나 해당 정보만 추출하도록 요청할 수 있다.
추론하기(Inferring)
추론: 모델이 텍스트를 입력으로 받아 어떤 종류의 분석을 수행하는 작업(레이블 추출, 긍정 혹은 부정 감정 분석 등)
텍스트에서 주제를 추려내는 것과 반대로 텍스트가 특정 주제와 관련이 있는지 판별하는 것도 가능하다. (특정 주제와 관련있는 기사가 뜨면 알림을 보내는 기능을 상상해볼 수 있다.)
변형하기(Transforming)
다른 언어로 번역하기 (HTML을 입력받아 JSON으로 출력 등)
맞춤법 및 문법 교정
톤 변환하기(구어체를 문어체로 바꾸기 등)
단 몇 줄로 범용적인 번역기를 만들 수 있다. (응답 형식을 JSON 혹은 한 단어로 요청하면 더 깔끔해진다.)
확장하기(Expanding)
일련의 지침, 주제 목록 등 짧은 텍스트로 이메일, 에세이와 같은 긴 텍스트를 생성할 수 있다. 스팸 등으로 악용될 수 있는데 책임감을 가지고 사용하는 것이 중요하다. (예를 들면 AI Bot이 보낸 메세지임을 명시하기)
temperature
모델 응답의 탐색 정도와 다양성을 조절(일종의 무작위성)
“내가 가장 좋아하는 음식은?” 이라는 질문에서 모델이 피자(53%), 초밥(30%), 타코(5%)로 예측할 때 낮은 temperature(0)에서는 항상 ‘피자’를 선택하고, temperature가 높을수록(> 0.5) ‘초밥’ 혹은 ‘타코’를 선택하는 경우가 많아진다.
일반적으로 예측 가능한 응답을 원하면 temperature를 0으로, 더 창의적인 방식으로 다양한 출력을 원한다면 더 높은 temperature를 사용하는 것이 좋다.
예를 들면 아래 이메일 어시스턴트 예시에서 temperature를 높이면 더 산만해지지만 더 창의적인 응답을 기대할 수 있다.