Prompt Engineering
다양한 애플리케이션과 연구 주제에 언어모델을 효율적으로 사용할 수 있도록 프롬프트를 개발하고 최적화하는 프로세스입니다.
실험적 방법론에 기반하여, 원하는 결과를 정확히 의도한대로 항상 일관성 있게 내도록 만드는 것이 목적입니다.
LLM 구성 3가지
1. 답변을 위해 필요한 적절한 컨텍스트
2. 원하는 결과를 추출을 위한 프롬프트 작성
3. 원하는 포맷의 출력을 위한 프롬프트 작성
Embedding
단어를 실수의 집합으로 바꿔줌 그리고 그 집합에서 벡터 글자들로 뭉쳐있고, 비슷한 단어들은 비슷한 차원의 주위에 뭉쳐있게 된다.
vector search
관계성이 제일 두드러진 것을 결과를 가져온다.
프롬프트 엔지니어링
프롬프트 5가지 단계
1. 프로픔트 결과 설정
2. 프롬프트 평가 설계
3. 그라운딩 설계 및 평가
4. 프롬프트 디자인
5. 모니터링 및 개선
프롬프트 디자인 프레임워크
Role - 답변자로써 페르소나를 설정, 답변에 대한 배경 지식을 가지고 답해서 더 높은 정확도로 답한다.
Audience - 답변의 대상이 되는 특정 인구, 그루브 또는 개인의 페르소나
Knowledge - 답변에 참고할 정보, 질문에 해당되는 정보를 DB나 검색엔진에서 가져와 삽입 혹은 정보 출처를 지정
Task - 수행해야하는 특정 작업이나 목표
Policy - 응답을 만들 때 따라야 하는 특정 저책이나 규칙
Format - 응답이 따라야하 하는 특정 형식이나 구조
Examples - 원하는 응답의 예시를 제공하여 원하는 출력을 더 잘 이해하도록 도운다.
프롬프팅 테크닉 Top 7
few shot examples
모델에 몇가지 예시를 제공하고, 해당 예시를 참고하여 답변을 하도록 하여 더 나은 성능을 발휘하도록 만드는 기술
주의
충분히 큰 모델에서만 작동
산술 추론 문제에 적합하지않다.
정답을 정확히 주기보다 레이블의 랜덤한 분포를 가진 것이 더 낫다.
Chain of thought ( COT )
이유에 대해서 설명하도록 만들어 답을 더 정확하게 생성하도록 만드는 기술, 중간 추론 단계를 거치도록 하여, 복잡한 사고가 필요한 작업에 정확도를 향상 시키는 방법, 답이 나오는 과정에 대해 설명한 예시를 보여주고, 지시에 대한 답을 생성할 때 예시와 동일한 방식으로 그에 대한 과정을 설명하도록 만든다.
Zero-shot CoT
다음 문구를 마지막에 추가함으로써, CoT 예제를 제공하는 것과 같은 효과를 내어 성능을 향상시킴
Self-Consistency
추론 경로를 최대한 다양하게 제공해야하므로 토큰수를 많이 사용, 결과 취합을 위한 후처리도 필요
모델에게 동일한 프롬프트를 여러 번 반복해서 물어보고 가장 많이 나온 결과를 최종 답변으로 삼는 접근 방식입니다. CoT의 후속 버전으로, CoT와 함께 사용하면 더욱 강력해집니다.
Selection-inference
복잡한 문제를 해결하기 위해 여러 추론 단계를 연결하기 위한 기술, 선택과 추론을 번갈아가면서 일련의 해석가능한 해석 가능한 결과를 도출하는게 목적
context에서 질문에 대한 답변에 근거가 되는 내용을 추출하고, selectopm 내용에 기반에 질문에 답을 한다. 이 프레임워크가 좋은 점은 추론 흔적이 남아서 인과를 추적이 가능하다.
Least to Most
Least to Most prompting (LtM)1 takes CoT prompting a step further by first breaking a problem into sub problems then solving each one. It is a technique inspired by real-world educational strategies for children.
As in CoT prompting, the problem to be solved is decomposed in a set of subproblems that build upon each other. In a second step, these subproblems are solved one by one. Contrary to chain of thought, the solution of previous subproblems is fed into the prompt trying to solve the next problem.
하나의 문제를 더 작은 여러개의 하위 작업으로 분할하는 작업. CoT와 Selection-Inference를 결합한 방법
ReAct
실행 계획을 유도하고 추적하여 작업별로 실행할 액션을 선택하고 실행하는 방법, 외부 API와 상호작용하여 검색엔진을 통해 신뢰할 수 있는 정보를 사용하거나, 계산기나 이미지 생성등의 도구를 사용할 수 있음.
Self-Evaluation
LLM이 생성한 결과를 LLM이 평가를 하게해서 에러나 오류를 잡는다.
구체적인 프레임웍이 아니며, 스스로 평가한다는 컨셉으로, AI 스스로의 결과를 평가하고 향상시키는 방법이 가장 중요한 방법론 중 하나가 될 것으로 예상함. 당분간은 사용범위에 상당한 제약있음
프롬프트 확장 테크닉들
Expert Prompting
LLM에게 전문가로서 응답하도록 요청하는 방법
배경 지식을 암시적으로 이해하고 답변함으로써, 성능이 크게 향상된다. 도메인이 정해지지않은 서비스에도 제너럴하게 활용 할 수 있음
According to wikipidia
해당 내용을 참조하라고 하는 것만으로도 더 정확한 답변을 얻을 수 있다.
Fenerated knowledge Prompting
지식을 먼저 생성하라고 하고, 그 뒤 생성한 지식을 바탕을 답변을 생성하는 기법
앞선 According to wikipidia등의 기법과 마찬가지로 구체적인 지식을 바탕으로 답하게 한다.
정확한 지식을 생성할 것이라는 보장이 없으므로 생성 결과를 주의 깊게 평가할 필요가 있다.
Retrieval Augmented Generation
생성하기 전에 사용자의 요청과 관련된 지식을 검색 컴포넌트에서 검색해와, 해당 내용을 프롬프트에 컨텍스트로 제공해 결과 생성
답변의 정확도를 극도로 높이기 위한 가장 좋고 확실한 방법으로, RAG는 프롬프트 엔지니어링의 필수적인 구성요소가 되었다. 그리고 그에 따라 vector search도 굉장히 중요한 구성 요소로 자리잡음
Tree of Thought
트리 구조로 답변을 생성해내면서, 중간 단계에서 진행 상황을 스스로 평가하려 생각 트리를 확장하고 조정하는 방법.
생성한 결과와 평가를 통해 앞뒤로 생각을 체계적으로 탐색하여 매우 높은 수준의 사고를 할 수 있도록 한다.
매우 많은 생성 단계를 거치게 되므로, 일반적으로 사용하기 어렵지만, 고도의 생성 전략이 필요한 경우 다른 PE 기법들과 혼합해 사용하면 극도로 높은 성능을 기대할 수있다.
Plan and solve Primpting
CoT, SC 등의 기법을 사용했을 때 답변이 잘못되는 중 가장 큰 문제는 중간 문제 풀이 단계가 누락되는 경우다.
이것을 해결하기 위해 나온 기법이고, 전체 작업을 더 작은 하위 작업으로 계획을 세우고 그 계획에 따라 하위 작업을 수행하거나 평가하면서 전체 문제를 해결하는 기법. Leat to most가 풀어야 할 문제를 단계적으로 생성해가면서 문제를 푼다면, PS는 미리 풀어야 할 하위 문제를 모두 생성해두고 문제를 푼다는 것이 다르다.
Automatic Prompt Engineer
LLM으로 프롬프트를 자동 생성하는기법
프롬프트에 <INSERT> 라는 빈 칸을 만들고, 생성 결과를 함께 주면서 모델에게 <INSERT> 부분을 채우도록 하는 방법을 반복하는 기법
아직 완전한 프롬프트를 처음부터 만들어내는 것은 한계가 있고, 기본 프롬프트를 작성하고 성능을 올리기 위한 파인튜닝의 개념으로 사용
KEY POINT
1. 예시를 제공
2. 생각을 많이 하게 만든다.
3. 문제 풀이 전략을 세우게 한다.
4. 스스로 평가한다.
LLM 취약점
Prompt Injections
정교하게 제작된 프롬프트를 사용하여 필터를 우회하거나 LLM을 조작하여, 이전 지시사항을 무시하게 하거나 의도하지 않은 행동을 수행하게 만드는 방법, 프롬프트를 유출하거나, 제한된 사용 범위를 넘는 답변을 하거나, 시스템에 악성 코드를 만드는 것이 대부분 이 방식을 통해 이루어짐
프롬프트 구조로 방어
프롬프트에 입력에 대한 구분자를 사용
프롬프트를 사용자의 입력값 이전과 이후로 나눠서 구성
사용자의 입력 이전의 프롬프트의 내용을 답변하지 말라고 지시한다.
인젝션 체커로 방어
프롬프트 실행 전 프롬프트에 인젝션 프롬프트가 존재하는지 다른 LLM으로 확인 후 프롬프트 실행
태스크 분리로 방어
명령을 입력 받는 LLM과 문제 해결을 수행하는 LLM을 분리해서 사용
'Study > Langchain' 카테고리의 다른 글
Machine Learning Concept (0) | 2023.09.04 |
---|---|
Langchain (랭체인)에 대해 알아보자 ! (0) | 2023.06.09 |