"같은 오디오, 같은 설정은 같은 구매야. 돈은 한 번 들어야 해."
두 호출을 '같다' 고 만드는 건 뭐야?
지난 레슨의 예약 ledger 는 두 호출이 같은 호출이라는 걸 알아볼 수 있어야만 이중 지출을 막아. 그래서 유료 호출의 identity 는 진짜 신경 써서 골라야 하고. 뻔한 선택지들이 왜 안 되는지부터 보자.
- 파일명 — 오디오가 그대로인데 파일이 이름 바뀌거나 옮겨질 수 있고, 다른 두 파일이 이름을 공유할 수 있어. 파일명은 콘텐츠가 아냐.
- 랜덤 request id — 시도할 때마다 새로 생기니까, 같은 호출을 재시도해도 새 id 를 받아 완전히 새것처럼 보여. 이중 결제를 막기는커녕 보장하는 셈이야.
- 타임스탬프 — 매번 다르니까 랜덤 id 랑 똑같이 실패해.
하나같이 같은 오디오를 두 번 결제하게 놔두는 것들이야. identity 는 실제로 비용과 결과를 결정하는 데서 나와야 해. 바로 콘텐츠에서.
identity 는 콘텐츠 + config 의 hash 야
Recall 의 유료 호출 identity 는 hash 한 쌍이야: 보내는 정확한 오디오 chunk 의 SHA-256, 그리고 정확한 provider 설정의 SHA-256. 같은 설정 아래 같은 오디오 바이트는 같은 hash 를 내고, 그게 같은 identity 가 돼. 그래서 재시도가 이미 있는 ledger 행에 착지해서 완료된 걸 찾고, 다시 결제하는 대신 저장된 응답을 재사용해. identity 당 한 번만 결제하는 게 이름이나 시계가 아니라 콘텐츠로 보장되는 거지.
그럼 config 는 왜 identity 에 들어갈까? 같은 오디오라도 다른 model 이나 다른 설정으로 전사하면 진짜 다른 호출이거든. 다른 증거가 나오고, 돈이 또 드는 것도 정당하고. config hash 를 key 에 접어 넣으면 '같은 오디오, 같은 config' 는 유료 identity 하나고, '같은 오디오, 새 config' 는 제대로 새것이 돼. identity 에는 출력을 결정하는 것만 정확히 담기는 거야. 바이트와 설정, 그 외에는 아무것도.
content-addressing, 이제 돈을 위해
content-addressing 은 트랙 3 에서 이미 만났어. release 의 content hash 로 요약이 stale 인지 감지하던 그거. 이번엔 같은 아이디어를 지출에 겨눈 거고. identity 가 콘텐츠에서 나오면 '이미 했나?' 가 추측이 아니라 조회가 돼. 입력을 hash 하고 ledger 를 확인하면 완료된 작업을 찾거나 못 찾거나 둘 중 하나야. 사람이 붙인 라벨이나 시계가 찍은 값 대신 콘텐츠로 이름을 지으면, '두 번 결제 안 함' 이 희망 섞인 관례에서 기계가 보장하는 것으로 바뀌어.