본문 바로가기
AI

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

by devlect 2023. 5. 2.

Andrew Ng교수님이 DeepLeanging.AI를 통해 ChatGPT 프롬프트 엔지니어링 과정을 무료로 공개했다. 다음은 해당 과정을 들으면서 개인적으로 정리한 내용이다.

 

  1. 인터넷에 있는 '반드시 알아야 하는 프롬프트 30가지' 같은 자료들은 특정 주제에 한정적이거나 ChatGPT 웹 인터페이스와 같이 일회성 작업에 초점이 맞춰져 있다.
  2. 여기서는 개발자들이 API호출을 사용하여 여전히 과소평가된 LLM 모델을 잘 응용할 수 있도록 돕는 것이 목표다. 개념부터 잡고 어떻게 하는지 예제를 통해 좋은 프롬프트를 만들기 위한 다양한 방법을 배운다. 마지막에는 챗봇을 만들어 본다. 그리고 뭔가를 해볼 수 있는 생각이 든다면 이 강의가 할 일은 다했다.
  3. LLM은 기본 LLM과 튜닝 LLM으로(전문 용어가 따로 있을 수 있지만 여기서는 기본과 튜닝으로 두 용어의 차이를 구분함) 크게 나눌 수 있는데 절차나 지시, 인간의 피드백에 의한 강화학습 등이 튜닝 LLM으로 볼 수 있다. 튜닝 LLM이 좀 더 위험한 답변을 내놓을 확률이 적고 목적에 부합하므로 실용적인 응응 프로그램에서는 대부분 튜닝 LLM을 사용한다.
  4. 그래서 여기서는 훌륭한 튜닝LLM을 어떻게 만드는 가에 초점을 맞춘다.
  5. 튜닝 LLM을 사용하는 것은 상세 내용은 모르지만 똑똑한 사람에게 일을 지시하는 경우와 비슷하다.
    • 정확하게 어떤 종류의 대답을 원하는지
    • 어떤 톤으로 답하길 원하는지(친구, 전문기자와 같이)
    • 어떤 작업 지시 전에 미리 알려주고 시작할것이 있는지(그러면 똑똑한데 그 도메인도 알고 있는 상태로 지시를 수행할 수 있으니까)

기본LLM과 튜닝LLM


첫 번째 편은 실습없이 간단한 소개에 대해 설명해 주는데 Transcript가 함께 제공된다. 이 Transcript를 그대로 복사하면 아래와 같이 스크린 가로 폭에 따라 개행이 되어 복사되는데 대충 아래와 같다. 이걸 구글 번역기에 붙여 넣으면 정말 10년 전으로 돌아간 것 같은 번역이 된다. 

개행된 상태에서 구글 번역기 결과

영어를 그냥 읽으면 되지만 일단 그건 논외로 하고, 개행된 줄은 잘 붙여주면 번역이 잘 될 것 같다. 그래서 왼쪽의 개행된 영문 원문을 붙여줘 봤다. 그러자 정상적으로 번역이 된다.

개행된 문장을 붙여 줬을 때 결과

그런데 우리는 개발자이지 않은가. 이걸 언제 개행문자를 하나 하나 지운단 말인가. 간단히 파이썬 스크립트를 통해 영어 원문을 읽어 개행을 제거하는 스크립트를 짠다. 간단히 pathlib를 사용해도 되고,

p = Path("introduction.txt")
    text = p.read_text()

파일을 읽어도 된다.

with open("introduction.txt", "r") as f:
    text = f.read().replace("\n", "")

이렇게 읽고 나면 개행문자가 없는 영문이 나온다. 이걸 구글 번역기에 붙여 넣고 실행하면 올바른 번역이 된다. 그런데 너무 귀찮다. 그리고 이건 프롬프트 튜토리얼 아닌가. OpenAI의 API를 이용해 보기로 한다.

 

OpenAI 사이트에서 API KEY를 발급받고, 간단한 셋팅을 해준다. 여기서는 gpt-3.5-turbo를 쓴다. 

openai.api_key = os.getenv("OPENAI_API_KEY")
openai.organization = os.getenv("OPENAI_ORGANIZATION")

def get_completion(prompt, model='gpt-3.5-turbo'):
    messages = [
        {
            "role": "system",
            "content": prompt
        }
    ]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0,
    )

    return response.choices[0].message["content"]

trans_in_ko = get_completion(f"다음 문장을 한글로 번역해줘 \n\n{ORIGINAL_TRANSCRIPT}")

이렇게 하면 trans_in_ko 변수에 변역된 결과가 담긴다. 여기에 아래와 같은 문장도 추가할 수 있다.

summary_in_ko = get_completion(f"다음 문장을 요약해줘 \n\n{trans_in_ko}")

이러면 요약 문장까지 나온다.

 

복사해서 일일히 개행문자 지우고 번역기 돌려서 읽어보고 이럴 필요 없이,

간단한 코딩과 프롬프트로 한번에 쭉~ 요약까지 시킬 수 있다. 앞부분에 Transcript까지 크롤링해서 가지고 온다면 [원문가져오기] -> [개행제거] -> [번역하기] -> [요약하기]까지 한큐에 끝낼 수 있다. 

 

물론 ChatGPT는 구글 번역기와 다르게 개행문자가 있어도 번역을 잘 해줄 수도 있을 것이다. 이 부분은 직접 확인해 보시길 : )

 

다음은 좋은 프롬프트 엔지니어링을 위한 가이드라인에 대해 알아본다. 위에서 간단히 시켜봤는데 어떻게 하면 더 똘똘하게 시킬 수 있는지 알아보는 것이다. ChatGPT는 개떡같이 얘기해도 찰떡같이 알아듣기도 하지만, 우린 항상 찰떡같이 알아듣길 원하기 때문에 좋은 프롬프트가 필요하다.

 

 

** 관련링크: https://learn.deeplearning.ai/chatgpt-prompt-eng/lesson/1/introduction

댓글