링크알파
경력근거: Map LinqAlpha's product workflows from the end user's perspective
링크알파는 FDE 에게 "좋아 보인다"가 아니라 고객의 실제 데이터 분포 위에서 변경 효과를 검증하고 그 검증을 토대로 제품을 쌓으라고 명시합니다. 프롬프트·도구 정책·모델·라우팅을 코드 배포 없이 설정으로 조립하고 초안을 시뮬레이션한 뒤 배포하는 사이클을 실제로 운영하며, 스트리밍으로 체감 지연을 다루는 감각을 자격요건으로 걸어 둡니다. 이 도구는 그 사이클에서 시뮬레이션 자리를 맡습니다. 계약된 고객사가 내려준 사용 내역 추출본을 받아, 검토 중인 라우팅 규칙을 과거 요청에 되돌려 돌려 월 비용과 응답 지연이 각각 얼마나 달라지는지 산식과 숫자로 답하고, 비용은 줄지만 첫 조각 지연이 무너지는 변경을 손해로 잡아냅니다. 요청 유형 구분과 계약 단가·목표 지연은 고객사 자료가 있어야 의미가 생겨, 일반 비용 계산기 맥락으로는 그대로 만들 수 없습니다. 다만 이 포트폴리오가 보여주는 것은 지저분한 업무 파일 정규화와 비용·지연 재계산이라는 엔지니어링 기술이며, buy/sell-side 리서치의 금융 도메인 전문성은 주장하지 않습니다.
"좋아 보인다"가 아니라 고객사의 실제 요청 분포 위에서 변경이 무엇을 얼마나 바꾸는지 수치로 보이는 것이 채용 기준입니다. 변경안을 과거 요청에 되돌려 돌려 비용·지연 차이를 산식으로 답하는 것이 이 포트폴리오의 골조입니다.
프롬프트·도구 정책·모델·라우팅을 코드 배포 없이 설정으로 조립하고, 초안을 시뮬레이션한 뒤 배포하는 사이클을 씁니다. 이 도구는 그 사이클의 시뮬레이션 자리를 맡아 고객·맥락별 분기 규칙이 비용·지연에 미치는 영향을 먼저 계산합니다.
부분 결과를 SSE 로 스트리밍해 체감 지연을 줄이는 구조를 이해해야 합니다. 이 도구는 전체 응답 시간과 첫 조각까지의 지연을 따로 계산해, 배치·비스트리밍으로 내리면 비용은 줄어도 첫 조각 지연이 무너지는 지점을 숫자로 잡아냅니다.
기관투자자 고객사가 내려준 에이전트 사용 내역 엑셀을 입력으로 받는 CLI입니다. 소계 행·쉼표 숫자·한글 모델 별칭이 섞인 추출본을 요청 유형별로 정규화한 다음, 검토 중인 라우팅·도구 정책 변경안을 그 과거 요청에 되돌려 돌려 월 비용·응답 지연 P95·첫 조각 지연·도구 재시도 건수가 각각 얼마나 달라지는지 계산합니다. 결과는 터미널 요약 표와 고객사에 그대로 보낼 검토 리포트(change_review.md), 요청 단위 계산 내역(per_request.csv) 세 가지입니다. 숫자와 이득·손해 판정은 단가표와 산식이 결정하고, LLM 은 리포트 문장 초안과 가정 문구만 씁니다.
링크알파와 계약한 자산운용사의 리서치 오퍼레이션 담당자입니다. 사내 운용역에게서 "에이전트 응답이 느려졌다"는 말을, 재무팀에서는 "월 사용료가 왜 늘었냐"는 질문을 동시에 받고, 관리 화면에서 내려받은 사용 내역 엑셀 한 장을 앞에 둔 채 "짧은 질의만 가벼운 모델로 내리면 얼마가 줄고 응답은 얼마나 달라지는지"를 다음 회의 전에 숫자로 답해야 하는 사람입니다.
고객사 사용 내역 추출본을 요청 단위로 정규화하면, (a) 모델 단가표와 라우팅 규칙만으로 변경 후 비용·지연을 결정론적으로 다시 계산하고, (b) 요청 유형별 차이를 산식과 근거 행 인용으로 풀어 설명하며, (c) 계산에 필요한 값이 빠진 행을 이득으로 세지 않고 계산 불가로 분리해 결론이 부풀지 않게 지킬 수 있습니다.
고객사 사용 내역 엑셀을 요청 유형별로 정규화하고, 변경안을 적용해 월 비용·응답 지연 P95·첫 조각 지연·재시도 건수의 차이를 산식을 붙여 계산해 터미널 표와 change_review.md·per_request.csv 로 내는 CLI입니다. 사용 내역은 관리 화면 추출본을 가정한 합성 엑셀로 시작하고, 실 사용 로그·관측성 export 연결은 3주차로 둡니다.
4주치를 앞 3주·뒤 1주로 나눠 앞 구간으로 예측한 비용·지연을 뒤 구간 실측과 대조해 오차를 붙이고, 단가와 토큰 분포를 흔들었을 때 이득이 손해로 뒤집히는 경계값을 함께 내는 검증 명령입니다.
계약 단가·요청 유형 분류·목표 지연을 고객사 프로파일 파일로 분리해 다른 고객사 추출본에 같은 명령을 그대로 돌리고, 제품 사용 로그와 관측성 export(Datadog CSV) 를 입력 어댑터로 붙입니다. 계산 명령을 MCP 도구로도 노출해 에이전트가 직접 호출하게 둡니다.
고객사 한 달치 사용 내역 1,860행과 변경안 3안을 넣으면, 안별로 요청 유형 단위의 월 비용 차이와 응답 지연 P95 차이가 몇 초 안에 터미널 표와 change_review.md 로 나오는 걸 시연합니다.
일부러 만든 지저분한 입력 30종(소계·합계 행 섞임, 쉼표가 든 숫자 문자열, '3.2초' 형태의 지연 문자열, 한글 모델 별칭, 출력 토큰 결측, 단가가 없는 미계약 모델, 서로 겹쳐 도달할 수 없는 규칙)을 넣어도 출력 형식(JSON Schema)이 한 번도 안 깨지고, 계산에 필요한 값이 빠진 행은 이득으로 세지 않고 계산 불가로 빠집니다.
4주치 더미를 앞 3주·뒤 1주로 나눠 앞 구간 예측을 뒤 구간 실측과 대조하면, 월 비용 예측의 평균 절대 백분율 오차(MAPE, 예측이 실제에서 평균 몇 % 벗어났는지)가 약 8%, 응답 지연 P95 예측의 오차가 약 14% 입니다. 단, 데이터와 실측을 모두 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'임을 명시합니다.
진짜 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 합성 추출본 자가채점이며, 실제 오차는 링크알파의 실 사용 로그와 고객사 계약 단가가 있어야 측정 가능합니다. 이 도구는 그 자료를 받는 즉시 프로파일 파일만 바꿔 돌릴 수 있는 상태로 만듭니다.
이건 실 사용 로그·실 계약 단가 없이 혼자 만든 포트폴리오입니다. 모든 수치는 합성 추출본 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실자료 연결 준비 상태로 솔직히 설명합니다
정답 산식을 작성자가 정했으니 잘 맞는 게 당연합니다. 소계 행 혼입·쉼표 숫자·문자열 지연·한글 모델 별칭·출력 토큰 결측·미계약 모델·도달 불가 규칙 같은 하드 케이스를 더미에 일부러 섞어, 깨끗한 행만 통과시키는 게 아님을 보여줍니다.
과거 요청 분포가 다음 달에도 같으리라는 가정이 이 계산의 약점입니다. 실적 시즌이거나 새 자산군이 들어오면 요청 길이 분포가 흔들려 예측이 빗나갑니다. 단일 숫자만 내놓지 않고 단가·토큰 분포를 흔들었을 때 결론이 뒤집히는 경계값을 함께 냅니다.
이 포트폴리오가 보여주는 것은 지저분한 업무 파일을 정규화하고 비용·지연을 산식으로 다시 계산해 차이를 숫자로 답하는 엔지니어링 기술입니다. buy/sell-side 리서치의 금융 도메인 전문성은 포트폴리오로 증명되지 않으므로 주장하지 않으며, 그 깊이는 면접에서 모르면 모른다고 말하는 편이 낫습니다.
이 도구는 비용과 지연만 답하고 답변 품질은 답하지 않습니다. 가벼운 모델로 내렸을 때 인용·출처 정확도가 얼마나 떨어지는지는 별도 평가 체계의 몫이라 리포트 맨 앞에 그 한계를 적어 둡니다. 실제 도입 시에는 계약 단가·모델 처리 속도·요청 유형 분류를 고객사 실측으로 교체해야 합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사 담당자가 관리 화면에서 내려받은 한 달치 사용 내역 엑셀을 표로 옮긴 것입니다. 산식 엔진이 가장 먼저 읽는 입력이며, 소계 행·쉼표 숫자·문자열 지연·한글 모델 별칭·결측을 일부러 섞어 정규화가 실제로 도는지 확인합니다.
| row_type | request_id | ts | team | request_type | model_raw | model_id | input_tokens | output_tokens | tool_calls | tool_retries | latency_raw | first_chunk_ms | status |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| data | req_2101 | 2026-07-06T09:12 | 주식리서치팀 | market_brief | Sonnet 4.5 | claude-sonnet-4.5 | 12,400 | 1,800 | 3 | 0 | 8.4초 | 1,200 | ok |
| data | req_2102 | 2026-07-06T10:41 | 주식리서치팀 | earnings_qa | sonnet-4.5 | claude-sonnet-4.5 | 38,200 | 2,600 | 5 | 1 | 16.1초 | 2,400 | ok |
| data | req_2103 | 2026-07-06T11:03 | 퀀트팀 | ttsql | Haiku4.5 | claude-haiku-4.5 | 4,100 | 900 | 2 | 0 | 3.2초 | 700 | ok |
| data | req_2104 | 2026-07-06T14:20 | 대체투자팀 | dd_report | Opus 4.1 | claude-opus-4.1 | 96,300 | 7,400 | 9 | 2 | 72.5초 | 5,100 | ok |
| data | req_2105 | 2026-07-07T08:55 | 주식리서치팀 | market_brief | 소넷 | claude-sonnet-4.5 | 11,900 | 1,650 | 3 | 0 | 7.9초 | 1,150 | ok |
아래 JSON Schema 에 맞는 고객사 사용 내역 추출본 행 60개를 JSON 배열로 생성. 2026-07-06 ~ 2026-07-31 사이 근무일에 흩어지게 하고, 팀은 주식리서치팀·퀀트팀·채권팀·대체투자팀으로.
{"type":"object","properties":{"row_type":{"type":"string","enum":["data","subtotal"]},"request_id":{"type":"string"},"ts":{"type":"string"},"team":{"type":"string"},"request_type":{"type":["string","null"],"enum":["market_brief","earnings_qa","ttsql","dd_report",null]},"model_raw":{"type":"string"},"model_id":{"type":["string","null"]},"input_tokens":{"type":["string","number","null"]},"output_tokens":{"type":["string","number","null"]},"tool_calls":{"type":["number","null"]},"tool_retries":{"type":["number","null"]},"latency_raw":{"type":"string"},"first_chunk_ms":{"type":["number","null"]},"status":{"type":"string","enum":["ok","failed"]}},"required":["row_type","request_id","ts","team","model_raw","latency_raw","status"]}
요청 유형별 대략의 크기: ttsql 은 입력 3,000~8,000·출력 700~1,200, market_brief 는 입력 9,000~15,000·출력 1,400~2,000, earnings_qa 는 입력 20,000~45,000·출력 1,800~3,000, dd_report 는 입력 45,000~110,000·출력 4,500~8,000. 지연은 출력 토큰을 모델 처리 속도(하이쿠 320, 소넷 200, 오푸스 95 토큰/초)로 나눈 값에 1~3초 오버헤드를 더한 근사로.
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) row_type=subtotal 인 소계·합계 행 4개 이상(계산에서 빠져야 함), (2) 같은 모델의 표기 별칭 4종 이상('Sonnet 4.5'/'sonnet-4.5'/'소넷'/'SONNET4.5'), (3) model_id=null 인 미계약 모델 2건, (4) output_tokens 또는 latency_raw 가 비어 있는 결측 3건, (5) 숫자가 쉼표 든 문자열인 행과 순수 숫자인 행을 섞기, (6) status=failed 이면서 재시도가 3회인 행 2건, (7) 첫 조각 지연만 유난히 큰 스트리밍 스톨 행 1건. JSON 배열만.{"type":"object","properties":{"row_type":{"type":"string","enum":["data","subtotal"]},"request_id":{"type":"string"},"ts":{"type":"string"},"team":{"type":"string"},"request_type":{"type":["string","null"],"enum":["market_brief","earnings_qa","ttsql","dd_report",null]},"model_raw":{"type":"string"},"model_id":{"type":["string","null"]},"input_tokens":{"type":["string","number","null"]},"output_tokens":{"type":["string","number","null"]},"tool_calls":{"type":["number","null"]},"tool_retries":{"type":["number","null"]},"latency_raw":{"type":"string"},"first_chunk_ms":{"type":["number","null"]},"status":{"type":"string","enum":["ok","failed"]}},"required":["row_type","request_id","ts","team","model_raw","latency_raw","status"]}고객사 계약에 걸린 모델 단가와 처리 속도표입니다. 비용 산식의 단가와 지연 산식의 초당 처리 토큰이 여기서 나오며, 단가가 비어 있는 미계약 모델은 계산 불가로 빠지는 근거가 됩니다.
| model_id | aliases | in_price_krw_per_1m | out_price_krw_per_1m | out_tokens_per_sec | streaming | contracted |
|---|---|---|---|---|---|---|
| claude-haiku-4.5 | ["Haiku4.5","haiku 4.5","하이쿠"] | 1,400 | 6,900 | 320 | true | true |
| claude-haiku-4.5-batch | ["haiku batch"] | 700 | 3,450 | 110 | false | true |
| claude-haiku-4.5-long | ["haiku long context"] | 2,800 | 13,800 | 300 | true | true |
| claude-haiku-3.5 | ["haiku3.5","구 하이쿠"] | 900 | 4,500 | 340 | true | true |
| claude-sonnet-4.5 | ["Sonnet 4.5","sonnet-4.5","소넷"] | 4,200 | 21,000 | 200 | true | true |
아래 JSON Schema 에 맞는 모델 단가·처리 속도표 14행을 JSON 배열로 생성. 한 가족(하이쿠·소넷·오푸스) 안에서 배치·리전·긴 컨텍스트 변형이 단가와 처리 속도만 다르게 갈라지도록.
{"type":"object","properties":{"model_id":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"in_price_krw_per_1m":{"type":["number","null"]},"out_price_krw_per_1m":{"type":["number","null"]},"out_tokens_per_sec":{"type":["number","null"]},"streaming":{"type":"boolean"},"contracted":{"type":"boolean"}},"required":["model_id","aliases","streaming","contracted"]}
규칙: 출력 단가는 입력 단가의 5배 안팎, 배치 변형은 단가가 절반이지만 처리 속도가 3분의 1 이하이고 streaming=false. contracted=false 인 모델은 단가와 처리 속도를 모두 null 로 둔다(계산 불가 근거).
쉬운 데이터만 만들지 말 것: (1) contracted=false 이면서 단가가 null 인 모델 2건, (2) 별칭이 한글·대문자·하이픈으로 갈라진 모델 3건 이상, (3) 단가는 싸지만 처리 속도가 느려 지연이 나빠지는 모델 3건, (4) 같은 모델의 리전 변형으로 단가만 10% 높은 행 1건. JSON 배열만.{"type":"object","properties":{"model_id":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"in_price_krw_per_1m":{"type":["number","null"]},"out_price_krw_per_1m":{"type":["number","null"]},"out_tokens_per_sec":{"type":["number","null"]},"streaming":{"type":"boolean"},"contracted":{"type":"boolean"}},"required":["model_id","aliases","streaming","contracted"]}고객사와 논의 중인 라우팅·도구 정책 변경안입니다. 규칙 하나가 어떤 요청을 어느 모델로 보낼지, 재시도 상한과 스트리밍을 어떻게 둘지 적습니다. 우선순위가 겹쳐 도달할 수 없는 규칙과 미계약 모델을 가리키는 규칙을 일부러 넣어 검출이 도는지 봅니다.
| rule_id | priority | match_request_type | match_condition | target_model_id | max_tool_retries | streaming | note |
|---|---|---|---|---|---|---|---|
| r01 | 10 | ttsql | input_tokens < 8000 | claude-haiku-4.5 | 2 | true | 짧은 정형 질의는 가벼운 모델로 유지합니다 |
| r02 | 20 | market_brief | * | claude-haiku-4.5 | 2 | true | 정형 브리핑은 가벼운 모델로 내려 비용을 줄여 봅니다 |
| r03 | 30 | earnings_qa | input_tokens >= 30000 | claude-sonnet-4.5 | 3 | true | 긴 실적 질의는 현행 모델을 유지합니다 |
| r04 | 40 | dd_report | * | claude-sonnet-4.5 | 3 | true | 실사 리포트를 오푸스에서 소넷으로 내려 비용을 봅니다 |
| r05 | 50 | dd_report | input_tokens >= 80000 | claude-opus-4.1 | 3 | true | 아주 긴 실사만 오푸스로 남기려는 규칙입니다 |
아래 JSON Schema 에 맞는 라우팅·도구 정책 변경안 규칙 16행을 JSON 배열로 생성. priority 는 숫자가 작을수록 먼저 적용되고, 한 요청은 가장 먼저 맞는 규칙 하나만 따른다.
{"type":"object","properties":{"rule_id":{"type":"string"},"priority":{"type":"number"},"match_request_type":{"type":"string"},"match_condition":{"type":"string"},"target_model_id":{"type":"string"},"max_tool_retries":{"type":"number"},"streaming":{"type":"boolean"},"note":{"type":"string"}},"required":["rule_id","priority","match_request_type","match_condition","target_model_id","streaming"]}
match_request_type 은 market_brief·earnings_qa·ttsql·dd_report 또는 '*', match_condition 은 'input_tokens < 8000' 처럼 한 줄 조건식이거나 '*'. target_model_id 는 모델 단가표에 있는 식별자로.
쉬운 데이터만 만들지 말 것: (1) 앞 순위의 넓은 규칙에 가려 절대 도달하지 못하는 규칙 2건, (2) 단가표에서 contracted=false 인 미계약 모델을 가리키는 규칙 1건, (3) streaming=false 라 첫 조각 지연 개념이 사라지는 규칙 2건, (4) 비용은 줄지만 처리 속도가 느려 지연이 나빠지는 규칙 2건, (5) 재시도 상한만 바꾸고 모델은 그대로 두는 규칙 1건. JSON 배열만.{"type":"object","properties":{"rule_id":{"type":"string"},"priority":{"type":"number"},"match_request_type":{"type":"string"},"match_condition":{"type":"string"},"target_model_id":{"type":"string"},"max_tool_retries":{"type":"number"},"streaming":{"type":"boolean"},"note":{"type":"string"}},"required":["rule_id","priority","match_request_type","match_condition","target_model_id","streaming"]}| Python | CLI의 구현 언어입니다. 엑셀 파서, 모델 별칭 정규화, 비용·지연 산식 엔진, 리포트 렌더러가 모두 여기에 들어갑니다 |
| TypeScript | 변경안 규칙과 단가표의 JSON Schema 를 TypeScript 타입으로 내보내, 제품의 설정 저장소가 쓰는 형식과 어긋나지 않게 맞춥니다 |
| LangGraph | 추출본 파싱 → 정규화 → 규칙 적용 → 재계산 → 리포트 작성 노드를 잇는 처리 그래프입니다. 계산 노드는 규칙만 쓰고 LLM 을 부르지 않습니다 |
| Claude Code SDK | 검토 리포트의 문장 초안과 가정 목록 작성 호출을 감싸는 골격입니다. 숫자는 산식이 만든 값을 그대로 받아 씁니다 |
| MCP | 3주차에 계산 명령을 MCP 도구로 노출해, 에이전트가 대화 중에 변경안 영향을 직접 물어볼 수 있게 엽니다 |
| SSE | 고객사 로그의 첫 조각까지 지연 컬럼을 전체 응답 시간과 분리해 계산하는 축입니다. 스트리밍을 끄는 변경안은 여기서 손해로 잡힙니다 |
| openpyxl·pandas | 소계 행·병합 머리글·쉼표 숫자·문자열 지연이 섞인 관리 화면 추출본을 요청 단위 표로 펴는 파싱 층입니다 |
| GitHub Actions | 손으로 검산한 골든 케이스 12건을 회귀 테스트로 걸어, 산식을 고칠 때 과거 결론이 조용히 바뀌지 않게 막습니다 |
| Datadog | 3주차에 고객사가 내려주는 관측성 export(CSV) 를 입력 어댑터로 붙여 합성 추출본을 실 사용 로그로 교체합니다 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(예측이 얼마나 빗나가는지 홀드아웃으로 확인)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(두 번째 고객사 프로파일과 실 사용 로그 어댑터)로 진행합니다.
변경안 하나를 요청 유형 하나에 적용했을 때의 영향 한 줄입니다. 건수·현행 비용·변경 후 비용·차이·지연 차이·재시도 차이와 이득·손해 판정, 그리고 그 숫자가 나온 산식을 함께 담아 터미널 표와 change_review.md 에 그대로 씁니다.
{"type":"object","properties":{"plan_id":{"type":"string"},"segment":{"type":"string"},"requests_n":{"type":"number"},"baseline_cost_krw":{"type":["number","null"]},"projected_cost_krw":{"type":["number","null"]},"cost_delta_krw":{"type":["number","null"]},"baseline_p95_ms":{"type":["number","null"]},"projected_p95_ms":{"type":["number","null"]},"latency_delta_ms":{"type":["number","null"]},"retry_delta":{"type":["number","null"]},"verdict":{"type":"string","enum":["gain","neutral","loss","unknown"]},"formula":{"type":"string","minLength":20},"evidence":{"type":"string","minLength":8},"hedge":{"type":["string","null"]}},"required":["plan_id","segment","requests_n","verdict","formula","evidence"]}[
{
"input_ref": "r02 (market_brief 전체를 소넷에서 하이쿠로)",
"output": {
"plan_id": "r02",
"segment": "market_brief",
"requests_n": 1240,
"baseline_cost_krw": 106640,
"projected_cost_krw": 35340,
"cost_delta_krw": -71300,
"baseline_p95_ms": 11800,
"projected_p95_ms": 7400,
"latency_delta_ms": -4400,
"retry_delta": 0,
"verdict": "gain",
"formula": "월 비용 = 건수 × (입력토큰×입력단가 + 출력토큰×출력단가) ÷ 1,000,000. 변경 후 1,240 × (12,000×1,400 + 1,700×6,900) ÷ 1,000,000 = 35,340원이고 현행은 1,240 × (12,000×4,200 + 1,700×21,000) ÷ 1,000,000 = 106,640원이라 차이는 -71,300원입니다. 지연 P95 는 출력토큰 ÷ 초당 처리 토큰으로 1,700÷320 = 5.3초에 오버헤드를 더해 7,400ms 입니다.",
"evidence": "client_usage_export 의 market_brief 1,240행 평균 입력 12,000·출력 1,700 토큰, model_catalog claude-haiku-4.5 단가 1,400/6,900",
"hedge": "모델을 내렸을 때 브리핑 품질이 어떻게 달라지는지는 이 계산에 들어 있지 않습니다"
}
},
{
"input_ref": "r09 (dd_report 를 오푸스 배치로, 스트리밍 끔)",
"output": {
"plan_id": "r09",
"segment": "dd_report",
"requests_n": 96,
"baseline_cost_krw": 268700,
"projected_cost_krw": 134400,
"cost_delta_krw": -134300,
"baseline_p95_ms": 84000,
"projected_p95_ms": 232000,
"latency_delta_ms": 148000,
"retry_delta": 0,
"verdict": "loss",
"formula": "비용은 배치 단가가 절반이라 268,700원에서 134,400원으로 -134,300원입니다. 다만 지연 P95 는 출력 7,400토큰 ÷ 35토큰/초 = 211초에 오버헤드를 더해 232,000ms 로, 현행 84,000ms 대비 +176% 입니다. 지연 증가가 20% 상한을 넘겨 판정은 손해입니다.",
"evidence": "model_catalog claude-opus-4.1-batch out_tokens_per_sec=35, streaming=false / change_plan_rules r09 streaming=false",
"hedge": "야간 일괄 처리라면 체감이 다를 수 있어, 주간 요청만 제외하는 조건을 붙일지 담당자 확인이 필요합니다"
}
},
{
"input_ref": "r08 (earnings_qa 를 미계약 프리뷰 모델로)",
"output": {
"plan_id": "r08",
"segment": "earnings_qa",
"requests_n": 412,
"baseline_cost_krw": 210500,
"projected_cost_krw": null,
"cost_delta_krw": null,
"baseline_p95_ms": 17200,
"projected_p95_ms": null,
"latency_delta_ms": null,
"retry_delta": 0,
"verdict": "unknown",
"formula": "단가표에 claude-sonnet-4.6-preview 의 입력·출력 단가와 초당 처리 토큰이 비어 있어 비용·지연을 계산할 수 없습니다. 대상 412건 중 18건은 출력 토큰도 비어 있어 현행 값 계산에서도 빠집니다. 계산 불가로 분리하고 이득으로 세지 않습니다.",
"evidence": "model_catalog claude-sonnet-4.6-preview in_price_krw_per_1m=null, contracted=false",
"hedge": "계약 단가와 처리 속도를 받는 즉시 같은 명령으로 다시 계산할 수 있습니다"
}
}
][자동 검증: 규칙·결정론으로 객관 채점] 1. JSON Schema parse 통과(출력 형식이 안 깨지는지). 2. baseline_cost_krw·projected_cost_krw 를 독립 구현으로 다시 계산해 1원 단위까지 일치하는지 봅니다. 비용 = Σ(입력토큰×입력단가 + 출력토큰×출력단가) ÷ 1,000,000. 3. projected_p95_ms 가 출력토큰 ÷ 초당 처리 토큰 + 오버헤드 산식과 맞는지, streaming=false 인 규칙에서 첫 조각 지연이 전체 응답 시간으로 대체됐는지 확인합니다. 4. verdict 가 판정 규칙과 일치하는지 봅니다. 단가·토큰·처리 속도 중 하나라도 비면 unknown, 비용이 5% 이상 줄고 지연 증가가 5% 이내면 gain, 비용이 5% 이상 늘거나 지연이 20% 넘게 늘면 loss, 그 외는 neutral. 5. requests_n 에 row_type=subtotal 행이 섞이지 않았는지, 모델 별칭이 정본 식별자로 묶였는지 확인합니다. 6. formula 안의 숫자가 출력 필드 값과 같은 값인지 토큰 매칭으로 대조하고, evidence 가 입력 표의 실제 행·필드 인용인지 확인합니다. [수동 검증: 사람·LLM 보조] 1. 손으로 검산한 골든 케이스 12건을 회귀 테스트로 고정해, 산식을 고칠 때 과거 결론이 바뀌면 실패로 떨어뜨립니다. 2. 앞 3주 예측과 뒤 1주 실측의 오차를 요청 유형별로 보고, 오차가 큰 유형은 전체의 5% 를 사람이 원본 행까지 되짚어 확인합니다.
근거: Map LinqAlpha's product workflows from the end user's perspective