들어가기 앞서
이 글을 읽으시는 사람이면 어느정도 IT에 관심이 있으실 분들이니 미리 말합니다.
Streamlit 은 프로토타이핑 용도이지, 진짜 배포용이면 Django, Flask 나 허깅페이스, 또는 OpenAI API(이거로 배포해볼 생각입니다) 를 사용하셔야 합니다.
기능 설명
1. 맞춤형 챗봇이기 때문에 사용자의 개인정보를 어느정도 받아서 작동합니다.
2. Whisper 를 활용해서 음성인식을 합니다.
3. OpenAI API를 활용해서 부적절한 내용들을 필터링합니다.
코드 설명
우선 개발 환경을 설정해줍니다. 필요한 패키지를 pip 로 다 import 해준뒤 파이썬에서는 openai api 키를 넣어줍시다.
pip install openai streamlit sounddevice numpy
import openai
openai.api_key = "YOUR_OPENAI_API_KEY"
그 후에는 Streamlit 으로 프로토타입용 UI 를 넣어줍시다.
import streamlit as st
st.title("🗣️ 맞춤형 한국어 대화 연습 챗봇")
if "conversation_history" not in st.session_state:
st.session_state.conversation_history = []
그 뒤에는 맞춤형 대화 주제를 생성하도록 합니다. user_info 딕셔너리를 받는 과정은 생략했습니다.
def generate_custom_prompts(user_info):
prompt_text = f"""
사용자의 정보를 기반으로 맞춤형 대화 주제를 생성하세요:
{user_info}
"""
response = openai.ChatCompletion.create(
model="gpt-4-turbo",
messages=[{"role": "system", "content": prompt_text}]
)
return response.choices[0].message.content.split("\n")
그 뒤에는 whisper 를 활용해서 음성인식을 하는 기능을 추가해줍니다.
import 중에 tempfile 이라는게 있는데 얘가 꽤 편리합니다. 임시파일을 만들어서 저장할 수 있게 해주니까요.
import sounddevice as sd
import queue
import wave
import tempfile
def record_audio(duration=15, samplerate=16000):
q = queue.Queue()
def callback(indata, frames, time, status):
q.put(indata.copy())
with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmpfile:
filename = tmpfile.name
with wave.open(filename, 'wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(samplerate)
with sd.InputStream(callback=callback, samplerate=samplerate, channels=1, dtype="int16"):
for _ in range(int(samplerate / 1024 * duration)):
wf.writeframes(q.get())
return filename
그리고는 Whisper API (이것도 OpenAI와 연동되어 있으니 쓰면 구독 관리등이 편합니다!) 도 넣어줍니다.
def transcribe_audio(audio_path):
with open(audio_path, "rb") as audio_file:
response = openai.Audio.transcriptions.create(
model="whisper-1",
file=audio_file
)
return response.text
부적절한 표현 감지
저는 투트랙을 사용했습니다. 일단 제가 아는 자주 쓰이는 비속어 목록과 OpenAI의 Moderation 기능을 둘 다 사용했습니다. 만일 부적절한 표현이 감지되면 경고를 한 뒤에 답변을 줍니다.
def check_profanity(text):
korean_profanity_list = ["불쾌한", "표현들", "써봣자", "안좋아요"]
flagged_words = [word for word in korean_profanity_list if word in text]
response = openai.Moderation.create(input=text, model="text-moderation-latest")
flagged = response['results'][0]['flagged']
return flagged or flagged_words
사용자가 욕하면 좀 더 정중한 표현 써보라고 조언도 합니다.
def suggest_better_response(user_input):
prompt = f"'{user_input}'을 정중한 표현으로 바꿔주세요."
response = openai.ChatCompletion.create(
model="gpt-4-turbo",
messages=[{"role": "system", "content": prompt}]
)
return response.choices[0].message.content
마지막에 실험해보시고 싶으면
streamlit run chatbot.py
콘솔에 쳐보시면 됩니다.
'Data Science!' 카테고리의 다른 글
조금 늦은 2024년 회고 (0) | 2025.01.19 |
---|---|
[글또 10기] 영국문화원 주관 ELTons상 수상 경험 (아마 한국인 최초일수도?) (1) | 2024.12.08 |
[글또 10기] AI 로드맵 작성하면서 느낀 점 (2) | 2024.10.14 |