본문 바로가기

IT/개발

(8) Langchain에서 사용자 데이터를 이용해보자 (user data, summarize)

반응형

chatGPT 3.5는 2021년까지의 정보만을 사용하여 학습되었기 때문에 최신 정보를 알지 못합니다.

 

대부분의 개발자들은 chatGPT의 막강한 자연어 처리 기능에 자신만의 데이터를 추가하여 새로운 서비스를 만들고 싶을 것이라고 생각합니다.  

예전에는 이러한 접근을 할때 OpenAI의 fine tunning을 통해서 비용을 지불하고 재학습을 수행하고 사용하는 방식만을 생각할 수 있었는데요.

 

현재는 prompt에 사용자 데이터를 함께 보내주는 방식을 통해 이를 해결하고자 하는 다양한 시도들이 진행 되고 있습니다.

 

LangChain도 이 방법을 제공합니다. 

 

다양한 종류의 사용자 데이터를 읽어 들여서 정보화 하는 방법을 제공하고 있는데요. 엄청나게 유용합니다. 

 

다음은 지원 가능한 문서 종류 입니다. 

https://python.langchain.com/docs/modules/chains/document/

 

Documents | 🦜️🔗 Langchain

These are the core chains for working with Documents. They are useful for summarizing documents, answering questions over documents, extracting information from documents, and more.

python.langchain.com

 

 

여기서는 web 페이지를 이용해서 새로운 데이터를 가져오고 이 데이터를 chatGPT가 참고 할 수 있도록 해주는 방법을 예로 구현해보겠습니다. 

 

새로운 데이터를 던저주고 내용을 요약하도록 시켜보겠습니다. 

 

1. chat 모델 정의 

 

import os
import apikeys #user defind, apikeys 숨기기

from langchain.chat_models import ChatOpenAI

#https://platform.openai.com/account/api-keys 에서 발급받는다. 유료
OPENAI_API_KEY = apikeys.OPENAI_API_KEY

#환경 변수에 넣어준다
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

#LLM 모델 지정
chatAI = ChatOpenAI(model_name='gpt-3.5-turbo', temperature=0.1)

 

2. 데이터 소스 지정 

 

여기서는 우쿠라이나-러시아 전쟁을 설명한 wikipedia 문서의 web url을 입력 소스로 사용합니다. 

 

2022년 발생한 우크라이나-러시아 전쟁은 chatGPT를 학습시킬때 없었던 내용이니 새로운 데이터 테스트 하기에 좋은 예가 될 것 같아서 정했습니다.  

 

 


#사용자의 데이터 소스 지정 (지원타입확인)

#웹페이지에서 가져오는 loader 지정
from langchain.document_loaders import WebBaseLoader

#위키피디아 러시아-우크라이나 전쟁에대해 설명한 페이지.
#2022년 발생했기 때문에 gpt-3.5는 이 내용을 알지 못한다.

documents = loader.load()

 

 

3. user  data를 적당한 크기로 자르기 

 

chatGPT는  한번에 처리할 수 있는 토큰의 수가 정해져 있어서 왕창 집어 넣으면 안됩니다.  

각 모델에서 처리 가능한 데이터의 크기로 잘라서 보내주어야 응답을 할 수 있습니다. 

 

'''
word
GPT-3.5는 한 번에 영어 기준 3,000개 정도 단어를 처리
GPT-4는 영어 기준 25,000개 단어를 처리

GPT-3.5에서 약 8,000개 단어를 기억 (책 4~5페이지, 토큰 4,096개)
GPT-4는 64,000개 단어를 기억 (책 50페이지, 토큰 32,768개)
'''


#위와 같은 이유로 입력되는 데이터 소스는 분할 되어야 함
#splitter 종류 참고

#text splitter 중 CharacterTextSplitter를 사용
from langchain.text_splitter import CharacterTextSplitter

splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) #chunk가 너무크면 잘 안된다?
splite_docs = splitter.split_documents(documents)

print(len(splite_docs))
#print(splite_docs[0])

 

다음은 분할된 사용자 데이터가 어떻게 생겼는지 하나만 출력해 본것입니다.

 

'''
page_content='러시아-우크라이나 전쟁 - 위키백과, 우리 모두의 백과사전\n\n\n본문으로 이동\n\n주 메뉴\n\n주 메뉴\n사이드바로 이동\n숨기기\n\n\t\t둘러보기\n\t\n\n대문최근 바뀜요즘 화제 임의의 문서로기부\n\n\n\t\t사용자 모임\n\t\n\n사랑방사용자 모임관리 요청\n\n\n\t\t편집 안내\n\t\n\n도움말정책과 지침질문방\n\n\n언어\n\n이 위키백과에서 언어 링크는 문서 제목 건너편의 문서 최상단에 있습니다. 최상단으로 이동합니다.\n\n검색\n\n검색\n\n계정 만들기로그인\n\n개인 도구\n\n\n 계정 만들기 로그인\n\n\n\t\t로그아웃한 편집자를 위한 문서 더 알아보기\n\n\n기 여토론\n\n\n목차\n사이드바로 이동\n숨기기\n\n\n처음 위치\n\n1배경\n\n배경 하위섹션 토글하기\n\n1.1탈소련 시대와 오렌지 혁명\n\n1.2유로마이단, 혁명과 친러 소요사태\n\n1.3크림반도 내  러시아군 기지\n\n1.4군사 작전 선언\n\n2역사\n\n역사 하위섹션 토글하기\n\n2.12014년 러시아의 크림반도 합병\n\n2.22014-2015년 돈바스 전쟁\n\n2.2.1친러시아 분쟁\n\n2.2.2무장 분쟁\n\n2.2.32014년 8월 러시아의 침공\n\n2.2.4마리우폴 공세와 1차 민스크 휴전\n\n2.2.5민스크 II 협정과 2014년 말까지\n\n2.32015-2022년 동결분쟁화\n\n2.3.12016년 8월 분쟁 확대\n\n2.3.22018년 케 르치 해협 사건\n\n2.3.32019-2020년의 상황\n\n2.42021-2022년 러시아군의 증강과 위기\n\n2.4.1러시아의 비난과 요구\n\n2.4.2전면 침공의 전조\n\n2.52022년 러시아의 전면 침공\n\n3인권 침해 문제\n\n4관련 문제\n\n관련 문제 하위섹션 토글하기\n\n4.1가스 분쟁\n\n4.2하이브리드 전쟁\n\n4.3러시아의 프로파간다와 허위사실 유포\n\n4.4러시아-나토 관계\n\n5국제적인 반응\n\n국제적 인 반응 하위섹션 토글하기\n\n5.1러시아의 크림반도 합병에 대한 반응\n\n5.1.1우크라이나의 반응\n\n5.1.2미국과 나토군의 반응\n\n5.1.3금융 시장의 반응\n\n5.2러시아의 돈바스 개입에 대한  반응\n\n5.2.1우크라이나의 여론\n\n5.2.2러시아의 여론\n\n5.3러시아의 우크라이나 침공에 대한 반응\n\n5.3.1우크라이나의 여론\n\n5.3.2러시아의 여론\n\n5.3.3미국의 반응\n\n6같이 보기\n\n7각주\n\n8참고 문헌\n\n9외부 링크\n\n목차 토글\n\n목차 토글\n\n러시아-우크라이나 전쟁\n\n89개 언어\n\nAfrikaansአማርኛAragonésالعربيةঅসমীয়াAsturianuAzərbaycancaتۆرکجهБеларускаяБеларускаая (тарашкевіца)БългарскиभोजपुरीবাংলাBrezhonegBosanskiکوردیČeštinaCymraegDanskDeutschΕλληνικάEnglishEsperantoEspañolEestiEuskaraفارسیSuomiVõroFøroysktFrançaisFryskעבריתहिन्दीHrvatskiM MagyarՀայերենBahasa IndonesiaIgboÍslenskaItaliano日本語ქართულიភាសាខ្មែរKurdîLimburgsLietuviųLatviešuМакедонскиമലയാളംМонголमराठीBahasa MelayuمازِرونیनेपालीNederlandsNorsk nynorskNorsk    bokmålChi-ChewaਪੰਜਾਬੀPolskiپښتوPortuguêsRomânăРусскийРусиньскыйSarduScotsSrpskohrvatski / српскохрватскиසිංහලSimple EnglishSlovenčinaSlovenščinaSoomaaligaShqipСрпски / srpskiSvenskaŚ ŚlůnskiไทยTagalogTürkçeChiTumbukaУкраїнськаاردوTiếng Việtმარგალური中文文言粵語\n링크 편집\n\n문서\n\n토론\n\n\n한국어\n\n\n읽기\n\n편집\n\n역사 보기\n\n\n도구\n\n도구\n사이드바로 이동\n숨기기\n\n\t\t동작\n\t\n\n읽기편집역사 보기\n\n\n\t\t일반\n\t\n\n여기를 가리키는 문서가리키는 글의 최근 바뀜파일 올리기특수 문서 목록고유 링크문서 정보이 문서 인용하기위키데이터 항목\n\n\n\t\t인쇄/내보내기'
metadata={'source': 'https://ko.wikipedia.org/wiki/%EB%9F%AC%EC%8B%9C%EC%95%84-%EC%9A%B0%ED%81%AC%EB%9D%BC%EC%9D%B4%EB%82%98_%EC%A0%84%EC%9F%81', 'title': '러시아-우크라이나 전쟁 - 위키백과, 우리 모두의 백과사전', 'language': 'ko'}
'''

 

데이터 스플리터의 종류는 다음을 참고 

 

https://python.langchain.com/docs/modules/data_connection/document_transformers/

 

Document transformers | 🦜️🔗 Langchain

Head to Integrations for documentation on built-in document transformer integrations with 3rd-party tools.

python.langchain.com

 

4. 사용자 데이터 요약 해보기 

 

여기서는 summarize_chain을 이용하여 문서를 요약해보겠습니다.

요약하는 방식도 여러가지 지금은 문서를 나누어서 요약하는 방식인 map_reduce를 이용하겠습니다. 

 

#읽어들인 문서를 사용하기 위해 내용을 요약 한다.
#문서를 처리할 수 있는 chain의 종류 참고
#Chat 모델에 데이터를 올려서 처리하기 때문에 OpenAI 사용시 비용 발생함
#pip install tiktoken 설치 필요 Summarization 할때 필요

from langchain.chains.summarize import load_summarize_chain
summarize_chain = load_summarize_chain(chatAI, chain_type="map_reduce", verbose=True)  #문서를 나눠서 요약하는 방식

#AI_response = summarize_chain.run(splite_docs[:1]) #한개만 해본다
AI_response = summarize_chain.run(splite_docs) #오래 걸림

print(AI_response)

 

한글 web 문서를 요약했는데 결과가 영어로 나오네요. 

 

'''
The article provides a comprehensive overview of the Russia-Ukraine war, including background information, key events, human rights violations, gas disputes, and international reactions. It discusses the ongoing nature of the conflict, key leaders and military forces involved, casualties and destruction, and the aftermath of the war. The article also touches on related conflicts and events in Central Asia and the historical relationship between Russia and Ukraine. It highlights the Euromaidan protests, the 2014 Ukrainian revolution, the political status of Crimea, and the Mariupol offensive. The passage also covers the Minsk ceasefire agreements, the presence of Russian troops in Ukraine, and the "frozen conflict" in the Donbass region. It mentions recruitment and funding of pro-Russian forces, intercepted phone conversations revealing Russian involvement, and increased military presence along the border. The summary also mentions the start date of the invasion and various sources that provide information on different aspects of the conflict. The sources discuss various aspects of the conflict in Ukraine, including Russia's military involvement, the annexation of Crimea, the impact on the Ukrainian people, and international responses to the crisis. The sources also cover topics such as the role of propaganda and disinformation, the humanitarian situation, and the potential for further escalation of the conflict. The given text is a collection of various sources discussing different aspects of the conflict between Russia and Ukraine, including the impact of sanctions on the Russian economy, aid for Ukraine, human rights violations, gas disputes, propaganda, military involvement, and international reactions. The text also includes polls and surveys on public opinion in Crimea and Ukraine.  
'''

 

간단하게 번역을 위한 PromptTemplete를 하나 더 만들어서 한글로 변환해 보겠습니다. 

 

#한글 문서인데 최종 요약은 영어로 한다?
#한글로 번역하는 프롬프트를 하나 만들어서 사용하자

#프롬프트템플릿
from langchain.prompts import PromptTemplate

myPrompt = PromptTemplate(
    input_variables = ["INPUT"],
    template="{INPUT}을 Korean으로 번역해줘"    
)

#사용할 체인들 중 LLMChain을 지정
from langchain.chains import LLMChain

#LLM모델과 정의한 프롬프트를 체인으로 연결한다
myChain = LLMChain(llm=chatAI, prompt=myPrompt)

#사용자의 입력을 받아 프롬프트에 정의한 변수로 입력한다
AI_response= myChain.run(INPUT=AI_response)

print(AI_response)
'''
이 기사는 러시아-우크라이나 전쟁에 대한 포괄적인 개요를 제공합니다. 배경 정보, 주요 사건, 인권 침해, 가스 분쟁 및 국제 반응을 포함하여 전쟁의 지속적인 성격, 주요 지도자 및 군사력, 피해자 및 파괴, 전쟁의 여파에 대해 논의합니다. 이 기사는 또한 중앙 아시아의 관련 분쟁 및 사건과 러시아와 우크라이나 사이의 역사적인 관계에 대해 언급합니다. 이 기사는 유로마이단 시위, 2014년 우크라이나 혁명, 크림 반도의 정치적 지위, 마리우폴 공세에 대해서도 다룹니다. 이 글은 민스크 휴전 협정, 우크라이나에 대한 러시아군의 존재, 돈바스 지역의 "얼어붙은 갈등"에 대해서도 언급합니다. 이는 프로러시아 세력의 모집과 자금 조달, 러시아의 개입을 드러내는 가로챈 전화 통화, 국경 일대의 군사적 증강 등을 언급합니다. 이 요약은 침략의 시작일과 다양한 측면에 대한 정보를 제공하는 다양한 출처를 언급합니다. 이 출처들은 러시아의 군사적 개입, 크림 반도의 합병, 우크라이나인들에게 미치는 영향, 위기에 대한 국제적 대응 등 우크라이나의 분쟁에 대한  다양한 측면을 다룹니다. 이 출처들은 또한 선전 및 허위 정보의 역할, 인도적 상황, 분쟁의 더 큰 에스컬레이션 가능성과 같은 주제를 다룹니다. 이 텍스트는 러시아와 우크라이나 사이의 분쟁에 대한 다양한 측면, 러시아 경제에 대한 제재의 영향, 우크라이나에 대한 지원, 인권 침해, 가스 분쟁, 선전, 군사 개입 및 국제적 반응을 다루는 다양한 출처의 모음입니다. 이 텍스트에는 크림 과 우크라이나의 대중 의견에 관한 여론 조사도 포함되어 있습니다.
'''

 

입력한 web 페이지의 내용을 잘 요약했네요. 

 

반응형