본문 바로가기
AI

프롬프트 엔지니어링, 어떻게 하는 건데

by devlect 2024. 6. 10.

흐름 보기

  • 머신러닝, 딥러닝, LLM 전반 설명
  • 프롬프트 엔지니어링 요약 -> 기초 -> 연습 -> 실무

주요 내용

LLM 성능을 향상 시킨 주요 기술

  • 코드 데이터 학습 - 비정형 데이터 코드 작성 가능, 추론 능력 향상
  • 인스트럭션 튜닝 - 대량의 텍스트 학습 기본 모델에 지시와 결과물 쌍 학습/튜닝
  • RLHF(Reinforcement Learning from Human Feedback) - 사람 평가를 재학습하여 가이드라인 준수, Alignment
  • 멀티모달 - 이미지, 소리, 텍스트 등 서로 다른 형태의 데이터 학습

소프트웨어 개발 방식의 진화

전통적인 머신러닝 개발 과정 프롬프트 기반 모델
1. 데이터 수집, train/test세트로 분할
2. 모델링 및 훈련
3. 평가
4. 패키징
5. 배포
1. 평가 데이터 수집
2. 프롬프트 생성
3. 평가 후 바로 반영


 

이제 머신러닝은 끝인가? No! No! 

다음과 같이 모델링이나 파인튜닝이 필요한 경우는 여전히 필요함

  • 숫자 예측 선형 회귀 문제
  • 대량 로그 처리
  • 높은 정밀도
  • 최신성이 중요치 않은 경우
  • 보안이 중요한 경우

프롬프트 엔지니어링 대표적인 5가지 방법

  1. 제로샷(zero-shot) - 예시 없이 작업
  2. 원샷(one-shot) - 예시 1개 제공
  3. 퓨샷(few-shot) - 예시 여러 개 제공
  4. CoT(Chain of Thought) - 문제를 푸는 단계별 과정을 예시로 제공하여 논리적 순서를 LLM이 따라하게 함
  5. 제로샷 CoT - 별도 가이드 없이 "단계 별로 생각해봅시다"와 같이 덧붙임

백터 서치, 컨텍스트를 가져오는 기술

  • 단어나 문장 같은 언어를 숫자로 바꾸는 과정을 임베딩(Embedding)이라고 함
  • 이 임베딩을 통해 각 언어 조각들의 가까운 정도를 알 수 잇음
  • 이렇게 텍스트를 숫자로 바꿔주는 모델은 임베딩 모델이라고 함
  • 이 데이터를 이용해 찾는 것을 벡터 서치(Vector Search) 또는 시멘틱 서치라고 함

백터 서치가 다 좋은 건 아님

  • 대규모 계산에서 속도 느림
  • 성능 문제 - 고품질 답변을 얻으려면 유용한 컨텍스트 제공이 필수이기 때문에 백터 서치를 위한 벡터 DB회사 주목 받고 있음

기본적인 프롬프팅 과정

  1. 배경지식 설명 - 이러 이러한 상황이야. 그리고 이걸 원해! -> 적절한 컨텍스트를 제공하고 활용하는 것을 인컨텍스트 러닝이라고 함
  2. 프롬프트 작성 - 이렇게 해
  3. 결과형식 지정 - 이런 형식으로 답변해세요

다음과 같이 5단계로 세분화

  1. 프롬프트 결과 설정 - 얻고자 하는 정보 종류/형태 결정
  2. 프롬프트 평가 설계 - 결과 측정 방법 정의, 자동화했을 때 가장 중요한 단계
  3. 그라운딩 설계 및 평가 - 모델이 참조할 기초 데이터나 사실 정리
  4. 프롬프트 디자인 - 이것 저것 시도하고 테스트
  5. 모니터링 및 개선 - 개선하고 최신 정보 반영하고 등

프롬프트 디자인이 처음이라면 7개만 기억

  1. 역할 (Role)
  2. 대상 (Audience)
  3. 지식/정보 (Knowledge/Information)
  4. 작업/목표 (Task/Goal)
  5. 정책/규칙, 스타일, 제약사항 (Policy/Rule, Style, Constaint)
  6. 형식/구조 (Format/Structure)
  7. 예시 (Example)

프롬프트 디자인 예시

프롬프팅 테크닉 TOP 8

  1. 예시 제공
  2. CoT (Chain of Thought)
  3. 자기 일관성 - 자기 답변 여러 개를 이용해 일관성을 가지게 함
  4. 샘플링 투표 - 출력 유사도로 다수결 답변 선정
  5. 선택 추론 - 질문과 관련된 내용을 나열하고 이를 기반으로 답변 지시
  6. 최소에서 최대로 (Least-to-Most) - '{주어진 문제}를 풀려면 먼저 다음 문제를 풀어야 합니다'와 같이 작게 쪼개 질문하고 답변을 다음 질문에 그대로 입력하여 꼬꼬무(꼬리에 꼬리를 무는 이야기)처럼 만듬. 마치 작은 사건을 연결해 큰 문제를 해결하는 것과 같이.
  7. 리액트(ReAct) - 작업 별로 실행할 액션을 선택해 실행하는 방법. 외부 API 상호작용. 행동은 세 가지 유형이 있습니다. Search[entity], 이는 위키 백과에서 정확한 엔티티를 검색하고 존재하는 경우 첫 번째 문단을 반환합니다. 존재하지 않는 경우 검색할 수 있는 유사한 엔티티를 반환합니다. 와 같이 프롬프트 인스트럭션 만들고, 다음과 같이 씀. '행동1: Search[서울]'
  8. 자기평가 (Seach Evaluation) - 자기가 한 답변을 '자기평가 프롬프트'와 함께 질문에 되먹임. GPT-4와 같이 고성능 LLM 모델만 현재 가능

확장 테크닉

  1. 전문가 역할극 프롬프팅 - 전문가 페르소나 부여
  2. 위키피디아에 따르면 - 그라운딩 입력
  3. 지식 생성 프롬프팅 - 지식 먼저 생성 -> 지식 기반으로 답변
  4. 검색 증강 생성(RAG, Retrieval Augmented Generation) - 외부 검색 결과를 프롬프트 컨텍스트로 제공, 백터 서치 매우 중요.
  5. 프롬프트 체이닝 - 앞선 테크닉 TOP8과 같이

좋은 프롬프트 만들기

  1. 명확한 지시문
  2. 적절한 예시
  3. 모델에게 생각할 시간을.
  4. 작업 쪼개기
  5. 적절한 컨텍스트 - CoT와 체이닝 쓰면 좋겠지?!
  6. 생각보다 잘 안될 수 있음
  7. 구조화된 프롬프트 - 마치 코드처럼

원하는 결과가 나오지 않는다면

  1. 지시문을 반복해서 사용
  2. 지시문, 컨텍스트 위치 바꾸기
  3. 단어 바꿔보기

프롬프트 평가

  • 신뢰성 (Faithfulness)
  • 관련성 (Relevance)
  • 정확성 (Correctness)
  • 지침 (Guideline)

용어 공부

  • 토큰 - 입출력 텍스트의 구성 요소 쪼갠 단위 (apple과 앞부분 겹치는 apples는 app과 les로 나눠져 2개)
  • ** 한국어 이력서 보통 1,000~3,000개 토큰 / 200페이지 개인상해보험 약관 약 20만개 토큰
  • 컨텍스트 윈도우 - 판단/예측에 사용되는 토큰 범위 또는 최대 토큰 수(GPT-3 2천개, GPT-4 8천개, Gemini 1.5 100만개)
  • 청킹(Chunking) - 텍스트를 적절한 길이로 자르는 방법. 최대 토큰 수가 제한되어 있어 한번에 못넣음.

주요 옵션

  • Temperature - 얼마나 높은 확률의 토큰을 사용할지. 1에 가까우면 창의적이나 헛소리 많이 하고 매번 다른 답변
  • Top P - 확률이 상위 P%인 토큰
  • Top K - 확률이 상위 K개인 토큰
  • Maximum Length - 생성할 최대 토큰 수 (모델 최대 토큰 수 넘지 않도록 주의

프롬프트 예시

 

프롬프트 보안 취약점

  1. 프롬프트 인젝션
  2. 데이터 유출
  3. 취약한 샌드박싱
  4. 인증되지 않은 코드 실행
  5. LLM 생성 콘텐츠에 대한 과도한 의존
  6. 훈련 데이터 조작
  7. LLM의 목표와 사람의 목표가 불일치
  8. 불충분한 접근 제어

프롬프트 인젝션 방법 방법 3가지

  1. 프롬프트 입력 시 구분자를 사용해 사용자 입력값 격리
  2. 인젝션 프롬프트가 존재하는지 다른 LLM으로 확인 후 실행
  3. 명령을 입력받는 LLM과 문제 해결 LLM을 나눠서 사용
  • System 프롬프트에 보안 정보 넣지 말기
  • 내부, 외부 서비스 데이터 주입/프롬프트 명확한 분리
  • 명령 실행 LLM의 경우 시스템 반드시 분리

참고도서

  • 최고의 프롬프트 엔지니어링 강의, 김진중(골빈해커) 지음

'AI' 카테고리의 다른 글

개발자를 위한 ChatGPT 프롬프트 엔지니어링 - 1편  (0) 2023.05.02

댓글