factcircuit
FactCircuit는 불변 출처와 단계별 검증, 제한된 검색, 재현 가능한 평가를 제공하는 감사 가능한 주장·증거 검증 루프입니다
생성 AI 사용자들이 가상 채소 시장에서 가격 정책을 시험하며 사회 계층화를 유발하는지 테스트
Generative AI synthetic users negotiate in a simulated vegetable market testing whether a trained pricing policy (not LLM role-play) produces emergent social stratification
데이터Python · HTMLGitHub @heatherluu99온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Millbrook Market: A Closed-Loop Multi-Agent Environment for Behavioral Fidelity
Four interactive views in your browser — the market replayed, firms entering and leaving, 1,591 LLM decisions with their reasoning, and all 42 logged runs. No install, no server.
A synthetic consumer market built to find out when a simulated buyer can be trusted — and, more often, when it cannot.
Every phase writes down its question and its failure condition before it runs, and reports the answer either way. Most of the headline results are negative. Those are the ones worth reading.README 전문 보기 ↗Four interactive views in your browser — the market replayed, firms entering and leaving, 1,591 LLM decisions with their reasoning, and all 42 logged runs. No install, no server.
A synthetic consumer market built to find out when a simulated buyer can be trusted — and, more often, when it cannot.
Every phase writes down its question and its failure condition before it runs, and reports the answer either way. Most of the headline results are negative. Those are the ones worth reading.
TL;DR: We benchmarked LLMs and RL agents against real human scanner panel data (8,499 occasions). The headline result? Aggregate fidelity is cheap; individual closed-loop fidelity is not. LLMs drift significantly when their own choices drive their next observations. Policy complexity became valuable without becoming learnable.
No server required. Explore the simulation trajectories, agent reasoning, and market dynamics directly in your browser:
open viz/millbrook.html
(Note: Insert a 5-second GIF here showing the Market Entry/Exit tab or Agent Inspector running)
Four tabs, one file, zero dependencies:
Most synthetic-consumer work evaluates models statically. Millbrook Market evaluates trajectories.
| Standard LLM Evaluation | Millbrook Market |
|---|---|
| Persona + Prompt → Response | Persona + State + Environment + Memory + Policy → Trajectory |
| Static — the world does not answer back | Interactive — sellers reprice, firms enter/exit, memory accumulates |
| One answer, no history | 22–110 weeks of choices that change later choices |
| Judged by whether it "sounds right" | Judged against a pre-registered empirical threshold |
A response can be graded by reading it. A trajectory can only be graded against a baseline (a real panel). A model can match human behaviour one step at a time and still drift once its own choices start driving its next observation.
| Agent Type | One-Step Fidelity | Closed-Loop Drift |
|---|---|---|
| Distilled Network | Matches the rule | 1.07× — barely compounds |
| LLM Agent | Half the rule's probability | 1.42× — the loop widens it |
| Simulator vs. Human Panel | Fits well | 1.09× — no drift with depth |
Tested on 3,289 real purchase occasions (Ecdat::Cracker scanner panel). Every arm got all four mechanism directions right, meaning sign agreement separates none of them.
| Arm | Distance to Humans | Log-Loss |
|---|---|---|
| Marginal brand shares | 0.1256 | 1.0696 |
| Conditional choice model | 0.0404 | 0.7739 |
| LLM Agent | 0.2448 | 1.8966 |
A model that knows nothing about any individual household matches the aggregate choice distribution almost as well as one that knows every household (0.0035 vs. 0.0015) — while being twice as wrong per household. A synthetic-consumer product graded on distributional match can look excellent while carrying zero individual-level validity.
Fitting the LLM Agent against the ground-truth rule over 447 states yields: agent = −0.219 + 0.954 × rule.
Its comparative statics are right, but its intercept is broken. Adding that one number back recovers 71.6% of the collapse in a closed loop. What survives the correction is a class bias: +0.121 for high-income buyers, −0.063 for low-budget ones.
The Agent's gap against humans changes sign depending on the context (e.g., −0.44 for cheap/promoted condiments vs. +0.20 for cheap/unpromoted dairy). A single constant correction is worth nothing (averages to −0.0017). Mapping the bias halves the held-out error (0.0888 → 0.0460).
(For full details on all 11 phases, including RL baseline failures and memory stability, see docs/phase_specifications.md)
The environment runs 100 buyers and up to 40 sellers. Everything each side does changes what the other side faces next week.
flowchart LR
B["BUYER (Agent)<br/>budget, taste, memory"]
S["SELLER (Environment)<br/>posted price, capital"]
L["SELLER LEARNS<br/>hill-climb, bandit, Q-network"]
E["MARKET DYNAMICS<br/>entry / exit based on capital"]
B -- "Action: Buy/Skip" --> S
S -- "Reward: Profit" --> L
L -- "State Update: New Price" --> B
S -- "Survival" --> E
E -- "Observation: Available Shelf" --> B
B -- "State Update: Loyalty" --> B
Sellers (Reinforcement Learners): Optimize for long-horizon return. Action space is discrete price multipliers. Policy is updated via Q-learning (γ = 0.9, ~10-week horizon), balancing exploration (ε-greedy, UCB1, LinUCB) with exploitation.
Buyers (Stateful Policies): Buyers have state and a policy but no reward function. They are hand-written rules, distilled networks, or LLMs. This distinction is load-bearing: we test whether a copied policy drifts under its own generated observations, not whether it maximizes a reward.
State Persistence: Loyalty (Guadagni & Little, 1983), capital, and the seller set carry across weeks. Only budget and inventory reset.
In evaluating AI systems, catching methodological artifacts is more important than claiming state-of-the-art. Here are four critical corrections made during development that are worth more than the results themselves:
A claim withdrawn: Phase 10 first reported human loyalty as "3.4× stronger than the simulator's". That compared an upper bound against a causal quantity. Withdrawn. The honest version: a memoryless model with household preferences predicts 97% of the observed repeat rate.
A measurement artifact caught: Human memory looked flat across eight weeks. The cause was a parity bug in the train/test split (odd lags averaged +0.016, even +0.032). Parity-free, it decays normally.
A win that was in-sample: The simulator arm first beat its baseline by 0.35 nats. It was reading answers it had been fitted to. Scored properly on held-out data: 0.005 nats, CI spanning zero.
Two bugs that cancelled: Phase 11 first reported no correction worked. One bug clipped only the corrected arms before scoring; the other keyed the map on context alone. They pointed opposite ways. Fixed, the map halves held-out error.
Every logged run records the commit it ran at. Runs marked -dirty were re-run clean and reproduced exactly.
# 1. Setup environment
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# 2. Run test suite (358 tests)
python -m pytest -q
# 3. Execute a specific phase
python experiments/phase8/run_phase8.py
# 4. Rebuild the visualization
python tools/build_combined_viz.py
src/market_sim/: Core engine, MDP config, bandits, RL implementations, LLM clients.experiments/: Runnable scripts per phase and per gate.docs/phase_specifications.md: The pre-registered spec — every gate, correction, and result.experiment_log.csv: Immutable outputs bound to commit hashes.