Skip to main content

Translator-Agent와 데이터 품질 관리 체계

Translator-Agent와 데이터 품질 관리 체계

1. 초기 Translator-Agent 도입 배경

7월 초, 플랫폼 내 등록된 상품 수가 20만 건을 초과하면서 다국어 데이터 품질 문제가 심각하게 드러났다. 기존에는 외부 번역 API를 호출해 결과를 저장하는 단순 구조였다. 하지만 언어별 품질 편차가 심했고, 카테고리명, 단위, 브랜드명 등이 잘못 번역되는 사례가 누적되었다.

"Steel Pipe"가 태국어로 "철 담배 파이프"로 번역되거나, "12V DC Motor"의 "DC"가 "직류"가 아닌 "워싱턴 D.C."로 해석되는 사례가 실제로 발생했다. 산업 자재 분야의 전문 용어는 일반 번역 모델로는 정확도가 낮다. 수동 교정 인력을 투입하지 않으면서도 번역 품질을 확보하기 위해 "Translator-Agent"를 내부적으로 개발하기로 결정했다.

Translator-Agent의 설계 목표는 다음과 같았다.

  • 번역 품질 자동 평가 및 등급화 (MACHINE / HUMAN / APPROVED)
  • 다국어 텍스트 캐시 및 중복 요청 제거
  • 문장 단위가 아닌 문맥 단위 번역 처리 — 상품 카테고리, 스펙, 단위를 함께 고려
  • MQ 기반 병렬 번역 및 품질 피드백 루프 자동화
  • 산업 자재 전문 용어 사전(Glossary) 적용

2. 아키텍처 설계 — AI 모델 혼합 전략

Translator-Agent는 MQ 이벤트 소비자로 동작한다. product.created 또는 i18n.missing 이벤트를 수신하면 해당 상품의 기본 언어 데이터를 조회하고, 두 가지 AI 모델을 혼합하여 번역을 수행한다.

첫 번째 단계에서는 대량 번역에 최적화된 모델이 초안(draft)을 생성한다. 이 초안은 속도가 빠르지만 문맥 이해가 약할 수 있다. 두 번째 단계에서는 문맥 검증 모델이 초안을 상품의 카테고리와 스펙 정보와 대조하여 오역을 보정한다. 이 2단계 파이프라인 덕분에 속도와 품질을 동시에 확보할 수 있다.

def translate_product(evt):
    pid = evt["product_id"]
    base = db.get_product(pid)
    for lang in ["en", "ko", "zh-CN", "th"]:
        if lang == base.lang:
            continue
        # 1단계: 용어 사전 적용 후 대량 번역 모델로 초안 생성
        raw = glossary.apply(base.name, base.description, base.specs)
        draft = bulk_translator.translate(raw, target=lang)
        # 2단계: 문맥 검증 모델로 보정
        refined = context_refiner.refine(draft, category=base.category, specs=base.specs)
        db.save_translation(pid, lang, refined, quality="MACHINE")
        publish("i18n.updated", {"id": pid, "lang": lang})

MQ 큐는 언어별로 분리되어 병렬 처리가 가능했다. 초기에 대량 번역 모델의 API 요청 한도가 낮아 하루 약 3만 건 이상 처리 시 오류가 빈번하게 발생했다. 이 문제는 캐시 구조를 추가하여 이미 번역된 문장은 재요청하지 않도록 수정함으로써 해결했다.

3. 용어 사전(Glossary)과 도메인 특화

산업 자재 분야에서는 일반 번역 모델이 자주 실수하는 용어가 많다. 예를 들어 "Bearing"은 일반적으로 "견디다"로 번역될 수 있지만, 산업 자재에서는 "베어링(축받이)"이 정확한 번역이다. 이런 도메인 특화 용어를 관리하기 위해 Glossary 시스템을 Translator-Agent에 내장했다.

Glossary는 약 8,000개의 산업 용어를 4개 언어로 매핑한 데이터셋이다. 번역 전 원문에서 Glossary에 등록된 용어를 먼저 탐지하고, 해당 용어는 AI 모델의 번역 결과와 관계없이 Glossary 값으로 강제 치환한다. 이 방식으로 브랜드명, 규격 코드, 단위(mm, kg, PSI 등)가 번역 과정에서 왜곡되는 것을 방지한다.

# Glossary 적용 예시
glossary_map = {
    "bearing": {"th": "แบริ่ง", "ko": "베어링", "zh": "轴承"},
    "stainless steel": {"th": "สแตนเลส", "ko": "스테인리스강", "zh": "不锈钢"},
}

def apply_glossary(text, target_lang):
    for term, translations in glossary_map.items():
        if term.lower() in text.lower():
            text = text.replace(term, translations[target_lang])
    return text

4. 중복 번역 방지 및 캐시 전략

두 번째 이슈는 동일 문장이 중복 번역되는 문제였다. MQ 이벤트가 일시적으로 중복 발행되거나, DB 저장 직후 재번역 이벤트가 발행되는 경우에 발생했다. Translator-Agent가 이미 번역된 텍스트를 덮어쓰면서 품질 점수가 불안정하게 변했다.

Redis 기반의 번역 키 해시를 추가했다. 각 번역 요청 전에 hash(content+lang) 키를 조회해 동일 원문+동일 언어의 번역이 이미 존재하는지 확인한다. 이미 존재하면 MQ 메시지를 소비하지 않고 스킵 로그만 남긴다.

key = f"tr:{hashlib.md5((content + lang).encode()).hexdigest()}"
if redis.exists(key):
    publish("i18n.skipped", {"lang": lang, "pid": pid})
else:
    redis.set(key, 1, ex=86400)
    process_translation(content, lang)

이 변경 이후 MQ 소비량은 약 35% 감소했고, 중복 번역은 90% 이상 줄었다. 품질 점수의 표준편차도 0.18에서 0.05 수준으로 안정화되었다.

5. 품질 평가 및 자동 보정 루프

번역 품질은 BLEU와 TER 지표를 기반으로 측정했다. 각 언어별 기준 점수는 BLEU >= 0.7, TER <= 0.3으로 설정했다. 기준 이하인 문장은 자동으로 재번역 대상에 등록된다. 재번역은 문맥 검증 모델 단독으로 수행되며, 상품 카테고리와 스펙 정보를 추가 컨텍스트로 제공하여 정확도를 높인다.

score = bleu_score(reference_text, translated)
if score < 0.7:
    corrected = context_refiner.correct(translated, base.category, base.specs)
    db.update_translation(pid, lang, corrected, quality="REWRITE")
    publish("i18n.rewrite", {"id": pid, "lang": lang, "score": score})

평균 품질 점수는 3회 루프 이후 0.68에서 0.83으로 상승했다. BLEU 점수가 0.85 이상이면 품질 등급을 자동으로 APPROVED로 승격하고, Redis 캐시에 영구 저장하여 DB 조회를 생략한다.

6. 인적 검수(Human Review) 워크플로우

AI가 아무리 정확해도 최종 검수는 사람이 해야 하는 영역이 있다. 특히 신규 카테고리의 전문 용어나, 법적 문서에 사용되는 표현은 AI 단독으로 판단하기 어렵다.

Translator-Agent는 품질 등급이 MACHINE인 번역 중 BLEU 점수가 0.65~0.75 구간에 있는 항목을 "Human Review 후보"로 분류한다. 이 후보 목록은 운영 대시보드에 노출되며, 검수자가 번역을 확인하고 승인하면 등급이 HUMAN으로 변경된다. 이후 운영팀 최종 승인을 거치면 APPROVED로 확정된다.

검수 대상은 전체 번역의 약 8% 수준이다. 나머지 92%는 AI가 자동으로 APPROVED까지 처리한다. 이 비율은 Glossary가 확충되고 모델이 개선될수록 점차 감소하고 있다.

7. 캐시 무효화 및 데이터 일관성

번역 데이터가 갱신될 때 Redis 캐시와 DB 간 일관성이 깨지는 문제가 있었다. 일부 페이지가 갱신된 번역을 반영하지 못하고 이전 데이터를 그대로 노출했다. 이는 Cloud Function이 i18n.updated 이벤트를 수신하지 못했을 때 발생했다.

해결책으로 MQ 재시도 큐(Delay Queue)를 추가했다. 이벤트 수신이 실패한 경우 30초 후 재발행되도록 구성했다. Function 로그는 Ops-Agent가 수집하여 Telegram /cache 명령으로 즉시 조회 가능하게 했다.

publish("cache.invalidate", {"kind": "i18n", "id": pid, "lang": lang}, delay=30)

이후 페이지 캐시 불일치율은 2.4%에서 0.3% 수준으로 감소했다. 동일 상품의 다국어 데이터를 동시에 요청해도, Redis TTL(15분) 내에서는 항상 최신 상태를 유지했다.

8. AI 에이전트 간 협업 및 우선순위 체계

Translator-Agent는 Classifier-Agent, Crawler-Agent와 동일한 MQ를 사용한다. 이벤트 혼선이 발생하지 않도록 각 에이전트에 우선순위를 부여했다. Crawler → Classifier → Translator 순으로 이벤트를 처리하며, Translator-Agent는 product.normalized 이벤트를 수신한 이후에만 작동한다.

agents:
  - name: crawler
    priority: 1
    output_event: "product.crawled"
  - name: classifier
    priority: 2
    depends_on: ["crawler"]
    output_event: "product.normalized"
  - name: translator
    priority: 3
    depends_on: ["classifier"]
    output_event: "i18n.updated"

이 설정 이후 각 에이전트의 처리 순서가 명확히 보장되었고, MQ 지연률은 60% 이상 개선되었다. 하루 평균 번역 처리량은 약 18만 건, 품질 점검 루프는 2만 건 수준에서 안정적으로 유지되고 있다.

9. 품질 보고 자동화 및 운영 피드백

Translator-Agent는 모든 번역 결과와 품질 점수를 요약해 Telegram으로 자동 보고한다. Ops-Agent는 /quality 명령으로 지난 24시간의 번역 통계를 텍스트로 출력한다. 품질 저하나 모델 응답 지연이 감지되면 자동 재시작이 수행된다.

*Translator-Agent Report*
Processed: 183,412 items
Average BLEU: 0.81
Rewrites: 2,948
Human Review Pending: 14,672
Failures: 46
Skipped (duplicate): 5,130
Cache Hit Rate: 96.2%

10. 결론 및 현재 상태

Translator-Agent의 도입 이후 수동 번역 프로세스는 완전히 제거되었다. AI는 크롤링된 원문 데이터를 수집하고, 자체적으로 번역, 검증, 보정, 저장, 품질 평가를 수행한다. MQ 이벤트를 통해 실시간으로 다른 시스템과 연동되며, 사람은 전체 번역의 8%에 해당하는 검수 후보만 확인하면 된다.

번역 품질은 언어별 BLEU 기준 0.8 이상을 유지 중이며, 캐시 일관성, 이벤트 동기화, 품질 자동보정 루프 모두 안정화되었다. Glossary에는 매주 약 200개의 신규 용어가 추가되고 있으며, 이는 Classifier-Agent가 감지한 오분류 사례에서 자동 추출된다. AI가 데이터를 번역하고, 품질을 측정하고, 스스로 개선하는 순환 구조가 완성되었다.

관련 글

Popular posts from this blog

11년의 무역 데이터가 AI를 만든다 , RAG 지식 베이스 구축 과정

AI를 제품에 넣겠다고 하면 대부분 두 가지 중 하나를 떠올린다. GPT를 fine-tuning하거나, RAG를 쓰거나. 우리는 RAG를 택했다. 이유가 있다. REINDEERS는 2015년 IMARKET Thailand 설립 이후 약 11년간 동남아시아에서 B2B 무역을 해왔다. 25,000건 이상의 거래, 4,300개 이상의 파트너, 4개국의 규제 데이터. 이 데이터가 우리의 경쟁력이다. 문제는 이 데이터를 AI가 활용할 수 있는 형태로 만드는 과정이 생각보다 훨씬 복잡했다는 거다. 이 글은 그 과정에 대한 기록이다. 한 가지를 먼저 밝히고 시작한다. 이 RAG 지식 베이스는 단순히 "챗봇이 무역 지식을 참조하는 데이터 창고"가 아니다. REINDEERS와 POP, DVRP는 지금 AI로 전환되는 구조 위에 올라서 있다. 사람은 전략과 방향을 결정하고, 실제 업무는 조직도 안에 등록된 AI Agent가 수행한다. 이 Agent들 , 구매 Agent, 물류 Agent, 통관 Agent, 재무 Agent , 이 사람 대신 판단을 내릴 때 "왜 이렇게 결정했는가"를 반드시 설명할 수 있어야 한다. 그 설명의 출처가 바로 이 RAG 지식 베이스다. 11년의 무역 데이터는 Agent가 환각 없이 결정을 내릴 수 있는 유일한 근거다. RAG를 선택한 이유 먼저 RAG(Retrieval-Augmented Generation)가 뭔지를 간단히 정리하자. LLM에 질문을 던질 때, 질문만 보내는 게 아니라 관련 데이터를 함께 보내는 방식이다. "태국산 베어링 수입 단가가 얼마야?"라고 물으면, 우리 데이터베이스에서 관련 거래 이력을 찾아서 LLM에 컨텍스트로 넘긴다. LLM은 그 컨텍스트를 바탕으로 답을 생성한다. Fine-tuning을 선택하지 않은 이유는 명확하다. 무역 데이터는 계속 바뀐다. 베어링 단가는 분기마다 변동한다. 태국 FDA 규제는 수시로 개정된다. 선사 운임은 매...

B2B 견적의 AI Agent화 , 고객사·공급사·포워더가 AI로 견적을 주고받는 구조

B2B 거래에서 견적은 단순한 가격표가 아니다. 바이어의 구매 이력, 공급사의 재고 상황, 물류 비용, 인코텀즈, 납기일, 결제 조건 , 이 모든 변수가 얽힌 협상의 산물이다. 현재 이 과정은 이메일과 전화, 스프레드시트로 이루어진다. 바이어가 RFQ를 보내면 공급사가 검토하고, 포워더에게 물류 견적을 받아 합산하고, 다시 바이어에게 회신한다. 건당 수일이 걸리는 이 과정을 AI Agent가 대신할 수 있다면 어떨까. REINDEERS는 이 구조를 설계하고 있다. 먼저 이 글의 전제를 분명히 한다. REINDEERS·POP·DVRP는 지금 AI로 전환되는 구조 위에 올라서 있다. 조직도 안에서 직원을 등록할 때 '사람', 'AI Agent', '로봇' 중에서 선택할 수 있고, 사람은 전략과 방향을 결정하고, 실제 업무는 조직도 안에 등록된 AI Agent가 수행한다. 이 글의 Buyer Agent / Supplier Agent / Forwarder Agent는 외부 AI 도구가 아니라, 각 회사의 조직도 안에 '구매팀 담당자', '영업팀 담당자', '물류팀 담당자'로 실제 등록되는 AI 직원이다. 사람 직원과 동일한 권한 모델, 동일한 예산 한도, 동일한 감사 로그 위에서 일한다. B2B 견적의 AI Agent 간 통신 시퀀스 # Buyer Agent → Supplier Agent → Forwarder Agent 1 RFQ 발송 → RFQ 수신 2 물류 견적 요청 → 요청 수신 3 견적 수신 ← 상품 견적 발송 4 물류 견적 수신 ← 물류 견적 발송 ★ 비교표 생성 → 담당자 승인 5 PO 발행 → 주문 확정 6 부킹 요청 → 부킹 확정 왜 견적에 AI Agent인가 견적 업무가 느린 이유는 복잡해서가 아니다. 반복적인 정보 수집과 조합이 사람의 시간을 잡아먹기 때문이다. 공급사 담당자가 바이어의 과거 주문 이력을 ...

Reindeers Workflow: B2B 파트너 업무 효율과 자동화를 위한 워크플로우 플랫폼

B2B 국제 무역에서 하나의 거래가 완료되기까지 관여하는 시스템과 사람의 수는 예상보다 훨씬 많다. 견적 요청에서 시작해 공급사 선정, 발주, 포워딩 비딩, 통관 서류 준비, 출하, 배송, 정산까지 — 각 단계마다 서로 다른 담당자가 서로 다른 도구에서 수작업을 반복한다. 이 현장에서 반복적으로 발생하는 비효율은 분명하다. 바이어가 견적을 확정하면 공급사에게 이메일이나 메신저로 직접 통보해야 하고, 결제가 완료되면 수동으로 정산 시트에 옮기면서 1~3일이 소요된다. 출하 후에는 선적 정보를 기반으로 CI, PL, CO를 수동 생성하며 누락이 발생하고, 배송 완료 후 공급사/포워더 정산을 수작업으로 대조하면서 오차가 누적된다. ERP, 이메일, 스프레드시트, CRM에 같은 데이터를 반복 입력하는 것도 일상이다. 이 문제들의 공통점은 명확하다. "이벤트가 발생했을 때 후속 작업이 자동으로 실행되지 않는다" 는 것이다. 견적이 확정되었다는 '사실'은 시스템에 기록되지만, 그 사실이 다음 단계의 업무를 자동으로 트리거하지는 않는다. Reindeers Workflow는 이 문제를 해결하기 위해 만들어졌다. 단순히 "자동화 도구를 제공한다"가 아니라, REINDEERS 플랫폼에서 발생하는 실제 거래 이벤트를 기반으로 후속 업무가 자동 실행되는 구조를 만드는 것이다. REINDEERS 플랫폼과의 연결: 거래 이벤트가 워크플로우를 트리거한다 Reindeers Workflow의 가장 중요한 차별점은 범용 자동화 도구가 아니라 REINDEERS 본 플랫폼의 거래 이벤트에 직접 연결 된다는 것이다. REINDEERS에서 발생하는 핵심 거래 이벤트가 MQ(Message Queue)를 통해 워크플로우의 트리거가 된다. 거래 이벤트 트리거되는 워크플로우 실행 내용 quote.confirmed 공...