schedules/anchoring — backend 를 import 하지 않는 독립 컨테이너 배치 서비스.
회사 × 협력사유형(1유통/2제조/3총판) × 가격구간(3,000원, 33,334칸)별 앵커링
값(정수 천분율)을 격주 토 00:00 KST 에 협상 성공률로 자동 조정한다.
- 판정 = "가격 흔적" 기준: last_offered_price 가 있는 종료 재협상만 표본,
DONE & bid ≤ 박제 앵커만 성공, 나머지(초과 합의·결렬·가격 쓰고 이탈) 실패.
앵커는 비노출(엔진 내부 체결 임계) — agent 무변경
- 저장 = anchoring.rate_adjustments 1개(append-only, consumed_session_ids 박제),
소비 경계 = sessions.anchoring_adjustment_id 마킹(멱등·이월). DDL 은 모듈
소유(schema.sql, sessions 3컬럼 ALTER 포함)
- 안정성: 조정 INSERT+마킹 한 트랜잭션 + rowcount 불일치 전체 롤백,
Redis TTL 7일 + 매주 조정 칸 re-SET, socket timeout 0.3s, DB 폴백,
가격 제시율 0% WARN, --once 수동 캐치업
- 정적 기본 테이블(전 구간 10‰, 상한 정확히 1억·초과분 마지막 인덱스 클램프)
기동 검증 실패 시 기동 중단
- 전체 async(SQLAlchemy+asyncpg, redis.asyncio) — negodata 가 reader 를 그대로
이식 가능(docs/인수인계.md). 최종 문서 docs/{개발용,기획용,워크플로우}.md
- 테스트 15종: 골든 벡터(§11) + DB 통합(멱등·이월·격리·rowcount 롤백)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
19 KiB
앵커링 값 자동 조정 시스템 — 정책 안내서 (기획/비개발자용)
한 줄 요약: 협상에서 "이 가격 이하면 합의한다"는 우리 쪽 기준선을, 시장의 반응을 보면서 시스템이 스스로 조금씩 조절해 나가는 장치입니다. 사람이 일일이 정하지 않아도, 협상 결과가 쌓일수록 "너무 세지도, 너무 약하지도 않은" 적정 강도를 자동으로 찾아갑니다.
버전: v1.2 (2026-07-02 확정) — 기술 상세는
개발용.md, 흐름 해설은워크플로우.md참조.
목차
- 1. 앵커링이 뭔가요?
- 2. 시스템이 관리하는 단위: "칸"
- 3. 작동 원리 — 흥정에 비유하면
- 4. 규칙 상세
- 5. 숫자로 따라가 보는 예시 시나리오
- 6. 협상이 중간에 끝난 경우는요?
- 7. 왜 이렇게 설계했나요?
- 8. 자주 나오는 질문 (FAQ)
- 9. 용어 정리
1. 앵커링이 뭔가요?
협상에는 "처음 제시된 숫자가 기준점이 되어 이후 대화 전체를 끌어당긴다"는 심리 효과가 있습니다. 이를 앵커링(닻 내리기) 이라고 부릅니다. 배가 닻을 내린 자리 주변에서 움직이듯, 협상도 첫 제안 근처에서 타결되는 경향이 있죠.
NegoWiz에서는 목표가에서 일정 비율을 깎은 가격을 합의 기준선(앵커링가) 으로 삼습니다. 이때 몇 % 깎을지가 바로 앵커링 값입니다.
앵커링가(기준가) = 목표가 × (1 − 앵커링 값), 소수점은 버리고 1원 단위까지 계산
예) 목표가 30,000원, 앵커링 값 3% → 기준가 29,100원 — 협력사가 29,100원 이하를 써내면 그 가격으로 합의
앵커링 값은 항상 1% ~ 20% 사이에서만 움직입니다. 시작값은 시스템에 내장된 기준표에 정해져 있으며, 현재는 모든 가격구간에서 1% 입니다. 이 기준표는 절대 바뀌지 않는 고정값이고, 실제 운영에서 쓰이는 값은 협상 결과에 따라 이 시작점에서부터 움직여 갑니다.
적용 대상: 이 시스템이 값을 산출하고 그 결과를 학습(표본 수집·값 조정)하는 대상은 재협상(1:1) 건입니다. 여러 협력사가 동시에 참여하는 재견적(1:N) 등 다른 유형의 결과는 값 조정에 사용하지 않습니다.
중요 — 앵커링가는 협력사에게 보여주지 않습니다: 계산된 앵커링가는 협력사 화면에 표시되지 않고, 협상 챗봇이 합의 가능 여부를 판단하는 내부 기준선으로만 동작합니다. 협력사가 스스로 써낸 가격이 이 기준선 이하이면 그 가격으로 합의가 성사됩니다. 기준선을 숨기는 이유: 상대가 우리 한계를 모르는 채 먼저 가격을 부르게 하면 (1) 기준선보다 더 싸게 낼 의향이 있던 협력사의 가격을 그대로 얻고(보여주면 딱 그 값에 맞춰 냅니다), (2) 상대의 가격 정보를 먼저 확보하는 협상 우위를 유지할 수 있기 때문입니다.
2. 시스템이 관리하는 단위: "칸"
"모든 협상에 똑같은 %를 적용"하면 안 되는 이유가 있습니다. 3천 원짜리 물건과 5천만 원짜리 물건은 흥정의 여유가 다르고, 유통사와 제조사는 가격을 받아들이는 태도가 다르며, 회사가 다르면 거래하는 협력사와 협상 환경 자체가 다르기 때문입니다.
NegoWiz는 여러 회사가 함께 쓰는 플랫폼이므로, 시스템은 협상을 세 기준으로 분류한 칸(cell) 단위로 앵커링 값을 따로 관리합니다.
| 기준 | 내용 |
|---|---|
| 회사 | 플랫폼을 쓰는 각 고객사. 회사끼리는 값도 협상 기록도 완전히 분리 |
| 가격구간 | 목표가를 3,000원 단위로 나눈 구간 (0원 ~ 1억 원, 총 33,334개). 1억 원을 넘는 목표가는 전부 마지막 구간(1억 원 구간)으로 편입 |
| 협력사 유형 | 유통 / 총판 / 제조 |
즉 "A사의 유통 3만 원대"와 "B사의 유통 3만 원대"는 서로 다른 칸이고, 각자 자기만의 앵커링 값과 협상 기록을 가집니다. A사의 협상 결과가 B사의 값에 영향을 주는 일은 없습니다. 새 회사가 플랫폼에 들어오면 모든 칸이 기준표의 시작값(1%)에서 출발합니다.
3. 작동 원리 — 흥정에 비유하면
시장에서 단골 도매상과 매일 거래하는 상인을 떠올려 보세요.
- 처음 거래하는 상대에게는 조심스럽게 아주 조금만 깎아 부릅니다. (시작 1%)
- 깎아 불렀는데도 상대가 계속 받아주면, "조금 더 깎아도 되겠는데?" 하고 다음부터 조금 더 세게 부릅니다.
- 반대로 거절이 잦아지면, "너무 셌구나" 하고 한발 물러섭니다.
- 받아주는 비율이 적당한 수준이면 그대로 유지합니다. 굳이 건드리지 않습니다.
이 시스템은 정확히 이 상인의 감각을 규칙으로 만든 것입니다. 다만 사람과 달리 회사별 수만 개의 칸을 전부 동시에, 감정 없이, 데이터로만 판단합니다.
중요한 특징 하나: 어디까지 깎을 수 있을지는 시스템이 정하는 게 아니라 시장(협력사들)이 정합니다. 시스템은 상대가 받아주는 한계선을 더듬어 찾아갈 뿐입니다. 그래서 이 값은 "우리가 정한 목표"가 아니라 "시장이 알려준 답"에 가깝습니다.
4. 규칙 상세
언제 조정하나요? — "2주마다, 10건이 모였다면"
값 조정은 격주 토요일 자정(00시) 에 정기적으로 이루어집니다. 이때 각 칸을 살펴서:
- 지난 조정 이후 협상 결과가 10건 이상 모였으면 → 평가하고 값을 조정합니다.
- 10건 미만이면 → 이번에는 건너뛰고, 모인 결과를 그대로 들고 다음 주기로 넘어갑니다.
건너뛴 칸은 다음 조정일에 4주치를 보게 되고, 그래도 부족하면 6주, 8주… 로 자연스럽게 기간이 늘어납니다. 거래가 드문 칸도 결국 10건이 차는 시점에 반드시 평가됩니다. "몇 주치인가"는 중요하지 않고 "10건 이상 모였는가" 만 봅니다.
참고: "격주"는 시스템 달력(주차의 홀짝) 기준입니다. 달력 특성상 수년에 한 번꼴로 조정 간격이 한 차례 3주가 될 수 있는데, 그 기간의 결과는 사라지지 않고 다음 조정일에 그대로 합산 평가되므로 실질적인 영향은 없습니다.
무엇을 보나요? — "성공률"
모인 결과 전체에서 성공이 얼마나 되는지 봅니다. 13건이 모였으면 13건 전체로 성공률을 계산합니다.
성공 = 협상이 정상적으로 끝났고, 협력사가 써낸 가격이 우리 기준가(앵커링가) 이하인 경우
기준가보다 싸게(또는 같게) 들어왔다면, 우리가 정한 기준이 시장에 통했다는 뜻이니까요. 한번 평가에 쓰인 결과는 비워지고, 다음 평가는 새로 모인 결과만 봅니다.
어떻게 조정하나요? — "3단계"
| 성공률 | 판단 | 조치 |
|---|---|---|
| 60% 이상 | 잘 통하고 있다 | 앵커링 값을 올린다 (더 세게) |
| 30% ~ 60% | 적당하다 | 유지 |
| 30% 미만 | 너무 셌다 | 앵커링 값을 내린다 (완화) |
올리고 내리는 폭은 유형마다 다릅니다. 유통이 가장 큰 폭으로 움직이고(±2%p), 총판(±1.5%p), 제조(±1%p) 순입니다. 유통 쪽이 가격 협상의 여지가 커서 더 과감하게 탐색한다는 뜻입니다.
올리는 폭과 내리는 폭은 같습니다(대칭). 그래서 성공률이 절반 근처에서 왔다 갔다 하는 균형점에 도달하면 값이 자연스럽게 멈춥니다.
한 칸의 값은 조정일 한 번에 딱 한 계단만 움직입니다. 아무리 많은 결과가 쌓여 있어도 한 번에 여러 계단을 뛰어오르지 않으므로, 협력사 입장에서 가격 강도가 갑자기 널뛰는 일이 없습니다.
어떤 경우에도 값은 1% 아래로 내려가지 않고, 20% 위로 올라가지 않습니다.
5. 숫자로 따라가 보는 예시 시나리오
"A사 × 유통 × 3만 원대" 칸의 몇 달을 따라가 봅시다. 유통이므로 조정폭은 ±2%p입니다.
| 조정일 | 모인 결과 | 성공률 | 판단 | 앵커링 값 변화 |
|---|---|---|---|---|
| 시작 | — | — | — | 1% (기준표 시작값) |
| 1차 (2주 후) | 12건 중 성공 9건 | 75% | 잘 통함 → 올림 | 1% → 3% |
| 2차 (4주 후) | 11건 중 성공 8건 | 73% | 잘 통함 → 올림 | 3% → 5% |
| 3차 (6주 후) | 7건뿐 | — | 10건 미만 → 건너뜀 | 5% (7건 이월) |
| 4차 (8주 후) | 이월 7건 + 새 6건 = 13건 중 성공 8건 | 62% | 잘 통함 → 올림 | 5% → 7% |
| 5차 (10주 후) | 10건 중 성공 2건 | 20% | 너무 셌음 → 내림 | 7% → 5% |
| 6차 (12주 후) | 14건 중 성공 9건 | 64% | 잘 통함 → 올림 | 5% → 7% |
| 7차 (14주 후) | 11건 중 성공 5건 | 45% | 적당함 → 유지 | 7% |
3차 조정일을 눈여겨보세요 — 10건이 안 돼서 건너뛰었고, 4차 때 4주치 13건 전체로 평가했습니다. 이후로 값은 5~7% 사이에서 잔잔하게 오르내립니다. 이 칸의 시장이 받아주는 한계가 대략 7% 언저리라는 걸 시스템이 스스로 찾아낸 것입니다. 같은 시기 B사의 유통 3만 원대 칸은 B사 자신의 협상 결과에 따라 전혀 다른 값에 가 있을 수 있습니다.
합의 기준선이 어떻게 달라지는지 보면:
| 앵커링 값 | 목표가 30,000원일 때 기준가 |
|---|---|
| 1% (초기) | 29,700원 |
| 7% (수렴 후) | 27,900원 |
초기에는 사실상 목표가 근처면 합의해 주다가, 학습이 진행되면서 협상 여지를 1,800원 더 확보하게 됩니다.
도달 속도는 거래량에 달려 있습니다. 거래가 활발한 칸은 두 달 안에 균형점 근처에 가고, 한산한 칸은 반년 이상 걸릴 수 있습니다. 하지만 도착하는 목적지는 같습니다 — 속도만 다를 뿐입니다.
6. 협상이 중간에 끝난 경우는요?
모든 협상이 합의까지 가지는 않습니다. 협력사가 가격을 몇 번 써내다가 떠나기도 하고, 아예 참여하지 않은 채 기한이 만료되기도 하죠. 이런 건을 어떻게 셀지가 중요한 정책 결정이었고, 다음과 같이 확정했습니다.
채점 기준 한 줄 요약: "가격을 한 번이라도 써낸 협상만 세고 — 기준가 이하로 합의됐으면 성공, 나머지는 전부 실패."
| 상황 | 처리 |
|---|---|
| 기준가 이하로 합의 성사 | 성공 |
| 가격을 써냈지만 합의 못 함 — 기준 초과로 마무리, 결렬, 가격을 쓰다가 중간 이탈(이후 기한만료로 정리된 경우 포함) | 실패로 카운트 |
| 가격을 한 번도 써내지 않고 끝남 (미참여·무응답 이탈·취소) | 결과에서 제외 (카운트 안 함) |
이렇게 정한 이유: 가격을 써냈다는 건 협상에 실제로 응했다는 뜻이고, 그런데도 우리 기준선 아래로 합의가 안 됐다면 그건 "기준이 시장보다 세다"는 신호입니다. 이걸 실패로 세지 않으면, 합의된 건만 남아 성공률이 좋아 보이는 착시가 생기고 시스템이 값을 한계 없이 올리게 됩니다. 반면 가격을 한 번도 써내지 않은 건(담당자 부재, 관심 없음 등)은 — 기준가가 화면에 보이지 않으므로 — 우리 기준의 세기와 무관한 이탈입니다. 판단 재료에서 빼도 왜곡이 없습니다.
7. 왜 이렇게 설계했나요?
설계 과정에서 협상 이론 연구와 시뮬레이션을 검토해 내린 결정들입니다.
상한이 40%가 아니라 20%인 이유 — 협상 연구(컬럼비아대 Ames & Mason)에 따르면 첫 제안의 효과적인 할인 범위는 5~20%입니다. 그보다 극단적인 제안은 앵커 효과가 사라지고 상대를 협상장 밖으로 밀어냅니다. 그래서 상한을 20%로 정했습니다.
올림과 내림의 폭이 같은 이유 — 올리는 폭을 더 크게 하면 값이 위아래로 크게 출렁이며 협상 전략이 불안정해집니다. 대칭으로 맞추면 균형점에서 얌전히 멈춥니다. 시뮬레이션에서 출렁임이 절반으로 줄었습니다.
첫 시작이 1%로 소극적인 이유 — 처음부터 세게 나가서 협력사를 잃는 것보다, 낮게 시작해서 시장이 허용하는 만큼 올라가는 쪽이 안전하기 때문입니다. B2B는 반복 거래라 협력사와의 관계가 자산입니다. 대가는 초기 몇 달간 앵커링 이득을 덜 보는 것인데, 이는 의도된 보수적 선택입니다.
격주 정기 조정 + 조정일당 한 계단인 이유 — 건건이 가격 강도가 널뛰면 협력사 입장에서 예측 불가능한 상대가 됩니다. 2주라는 통제된 간격, 그리고 한 번에 한 계단이라는 제한이 신뢰를 지킵니다. 또한 최소 10건을 모아 보므로 한두 건의 우연한 결과에 휘둘리지 않습니다.
회사별로 값을 분리한 이유 — 회사마다 거래하는 협력사, 상품, 협상 문화가 다르므로 "시장이 알려주는 답"도 회사마다 다릅니다. 섞어서 배우면 어느 회사에도 맞지 않는 어중간한 값이 됩니다.
기준가를 숨기는 이유 — 기준선을 보여주면 협력사는 딱 그 값에 맞춰 내게 되어, 더 싸게 낼 의향이 있던 협력사의 가격을 놓칩니다. 숨기면 상대가 먼저 가격을 부르므로 상대의 정보를 얻는 협상 우위도 유지됩니다.
전체를 관통하는 철학은 하나입니다: 이 시스템의 목표는 "최대한 깎기"가 아니라 "서로 계속 거래할 수 있는 균형점 찾기"입니다. 지나친 할인으로 성사된 거래는 장기적으로 이탈로 이어진다는 연구 결과도 이 방향을 뒷받침합니다.
8. 자주 나오는 질문 (FAQ)
Q. 사람이 개입해서 값을 바꿀 수 있나요? 현재 정책에서는 없습니다. 값은 오직 협상 결과 데이터로만 움직입니다. 다만 모든 협상 기록과 조정 이력이 보존되므로, "이 칸의 값이 왜 7%가 됐는지"는 이력으로 전부 추적·설명할 수 있습니다.
Q. 기준표(시작값 표)와 실제 운영 값은 뭐가 다른가요? 기준표는 "출발선"이고 절대 바뀌지 않습니다. 실제 운영 값은 그 출발선에서 협상 결과에 따라 움직여 온 "현재 위치"입니다. 값이 조정된다는 것은 기준표를 고치는 게 아니라, 조정 이력이 한 줄 더 쌓여 현재 위치가 바뀐다는 뜻입니다.
Q. 성공률이 높을수록 좋은 건가요? 아닙니다, 이게 가장 오해하기 쉬운 부분입니다. 성공률은 "성과"가 아니라 "현재 기준 강도에 대한 시장의 수용도" 입니다. 앵커링 1%에 성공률 90%보다, 15%에 성공률 50%가 사업적으로 훨씬 좋은 상태입니다. 대시보드를 본다면 성공률 단독이 아니라 앵커링 값과 함께 봐야 합니다. 오히려 성공률이 50% 근처라는 건 시스템이 균형점을 잘 찾았다는 신호입니다.
Q. 13건이 모였는데 왜 10건만 안 보고 13건을 다 보나요? 표본이 많을수록 성공률 판단이 정확해지기 때문입니다. 그리고 몇 건이 모였든 조정은 한 계단만 이루어지므로, 많이 모였다고 값이 더 크게 움직이지는 않습니다.
Q. 거래가 거의 없는 칸은 어떻게 되나요? 10건이 찰 때까지 조정일마다 기간을 늘려가며 기다립니다(2주 → 4주 → 6주…). 극단적으로 거래가 드문 칸은 오래도록 시작값(1%) 근처에 머물 수 있는데, 거래가 없는 칸이니 사업 영향도 작습니다. 인접 가격대의 학습 결과를 빌려오는 보완책이 아이디어로 논의됐지만, 아직 확정하지 않은 미결 과제입니다. 회사별로 값을 분리하면서 칸당 거래가 더 잘게 나뉘므로, 이 과제는 앞으로 중요해질 수 있습니다.
Q. 협력사가 이 시스템의 존재를 알면 역이용하지 않을까요? 일부러 초반에 거절을 반복해 값을 낮추는 시도를 상상할 수 있습니다. 다만 기준가가 화면에 보이지 않고, 값은 조정일에 최대 1~2%p씩만 움직이며 하한이 1%라, 역이용의 이득 대비 거래 포기 비용이 큽니다. 그래도 장기 운영에서 모니터링할 가치는 있는 지점입니다.
Q. 목표가 자체를 시스템이 정하는 건가요? 아닙니다. 목표가는 기존 프로세스대로 정해지고, 이 시스템은 그 목표가에서 합의 기준선을 몇 % 아래에 둘지만 결정합니다.
Q. 파라미터(폭, 경계선, 상한)를 나중에 바꿀 수 있나요? 가능합니다. 모든 협상 기록과 조정 이력이 보존되는 구조라, 규칙을 바꾸면 과거 이력에 새 규칙을 다시 적용해 값을 재계산할 수 있습니다. 다만 파라미터 변경은 정책 재확정 절차를 거쳐야 합니다.
9. 용어 정리
| 용어 | 뜻 |
|---|---|
| 앵커링 값 | 목표가에서 깎아 기준선을 정하는 비율. 1%~20%, 시작은 기준표 값(현재 1%) |
| 앵커링가(기준가) | 목표가 × (1 − 앵커링 값), 소수점 버림. 협력사에게 표시하지 않는 내부 합의 기준선 |
| 기준표 | 가격구간별 시작값이 담긴 불변 표. 서비스에 내장되며 절대 변경되지 않음 |
| 칸 | 회사 × 가격구간 × 협력사 유형 조합. 값이 관리되는 최소 단위 |
| 가격구간 | 목표가를 3,000원 단위로 나눈 구간 (0~1억 원). 1억 원 초과는 마지막 구간으로 편입 |
| 재협상 | 협력사 1곳과 1:1로 진행하는 협상. 이 시스템의 학습(표본 수집·값 조정) 대상 |
| 가격 흔적 | 협력사가 협상에서 가격을 한 번이라도 써낸 기록. 가격 흔적이 있는 협상만 채점 대상 |
| 성공 | 정상 종료 협상에서 협력사 투찰가 ≤ 기준가(앵커링가) |
| 성공률 | 조정일까지 모인 결과 전체 중 성공 비율 |
| 조정일 | 격주 토요일 00시. 10건 이상 모인 칸만 평가·조정 |
| 이월 | 10건 미만이라 평가를 건너뛰고 결과를 다음 조정일로 넘기는 것 |
| 균형점 | 성공률이 절반 근처를 오가며 값이 안정되는 지점. 시장이 정한다 |
기술 구현 상세(데이터 구조, 계산 절차, 검증 기준)는
개발용.md, 시간 순서 해설은워크플로우.md를 참조하세요. 세 문서는 같은 정책(v1.2, 2026-07-02 확정)을 눈높이만 달리해 기술한 것입니다.