호돌찌의 AI 연구소
article thumbnail

AI 기술 교육, 실습, 협업 커뮤니티 기반으로 이루어져 있으며 AI Education Tech 회사인 DLAI 에서는 최근 양질의 LLM이나 Generation 관련 Topic 들을 중심으로 하여 Short course를 계속 제작하고 있으며 이를 무료로 수강할 수 있습니다. 다루는 내용들이 상당히 좋고 특정 분야에 대해서 standard를 제시해 주는 느낌이 있기 때문에 주변 사람들에게도 추천을 하는 편인데요. 이전에도 아래와 같이 강의 후기 및 요약글을 몇 달 전에 작성했었습니다. 

2023.05.06 - [후기/강의] - 개발자를 위한 ChatGPT 프롬프트 엔지니어링 강의 후기 & 요약 - ChatGPT Prompt Engineering for Developers

 

개발자를 위한 ChatGPT 프롬프트 엔지니어링 강의 후기 & 요약 - ChatGPT Prompt Engineering for Developers

AI 입문하면 무조건 마주치게 되는 Andrew Ng 교수님과 OpenAI technical staff 인 Isa Fulford와 같이 "ChatGPT Prompt Engineering for Developers" 강의가 저번주 DeepLearning.AI 에서 출시 되었습니다. 강의 내용이 좋아서

hotorch.tistory.com

 

이번 글에서 다루는 강의 요약은 Andrew Ng 교수님과 OpenAI technical staff 인 Isa Fulford 가 진행하는 강의로 'Building Systems with the ChatGPT API' 입니다. 핵심은 "ChatGPT API"입니다. API를 바탕으로 단일 Prompt로 호출하는 것이 아니라, 다단계로 Prompt를 구성하고 pipeline으로 분할하여 조금 더 복잡한 Application을 구축하는 내용을 소개합니다.

여기 강의 특징은 간단하게 예를 들어거 시스템 하나를 단편적으로 만드는 내용을 보여줍니다. 강의에서 다루는 예시로는 "고객 CS 어시스턴트 시스템"을 구축하는 것이고, 실제 End user가 보이지 않는 여러 내부 단계마다 어떤 것들을 구현해야 하고, 어떤 것들을 생각해야 하는지 보여주는 강의라고 생각합니다. (참고로 Langchain은 이번 강의에서는 일절 활용하지 않고, 따로 강의가 구성되어 있습니다.)

그리고 이 글은 강의에서 어떤 내용을 다루는지 간단하게 요약을 하지만 매우 긴 프롬프트를 바탕으로 설명하는 세션이 다수입니다. 따라서 궁금한 부분에 대해서는 실제로 Enroll 해서 들어보는 것을 추천합니다. 또한 내용이 길기 때문에 글을 나누어 작성하고 중간중간 빈약하다고 판단되는 부분은 제 지식과 리서치한 내용들을 추가적으로 첨부합니다. 그럼 시작해 보겠습니다. 

 

 

Intro


1. Large Language Model, the Chat format & tokens 

일반적으로 Language Model 이 2가지 형태가 존재하며 "다음 단어가 나타날 확률이 높은 단어"를 맞추는, 우리가 알고 있었던 일반적인 언어 모델이 있습니다. 이 언어모델은 학습데이터를 근간으로 하고 있습니다. (여기 강의에서는 이 또한 LLM으로 부르고 있습니다.) 그리고 ChatGPT 처럼, Instruction을 기준으로 Tuned 된 모델을 LLM으로 부르고 있고, 이를 Instruction Tuned LLM이라고 부릅니다. 아래 그림은 두 언어모델을 비교한 예시입니다.

 

 

 

여기서 Instruction tuned LLM을 만드는 방법은 base LLM을 기준으로 구성하는데 이 방법은 다음과 같습니다. (인간의 손이 제일 많이 들어가고 비용과 시간이 제일 많이 드는 부분.)

  • input instruction에 맞는 output이 나오게끔 하는 데이터를 구성한 후 fine tuning을 수행합니다.
  • 여기서 사람의 영혼을 담아 output의 품질이 좋은지 나쁜지 rating을 수행합니다. 
  • 더 높은 rating을 생성할 확률을 높이기 위하여 RLHF 방법을 사용합니다. 

 

2. Revolution

6개월~1년이상 걸리던 application을 이제 몇 시간 만에 구축할 수 있다고 앤드류 응 교수님이 이야길 합니다. (몇 시간은 약을 파는 것 같습니다.  필자는 몇 시간 안에는 어렵던데요..) 지도 학습에서는 인형에 눈 붙이는 것처럼 데이터에 label을 달고 이를 훈련하고 배포하는 시간이 상당히 길지만 아래 그림과 같이 구현하면 빠르게 application을 개발할 수 있다고 합니다. 여기서는 "prompt-based AI"라고 부릅니다. 

 

3. Tips 

python에서 system 환경 변수를 설정하는 방법으로 python-dotenv 가 있습니다. 이를 이용해서 OpenAI API Key를 관리하라고 강조를 합니다. (예전에 Chatgpt API 강의하는데 이 부분을 모르셔서 키 노출되고 발급하고 불편함을 겪으신 분들이 생각이 났습니다.)

 

 

Classification


분류할 Target Label 의 범주를 대분류/중분류 형태처럼 Scope을 정해놓고, 쿼리를 보냈을 때 해당 범주에 맞는 Category에 Assign을 하는 예시를 보여줍니다. f-string과 delimiter를 이용하여 user message에 결합하여 넣는 방식으로 구현이 되어있습니다. 코드와 prompt를 중심으로 한번 참고만 하시면 되겠습니다.

delimiter = "####"
system_message = f"""
You will be provided with customer service queries. \
The customer service query will be delimited with \
{delimiter} characters.
Classify each query into a primary category \
and a secondary category. 
Provide your output in json format with the \
keys: primary and secondary.

Primary categories: Billing, Technical Support, \
Account Management, or General Inquiry.

Billing secondary categories:
Unsubscribe or upgrade
Add a payment method
Explanation for charge
Dispute a charge

Technical Support secondary categories:
General troubleshooting
Device compatibility
Software updates

Account Management secondary categories:
Password reset
Update personal information
Close account
Account security

General Inquiry secondary categories:
Product information
Pricing
Feedback
Speak to a human

"""
user_message = f"""\
I want you to delete my profile and all of my user data"""
messages =  [  
{'role':'system', 
 'content': system_message},    
{'role':'user', 
 'content': f"{delimiter}{user_message}{delimiter}"},  
] 
response = get_completion_from_messages(messages)
print(response)

 

Moderation


1. moderation

moderation 부분은 chatgpt 를 바탕으로 본인 Application을 개발할 때 반드시 필요한 기술적인 부분입니다. 첫 번째로는 개발하는 서비스에 위협요소 또는 유해한 부분이 들어왔을 때, 이에 대해 flag를 판단하는 것을 우선적으로 보여줍니다. 그리고 함수는 "ChatCompletion.create" 대신 "openai.Moderation.create” 이용합니다. 이 부분은 개발하고자 하는 application에 대해 보호장치 역할을 하며 유해한 부분에 대해서 중재시키는 api를 활용 가능할 수 있습니다. 여기 Moderation 관련하여 openai 공식 가이드 문서를 참고하시면 좋겠습니다. moderation을 판단하는 openai 모델(Multi-label Model)은 따로 있으며 결과는 다음과 같이 category들에 대해서 확률 값으로 return 됩니다. 

{
  "id": "modr-XXXXX",
  "model": "text-moderation-005",
  "results": [
    {
      "flagged": true,
      "categories": {
        "sexual": false,
        "hate": false,
        "harassment": false,
        "self-harm": false,
        "sexual/minors": false,
        "hate/threatening": false,
        "violence/graphic": false,
        "self-harm/intent": false,
        "self-harm/instructions": false,
        "harassment/threatening": true,
        "violence": true,
      },
      "category_scores": {
        "sexual": 1.2282071e-06,
        "hate": 0.010696256,
        "harassment": 0.29842457,
        "self-harm": 1.5236925e-08,
        "sexual/minors": 5.7246268e-08,
        "hate/threatening": 0.0060676364,
        "violence/graphic": 4.435014e-06,
        "self-harm/intent": 8.098441e-10,
        "self-harm/instructions": 2.8498655e-11,
        "harassment/threatening": 0.63055265,
        "violence": 0.99011886,
      }
    }
  ]
}

 

2. Prompt Injection

다른 사용자가 prompt에 대해서 유도 심문을 던지거나 기개발된 AI를 조작하거나 조건을 무시시키게 하는 방법, 또는 의도가 되어있는 instruction에 대해서 조작하려는 경우 등을 일컫는 것이 prompt injection이라고 부릅니다. 이를 피하려면 아래 그림처럼 따로 지침을 강조를 하는 형태로 접근하는 방식을 알려줍니다. 

 

 

자세한 injection 관련 코드에 대해서는 lecture를 수강하는 것을 권장합니다. 

 

 

Chain of Thought Reasoning & Chaining Prompts


LLM 모델이 종종 잘못된 결론을 도출하여 오류를 발생할 수 있습니다. 이 때 Prompt를 reframe 하게 구성하여 Chatgpt가 추론하는 과정을 단계별로 요청하는 내용을 다루는 session입니다. 이 부분은 prompt 예시가 핵심이라 해당 세션을 수강하는 것을 권장합니다. 

그리고 복잡한 작업을 분할하여 처리하는 전략을 알려주는 세션인데, 이 또한 프롬프트가 전부이기 때문에 해당 세션을 듣는 것을 권장합니다.

 

Check Outputs


 

 ChatGPT의 결과물에 포커싱을 하는 세션인데 응답에 대한 품질과 관련성, 안정성 위주의 검토를 하는 세션입니다. 재미있는 부분으로는 프롬프트 내부에 "does it use the retrieved information correctly?"("검색된 정보를 올바르게 사용하나요?”) 와 같은 질문을 넣어서 halluciation을 일으키지 않는지 확인합니다.

 

another_response = "life is like a box of chocolates"
q_a_pair = f"""
Customer message: ```{customer_message}```
Product information: ```{product_information}```
Agent response: ```{another_response}```

Does the response use the retrieved information correctly?
Does the response sufficiently answer the question?

Output Y or N
"""
messages = [
    {'role': 'system', 'content': system_message},
    {'role': 'user', 'content': q_a_pair}
]

response = get_completion_from_messages(messages)
print(response)

 

하지만 Isa Fulford 선생님은 이러한 방식(Output에 대해서 Y, N 만을 뱉게 하는 경우)이 실제 프로덕션 환경에서 적용하는데 좋지 않을 수 있다고 이야길합니다. 그 이유는 앱이나 제품에 대한 Error Rate가 0.00001% 조차 허용하지 않는다면 이 방식을 사용해 볼 수 있지만 이러한 방식은 권장하지 않는다고 이야길 합니다. 

 

다음 글에서는 Generation Task에서 스트레스가 상당한 Evaluation 관련한 내용들을 요약 및 소개하겠습니다. 


아래는 블로그 주인장의 토스 익명 후원 링크입니다. 글이 도움되거나 흡족스러웠다면 후원해 주시면 감사하겠습니다.

https://toss.me/hotorch

 

hotorch님에게 보내주세요

토스아이디로 안전하게 익명 송금하세요.

toss.me

 

 

profile

호돌찌의 AI 연구소

@hotorch's AI Labs

포스팅이 도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!