ch0nny_log

[빅데이터분석] 딥러닝_20. 홈페이지에 있는 일반 상담 챗봇 만들기(+streamlit 업로드) 본문

빅데이터 분석(with 아이티윌)/deep learning

[빅데이터분석] 딥러닝_20. 홈페이지에 있는 일반 상담 챗봇 만들기(+streamlit 업로드)

chonny 2024. 10. 30. 11:50

데이터관련 교육 카페 | [딥러닝 포트폴리오를 화려하게7] 홈페이지에 있는 일반 상담 쳇봇 만들기 - Daum 카페

 

Daum 카페

 

cafe.daum.net

일반적인 회사 홈페이지에 들어가는 상담 쳇봇 기본 코드


모델은 한국어를 인식하기 위한 모델이고 거기에 특정 회사에서 필요한 데이터를 기계적으로 대답하게한 코드입니다.
코사인 유사도로 비슷한 질문을 찾아내어 대답합니다. 


홈페이지가 식당, 병원, 기타 등이면 거기에 맞게 아래의 질문과 답변을 변경하면 됩니다.

!pip install -q gradio

!pip install sentence_transformers

 

1. 데이터 준비

 

우선 챗봇에 필요한 기본 데이터를 DataFrame으로 준비하겠습니다. questions 리스트와 answers 리스트를 임베딩한 후, 각각의 질문과 답변에 맞는 임베딩을 저장합니다.

 

import pandas as pd
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import gradio as gr

# 임베딩 모델 로드
encoder = SentenceTransformer('jhgan/ko-sroberta-multitask')

# 식당 관련 질문과 답변 데이터
questions = [
    "영업시간이 어떻게 되나요?",
    "가격이 어떻게 되나요?",
    "주차가 가능한가요?",
    "사람들이 좋아하는 메뉴는 무엇인가요?",
    "목요일 12시에 예약 가능한가요?",
    "메뉴가 무엇이 있나요?",
    "위치가 어디인가요?"
]

answers = [
    "평일 영업시간은 10:00 - 21:00, 주말은 10:00 - 22:00입니다.",
    "메뉴 가격은 비빔밥 9000원, 김치찌개 8000원, 된장찌개 8000원, 갈비탕 12000원입니다.",
    "네, 주차 가능합니다.",
    "사람들이 가장 좋아하는 메뉴는 비빔밥과 갈비탕입니다.",
    "목요일 12시에 예약 가능합니다.",
    "메뉴에는 비빔밥, 김치찌개, 된장찌개, 갈비탕 등이 있습니다.",
    "맛있는 한식당은 강남 국기원 사거리 삼원빌딩 1층에 있습니다."
]

# 질문 임베딩과 답변 데이터프레임 생성
question_embeddings = encoder.encode(questions)
df = pd.DataFrame({'question': questions, '챗봇': answers, 'embedding': list(question_embeddings)})
df

2. 챗봇 함수 정의

 

유저의 질문을 입력받아 가장 유사한 질문의 답변을 반환하는 함수를 작성합니다.

def greet(user, history=[]):
    # 사용자 입력 임베딩
    embedding = encoder.encode(user)

    # 유사도 계산하여 가장 유사한 응답 찾기
    df['distance'] = df['embedding'].map(lambda x: cosine_similarity([embedding], [x]).squeeze())
    answer = df.loc[df['distance'].idxmax()]

    # 히스토리에 추가하여 대화 유지
    history.append([user, answer['챗봇']])
    return history, history

 

3. Gradio 인터페이스 설정

 

Gradio의 인터페이스를 통해 greet 함수를 대화형으로 사용할 수 있도록 설정합니다.

demo = gr.Interface(
    fn=greet,
    inputs=["text", "state"],
    outputs=["chatbot", "state"],
    title="식당 챗봇",
    description="한식당에 관한 질문을 입력해보세요. 예: 영업시간이 어떻게 되나요?"
)

# 챗봇 실행
demo.launch(debug=True, share=True)

 

 

 

 

 

 


※ 최종 포트폴리오를 홈페이지로 만들기.

 

!pip install -q gradio

!pip install sentence_transformers

 

import pandas as pd
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import gradio as gr

# 임베딩 모델 로드
encoder = SentenceTransformer('jhgan/ko-sroberta-multitask')

# 포트폴리오 관련 질문과 답변 데이터
questions = [
    "프로젝트 주제가 뭔가요?",
    "모델은 어떤걸 썼나요?",
    "그 모델을 선택한 이유가 뭔가요?",
    "프로젝트 인원은 어떻게 되나요?",
    "프로젝트의 목표는 무엇인가요?",
    "프로젝트 기간은 어떻게 되나요?",
    "데이터는 뭘 이용하였나요?"
]

answers = [
    "내시경(대/위장) 실시간 진단입니다.",
    "YOLO8 seg 버전을 썼습니다.",
    "의료 이미지에서 병변 영역을 정확히 감지하고 분할(Segmentation)하기 위해서 해당 모델을 선택했습니다.",
    "3명입니다.",
    "내시경 시 놓칠 수 있는 병변을 실시간으로 발견하는 것이 목표입니다.",
    "3주입니다.",
    "ai-hub 데이터와 실시간 내시경 유튜브 영상을 활용하였습니다."
]

# 질문 임베딩과 답변 데이터프레임 생성
question_embeddings = encoder.encode(questions)
df = pd.DataFrame({'question': questions, '챗봇': answers, 'embedding': list(question_embeddings)})
df
def greet(user, history=[]):
    # 사용자 입력 임베딩
    embedding = encoder.encode(user)

    # 유사도 계산하여 가장 유사한 응답 찾기
    df['distance'] = df['embedding'].map(lambda x: cosine_similarity([embedding], [x]).squeeze())
    answer = df.loc[df['distance'].idxmax()]

    # 히스토리에 추가하여 대화 유지
    history.append([user, answer['챗봇']])
    return history, history

7b8e45a91705111c5b.gradio.live

 

Gradio

Build & Share Delightful Machine Learning Apps

www.gradio.app

 

 

 


※ streamlit 을  사용 해서 홈페이지 만들기

데이터관련 교육 카페 | [딥러닝 포트폴리오를 화려하게8] 최종 포트폴리오를 홈페이지로 만들기 - Daum 카페

 

Daum 카페

 

cafe.daum.net

홈페이지로 배포 할 수 있는 딥러닝 주제들 3가지?


1. 영상
2. 쳇봇
3. 영상 + 쳇봇 


우리팀이 만든 포트폴리오를 홈페이지로 만드는데 포트폴리오에 대한 질문을 쳇봇에게 물어볼 수 있도록 구현 합니다. 


 


Gradio 인터페이스 대신 Streamlit을 사용하여 이 식당 챗봇을 구현할 수 있습니다. Streamlit에서는 st.text_input()과 st.button() 등을 사용하여 사용자의 입력을 받고, Gradio의 history처럼 대화 이력을 보여주기 위해 st.session_state를 활용할 수 있습니다.
아래는 Streamlit으로 챗봇을 구현하는 예제 코드입니다.


아래의 예제를 사용하기전에 먼저 파이썬 수업때 만들었던 스트림잇을 구현해봅니다.


아래의 코드를 수업시간에 말씀드릴 위치에 저장합니다. 


윈도우 탐색기를 열고 아래의 디렉토리로 이동합니다. 


C:\Users\ITWILL\AppData\Local\Programs\Python\Python310


그리고 다음 스크립트를 app9.py 라는 이름으로 저장합니다. 
import streamlit as st
import pandas as pd
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity

# 임베딩 모델 로드
encoder = SentenceTransformer('jhgan/ko-sroberta-multitask')

# 식당 관련 질문과 답변 데이터
questions = [
    "영업시간이 어떻게 되나요?",
    "가격이 어떻게 되나요?",
    "주차가 가능한가요?",
    "사람들이 좋아하는 메뉴는 무엇인가요?",
    "목요일 12시에 예약 가능한가요?",
    "메뉴가 무엇이 있나요?",
    "위치가 어디인가요?"
]

answers = [
    "평일 영업시간은 10:00 - 21:00, 주말은 10:00 - 22:00입니다.",
    "메뉴 가격은 비빔밥 9000원, 김치찌개 8000원, 된장찌개 8000원, 갈비탕 12000원입니다.",
    "네, 주차 가능합니다.",
    "사람들이 가장 좋아하는 메뉴는 비빔밥과 갈비탕입니다.",
    "목요일 12시에 예약 가능합니다.",
    "메뉴에는 비빔밥, 김치찌개, 된장찌개, 갈비탕 등이 있습니다.",
    "맛있는 한식당은 강남 국기원 사거리 삼원빌딩 1층에 있습니다."
]

# 질문 임베딩과 답변 데이터프레임 생성
question_embeddings = encoder.encode(questions)
df = pd.DataFrame({'question': questions, '챗봇': answers, 'embedding': list(question_embeddings)})

# 대화 이력을 저장하기 위한 Streamlit 상태 설정
if 'history' not in st.session_state:
    st.session_state.history = []

# 챗봇 함수 정의
def get_response(user_input):
    # 사용자 입력 임베딩
    embedding = encoder.encode(user_input)
    
    # 유사도 계산하여 가장 유사한 응답 찾기
    df['distance'] = df['embedding'].map(lambda x: cosine_similarity([embedding], [x]).squeeze())
    answer = df.loc[df['distance'].idxmax()]

    # 대화 이력에 추가
    st.session_state.history.append({"user": user_input, "bot": answer['챗봇']})

# Streamlit 인터페이스
st.title("식당 챗봇")
st.write("한식당에 관한 질문을 입력해보세요. 예: 영업시간이 어떻게 되나요?")

user_input = st.text_input("user", "")

if st.button("Submit"):
    if user_input:
        get_response(user_input)
        user_input = ""  # 입력 초기화

# 대화 이력 표시
for message in st.session_state.history:
    st.write(f"**사용자**: {message['user']}")
    st.write(f"**챗봇**: {message['bot']}")

 

설명

  1. Streamlit 상태 관리: st.session_state를 사용하여 대화 이력을 저장하고 유지합니다.
  2. 입력 및 버튼: st.text_input으로 사용자 입력을 받고, st.button으로 제출합니다.
  3. 응답 생성: get_response 함수가 사용자의 질문을 받아 임베딩을 계산하고, 유사도가 가장 높은 응답을 찾아 반환합니다.
  4. 대화 이력 출력: st.session_state.history를 반복하여 사용자와 챗봇 간의 대화 이력을 표시합니다.

실행 방법

 

이 코드를 app.py 파일에 저장한 후, 다음 명령어로 Streamlit 앱을 실행할 수 있습니다. (anaconda promt 창 열기_관리자 권한)

 

base) C:\Users\ITWILL> cd C:\Users\ITWILL\AppData\Local\Programs\Python\Python310\Scripts

 

base) C:\Users\ITWILL\AppData\Local\Programs\Python\Python310\Scripts> pip install sentence_transformers

 

base) C:\Users\ITWILL\AppData\Local\Programs\Python\Python310\Scripts> cd ..


base) C:\Users\ITWILL\AppData\Local\Programs\Python\Python310> python -m streamlit  run app9.py

 


※ streamlit 을  사용 해서 홈페이지 만들기(내 포폴)

project_hj.py
0.00MB