Seq2Seq 기계 번역과 RASA 대화 시스템 운영 설계
Seq2Seq·Transformer 기반 기계 번역과 RASA 대화 시스템의 파이프라인, 품질 평가, 폴백, 운영 설계를 정리한다.
2026-08-14 · 최초 발행 2024-04-29
번역과 대화는 별도의 운영 경계를 가진다
대규모 언어 모델이 발전했어도 기계 번역과 태스크 지향형 대화 시스템은 독립된 설계와 운영 최적화가 필요한 영역이다. Seq2Seq 기반 Machine Translation은 입력 언어 시퀀스를 인코더가 잠재 표현으로 요약하고, 디코더가 목표 언어 시퀀스를 순차적으로 생성하는 지도학습 기반 생성 모델링 기법이다. Attention과 Transformer는 장기 의존성 및 병렬화 문제를 해결하는 구조로 쓰이며, 추론 단계에서는 빔 서치·길이 보정·커버리지 처리를 통해 유창성과 충실도 사이를 조절한다.
RASA는 NLU와 Core를 분리한 오픈소스 태스크 지향형 대화 시스템 프레임워크다. NLU는 의도 분류와 엔터티 인식을 담당하고, Core는 대화 정책·상태 추론·액션 실행을 맡는다. DIET(멀티태스크 BERT류 임베딩), TED Policy(트랜스포머 기반 정책), 스토리·룰·폼, 커스텀 액션 서버를 조합해 업무 프로세스 자동화를 구성한다.
번역 파이프라인에서 조절할 지점
번역 요청은 토크나이저(BPE/SentencePiece), 인코더(Transformer Lx), 디코더(마스크드 멀티헤드 어텐션), 빔 서치 출력으로 이어지는 계층을 거친다. 품질은 BLEU/chrF와 의미 유사도 기반 COMET/COMETKiwi를 병행해 측정할 수 있다.
운영에서는 빔 크기, 길이 페널티, 소프트맥스 온도, max_length가 지연과 품질의 트레이드오프를 조절한다. Attention, Copy/Pointer, Coverage Loss는 용어 정밀도를 높이고 누락·중복을 줄이는 데 사용된다. Marian, mBART, NLLB 같은 사전학습 기반 NMT는 저자원 언어 일반화 성능을 개선하는 선택지다.
추론 계층에서는 혼합 정밀도(fp16/bf16), 양자화(int8), 배치 동적 패딩, 캐시 KV 재사용을 적용할 수 있다. 데이터 측면에서는 병렬 코퍼스 정합성 검증, 용어집과 스타일가이드 적용, 개인정보(PII) 마스킹 절차가 필요하다. Teacher Forcing 비율, 라벨 스무딩, 샘플링 전략(temperature/Top-k)도 학습 과정에서 조절 대상이 된다.
RASA의 대화 상태와 업무 처리 경계
RASA NLU는 DIET를 통해 의도와 엔터티를 함께 학습하며 Spacy/LaBSE 등의 외부 임베딩을 연동할 수 있다. Core는 TED, RulePolicy, UnexpecTEDIntent를 사용해 대화 흐름을 예측하고 예외를 탐지한다.
액션 서버는 비즈니스 로직, 외부 API, DB 트랜잭션 처리를 대화 정책과 분리하는 경계 레이어다. 이 분리가 있어야 대화 도메인·룰 변경과 업무 시스템 변경을 각각 관리할 수 있다. 운영 과정에서는 A/B 테스팅, 온라인 피드백 루프, 캐시 계층(번역 메모리)을 통해 비용과 지연을 최적화한다.
MT에서는 COMET 기준 임계치 하회 시 사후 편집(HQE)으로 라우팅하고 도메인 적응 재학습을 트리거할 수 있다. RASA는 NLU F1/정확도, 대화 성공률, 폴백 발생률을 경보 기준으로 둔다. 언어 감지 실패, 길이 초과, OOV 급증에는 규칙 기반 폴백과 운영자 핸드오프 절차가 필요하다.
고객지원부터 음성 인터랙션까지의 연결
다국어 고객지원에서는 RASA 봇이 의도를 분류한 뒤 비영어권 질의를 MT로 표준 언어로 변환해 내부 지식베이스를 조회할 수 있다. SLA를 지키기 위해 고빈도 FAQ에는 캐시된 번역을 사용하고, 장문·복잡 질의에는 인간 에이전트 핸드오프 정책을 적용한다.
제품 로컬라이제이션은 NMT 전번역, 용어집 일치 검증, 번역 메모리(TM) 업데이트, 리뷰어 사후 편집으로 연결된다. COMET<임계치 문장>만 인력 검수 대상으로 선별해 비용 절감을 극대화한다.
음성 인터랙션에서는 ASR → MT → RASA → TTS의 스트리밍 파이프라인을 구성할 수 있다. 부분 결과(partial hypothesis)를 바탕으로 점증적으로 정책을 결정해 응답 지연을 최소화한다. 엔터프라이즈 환경에서는 컨테이너화(Kubernetes)와 메시지 버스(Kafka)로 수평 확장하고, 모델·룰 변경은 GitOps 기반 CI/CD, Canary 롤아웃, 자동 롤백 절차에 포함한다.
번역 단가는 3060% 절감되고, 라우팅 최적화 시 CSAT 512%p 향상과 FCR 815%p 개선 가능성이 있다. 양자화+배치 최적화 기준 평균 응답 지연은 3050% 단축되고 에러율은 20~35% 감소할 수 있다. 브랜드 용어 일관성, 운영 가시성, 규제 준수(PII 비식별화·감사 로그) 체계도 함께 강화되며, 도메인 적응과 휴먼 루프는 장기 성능 안정화에 연결된다.
번역 결과와 대화 정책이 만나는 흐름
품질 측정과 확장 방식의 차이
| 항목 | Machine Translation (Seq2Seq/Transformer) | RASA Dialogue Systems |
|---|---|---|
| 성능 | BLEU/COMET 지표 중심, 도메인 적응 시 급격한 개선 가능 | 의도/엔터티 F1, 대화 성공률로 측정 |
| 확장성 | 배치/캐시/양자화로 TPS 선형 확장 용이 | 워커 수평 확장, 대화 상태 저장소 분리 필요 |
| 일관성 | 용어집/커버리지/TM로 제어 | 룰/정책/스토리로 흐름 제약 |
| 안정성 | 길이/언어 감지 폴백, 실패 시 TM/인간 핸드오프 | 폴백 정책, NLU 신뢰도 기반 핸드오프 |
| 운영 편의 | 모델 버전·사전처리 통합 관리 중요 | 도메인·룰 변경의 CI/CD와 테스트 중요 |
MarianMT로 번역 요청 실행하기
전제조건: Python 3.10+, transformers 4.44+, torch 2.3+, GPU 선택 사항
# pip install -U transformers sentencepiece torch
from transformers import MarianMTModel, MarianTokenizer
model_name = "Helsinki-NLP/opus-mt-ko-en" # ko→en
tok = MarianTokenizer.from_pretrained(model_name)
model = MarianMTModel.from_pretrained(model_name)
sentences = ["안녕하세요, 배송 일정 확인 부탁드립니다.", "환불 정책을 알려주세요."]
inputs = tok(sentences, return_tensors="pt", padding=True, truncation=True, max_length=256)
with torch.no_grad():
gen = model.generate(
**inputs,
num_beams=4,
length_penalty=1.0,
max_new_tokens=128
)
outputs = tok.batch_decode(gen, skip_special_tokens=True)
for s, o in zip(sentences, outputs):
print(s, "->", o)
max_length를 보호하고 비정상적으로 긴 입력은 슬라이딩 윈도우로 분할한다. 실패한 요청은 TM 또는 룰 기반 답변으로 폴백 처리하는 구성이 권장된다.
RASA 프로젝트를 최소 구성으로 시작하기
전제조건: Python 3.10+, Rasa 3.x(최신 정보 확인 필요), spaCy ko 모델 선택 사항
파일 예시:
- domain.yml
version: "3.1"
intents:
- greet
- check_shipping
entities:
- order_id
slots:
order_id:
type: text
responses:
utter_greet:
- text: "안녕하세요. 무엇을 도와드릴까요?"
utter_ask_order_id:
- text: "주문번호를 알려주세요."
actions:
- action_check_shipping
- data/nlu.yml
version: "3.1"
nlu:
- intent: greet
examples: |
- 안녕하세요
- 반갑습니다
- intent: check_shipping
examples: |
- [12345](order_id) 배송 언제와?
- 주문 [A-777](order_id) 상태 확인
- data/rules.yml
version: "3.1"
rules:
- rule: ask for order id
steps:
- intent: check_shipping
- action: utter_ask_order_id
- actions/actions.py
# pip install rasa-sdk
from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
class ActionCheckShipping(Action):
def name(self) -> Text:
return "action_check_shipping"
def run(self, dispatcher: CollectingDispatcher,
tracker: Tracker, domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
order_id = tracker.get_slot("order_id") or "미확인"
# TODO: 외부 API 호출/예외 처리
dispatcher.utter_message(text=f"주문 {order_id} 배송 상태: 출고 완료")
return []
학습과 실행에는 다음 명령을 사용한다.
- rasa train
- rasa run actions --port 5055
- rasa shell
NLU 신뢰도 임계치를 조정하고 nlu_fallback과 out_of_scope 인텐트를 추가한다. 로그는 PII를 마스킹한 뒤 저장한다.
보안과 지연 사이에서 선택할 것
PII는 토큰화·마스킹하고 저장 시 KMS 기반 암호화를 적용한다. 모델 입력 로그는 비활성화하거나 부분 해싱 처리한다. 외부 MT API를 사용할 때는 전송 암호화와 지역(레지던시) 준수가 필요하다.
MT와 RASA는 독립적으로 스케일 아웃할 수 있는 마이크로서비스로 분리하고, 공통 토크나이저·용어집 설정은 구성 저장소에서 중앙 관리한다. TM과 번역 결과 캐시는 중복 요청을 제거해 지연과 비용을 줄인다.
빔 크기와 COMET 임계치를 높이면 품질은 상승하지만 지연도 증가한다. 비즈니스 KPI에 맞춘 균형이 필요하다. 사내 데이터 폐쇄형 학습은 규제 측면에서 유리하지만 데이터 다양성 부족으로 성능이 저하될 가능성이 있다. 사전학습 모델과 룰 기반 폴백으로 안정적인 구성을 먼저 만들고, 도메인 적응·휴먼 루프·A/B 실험을 통해 확장한다.