[2탄]Langchain+GPT로 summary와 QA 해보기
보통 langchain으로 summarize하거나 q&a하는 예제들은 pdf나 문서 업로드를 통해 많이 작업하는데
내가 쓸 텍스트의 양은 길지 않은 편이며 데이터 크롤링 후 사용하기 때문에 바로 raw_text에 삽입하여 실행해보도록 하겠다.
사용할 text는 무신사 홈페이지의 '키치한 스트릿 웨어 찾는다면? 유쓰배쓰 주목!' 매거진 내용 중 본문을 추출한 가정하에 사용해보도록 하겠다.
https://www.musinsa.com/cms/news/view/6112
키치한 스트릿 웨어 찾는다면? 유쓰배쓰 주목! | 무신사
'Youth Be At The Head’ 슬로건을 줄여 이름 지은 유쓰배쓰는 세상의 모든 청춘을 응원한다는 의미를 담은 밝은 분위기의 캐주얼 브랜드. 23 S/S 컬렉션은 ‘영 스타 스트리트’ 테마 아래 유쓰배쓰만
www.musinsa.com
!pip install OpenAI langchain tiktoken faiss-cpu grobid-client
import os
os.environ["OPENAI_API_KEY"] = ""
raw_text="'Youth Be At The Head’ 슬로건을 줄여 이름 지은 유쓰배쓰는 세상의 모든 청춘을 응원한다는 의미를 담은 밝은 분위기의 캐주얼 브랜드. 23 S/S 컬렉션은 ‘영 스타 스트리트’ 테마 아래 유쓰배쓰만의 키치한 그래픽과 컬러가 어우러진 이지 웨어로 구성해 유니크한 감각을 뽐낸다. 편안한 착용감을 선사하는 동시에 트렌디한 와이드 실루엣, 시선을 사로잡는 톡톡 튀는 팝 컬러, 펑키&유니크 무드가 느껴지는 러프한 그래픽을 중점적으로 활용해 보는 재미까지 더한 23 S/S 컬렉션을 꾸몄다.유쓰배쓰가 추구하는 23 S/S 시즌의 무드를 가장 잘 나타내는 아이템은 스타 레슬링 그래픽 긴소매 티셔츠. 레슬링 경기를 하는 모습을 키치한 그래픽으로 표현해 소매와 전면에 포인트로 새겼으며 빈티지 웨어가 떠오르는 브랜드 이름과 슬로건, 장미 그래픽을 함께 배치했다. 밀리터리 무드를 담은 카무플라주 배색 티셔츠, 트레이닝 웨어에 기반한 메시 스웨트셔츠, 환절기 아우터로 적합한 브이넥 리버서블 윈드브레이커 등 다양한 스트릿 웨어를 최대 24% 할인 혜택과 함께 제안한다."
패키지 설정 및 api key 삽입 후 본문의 raw_text를 지정해주었다. 이제 요약을 해보자.
from langchain import OpenAI
from langchain.chains import AnalyzeDocumentChain
from langchain.chains.summarize import load_summarize_chain
llm = OpenAI(temperature=0)
summary_chain = load_summarize_chain(llm, chain_type="map_reduce")
summary_chain.llm_chain.prompt.template = summary_chain.llm_chain.prompt.template.replace("CONCISE SUMMARY:", "CONCISE SUMMARY IN KOREAN:")
summarize_document_chain = AnalyzeDocumentChain(combine_docs_chain=summary_chain)
summarize_document_chain.run(raw_text)

코드에 대해 간단히 설명해보면, 우선 temperature의 값을 0으로 설정하여 LLM이 동일한 응답을 제공하도록 강제한다.
다음으로 chain_type을 map_reduce하는 이유이다. 우선 Langchain에서 summary하는 옵션으로, 크게 3가지가 있다.
1. "stuff" : 문서 목록을 가져와서 프롬프트에 모두 삽입하고 LLM에 전달, 길면 오류
2. "map_reduce" : 나눠서 요약, 전체 요약본 다시 요약, 문서 매핑 경과를 가져와 단일 출력으로 줄
3. "refine" : 입력 문서를 반복하고 해당 답변을 반복적으로 업데이트하여 응답을 구성
stuff documents chain은 LLM을 한번 호출하므로 더 많은 토큰을 얻으려면 비용을 지불해야 한다. 따라서 대용량 문서에는 취약하므로, 토큰 한도에 맞는 작은 덩어리로 문서를 분할하는 Map Reduce Chain이 더 적합하다.
https://python.langchain.com/docs/use_cases/summarization#overview
Summarization | 🦜️🔗 Langchain
Open In Collab
python.langchain.com
다음으로, 한국어로 요약을 하도록 옵션을 추가해주었다. 이제 실행해보자. 요약을 성공적으로 한 것을 확인할 수 있다. (요약한 내용의 질을 높이기 위해 추후에 추가 작업들을 해볼 예정이다.)
from langchain.chains.question_answering import load_qa_chain
from langchain.chat_models import ChatOpenAI
model = ChatOpenAI(model="gpt-3.5-turbo") # gpt-3.5-turbo, gpt-4
qa_chain = load_qa_chain(model, chain_type="map_reduce")
qa_document_chain = AnalyzeDocumentChain(combine_docs_chain=qa_chain)
qa_document_chain.run(
input_document=raw_text,
question="스트릿웨어 살때 최대 몇 퍼센트 할인 혜택이 있어?")

이제 raw_text에 대한 질문을 해보자. load_qa_chain을 사용해볼 것이다. Langchain에서 QA하는 방법으로는 크게 4가지가 있다.
1. load_qa_chain : 문서 로딩>체인 유형(stuff)으로 처리된 문서>llm모델>응답
2. RetrievalQA
3. VectorstoreIndexCreator
4. ConversationalRetrievalChain
이제 질문해보자. 질문에 성공적으로 대답한 것을 확인할 수 있다. (더 효율적인 다른 방법으로 추후에 작업해 볼 예정이다.)