거대 언어 모델(Large Language Model, LLM)과 프롬프트 엔지니어링

프롬프트와 프롬프트 엔지니어링

ChatGPT와 같은 거대 언어 모델(Large Language Model, LLM)을 사용할 때 모델에 전달하는 메시지를 프롬프트(Prompt)라고 하죠. 프롬프트를 잘 만들어서 원하는 결과물을 얻기 위해 연구하는 것을 프롬프트 엔지니어링이라고 합니다.

프롬프트는 한 문장이 될 수도 있고 여러 문단이 될 수도 있죠. 프롬프트를 몇 가지 주요 구성 요소들로 나눠보면 아래와 같이 정리할 수 있습니다.

  • Goal: 달성해야 하는 목표
  • Instruction: 구체적인 지시, 요구 사항 또는 질문
  • Role: 모델에게 조언자나 편집자, 작가 등의 역할을 지정해주는 부분
  • Context: 작업의 배경 지식이나 상황 제공
  • Output Format: 원하는 응답 형식을 지정해주는 부분
  • Systematic Approach: 특정 시스템이나 알고리즘을 따르도록 지시
  • Step-by-step: 복잡한 작업을 단계별로 처리하라고 지시
  • Clarifying Questions: 불확실한 부분은 모델이 사용자에게 질문하도록 권장
  • Examples: 질문과 응답 예제

이러한 분류는 정해져 있는 것은 아니고, 사람에 따라 다르게 분류할 수 있습니다. 또 매번 위의 모든 요소가 다 들어갈 필요도 없죠. 사용 목적에 따라 들어가는 요소들이 달라지게 됩니다. LLM은 예제로부터 학습할 수 있는데, 예제가 없으면 Zero-shot, 하나 있으면 One-shot, 두 개 이상 있으면 Few-shot learning이라고 합니다.

아래 나오는 내용은 주로 대화형 환경 보다는 LLM의 API (Application Programming Interface)를 이용해 사용자에게 드러나지 않게 구현하게 됩니다.

환각 현상의 완화

거대 언어 모델에서 나타나는 환각(hallucination, 거짓 응답) 현상을 줄이는 방법 중 하나가 Context를 제공하고 주어진 정보를 이용해 답하라고 지시하는 방법입니다. 물론 Context에는 사실을 담아야겠죠. 그러려면 Context 정보를 어디선가 가지고 와야 합니다.

Bing Chat, Bard

질문을 가지고 인터넷을 검색해서 Context에 들어갈 내용을 가져오면 Microsoft의 Bing Chat이나 Google의 Bard와 같이 최신 정보를 반영한 모델이 됩니다. 검색한 웹문서를 직접 열어서 필요한 부분을 찾을 필요 없이 질문에 대한 답을 알아서 정리해주죠.

문서에 대한 질의 응답: ChatPDF

Context를 PDF 파일과 같은 문서에서 가져오면 문서의 내용에 대해 질문할 수 있는 챗봇, ChatPDF가 됩니다. 인터넷 검색의 경우 이미 있는 Google이나 Bing과 같은 검색 엔진의 검색 결과에서 가장 먼저 나오는 몇 개의 인터넷 문서에서 정보를 가져오면 됩니다. PDF 파일은 어떻게 할까요?

PDF나 워드 문서의 경우 문서에서 텍스트 정보를 추출하여 텍스트를 컴퓨터에서 처리할 수 있는 숫자들의 벡터로 변환합니다. 이 과정을 벡터 임베딩(Vector Embedding)이라고 하죠. 문서 전체의 텍스트를 일정 길이(Chunk)로 나눠서 벡터로 변환한 후 벡터들을 벡터 데이터베이스(VectorDB)에 저장해 놓습니다. 질문이 들어오면 질문도 벡터로 변환합니다. 벡터들끼리는 거리를 측정할 수 있죠? 질문 벡터와 문서의 벡터들 사이의 거리를 측정하여 거리가 가까운 벡터들을 몇 개 추출하면 그 벡터에 해당하는 원본 텍스트가 Context에 들어가게 됩니다. 그럼 LLM은 질문에 대한 답을 포함할 가능성이 높은 Context의 정보를 이용해서 대답을 해주죠. 정리해보면, 다음과 같습니다.

  1. 답을 찾고자 하는 문서(문서들)에서 텍스트 추출
  2. 텍스트를 일정 길이로 나누기
  3. 나눈 내용을 벡터 임베딩을 이용해 벡터로 변환
  4. 변환한 벡터들을 벡터 데이터베이스에 저장
  5. 사용자 질문 (사용자 질문이 제일 처음에 문서와 함께 주어질 수도 있습니다)
  6. 사용자 질문을 벡터 임베딩을 이용해 벡터로 변환
  7. 질문 벡터와 벡터 데이터베이스에 저장된 벡터들 사이의 거리 계산
  8. 거리가 가장 가까운 벡터들 추출
  9. 추출한 벡터들의 원본 텍스트를 LLM에 질문에 대한 Context로 제공
  10. LLM은 질문에 대한 답을 Context에서 찾아서 사용자에게 응답

일반 검색에서는 검색하는 단어나 문장과 글자가 일치하는 것을 찾지만 벡터 검색은 의미가 유사한 내용을 찾는 의미 검색(semantic search)입니다. 벡터 데이터베이스에 회사의 제품에 관한 여러 가지 문서들을 넣으면 회사의 제품 상담 챗봇이 됩니다.

문서에는 PDF 뿐 아니라 Word, Excel, Power Point, Gmail, Notion 등 다양한 문서들이 있습니다. 이러한 문서들에서 텍스트를 편리하게 추출해주는 라이브러리로 Llama-Index가 있습니다.

인공지능 비서: AutoGPT, BabyAGI

LLM의 API를 호출하는 프로그램에서 Instruction에 특정 함수의 사용법을 알려줄 수 있습니다. 예를 들면 위키피디아 검색을 하고 싶으면 wikipedia(query)라고 출력하라고 알려줄 수 있습니다. 수학 계산을 하고 싶으면 calculate(equation)이라고 출력하라고 알려줄 수도 있죠. 질문과 함께 함수 사용법을 알려주고 함수를 사용할 수 있다고 LLM에 알려주면 LLM은 최종 대답을 하기 전에 필요한 정보를 얻기 위해 함수를 사용하게 됩니다. 직접 함수를 호출하는 것은 아니고 함수 호출에 필요한 명령을 출력하게 되는거죠. 그럼 프로그램에서 해당 함수를 호출하여 결과를 LLM에 전달해줍니다.

  1. 질문과 함께 사용할 수 있는 함수들을 LLM에 제시
  2. LLM에서 필요한 함수를 호출하는 명령 출력
  3. LLM을 호출하는 프로그램에서 함수 실행
  4. 함수 실행 결과를 LLM에 알려주기
  5. LLM에서 최종 응답

예를 들어, 광안대교를 언제 개통했는지 질문하고 위의 함수를 사용할 수 있다고 알려주면, wikipedia(광안대교 개통일)과 같은 출력을 내놓게 됩니다. 그럼 이 함수 호출 내용을 프로그램에서 분석해서 위키피디아 검색을 수행하고 결과 페이지(위키피디아 광안대교 페이지)의 내용을 LLM에 질문과 함께 Context로 전달하게 됩니다. 그럼 LLM은 Context에서 답을 찾아 대답하게 되죠.

LLM에서 Python 코드를 출력하면 코드를 실행해서 결과를 알려주겠다고 지시할 수도 있습니다. LLM에 지시를 내리면 LLM에서 지시를 수행하기 위한 코드를 작성해서 출력하고, 프로그램에서 코드를 실행한 후 실행 결과를 다시 LLM에 전달합니다. 그럼 LLM은 결과를 이용해 이후의 응답을 생성할 수 있죠. ChatGPT Plus의 Advanced Data Analysis (Code Interpreter의 새 이름)의 기본 원리입니다.

이렇게 LLM에 알려주는 함수는 LLM의 Tool 또는 Skill이라고 부릅니다. 많은 함수를 알려줄수록 LLM이 할 수 있는 일도 많아지죠. 복잡한 문제의 경우 문제 풀이 단계를 논리적으로 분석해서 제시하고 하나씩 차례대로 수행하라고 지시할 수도 있습니다. 각 단계를 수행할 때 사용할 수 있는 함수들도 같이 알려주죠. AutoGPTBabyAGI의 기본 원리입니다. 이런 LLM 프로그래밍을 편리하게 만들어주는 라이브러리로 LangChain이 있습니다.

J.A.R.V.I.S.

말로 지시를 내리고 소리로 응답을 듣고 싶다면? 음성 인식(Speech Recognition) 기술을 이용해 말을 글로 바꿔서 지시를 내릴 수 있습니다. LLM의 출력은 글을 읽어주는 음성 합성(Text-to-Speech) 기술을 이용하면 됩니다.

  1. 사용자가 음성으로 명령
  2. 음성 인식: 음성을 글자로 변환
  3. 글자를 LLM (AutoGPT)에 전달
  4. LLM (AutoGPT)에서 응답
  5. 음성 합성: 응답 결과를 읽어주기

간단한 자비스(JARVIS)가 됩니다. 토니 스타크의 자비스에 비하면 아직 한참 멀었지만, 점점 향상되고 있습니다.

댓글 남기기