BigData

ChatGPT를 이용한 질문 분류 - Input - Classification

IT오이시이 2023. 10. 5. 15:26
728x90

 

ChatGPT를 이용한 질문 분류 -  Input - Classification

 

최근 모든 기술 트랜드가 ChatGPT를 이용한 프로그램이 대세인듯 합니다. 저도 프로그램을 만들어 본지는 오래 되었지만 다시 파이썬 코드와  "https://chat.openai.com/" 를 이용해서 소스코드를 검증하고 샘플을 만들어 보고 있습니다.

먼저 ChatGPT를 이용한 질문의 분류 (Classification) 하는 방법을 소스로 정리해 보았습니다.

소스를 작성 하려면 {YOUR_API_KEY} 부분은 본인의 OpenAI API 키를 입력 해야 합니다. 그런데  chatGPT의 API_KEY를 이용하여 사용 하려면  개인계정을 유료 결제를 해야 합니다.

ㅁ ChatGPT API 이용가이드
   https://platform.openai.com/docs/api-reference


ㅁ API keys 생성 및 관리 
   https://platform.openai.com/docs/api-reference

 

 


OpenAI를 이용한 질문 분류 소스 작성 : input-Classification

ChatGPT를 사용하여 질문을 분류하는 간단한 Python 스크립트를 만들어 보겠습니다.

import openai
openai.api_key = "{YOUR_API_KEY}"

* "{YOUR_API_KEY}"는 openAI 사이트에 가입하여 발급을 받은 개인 키입니다. gpt는 유료로 전환되어 개인 계정에서 billing을 해서 사용 할 수 있습니다.

 

def get_completion_from_messages(messages, 
                                 model="gpt-3.5-turbo", 
                                 temperature=0, 
                                 max_tokens=500):
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature, 
        max_tokens=max_tokens,
    )
    return response.choices[0].message["content"]

 

- messages: 대화를 구성하는 메시지들의 리스트입니다.  message는 role 과 메시지 내용을 담는 content로 구성됩니다.  
- temperature : 생성된 텍스트의 다양성을 제어하는 매개변수로, 0에 가까울수록 보수적이고 1에 가까울수록 더 다양한 결과를 생성합니다.
- max_tokens : 생성된 텍스트의 최대 토큰 수를 제한하는 매개변수입니다. 이를 통해 생성된 텍스트의 길이를 제어할 수 있습니다

- response.choices[0] : 응답 결과의 통해 첫 번째 메시지 내용을 가져옵니다.

 

 

Role은 메시지를 보내는 주체의 역할을 가리키는 매개변수 입니다.  system,  user, assitance 로 구성되어 있습니다.

"system"
: 시스템 역할은 주로 채팅의 맥락이나 지침으로 언어 모델에게 어떤 방식으로 응답할지에 대한 지침을 제공합니다.

"user"
: 사용자 역할은 실제 사용자가 모델에게 보내는 메시지로 질문, 명령의 유형으로 system과 상호 작용을 합니다.

"assistant"
: 어시스턴트 역할은 모델이 이전에 생성한 메시지로 이전 응답과 일관성을 유지하도록 합니다.

 

[질문1 : 질문에 대한  설명과 응답을 위한 category 분류 정리]

 

system_message에 delimiter를 이용하여 사용자의 질문을 전달하겠다고 설명 되어 있습니다.
   {'role':'user',  'content': f"{delimiter}{user_message}{delimiter}"},

  카테고리 범주별로 아래와 같이 확장하면 해당 유형에 적합한 category로 분류 응답이 가능합니다.

 

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: Human resource, Billing, Technical Support, \
Account Management, or General Inquiry.

Human resource categories:
on-boarding date
vacation
profile photo 

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)

 

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

 

{ "primary": "Human resource", "secondary": "profile photo" }

 

[질문2 : 한국어로 질문한 category 분류]

 

각 system_message를 한글로 번역하여 정리하여 작성하여도 category 분류가 작동이 됩니다.

 

delimiter = "####"
system_message = f"""
고객 서비스 쿼리가 제공될 것입니다. \
고객 서비스 쿼리는 {delimiter} 문자로 구분될 것입니다.
각 쿼리를 주요 범주와 보조 범주로 분류하십시오. 
json 형식으로 출력을 제공하며 primary 및 secondary 키를 사용하십시오.

주요 범주: 인사, 청구, 기술 지원, 계정 관리 또는 일반 문의.

인사 지원 범주:
입사일
휴가일
프로필 사진 등록 

청구 보조 범주:
구독 취소 또는 업그레이드
결제 방법 추가
요금 설명
요금 이의 제기

기술 지원 보조 범주:
일반 문제 해결
장치 호환성
소프트웨어 업데이트

계정 관리 보조 범주:
비밀번호 재설정
개인 정보 업데이트
계정 닫기
계정 보안

일반 문의 보조 범주:
제품 정보
가격
피드백
인간 상담원과 통화
"""

user_message = f"""\
내 프로필과 모든 사용자 데이터를 삭제하려고 합니다."""
messages =  [  
{'role':'system', 
 'content': system_message},    
{'role':'user', 
 'content': f"{delimiter}{user_message}{delimiter}"},  
] 
response = get_completion_from_messages(messages)
print(response)
{ "primary_category": "계정 관리", "secondary_category": "계정 닫기" }

 

 

 


[질문 3 : 인사 category]

user_message에  "프로필"과 "사진" 등의 키워드로 입력하면 "인사" category로 분류 됩니다.

user_message = f"""\
내 프로필 사진을 수정하고 싶다"""
messages =  [  
{'role':'system', 
 'content': system_message},    
{'role':'user', 
 'content': f"{delimiter}{user_message}{delimiter}"},  
] 
response = get_completion_from_messages(messages)
print(response)

 

{ "primary_category": "인사", "secondary_category": "프로필 사진 등록" }

 

728x90
반응형