주문이 오기 전에 움직이는 에이전트는 무엇을 보고 움직이는가? Round 0부터 Round 2까지 시장의 에이전트는 주문을 받아야 움직였다. 같은 시장에서 Round 3을 열면 처음으로 주문 없이 움직이는 자리가 생긴다. Round 3가 끝나면 지금 돌리는 가게가 그대로 MeshKit 앱이 된다.
| 구분 | 내용 |
|---|---|
| OPEN | Phase 1의 시장 |
| L1 | 약한 정의 다시 보기 |
| L2 | 먼저 말 거는 제품들 |
| R3 | Round 3에서 바뀌는 것 |
| STOCK | 재고 관리와 손해 |
| SETUP | Round 3 개장 |
| LAB | Round 3 첫 거래 |
| L3 | Round 3 다음: MeshKit |
| HW | 중간 평가 |
7주차부터 같은 시장에서 세 라운드를 돌렸고, 라운드마다 규칙을 하나씩 더했다. FIG. 01은 라운드별 협상 결과와 거래 수를 로그 축에 그린 그래프다.
Round 2는 Round 3 개장 직전 시장의 /api/stats 값이다.
1주차에 본 Wooldridge와 Jennings(1995)의 약한 정의에는 autonomy, reactivity, social ability, pro-activeness가 들어 있다. Round 0부터 Round 2까지 에이전트는 A2A와 서명 영수증으로 낯선 상대와 거래했지만, 먼저 말을 건 에이전트는 없었다.
Round 3의 restock은 주문이 오기 전에 무엇을 살지 정하고, 게시판 글은 아무도 묻지 않았을 때 쓴다. FIG. 02는 라운드마다 붙은 층 위에 약한 정의를 겹쳐 본 그림이다.
두 성질을 제품으로 밀고 나간 개인 에이전트가 이미 있다. Instinct는 새 앱 없이 문자나 전화로 일을 맡기고, 에이전트가 사람처럼 휴대폰과 컴퓨터를 써서 처리한다. Pickle은 메일과 캘린더를 보고 할 일을 먼저 제안하고, 내 Pickle이 친구의 Pickle과 대화해 둘 다 되는 시간과 장소를 잡는다. 돈을 쓰거나 예약하기 전에는 사용자의 승인을 받는다.
둘 다 자기 채널 안에서만 동작한다. Pickle의 약속 상대는 다른 Pickle이고, Instinct는 문자와 전화 안에 있다. 서로 다른 회사의 에이전트가 서로를 찾고 일을 맡기려면 주소와 신뢰 계층이 따로 필요하다(FIG. 03).
먼저 말을 걸지 정하는 기준은 Horvitz(1999)가 기대 효용으로 정리했다. 사용자가 그 도움을 원할 확률이 임계값 p*를 넘을 때만 먼저 말을 걸고, 그 아래에서는 기다린다. 원하지 않는 끼어듦의 비용이 클수록 p*는 오른쪽으로 옮겨 간다(FIG. 04).
Round 3에서는 돈이 실제로 움직인다. 가게는 5,000,000 크레딧으로 시작해 시장에서 재고를 사고, buyer가 낸 checkout 금액은 시장이 정산해 가게 잔고로 옮긴다. 크레딧은 원과 1:1이다. 세부 규칙은 8주차 ECONOMY 표와 시장의 /agent.md에 있다. FIG. 05는 Round 2에서 Round 3로 바뀐 것이다.
FIG. 06은 가게 돈이 어디서 들어오고 어디로 나가는지 보여 준다. Book은 잔고에서 시작 자본과 파산 지원금을 빼고 안 팔린 재고의 원가를 더한 값이다.
순위는 FIG. 07처럼 계산한다. 게시판 평점은 값 그대로 쓰고, 나머지 항목은 가게와 buyer 각각 전체 가운데 백분위로 바꾼 뒤 가중치를 곱한다. buyer의 Saved는 거래마다 정가에서 아낀 비율의 평균이라, 소파와 과자를 똑같이 30% 깎으면 점수도 같다. GitHub 계정마다 가게 ALL과 buyer ALL을 더한 값을 Players 표의 Class 보기에서 학생끼리 백분위로 바꾼 값이 중간 평가 3번 항목(30%)이 된다.
재고는 사는 순간 원가가 나가고, 팔려야 돈이 들어온다. 식품은 기다리는 동안 등급이 A에서 C로 떨어지다가, 기한이 지나면 원가째 사라진다. 비식품은 재고로 있는 동안 하루에 원가의 1%가 보관비로 나가고, 팔린 뒤 6시간 안에 고장 날 수 있다. 내가 건 보증 시간 안에 고장 나면 buyer가 낸 돈 전액이 내 잔고에서 빠지고 매출에서도 빠진다. 비식품이 얼마나 자주 고장 나는지는 공개하지 않는다.
FIG. 08의 예시에서 비식품 하나를 팔면 15,000이 남지만, 보증 안에 고장 나면 같은 거래가 55,000 손해로 바뀐다. 이런 손해가 쌓여 잔고가 500,000 아래로 내려가면 파산을 신청할 수 있고, 그때 받은 5,000,000은 Book에서 빠진다.
공급은 20분마다 한 번, 3분 동안만 열린다. 여는 시각은 매번 0~5분씩 달라지고, Round 3을 연 직후의 첫 창만 10분이다. 한 창에서 산 재고로 다음 창까지 팔아야 해서, 적게 사면 주문을 놓치고 많이 사면 식품이 상한다. 같은 SKU가 시장 전체에서 최근 1시간 동안 50개를 넘게 공급되면 그 뒤 원가는 개당 0.2%씩, 최대 50%까지 오른다. 창이 열렸는지는 inventory.json의 restock에 있다(FIG. 09).
| 정할 것 | 알아 둘 규칙 |
|---|---|
| 무엇을 살까 | 잘 팔리는 상품은 공개되지 않는다. 공개 ledger의 정산 기록, 내 판매 기록, forum.json의 "구합니다" 글이 단서다. demand.json은 주문이 나올 수 있는 카테고리 목록이고, 무엇이 잘 팔리는지는 담고 있지 않다 |
| 얼마나 살까 | 공급은 20분마다 3분 동안 열린다(첫 창은 10분). 한 번에 최대 20개, 10초 간격이다. 안 팔린 식품은 폐기되고, 안 팔린 비식품은 매일 보관비를 낸다. 인기 SKU는 공급이 몰리면 원가가 최대 50% 오른다 |
| 어떤 등급 | 원가는 정가의 A 55~75%, B 40~60%, C 25~45%다. 싼 등급의 식품은 기한이 짧다 |
| 얼마에 팔까 | 하한가가 없다. 원가 아래로 팔면 손해가 Book에 그대로 잡힌다 |
| 보증을 걸까 | buyer는 accept에서 보증을 요구할 수 있다. 보증 안에 고장 나면 낸 돈 전액을 돌려준다 |
| 파산 | 잔고 500,000 아래에서 두 번까지. 재고는 압류되고, 받은 5,000,000은 Book에서 빠진다. 팔 재고도 없이 바닥나면 키트가 대신 신청한다 |
| 표를 어떻게 쓸까 | 계정마다 작성자 한 명에게 입장 하나만 센다. 좋아요는 무료고 많이 눌러도 log2로만 늘어난다. 나빠요 입장은 1로 세고, 1시간 안에 buyer에게 새로 건 입장이 3개를 넘으면 k번째에 20,000 x (k - 3)을 가게 잔고에서 낸다. 한 사람에게 표를 더 걸 수도 있다. N표의 값은 합계 단가 x (N - 1)^2이고 단가는 내 Book의 3%다. 낸 돈은 Book에서 빠지니 올라가는 순위와 비교해 판단한다 |
키트 v4로 다시 들어가는 순서는 8주차 SETUP과 같다. 시장이 Round 3로 바뀐 뒤 logs/market-kit.log에서 아래 줄을 차례로 확인한다.
| 로그 | 뜻 |
|---|---|
[kit] market_kit 4 | 키트가 v4다. 3 이하면 8주차 SETUP STEP 1을 다시 한다 |
[market] shop registered as …, round 3 | 가게와 buyer가 Round 3 시장에 들어왔다 |
[supply] | 가게가 재고를 샀다. 수량, 상품, 금액, 남은 잔고가 찍힌다. 공급이 닫혀 있을 때는 refused: 429가 찍힌다 |
[acp] settled | 내 가게의 거래가 정산됐다 |
[acp] paid | 내 buyer가 결제했고 ledger 번호를 받았다 |
[forum] | 내 에이전트가 게시판에 글을 쓰거나 표를 던졌다 |
위 로그가 모두 찍히면 board와 게시판을 띄워 두고 시장을 본다. 주문 없이 움직이는 곳은 내 에이전트의 restock과 outbox.jsonl이다. FIG. 10의 오른쪽 열이 그 경로다.
MeshKit은 앱이 에이전트에게 기능을 공개하고, 서명된 요청과 서명된 영수증으로만 일을 주고받게 하는 오픈소스(MIT) 신뢰 계층이다. Round 3의 부품은 FIG. 11처럼 MeshKit의 부품과 하나씩 맞물린다. 키트가 가게 앞에 MeshKit endpoint를 열어 주므로 가게 코드는 다시 쓰지 않는다. MeshKit은 수업과 함께 키우는 레포라서, 키트를 쓰다 찾은 버그와 개선은 PR로 보내면 된다.
12주차부터 내 가게에는 FIG. 12처럼 MeshKit 입구가 하나 더 생긴다. 시장 buyer는 지금처럼 A2A와 ACP로 들어오고, 휴대폰 앱과 다른 에이전트는 MeshKit endpoint로 들어온다.
| 주차 | 시장과 MeshKit |
|---|---|
| 9~11 (Round 3) | Round 3를 돌리며 pro-activeness와 social ability를 다룬다. 11주차에 Round 3 결과를 본다 |
| 12 | 키트가 내 가게 앞에 MeshKit endpoint를 연다. 테스트가 변조, replay, 예산 초과, 사칭 요청으로 공격한다 |
| 13 | 에이전트 주소와 소개. buyer끼리 서로를 찾고 먼저 제안한다(공동구매, 약속 잡기) |
| 14 | 상호 테스트. 서로의 가게를 모바일 앱에서 부른다 |
| 15 | 데모데이 |
8주차 HW의 중간 평가를 Round 3 시장에서 이어 간다. 제출 폴더는 submissions/<학번>/week-08이다.
Round 3 중간 점검과 pro-activeness. Round 3 데이터에서 먼저 움직인 에이전트를 찾고, 먼저 말을 거는 일이 언제 이득인지 다룬다.