RT-O9: 자연어 주문 파싱

🎯 자연어 주문 파싱이란?Free-text → Standard OrderRequest

B2B 영업 현장에서는 여전히 이메일 · 카카오톡 · 전화 음성으로 주문이 들어오는 비중이 크다. 운영자는 메시지를 읽고 SKU 코드를 찾고 수량·납기·주소를 OMS 화면에 다시 타이핑한다. RT-O9는 이 반복 작업을 제거하기 위해 LLM(JSON mode + few-shot) · Whisper STT(음성) · Pydantic 검증을 결합한 파이프라인을 구축한다.

입력 채널이 무엇이든 raw text로 변환한 뒤 LLM이 표준 OrderRequest JSON으로 추출하고, 모호한 필드는 사람에게 confirm 큐로 보낸다. SKU는 fuzzy 매칭으로 코드를 회수하고 주소는 행정구역 정규화로 정제한다. 5월 4주차 기준 자동화율 92%, 필드 F1 94%, 평균 처리 18초로 운영자 수동 입력 시간을 90% 이상 줄였다.

🧭 자연어 주문 파싱 파이프라인5 stages · raw text → 표준 OrderRequest
STEP 1
intake

이메일/채팅/음성에서 raw text 추출. 음성은 Whisper로 텍스트 변환, 첨부파일은 OCR/엑셀 파싱.

STEP 2
entity_extract

LLM JSON mode + NL_PARSE_PROMPT few-shot으로 sku_codes / quantities / delivery_date / ship_to_address 추출.

STEP 3
schema_validate

Pydantic 모델로 타입·범위 검증. 모호 필드(신뢰도 < threshold)는 confirm queue로 라우팅.

STEP 4
enrichment

SKU fuzzy 매칭(Levenshtein) 으로 정식 코드 회수, 주소는 geocode로 행정구역 정규화.

STEP 5
submit_order

표준 OrderRequest 생성 후 RT-O1 DOM으로 라우팅. PromiseLog에 자연어 원문도 함께 보관.

🐍 자연어 파싱 모델 (Python)
# 이메일/채팅 자연어 -> 구조화 주문 변환
NL_PARSE_PROMPT = """
다음 메시지에서 주문 정보를 추출하여 JSON으로 반환하세요.
필드: sku_codes, quantities, delivery_date, ship_to_address
메시지: {user_message}
"""

def parse_nl_order(message):
    response = openai.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": NL_PARSE_PROMPT.format(...)}],
        response_format={"type": "json_object"}
    )
    return json.loads(response.choices[0].message.content)

# Pydantic으로 타입 검증 + 모호 필드는 confirm 큐로
def validate_order(parsed):
    try:
        order = OrderRequest(**parsed)   # Pydantic 2.x
        return "ok", order
    except ValidationError as e:
        return "confirm", e.errors()

OpenAI response_format={type:json_object}로 항상 유효한 JSON을 강제하고, Pydantic이 한 번 더 타입을 검증한다. 검증 실패 시 errors[] 를 운영자 confirm UI에 그대로 노출해 어떤 필드가 모호한지 즉시 알린다.

➗ F1 점수 & 자동화율 정의per-field F1 평균 · automation_rate
parse_F1 = 2 · precision · recall / (precision + recall) per-field 평균
automation_rate = auto_complete / total_messages
# confirm/escalation 없이 표준 OrderRequest까지 자동 도달한 비율
sku .30sku_codes 추출 정확도. fuzzy 매칭 후 정식 코드와 일치 여부로 평가
qty .25quantities · SKU별 수량 매핑. 단위 추출(EA/박스/팔레트) 포함
date .20delivery_date · "다음주 화" / "25일 오전" 같은 상대 표현 → ISO 변환
addr .25ship_to_address · 행정구역 + 도로명/번지 정규화 후 geocode 일치 여부

예) "A-203 5박스, B-101 12개, 다음주 화요일까지 본사로 부탁" → sku=[A-203,B-101], qty=[5,12], date=2026-04-29, addr=본사주소 4필드 모두 정답. F1 = 1.0. 동일 메시지에서 주소만 "본사"로만 표기되면 addr 필드 confirm 큐로 라우팅 → 자동화 미달.

📡 입력 채널별 정확도 비교5월 누적 데이터 · N=22,400건
채널텍스트 정확도평균 처리시간모호 비율비고
Email96%12s8%형식적 · 첨부 엑셀 활용
KakaoTalk91%9s14%줄임말·이모지·맥락 의존
SMS88%6s22%짧은 단문 · 정보 누락 다수
음성(STT)84%22s19%Whisper · 번지/숫자 약점

이메일은 SKU 코드가 명시적이고 첨부 엑셀이 동반되는 경우가 많아 정확도가 가장 높다. 음성(STT)은 Whisper의 한국어 숫자/번지 인식 한계 때문에 모호 비율이 높지만, RT-O9는 confirm 큐로 흡수하므로 escalation은 1.6% 수준에 그친다.

참고문헌
[1] 김지훈, "자연어 주문 파싱 1차 보고서", IntraLogis 사내 보고서, 2026.05
[2] OpenAI, JSON Mode & Structured Outputs Documentation, 2024
[3] Radford, A. et al., "Robust Speech Recognition via Large-Scale Weak Supervision (Whisper)", OpenAI, 2022
[4] Pydantic Project, Pydantic 2.x Official Docs, 2025
[5] GS1, SKU 식별 표준 (GTIN/GLN), 2024
[6] 한국정보통신기술협회(TTA), 음성 데이터 표준 가이드라인, 2024