라인 번역봇 프로젝트 구상
AI를 활용한 다양한 서비스를 기획하던 중, 번역봇을 만들면 좋겠다는 생각이 떠올랐습니다. 특히, 일본에서 많이 사용하는 라인 메신저를 기반으로, 다른 국가끼리 대화를 메시지를 주고받을때, 한국인이 일본인 간의 언어적 장벽을 낮출 수 있는 번역 서비스를 구상하게 되었습니다.
이런 언어 변환 봇을 대화방에 새로 추가하여 번역을 할 수 있는데 해당 번역봇은 papago 번역 api를 사용하여 작동하는듯 해보였습니다. 한-일 번역기로는 대표적으로 구글번역기, 파파고, DeepL이 있습니다. 하지만 구글번역기는 언어간 어체가 자연스럽게 바뀌지않거나 엉성한 부분이 있었고 파파고가 가장 자연스러운 번역을 제공했습니다.
라인 메신저에서는 대화방에 번역봇을 추가하면 실시간으로 번역을 제공하고 있습니다. 이 번역봇은 Papago API를 사용하여 작동하며, 한-일 번역기 중에서는 대표적으로 구글 번역기, 파파고, DeepL 등이 있습니다. 그러나 구글 번역기는 문장 구조나 어체가 자연스럽지 않은 경우가 많았고, 파파고가 상대적으로 더 자연스러운 번역을 제공하는 것을 확인할 수 있었습니다.
최근 들어 ChatGPT 또한 다양한 언어 학습을 통해 모델이 발전하고 우수한 번역 품질을 보여주고 있습니다. 예를 들어, ChatGPT에게 일본어 문장을 한국어로 번역해 달라고 요청하면, 매우 빠르고 자연스러운 결과를 얻을 수 있었습니다. 특히, 최신 모델인 GPT-4는 이전 버전인 GPT-3에 비해 크게 향상된 성능을 자랑하며, API 사용 시 저렴한 비용으로도 mini 모델을 이용할 수 있는 장점이 있습니다. 이를 기반으로 더 자연스러운 번역기를 구현해보자는 생각으로 본 프로젝트를 진행하게 되었습니다.
전체적인 시스템 구상은 다음과 같습니다.
사용자가 라인 메신저에서 번역봇에게 메시지를 입력하면, LINE Messaging API를 통해 해당 메시지가 Flask 서버에 전달됩니다. 서버는 ngrok을 통해 외부에서 접근 가능하게 설정되며, 전달받은 메시지를 OpenAI API로 보내어 번역 결과를 받아옵니다. 번역된 내용은 다시 LINE-BOT을 통해 사용자에게 응답하게 됩니다.
개발 언어 선택
이번 라인 번역봇 프로젝트에서는 파이썬(Python)으로 개발 언어를 선택했습니다. 파이썬은 제가 이전에 GPT API를 사용하여 여러 프로젝트를 진행한 경험이 있는 언어입니다. 또한, 파이썬은 관련 자료와 튜토리얼이 온라인에서 풍부하게 제공되기 때문에 문제 해결과 개발 과정이 비교적 수월하다는 장점이 있습니다.
개발에 앞서 ChatGPT의 GPT-4 01-preview 추론 모델을 활용해 프로젝트와 관련된 여러 아이디어를 구상해 보았습니다. 최신 GPT 모델을 사용하면 번역 품질이 뛰어나지만, API 호출 시 발생하는 비용이 부담될 수 있으며, 응답 시간이 길어질 가능성도 있었습니다.
이에 따라, 번역 품질을 최대한 유지하면서도 비용 효율성을 고려한 모델을 선택하기로 했습니다. 저렴한 모델을 우선 선택하고, 프로젝트 진행 과정에서 모델 선택과 관련된 구체적인 내용은 아래에서 다시 다루겠습니다.
파이썬 가상환경 만들기
virtualenv transltor
우선, virtualenv를 사용해 새로운 파이썬 가상환경을 생성합니다. 가상환경의 이름은 자유롭게 설정할 수 있지만, 이번 프로젝트에서는 transltor라는 이름으로 가상환경을 만들었습니다.
가상환경을 생성한 디렉토리 안에 transltor
폴더가 생성되며, 이 폴더 안에는 독립된 파이썬 실행 파일과 필요한 라이브러리들이 포함되어 있습니다.
./transltor/Scripts/activate
가상환경을 활성화 하려면 위 명령어를 입력합니다.
가상환경을 실행하면 터미널 앞에 (transltor)라는 표시가 나타나게됩니다.
개발 환경설정 (라이브러리,API키)
이번 라인 번역봇 프로젝트에서는 파이썬을 기반으로 개발을 진행하며, 개발을 위해 필요한 몇 가지 라이브러리와 API 키 설정을 단계별로 설명드리겠습니다.
라이브러리 설치
ChatGPT로부터 조언을 받아 구성한 개발 환경에서는, 다음과 같은 라이브러리들이 필요합니다.
- flask : 웹 서버를 만들고 라인에서 보내는 메세지 요청을 받기 위해 사용
- line-bot-sdk : 라인 번역봇을 만들고 이를 사용하여 메세지를 수신하거나 발신할 수 있음
- openai : OpenAI의 API를 사용하여 ai를 통한 번역지시를 위해 사용
- dotenv : api key들 환경변수로 관리하기위해 사
위 라이브러리에서 일부는 API사용에 필요한 키 발급이 필요한데 아래에서 각 단계별로 자세히 설명해드리겠습니다.
라이브러리 설치 명령어
필요한 라이브러리들을 한번에 설치하려면, 아래의 명령어를 가상환경이 활성화된 상태에서 실행합니다.
pip install flask line-bot-sdk openai dotenv
Openai API Key 발급
OpenAI의 API를 사용하여 번역 기능을 구현하기 위해서는 API Key가 필요합니다. 최근 OpenAI의 API 관리 방식이 기존의 API Key에서 Project Keys로 변경되었습니다. (API Key 발급사이트)
새로운 API Key를 만들 때, API Key를 구분하기 쉽게 이름을 지정할 수 있습니다. 이름을 지정한 후, "Create secret key" 버튼을 눌러 새로운 API Key를 발급받습니다.
이때 생성된 Secret Key는 보안상의 이유로 나중에 다시 확인할 수 없습니다. 따라서, 발급된 API Key를 반드시 복사하여 안전한 장소에 저장해 두시는 것을 권장합니다. 만약 키를 잃어버린다면, 새로운 키를 다시 발급받아야 합니다.
API사용량 확인
OpenAI Usage 페이지에 들어가면 월별 사용량을 확인할 수 있습니다.
mini모델의 경우 정말 비용이 저렴하여 다른 모델에 비해서 사용량이 적은데 나중에 서비스화하게 된다면 실제 요금이 얼마나 나오는지 다시한번 다뤄보겠습니다.
line-bot-sdk 계정 생성하기
LINE-BOT SDK를 사용하여 번역봇을 개발하려면, LINE-CHANNEL_SECRET 키와 LINE-CHANNEL_ACCESS_TOKEN 키가 필요합니다. 발급 과정에서 굉장히 헤맸었는데, 한 번에 쉽게 발급받을 수 있도록 그 과정을 상세히 안내해드리겠습니다.
우선 Line Developers에 접속하여 Create를 클릭하면 새로운 채널을 만들수 있습니다.
만약 Line Developers를 처음 이용하는 경우, 라인 계정 인증을 거친후 이용할 수 있습니다.
채널의 이름을 지정한후 Create 버튼을 클릭합니다.
1. LINE Developers 관리 페이지에서 좌측 패널에서 방금 생성한 Provider를 선택합니다.
2. Create a Messaging API channel을 클릭합니다.
Create a LINE Offical Account를 클릭합니다.
라인 채널에서 API기능을 사용하기 위한 정보를 입력한뒤 Contiue 를 클릭합니다.
작성항목
- Account name : 서비스 이름을 입력합니다.
- Email address : 본인 이메일을 입력합니다.
- Company or owner's country or region : 기본값으로 South Korea가 선택됩니다.
- Industry : 해당하는 카테고리르 선택합니다.
CHANNEL_ACCESS 토큰 발급받기
설정을 완료했다면 좌측 패널에서 생성한 봇을 클릭하고, 채널을 한번더 선택하면 위와같은 화면이 나타나게됩니다.
화면 상단에 Messaging API메뉴를 클릭합니다.
화면제일 아래로 스크롤하면 Channel access token이 나오게됩니다. API 사용시 필요한 정보인데 저는 이 정보를 못찾아서 굉장히 오랜시간이 흘렀습니다.. 따로 잘 복사해둡니다. 나중에 LINE_CHANNEL_ACCESS_TOKEN항목에 사용됩니다.
CHANNEL_SECRET 키 발급받기
다음으로 LINE_CHANNEL_ACCESS_TOKEN에 해당하는 키를 찾아야합니다.
Line offical Account Manger에 접속하여 이전에 생성한 계정을 클릭합니다.
채널 홈 페이지에서 접속하게되면 우측 상단에 설정버튼을 클릭합니다.
설정 - Messagin API를 클릭한뒤 Channel정보에 나타나는 Channel secret를 복사해둡니다. LINE_CHANNEL_SECRET로 사용됩니다.
라인봇 채널 참가 권한부여
A사용자와 B사용자의 대화를 실시간으로 번역하여 서로 대화를 나누려면 A,B,LineBOT 세명의 대화상대가 대화방에 함께 있어야합니다.
기본적으로는 생성한 봇을 채널에 초대하면 자동으로 나가지기 때문에 LINE Developers에서 설정이 필요합니다.
LINE Devlopers Messaging-api 에 들어간뒤 Allow bot to join group chats 항목을 편집합니다.
기능 사용항목에 그룹 및 여러 사람이 있는 대화방의 옵션을 대화방에 참여할 수 있음에 체크합니다.
.env 환경변수 설정
API 키와 중요한 설정 값들을 안전하게 관리하기 위해, 이번 프로젝트에서는 .env
파일을 활용해 환경변수를 설정합니다.
프로젝트의 루트 디렉터리에 새로운 .env 파일을 생성하고, 아래 내용을 복사해 붙여넣습니다
LINE_CHANNEL_SECRET=
LINE_CHANNEL_ACCESS_TOKEN=
OPENAI_API_KEY=
이제, 앞서 발급받은 LINE_CHANNEL_SECRET, LINE_CHANNEL_ACCESS_TOKEN, 그리고 OPENAI_API_KEY 값을 각각 복사하여 빈 칸에 붙여넣습니다. 이때, 값은 ' 따옴표 없이 상수 그대로 입력합니다.
import os
from dotenv import load_dotenv
load_dotenv()
LINE_CHANNEL_SECRET = os.getenv('LINE_CHANNEL_SECRET')
LINE_CHANNEL_ACCESS_TOKEN = os.getenv('LINE_CHANNEL_ACCESS_TOKEN')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
위와 같이 os.getenv(변수명)
형식을 사용하여 파이썬에서 환경변수를 불러옵니다.
이 방법을 통해 API 키를 코드에 직접 입력하지 않고도 안전하게 사용할 수 있습니다.
라인 웹훅 URL설정
로컬 환경에서 Flask를 사용하여 개발할 때는 서버가 외부에서 접근할 수 없기 때문에, 웹훅(Webhook)을 사용하기 위해 ngrok을 활용하여 공개 URL을 생성해야 합니다. 이 방법으로 LINE Messaging API와 통신할 수 있습니다.
ngrok홈페이지에 로그인하여 Windows용 ngrok 설치 파일을 다운로드합니다. 설치 파일을 프로젝트 경로에 저장한 후, 사용자 인증을 위해 ngrok에 인증 토큰을 추가해야 합니다.
ngrok authtoken <your_auth_token>
ngrok 설치 후, 터미널에서 다음 명령어를 입력하여 ngrok 구성 파일에 인증 토큰을 추가합니다. 이 토큰은 사진에 표시한 부분처럼 ngrok 계정에서 제공됩니다.
ngrok 구성 파일인 ngrok.yml은 찾아보니, 기본적으로 C:\Users\사용자명\AppData\Local\ngrok 경로에 생성됩니다. 해당 경로에서 파일을 확인할 수 있습니다.
프로젝트 경로에서 터미널을 열고 ngrok http 5000
명령어를 입력하여 서버를 실행합니다.
Forwarding부분에 나타나는 url을 라인 API WebhookURL로 사용합니다.
LINE Offical Account Manger에 접속하여, 계정을 선택하고 우측의 설정 - Messaging API - Webhook URl에 ngrok 주소뒤에 /callback을 포함하여 붙여넣은뒤 저장을 누릅니다.
Webhook URL예 : https://4564165489-54123.ngrok.app/callback
라인 봇 이벤트 처리
LINE SDK를 사용하여 라인 봇이 수신한 메시지를 처리하는 방법에 대해 설명하겠습니다. Flask와 LINE Messaging API를 사용해 라인 서버로부터 이벤트를 받아 처리합니다.
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)
라인SDK를 사용하여 이벤트를 처리할 수 있습니다. 라이브러리와 필요한 api를 지정합니다.
@app.route("/callback", methods=['POST']) #
def callback():
# 라인 웹훅 시그니처 검증
signature = request.headers.get('X-Line-Signature') # 시그니처 가져오기
body = request.get_data(as_text=True) # 요청 본문 가져오기
app.logger.info(f"Request body: {body}") # 요청 본문 로깅
try:
handler.handle(body, signature) # 웹훅 핸들링
except InvalidSignatureError:
app.logger.error("Invalid signature. Please check your LINE_CHANNEL_SECRET.") # 오류 로깅
abort(400) # 400 오류 응답
return 'OK' # 성공 응답
Flask의 라우팅 기능을 사용해 라인 서버로부터 전달되는 웹훅(Webhook) 요청을 처리합니다. 이때, callback 경로를 통해 이벤트를 수신하고, 해당 이벤트를 처리할 수 있도록 코드를 작성합니다.
코드에서 사용된 print대신에 logger를 사용하여 info와 error를 통해 메세지를 처리하는데 이에 관해서 처음 알게되어 간략하게 알아보겠습니다.
Flask logger 사용
이번 프로젝트에서는 Flask의 logger를 활용하여 결과를 출력할 예정입니다. Flask는 기본적으로 Python의 logging 모듈을 사용하지만, 자체적으로 로깅 설정을 제공하여 애플리케이션의 주요 이벤트나 오류를 기록할 수 있습니다. 앞으로는 print
대신 Flask logger를 사용하여 로그를 남기도록 하겠습니다.
app = Flask(__name__)
플라스크 애플리케이션이 초기화된 경우, app.logger.info와 같은 형식으로 logger를 사용할 수 있습니다.
import logging #로깅 기능을 제공하는 모듈
logger는 레벨 기반으로 로그를 남길 수 있습니다. (DEBUG, INFO, WARING, ERROR, CRITICAL)
예를 들어, logger.info()는 정보성 메시지, logger.error()는 에러 메시지를 의미합니다.
logging.basicConfig(
filename='app.log', # 로그를 저장할 파일 이름
level=logging.INFO, # 로그 레벨
format='%(asctime)s %(levelname)s %(message)s' # 로그 형식 지정
)
이 프로젝트에서는 실시간으로 번역이 이루어지다보니 원격 로그 서버등을 활용할때 위와 같이 나중에 로그파일을 따로 기록한다면 중요한 로그만 따로 기록할 수 있고 모니터링에도 효과적입니다.
GPT API 번역처리
def translate_text(text):
source_lang = detect_language(text) # 입력 텍스트의 언어 감지
if source_lang == '한국어':
target_lang = '일본어' # 한국어에서 일본어로 번역
else:
target_lang = '한국어' # 일본어에서 한국어로 번역
# OpenAI API 요청 생성
messages = [
{
"role": "system",
"content": f"당신은 {source_lang}를 {target_lang}로 번역하는 전문 번역가입니다."
},
{
"role": "user",
"content": text # 사용자 입력 텍스트
}
]
# OpenAI API 요청 생성
response = client.chat.completions.create(
model="gpt-4o-mini", # 사용할 모델
messages=messages # 요청 메시지
)
# 번역 결과 추출
translated_text = response.choices[0].message.content # 번역된 텍스트
return translated_text.strip() # 공백 제거 후 반환
전체적인 API를 통해 번역이 이루어지는 함수의 구조는 위와 같습니다.
먼저, 사용자가 입력한 언어가 한국어인지 일본어인지 확인하는 과정이 필요한데, 이 부분은 별도로 detect_language 함수로 구현했습니다.
한글 일본어 문자구분
def detect_language(text):
# 한글이 포함되어 있는지 체크
if re.search("[\uac00-\ud7a3]", text): # 한글 정규 표현식
return '한국어'
else:
return '일본어'
넘겨받은 text에서 정규 표현식을 사용하여 한글 음절의 유니코드 범위에 해당하는 문자가 있는지 검사합니다. 만약 한글이 포함되어 있다면 ko
를, 한글이 포함되지 않으면 ja
를 반환합니다.
이번에 언어별 문자를 유니코드 범위로 알 수 있다는 사실을 처음 알았는데, 한-일 뿐만아니라 다른 국가의 언어도 음절 범위를 유니코드로 파악할 수 있습니다.
Open AI 요청
# OpenAI API 요청 생성
messages = [
{
"role": "system",
"content": f"당신은 {source_lang}를 {target_lang}로 번역하는 전문 번역가입니다."
},
{
"role": "user",
"content": text # 사용자 입력 텍스트
}
]
# OpenAI API 요청 생성
response = client.chat.completions.create(
model="gpt-4o-mini", # 사용할 모델
messages=messages # 요청 메시지
)
API 요청 부분에서도 많은 어려움이 있었지만, GPT에게 문의해본 결과, 처음에는 response = openai.ChatCompletion.create()
형태로 요청을 보내는 코드를 알려줬습니다.
그러나 OpenAI 문서를 다시 확인해보니, API 사용 구조가 변경되었고, 이제는 response = client.chat.completions.create()
형태로 요청을 보내야 합니다. 이 부분은 예전에 AI 친구 웹앱을 만들 때도 업데이트되어서 새로 코드를 수정했었던 경험이 있었습니다.
처음에는 gpt-3.5-turbo 모델을 사용해보라고 권해서 사용해봤는데, 언어는 정확하게 번역되었으나, 경어체나 구어체와 같은 자연스러운 문장 구사 능력이 조금 부족하다고 느꼈습니다. 그래서 최신 모델 중에서도 API 비용이 저렴한 mini 모델을 선택해 다시 시도해보았더니 가격도 저렴하고 번역 품질도 만족스러웠습니다.
캐싱 구현으로 api비용 절감
번역을 주고받을 때, 동일한 내용의 메세지도 반복적으로 오갈 수 있는데, 이를 매번 새로운 API요청으로 처리하면 그만큼 API비용이 증가하게 됩니다. 그래서 번역의 결과를 캐시에 저장하고, 이후 동일한 내용의 번역 요청이 들어올경우 , API를 호출하기 전에 캐시를 먼저 확인합니다. 입력된 텍스트값이 캐시에 존재하면 캐싱된 결과를 바로 반환하여 불필요한 API 호출을 줄이고 비용을 절감할 수 있습니다
from functools import lru_cache # LRU 캐싱을 위한 라이브러리
먼저, LRU(Least Recently Used) 캐싱을 위한 라이브러리를 불러옵니다.
@lru_cache(maxsize=1000) # LRU 캐시
최대 1,000개의 번역 결과를 쌍을 저장하도록 설정하였습니다. translat_text
함수 위에 이 데코레이터를 붙여넣게되면 함수가 호출될 때마다, LRU 캐시가 먼저 입력값이 캐시에 존재하는지 확인합니다. 만약 입력값이 이미 캐시에 있다면, 저장된 결과를 즉시 반환하여 함수 실행 과정을 생략합니다.
@lru_cache(maxsize=1000)
def translate_text(text):
source_lang = detect_language(text)
if source_lang == '한국어':
target_lang = '일본어'
else:
target_lang = '한국어'
app.logger.info(f"API가 호출되었습니다 원문 텍스트: {text}\n\n\n") # API 호출 로그
# OpenAI API 요청 생성
messages = [
{
"role": "system",
"content": f"당신은 {source_lang}를 {target_lang}로 번역하는 전문 번역가입니다. 번역 시 원문의 말투와 어조(경어체 또는 구어체)를 최대한 유지하고, 자연스럽고 유창한 표현을 사용해주세요. 또한 문화적 뉘앙스와 문맥을 고려하여 가장 적합한 번역을 제공해주세요."
},
{
"role": "user",
"content": text
}
]
# OpenAI API 요청 생성
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages
)
# 번역 결과 추출
translated_text = response.choices[0].message.content
return translated_text.strip()
위와같이 translate_text
함수 내부에 API 호출 여부를 확인할 수 있도록 로깅을 작성하고, 동일한 메시지를 입력해보았습니다. 여기서 당연하게도 파이썬 애플리케이션을 종료하면 캐시가 초기화되므로 저장된 결과는 다시 사용할 수 없습니다.
동일한 메세지를 보내보고 터미널에서 확인한 결과, 처음에는 API를 호출하여 번역이 이루어졌지만, 두 번째 호출에서는 함수가 실행되지 않고 저장된 캐시에서 결과가 반환되었습니다.
결론적으로, 동일한 내용에 대한 번역은 API 호출을 줄임으로써 비용 절감이 가능합니다.
라인 메시지 API를 사용한 번역결과 제공
# 메시지 이벤트 핸들러 추가
@handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
user_input = event.message.text
user_id = event.source.user_id
app.logger.info(f"Received message from {user_id}: {user_input}")
if re.fullmatch(r'[a-zA-Z\s]+', user_input): # 영어만 포함된 경우
app.logger.info("Input is English only.")
return
# 번역 처리
try:
translated_text = translate_text(user_input)
reply_message_request = ReplyMessageRequest(
reply_token=event.reply_token,
messages=[
TextMessage(text=translated_text)
]
)
line_bot_api.reply_message(reply_message_request)
except Exception as e:
app.logger.error(f"Error during translation: {e}")
reply_message_request = ReplyMessageRequest(
reply_token=event.reply_token,
messages=[
TextMessage(text="번역 중 오류가 발생하였습니다. 나중에 다시 시도해주세요.")
]
)
line_bot_api.reply_message(reply_message_request)
위 코드는 LINE 메시지 API를 사용하여 사용자가 보낸 메시지를 처리하고, 번역 결과를 사용자에게 응답하는 기능을 수행합니다.
handle_message
함수에 event 매개변수를 추가하여, 메시지 이벤트가 발생했을 때 해당 함수가 실행되도록 설정하였습니다.
이 코드를 단계별로 하나씩 자세히 알아보겠습니다.
@handler.add(MessageEvent, message=TextMessageContent) # 메시지 이벤트 핸들러
LINE 봇이 수신한 메시지 이벤트를 처리하기 위한 함수를 정의합니다.
MessageEvent는 사용자가 보낸 메시지를 나타내고, TextMessageContent
는 텍스트 메시지의 내용을 나타냅니다.
user_input = event.message.text
user_id = event.source.user_id
app.logger.info(f"Received message from {user_id}: {user_input}")
사용자가 보낸 텍스트 메시지와 사용자 ID를 각각 변수에 저장하고, 로그에 기록합니다. 이 로그는 실제로 파일에 저장되지 않고, 콘솔에 출력됩니다.
if re.fullmatch(r'[a-zA-Z\s]+', user_input): # 영어만 포함된 경우
app.logger.info("Input is English only.")
return
만약에 입력된 메시지가 영어로만 구성된 경우, API를 사용하지 않고 영어 메시지를 그대로 반환하여 처리합니다.
translated_text = translate_text(user_input) # 번역 수행
translate_text
함수를 호출하여 사용자가 보낸 메시지를 번역합니다. 이 함수는 이전에 설명한 OpenAI API를 사용하여 번역을 수행하거나, 이미 캐시된 데이터가 있을 경우 캐시된 번역 결과를 반환합니다.
translated_text = translate_text(user_input)
reply_message_request = ReplyMessageRequest(
reply_token=event.reply_token,
messages=[
TextMessage(text=translated_text)
]
)
ReplyMessageRequest
객체를 생성하여, LINE에서 응답할 메시지를 준비합니다. 이때 replay_token
은 LINE 서버에 응답하기 위한 토큰 값으로, 해당 토큰을 통해 정확한 응답을 보낼 수 있습니다.
line_bot_api.reply_message(reply_message_request)
마지막으로 line_bot_api.reply_message 메서드를 호출하여, 사용자가 보낸 메시지에 대한 번역 결과를 응답합니다.
라인봇 친구추가 하는법
아이디 친구추가
Offical Account 페이지에 들어가서 본인의 봇을 선택하면 상단에 사각형으로 표시한 영역에 라인봇을 추가할 수 있는 아이디가 나오게됩니다. 해당 ID로 친구추가 할 수 있습니다.
QR코드 친구추가
Offical Account 페이지 하단에 QR 코드 만들기를 통하여, 바로 친구로 등록가능한 QR코드를 배포할 수도 있습니다.
깃허브 링크
지금까지 작성한 프로젝트에 관한 코드는 깃허브에서 확인할 수 있습니다.
GitHub - Blue-B/LINE-TRANSLATOR: 라인 메신저 한-일 번역 봇, LINE Messenger Korean - Japanese Translator Bot
라인 메신저 한-일 번역 봇, LINE Messenger Korean - Japanese Translator Bot - Blue-B/LINE-TRANSLATOR
github.com
마무리
라인 번역봇 테스트 과정에서, AI번역을 사용하면 좋은점은 문맥을 고려하여 번역한다는 점이었습니다. 특히, 문장에 포함된 영어 단어는 그대로 유지하면서도 자연스러운 번역을 할 수 있었습니다. 이는 프롬포트를 활용하여 번역 품질을 향상시켰습니다.
또한, 최신 AI 모델을 사용함으로써 언어 데이터를 기반으로 매우 자연스러운 언어 변환이 가능했습니다. 번역 결과는 원본 텍스트의 분위기와 말투에 맞춰 자연스럽게 번역되었습니다.
개발 과정에서는 처음에 함수나 오류 처리 부분에서 어려움이 있었지만, 그때마다 AI에게 질문하며 도움을 받을 수 있었습니다. 특히, AI에게 질문할때마다 OpenAI API 호출 방법이 달라지면서 오류가 많았는데, 이전에 제작했던 AI 친구 프로젝트의 변경된 API 호출 방법에 대한 코드가 많은 도움이 되었습니다. 또한, 한-일 번역 로직을 어떻게 구현할지 고민하던 중, 한글 음절의 유니코드 범위를 사용하여 언어를 감지하는 방법을 알게 되었고, 이를 통해 일본어나 영어도 각 음절별 유니코드 범위로 분류할 수 있다는 점을 배웠습니다.
API 사용 시 발생하는 비용을 고려하여, 처음에는 AI에게 gpt-3.5-turbo 모델을 추천받았지만, 모델 페이지에 찾아보니 gpt-4o-mini 모델이 더 나은 품질을 제공하면서도 저렴한 비용으로 사용할 수 있었습니다. 또한, 응답 속도도 빨라 실제 번역기처럼 자연스러운 번역을 제공할 수 있었습니다.
마지막으로, API 비용 절감을 위한 캐싱 기능을 구현한 것도 매우 좋은 시도였습니다. 동일한 응답에 대한 번역 결과는 캐싱된 정보를 기반으로 처리하여 불필요한 API 호출을 줄일 수 있었고, 이를 통해 비용 절감 효과를 얻을 수 있었습니다. 이런 방법은 이 프로젝트 뿐만아니라 다른 프로젝트에서도 효율적으로 적용할 수 있을거 같습니다.
Messaging API에도 요금제가 존재하는데 기존적으로는 무료로 월 500회까지 메세지를 전송할 수 있습니다. 이를 고려하여 개인이 저 처럼 봇을 만들어서 사용하기에는 적합하지만 서비스화 한다면 월 유지비용까지 고려해야할 수 있습니다.
참고자료
LINE Messaging API v3 - Flex Message with Python (Flask) [備忘録] - Qiita
Flex Message の手作りはめんどいLine の Messaging API と Python でボット開発を何回かしてきましたが、Flex Message を使おうと思ったらまずは Fl…
qiita.com
line-bot-sdk-python/examples/flask-echo/app_with_handler.py at master · line/line-bot-sdk-python
LINE Messaging API SDK for Python. Contribute to line/line-bot-sdk-python development by creating an account on GitHub.
github.com
GitHub - line/line-bot-sdk-python: LINE Messaging API SDK for Python
LINE Messaging API SDK for Python. Contribute to line/line-bot-sdk-python development by creating an account on GitHub.
github.com