Build a Persona-Based User Simulator with MatrAIx

Most AI product testing still treats "the user" as one interchangeable blob. MatrAIx takes the opposite bet: sample a persona — a 1,290-dimension profile covering background, psychology, capability and behavior — instantiate it as an LLM agent, and run it through reproducible tasks in four environments: survey, chatbot conversation, sandboxed web browsing, and native desktop apps.

The project is a 200+-scientist collaboration led by Harvard and MIT researchers, with contributors from OpenAI, Anthropic, Google DeepMind and xAI. The paper is on arXiv (2608.04205), the code is MIT-licensed Python, and a quality-filtered coreset of 1M personas is released on Hugging Face. That makes it one of the few "population-scale simulation" papers you can actually run today.

How the personas stay coherent

The hard part of a population-scale persona database isn't generating 8.3B profiles — it's keeping each one internally consistent. MatrAIx solves this with a directed acyclic graph (DAG):

  • Attributes carry conditional dependencies. A persona's English ability is sampled from the joint distribution of its "primary language" and "region" parent nodes.
  • A compatibility filter zeroes out any combination that violates reality — no Kenyan villager with a Harvard PhD and no native language.
  • Real human data anchors the whole thing: UN demographics, the General Social Survey, Wikipedia bios, Amazon review histories, Stack Overflow developer surveys.

The result is profiles that are diverse at population scale yet coherent at the individual level. In 400 tightly controlled experiments, personas held to their assigned profile 91.5% of the time, and human experts rated persona consistency 4.135/5.

Install and smoke test (no API key needed)

Requirements: Docker, uv + Python 3.12, Node.js 20+ (only for the GUI).

git clone https://github.com/MatrAIx-ai/MatrAIx-Persona-8B.git && cd MatrAIx-Persona-8B
uv venv --python 3.12
uv pip install -e .
uv pip install -e packages/playground
uv pip install -e packages/harbor-langsmith
uv pip install -e packages/rewardkit

# Smoke test — verifies the whole pipeline works without any model key:
uv run harbor run -c configs/jobs/example-job-recipe/harbor-smoke-local.yaml

Run your first persona task via CLI

# Pick the provider matching your model choice:
export ANTHROPIC_API_KEY="sk-ant-..."   # anthropic/claude-* models
# export OPENAI_API_KEY="sk-..."        # openai/gpt-* models

# Generate a job recipe: pins a task + persona cohort + model
uv run python application/scripts/generate_application_job.py \
  --task application/tasks/example-survey_product-feedback \
  --execution-mode auto \
  --persona-ids 0042 \
  --model-name anthropic/claude-sonnet-4-6

# The script prints a recipe path — execute it:
uv run harbor run -c configs/jobs/application-task-job-recipe/example-survey-product-feedback-auto-n1.yaml

Batch it with --sample-size N and filters. Four reference task types ship in application/tasks/: Survey (product feedback), Chat (API support bot), Web (Playwright quote choice), and OS-app (computer-use: turn notes into CSV). If you prefer a GUI, the Playground lets you pick a persona cohort, choose tasks, lock the pipeline and hit "Run eval" at localhost:5173.

Practice advice

  • Start with Survey tasks. They skip the browser/desktop sandboxes and get you to a verified result fastest.
  • Use the released 1M coreset instead of synthesizing personas yourself: huggingface-cli download MatrAIx2026/MatrAIx_Persona_1M_Public_Release --repo-type dataset.
  • Think in cohorts, not single personas. The value is subgroup-level differences — price sensitivity, error tolerance, willingness to pay across segments.
  • Write a deterministic verifier per task. Shared telemetry flows through the run; check answers with code, not with the LLM judging itself.
  • Respect the authors' caveat: this is for hypothesis generation and stress testing. High-stakes product and policy decisions still need real humans.

Resources

Scroll to Top