
Qwen에게 6개의 도구를 주었지만, 가격을 결정할 권한은 주지 않았다
요약
Qwen 모델을 활용하여 상업적 의사결정을 지원하는 교차 국경 커머스 에이전트 'QuoteX'의 설계 원칙을 소개합니다. 에이전트가 계획을 세우되, 데이터 검증과 최종 승인은 도구와 인간이 담당하도록 설계하여 신뢰성을 확보했습니다.
핵심 포인트
- Qwen이 계획을 세우고 검증된 도구가 사실을 결정하는 구조
- 불확실한 언어를 재고, 비용, 배송과 결부된 약속으로 변환하는 기술
- 도구 선택 권한과 상업적 결정 권한을 엄격히 분리
- 최대 4회의 플래너 턴으로 제한된 루프를 통한 안정적 실행
구매자가 메시지 하나를 보냅니다:
베를린 매장용 Grade-A 몽골 캐시미어 스카프 500개를 견적 내주세요. 세 가지 색상이 필요하며, 플라스틱 없는 포장, 21일 이내 DDP 인도, 운송비 USD 1,000 미만, 그리고 저희의 통상적인 결제 조건이 적용되어야 합니다.
이것은 단순한 글쓰기 작업처럼 보입니다. 하지만 실제로는 일련의 상업적 결정 과정입니다.
구매자가 의도한 제품은 무엇인가? 재고가 있는가? 구매자의 "통상적인" 조건은 무엇인가? 어떤 경로가 마감 기한을 맞출 수 있는가? 최종 가격이 마진을 보호하는가? 시스템이 제안서를 보낼 수 있는가?
위험한 부분은 문장을 이해하지 못하는 것이 아닙니다. 위험한 부분은 불확실한 언어를 재고, 돈, 배송이 결부된 약속으로 바꾸는 것입니다.
그것이 제가 Qwen Cloud Autopilot Agent 트랙을 위해 관리형 교차 국경 커머스 에이전트(governed cross-border commerce agent)인 QuoteX를 구축한 이유입니다.
그 핵심 규칙은 한 줄로 요약됩니다:
Qwen이 계획한다. 검증된 도구가 사실을 결정한다. 인간이 약속을 승인한다.
데모 시청
데모는 울란바토르에서 베를린으로 이어지는 실제 수출 시나리오를 따릅니다. 구매자의 메시지 하나가 근거 있는 $33,630의 도착 인도(landed) 제안, 고객에게 안전한 음성 답변, 그리고 캠페인 자산으로 변환됩니다. 시스템은 여전히 아무것도 보내기 전에 멈춥니다.
요청은 양식이 아니다
전통적인 영업 소프트웨어는 사람에게 10개의 필드를 채우도록 요청하는 것부터 시작합니다. 실제 구매자는 데이터베이스 행처럼 행동하지 않습니다. 그들은 이메일, 음성 메시지, 사진, 부분적인 사양, 그리고 "지난번과 동일하게"와 같은 문구를 보냅니다.
QuoteX는 판매자가 이미 있는 지점에서 시작합니다:
- 구매자 메시지 붙여넣기;
- 요청 사항 말하기;
- 제품 사진 업로드;
- 또는 새로운 품목을 대화하듯 설명하기.
Qwen이 언어를 구조화하지만, 추출된 필드는 편집 가능한 상태로 유지됩니다. 만약 중요한 사실이 누락되었다면, 에이전트는 조용히 사실을 지어내는 대신 해당 사실을 요청합니다.
6개의 도구, 3가지 종류의 권한
QuoteX는 qwen3.7-plus에게 6개의 엄격한 함수 도구(function tools)를 제공합니다:
structure_requestretrieve_customer_memorymatch_product_catalogselect_shipping_routecalculate_margin_safe_quoteenforce_approval_policy
에이전트(Agent)는 최대 4회의 플래너 턴(planner turns)을 갖는 제한된 루프(bounded loop) 내에서 실행됩니다. 각 턴마다 서버는 아직 완료되지 않은 기술(skills)만을 노출합니다. 독립적인 호출(Independent calls)은 동시에 실행될 수 있지만, 모든 결과는 타입이 지정된 신뢰할 수 있는 경계(typed, trusted boundary)를 통해 반환됩니다.
중요한 차이점은 **도구 선택(tool selection) 대 상업적 권한(commercial authority)**입니다:
| Qwen이 할 수 있는 것 | Qwen이 할 수 없는 것 |
|---|---|
| 구매자의 의도(intent)를 이해함 | SKU 또는 재고 수량을 임의로 생성함 |
| ... | ... |
오케스트레이션 루프(orchestration loop)는 의도적으로 작게 설계되었습니다. 이 발췌본은 실제 구현체를 단순화한 것입니다:
const MAX_PLANNER_TURNS = 4;
for (const call of qwenToolCalls) {
...
만약 Qwen이 도구를 누락하거나, 잘못된 형식의 인자(malformed arguments)를 반환하거나, 타임아웃이 발생하거나, 사용 불가능한 상태가 되면, QuoteX는 동일한 결정론적 도메인 코드(deterministic domain code)를 통해 누락된 단계를 완료합니다. QuoteX는 해당 실행을 guarded-fallback으로 라벨링하며, 복구 과정을 라이브 모델의 추론(reasoning)으로 제시하지 않습니다.
결정론적 계층(deterministic layer)이 보호하는 것
TypeScript 도메인 계층은 비즈니스에 비용 손실을 초래할 수 있는 사실(facts)을 관리합니다:
- 카탈로그 매칭 (Catalog matching): 별칭(aliases), 제품 용어, 명시적 의도(explicit intent), 그리고 문구 극성(phrase polarity)을 결합합니다.
- 메모리 검색 (Memory retrieval): 고객 범위 내로 제한되며, 관련성 순으로 순위가 매겨지고, 만료 기간이 있으며, 원래 요청과 연결됩니다.
- 배송 (Shipping): 목적지 지원 여부, 마감 기한, 비용, 신뢰성 및 승인된 선호도를 점수화합니다.
- 가격 책정 (Pricing): 할인, 단가, 상품 총액, 운임, 도착 총액(landed total), 매출 총이익(gross profit) 및 마진(margin)을 재계산합니다.
- 정책 (Policy): 모호성, 재고, 출처(provenance), 결제, 배송 가능성 및 마진을 확인합니다.
- 승인 (Approval): 항상
human-review-required(사람의 검토 필요) 단계에서 종료됩니다.
문구 극성(Phrase polarity)은 구매자가 다음과 같이 작성하기 전까지는 사소한 세부 사항처럼 들릴 수 있습니다:
60W 드라이버가 설치에 필수적인 경우가 아니라면, 전원 브릭(power brick)이 아닌 컨트롤러가 필요합니다.
Bag-of-words 매처(matcher)는 반복적으로 언급된 드라이버를 선택할 수 있습니다. QuoteX는 부정되거나 조건부인 대안에 페널티를 부여하고, 컨트롤러를 선택하며, 남아있는 모든 모호함을 에스컬레이션(escalate)합니다.
신뢰할 수 있는 카탈로그 일치 항목이 없는 경우, SKU는 CUSTOM-REVIEW가 됩니다. 그럴듯해 보이는 환각(hallucinated) SKU는 결코 허용 가능한 대체 수단이 될 수 없습니다.
증거는 제품의 일부입니다
대부분의 에이전트 데모는 자신감 넘치는 문단으로 끝납니다. QuoteX는 결정과 그 증거(receipts)로 끝납니다.
모든 스킬(skill)은 누가 그것을 선택했는지, 어떤 신뢰할 수 있는 결과를 생성했는지, 그리고 인간의 승인 단계(human gate)가 여전히 활성화되어 있는지를 노출합니다.
모든 실행에 대해 인터페이스는 다음을 보여줍니다:
- 실시간 Qwen 또는 가드된 복구(guarded recovery);
- 모델 및 엔드포인트 출처(provenance);
- 플래너(planner) 턴, 지연 시간(latency), 토큰 사용량;
- 6개의 스킬 호출 전체와 그 결정론적(deterministic) 출력;
- 선택된 SKU, 경로, 견적 산술(quote arithmetic) 및 리스크;
- 정제된 결정 증거에 대한 SHA-256 다이제스트(digest);
- 최종 승인 상태.
이를 통해 미묘한 실패를 가시화할 수 있습니다. 공급업체 중단 중에 생성된 올바른 견적은 여전히 유용할 수 있지만, 그것이 Qwen의 성공적인 추론인 것처럼 표현되어서는 안 됩니다.
Qwen 자체를 대상으로 아키텍처를 테스트했습니다
저는 안전성에 대한 이야기가 단지 아키텍처 다이어그램에만 존재하기를 원하지 않았습니다. 그래서 동일한 모델을 사용하는 적대적 평가기(adversarial evaluator)를 구축했습니다.
두 시스템 모두 동일한 qwen3.7-plus 모델, 고객, 카탈로그, 메모리, 운송(freight), 가격 책정 및 정책 컨텍스트를 전달받습니다:
- 직접적인 베이스라인(Direct baseline): Qwen이 하나의 구조화된 응답으로 최종 상업적 결정을 반환합니다.
- QuoteX: Qwen이 타입이 지정된 도구(typed tools)를 선택하며, 검증된 코드가 그 결과에 대한 소유권을 갖습니다.
여섯 가지 사례는 프롬프트 인젝션 (prompt injection), 부정된 대안 (negated alternatives), 재고 부족 (inventory shortfall), 알 수 없는 제품 (an unknown product), 안전하지 않은 마감 기한 (an unsafe deadline), 그리고 재구매자 기억 (repeat-buyer memory)을 테스트합니다. 각 사례는 SKU, 수량 (quantity), 단가 (unit price), 운임 (freight), 총액 무결성 (total integrity), 리스크 커버리지 (risk coverage), 그리고 인간의 승인 (human approval)이라는 7가지 사실을 점수화합니다.
| 아키텍처 (Architecture) | 결과 (Result) |
|---|---|
| QuoteX가 제어하는 Qwen 도구 에이전트 (QuoteX governed Qwen tool agent) | 42/42, 100% |
| ... |
제어된 여섯 가지 사례 모두 실제 Qwen을 사용했습니다. 직접적인 베이스라인 (direct baseline) 또한 여섯 가지 응답을 모두 반환했으므로, 제공자 측의 실패가 차이를 만든 것은 아닙니다.
이것은 6가지 사례에 대한 엔지니어링 평가이며, 프로덕션 정확도에 대한 주장이 아닙니다. 그 목적은 더 좁고 유용합니다: 실행 가능한 신뢰 경계 (executable trust boundaries)가 프롬프트 지시문 (prompt instructions)만 사용하는 것보다 정확한 상업적 사실을 더 잘 보호하는지 테스트하는 것입니다.
전체 프로토콜, 사례별 결과 및 한계점 (protocol, per-case results, and limitations)은 공개되어 있습니다.
평가자가 나의 버그를 찾아냈다
첫 번째 실행 결과는 42/42가 아니었습니다.
그 과정에서 QuoteX의 두 가지 권한 누출 (authority leaks)이 드러났습니다:
- 수량 표현식이 그룹화된 쉼표를 지원하지 않았기 때문에, 파서 (parser)가
1,500을1로 읽었습니다. - Qwen이 메모리 검색 (memory-search) 문구를 충분히 확장하여, 관련 없는 선호도가 할인에 영향을 미치게 만들 수 있었습니다.
나는 그룹화된 숫자 파싱을 수정하고 회귀 테스트 (regression test)를 추가했습니다. 또한 메모리 경계 (memory boundary)를 변경했습니다: Qwen이 검색 (retrieval)을 요청할 수는 있지만, 구매자의 원래 메시지만이 관련성을 확립할 수 있습니다. 이제 선호도 증폭 (preference boosts)에는 증거의 중첩 (evidence overlap)이 필요합니다.
제어된 점수는 40/42에서 42/42로 이동했습니다.
그 이력은 완벽한 숫자보다 더 중요합니다. 평가자는 제출물을 꾸미기 위한 장식이 아니었습니다; 그것은 시스템을 변화시켰습니다.
하나의 검증된 기록, 여러 개의 유용한 출력물
QuoteX는 멀티모달 (multimodal)이지만, 각 서비스는 별개의 API 데모로 표시되기보다는 하나의 비즈니스 목표에 연결되어 있습니다:
- Qwen3-ASR-Flash는 판매자와 고객의 음성을 전사 (transcribe) 합니다.
- Qwen structured conversation은 편집 가능한 제품 정보 입력 (product intake) 양식을 채웁니다.
- Qwen vision은 업로드된 제품 사진을 바탕으로 크리에이티브 브리프 (creative brief)의 근거를 마련합니다.
- Qwen Image / Wan은 상업용 제품 편집물을 생성합니다.
- HappyHorse는 승인된 캠페인 프레임을 애니메이션화합니다.
- Qwen Voice Design 및 Qwen TTS는 재사용 가능한 고객-어시스턴트 음성을 제공합니다.

캠페인은 단절된 프롬프트 (prompt)가 아니라, 동일하게 검증된 제품 및 오퍼 (offer) 컨텍스트로부터 도출됩니다.
Amazon, eBay, Alibaba.com 어댑터 또한 채널별 제목 제한, 상태 매핑 (condition mappings), 누락된 필드 경고, 그리고 구조화된 페이로드 (structured payloads)를 포함하여 검증 우선 방식의 리스팅 초안을 생성합니다.
마켓플레이스 OAuth 및 인간의 승인이 구현될 때까지 게시 (publishing) 기능은 비활성화 상태로 유지됩니다. 게시하는 척하는 버튼을 만드는 것은 데모를 더 커 보이게 만들 수는 있겠지만, 엔지니어링 측면에서 정직하지 못한 방식이 될 것입니다.
로컬 프로토타입에서 Alibaba Cloud로
브라우저 애플리케이션은 GitHub Pages를 통해 서비스됩니다. 모든 보호된 API, 상업적 결정, 그리고 Qwen 호출은 도쿄에 위치한 Alibaba Cloud Function Compute 백엔드에서 실행됩니다.
배포된 심사 경로 (judge path)와 내구성이 있는 운영 경로 (durable production path)를 별도로 표시하여, 다이어그램이 실제 인프라를 과장하여 주장하지 않도록 했습니다.
배포 경로는 슬라이드가 아니라 실행 가능한 것입니다:
- 공식 FC3 SDK가 함수(function)와 HTTP 트리거(trigger)를 생성하거나 업데이트합니다.
- 커스텀 런타임 (custom-runtime) ZIP 파일이 경량화된 퍼블릭 저지(public judge) 배포를 제공합니다.
- 엄격한 CORS 설정으로 브라우저 오리진(origin)만 허용합니다.
- 보호된 경로(protected routes)를 통해 Qwen 인증 정보를 Function Compute에 유지합니다.
- 구조화된 로그(structured logs)는 Function Compute 요청 및 리전(region) 컨텍스트를 포함합니다.
- 상태(health) 및 스모크 테스트(smoke tests)를 통해 실제 퍼블릭 경계를 검증합니다.
현재의 퍼블릭 저지(public judge) 배포는 의도적으로 제한된 인메모리 어댑터(in-memory adapter)를 사용하며 durable: false를 보고합니다. 로컬 개발에는 SQLite를 사용합니다. 체크인된 프로덕션 경로는 목록 및 실행 증거를 위한 Alibaba Tablestore, 제품 미디어를 위한 프라이빗 OSS, 로그를 위한 SLS, 그리고 최소 권한 원칙을 따르는 RAM 실행 역할(execution role)을 프로비저닝합니다.
그러한 차이점은 배포 증거가 단순히 다이어그램이 약속하는 것이 아니라, 실제로 무엇이 실행되고 있는지를 설명해야 하기 때문에 명확히 드러납니다.
Function Compute 배포 모듈과 정제된 런타임 증거는 모두 저장소에 포함되어 있습니다.
직접 시도하거나 살펴보기
- 라이브 애플리케이션: mongonsh.github.io/QuoteX
- 데모 영상:
- 소스 코드: github.com/mongonsh/QuoteX
- 아키텍처: 소스, PNG, SVG 및 편집 가능한 Excalidraw 파일
- 평가: 방법론 및 한계점
- Alibaba 배포 증거: FC3 배포 코드
GitHub logo mongonsh / QuoteX
QuoteX
국경 간 판매 팀을 위한 관리형 RFQ 자율 주행 시스템
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기