ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • chatGPT로 Text 요약하기
    코딩/파이썬 2023. 4. 16. 22:21
    반응형

     

    잠이 많아서 투자하고 있는 미국 회사의 컨퍼런스 콜을 직접 듣지 못한다. 물론 영어 듣기가 되어서, 설사 새벽 잠 안 자고 듣는다고 하여도 이해하지 못한다. 보통 회사 사이트에 올라오는 스크립트를 읽는데, 이게 정말 길어서 읽는데 한 참 걸린다. chatGPT로 요약하면서 번역하면 딱인 것 같아서, 앞서 정리한 chatGPT API를 이용해 보았다. 

     

    요약을 위한 프롬프트와 결과 

    아래는 이번에 GM의 1분기 컨콜의 일부 내용의 요약을 요청하는 프롬프트이다. 

    아래 요약 대상을 한글로 공백 포함해서 500자 내로 요약해줘. 
    요약 시, 주식 투자자 관점에서 판매량, 매출 같은 중요한 요소가 빠지지 않게 해줘. 


    # 요약 대상

    John Murphy

    For the next session, we're very happy to have General Motors. It's a company that we think arguably is leading the charge in the core to future transition that we mentioned earlier today really leveraging its core in a tremendous way to drive tremendous profit and cash flow here in the near-term and has been for actually the last few years to fund its investment in the mid and long-term strategies of EVs, AVs and connected vehicles and creating a huge opportunity that they've highlighted at their Investor Day recently for 2030 of almost doubling the revenue base. It's some pretty impressive targets and it's all being funded internally, that's really important, because you have such a strong core.

    .... (생략)

    아래는 실제로 요약한 결과이다. 매출/판매량 등의 숫자에 중심을 맞추라고 했더니, CFO가 언급하는 주요 숫자를 요약문에 잘 담고 있다. 프롬프트를 잘 쓴다면, 세 줄 요약도 가능해 보인다. 주요 사례들을 좀 더 찾아봐야 겠다.  

     

    chatGPT API를 이용한 요약 

    동일한 내용을 chatgpt api를 이용해 호출하였다. gpt-3.5의 최대 토큰 수는 4k 정도이다.  토큰은 의미단위로 영어에서는 단어수와 비슷하나 반드시 일치하지는 않는다. 위와 같이 영어와 한글이 섞여 있는 경우는 더 불명확하다. 프롬프트에 어느 정도 버퍼를 유지하는 것이 좋다. 

     

    내가 테스트 했을 때에는 1K가 넘을 경우, 한글 요약이 안되는 경향이 있어서 하나의 파일을 1K 단위로 잘리서 요청하였다.

     

    급하게 만드느라 좀 허잡한 코드가 되었지만...  대충 돌아가게 만들어 보았다. 

    # -------------------------------
    # 관련 설정
    MODEL = "gpt-3.5-turbo"
    SUMMARY_PROMPT = '''
    아래 요약 대상을 한글로 공백 포함해서 500자 내로 요약해줘. 
    요약 시, 주식 투자자 관점에서 판매량, 매출 같은 중요한 요소가 빠지지 않게 해줘. 
    #요약 대상 
    '''
    MAX_LEN = 1024 # 한 번 호출 당 최대 길이 설정
    
    # 요약할 텍스트 가져오기 - smry_texts에 리스트로 저장
    filename = 'sample.txt'
    f = open(filename, 'r', encoding='utf8')
    smry_texts = f.readlines()
    
    
    
    # 문장 당 토큰 길이 계산. 
    token_len = [ len( t.split(' ') ) for t in smry_texts ]
    print(token_len)
    
    # chatGPT 호출하는 함수
    def callGPT(prompt ) :
        print( 'call:', len(prompt) )
    
        response = openai.ChatCompletion.create(
            model=MODEL,
            messages=[
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": prompt},
            ],
            temperature=0,
        )
        
        # TODO : error 처리
        return response
        
        
    # 토큰 수가 MAX_LEN을 초과하면, chatGPT를 호출함. 
    
    call_text, tkl = "", 0
    result, prmpt = [], []
    for i, t in enumerate(smry_texts) :
        #print(i, len(t) , tkl, len(call_text) )
        call_text += t # 요약한 문장 추가
        tkl += token_len[i] # 현재 단계의 call_text 의 토큰 길이 계산
        
        if tkl > MAX_LEN : 
            prmpt.append( SUMMARY_PROMPT + call_text )
            result.append( callGPT(SUMMARY_PROMPT + call_text ) )
            call_text, tkl  = '', 0
        else :
            if i >= len( smry_texts )-1:
                prmpt.append( SUMMARY_PROMPT + call_text )
                result.append( callGPT(SUMMARY_PROMPT + call_text ) )
                break

     

    실제 첫 번째 호출한 프롬프트이다. 

     

    아래는 요약 결과이다. 원문과 비교했을 때, 다소 어색한 부분이 존재한다. 그래도 대략적인 맥락을 이해하는데 어려움은 없다. 

     

    토큰 단위 과금이라 원문이 꽤 길다고 생각했음에도 과금액은 크지 않다. 겨우 $0.1 라니.. 

     

    프롬프트 좀 튜닝하고, 원문을 적절히 잘라줄 수 있는 방법만 찾는다면 이거 꽤 쓸만하겠다.  

    반응형

    댓글

Designed by Tistory.