본문 바로가기

코딩

파이썬 Chat GPT로 인사 평가 의견을 자동 요약하기

사진: Unsplash 의 Scott Graham
로봇청소기 모델별 쿠팡 리뷰.xlsx
0.03MB

각 회사들은 저마다 다양한 방식의 평가제도를 운영하지만 대부분의 경우 평가 프로세스의 최종 산출물은 정량적으로 측정되는 평가 등급 또는 점수, 그리고 평가자의 정성적 코멘트로 구성됩니다. 보상, 승진, 보임, 교육 등 타 인사제도와 연계하여 평가결과를 활용하기 위해서는 정량적 데이터를 활용하는 것이 용이하지만 중요한 의사결정을 위해서는 상사, 동료, 부하 직원 등 다양한 평가자의 의견 역시 충분히 검토하여야 합니다. 따라서 인사 평가 담당자들은 많은 시간을 할애하여 직원별 평가 의견을 요약한 리포트를 작성하기도 하는데요, 이 때 Chat GPT를 활용할 경우 기존 대비 엄청난 수준의 생산성 향상을 기대할 수 있습니다.

 

대상 인원이 적고 요약해야하는 평가 의견이 길지 않은 경우에는 Chat GPT 채팅창에 그대로 질문하는 방식이면 충분하지만 수십, 수백명의 평가 의견을 요약해야 하거나, 평가 코멘트가 길어서 Chat GPT가 제공하는 글자수 제한을 초과하는 경우, 또는 보안상 외부로 유출되어서는 안되는 정보를 Chat GPT를 통해 요약하기 위해서[각주:1]는 다른 방법이 필요할 때도 있습니다. 따라서 오늘은 OpenAI API를 활용하여 Chat GPT에게 긴 텍스트를 자동으로 요약하게끔 하는 방법을 소개하고자합니다.

 

실제 인사평가 데이터를 활용한 예시를 시원하게 소개할 수 있으면 좋겠지만.. ㅎㅎ 본 포스트에서는 개인적으로 구매를 몇달째 고민하고있는 쿠팡 로봇청소기 상품평 데이터를 대신 활용하여 해당 내용을 간결하게 요약하는 예제를 소개하겠습니다. 실제 업무에 활용하기를 원하시는 분들은 프롬프트만 일부 수정하여 그대로 활용하실 수 있을 것 같습니다.


1. 데이터 읽어오기

첨부파일을 파이썬 스크립트와 같은 폴더에 저장한 후 읽어옵니다.

import pandas as pd

df = pd.read_excel("로봇청소기 모델별 쿠팡 리뷰.xlsx")

로봇청소기 모델별 리뷰 데이터

다음으로는 groupby 함수를 사용하여 동일한 모델에 대한 리뷰를 하나로 합쳐주겠습니다.

df = df.groupby('상품명')['리뷰'].apply('\\n'.join).reset_index()
# 각 모델별로 행이 합쳐져 총 5행 2열의 데이터가 만들어졌습니다.

 

2. 리뷰를 요약해주는 함수 정의하기

def summarize_review(review):

길이가 긴 텍스트를 요약하기 위해서 langchain의 summarization chain을 활용합니다.

from langchain.chains.summarize import load_summarize_chain
from langchain import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter

 

전체 프로세스를 먼저 설명드리자면 다음과 같은데요,

  1. 전체 텍스트를 조각조각내어 여러개의 작은 텍스트로 저장한다.
  2. 각각의 조각난 텍스트에 대한 요약문을 작성한다.
  3. 작성된 요약문들을 하나로 합쳐서 최종 요약문을 완성한다.

먼저 텍스트를 나누어주는 text_splitter를 불러와서 리뷰텍스트를 여러개의 documents (docs)로 나누어 저장하겠습니다.

text_splitter = RecursiveCharacterTextSplitter(separators=["\n\n", "\n"], chunk_size=3000, chunk_overlap=300)

def summarize_review(review):
    docs = text_splitter.create_documents([review])

 

다음으로는 나누어진 각각의 document를 요약하기 위한 map prompt 그리고 각각의 요약문을 하나로 합치기 위한 combine prompt의 양식을 정의해주겠습니다.

def summarize_review(review):
    docs = text_splitter.create_documents([review])

    map_prompt_template = '''다음 리뷰를 참고하여 제품의 장단점을 bullet으로 요약해줘
    리뷰 : {text}
    '''
    combine_prompt_template = '''다음 bullet summary를 종합하여 제품의 장단점을 요약해줘 : {text}
    '''

 

Prompt는 GPT에게 전달하는 명령어입니다. 명령어에는 글자수 (정확하게는 token) 제한이 있고 이때 한국어보다는 영어가 적은 토큰으로 인식되기 때문에 Prompt를 영어로 작성하는 방법도 고려할 수 있습니다. 또한 성능에 있어서도 명령어를 한국어로 입력하는 것 보다 영어로 입력하는 쪽이 효과적인 데요, 그리고 내가 원하는 바를 얼마나 명확하게 Prompt에 반영하는지에 따라 얻어지는 산출물의 퀄리티가 크게 변하기 때문에 이 단계에서 많은 고민과 trial and error를 통한 정교화가 필요합니다. 위 예시를 참고하여 여러분의 니즈에 맞는 Prompt를 직접 작성해 보시기바랍니다.

 

다음으로는 명령어 템플릿을 활용하여 각각의 prompt를 정의해줍니다. 그리고 summarize chain을 load하여 실행시킨 값을 return하며 함수를 마무리해줍니다.

def summarize_review(review):
    docs = text_splitter.create_documents([review])

    map_prompt_template = '''다음 리뷰를 참고하여 제품의 장단점을 bullet으로 요약해줘
    리뷰 : {text}
    '''
    combine_prompt_template = '''다음 bullet summary를 종합하여 제품의 장단점을 요약해줘:{text}
    '''
    
    MAP_PROMPT = PromptTemplate(template=map_prompt_template, input_variables=["text"])
    COMBINE_PROMPT = PromptTemplate(template=combine_prompt_template, input_variables=["text"])
    
    chain = load_summarize_chain(ChatOpenAI(temperature=0, openai_api_key = '개인키를 입력하세요', model_name = 'gpt-3.5-turbo'),
                                  chain_type="map_reduce", return_intermediate_steps=True,
                                  map_prompt=MAP_PROMPT, combine_prompt=COMBINE_PROMPT)
    
    return chain({"input_documents": docs}, return_only_outputs=True)

 

3. 정의한 함수를 활용하여 리뷰 요약하기

df['리뷰요약'] = df['리뷰'].apply(lambda x: summarize_review(x)['output_text'])

summarize_review 함수를 적용하여 '리뷰요약' 열을 만들어줍니다.


마지막으로 오늘의 코드 전문과 함께 첨부파일의 예시 데이터가 어떻게 요약되었는지를 소개하며 짧은 포스트를 마치겠습니다.

import pandas as pd

df = pd.read_excel("로봇청소기 모델별 쿠팡 리뷰.xlsx")
df = df.groupby('상품명')['리뷰'].apply('\\n'.join).reset_index()

openai_api_key = '각자의 api 키를 입력해주세요'

from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(separators=["\n\n", "\n"], chunk_size=3000, chunk_overlap=300)

from langchain import PromptTemplate
from langchain.chains.summarize import load_summarize_chain
from langchain.chat_models import ChatOpenAI

def summarize_review(review):
    docs = text_splitter.create_documents([review])

    map_prompt_template = '''다음 리뷰를 참고하여 제품의 장단점을 bullet으로 요약해줘
    리뷰 : {text}
    '''
    combine_prompt_template = '''다음 bullet summary를 종합하여 제품의 장단점을 요약해줘:{text}
    '''
    
    MAP_PROMPT = PromptTemplate(template=map_prompt_template, input_variables=["text"])
    COMBINE_PROMPT = PromptTemplate(template=combine_prompt_template, input_variables=["text"])
    
    chain = load_summarize_chain(ChatOpenAI(temperature=0, openai_api_key = openai_api_key, model_name = 'gpt-3.5-turbo'),
                                  chain_type="map_reduce", return_intermediate_steps=True,
                                  map_prompt=MAP_PROMPT, combine_prompt=COMBINE_PROMPT)
    
    return chain({"input_documents": docs}, return_only_outputs=True)

df['리뷰요약'] = df['리뷰'].apply(lambda x: summarize_review(x)['output_text'])

 

쿠팡 리뷰 원문 (LG 코드제로) :

30평대 살다가 47평형 아파트로 이사오니 바닥 청소에 너무 많은 시간이 들어 처음으로 구입했습니다

설치할 때 기사님이 오셔서 이 제품은 리모컨이 없으며 핸드폰에 LG thinQ 앱을 통해 작동시킬 수 있다는 설명을 듣고 설치 및 작동해 보니 오히려 편했어요

청소시간 및 이동경로 파악도 되고 도면을 통해 청소금지구역 설정도 간편하게 할 수 있어 좋아요

사용 첫날은 우리집 도면을 그려야 하니 지키는게 좋아요
전선 끼이는 곳도 파악하고 경사다리 소파의 청소금지구역 설정을 위해 지켜 보는게 좋답니다

작동해보니 전선이나 카펫트 등은 치우고 화장실 문은 닫아야 합니다
한번의 물공급과 충전으로 저희 집을 1시간10분 동안 청소를
다 한 후에는 충전홈으로 자동으로 되돌아 갑니다

사람이 청소할 때보다 시간이 많이 걸려 처음엔 답답하나 청소시키고 딴 일하면 되니 몸이 편하답니다

먼지통 비우기, 물통 채우기, 걸레 끼우기 등 사용이 간편하고
음성 안내도 되고 LG제품으로 A/S걱정도 없어 대만족합니다

물론 청소기 크기가 커 진입이 안되는 장소는 청소가 안됩니다만 청소하기 힘든 침대밑은 오히려 편합니다

리모컨이 없어 앱을 이용하는게 불편할 수도 있으나 익숙하면 오히려 편합니다

청소에 많은 시간 소비하지 않으니 삶의 질이 높아집니다

오늘도 좋은 하루되세요^^

로봇청소기 이것저것 검색해보고 비교도해보고 하다가 이걸로 주문했어요 엘지측에서 전화가 와서 방문일정정하고 그다음날 설치기사님이랑 통화로 방문시간정했어요 그렇게 받아보는데 이틀이 걸렸지요

제생각엔 설치기사님이 안오셔도 될것같은데 설치기사님이오셔서 3분만에설치 하셨어요
리모컨이 없는 제품이다보니 핸드폰으로 조정하는제품이더라구요 핸드폰 연동이 몇개까지 되는지 모르겠지만 그시간에 남편이 집에없어서 설치기사님이 내핸드폰으로만 연동시켜주셨어요 그리고 설치기사님이 설명을 잘해주셔서 궁금한점이 없을정도였지요

무엇보다 중요한 청소를 잘하는지를 빨리 보고싶어서
설치기사님 가시자마자 로봇청소기를 돌려보았어요
흡입력은 핸드폰으로 조절을 할수가 있는데
흡입력을 약하게 하면 기계소리가 조용하고
흡입력을 강하게하면 기계소리가 크더라구요

물걸레질을 시키려면 물통에 물을 채워야하는데 귀찮아서 그냥 물걸레용 걸레를 달아놓기만 했어요 그런상태에서 작동시켰는데도 바닥이 반질반질해 지더라구요 저희집 바닥이 대리석모양타일 인데 너무 반질반질해져서 새집같아보였어요

단점이 있다면 거실에 10센티 높이의 층간소음방지매트를 깔았는데 그위에 로봇청소기가 혼자 못올라가요 직접들어올려서 올려놔야되는 번거로움이 있어요

로봇청소기 구입을 망설였던 모든 고민들을 말끔히 해결해준 성능 좋은 이모님... 러그도 잘 타고 올라가서 깨끗하게 청소해주심 심지어 체중계 위로도 잘 올라가고 내려와서 체중계 위치 바꿀 필요가 없었어요 작고 말랑한 공이나 수건같은 천, 전선에는 100% 확률로 걸리기 때문에 이런것만 미리 정리해주면 됩니다 판판한 러그 말고 올록볼록한 극세사 발판류에는 올라가려다가 꾸겨지면서 쉽게 걸리는데 매번 치웠다 폈다 할 수 없으니 그 부분만 청소금지구역으로 설정했어요 못본척하면서 잘 지나감ㅋㅋ 생각보다 소음은 좀 있는 편인데 ‘중’ 모드일 때 다이슨 무선청소기보다 조금 적은 수준이고 카펫 감지 ’터보‘ 모드일 때는 소음이 꽤 큽니다 사실 물걸레는 그닥 필요 없었는데 같은모델 물걸레 없는 버전은 블랙색상만 나오더라고요 블랙가전 극혐러라.. 매우 깊이 고민하다가 그냥 대략 10만원쯤 더 주고 이걸로 샀습니다 후회는 없어요 특히 털뿜뿜 동물이 있는 가정이라면 두손모아 강추드립니다

엄마한테보내줬어요
가격변동 너무심하네요
40만7천원에 구매했는데
하루에도 몇번씩보면서 제일쌀때 구매했어요

집에 대부분의 가전제품이 LG입니다 그만큼 가전에선 좋다는거죠
앞전에 타사제품은 목소리가 작아서 무슨말을 하는지 잘 안들리고 청소도 제대로 안되서 두번청소 하게 된적이 많았는데 이번에 장만한 LG제품은 목소리도 잘들리고 흡입력도 청소도 만족스럽네요! 역시 LG인거 같습니다

요약 결과 (LG 코드제로) :

장점: 핸드폰 앱으로 작동 가능, 청소시간 및 이동경로 파악 가능, 청소금지구역 설정 간편, 사용이 간편하고 LG제품으로 A/S 걱정 없음, 청소기 크기가 작아 청소하기 힘든 곳도 청소 가능
단점: 리모컨이 없어 앱을 이용하는 것이 불편할 수 있음, 바닥이 반질반질해지는 경우가 있음, 층간소음방지매트
위로 올라가지 못하는 경우가 있음, 소음이 조금 큰 편이며, 물걸레는 필요 없는 경우가 있음, 가격 변동이 심함

 

 

각주


  1. API를 통해 송신되는 정보는 OpenAI DB에 저장되거나 인공지능 학습을 위해 활용되지 않습니다. [본문으로]