밤빵's 개발일지
단체개발일지: streamlit & 챗봇 본문
해커톤을 통해 Streamlit을 처음 접하고, 팀원들과 함께 이를 이용하여 챗봇을 만들었다. 나는 파이썬과 관련된 지식이 거의 없었기 때문에, 이 프로젝트는 나에게 생소한? 도전이었다. 하지만 팀원들과 함께 작업하면서 Streamlit이 얼마나 똑똑한 도구인지 깨닫게 되었고, 이를 통해 실시간 데이터 처리 및 애플리케이션 개발을 손쉽게 할 수 있음을 배웠다. 이번 개발일지를 통해 Streamlit의 기본 개념, 그리고 해커톤에서 만들었던 챗봇 개발 경험을 기록하려고 한다!
▶Streamlit이란?
Streamlit은 파이썬으로 웹 애플리케이션을 쉽게 만들 수 있는 오픈 소스 프레임워크이다. 웹 개발 경험이 없는 파이썬 개발자도 간단한 코드를 통해 대화형 대시보드나 애플리케이션을 개발할 수 있다. Streamlit은 파이썬 스크립트를 기반으로 작동하며, 별도의 HTML, CSS, JavaScript 없이도 데이터 시각화 및 사용자 인터페이스를 빠르게 구현할 수 있다.
▷Streamlit의 주요 특징
→ 빠른 개발:
최소한의 코드로 데이터 시각화, 모델 배포, 웹 애플리케이션 개발이 가능하다.
→ 실시간 인터랙션:
데이터 업데이트나 사용자의 입력에 실시간으로 반응하는 애플리케이션을 쉽게 구축할 수 있다.
→ 쉽고 직관적인 코드 작성:
st.button, st.write, st.input 등 간단한 함수로 인터페이스를 만들 수 있다.
→ 파이썬만 사용:
웹 개발 언어를 따로 배우지 않고도 파이썬 코드만으로 애플리케이션을 완성할 수 있다.
▶챗봇 개발 과정
이번 해커톤에서 우리는 OpenAI API와 카카오맵 API를 사용해 음식점 검색 챗봇을 개발했다. 사용자가 특정 지역과 음식점 종류를 입력하면, 챗봇은 해당 지역 5km내에 음식점 정보를 제공하고, 영업 상태에 대한 안내도 함께 제공하는 기능을 구현했다. 이를 통해 음식점의 위치 정보와 영업 상태를 기반으로 사용자에게 유용한 정보를 제공할 수 있다.
▶기본 구조 설계
먼저, 챗봇의 주요 기능은 사용자로부터 주소와 검색할 음식점 종류를 입력받아 해당 조건에 맞는 음식점을 검색하고, 그 결과를 반환하는 것! 이를 위해 Streamlit의 st.chat_input을 사용하여 사용자의 입력을 처리하고, st.markdown을 사용해 결과를 출력하는 방식을 선택했다.
# 사용자 입력을 받는 부분
prompt = st.chat_input("주소와 검색할 키워드를 입력해주세요 (예: '서울특별시 종로구, 치킨')")
→ 위와 같은 코드로 사용자의 입력을 받아 prompt 변수에 저장하고, 그 데이터를 기반으로 API 요청을 보낼 수 있다.
▶ OpenAI와 카카오맵 API 연동
이 챗봇에서 중요한 두 가지 API는 OpenAI와 카카오맵 API이다. 사용자의 질문에 대해 OpenAI GPT를 이용해 자연스럽고 친절한 응답을 생성하고, 카카오맵 API를 통해 사용자가 입력한 주소와 검색 키워드에 맞는 음식점을 찾아주는 방식으로 동작한다.
→ 카카오맵 API: 카카오맵 API는 주소를 위도, 경도로 변환한 후 해당 위치 근처의 음식점을 검색할 수 있다.
def get_coordinates_kakao(address):
encoded_address = quote(address)
url = f"https://dapi.kakao.com/v2/local/search/address.json?query={encoded_address}"
headers = {"Authorization": f"KakaoAK {kakao_api_key}"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
result = response.json()
if result['documents']:
lat = float(result['documents'][0]['y'])
lng = float(result['documents'][0]['x'])
return lat, lng
return None, None
→ 사용자가 입력한 주소를 기반으로 위도와 경도를 가져오는 함수이다. 이를 바탕으로 사용자가 검색한 위치를 중심으로 음식점을 검색할 수 있다.
▶데이터 처리 및 응답 생성
카카오맵 API로 가져온 음식점 정보를 처리한 후, OpenAI를 사용하여 사용자에게 좀 더 친근한 방식으로 정보를 제공했다.
def get_bot_response(address=None, query=None):
info_str = ""
# 위도, 경도를 통해 음식점 검색 및 정보 정렬
lat, lng = get_coordinates_kakao(address)
if lat and lng:
nearby_restaurants = search_nearby_restaurants_kakao(lat, lng, query=query)
sorted_restaurants = sorted(nearby_restaurants, key=lambda x: float(x['distance']))
if sorted_restaurants:
info_str += f"### '{query}' 관련 음식점 목록 (반경 5km)\n\n"
for idx, restaurant in enumerate(sorted_restaurants, 1):
place_name = restaurant['place_name']
distance = float(restaurant['distance']) / 1000 # 거리 정보 km로 변환
info_str += f"**{idx}. {place_name}** - {distance:.2f} km\n"
→ 챗봇은 사용자의 질문에 대한 응답을 처리하여, 음식점 목록을 제공하며, OpenAI API를 통해 자연스러운 텍스트 응답을 생성한다.
▶ Streamlit의 장점
→ 빠른 개발 사이클:
Streamlit의 가장 큰 장점은 웹 개발 경험이 없어도 간단한 웹 애플리케이션을 만들 수 있다는 것이다. 팀 프로젝트나 해커톤에서 제한된 시간 내에 빠르게 애플리케이션을 개발해야 할 때 매우 유용했다.
→ 실시간 피드백:
코드를 수정할 때마다 즉시 반영되어 결과를 확인할 수 있었다. Streamlit의 라이브 리로딩 기능 덕분에 실시간으로 UI와 기능을 점검할 수 있었다.
→ 데이터 시각화:
Streamlit은 데이터 시각화에 매우 유용하며, 특히 프로젝트에서 음식점 목록을 표 형태로 출력하거나 지도를 표시할 때 많은 도움이 되었다.
▶ 추가하면 좋을 것 같은 기능
→ 사용자 위치 기반 기능
사용자가 입력한 주소가 아닌, 사용자의 현재 위치 기반으로 음식점을 추천하는 기능을 추가하면 편리할 것 같다.
Streamlit의 Geolocation API 등을 활용하여 사용자 위치를 얻고, 이를 기본값으로 사용해서 음식점을 검색하도록 구현할 수 있지않을까.....?
→사용자 피드백 기능
챗봇 응답에 대해 사용자가 만족하는지 여부를 피드백할 수 있는 버튼(st.button)을 추가하면, 사용자 경험 개선에 대한 인사이트를 얻을 수 있다. 이를 통해 사용자가 원치 않는 결과를 받았을 때 이를 학습에 반영할 수 있도록 한다.
feedback = st.radio("응답에 만족하셨나요?", ("네", "아니요"))
if feedback == "아니요":
st.text_input("더 나은 결과를 위해 개선 의견을 작성해주세요:")
→ 지도 시각화 추가
음식점 검색 결과를 시각적으로 확인할 수 있도록, Streamlit의 지도 플러그인이나 folium 라이브러리를 활용해 음식점 위치를 지도에 표시할 수 있다. 지도 시각화를 통해 사용자들이 검색 결과를 쉽게 확인할 수 있도록 도와준다.
import folium
from streamlit_folium import st_folium
def display_map(lat, lng, restaurants):
map_ = folium.Map(location=[lat, lng], zoom_start=14)
for restaurant in restaurants:
folium.Marker(
[float(restaurant['y']), float(restaurant['x'])],
popup=restaurant['place_name']
).add_to(map_)
st_folium(map_, width=700)
▶결론
기능과 편리함 덕분에 짧은 시간 내에 프로젝트를 마칠 수 있었지만... 나는 특별히 한게 없다. 사실 아이디어도 따로 떠오르지 않고, 흥미를 많이 잃어서 산만하게 팀원들 따라갔던 것 같다..! 물론 파이썬과 웹 개발에 대한 새로운 시각을 얻게 되었고, 데이터 시각화와 API 통합 작업에서 많은 것을 배울 수 있었다. 다 끝나고 다시 코드를 보면서 지도 시각화로 검색결과를 직관적으로 확인할 수 있게하거나, 사용자 피드백을 받을 수 있는 기능 추가로 만족도? 같은 걸 개선하면 어떨까 란 생각이 나중에 들어서 해커톤을 진행하던 시간에 이런 생각을 할 수 있었으면 더 좋지않았을까?란 생각이 들었던 내 태도가 아쉽지만 재밌는 경험이였다👍
'단체개발일지' 카테고리의 다른 글
단체개발일지: 서버 보안?! (2) | 2024.09.22 |
---|---|
단체개발일지: 결제기능구현 흐름 (0) | 2024.09.15 |
HikariPool...!! (0) | 2024.09.08 |
결제시스템구현: 멱등성 문제 (PUT & PATCH) (0) | 2024.09.01 |
결제시스템구현: 동시성 문제&LOCK 개념 (1) | 2024.08.25 |