Repository navigation
Expand file tree
/
Copy pathweek-03.html
More file actions
680 lines (607 loc) · 50.4 KB
/
Copy pathweek-03.html
File metadata and controls
680 lines (607 loc) · 50.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Agentic AI Week 03: 고전 MAS 1: Contract Net</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600&family=IBM+Plex+Mono:wght@400;500&family=Noto+Serif+KR:wght@500;600&display=swap" rel="stylesheet">
<style>
:root{
--paper:#FFFFFF;
--ink:#1C1917;
--body:#44403C;
--muted:#78716C;
--faint:#A8A29E;
--line:#E7E5E4;
--wash:#FAFAF9;
--link:#2563EB;
--mono:'IBM Plex Mono', ui-monospace, monospace;
--sans:'Pretendard Variable', Pretendard, -apple-system, sans-serif;
--serif:Fraunces, 'Noto Serif KR', Georgia, serif;
--maxw:680px;
--r:8px;
}
*{margin:0;padding:0;box-sizing:border-box}
body{
background:var(--paper);
color:var(--body);
font-family:var(--sans);
font-weight:400;
line-height:1.8;
font-size:15.5px;
word-break:keep-all;
overflow-wrap:break-word;
-webkit-font-smoothing:antialiased;
}
::selection{background:var(--ink);color:var(--paper)}
a{color:var(--link);text-decoration:none}
a:hover{text-decoration:underline}
/* ---------- layout ---------- */
.sheet{max-width:1040px;margin:0 auto;padding:0 24px}
.col{max-width:var(--maxw);margin:0 auto;position:relative}
/* ---------- header ---------- */
header.doc{padding:40px 0 0}
.topnav{font-family:var(--mono);font-size:11px;letter-spacing:.04em;margin-bottom:56px;display:flex;justify-content:space-between;gap:16px}
.masthead{padding-bottom:64px;border-bottom:1px solid var(--line)}
.masthead .wk{
font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;
color:var(--faint);margin-bottom:16px;
}
h1.title{
font-family:var(--serif);font-weight:500;
font-size:clamp(30px,4.6vw,44px);line-height:1.2;
letter-spacing:-0.01em;color:var(--ink);text-wrap:balance;
}
h1.title .en{display:block;font-family:var(--mono);font-size:12px;font-weight:400;color:var(--muted);letter-spacing:.06em;margin-top:14px}
.lede{
margin-top:26px;max-width:560px;font-size:16px;line-height:1.85;color:var(--muted);
}
.lede .q{font-weight:600;color:var(--ink)}
/* ---------- section scaffolding ---------- */
section{padding:56px 0 8px}
.secmark{
display:flex;align-items:baseline;gap:14px;margin-bottom:32px;
border-top:1px solid var(--line);padding-top:20px;
}
.secmark .no{
font-family:var(--mono);font-weight:500;font-size:10.5px;color:var(--faint);
letter-spacing:.12em;white-space:nowrap;text-transform:uppercase;
}
.secmark h2{font-family:var(--serif);font-weight:500;font-size:clamp(21px,2.8vw,26px);line-height:1.3;letter-spacing:-0.005em;color:var(--ink);text-wrap:balance}
h3{font-family:var(--serif);font-weight:500;font-size:18px;margin:44px 0 14px;color:var(--ink)}
h3 .tag{font-family:var(--mono);font-size:10px;color:var(--faint);letter-spacing:.12em;display:block;margin-bottom:6px;font-weight:500}
p{margin-bottom:20px}
strong{font-weight:600;color:var(--ink)}
em{font-style:normal;font-weight:600;color:var(--ink);box-shadow:inset 0 -0.35em 0 rgba(28,25,23,.07)}
.small{font-size:13.5px;color:var(--muted)}
.nb{white-space:nowrap}
/* part banner */
.part{
margin:72px 0 8px;border-top:2px solid var(--ink);
padding:24px 0 6px;
}
.part .lbl{font-family:var(--mono);font-size:10.5px;letter-spacing:.14em;color:var(--muted);font-weight:500;margin-bottom:10px;text-transform:uppercase}
.part h2{font-family:var(--serif);font-weight:500;font-size:clamp(20px,2.6vw,25px);line-height:1.35;color:var(--ink)}
.part .meta{font-family:var(--mono);font-size:10.5px;color:var(--faint);margin-top:10px;letter-spacing:.03em}
/* marginalia */
.note{
font-family:var(--mono);font-size:11px;line-height:1.75;color:var(--faint);
border-left:2px solid var(--line);padding-left:12px;margin:26px 0;
}
@media(min-width:1120px){
.note{position:absolute;width:190px;left:calc(50% + var(--maxw)/2 + 36px);margin:0;transform:translateY(-100%)}
}
.note b{color:var(--muted);font-weight:500;display:block;margin-bottom:4px;letter-spacing:.08em}
/* pull quote */
.pull{
margin:40px 0;padding:2px 0 2px 24px;border-left:2px solid var(--ink);
font-family:var(--serif);font-size:19px;line-height:1.65;font-weight:500;color:var(--ink);
}
.pull .src{display:block;font-family:var(--mono);font-size:10.5px;color:var(--faint);font-weight:400;margin-top:10px;letter-spacing:.03em}
/* definition */
.define{margin:48px 0;background:var(--wash);border:1px solid var(--line);border-radius:var(--r);padding:32px 32px 26px;position:relative}
.define::before{
content:"DEFINITION";position:absolute;top:14px;left:32px;
font-family:var(--mono);font-size:9.5px;letter-spacing:.16em;color:var(--faint);font-weight:500;
}
.define p{margin:16px 0 0;font-family:var(--serif);font-size:clamp(16px,2.1vw,19px);line-height:1.7;font-weight:500;color:var(--ink)}
.define .sub{font-family:var(--sans);font-size:12.5px;font-weight:400;color:var(--muted);margin-top:14px}
.define ul{margin:14px 0 0 22px;padding:0}
.define li{font-family:var(--serif);font-size:clamp(15px,2vw,17px);line-height:1.9;font-weight:500;color:var(--ink)}
@media(max-width:640px){.define{padding:28px 20px 22px}.define::before{left:20px}}
/* instructor */
.bio{margin:8px 0 0;border:1px solid var(--line);border-radius:var(--r);padding:26px 28px 20px}
.bio{display:flex;gap:28px;align-items:flex-start}
.bio .photo{flex:0 0 210px;width:210px;height:262px;object-fit:cover;object-position:38% 12%;border-radius:6px;display:block}
.bio .info{flex:1 1 auto;min-width:0}
.bio .name{font-family:var(--serif);font-weight:500;font-size:19px;color:var(--ink);margin-bottom:2px}
.bio .role{font-family:var(--mono);font-size:10.5px;color:var(--muted);letter-spacing:.1em;margin-bottom:14px;text-transform:uppercase}
.bio p{font-size:14px;line-height:1.85;color:var(--body);margin-bottom:12px}
.bio .links{font-family:var(--mono);font-size:11.5px;letter-spacing:.02em}
.bio .links a{white-space:nowrap}
.bio .links span{color:var(--faint);margin:0 8px}
@media(max-width:640px){.bio{flex-direction:column}.bio .photo{width:100%;height:200px;flex:none}.bio{padding:22px 18px 16px}}
/* table */
.tbl-wrap{margin:28px 0;overflow-x:auto}
table{width:100%;border-collapse:collapse;font-size:13.5px;line-height:1.7}
th{
font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;text-align:left;text-transform:uppercase;
border-bottom:1px solid var(--ink);
padding:10px 14px;font-weight:500;color:var(--muted);
}
td{padding:13px 14px;border-bottom:1px solid var(--line);vertical-align:top}
td.stage{font-weight:600;color:var(--ink);white-space:nowrap;font-size:13px}
td .m{font-family:var(--mono);font-size:11.5px;color:var(--muted)}
/* figure */
.fig{margin:40px 0;border:1px solid var(--line);border-radius:var(--r);padding:26px 22px 14px}
.fig .cap{
font-family:var(--mono);font-size:10.5px;letter-spacing:.04em;color:var(--faint);
margin-top:12px;display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;
}
.fig .cap b{color:var(--muted);font-weight:500}
.fig svg{width:100%;height:auto;display:block}
.fig img{width:100%;height:auto;display:block}
svg text{font-family:var(--mono)}
/* code */
.code{
margin:28px 0;background:var(--wash);color:var(--ink);
font-family:var(--mono);font-size:12.5px;line-height:1.7;
padding:20px 22px;overflow-x:auto;border:1px solid var(--line);border-radius:var(--r);
}
.code .file{
display:block;font-size:10px;letter-spacing:.1em;color:var(--muted);
margin-bottom:14px;font-weight:500;text-transform:uppercase;
}
.code pre{font-family:inherit;white-space:pre;margin:0}
.code .cm{color:var(--faint)}
.code .kw{color:#1D4ED8}
.code .st{color:#15803D}
code.inline{
font-family:var(--mono);font-size:.85em;background:var(--wash);
padding:2px 6px;border:1px solid var(--line);border-radius:4px;white-space:nowrap;
}
/* numbered steps */
.pre{counter-reset:pre;margin:24px 0}
.pre>li{list-style:none;position:relative;padding:16px 0 16px 48px;border-bottom:1px solid var(--line)}
.pre>li:first-child{border-top:1px solid var(--line)}
.pre>li::before{
counter-increment:pre;content:counter(pre);
position:absolute;left:4px;top:18px;width:24px;height:24px;
border:1px solid var(--faint);border-radius:50%;color:var(--muted);
font-family:var(--mono);font-weight:500;font-size:11.5px;
display:flex;align-items:center;justify-content:center;
}
.pre b.lead{font-weight:600;color:var(--ink)}
/* discussion */
.open{border:1px solid var(--line);border-radius:var(--r);padding:26px 28px;margin:40px 0;background:var(--wash)}
.open .lbl{font-family:var(--mono);font-size:10.5px;letter-spacing:.12em;color:var(--muted);font-weight:500;margin-bottom:14px;text-transform:uppercase}
.open ol{margin-left:20px}
.open li{margin-bottom:12px;line-height:1.8}
@media(max-width:640px){.open{padding:20px 18px}}
/* checkpoint */
.check{margin:28px 0;border:1px solid var(--ink);border-radius:var(--r);padding:18px 22px 14px}
.check .lbl{font-family:var(--mono);font-size:10px;letter-spacing:.14em;color:var(--paper);background:var(--ink);border-radius:4px;display:inline-block;padding:3px 9px;font-weight:500;margin-bottom:12px}
.check ul{margin-left:20px}
.check li{margin-bottom:8px;line-height:1.75}
/* recorder metrics */
.recorder{margin:32px 0;border-top:1px solid var(--ink)}
.recorder>div{display:flex;gap:18px;padding:13px 0;border-bottom:1px solid var(--line)}
.recorder .k{font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;color:var(--muted);font-weight:500;flex:0 0 120px;padding-top:3px;text-transform:uppercase}
.recorder .v{font-size:13.5px;line-height:1.7;color:var(--body)}
@media(max-width:640px){.recorder>div{flex-direction:column;gap:4px}}
/* notice */
.notice{margin:36px 0;border:1px solid var(--line);border-radius:var(--r);padding:24px 26px 18px}
.notice .lbl{font-family:var(--mono);font-size:10px;letter-spacing:.12em;color:var(--muted);font-weight:500;margin-bottom:14px;text-transform:uppercase}
.notice p{margin-bottom:13px;font-size:14px}
.notice ul{margin:0 0 13px 22px}
.notice li{margin-bottom:8px;font-size:13.5px;line-height:1.75}
@media(max-width:640px){.notice{padding:20px 18px 14px}}
/* homework */
.hw{margin:40px 0;border:1px solid var(--line);border-radius:var(--r);overflow:hidden}
.hw .head{
border-bottom:1px solid var(--line);background:var(--wash);padding:11px 22px;
font-family:var(--mono);font-size:10.5px;letter-spacing:.12em;font-weight:500;color:var(--muted);text-transform:uppercase;
}
.hw .body{padding:22px 24px 8px}
.hw .due{font-family:var(--mono);font-size:11px;color:var(--faint);letter-spacing:.05em;margin-bottom:13px;font-weight:500}
/* readings */
.readings{margin:24px 0}
.readings>li{list-style:none;position:relative;padding:18px 0 18px 60px;border-bottom:1px solid var(--line)}
.readings>li:first-child{border-top:1px solid var(--line)}
.readings .badge{
position:absolute;left:0;top:20px;
font-family:var(--mono);font-weight:500;font-size:10px;letter-spacing:.06em;
padding:3px 8px;border-radius:4px;
}
.readings .badge.req{background:var(--ink);color:var(--paper)}
.readings .badge.opt{border:1px solid var(--faint);color:var(--faint)}
.readings b.lead{font-weight:600;color:var(--ink)}
.readings .why{display:block;font-size:13px;color:var(--muted);margin-top:6px}
/* next week */
.next{margin:64px 0 0;border-top:2px solid var(--ink);padding-top:22px}
.next .lbl{font-family:var(--mono);font-size:10.5px;letter-spacing:.12em;color:var(--muted);font-weight:500;margin-bottom:12px;text-transform:uppercase}
.next p{font-size:14px;color:var(--body)}
/* footer */
footer{
margin-top:64px;border-top:1px solid var(--line);
padding:20px 0 56px;display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;
font-family:var(--mono);font-size:10.5px;color:var(--faint);letter-spacing:.03em;
}
footer .o{color:var(--muted)}
@media(max-width:640px){body{font-size:15px}}
@media print{
body{font-size:10.5pt}
.topnav{display:none}
}
</style>
</head>
<body>
<div class="sheet">
<header class="doc">
<div class="col">
<div class="topnav"><a href="index.html">← COURSE HOME</a><a href="week-03-en.html">EN</a></div>
<div class="masthead">
<div class="wk">WEEK 03</div>
<h1 class="title">고전 MAS 1: Contract Net
<span class="en">Classical MAS 1: Contract Net</span>
</h1>
<p class="lede">Contract Net은 공고, 입찰, 낙찰로 작업을 배정한다. LLM이 제시한 확신도를 입찰에 사용하고, 배정 정확도와 메시지 수를 측정한다.</p>
</div>
</div>
</header>
<!-- ============ 구성 ============ -->
<section>
<div class="col">
<div class="secmark"><span class="no">01</span><h2>목차</h2></div>
<div class="tbl-wrap">
<table>
<tr><th>구분</th><th>내용</th></tr>
<tr><td class="stage">A1</td><td>Contract Net Protocol: 공고, 입찰, 낙찰</td></tr>
<tr><td class="stage">A2</td><td>시장 기반 태스크 할당의 발전과 한계</td></tr>
<tr><td class="stage">A3</td><td>규칙 기반 입찰과 LLM의 확신도, 재현 실험 설계</td></tr>
<tr><td class="stage">토론</td><td>과신 입찰이 작업 배정에 미치는 영향</td></tr>
<tr><td class="stage">LAB</td><td>manager 1 + contractor 3 재현 실험</td></tr>
</table>
</div>
</div>
</section>
<!-- ============ PART A ============ -->
<div class="col">
<div class="part">
<div class="lbl">PART A: LECTURE</div>
<h2>Contract Net Protocol: 협상으로 일을 나눈다</h2>
</div>
</div>
<section>
<div class="col">
<div class="secmark"><span class="no">A1</span><h2>Contract Net Protocol: 공고, 입찰, 낙찰</h2></div>
<p>계산, 글쓰기, 코드를 각각 담당하는 에이전트가 있다면 작업에 맞는 에이전트를 골라야 한다. Reid G. Smith는 1980년 IEEE Transactions on Computers에 발표한 “The Contract Net Protocol: High-Level Communication and Control in a Distributed Problem Solver”에서 협상을 통한 작업 배정 절차를 제안했다.</p>
<p>Smith의 논문에서는 컴퓨터 여러 대가 하나의 큰 문제를 나눠 푼다. 각 컴퓨터는 자기가 무엇을 할 수 있는지만 안다. 전체 작업을 배정하는 중앙 컴퓨터는 없다. Smith는 어떤 일을 어떤 컴퓨터가 맡을지 정하는 문제를 <span class="nb">connection problem</span>이라 불렀고, 답으로 협상을 택했다.</p>
<div class="define">
<p>Contract Net Protocol은 일을 나누는 절차다. 일을 가진 쪽(manager)이 공고하고, 할 수 있는 쪽(contractor)이 입찰하고, manager가 하나를 골라 낙찰한다.</p>
<p class="sub">R. G. Smith, “The Contract Net Protocol” (1980). 원문은 “Task distribution is affected by a negotiation process, a discussion carried on between nodes with tasks to be executed and nodes that may be able to execute those tasks.”</p>
</div>
<p>중앙에서 통제하지 않고, 정보가 양쪽으로 오가며, 각자가 자기 기준으로 판단하고, 양쪽이 서로 고른다(<span class="nb">mutual selection</span>). contractor는 여러 공고 중 자기에게 맞는 것을 고르고, manager는 여러 입찰 중 하나를 고른다.</p>
<div class="pull">양쪽은 정보를 교환한 뒤 각자의 기준으로 계약 상대를 선택한다.<span class="src">“A contract is established by a process of local mutual selection based on a two-way transfer of information.” R. G. Smith, “The Contract Net Protocol” (1980)</span></div>
<p>일을 가진 쪽이 <strong>manager</strong>가 되어 <span class="nb">공고(task announcement)</span>를 낸다. 공고에는 작업 내용(task abstraction), 입찰 자격(eligibility specification), 입찰서 항목(bid specification), 입찰 마감(expiration time)을 적는다. 자격이 되는 쪽이 <span class="nb">입찰(bid)</span>을 보낸다. 입찰서에는 자기가 할 수 있는 것을 적는다(node abstraction). manager가 입찰을 비교해 하나를 고르고 <span class="nb">낙찰(award)</span>한다. 낙찰받은 쪽이 <strong>contractor</strong>가 되어 일을 하고, 결과를 보고(report)한다.</p>
<div class="fig" id="fig1">
<svg viewBox="0 0 680 330" role="img" aria-label="One contract net cycle: the manager broadcasts a task announcement, contractors A and B bid, C stays silent, the manager awards to A, A reports the result">
<g fill="#1C1917" font-size="12" font-weight="600" text-anchor="middle">
<text x="90" y="28">Manager</text>
<text x="290" y="28">Contractor A</text>
<text x="470" y="28">Contractor B</text>
<text x="620" y="28" fill="#78716C" font-weight="500">Contractor C</text>
</g>
<g stroke="#A8A29E" stroke-width="1" stroke-dasharray="3 4">
<line x1="90" y1="40" x2="90" y2="310"/>
<line x1="290" y1="40" x2="290" y2="310"/>
<line x1="470" y1="40" x2="470" y2="310"/>
<line x1="620" y1="40" x2="620" y2="310"/>
</g>
<g fill="none" stroke="#1C1917" stroke-width="1.5">
<path d="M90 78 L290 78"/><path d="M280 72 L290 78 L280 84"/>
<path d="M90 92 L470 92"/><path d="M460 86 L470 92 L460 98"/>
<path d="M90 106 L620 106"/><path d="M610 100 L620 106 L610 112"/>
<path d="M290 156 L90 156"/><path d="M100 150 L90 156 L100 162"/>
<path d="M470 172 L90 172"/><path d="M100 166 L90 172 L100 178"/>
<path d="M90 226 L290 226"/><path d="M280 220 L290 226 L280 232"/>
<path d="M290 282 L90 282"/><path d="M100 276 L90 282 L100 288"/>
</g>
<g fill="#78716C" font-size="10">
<text x="100" y="70">1 task-announcement (broadcast)</text>
<text x="100" y="148">2 bid (A)</text>
<text x="100" y="186">2 bid (B)</text>
<text x="612" y="130" text-anchor="end">C: no bid</text>
<text x="100" y="218">3 award → A</text>
<text x="100" y="274">4 report</text>
<text x="290" y="306" text-anchor="middle">A is now the contractor</text>
</g>
</svg>
<div class="cap"><span><b>FIG. 01</b> One contract net cycle</span><span>task-announcement → bid → award → report</span></div>
</div>
<p>논문의 예는 센서 네트워크다. 넓은 지역에 센서와 컴퓨터가 흩어져 있고, 함께 차량이 어디로 움직이는지 지도를 만든다. 논문 첫 그림의 공고에서 자격은 “센서가 있을 것, 구역 A에 있을 것”이고, 입찰서에 적을 것은 “위도와 경도, 센서마다 이름과 종류”다. manager가 입찰서에 적을 항목을 정하므로 contractor는 그 항목만 보내고, manager는 그 항목만 보고 고른다.</p>
<div class="code"><span class="file">Smith 1980, message grammar</span><pre>TASK-ANNOUNCEMENT [name] {task-abstraction} {eligibility-specification} {bid-specification} [expiration-time]
BID [name] {node-abstraction}
ANNOUNCED-AWARD [name] {task-specification}
DIRECTED-AWARD [name] {task-abstraction} {eligibility-specification} {task-specification}
ACCEPTANCE | REFUSAL [name] {refusal-justification}
INTERIM-REPORT | FINAL-REPORT [name] {result-description}
TERMINATION [name]
NODE-AVAILABLE {eligibility-specification} {node-abstraction} [expiration-time]
REQUEST | INFORMATION</pre></div>
<p>directed award는 manager가 적임자를 이미 알 때 공고 없이 바로 맡기는 메시지다. request와 information은 계약까지 갈 필요 없는 짧은 질문과 답이다. node available은 작업을 받을 수 있는 노드가 가용 상태를 알리는 메시지이다. manager는 이 알림을 받아 해당 노드에 맞는 작업을 찾는다. Smith는 자격 조건과 directed award를 두는 이유를 쓸데없는 메시지와 입찰 처리 부담을 줄이기 위해서라고 적었다.</p>
<p>역할은 일마다 바뀐다. 낙찰받은 contractor가 일을 더 잘게 쪼개 다시 공고하면, 그 작은 일들의 manager다. 한 컴퓨터가 어떤 일에서는 contractor이면서 다른 일에서는 manager일 수 있고, 일을 남에게 맡긴 컴퓨터는 결과를 기다리는 동안 다른 일을 받을 수 있다. Smith는 이렇게 층이 겹치는 구조가 task-sharing의 기본 모양이라고 적었다.</p>
<div class="note"><b>WHERE THE PAPER WAS TESTED</b>Smith는 이 프로토콜을 CNET이라는 시뮬레이터의 분산 센싱 시스템에서 실행했다. 실습의 공고 형식은 논문 Fig. 1의 signal task announcement를 그대로 따른다.</div>
</div>
</section>
<section>
<div class="col">
<div class="secmark"><span class="no">A2</span><h2>시장 기반 태스크 할당의 발전과 한계</h2></div>
<p>Smith와 Randall Davis는 1983년 “Negotiation as a Metaphor for Distributed Problem Solving”에서 이 절차를 분산 문제 해결에 적용할 수 있는 협상 방식으로 정리했다.</p>
<p>Smith는 contractor가 무엇을 근거로 입찰하고 manager가 무엇을 기준으로 고르는지는 정하지 않았다. Tuomas Sandholm이 1993년 AAAI 논문에서 이 부분을 채웠다. 입찰가는 그 일을 지금 하는 일에 더했을 때 늘어나는 비용(<span class="nb">marginal cost</span>)이고, 각자 자기 이익만 따지는 에이전트들이 이 값으로 거래한다. 2002년 FIPA는 이 절차를 Contract Net Interaction Protocol이라는 표준으로 만들었다. manager가 cfp(제안 요청)를 보내고, 참여자는 propose(제안) 또는 refuse(거절)로 답하고, manager는 accept-proposal과 reject-proposal로 결과를 알리고, 일을 맡은 쪽은 inform(완료) 또는 failure(실패)로 끝낸다. cfp에는 답장 마감이 있고, 제안은 수락되는 순간 지켜야 하는 약속이 된다. 로봇 연구에서는 Gerkey와 Matarić이 2004년 여러 로봇에게 일을 나누는 문제의 분류 체계를 세웠고, Dias 등이 2006년 시장 방식의 로봇 협업 연구를 정리했다.</p>
<div class="fig" id="fig2">
<svg viewBox="0 0 680 250" role="img" aria-label="Lineage of contract net task allocation: Smith 1980, Davis and Smith 1983, Sandholm 1993, FIPA 2002, Gerkey and Mataric 2004, and LLM contractors in this lab, by who bids and how the bid is made">
<g fill="none" stroke="#1C1917" stroke-width="1.5">
<rect x="60" y="30" width="100" height="44"/>
<rect x="163" y="30" width="100" height="44"/>
<rect x="266" y="30" width="100" height="44"/>
<rect x="369" y="30" width="100" height="44"/>
<rect x="472" y="30" width="100" height="44"/>
<rect x="575" y="30" width="100" height="44" stroke="#A8A29E" stroke-dasharray="4 4"/>
<path d="M70 218 L660 218"/><path d="M648 212 L660 218 L648 224"/>
</g>
<g text-anchor="middle" fill="#1C1917" font-size="10" font-weight="600">
<text x="110" y="52">Smith</text><text x="110" y="66">CNP</text>
<text x="213" y="52">Davis, Smith</text><text x="213" y="66">negotiation</text>
<text x="316" y="52">Sandholm</text><text x="316" y="66">TRACONET</text>
<text x="419" y="52">FIPA</text><text x="419" y="66">Contract Net IP</text>
<text x="522" y="52">Gerkey, Matarić</text><text x="522" y="66">MRTA taxonomy</text>
<text x="625" y="52" fill="#78716C" font-weight="500">this lab</text><text x="625" y="66" fill="#78716C" font-weight="500">LLM contractors</text>
</g>
<g fill="#A8A29E" font-size="9.5" letter-spacing="1">
<text x="0" y="57">WORK</text>
<text x="0" y="112">WHO BIDS</text>
<text x="0" y="156">BID IS</text>
<text x="0" y="196">YEAR</text>
</g>
<g text-anchor="middle" fill="#1C1917" font-size="10.5">
<text x="110" y="106">cooperative</text><text x="110" y="120">nodes</text>
<text x="213" y="106">cooperative</text><text x="213" y="120">nodes</text>
<text x="316" y="106">self-interested</text><text x="316" y="120">agents</text>
<text x="419" y="112">any agent</text>
<text x="522" y="112">robots</text>
<text x="625" y="112">LLM agents</text>
</g>
<g text-anchor="middle" fill="#78716C" font-size="10">
<text x="110" y="150">node abstraction</text><text x="110" y="164">(position, sensors)</text>
<text x="213" y="156">a proposal</text>
<text x="316" y="156">marginal cost</text>
<text x="419" y="150">propose with</text><text x="419" y="164">preconditions</text>
<text x="522" y="150">utility or</text><text x="522" y="164">cost estimate</text>
<text x="625" y="150">verbalized</text><text x="625" y="164">confidence</text>
<text x="110" y="196">1980</text>
<text x="213" y="196">1983</text>
<text x="316" y="196">1993</text>
<text x="419" y="196">2002</text>
<text x="522" y="196">2004</text>
<text x="625" y="196">2026</text>
<text x="365" y="240" fill="#1C1917">the bid moves from a computed value to a judged one</text>
</g>
</svg>
<div class="cap"><span><b>FIG. 02</b> The contract net lineage</span><span>who bids, and how the bid is made</span></div>
</div>
<p>첫째 한계는 <strong>통신과 입찰 처리 비용</strong>이다. 공고를 모두에게 보내면 참여자 수만큼 메시지가 나가고, 입찰이 들어오면 manager가 전부 읽고 비교해야 한다.</p>
<p>둘째는 <strong>국소 최적(local optimum)</strong>이다. 계약은 그 순간 들어온 입찰만 보고 맺는다. 개별 계약에서 유리한 선택이 전체 작업의 최적 배정을 보장하지는 않는다. Sandholm은 “지금 상태에서 더 이득이 되는 교환이 없다”는 상태를 k-optimal이라 부르고, 이것이 전체 최적을 보장하지는 않는다고 적었다.</p>
<p>셋째는 <strong>신뢰</strong>다. 입찰은 “내가 이 일을 할 수 있다”는 주장이다. 이 주장이 참인지 확인하는 메시지가 절차에 없다. Smith의 시스템은 노드들이 공동의 문제를 해결하는 설정이었고, 입찰 정보는 위치와 센서 목록이었다. Sandholm의 self-interested agent는 프로그램으로 계산한 비용을 입찰가로 사용했다.</p>
<div class="note"><b>WHAT FIPA ADDED</b>FIPA 표준은 cfp에 답장 마감을 넣어 manager가 무한정 기다리지 않게 했고, 마감 뒤 온 제안은 자동으로 거절된다. 신뢰 문제는 여기서도 다루지 않는다.</div>
</div>
</section>
<section>
<div class="col">
<div class="secmark"><span class="no">A3</span><h2>규칙 기반 입찰과 LLM의 확신도</h2></div>
<p>기존 시스템에서는 <strong>정해진 정보와 계산 규칙</strong>으로 입찰을 만들었다. Smith의 센서 노드는 위치와 센서 목록을, Sandholm의 에이전트는 계산한 비용을 보냈다.</p>
<p>LLM contractor는 공고와 system prompt의 능력 설명을 입력받아 <strong>입찰 여부와 확신도</strong>를 생성한다. 이 확신도는 모델의 자기 평가이다. Miao Xiong 등이 ICLR 2024에 낸 “Can LLMs Express Their Uncertainty?”는 GPT-4와 LLaMA 2를 포함한 다섯 모델에게 확신도를 말하게 하고 실제 정답률과 비교했다. 모델은 자신을 실제보다 높게 평가했고, 모델이 커져도 그 경향은 남았다.</p>
<div class="define">
<p>실습에서는 LLM contractor의 확신도로 작업을 배정하고, 미리 정한 gold contractor와 일치하는지 측정한다.</p>
<p class="sub">Smith의 공고, 입찰, 낙찰 절차를 사용하며 입찰 정보와 낙찰 기준을 실습에 맞게 설정한다.</p>
</div>
<p><strong>바꾸는 것(독립변수)</strong>은 한 번에 하나만 바꾼다. contractor들의 능력이 서로 다른가 같은가, 한 contractor에게 과신 지시를 줬는가. <strong>고정하는 것(통제변수)</strong>은 실험 내내 그대로 둔다. 태스크 목록, 조건별 변경 부분을 제외한 공통 프롬프트, 모델, 직접 지정할 수 있는 temperature와 max_tokens를 고정한다. 사용 도구와 버전도 기록한다. 이 설정이 실행마다 달라지면 어떤 변경 때문에 결과가 달라졌는지 구분하기 어렵다. <strong>재는 것(측정변수)</strong>은 실행마다 기록한다.</p>
<div class="note"><b>temperature를 지정할 수 없는 도구</b><code class="inline">claude -p</code>처럼 temperature 옵션을 제공하지 않는 도구는 설정값을 추측하지 말고 “직접 설정 불가, 내부 값 미확인”으로 기록한다. <code class="inline">--system-prompt</code>에 담당 분야, 입찰 기준, 응답 형식을 명시한다. 예를 들어 “담당 분야에 해당하는 작업에만 입찰하고, bid·confidence·reason을 포함한 JSON 객체 하나만 출력한다. 코드 블록이나 추가 설명은 붙이지 않는다.”처럼 작성한다. 이 지시는 temperature를 바꾸거나 동일한 응답을 보장하지 않는다. 공통 지시는 세 조건에 동일하게 적용하고, overconfident 조건에서만 과신 지시를 추가한다. 설정마다 3번 이상 실행하고 파싱 실패도 기록한다.</div>
<div class="recorder">
<div><span class="k">quality</span><span class="v">정답 contractor에게 간 태스크 수 ÷ 전체 태스크 수. 태스크마다 gold contractor를 실행 전에 정해 둔다.</span></div>
<div><span class="k">messages</span><span class="v">한 라운드에 오간 공고, 입찰, 낙찰 메시지 수. 방송 공고는 contractor 수만큼 센다.</span></div>
<div><span class="k">failure modes</span><span class="v">입찰이 하나도 없는 태스크(unassigned), 정답이 아닌 contractor에게 간 태스크(misaward), 파싱할 수 없는 응답(parse fail).</span></div>
</div>
<div class="fig" id="fig3">
<svg viewBox="0 0 680 290" role="img" aria-label="Experiment structure: with the same tasks, prompts, model, and temperature, run baseline, homogeneous, and overconfident conditions and measure them with the same criteria">
<g fill="none" stroke="#1C1917" stroke-width="1.5">
<rect x="230" y="20" width="220" height="54"/>
<rect x="20" y="130" width="200" height="60"/>
<rect x="240" y="130" width="200" height="60"/>
<rect x="460" y="130" width="200" height="60"/>
<rect x="210" y="230" width="260" height="54"/>
<path d="M300 74 L120 130"/><path d="M133 119 L120 130 L138 130"/>
<path d="M340 74 L340 130"/><path d="M334 118 L340 130 L346 118"/>
<path d="M380 74 L560 130"/><path d="M542 130 L560 130 L547 119"/>
<path d="M120 190 L300 230"/><path d="M285 231 L300 230 L290 218"/>
<path d="M340 190 L340 230"/><path d="M334 218 L340 230 L346 218"/>
<path d="M560 190 L380 230"/><path d="M395 231 L380 230 L390 218"/>
</g>
<g text-anchor="middle" fill="#1C1917" font-size="13" font-weight="600">
<text x="340" y="44">Same conditions</text>
<text x="120" y="154">baseline</text>
<text x="340" y="154">homogeneous</text>
<text x="560" y="154">overconfident</text>
<text x="340" y="254">Same verdict</text>
</g>
<g text-anchor="middle" fill="#78716C" font-size="10">
<text x="340" y="62">tasks, prompts, model, temperature</text>
<text x="120" y="174">three skills, 3 runs</text>
<text x="340" y="174">one generalist skill, 3 runs</text>
<text x="560" y="174">one told to bid on all, 3 runs</text>
<text x="340" y="272">correct, messages, unassigned, misawards</text>
</g>
</svg>
<div class="cap"><span><b>FIG. 03</b> Experiment structure</span><span>one independent variable per condition</span></div>
</div>
<p>baseline을 기준으로 homogeneous와 overconfident의 배정 정확도, 메시지 수, 실패 유형을 비교한다. homogeneous는 능력 설명을 같게 만들고, overconfident는 C에게 높은 확신도로 입찰하도록 지시한다.</p>
</div>
</section>
<!-- ============ 토론 ============ -->
<section>
<div class="col">
<div class="open">
<div class="lbl">DISCUSSION: 과신 입찰이 작업 배정에 미치는 영향</div>
<ol>
<li>contractor 하나가 모든 공고에 확신도 95 이상으로 입찰한다. manager가 확신도만으로 낙찰자를 고를 때, gold contractor가 낙찰받을 조건은 무엇인가.</li>
<li>과거 작업 결과, 낙찰 후 결과 검증, 평판 점수를 낙찰 기준에 추가하면 각각 어떤 정보와 처리 비용이 필요한가.</li>
<li>규칙 기반 입찰의 비용 계산과 LLM 입찰의 확신도 검증에는 각각 어떤 오류가 생길 수 있는가.</li>
</ol>
</div>
</div>
</section>
<!-- ============ PART B ============ -->
<div class="col">
<div class="part">
<div class="lbl">PART B: LAB</div>
<h2>Contract Net 재현: manager 1 + contractor 3</h2>
<div class="meta">GOAL: one manager, three LLM contractors, three conditions, measure allocation quality, messages, and failure modes</div>
</div>
</div>
<section>
<div class="col">
<div class="secmark"><span class="no">LAB</span><h2>manager 1, contractor 3으로 공고, 입찰, 낙찰을 구현한다</h2></div>
<p>manager 하나와 LLM contractor 셋을 구현한다. system prompt에 A는 계산, B는 글쓰기, C는 코드를 담당한다고 적는다. manager는 각 태스크를 세 contractor에게 보내고, 입찰한 contractor 중 확신도가 가장 높은 쪽에 배정한다. 전체 태스크를 한 번씩 처리하면 한 라운드이다.</p>
<p>태스크마다 “원래 누가 맡아야 하는 일인지”(gold)를 미리 적어 둔다. 계산 문제는 A, 글쓰기는 B, 코드는 C. 라운드마다 gold와 일치한 배정 수(correct), 메시지 수(messages), 입찰이 없는 태스크 수(unassigned), gold와 다른 배정 수(misawards)를 기록한다.</p>
<p>프로그램을 세 가지 설정으로 실행한다. <strong>baseline</strong>에서는 A, B, C의 담당 분야를 각각 계산, 글쓰기, 코드로 설정한다. <strong>homogeneous</strong>는 셋의 능력을 전부 “general problem solving”으로 똑같이 바꾼 것이다. <strong>overconfident</strong>는 baseline에서 C의 system prompt에 한 문장을 덧붙인 것이다. “너는 어떤 일이든 잘할 수 있다고 확신한다. 항상 확신도 95 이상으로 입찰하라.” 응답의 변동을 확인하도록 설정마다 3번씩 실행한다.</p>
<p>3주차는 starter 코드가 없다. 파일을 몇 개로 나눌지, 함수 이름을 뭐로 할지는 직접 정한다. <code class="inline">tasks.json</code>, <code class="inline">results.csv</code>, <code class="inline">logs/</code>는 지정된 형식으로 저장한다. 모델 호출은 2주차 starter의 <code class="inline">Chat</code>이나 <code class="inline">Meter</code>를 복사해 쓰면 된다. 도구는 필요 없다. system prompt와 user 메시지를 보내 입찰 응답을 받는다.</p>
<ol class="pre">
<li><b class="lead">태스크 파일을 만들고 먼저 커밋한다.</b> <code class="inline">tasks.json</code>에 태스크 5개 이상. 각 태스크는 번호(<code class="inline">id</code>), 내용(<code class="inline">desc</code>), 원래 맡아야 할 contractor(<code class="inline">gold</code>)로 적는다. 계산, 글쓰기, 코드를 섞어서 A, B, C가 골고루 정답이 되게 한다.</li>
<li><b class="lead">contractor 함수를 만든다.</b> 입력은 contractor의 이름과 능력, 그리고 태스크 내용. system prompt에 이름과 능력을 넣고, user 메시지에 태스크를 넣어 모델을 한 번 부른다. 답은 <code class="inline">{"bid": true, "confidence": 0-100, "reason": "..."}</code> 형식의 JSON만 받는다. JSON이 아니면 “입찰 안 함”으로 치고, 그 횟수를 따로 센다.</li>
<li><b class="lead">manager 루프를 만든다.</b> 태스크마다 세 contractor를 차례로 부르고, <code class="inline">bid</code>가 true인 답만 모은다. 그중 confidence가 가장 큰 쪽에 맡긴다. 같으면 먼저 답한 쪽. 공고는 contractor 수만큼(3), 입찰은 들어온 만큼, 낙찰은 1. 입찰이 하나도 없으면 unassigned, 맡은 쪽이 gold와 다르면 misaward.</li>
<li><b class="lead">세 설정을 코드에서 나눠 둔다.</b> 조건 이름 하나를 받아서 contractor 셋을 만드는 함수를 두면 된다. homogeneous면 능력 문자열을 셋 다 같게, overconfident면 C의 system prompt에 한 문장을 덧붙인다. 그 외에는 아무것도 바꾸지 않는다.</li>
<li><b class="lead">설정마다 3번 실행하고 기록한다.</b> 실행마다 <code class="inline">results.csv</code>에 한 줄을 붙이고, 화면에 찍힌 공고, 입찰, 낙찰을 <code class="inline">logs/</code>에 파일 하나로 저장한다. 파일 첫 줄에 provider, 모델 이름, temperature를 적는다. 직접 지정할 수 없으면 그 제한과 사용 도구·버전을 적는다. 도중에 중단된 실행도 지우지 말고 note에 이유를 적는다.</li>
<li><b class="lead">실험 결과와 Smith의 설정을 비교한다.</b> 세 설정의 correct, messages, misawards 차이를 로그와 함께 분석한다. Smith의 센서 네트워크와 구현한 시스템은 다음 항목으로 비교표를 작성한다. 항목은 참여자, 입찰을 만드는 방식, 입찰이 참인지 보장하는 것, 잘된 배정의 기준, 협상 비용, 실패하는 방식.</li>
</ol>
<div class="code"><span class="file">tasks.json</span><pre>[
{<span class="st">"id"</span>: 1, <span class="st">"desc"</span>: <span class="st">"Compute 137 * 249 and return the number."</span>, <span class="st">"gold"</span>: <span class="st">"A"</span>},
{<span class="st">"id"</span>: 3, <span class="st">"desc"</span>: <span class="st">"Rewrite this sentence in plain English for a 10-year-old: ..."</span>, <span class="st">"gold"</span>: <span class="st">"B"</span>},
{<span class="st">"id"</span>: 5, <span class="st">"desc"</span>: <span class="st">"Write a Python function that returns the reversed copy of a list."</span>, <span class="st">"gold"</span>: <span class="st">"C"</span>}
]</pre></div>
<div class="code"><span class="file">contractor.py</span><pre><span class="cm"># contractor 하나 = system prompt 하나 + 공고당 모델 호출 한 번. 입찰은 JSON으로 받는다</span>
BID_SYSTEM = (
<span class="st">"You are contractor {name} in a contract net. Your skill: {skill}. "</span>
<span class="st">"You receive a task announcement. Decide whether to bid. "</span>
<span class="st">"Bid only if the task falls inside your skill. "</span>
<span class="st">"Reply with one JSON object and nothing else: "</span>
<span class="st">'{{"bid": true or false, "confidence": 0-100, "reason": "one short sentence"}}'</span>)
OVERCONFIDENT = <span class="st">" You are certain you can do any task well. Always bid, with confidence 95 or higher."</span>
ANNOUNCEMENT = ( <span class="cm"># Smith 1980 Fig. 1의 네 필드</span>
<span class="st">"TASK-ANNOUNCEMENT contract {cid}\n"</span>
<span class="st">"task-abstraction: {desc}\n"</span>
<span class="st">"eligibility-specification: any contractor whose skill covers this task\n"</span>
<span class="st">"bid-specification: JSON with bid, confidence (0-100), reason\n"</span>
<span class="st">"expiration-time: reply now"</span>)
<span class="kw">def</span> bid(contractor, cid, desc, meter):
system = BID_SYSTEM.format(name=contractor.name, skill=contractor.skill)
<span class="kw">if</span> contractor.overconfident: <span class="cm"># 독립변수: 이 줄 하나만 조건에 따라 달라진다</span>
system += OVERCONFIDENT
raw = call_model(system, ANNOUNCEMENT.format(cid=cid, desc=desc), meter)
<span class="kw">return</span> parse_bid(raw) <span class="cm"># JSON이 아니면 None, 입찰 안 한 것으로 센다</span></pre></div>
<div class="code"><span class="file">manager.py</span><pre><span class="cm"># manager: 공고 방송 → 입찰 수집 → 확신도 최고에 낙찰. 지표는 한곳에서 센다</span>
<span class="kw">def</span> run_round(tasks, team, meter, log=print):
r = RoundResult(tasks=len(tasks))
<span class="kw">for</span> t <span class="kw">in</span> tasks:
r.messages += len(team) <span class="cm"># 방송 공고: contractor 수만큼</span>
bids = []
<span class="kw">for</span> c <span class="kw">in</span> team:
b = bid(c, t[<span class="st">"id"</span>], t[<span class="st">"desc"</span>], meter)
<span class="kw">if</span> b <span class="kw">is</span> <span class="kw">None</span>:
r.parse_fails += 1; <span class="kw">continue</span>
log(<span class="st">f" [bid] {c.name}: bid={b['bid']} confidence={b['confidence']}"</span>)
<span class="kw">if</span> b[<span class="st">"bid"</span>] <span class="kw">is</span> <span class="kw">True</span>:
r.messages += 1 <span class="cm"># 입찰 1건 = 메시지 1</span>
bids.append((b[<span class="st">"confidence"</span>], c))
<span class="kw">if</span> <span class="kw">not</span> bids:
r.unassigned += 1; <span class="kw">continue</span> <span class="cm"># 유찰</span>
bids.sort(key=<span class="kw">lambda</span> x: -x[0]) <span class="cm"># 확신도 최고, 동점이면 입찰 순서</span>
winner = bids[0][1]
r.messages += 1 <span class="cm"># 낙찰 메시지</span>
<span class="kw">if</span> winner.name == t[<span class="st">"gold"</span>]: r.correct += 1
<span class="kw">else</span>: r.misawards += 1
log(<span class="st">f" [award] {winner.name} (gold {t['gold']})"</span>)
<span class="kw">return</span> r</pre></div>
<div class="code"><span class="file">results.csv</span><pre>run,condition,tasks,correct,messages,unassigned,misawards,note
<span class="cm"># condition: baseline | homogeneous | overconfident / 조건당 3줄 이상</span>
<span class="cm"># tasks, correct, messages, unassigned, misawards: 정수 / note: parse_fails, 토큰, 크래시 사유</span></pre></div>
<p class="small">gold는 실행 전에 <code class="inline">tasks.json</code>에 적어 커밋한다. 실행 결과에 맞춰 gold를 바꾸면 배정 정확도를 평가할 수 없다.</p>
<h3><span class="tag">REFERENCE RUN</span>무료 모델 실행 결과</h3>
<p>OpenRouter의 nvidia/nemotron-3.5-lightning:free로 태스크 6개를 설정마다 3번 실행했다. temperature는 0이며, 표의 값은 실행 순서대로 나열했다.</p>
<div class="tbl-wrap">
<table>
<tr><th>condition</th><th>correct / 6</th><th>messages</th><th>misawards</th><th>parse fails</th></tr>
<tr><td class="stage">baseline</td><td><span class="m">5, 6, 5</span></td><td><span class="m">32, 32, 32</span></td><td><span class="m">1, 0, 1</span></td><td><span class="m">1, 2, 2</span></td></tr>
<tr><td class="stage">homogeneous</td><td><span class="m">1, 2, 4</span></td><td><span class="m">42, 42, 41</span></td><td><span class="m">5, 4, 2</span></td><td><span class="m">0, 0, 1</span></td></tr>
<tr><td class="stage">overconfident</td><td><span class="m">4, 6, 6</span></td><td><span class="m">32, 33, 33</span></td><td><span class="m">2, 0, 0</span></td><td><span class="m">6, 3, 2</span></td></tr>
</table>
</div>
<p class="small">능력을 똑같이 만든 homogeneous 설정에서는 셋 다 거의 모든 태스크에 95 이상으로 입찰했다. 그래서 메시지가 32에서 42로 늘었고, 확신도가 같으니 먼저 답한 A가 대부분 가져가 6개 중 1~4개만 제대로 갔다. 과신 설정(overconfident)에서는 C가 파싱된 공고 12건 전부에 95 이상으로 입찰했는데도 배정이 거의 유지됐다. A가 담당 태스크에 98 이상으로 입찰해 낙찰받았고, 확신도가 95로 같을 때는 먼저 응답한 contractor가 낙찰받았기 때문이다. 틀린 배정 2건은 모두 7번 실행에서 나왔다. A의 답이 JSON이 아니어서 무효 처리된 계산 태스크를 C가 가져갔고, 코드 수정 태스크는 A와 C가 95로 비겨 A가 가져갔다. 과신 지시를 받은 C의 응답은 JSON 대신 긴 설명을 포함해, 파싱 실패 11건 중 6건을 차지했다.</p>
<div class="check">
<div class="lbl">CHECKPOINT</div>
<ul>
<li><code class="inline">tasks.json</code>의 gold를 첫 실행보다 먼저 커밋했다.</li>
<li>세 설정의 차이가 능력 문자열 또는 system prompt 한 문장뿐이다.</li>
<li><code class="inline">results.csv</code>에 설정마다 3줄 이상, 중단된 실행까지 합쳐 9줄 이상이 있다.</li>
<li>overconfident 설정의 로그에서 C가 자기 능력 밖의 태스크에 입찰한 줄을 찾을 수 있다.</li>
<li>JSON 파싱 실패 횟수를 note에 적었다.</li>
</ul>
</div>
<div class="recorder">
<div><span class="k">커밋</span><span class="v">squash 금지. 실패한 시도의 커밋도 채점 근거다.</span></div>
<div><span class="k">로그</span><span class="v">에이전트 실행 콘솔 출력을 <code class="inline">logs/</code>에 파일로 커밋한다.</span></div>
<div><span class="k">API 키</span><span class="v">커밋 금지. 환경변수로만 쓴다.</span></div>
</div>
</div>
</section>
<!-- ============ 과제 ============ -->
<section>
<div class="col">
<div class="secmark"><span class="no">HW</span><h2>과제</h2></div>
<div class="hw">
<div class="head">ASSIGNMENT: WEEK 03</div>
<div class="body">
<p><strong>제출물</strong>: <code class="inline">REPORT.md</code> 한 장에 다음 항목을 작성한다. (1) <strong>설정</strong>: provider, 모델, temperature, 프롬프트, 실행 명령. (2) <strong>결과표</strong>: <code class="inline">results.csv</code>의 9줄 이상을 표로. 중단된 실행도 넣는다. (3) <strong>비교표</strong>: Smith의 센서 네트워크와 내 실험을 항목별로 나란히. 참여자, 입찰을 만드는 방식, 입찰이 참인지 보장하는 것, 잘된 배정의 기준, 협상 비용, 실패하는 방식. (4) <strong>해석 한 문단</strong>: 어느 설정에서 어느 숫자가 바뀌었고 왜인지. 로그의 줄을 인용해서 쓴다.</p>
<p><strong>형식</strong>: 포크의 <code class="inline">submissions/<학번>/week-03/</code>에 커밋하고 upstream으로 PR을 연다. 코드(파일 구성 자유), <code class="inline">tasks.json</code>, <code class="inline">results.csv</code>, <code class="inline">logs/</code>, <code class="inline">REPORT.md</code>를 넣는다. CI는 <code class="inline">scripts/check_week03.py</code>로 파일 형식만 검사한다. 같은 스크립트를 직접 실행해 통과를 확인한 뒤 PR을 연다.</p>
<p><strong>채점 기준</strong>: 절반은 재현성이다. 다른 사람이 코드와 설정만 보고 같은 경향을 다시 얻을 수 있어야 한다. 나머지 절반은 해석이다. 모델이 스스로 매긴 확신도를 입찰가로 썼을 때 어디서 맞았고 어디서 틀렸는지, Smith의 절차에 과신 입찰을 검증할 장치가 있었는지를 로그에서 근거를 들어 쓴다. C가 낙찰을 독점한 실행도, 모델이 JSON 대신 설명을 늘어놓은 실행도 지우지 말고 세어서 적는다.</p>
</div>
</div>
</div>
</section>
<!-- ============ 읽기자료 ============ -->
<section>
<div class="col">
<div class="secmark"><span class="no">READ</span><h2>읽기자료</h2></div>
<ul class="readings">
<li><span class="badge req">필수</span><b class="lead">R. G. Smith, “The Contract Net Protocol: High-Level Communication and Control in a Distributed Problem Solver” (1980)</b><span class="why">협상의 네 성질, 공고의 네 필드, 메시지 종류와 분산 센싱 실험을 제시한 논문. <a href="https://doi.org/10.1109/TC.1980.1675516">IEEE Transactions on Computers C-29(12)</a></span></li>
<li><span class="badge opt">선택</span><b class="lead">R. Davis, R. G. Smith, “Negotiation as a Metaphor for Distributed Problem Solving” (1983)</b><span class="why">프로토콜을 협상 일반의 틀로 다시 쓴 논문. Artificial Intelligence 20(1)</span></li>
<li><span class="badge opt">선택</span><b class="lead">T. Sandholm, “An Implementation of the Contract Net Protocol Based on Marginal Cost Calculations” (1993)</b><span class="why">한계 비용에 따른 입찰·낙찰 규칙과 self-interested agent를 도입한 논문. <a href="https://cdn.aaai.org/AAAI/1993/AAAI93-039.pdf">AAAI-93</a></span></li>
<li><span class="badge opt">선택</span><b class="lead">FIPA, “Contract Net Interaction Protocol Specification” SC00029H (2002)</b><span class="why">표준화된 형태. cfp, propose, refuse, accept-proposal, reject-proposal, inform, failure의 흐름과 reply-by 마감. <a href="http://www.fipa.org/specs/fipa00029/SC00029H.html">fipa.org</a></span></li>
<li><span class="badge opt">선택</span><b class="lead">B. P. Gerkey, M. J. Matarić, “A Formal Analysis and Taxonomy of Task Allocation in Multi-Robot Systems” (2004)</b><span class="why">다중 로봇의 작업 할당 문제를 분류한 논문. IJRR 23(9)</span></li>
<li><span class="badge opt">선택</span><b class="lead">M. Xiong et al., “Can LLMs Express Their Uncertainty? An Empirical Evaluation of Confidence Elicitation in LLMs” (2024)</b><span class="why">LLM이 제시한 확신도와 실제 정답률을 비교한 논문. <a href="https://arxiv.org/abs/2306.13063">arXiv:2306.13063</a></span></li>
</ul>
<div class="next">
<div class="lbl">NEXT: WEEK 04</div>
<p><strong>에이전트 통신 언어: KQML과 FIPA-ACL</strong>. 화행 이론에 따른 메시지 유형과 의미, 통신 언어의 한계.</p>
</div>
</div>
</section>
<footer class="sheet">
<span>AGENTIC AI: <span class="o">에이전트 시스템의 이론과 구축</span></span>
<span>SEOULTECH 2026 FALL, WEEK 03/15</span>
</footer>
</div>
</body>
</html>