Role pluralism

A trained voice for each named community

The list of communities is fixed in advance, and each community's norms are instilled through training, so naming the community selects the behavior. Two implementations exist. The first is a pool of small models, one trained for each community, which a main model routes to and consults. The second is a single model trained on preference data labeled with the community each judgment came from. Both require that a community be known and trained for in advance, which separates them from the approach that describes the persona in the prompt. Serving a new community means collecting its data, not writing a sentence. Two further works accompany them. One makes the formal case for keeping each party's own compressed model of the world intact and paying an explicit translation cost, rather than merging them into one. This is the argument for the routed models and the cost that the shared-weights model pays. The other is a task suite that checks whether a model actually tracks community-level differences at all.

The method (highlighting differences with Role pluralism)

Scroll the diagram sideways to see all of it.

Use it in codefrom aiag.dispositional import CommunityModels
from aiag import LM
from aiag.dispositional import CommunityModels

lm = LM("Qwen/Qwen2.5-1.5B-Instruct")
communities = {"farmers": "rural, practical, wary of new rules", "cyclists": "urban, car-free, safety-minded"}
panel = CommunityModels(lm, communities)  # each community a described voice, or its own fine-tuned LM

question = "Should the county lower the speed limit on rural roads?"
overton = panel.chat(question)  # one reply that covers every community's view
farmers = panel.steer([question], "farmers")
spread = panel.distribution(question, ["Yes", "No"], weights=[0.3, 0.7])  # answers mixed by population share

pip install aiagEvery method in aiag Library on GitHub

Concept Analysis: Theoretical Foundations

Each concept is read twice: whether the approach carries it over, and whether the approach's own sources claim it. A concept that the approach claims but does not carry over is a shortfall. A concept that it neither claims nor carries over is an omission, which marks a gap in the field rather than a failure of the work.

Plural normative orders

PartialShortfall · partially preserved

Definition (John Griffiths, What Is Legal Pluralism?, 1986)

Different communities' norms are genuinely in force at the same time. Rather than one official rulebook with tolerated deviations, there are multiple active systems of rules side by side.

Analysis

The approach carries over the part of the concept that avoids collapse. ComPO conditions preference optimization on the community a judgment came from, rather than fitting one averaged reward. Modular Pluralism keeps a pool of separately trained community models instead of distilling them into one. Takahashi (2026) argues on epistemic grounds that distinct world models must not be merged. What is missing is Griffiths' requirement that each order be 'in force'. The orders here are statistical portraits that the developer curates and installs by training on data about a community, not rule systems that the community writes or administers. They also sit beneath a main model that answers by default and consults the modules. A community missing from the fixed list has no order at all. This is closer to one official rulebook with modeled variations than to plural living systems.

A conflict rule between orders

AbsentOmission

Definition (Conflict-of-laws tradition)

When two communities' norms disagree about the same case, a rule must state which one governs and why. This stated rule is what separates real pluralism from mere fragmentation into disconnected groups.

Analysis

Nothing in this approach states which community's norms govern a case that two communities both have a claim on, or why. Takahashi's (2026) alignment maps and transformation loss measure what is lost when content moves between two world models. This is a translation cost, which is a different mechanism from a priority rule and never resolves a disagreement in anyone's favor. Modular Pluralism's main model combines or collates the outputs of the modules, but aggregation is not adjudication. In its steerable mode, the user's naming of a community works only as a selector, not as a stated ground of authority. ComPO's community tag switches behavior without any notion of overlapping claims. No source asserts a conflict rule, and Takahashi (2026) states explicitly that it supplies none.

A shared floor

AbsentOmission

Definition (J. S. Mill, On Liberty, 1859)

Accommodation of group differences has a limit stated in advance. The classic limit is Mill's harm principle: a person's practices are their own business until they harm others. Without an enforced floor, pluralism reduces to "each group gets whatever it wants".

Analysis

No paper states in advance a limit on what a community's trained voice may endorse. ComPO's objective will fit whatever preferences a community's data expresses. Modular Pluralism's architecture treats every community module the same way. CommunityBench scores fidelity to differences between communities without testing any floor that those differences must respect. Takahashi (2026) points the other way. Its case for preserving distinct world models is that each keeps a capacity to detect errors that the others lack. This argument resists imposing a common minimum rather than supplying one. Any refusal behavior of the base model comes from inherited safety training and is not a stated limit on harm, and no source advertises one.

Concept Analysis: Newly Introduced

A measurable cost of translation between orders

Added

Legal pluralism describes interpenetrating orders qualitatively. Defining a transformation loss makes the cost of moving content between two normative orders a quantity. This is more than the tradition offers, but less than it needs, because a loss can be minimized without anyone deciding whose order should govern.

Papers

arXiv:2406.15951MethodBuiltAuthority: Affected public (open)

A main LLM collaborates with a pool of community-specific LLMs in Overton, steerable, and distributional modes.

CodeModularPluralism
from aiag import LM
from aiag.dispositional import ModularPluralism

lm = LM("Qwen/Qwen2.5-1.5B-Instruct")
plural = ModularPluralism(lm, {
    "progressive": "socially progressive, for public spending",
    "conservative": "socially conservative, for tradition",
    "libertarian": "for minimal government",
})

question = "Should the city fund a public radio station?"
overton = plural.chat(question)  # the main LLM summarizes every community's comment
steered = plural.steer([question], "a libertarian outlook")  # picks the comment that best fits, answers from it
spread = plural.distribution(question, ["Yes", "No"], weights=[0.4, 0.4, 0.2])  # mixed by population priors
  • ModularPluralismPolicyaiag/dispositional/role_pluralism.py:49 Modular Pluralism: community LMs comment on the query, and a black-box main LLM summarizes all comments (Overton), picks the comment that best reflects a requested attribute and answers from it (steerable), or mixes its answer distributions given each comment by population priors (distributional) (Feng et al., 2024).

pip install aiagEvery method in aiag Library on GitHub

arXiv:2410.16027MethodBuiltAuthority: Affected public (open)

Conditions preference optimization on which community the preference came from, so one model produces different outputs for different communities instead of averaging away their styles and norms.

CodeComPO
from aiag import LM
from aiag.dispositional import ComPO

lm = LM("Qwen/Qwen2.5-1.5B-Instruct")
threads = [  # comments as (text, time, upvotes): a later one with 2x the upvotes beats an earlier one
    {"community": "r/AskCulinary", "post": "Should I rinse rice?",
     "comments": [("No need.", 1, 3), ("Yes, until the water runs clear.", 2, 50)]},
    {"community": "r/EatCheapAndHealthy", "post": "Should I rinse rice?",
     "comments": [("Always rinse.", 1, 5), ("Skip it, it's fine.", 2, 30)]},
]
compo = ComPO()
compo.fit(lm, ComPO.pairs(threads))  # SFT, then DPO, with the community's name in front of every prompt
replies = compo.speak(lm, ["Should I rinse rice?"], "r/EatCheapAndHealthy")  # as that community prefers
  • ComPOTraineraiag/dispositional/role_pluralism.py:83 ComPO: the community's name is put in front of every prompt, the model is fine-tuned on the preferred answers, then DPO on community-tagged preference pairs, so one model answers each community by its own preferences (Kumar et al., 2024).

pip install aiagEvery method in aiag Library on GitHub

Measured, not built

Instruments that measure the approach instead of implementing it. The grid counts methods only, so these are listed here but not counted.

Background

Work this approach builds on that falls outside the inclusion criteria (e.g., a single-objective baseline). It is listed for reference and not counted anywhere.