미식의 도시 홍콩 미식봇 만들기 (현지인 추천 데이터)

부제: 랭체인 대장님 곽은철님 헌법 검색기 무작정 따라하기 (곽은철님 포스트 참고)

개요

  • 저는 홍콩 거주중입니다. (그래서 오프모인 참가를 못해요 흑흑ㅠㅠ)

  • 홍콩, 미식의 도시. 홍콩에 거주하는 한인들이 주로 활동하는 미식 오픈채팅방이 존재합니다.

  • 해결하려는 문제: 오픈 채팅방 데이터는 휘발성이며, 새로운 멤버는 과거 데이터를 열람할 수 없습니다. 이로 인해 정보 공유에 제약이 있고, 같은 질문이 반복되는 일이 생깁니다.

  • 랭체인을 배우는 입장에서는 엄청난 기회! 이 기회를 빌려 정보 검색이 가능한 미식 챗봇을 만들어보려고 합니다.



진행 과정:

카카오톡 미식 오픈채팅방 데이터 내보내기

  1. 멤버 수: 1290명 (2024년 2월 19일 기준)

  2. 데이터 기간: 2020년 10월 9일 ~ 2024년 2월 19일

  3. 데이터 사이즈: 7.1mb, length: 4,136,766


데이터 전처리

  • 데이터 불러오기

  • “joined this chatroom” / “left this chatroom” 과 중간중간에 “Saturday, 10 October 2020” 등의 반복되고 불필요한 텍스트를 먼저 제거합니다. 여기서는 정규표현식(Regular Expression)을 이용했습니다.

  • 빠르게 대충대충 먼저 코드를 찌끄리고 지피티한테 깔끔하게 바꿔달라고 하니 이렇게 만들어 주네요. 음~ 좋아.

import re

def cleanse_chat_messages(file_path):
    # Compile the regex pattern outside the function for better performance
    date_pattern = re.compile(r'\w+day, \d{1,2} \w+ \d{4}')
    
    with open(file_path) as f:
        cleaned_messages = (message for line in f
                            for message in line.split('\n')
                            if 'joined this chatroom' not in message and
                               'left this chatroom.' not in message and
                               not date_pattern.search(message))
        return '\n'.join(cleaned_messages)

chat_cleaned = cleanse_chat_messages("Talk_2024.2.18.txt")


스크립트 짜기

  • 곽은철님 포스트에서 코드를 긁어모아 스크립트를 짜고 바로 시도를 해봤어요. 먼저 Text Split 부터 살펴봤습니다.

  • 실행하니.. 알수 없는 오류가.. 전 자바는 써본적이 없어서 전혀 모르겠더라구요. M1맥에서 Java JDK 실행하는 환경이 조금 안맞아서 그런것 같아 여러 버전의 JDK를 받아서 환경변수 설정 해가며 악을 썼지만.. 실패… 우리 모두의 친구 구글 코랩으로 가기로 합니다. (도움주신 곽은철님 김민규(댕댕이멍멍)님 감사합니다 🙂)

  • 코랩으로 돌리기 성공은 했으나 너무너무너무너무 x 1000 느립니다.

    • 2020년 말부터 모은 텍스트라 그런지 text_split 과정이 정말 오래 걸리더라구요. 30분째 기다리다 안되겠다 싶어 23년 2월부터 오늘까지 1년의 데이터로 줄여 진행 했다가, 이마저도 너무 오래 걸려 23년 11월부터 오늘까지 3개월의 데이터로 줄여 봤습니다. 그래도 느리긴 한데 조금 기다리니 완료가 되었어요.


결과

  • 처참한 결과. 홍콩 중심지중 하나인 “침사추이” 의 맛집을 프롬프트에 넣었는데 돌아온 답변은 “센트럴”이라는 (또 다른 지역이름) 전혀 말도 안되는 얘기를 하네요. 한국으로 따지면 “강남 맛집” 을 보내니 “강남 맛집은 이태원입니다” 와 같은 느낌이라고 할까요?


스크립트 수정

급한대로 추가로 인터넷을 뒤져보던 중 딱 맞는 사례 블로그를 찾았습니다. (RAG를 적용한 챗봇)

  • 요기에서 나온 코드를 이용해서 재시도. 돌려보니 3개월 데이터 처리가 꽤 빨라서, 정확도를 위해 1년치 데이터를 넣고 돌려봤습니다.


결과2

  • 오! 정확한 정보가 나오네요. 실제로 “부자 칼구수” 는 최근에 오픈한 칼국수 가게로, 성업중이고, 정말 이가치킨 옆에 있습니다.

  • 다음으로 센트럴 맛집을 찾아봤어요. 전포식육이라는 한국식 고깃집도 이번에 새로 오픈해 사람이 많고, 양궈푸도 센트럴에 있는 마라탕집이 맞아요. 어투가 조금 이상하긴 해도 나오긴 나와서 신기하고 재밌네요.


한국어 프롬프트

  • 그래도 한국어로 질문하고 답변받고 있으니 한국어 프롬프트는 어떨까 궁금해서 시도해봤습니다.

  • “모른다.” 라니!!! 계속 물어봐서 귀찮았던지.. 바로 퇴짜맞아버렸고.. (AGI의 출현?!)

  • 다시 블로그 글을 읽어 보니 한글보다는 아직 영어 프롬프트가 잘 되는것 같다고 하네요.


마무리

Streamlit으로 사이트 배포하는것까지가 목표였는데, 생각보다 문제가 많았고, 모델들 가지고 좀 더 실험해봐야 할것 같습니다. 생각보다 시간이 많이 걸려 이번주는 여기까지만 진행했습니다.



해결해야할 문제들:

  1. Text Splitter 선택하기: 모델마다 속도도 다르고 성능도 달라서 내 프로젝트를 위해 어떤걸 선택하느냐가 중요할것 같아요. KoNLPy와 TikToken을 비교했을 때는 TikToken이 속도도 훨씬 빠르고 성능도 좋았는데요, 이건 세팅문제일수도 있어서 좀 더 삽질해봐야 될 것 같습니다. 아직 제대로 써봤다고 할 수 있는 수준이 아니라서요. 😅

  2. 데이터 전처리: 데이터가 카카오톡 채팅데이터 날 것 그대로다 보니 정보를 불러오는데 제약이 많은것 같았습니다. 데이터를 CSV 또는 JSON으로 정리해서 이용하면 훨씬 결과가 잘 나올 것 같습니다. 추가적으로, 카톡내 답장들이 지금은 따로 표시가 안되어 있는데 이것도 추출할 수 있으면 정보의 연결성 면에서 훨씬 좋을듯 하네요. (예시: 채팅방에서 여러 질문이 한번에 올라오는 경우 답장하기를 통해 답변을 받기 때문에 좀 더 연관된 결과를 받을 수 있지 않을까 합니다.)

  3. Vector DB 불러오기: 맛집이나 식당을 검색하면 관련된 내용을 가져오긴 하지만, 그저 비슷한 내용을 단순히 가져오는 느낌이라 정보가 많이 누락된 느낌이 듭니다. 맛집 여러곳을 비교해서 최고의 맛집을 가져오는 건 아닌것 같아요. 이것도 여러가지 시도해봐야 할 것 같습니다.

  4. 추가 정보 제공: 맛집 정보와 더불어 어떤 날짜의 어떤 대화에서 나온건지 표시하고, 또 지도 정보를 연결해 좀 더 정확한 위치, 전화번호, 영업시간 등을 같이 표시하면 좋을 것 같아요.


#9기랭체인

3
1개의 답글

👉 이 게시글도 읽어보세요