Langchain을 공부하면서 원래는 다른 앱을 제작할 계획이었으나 시간적 제약으로 인해 간단하지만 유용한 앱을 먼저 구현하는 방향으로 계획을 변경하였습니다. 이에 따라 카카오톡 오픈채팅방의 채팅을 요약 분석하는 앱과 YouTube 내용을 요약해주는 앱을 개발하게 되었습니다. 앱 개발 과정에서는 의도적으로 ChatGPT와 Copilot와 같은 도구를 최대한 활용하였고 이러한 도구를 사용하면서 기본적인 개발 지식만 있어도 원하는 기능을 쉽게 구현할 수 있음을 느끼게 되었습니다. 이는 엄청 감탄스러운 시간이었으며 이러한 경험은 개인적으로는 많은 생각을 하도록 해주었습니다. 이제 카카오톡과 유튜브 내용을 요약 / 분석하는 langchain 앱을 개발하는 과정을 소개하겠습니다.
카카오톡 오픈카톡 채팅 분석기
개인적으로 관심사가 다양해짐에 따라 참여하고 있는 카카오톡 오픈카톡방의 수가 증가하게 었고 참여 중인 오픈카톡방의 수가 증가하게 되므로써 매일 쌓이는 채팅 메세 지를 따라가기 힘들어지게 되었습니다. 그래서 저는 특정 기간 동안의 메세지를 요약하여 단순화 하고 필요에 따라 추가적인 질문을 할 수 있는 langchain 앱을 만들게 되었습니다.
실행 화면
1. 초기화면
카카오톡 메세지는 txt파일을 여는 것으로 얻어 옵니다.
2. 지난 2일 동안의 카톡 내용 요약 및 질문
3. 특정 닉네임을 가진 사용자의 성향 파악
카카오톡 메세지 추출
불행하게도 카카오톡 API에는 대화 내용을 추출하는 기능이 없습니다. 대신 사용자가 직접 카카오톡 채팅방 설정에서 메시지를 내보내는 것으로 이를 수행할 수 있습니다.
파이썬으로 카카오톡 메세지 처리
Advanced Data Analysis 기능을 사용하여 필요하지 않은 정보를 제거하고 원하는 방향으로 개발을 유도하여 파이썬 코드를 구현합니다.
불필요한 정보 제거
필요한 날짜의 메세지만 추출
특정 닉네임이 포함된 메세지만 추출
python 코드 구현
중간중간 ChatGPT가 잘 못된 방향으로 진행하거나 결과가 만족스럽지 않을 시에는 구체적으로 요청하면서 진행하였고 마지막에는 직접 코딩을 추가하였습니다.
VectorDB 사용
ChatGPT에 요청을 보낼 때 한번에 많은 텍스트를 전달하는 것은 불가능하지만 VectorDB를 사용하하면 전체 텍스트에서 관련된 것들만 추출하여 ChatCPT에 요청할 수 있습니다.
from langchain.embeddings import OpenAIEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.vectorstores import Chroma
def process_chat(chunks, question):
embedding = OpenAIEmbeddings()
vectordb = Chroma.from_documents(
documents = chunks,
embedding = embedding
)
retrieve = vectordb.as_retriever()
llm = ChatOpenAI(temperature=0.5, model_name='gpt-3.5-turbo')
retrieval_qa_chain = RetrievalQA.from_chain_type(
llm = llm,
chain_type="stuff",
retriever = retrieve,
return_source_documents = True
)
query = question
with get_openai_callback() as cb:
result = retrieval_qa_chain({"query": query})
print(cb)
return result['result']
utf-8 인코딩 된 데이터 사용 시 CharacterTextSplitter 문제
CharacterTextSplitter는 한국어 텍스트를 후처리하고 vectordb에 저장하려고 시도할 때 작동하지 않습니다.
transfomers 패키지 사용
1. transfomers 설치
pip install transformers
2. transfomers 사용
# pip install transformers
from transformers import GPT2TokenizerFast
from langchain.text_splitter import RecursiveCharacterTextSplitter
def get_tokenized_text(text: str) -> str:
tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")
def count_tokens(text: str) -> int:
return len(tokenizer.encode(text))
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 500,
chunk_overlap = 50,
length_function = count_tokens,
)
chunks = text_splitter.create_documents([text])
return chunks;
Streamlit에서 변경된 값을 유지하고 싶을 때
session_state를 사용하여 Streamlit에서 변경된 값을 유지할 수 있습니다.
if 'summarized_text' not in st.session_state:
st.session_state['summarized_text'] = '요약한 내용이 표시됩니다.'
if processed_text:
# 1. 요약하기
if st.button("요약하기"):
os.system("clear")
with st.spinner("요약하기를 처리하는 중입니다..."):
if processed_text:
...
result = gpt_custom_util.process_translate('google', 'ko', result)
st.session_state.summarized_text = result
else:
st.session_state.summarized_text = '요약할 텍스트가 없습니다.'
if st.session_state.summarized_text:
st.write("요약: \n" + st.session_state.summarized_text)
번역기
파이썬을 사용하여 메시지를 자동으로 번역하는 기능을 구현하였습니다. Deepl과 Google Translate를 모두 구현했지만 본 앱에서는 주로 무료인 Google Translate를 사용합니다.
1. Deepl과 Google 번역 패키지 설치
pip install googletrans==4.0.0rc1
pip install deepl
2. 번역 기능 구현
import deepl
deepl_translator = deepl.Translator(os.getenv("DEEPL_API_KEY"))
from googletrans import Translator
google_translator = Translator()
def process_translate(translator, target_lang, text):
language_info = google_translator.detect(text)
if language_info.lang == target_lang:
return text
if translator == 'deepl':
translated_result = deepl_translator.translate_text(text, target_lang="KO")
return translated_result.text
elif translator == 'google':
translated_result = google_translator.translate(text, src=language_info.lang, dest=target_lang)
return translated_result.text
else:
return "지원하지 않는 번역기입니다."
Youtube 내용 요약기
카카오톡 채팅 분석기와 기본 기능이 거의 동일하기 때문에 바로 YouTube 콘텐츠 요약기를 개발하였습니다. YouTube 스크립트를 가져오는 부분은 파이썬으로 너무나 쉽게 구현할 수 있었습니다.
실행화면
Youtube url을 기입하고 '정보 읽기'를 누르면 스크립트를 얻어오고 '요약' 버튼을 누르면 스크립트를 요약한 후에 번역까지 완료해서 보여줍니다.
파이썬으로 Yoube 동영상 스크립트 가져오기
YouTube에서 스크립트를 가져오는 것은 파이썬으로 쉽게 구현할 수 있었습니다. 비디오 자막을 검색하는 프로세스를 간소화하는 라이브러리와 API가 있으며 이러한 자막은 카카오톡 메시지에서와 동일한 요약 및 번역 기능을 적용하여 앱을 완성하였습니다.
1. youtube-transcript-api 패키지 설치
pip install youtube-transcript-api
2. Youtube 스크립트를 포함한 정보를 얻어오는 코드
# !pip install youtube-transcript-api
from langchain.document_loaders import YoutubeLoader
loader = YoutubeLoader.from_youtube_url(
youtube_url=youtube_url,
add_video_info=True,
language=["en"],
translation="en")
youtube_info = loader.load()
print(youtube_info[0].page_content)
연결된 멘션