프로젝트 개요
이번 개인 프로젝트에서는 Streamlit과 OpenAI API를 활용해 사용자에게 맞춤형 아기 이름을 추천해주는 웹 애플리케이션을 개발했습니다. 아기가 생긴지 얼마 되지 않아서 한참 이름을 어떻게 지을까 고민하고, 생각하던 찰나 생성형 AI를 이용해서 이런 문제를 쉽게 풀어볼 수 있겠다는 생각이 들어 이 서비스를 기획했습니다.
이 서비스는 인기있는 이름 혹은 특이한 이름, 돌림자 적용, 성별 적용 등 기본적인 기능을 구현했으며, streamlit cloud를 통해 배포한 상태입니다. 관심있는 분들을 위해 코드도 공개해두었습니다.
데모 : 바로가기
Github : https://github.com/nakjun/KoreanBabyNameGeneratorAI
사용한 기술 스택
- Streamlit: Python으로 간단하게 웹 애플리케이션을 개발할 수 있는 오픈소스 프레임워크.
- OpenAI API: 자연어 처리(NLP)를 위한 AI 모델을 제공하는 API. 이 프로젝트에서는 주로 GPT-4 모델을 사용.
- Python: 프로젝트의 백엔드 로직을 처리하는 데 사용.
프로젝트 목표
- 맞춤형 아기 이름 추천: 사용자 입력을 기반으로 성씨, 성별, 스타일, 이름 길이, 돌림자 등을 반영한 맞춤형 아기 이름을 추천.
- 유연한 사용자 옵션 제공: 사용자가 이름의 스타일(인기 있는 이름 또는 특이한 이름), 이름 길이(외자, 2글자, 3글자), 돌림자의 위치(첫 글자, 두 번째 글자)를 선택할 수 있게 함.
- 안전한 입력 처리: 사용자가 영어를 입력하면 오류를 반환하여 한글 입력만 받도록 예외 처리.
주요 기능 설명
1. 사용자 입력 받기
Streamlit의 st.text_input, st.selectbox 등을 사용하여 성씨, 성별, 스타일, 이름 길이, 돌림자 등의 입력을 받습니다.
입력된 값들은 이후 OpenAI API로 전달되어 이름 추천에 사용됩니다.
last_name = st.text_input("성씨를 입력해주세요:")
gender = st.selectbox("아기의 성별을 선택해주세요:", ("남자", "여자"))
style = st.selectbox("이름 스타일을 선택해주세요:", ("인기 있는 이름", "특이한 이름"))
length = st.selectbox("이름 길이를 선택해주세요:", ("2글자", "외자", "상관없음"))
repetition_syllable = st.text_input("돌림자를 입력해주세요:")
2. OpenAI의 API 연동
입력된 정보를 바탕으로 OpenAI API에 프롬프트를 전송합니다.여기서 프롬프트는 선택된 옵션에 따라 동적으로 생성됩니다. OpenAI의 gpt-4o-mini 모델을 사용했습니다. 해당 모델은 많은 토큰을 처리해도 기존 모델 대비 저렴하게 이용할 수 있어서 사용성이 높습니다.
response = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "당신은 한국의 아기 이름 추천 전문가입니다."},
{"role": "user", "content": prompt}
],
temperature=0.7
)
temperature는 값이 높을수록 모델이 선택하는 토큰의 무작위성이 증가하는 옵션으로, 보다 다양하고 창조적인 결과를 얻기 위해 0.7로 설정했습니다. 더 창조적인 결과를 위해서는 1.0으로 설정하면 됩니다.
반대로 항상 가장 확률이 높은 토큰을 가져오려면 해당 값을 0에 가깝게 수정하면됩니다.
3. 예외처리
성씨나 돌림자 입력란에 영어가 포함될 경우 이를 감지하고 오류 메시지를 띄워줍니다.
def contains_english(text):
return bool(re.search(r'[a-zA-Z]', text))
if contains_english(last_name) or contains_english(repetition_syllable):
st.error("성씨나 돌림자에 영어 문자가 포함되어 있습니다. 한글만 입력해주세요.")
4. 이름 추천 결과 표시
저는 OpenAI의 API를 통해 추천된 이름들을 JSON 형식으로 저에게 알려주는 프롬프트를 작성했습니다.
해당 JSON 데이터를 파싱한 뒤, 사용자에게 결과를 시각적으로 보여주기 위해 다음과 같은 코드를 작성했습니다.
if 'names' in st.session_state:
for i, name in enumerate(st.session_state.names, 1):
with st.expander(f"**추천 이름 {i}:** {name.get('이름(한글)', '')}"):
if '이름(한자)' in name:
st.markdown(f"**한자:** {name['이름(한자)']}")
st.markdown(f"**의미:** {name.get('의미', '')}")
st.markdown(f"**특징:** {name.get('특징', '')}")
트러블 슈팅
1. 돌림자 처리
돌림자를 첫 글자 또는 두 번째 글자로 넣는 기능을 구현하는 과정에서, 이를 어떻게 API에 전달하고 적절한 이름을 추천받을 것인지 고민했습니다. 이를 위해 프롬프트를 동적으로 생성하는 방법을 도입하여 해결했습니다.
2. 영어 입력 예외 처리
한글 이름 추천 서비스인 만큼 영어가 포함된 입력을 차단하는 것이 중요했습니다. 정규 표현식을 사용하여 영어 문자가 포함된 경우 이를 감지하고 오류를 반환하도록 구현했습니다.
결론
이번 프로젝트를 통해 Streamlit과 OpenAI API를 활용해 간단하면서도 재밌는 웹 애플리케이션을 개발할 수 있었습니다.
다음에도 더 재밌고 실생활에 쓸만한 프로젝트로 포스팅을 해보겠습니다.
'개발 > AI' 카테고리의 다른 글
Llama-3.2-1B-Instruction 모델 파인튜닝하기 (4) | 2024.10.02 |
---|---|
PPT 슬라이드를 Vision-Language 모델로 해석하기 (3) | 2024.09.24 |
[공부] 한국어 벡터 임베딩 (0) | 2024.08.14 |
[공부] RAG를 위한 벡터 임베딩 (0) | 2024.08.13 |
[공부] RAG 개념 (1) | 2024.08.12 |