프롬프트, 도구, 테스트, 사람 검토 등을 통해 LLM이 비즈니스 규칙을 해석하고 워크플로 상태를 추적하며 결정을 검증하는 방법을 알아보세요. 단순 코드가 아닌 전반적 시스템 설계 관점에서 설명합니다.

사람들이 LLM이 “비즈니스 규칙을 추론할 수 있나?”라고 물을 때, 대개는 단순히 if/else 문을 작성할 수 있느냐 이상의 것을 의미합니다. 비즈니스 규칙 추론은 정책을 일관되게 적용하고, 결정을 설명하며, 예외를 처리하고, 특히 입력이 불완전하거나 지저분하거나 변하는 상황에서 현재 워크플로 단계와 정렬된 상태를 유지하는 능력입니다.
코드 생성은 주로 대상 언어의 유효한 구문을 생성하는 문제입니다. 규칙 추론은 의도를 보존하는 문제입니다.
모델은 완벽하게 유효한 코드를 생성해도 잘못된 비즈니스 결과를 낼 수 있습니다. 그 이유는:
다시 말해, 정답은 "컴파일 되느냐"가 아니라 "비즈니스가 매번 결정할 결과와 일치하느냐, 그리고 이를 증명할 수 있느냐"입니다.
LLM은 정책을 구조화된 규칙으로 번역하고, 결정 경로를 제안하며, 사람을 위한 설명 초안을 작성하는 데 도움을 줄 수 있습니다. 그러나 어떤 규칙이 권위 있는지, 어떤 데이터 소스를 신뢰해야 하는지, 사례가 현재 어떤 단계에 있는지는 자동으로 알지 못합니다. 제약이 없으면 그들은 그럴듯한 답을 자신있게 선택할 수 있습니다—정해진 규칙 대신에요.
따라서 목표는 "모델에게 모든 결정을 맡기는 것"이 아니라, 모델이 신뢰할 수 있게 보조할 수 있도록 구조와 검사 장치를 제공하는 것입니다.
실용적인 접근은 다음과 같은 파이프라인처럼 보입니다:
이것이 영리한 코드 스니펫과 실제 비즈니스 결정을 지원할 수 있는 시스템의 차이입니다.
LLM이 "추론"을 어떻게 다루는지 이야기하기 전에 팀들이 자주 함께 묶는 두 가지를 분리해 보면 도움이 됩니다: 비즈니스 규칙과 워크플로.
비즈니스 규칙은 조직이 일관되게 적용되기를 원하는 결정 문장들입니다. 정책과 로직으로 나타나며 예를 들면:
규칙은 보통 "IF X THEN Y" 형태로 표현되고(때로는 예외 포함), 명확한 결과를 만들어야 합니다: 승인/거부, 가격 A/가격 B, 추가 정보 요청 등.
워크플로는 작업을 시작에서 끝으로 이동시키는 프로세스입니다. 무엇이 허용되는지보다 다음에 무엇이 일어나는지에 관한 것입니다. 워크플로는 보통 다음을 포함합니다:
환불 요청을 상상해 보세요.
규칙 예시: “구매일로부터 30일 이내에는 환불 가능. 예외: 디지털 다운로드는 접근한 이후 환불 불가. 예외: 차지백은 반드시 에스컬레이션.”
워크플로 예시:
규칙은 서로 충돌할 때(“VIP 고객은 언제나 환불” vs. “디지털 다운로드는 절대 환불 불가”), 문맥이 없을 때(다운로드가 되었는가?), 또는 엣지 케이스(번들, 부분 환불, 지역 법률)를 숨길 때 까다로워집니다. 워크플로는 또 다른 층을 더합니다: 결정은 현재 상태, 이전 조치, 마감일과 일치해야 합니다.
LLM은 사람이 규칙을 이해하는 방식으로 "이해"하지 않습니다. 대량의 텍스트에서 학습한 패턴을 바탕으로 다음에 올 단어를 생성합니다. 그래서 LLM은 추측할 때조차 설득력 있게 들릴 수 있고, 제공되지 않은 세부 사항을 조용히 채워 넣을 수 있습니다.
이 한계는 워크플로와 결정 로직에서 중요합니다. 모델은 실제 정책에 예외가 있는 경우에도 규칙을 "항상" 적용해야 한다고 잘못 적용할 수 있습니다(예: "직원은 항상 관리자 승인 필요" vs. 실제 정책: "오직 $500 초과 시"). 이것은 흔한 실패 모드입니다: 자신감은 있지만 잘못된 규칙 적용.
실제 이해가 없어도 LLM은 구조화된 어시스턴트로 다루면 도움이 됩니다:
핵심은 모델이 쉽게 자신만의 해석으로 벗어나지 못하게 만드는 위치에 두는 것입니다.
모호성을 줄이는 실용적 방법은 출력 제약입니다: 모델이 고정된 스키마나 템플릿(예: 특정 필드를 가진 JSON 또는 필수 열이 있는 표)으로 응답하게 요구합니다. 모델이 rule_id, conditions, exceptions, decision 같은 필드를 채워야 할 때, 빈틈을 발견하고 자동으로 검증하기가 쉬워집니다.
제한된 형식은 모델이 잘 모를 때 명확히 드러나게도 합니다. 필수 필드가 누락되면 추후 질문을 강제하여 불확실한 답을 수락하는 대신 추가 입력을 요구할 수 있습니다.
핵심 요점: LLM "추론"은 구조에 의해 안내되는 패턴 기반 생성으로 보는 것이 가장 합리적입니다—규칙을 조직하고 교차검증하는 데 유용하지만, 이를 무오류의 결정을 내리는 기계로 취급하면 위험합니다.
정책 문서는 사람을 위해 작성되어 목표, 예외, "상식"을 같은 단락에 섞어 놓습니다. LLM은 그 텍스트를 요약할 수 있지만, 정책을 명시적이고 테스트 가능한 입력으로 변환하면 모델이 규칙을 더 신뢰성 있게 따릅니다.
좋은 규칙 표현은 두 가지 특성이 있습니다: 모호성이 없고, 검증 가능하다는 점입니다.
다음과 같이 테스트할 수 있는 문장으로 규칙을 작성하세요:
규칙은 모델에 여러 형식으로 제공될 수 있습니다:
실제 정책은 충돌합니다. 두 규칙이 다를 때 모델은 명확한 우선순위 체계가 필요합니다. 일반적인 접근 방식:
충돌 규칙을 직접 명시하거나(예: priority: 100으로 인코딩) 하지 않으면 LLM은 규칙들을 "평균"내어 적용할 수 있습니다.
원문 정책 텍스트:
“연간 플랜은 30일 이내 환불 가능. 월간 플랜은 7일 이후 환불 불가. 계정에 사기 흔적이나 과도한 차지백이 있으면 환불 금지. 엔터프라이즈 고객의 환불은 $5,000 초과 시 재무 승인 필요.”
구조화된 규칙 (YAML):
rules:
- id: R1
statement: "IF plan_type = annual AND days_since_purchase <= 30 THEN refund MAY be issued"
priority: 10
- id: R2
statement: "IF plan_type = monthly AND days_since_purchase > 7 THEN refund MUST NOT be issued"
priority: 20
- id: R3
statement: "IF fraud_flag = true OR chargeback_rate = excessive THEN refund MUST NOT be issued"
priority: 100
- id: R4
statement: "IF customer_tier = enterprise AND refund_amount > 5000 THEN finance_approval MUST be obtained"
priority: 50
conflict_resolution: "Higher priority wins; MUST NOT overrides MAY"
이제 모델은 무엇이 중요한지 추측하는 대신 검토하고 테스트하고 버전 관리할 수 있는 규칙 집합을 적용합니다.
워크플로는 단순한 규칙 집합이 아니라 이전 단계가 다음에 일어날 일을 바꾸는 이벤트 순서입니다. 그 "메모리"가 바로 상태(state): 사례에 대한 현재 사실들(누가 무엇을 제출했는지, 무엇이 이미 승인되었는지, 무엇이 대기 중인지, 어떤 마감이 적용되는지)입니다. 상태를 명시적으로 추적하지 않으면 워크플로는 예측 가능한 방식으로 깨집니다—중복 승인, 필요한 검사 건너뛰기, 결정 역전, 또는 모델이 이미 일어난 일을 신뢰할 수 없어서 잘못된 정책 적용 등.
상태를 워크플로의 점수판으로 생각하세요. 현재 우리가 어디에 있고 무엇이 완료되었고 다음에 무엇이 허용되는지에 답합니다. LLM에게 명확한 상태 요약을 제공하면 과거 단계를 다시 심의하거나 추측하는 것을 방지할 수 있습니다.
모델을 호출할 때 사용자 요청과 함께 간결한 상태 페이로드를 포함하세요. 유용한 필드는:
manager_review: approved, finance_review: pending)모든 과거 메시지를 쏟아붓는 것을 피하세요. 대신 현재 상태와 주요 전환에 대한 짧은 감사 기록을 제공하세요.
워크플로 엔진(데이터베이스, 티켓 시스템, 오케스트레이터)을 단일 진실 공급원으로 취급하세요. LLM은 그 시스템에서 상태를 읽고 다음 행동을 제안해야 하며, 시스템이 전환을 기록하는 권위자가 되어야 합니다. 이렇게 하면 모델의 설명과 현실이 엇갈리는 "상태 드리프트"를 줄일 수 있습니다.
{
"request_id": "TRV-10482",
"workflow": "travel_reimbursement_v3",
"current_step": "finance_review",
"step_status": {
"submission": "complete",
"manager_review": "approved",
"finance_review": "pending",
"payment": "not_started"
},
"actors": {
"employee_id": "E-2291",
"manager_id": "M-104",
"finance_queue": "FIN-AP"
},
"amount": 842.15,
"currency": "USD",
"submitted_at": "2025-12-12T14:03:22Z",
"last_state_update": "2025-12-13T09:18:05Z",
"flags": {
"receipt_missing": false,
"policy_exception_requested": true,
"needs_escalation": false
}
}
이런 스냅샷이 있으면 모델은 일관성을 유지할 수 있습니다: 관리자 승인을 다시 묻지 않고, 재무 검토에 집중하며, 현재 플래그와 단계에 근거해 결정을 설명할 수 있습니다.
좋은 프롬프트는 단지 답을 묻는 것이 아니라 모델이 규칙을 어떻게 적용하고 결과를 어떻게 보고해야 하는지에 대한 기대를 설정합니다. 목표는 반복 가능한 결정이며, 창의적인 문구가 아닙니다.
모델에 프로세스에 연결된 구체적인 역할을 부여하세요. 세 가지 역할이 함께 잘 작동합니다:
이들 역할을 순차적으로 수행하거나("분석가 → 검증자 → 대행자") 하나의 구조화된 응답에 모두 요청할 수 있습니다.
"연쇄 사고(chain-of-thought)"를 요청하는 대신, 보이는 단계와 산출물을 명시하세요:
이것은 모델을 정리되게 유지하면서 어떤 규칙이 사용되었고 어떤 결과가 도출되었는지에 집중하게 합니다.
자유 서식 설명은 흐트러지기 쉽습니다. 사용된 출처를 가리키는 간결한 근거를 요구하세요:
이렇게 하면 리뷰가 빨라지고 이견이 생겼을 때 디버깅이 쉬워집니다.
항상 고정된 템플릿을 사용하세요:
템플릿은 모호성을 줄이고 모델이 확정 행동을 취하기 전에 공백을 드러내도록 유도합니다.
LLM은 핵심 사실이 빠졌을 때도 설득력 있는 답을 쓸 수 있습니다. 초안 작성에는 유용하지만, 비즈니스 규칙 결정에는 위험합니다. 모델이 계정 상태, 고객 등급, 지역 세율, 한도 초과 여부 등을 추측해야 한다면, 자신있게 보이는 오류가 발생합니다.
도구는 이를 해결합니다: “먼저 증거를 가져오고, 그다음 결정한다”는 두 단계 프로세스로 "추론"을 바꿉니다.
규칙 및 워크플로 중심 시스템에서 몇 가지 간단한 도구가 대부분 일을 처리합니다:
핵심은 모델이 운영적 사실을 "지어내지" 않고 요청한다는 점입니다.
모든 정책을 중앙 저장소에 두더라도 현재 사례에 관련된 조각만 프롬프트에 붙이는 것이 좋습니다. 예:
이렇게 하면 모순이 줄고, 오래된 규칙이 문맥 안에 있어서 모델이 그것을 따라가는 일이 줄어듭니다.
신뢰 가능한 패턴은 도구 결과를 모델이 인용해야 하는 증거로 다루는 것입니다. 예시:
get_account(account_id) → status="past_due", plan="Business", usage_this_month=12000retrieve_policies(query="overage fee Business plan") → 규칙 반환: “Overage fee applies above 10,000 units at $0.02/unit.”calculate_overage(usage=12000, threshold=10000, rate=0.02) → $40.00이제 결정은 추측이 아닙니다: 특정 입력(“past_due”, “12,000 units”, “$0.02/unit”)에 근거한 결론입니다. 이후 감사할 때 어떤 사실과 어떤 규칙 버전이 사용되었는지 정확히 볼 수 있어 잘못된 부분을 바로 고칠 수 있습니다.
자유 서식 텍스트는 유연하지만 워크플로가 깨지기 쉬운 방식입니다. 모델은 자동화가 불가능한 "괜찮아 보이는" 답을 줄 수 있습니다. 제약된 출력은 결정을 예측 가능한 형태로 강제하여 문제를 줄입니다.
한 가지 실용적 패턴은 모델이 시스템이 파싱하고 라우팅할 수 있는 단일 JSON 객체로 응답하도록 요구하는 것입니다:
{
"decision": "needs_review",
"reasons": [
"Applicant provided proof of income, but the document is expired"
],
"next_action": "request_updated_document",
"missing_info": [
"Income statement dated within the last 90 days"
],
"assumptions": [
"Applicant name matches across documents"
]
}
이 구조는 모델이 완전히 결정을 내리지 못할 때도 출력을 유용하게 만듭니다. missing_info와 assumptions는 불확실성을 숨긴 추측이 아니라 실행 가능한 후속 조치로 바꿉니다.
변동성을 줄이려면 주요 필드에 대해 허용값(Enums)을 정의하세요. 예:
decision: approved | denied | needs_reviewnext_action: approve_case | deny_case | request_more_info | escalate_to_humanEnum을 사용하면 다운스트림 시스템이 동의어, 구두점, 톤을 해석할 필요 없이 알려진 값으로 분기할 수 있습니다.
스키마는 가드레일 역할을 합니다. 그들은:
reasons를 통해 결정 이유를 감사하기 쉽게 합니다.decision과 next_action으로부터 큐, 알림, 작업 생성 등을 직접 트리거할 수 있어 자동화를 신뢰할 수 있게 합니다.결과적으로 모호성이 줄고 엣지 케이스 실패가 적어지며 워크플로가 일관되게 진행됩니다.
잘 설계된 프롬프트도 규칙을 위반하거나 필수 단계를 건너뛰거나 값을 지어낼 수 있습니다. 검증은 그럴듯한 답변을 신뢰 가능한 결정으로 바꾸는 안전망입니다.
모델이 어떤 결정을 내리기 전에 필요한 최소 정보를 가지고 있는지 확인하세요. 사전 점검은 모델이 결정을 내리기 전에 수행되어야 합니다.
일반적인 사전 점검 항목: 필수 필드(고객 유형, 주문 총액, 지역), 기본 형식(날짜, ID, 통화), 허용 범위(음수가 아닌 금액, 백분율은 100% 이내). 문제가 있으면 명확하고 실행 가능한 오류를 반환하세요("'region' 누락; 어떤 세금 규칙을 선택할지 결정할 수 없음").
모델이 결과를 낸 후에는 그 결과가 규칙 집합과 일관되는지 검증하세요.
중점 항목:
첫 답변을 재평가하는 "2차 패스"를 추가하세요. 이 단계는 다른 모델 호출이 될 수도 있고, 동일 모델에 규정 준수만 점검하도록 한 프롬프트를 사용하는 방식일 수도 있습니다.
간단한 패턴: 1차에서 결정 + 근거를 생성하고, 2차에서 valid 또는 누락/위반 사항의 구조화된 목록을 반환합니다.
모든 결정에 대해 사용된 입력, 규칙/정책 버전, 검증 결과(2차 패스 포함)를 기록하세요. 문제가 발생하면 정확한 조건을 재현하고 규칙 매핑을 수정하며 수정 확인을 할 수 있습니다—모델이 "무슨 의도였는지" 추측할 필요 없이요.
LLM 기반 규칙/워크플로 기능 테스트는 "무엇을 생성했나?"가 아니라 "신중한 사람이 예상하는 동일한 결정을, 올바른 이유로, 매번 내리는가?"입니다. 좋은 소식은 전통적인 결정 로직에 적용하는 같은 엄격함으로 테스트할 수 있다는 점입니다.
각 규칙을 함수처럼 취급하세요: 입력이 주어졌을 때 반환해야 할 결과를 단언합니다.
예: "미개봉 품목은 30일 이내 환불 가능" 규칙의 포커스 테스트:
이런 단위 테스트는 오프바이원 오류, 필드 누락, 모델의 "도움주려는" 동작(알 수 없는 값을 채우려 함)을 잡습니다.
워크플로는 상태가 단계 사이에서 일관되지 않을 때 실패합니다. 시나리오 테스트는 실제 여정을 시뮬레이션합니다:
목표는 모델이 현재 상태를 존중하고 허용된 전환만 수행하는지 검증하는 것입니다.
실제 익명 사례와 합의된 결과(그리고 간단한 근거)를 포함한 큐레이션된 데이터셋을 만드세요. 버전 관리하고 정책이 변경될 때마다 검토하세요. 작더라도(100–500 케이스) 현실의 지저분함을 반영하는 골드셋은 강력합니다—누락 데이터, 특이한 문구, 경계 결정 등을 포함하니까요.
결정 분포와 품질 신호를 시간에 따라 추적하세요:
모니터링을 안전한 롤백과 결합하세요: 이전 프롬프트/규칙 팩을 보관하고, 새 버전에 기능 플래그를 적용하며, 지표가 악화되면 신속히 되돌릴 수 있도록 하세요. 운영 플레이북과 릴리즈 게이팅은 /blog/validation-strategies를 참조하세요.
위에 설명한 패턴을 구현하면 모델 주위에 작은 시스템을 구축하게 됩니다: 상태 저장, 도구 호출, 검색, 스키마 검증, 워크플로 오케스트레이션. Koder.ai는 이런 워크플로 기반 어시스턴트를 더 빠르게 프로토타입하고 배포할 수 있게 해주는 실용적인 방법입니다: 채팅으로 워크플로를 설명하면 작동하는 웹앱(React)과 백엔드 서비스(Go + PostgreSQL)를 생성하고, 스냅샷과 롤백으로 안전하게 반복할 수 있습니다.
이것이 비즈니스 규칙 추론에서 중요한 이유는 "가드레일"이 종종 프롬프트가 아니라 애플리케이션에 존재하기 때문입니다:
LLM은 일상적인 정책 적용에 놀랍도록 유용할 수 있지만, 결정론적 규칙 엔진과 동일하다고 보지는 마세요. 이들을 가드레일이 필요한 결정 어시스턴트로 취급하고 최종 권한자로 보지 마십시오.
규칙이 많은 워크플로에서는 세 가지 실패 모드가 반복적으로 나타납니다:
다음 상황에서는 반드시 검토를 추가하세요:
모델이 "무언가를 지어내는" 것을 막기 위해 명확한 다음 단계를 정의하세요:
다음에 대부분 답이 "예"이면 규칙이 많은 워크플로에서 LLM을 사용하세요:
그렇지 않다면, 이러한 제어장치가 생길 때까지 LLM을 초안/보조 역할에만 두세요.