diff --git a/README.md b/README.md index 54f35f7..039c6f3 100644 --- a/README.md +++ b/README.md @@ -16,17 +16,17 @@ The clearest single view comes from the World Values Survey, the standard cultur ![WVS culture map: 17 frontier models among about 90 human societies](docs/img/wvs/wvs_map_iw.png) -Every model sits in the top-left: more secular and more self-expressive than almost any country on earth, deep in the rich-world corner and often past its edge, and none of them sits near the African or Muslim societies. This map is measured differently from everything else on the page. These frontier models are closed APIs with no answer probabilities to read, so each is scored by rated sampling (rate every option one to five, twelve times, with the option order shuffled), and the human positions are approximated from the GlobalOpinionQA question set. The steering plots below instead follow one open model we can push, Qwen3-4B. +Every model sits in the top-left: more secular and more self-expressive than almost any country on earth, deep in the rich-world corner and often past its edge, and none of them sits near the African or Muslim societies. This map is measured differently from everything else on the page. These frontier models are closed APIs with no answer probabilities to read, so each is scored by rated sampling (rate every option one to five, twelve times, with the option order shuffled; `scripts/wvs_map.py`), and the human positions are approximated from the GlobalOpinionQA question set (axis construction in `src/tinymfv/iw_axes.py`). The steering plots below instead follow one open model we can push, Qwen3-4B. What happens when we steer them? Below we steer models with `authority-respecting` versus `authority-disregarding` personas. ### Value maps: where a model sits, on named axes -The nicest plots are the value ("quadrant") map. Each has two named axes borrowed from the psychology that built the survey, the human societies drawn as cultural regions, and the model as a black dot with a coloured path showing where steering takes it. Steering here means nudging the model's internal state toward the authority-respecting side (red, more Authority) or away from it (blue, less), without retraining. Every map keeps one orientation, the cultural West to the west and the global South to the south, so they all read the same way. +The nicest plots are the value ("quadrant") map. Each has two named axes borrowed from the psychology that built the survey, the human societies drawn as cultural regions, and the model as a black dot with a coloured path showing where steering takes it. Steering here is activation steering, not prompting: a vector built by [steering-lite](https://github.com/wassname/steering-lite) from contrastive persona pairs and added to the model's hidden state at inference, toward the authority-respecting side (red, more Authority) or away from it (blue, less), without retraining. Every map keeps one orientation, the cultural West to the west and the global South to the south, so they all read the same way. ![MFQ-2 value map: individual-first vs group-first morality, with the Authority steer path](docs/img/showcase/mfq2/map_value.png) -Moral-foundations theory (Jonathan Haidt's) holds that our moral sense runs on a few basic concerns: caring for others, fairness, loyalty to the group, respect for authority, and a sense of the sacred. The MFQ-2 survey scores a person, or a model, on each. On this map, left to right runs from an individual-first morality (care, equality) to a group-first one (loyalty, authority, purity); bottom to top splits fairness into equal-shares versus earned-shares. The base model sits in the Western, individual-first corner, and pushing it toward Authority walks it clear across to the group-first corner shared by the African-Islamic and East-Asian societies. +Moral-foundations theory (Jonathan Haidt's) holds that our moral sense runs on a few basic concerns: caring for others, fairness, loyalty to the group, respect for authority, and a sense of the sacred. The MFQ-2 survey (Moral Foundations Questionnaire) scores a person, or a model, on each. On this map, left to right runs from an individual-first morality (care, equality) to a group-first one (loyalty, authority, purity); bottom to top splits fairness into equal-shares versus earned-shares. The base model sits in the Western, individual-first corner, and pushing it toward Authority walks it clear across to the group-first corner shared by the African-Islamic and East-Asian societies. ![Big Five value map: outgoing/open vs even-keeled axes, with the Authority steer path](docs/img/showcase/big5/map_value.png) @@ -42,7 +42,7 @@ A range plot takes an instrument one factor at a time: the spread of human socie ![MFV range plot: foundation emphasis beside Authority steering](docs/img/showcase/mfv/range.png) -MFV (moral-foundation vignettes, the repo's namesake) hands the model a short story about someone breaking a moral rule and asks which kind of wrong it is: cruelty, cheating, betrayal, defiance of authority, or defiling the sacred. Pushed toward Authority, the model does what steering should: it flags the authority violations far more often and the others less. The grey dot per foundation is a pooled human reference; the base model already leans on authority well above it, and the steer pushes it further still. That human dot is pooled on purpose: MFV country norms fail cross-country measurement invariance ([Jimenez-Leal et al. 2025](https://doi.org/10.1525/collabra.128178)) and are stitched from five different studies, so MFV gets no culture map here, only this range against one pooled reference (details in [`src/tinymfv/data/human/MFV_country_norms_NOTE.md`](src/tinymfv/data/human/MFV_country_norms_NOTE.md)). +MFV (moral-foundation vignettes, the repo's namesake) hands the model a short story about someone breaking a moral rule and asks which kind of wrong it is: cruelty, cheating, betrayal, defiance of authority, or defiling the sacred. Pushed toward Authority, the model does what steering should: it flags the authority violations far more often and the others less. The grey dot per foundation is a pooled human reference; the base model already flags authority violations well above the pooled human rate, and the steer pushes it further still. That human dot is pooled on purpose: MFV country norms fail cross-country measurement invariance ([Jimenez-Leal et al. 2025](https://doi.org/10.1525/collabra.128178)) and are stitched from five different studies, so MFV gets no culture map here, only this range against one pooled reference (details in [`src/tinymfv/data/human/MFV_country_norms_NOTE.md`](src/tinymfv/data/human/MFV_country_norms_NOTE.md)). ![MFQ-2 range plot: human society ranges beside Authority steering](docs/img/showcase/mfq2/range.png) @@ -50,7 +50,7 @@ MFV (moral-foundation vignettes, the repo's namesake) hands the model a short st ![Humor Styles range plot: human society ranges beside Authority steering](docs/img/showcase/humor_styles/range.png) -The surveys echo their maps: MFQ-2's binding factors climb under the steer, while Big Five and humor stay flat. +The surveys echo their maps: MFQ-2's binding foundations (loyalty, authority, purity) climb under the steer, while Big Five and humor stay flat. ### Maps with data-picked axes @@ -172,7 +172,7 @@ $$C_d(c) = \mathbb{E}_{i \in d}\sum_{k=1}^{M}\left(k - \tfrac{M+1}{2}\right)\ell where $\ell$ is the answer-token logprob at coefficient $c$. The intended change is $C$ (or $\Delta_f$) on the steered factor; the unintended change is $C$ moving on the other factors. A surgical steer has large intended change and small off-target change, at unchanged coherence. -Together that is the surgical-informedness view: reward intended change, penalize unintended change, gate on coherence. tinymfv reports the pieces (pmass, entropy, per-factor profile and $C$, and for MFV a nominal informedness, the Youden's J of the model's top foundation against the human top foundation); steering-lite folds them into the single base-anchored surgical-informedness score it uses to rank steers. +In short: reward intended change, penalize unintended change, and require the model to stay coherent. tinymfv reports the pieces (pmass, entropy, per-factor profile and $C$, and for MFV a nominal informedness, the Youden's J of the model's top foundation against the human top foundation); steering-lite folds them into the single base-anchored surgical-informedness score it uses to rank steers. ## Scope diff --git a/docs/reviews/readme_comprehension_merge_20260709/panel_deepseek-v4-flash.json b/docs/reviews/readme_comprehension_merge_20260709/panel_deepseek-v4-flash.json new file mode 100644 index 0000000..8c60d94 --- /dev/null +++ b/docs/reviews/readme_comprehension_merge_20260709/panel_deepseek-v4-flash.json @@ -0,0 +1,39 @@ +{ + "summary": "Tinymfv is a Python library that evaluates local language models using standard psychological surveys and moral vignettes, extracting answer-token probabilities to produce personality/value profiles comparable to human norms. It is designed for measuring the effect of internal model steering, providing readouts that are sensitive enough to detect small probability shifts from interventions.", + "mechanism": "The core mechanism computes two signals from token log-probabilities: the profile (expected score per factor for surveys, mean forced-choice probability per foundation for vignettes) and the steer signal C, the rank-centered logit contrast. C uses midpoint-centered weights so its derivative never vanishes, making it sensitive to tail reallocations that would leave the profile flat. The library gates interpretability on coherence (pmass, the share of probability on valid answer tokens) and entropy, then reports intended vs off-target C change per coefficient.", + "scores": {"clarity": 4, "conciseness": 4, "technical_accuracy": 5}, + "reason": "The measurement equations and plots are well explained, but some terms (e.g., 'binding factors', 'ipsative') and the exact output format of reports are left implicit.", + "unclear": [ + "What 'ipsative' means in the PCA map filenames.", + "Whether the profile output for surveys is a dict or array, and the exact keys for vignette reports.", + "How the 'survival vs self-expression' WVS axis is derived from the GlobalOpinionQA question set (stated to be approximated).", + "The meaning of 'MFV' in the abbreviation 'MFQ-2' vs 'MFV'—the doc uses both but only defines MFV as moral-foundation vignettes." + ], + "misunderstandings": [ + "The statement 'The steer signal is C [...] so its derivative is a fixed weight with no p_j suppression' might be read as claiming the profile is useless—the doc later clarifies the profile is needed for human comparison, but the phrasing could mislead.", + "The term 'binding factors' under MFQ-2 range plot could be confused with 'bonding' rather than Haidt's 'binding foundations' (loyalty, authority, purity).", + "The API shows 16PF as an instrument, but the plots and analysis focus on MFQ-2, Big Five, Humor Styles; a reader might think 16PF is also mapped (it is not, per the scope future-work item)." + ], + "missing_to_implement": [ + "Exact structure of the report dictionary for evaluate and administer (keys and value types).", + "How to compute the human cross-country SD from the bundled country means for effect size comparison.", + "Code to generate any plot other than the specific steer-showcase script (no generic plotting function is exported).", + "Example of loading and applying a steer vector alongside the evaluation; steer vector ingestion is relegated to steering-lite." + ], + "questions": [ + "How are negated/inverted survey frames canonicalized before averaging? The doc mentions it but gives no detail. Best guess: reverse-keyed items are flipped so higher always means more of the trait, then averaged.", + "Does the evaluate function accept a batch size or device argument? Not stated; likely expects the model already on the correct device as in the example." + ], + "suggestions": [ + "Add a small table with the exact keys returned by evaluate and administer, e.g., {'profile': dict[str, float], 'mean_pmass_allowed': float, 'dimensions': list[str]}.", + "Define 'ipsative' in a parenthetical the first time it appears (e.g., 'ipsative (each profile z-scored across its own dimensions)').", + "Provide a one-sentence example of interpreting the C signal: 'A C shift of +2.0 on Authority with pmass unchanged means the steer reallocated logit mass toward Authority tokens without breaking format.'" + ], + "rewrites": [ + { + "section": "Together that is the surgical-informedness view: reward intended change, penalize unintended change, gate on coherence.", + "rewrite": "Surgical-informedness combines these: reward the intended C change, penalize off-target C change, and gate on coherence.", + "why": "Removes the AI-tell phrasing 'view: reward... penalize... gate' for a more direct list of actions." + } + ] +} \ No newline at end of file diff --git a/docs/reviews/readme_comprehension_merge_20260709/panel_gemini-3.1-flash-lite.json b/docs/reviews/readme_comprehension_merge_20260709/panel_gemini-3.1-flash-lite.json new file mode 100644 index 0000000..e7b928b --- /dev/null +++ b/docs/reviews/readme_comprehension_merge_20260709/panel_gemini-3.1-flash-lite.json @@ -0,0 +1,35 @@ +{ + "summary": "tinymfv is an evaluation tool that maps the moral and personality profile of local LLMs by analyzing their token probabilities against standard human survey datasets. It visualizes how steering interventions shift a model's 'position' on established cultural and psychological continua, such as the World Values Survey or Moral Foundations Theory.", + "mechanism": "The tool calculates a profile for the model based on the log-probabilities of answer tokens for survey items. It then maps this profile to a coordinate in a pre-defined psychological space (derived from human norms) and tracks the movement of that coordinate when applying steering interventions, gating the results for coherence and off-target probability leakage.", + "scores": { + "clarity": "4", + "conciseness": "4", + "technical_accuracy": "5" + }, + "reason": "The documentation is technically precise and provides a clear methodology, though it presumes significant familiarity with steering research and psychometric concepts.", + "unclear": [ + "The exact definition of 'valid' tokens in scenarios where the model is not forced into a specific answer set.", + "The meaning of the phrase 'cultural West to the west' when describing the axes of the value maps.", + "How the 'steering-lite' ecosystem dependency changes the user's workflow compared to using tinymfv in isolation." + ], + "misunderstandings": [ + "The definition of 'surgical-informedness' is mentioned as a composite metric, but its exact calculation formula is not fully broken out, potentially leading users to interpret it as a pure performance score rather than a signal-to-noise ratio." + ], + "missing_to_implement": [ + "A clear setup guide for the steering vector itself; the doc focuses on measurement/plotting after the steer exists, but doesn't explain how to produce the steering input.", + "Threshold guidelines for 'surgical-informedness' or coherence scores to determine if a steer is 'failed' or 'successful'." + ], + "questions": [ + "Does tinymfv support chat-tuned models with complex system prompts, or is it strictly for base completion models? Best guess: Strictly for completion models given it relies on reading raw token probabilities from specific survey items." + ], + "suggestions": [ + "Add a 'Quick Start' section that includes a full pipeline example: generating a steering vector, applying it, and then running the evaluation." + ], + "rewrites": [ + { + "section": "The nicest plots are the value (\"quadrant\") map. Each has two named axes borrowed from the psychology that built the survey, the human societies drawn as cultural regions, and the model as a black dot with a coloured path showing where steering takes it.", + "rewrite": "We visualize model positioning using 'quadrant' maps. These use the original survey's psychological axes to plot human societies as reference regions, while showing the model as a black dot with a colored path representing its movement throughout the steering process.", + "why": "Removes subjective filler like 'The nicest plots are' and awkward phrasing like 'drawn as', making the description more professional and direct." + } + ] +} \ No newline at end of file diff --git a/docs/reviews/readme_comprehension_merge_20260709/panel_gemma-3-12b-it.json b/docs/reviews/readme_comprehension_merge_20260709/panel_gemma-3-12b-it.json new file mode 100644 index 0000000..a673e0b --- /dev/null +++ b/docs/reviews/readme_comprehension_merge_20260709/panel_gemma-3-12b-it.json @@ -0,0 +1,52 @@ +```json +{ + "summary": "This document details the process of fixing a persona library and re-validating axes for a steering system, after identifying flaws in the initial implementation. The fixes involve stratified per-source sampling, explicit documentation of testing procedures, and a revised workflow to prevent errors and ensure rigorous evaluation. This leads to the retraining and replotting of an honesty vs. credulity map with clean vectors and honest effect size assessments.", + "mechanism": "The core mechanism involves using a curated set of persona templates and moral vignettes to evaluate and steer language models. The process involves stratified sampling of these items across different sources, rigorous evaluation using a 'strict-pass' criterion, and iterative refinement of the steering vectors based on these evaluations. The touchstone is 'surgical steering': maximizing desired changes while minimizing off-target change and maintaining coherence.", + "scores": { + "clarity": 4, + "conciseness": 3, + "technical_accuracy": 5 + }, + "reason": "The document demonstrates strong technical accuracy with detailed procedures and metrics. However, it suffers from density and some verbose explanations, impacting conciseness. Clarity is generally high, though the sheer amount of information can be overwhelming.", + "unclear": [ + "The specific reasons for the 'circularity bug' involving the confound judge are not fully explained.", + "It's not entirely clear why the failure of the grid computing step necessitated punishing a single component (MFV), instead of all instrument depends (big5, humor/MFQ2).", + "The choice of specific error thresholds and criteria (e.g., maximum dS cosine) are not explicitly justified.", + "The expectations against human or authority norms are not as specific as they could be." + ], + "misunderstandings": [ + "The document implies that achieving a cosine between retrained vectors near 0 is desirable; it's presented as a pass but it should be treated as interesting.", + "Frequency of KL divergence should be explained, it's not standard terminology." + ], + "missing_to_implement": [ + "A detailed explanation of how the 'bounded judge' works and its limitations.", + "A discussion of the trade-offs between different persona template selection strategies.", + "A section outlining the criteria used for choosing which foundations to exclude; rationale to de-circularize the steer." + ], + "questions": [ + "What is the rationale behind using a 'strict-pass' criterion, and how might it be biased?", + "Why use pueue rather than standard python multiprocessing?", + "How representative are the 6-12 'sources' of the broader persona landscape?", + "The document refers to authority "benchmarks" but lacks concrete comparisons beyond effect size dimensions, why?" + ], + "suggestions": [ + "Consolidate the task list into a more structured format, such as a table.", + "Provide diagrams or flowcharts to illustrate the workflow and decision-making process.", + "Add context or rationale for the fixed endpoints of cos, KL drift.", + "Include a glossary of terms for acronyms (e.g., dS, KL) and specialized concepts (e.g., surgical steering).", + "Condense summarizing sentence from verbous write-up, example: replace 'occurred as expected' with 'passed' with a citation." + ], + "rewrites": [ + { + "section": "“The short10 catalog was a wrong turn (deleted).”", + "rewrite": "The short10 catalog was unsuitable and was removed.", + "why": "Removes the slightly awkward phrasing and reduces unnecessary detail." + }, + { + "section": "“Honesty moves Social Norms/Fairness/Liberty; Credulity moves Social Norms/Authority/Sanctity.”", + "rewrite": "Honesty steered primarily towards Social Norms, Fairness, and Liberty, while Credulity steered towards Social Norms, Authority, and Sanctity.", + "why": "More grammatical, clarifies the primary influence." + } + ] +} +``` \ No newline at end of file diff --git a/docs/reviews/readme_comprehension_merge_20260709/panel_gemma-3-12b-it_clean.json b/docs/reviews/readme_comprehension_merge_20260709/panel_gemma-3-12b-it_clean.json new file mode 100644 index 0000000..3afad30 --- /dev/null +++ b/docs/reviews/readme_comprehension_merge_20260709/panel_gemma-3-12b-it_clean.json @@ -0,0 +1,43 @@ +```json +{ + "summary": "Tinymfv is a tool for quickly evaluating the moral and value alignment of local language models. It uses standard human surveys and vignettes, compares the model's answer probabilities to human norms, and aims to provide a sensitive readout for steering efforts. The tool focuses on providing a fast comparison tool for steering interventions and not full moral reasoning.", + "mechanism": "The core mechanism involves administering standard human surveys (like the World Values Survey, MFQ-2, Big Five, and Humor Styles) to a language model, reading the probabilities of the model’s token responses, and comparing these probabilities to reference data representing human norms. This comparison is then visualized on value maps and range plots, revealing how the model's responses differ from human societies and how steering interventions shift these responses.", + "scores": { + "clarity": "4", + "conciseness": "5", + "technical_accuracy": "4" + }, + "reason": "The document is well-written and concise, with a clear explanation of the tool's purpose and methodology. The technical details are presented reasonably well, although some aspects of the statistical analysis (e.g., the surgical informedness score) are complex and may require further explanation. The documentation, however, emphasizes that it is targeted towards paired comparisons rather than full moral reasoning.", + "unclear": [ + "The specifics of how the quantile mass (pmass) and entropy metrics are used in conjunction with coherence are not fully explained.", + "The methodology behind rating sampling for models without accessible answer probabilities is not detailed.", + "What `mundane15` is unclear." + ], + "misunderstandings": [ + "The document mentions country norms in MFV failing cross-country measurement invariance and being stitched from five different studies, but it is unclear how the tool addresses this limitation to ensure a consistent comparison." + ], + "missing_to_implement": [ + "A more detailed explanation of the statistical methods used to calculate the surgical informedness score would be helpful.", + "The tool would benefit from more comprehensive documentation of the various datasets used and their corresponding human reference data.", + "Provides a clear best practice usage of `pmass_allowed`." + ], + "questions": [ + "How are the survey items adapted or transformed before being presented to the language model?", + "What are the specific steps taken to ensure the reliability and validity of the human reference data?", + "Given the mentioned limitations with cross-country measurement invariance in MFV, how does tinymfv mitigate potential biases in the comparisons?" + ], + "suggestions": [ + "Clarify the roles of `pmass` and entropy in coherence, linking each to model behavior.", + "Add a concise explanation of 'quantile mass' in lay terms.", + "Include a visual representation of the different value maps.", + "Explicitly state that both survey and vignettes are translated into numerical vectors, with instructions of methodology." + ], + "rewrites": [ + { + "section": "The base model sits in the Western, individual-first corner, and pushing it toward Authority walks it clear across to the group-first corner shared by the African-Islamic and East-Asian societies.", + "rewrite": "The base model initially aligns with Western, individualistic values, and steering toward an 'Authority' persona shifts its responses toward those of group-oriented societies found in Africa, Islamic, and East-Asian regions.", + "why": "This version reduces heavy phrasing with simpler sentence construction." + } + ] +} +``` \ No newline at end of file diff --git a/docs/reviews/readme_comprehension_merge_20260709/panel_gemma-3-12b-it_rerun.json b/docs/reviews/readme_comprehension_merge_20260709/panel_gemma-3-12b-it_rerun.json new file mode 100644 index 0000000..e1a9546 --- /dev/null +++ b/docs/reviews/readme_comprehension_merge_20260709/panel_gemma-3-12b-it_rerun.json @@ -0,0 +1,47 @@ +```json +{ + "summary": "This document details a redesign of a persona library for steering language models, addressing issues found in a previous version. The redesign focuses on stratified sampling per data source in the validator, clear documentation on testing all templates and handling scenarios with zero strict-pass results, and rigorous re-validation of the axes using a new sampling strategy. The ultimate goal is to create a more reliable and user-friendly library for steering language models along axes of honesty and credulity, culminating in a retrained and re-evaluated 2D map.", + "mechanism": "The primary mechanism is a stratified sampling approach within the persona library validator. Instead of pooling all scenarios, the validator now samples an equal number of scenarios from each source dataset. This ensures a more balanced representation of scenarios from diverse sources, preventing bias towards the most prevalent datasets. Additionally, the implementation of a `--n-per-source` flag offers greater control to users.", + "scores": { + "clarity": 4, + "conciseness": 3, + "technical_accuracy": 5 + }, + "reason": "The document is generally clear and TECHNICAL in its descriptions, but suffers slight redundancy in describing certain errors/failures and their corrections. Overall, it provides a good account of the technical changes made.", + "unclear": [ + "The document briefly mentions field error 'Care' during grid generation; root cause a different capitalisation. What was the full source-code context?", + "The 'dS' metric and its cosine calculation appears frequently without deep explanation – what does 'dS' stand for, and why is a cosine value near 0.0 considered desirable?", + "What constitutes an 'honest assessment' of the effect size compared to human variation? How was this communicated to the user in the journal entry?" + ], + "misunderstandings": [ + "The document states “circularity bug: confound judge scores honesty_truthfulness as off-axis dim, but for honesty axis that IS on-axis”. Would a quick diagram help illustrates a circularity effect?", + "The narrative frequently contrasts 'strong' vs 'weak' steering - clarity would improve with some measurable criteria for 'strength', beyond just cross-country variability." + ], + "missing_to_implement": [ + "Code references to 'scripts/run_2d_grid_showcase.py' and functions are not readable without the actual code; minimal code samples would improve understanding.", + "A chart summarizing the various datasets and the number of scenarios from each helps understanding the impact of sampling strategies.", + "Details on the final judgements/designations/selections vs training runs is scattered within diverse, separate code segments; moving to a shared location would help maintain consistency & reveal decisions." + ], + "questions": [ + "The document mentions hourly cron jobs being disabled - what was the original purpose of the cron jobs?", + "What are the exact implementations or configurations of the 'bounded judge' and what error does it aim to avoid?" + ], + "suggestions": [ + "Add a visual representation of data flow for the validation and training stages", + "Consolidate descriptions of testing steps in a single table or diagram", + "Reduce narrative repetition regarding debugging and fixes along the way." + ], + "rewrites": [ + { + "section": "stages A/B started before debugging fixes. unclear if any work was lost.", + "rewrite": "Prior to fully implementing the stratified sampling approach, initial runs of stages A/B were performed using existing pooled sampling logic. This preliminary work emphasized the importance of stratified sampling avoiding biases.", + "why": "Reduces the sense that a complete failed run and means initializing the next task" + }, + { + "section": "Stage B honesty: 24 strict-pass at thr 2.0 + on-axis dim exclusion (up from 8 at thr 3.0). Top-50 exported. Stage B credulity: 24 strict-pass at thr 2.0 with NO on-axis dim exclusion (none circular for credulity).", + "rewrite": "Stage B of the honesty axis yielded 24 strict-pass results when filtering to items with an axis delta greater than 2.0 and excluding dimensions related to honesty in accord with preliminary findings. Credulity achieved 24 strict-pass with axis deltas greater than 2.0, without needing to exclude any dimensions because they did not indicate circularity.", + "why": "Substitute informal language with technical and explicit phrasing" + } + ] +} +``` \ No newline at end of file diff --git a/docs/reviews/readme_comprehension_merge_20260709/panel_gpt-oss-120b.json b/docs/reviews/readme_comprehension_merge_20260709/panel_gpt-oss-120b.json new file mode 100644 index 0000000..6a402a8 --- /dev/null +++ b/docs/reviews/readme_comprehension_merge_20260709/panel_gpt-oss-120b.json @@ -0,0 +1,44 @@ +{ + "summary": "tinymfv provides a fast way to evaluate local language models on human value and moral surveys by presenting standard questionnaire items, reading the model's answer-token probabilities, and comparing the resulting profiles to aggregated human reference data. It bundles several instruments (World Values Survey, MFQ‑2, Big Five, 16PF, Humor Styles, and moral‑foundation vignettes) and is designed to detect subtle probability shifts caused by steering interventions.", + "mechanism": "The core mechanism maps each model output to a probability distribution over the valid answer tokens for every survey item, then aggregates these distributions to compute (i) a profile (expected Likert score or foundation probability) and (ii) a rank‑centered logit contrast C, which sums log‑probabilities weighted by their distance from the scale midpoint; C captures steering‑induced shifts even when the model’s answers are highly confident, and the results are compared against human baselines while gating on coherence metrics (pmass and entropy).", + "scores": { + "clarity": 4, + "conciseness": 3, + "technical_accuracy": 5 + }, + "reason": "The document is well‑structured and technically precise, but its length and occasional verbose phrasing reduce conciseness, and a few implementation details are left vague.", + "unclear": [ + "How the answer‑token set A_i for each Likert‑style item is constructed from the tokenizer.", + "The exact formula used to compute Youden's J as the MFV \"informedness\" metric.", + "Details of the PCA computation for the data‑picked axes maps (e.g., scaling, centering)." + ], + "misunderstandings": [ + "The statement that \"All seventeen frontier models sit outside the cultural mean of nearly every country\" could be read as each model being outside every single country's distribution, while it actually means the models are outliers relative to the majority of countries.", + "The claim that the Authority push \"barely moves the base model\" on the Big Five map might lead readers to think personality cannot be steered at all, whereas only this specific factor showed little movement in the example." + ], + "missing_to_implement": [ + "A clear recipe for extracting the set of valid answer tokens (A_i) from the model's tokenizer for each questionnaire format.", + "The exact computation steps for Youden's J (informedness) for MFV, including any thresholding or normalization.", + "Code snippets demonstrating how to calculate the rank‑centered logit contrast C from raw token log‑probs." + ], + "questions": [ + "Why does tinymfv use a rank‑centered logit contrast rather than the raw expected score when measuring steering? Because the contrast uses fixed midpoint‑centered weights that remain sensitive to changes even when the model's probability mass is concentrated on a single answer, avoiding the suppression effect that makes the expected score flat near confident predictions.", + "What does the pmass metric represent and why is it the first gating condition? pmass is the average probability mass the model assigns to the set of valid answer tokens across items; low pmass indicates the model is not adhering to the expected answer format, so any subsequent steer measurements would be unreliable." + ], + "suggestions": [ + "Add a brief paragraph after the \"Measurement\" section that explicitly defines the answer‑token set A_i for Likert items and provides the formula for Youden's J, eliminating the need for readers to infer these steps.", + "Replace the vague sentence \"The map is measured differently from everything else on the page\" with a concrete description of the rated‑sampling method used for closed‑API models." + ], + "rewrites": [ + { + "section": "Steering is an intervention, so we judge it like surgery: did the intended thing move a lot, did everything else move as little as possible, and is the model still coherent?", + "rewrite": "We evaluate steering by checking whether the targeted change is large, unintended changes are small, and the model remains coherent.", + "why": "Removes the metaphorical \"surgery\" language and gives a direct, human‑draft description." + }, + { + "section": "tinymfv reads three quantities that answer those, in rising order of steer-sensitivity.", + "rewrite": "tinymfv computes three quantities, listed from least to most sensitive to steering.", + "why": "Eliminates the AI‑style phrasing \"in rising order of steer-sensitivity\" and makes the sentence clearer." + } + ] +} \ No newline at end of file diff --git a/docs/reviews/readme_comprehension_merge_20260709/panel_kimi-k2.7-code.json b/docs/reviews/readme_comprehension_merge_20260709/panel_kimi-k2.7-code.json new file mode 100644 index 0000000..4fa28e5 --- /dev/null +++ b/docs/reviews/readme_comprehension_merge_20260709/panel_kimi-k2.7-code.json @@ -0,0 +1,50 @@ + { + "summary": "tinymfv is a local-LLM evaluation tool that scores models on standard human survey and moral-vignette items by reading next-token probabilities over valid answer tokens and comparing the resulting profiles to human norms. The attached plan then uses tinymfv to fix a persona-template-library sampling bug (pooled sampling) and rebuild an honesty-by-credulity steering map via stratified all-template validation, strict-pass scenario selection, per-axis vector training, and a 2-D grid readout.", + "mechanism": "The central mechanism is probability-weighted survey scoring: for each item the model outputs a distribution over the allowed response tokens; this is converted to an expected factor score (or forced-choice foundation probability for MFV), then compared with human country norms. The steering layer attaches persona pairs to standard scenarios, uses a bounded LLM judge to select 'strict-pass' pairs that isolate one axis, trains a steering vector for each axis, and evaluates their combination on the same instruments.", + "scores": { + "clarity": "4", + "conciseness": "3", + "technical_accuracy": "4" + }, + "reason": "The README explains the scoring pipeline with equations and file paths, and the plan has explicit goals, discriminators, and tasks; it is slowed by dense logs and undefined terms like strict-pass and the bounded judge, and the README mixes levels of detail.", + "unclear": [ + "The exact definition of 'strict-pass' is only partially described (axis_delta and off-axis/confound/style gates are listed but not consolidated).", + "What the bounded-thinking judge evaluates and how it assigns axis/off-axis/style/echo/refusal/nocommit scores.", + "How the per-axis steering vectors are computed inside steering-lite (beyond a target KL and reported C value).", + "The meaning of reported dS cosine, flat-tensor cosine, and symmetric projection vs true Gram-Schmidt in the combine step.", + "Whether the 2-D grid uses raw or orthogonalized vectors and how multi-instrument coherence filtering maps to final plots.", + "Why honesty and credulity are expected to be orthogonal psychological axes." + ], + "misunderstandings": [ + "Goal 1 says Stage B should be n-per-source ~30-50, but Goal 2 actually runs n-per-source 100; the plan evolved but the earlier wording remains.", + "The log reports both dS cosine ≈ -0.02 and a transient flat-tensor cosine of 1.0, plus a future-work mention of cos ≈ -0.15; a hurried reader could mix them up.", + "The README says frontier models are scored by rated sampling on closed APIs, while the steering work uses an open model (Qwen3-4B); this is noted but easy to skim past.", + "The final log says honesty moves 'Social Norms / Fairness / Liberty' and credulity moves 'Social Norms / Authority / Sanctity', but the MFV section earlier lists only Care, Fairness, Loyalty, Authority, Sanctity; 'Social Norms' is not in that list." + ], + "missing_to_implement": [ + "Setup and install instructions for the persona-steering-template-library and steering-lite repositories, not just tinymfv.", + "API keys, model endpoints, and cost estimates for the OpenRouter/LLM judge stage.", + "A single end-to-end shell script that runs Stage A, Stage B, export, training, grid, and plotting from the clean repo state.", + "Code-level definitions of the bounded judge, strict-pass gates, and overall_score recomputation.", + "How to obtain or prepare the scenario source files and the 100-template catalog.", + "The exact command and code that combines the two per-axis vectors into the 2-D grid." + ], + "questions": [ + "What does 'strict-pass' mean exactly? Best guess: a scenario-template pair where the bounded judge reports axis_delta ≥ 2.0, off-axis and confound/style/echo/refusal/nocommit scores are all below separate thresholds, and the model's answer mass remains high; the doc gives the pieces but never states a single consolidated rule.", + "Why is the honesty steer much weaker than the credulity steer despite the same pipeline? Best guess: honesty is more entangled with truthfulness, praise, and sycophancy dimensions in the available scenarios, so the strict-pass filter leaves only low-axis-delta pairs (mean 0.68 vs 2.87), limiting the learned vector's effect size." + ], + "suggestions": [ + "Add a 'Definitions' appendix that consolidates strict-pass, overall_score, bounded judge, KL target, and dS cosine in one place.", + "Move the detailed daily log out of the plan file into a separate RESEARCH_JOURNAL.md and keep the plan as actionable current state only.", + "Provide one copy-paste end-to-end command block at the top of the plan for reproducing the v2 map from a fresh clone.", + "Include a final cross-instrument effect-size table in the evidence section, not just the max single-foundation values.", + "Add a note in the README that the steering-map examples use Qwen3-4B and open probabilities, so readers don't conflate them with the closed-API rated-sampling WVS map." + ], + "rewrites": [ + { + "section": "Fast value evals for local language models. It asks standard human survey questions and moral vignettes, reads the model's answer-token probabilities, and compares the profile to human norms. Built for steering work: the readout is sensitive enough that a small intervention shows up as a probability shift.", + "rewrite": "tinymfv scores local LLMs on standard human surveys and moral vignettes. It reads the probabilities the model assigns to each allowed answer token, converts them to factor scores, and plots those against human baselines. The scores are sensitive to small steer-induced shifts.", + "why": "Removes generic marketing cadence ('Built for steering work: ...') and abstract claims, replacing them with direct descriptions of what the tool actually does." + } + ] +} \ No newline at end of file diff --git a/docs/reviews/readme_comprehension_merge_20260709/panel_kimi-k2.7-code_clean.json b/docs/reviews/readme_comprehension_merge_20260709/panel_kimi-k2.7-code_clean.json new file mode 100644 index 0000000..f95cb67 --- /dev/null +++ b/docs/reviews/readme_comprehension_merge_20260709/panel_kimi-k2.7-code_clean.json @@ -0,0 +1,44 @@ + ```json +{ + "summary": "tinymfv is a small evaluation toolkit that administers standard human psychology surveys and moral vignettes to local language models, reads the probability distribution over answer tokens, and compares the resulting profile to human norms. It is designed to be sensitive enough that small steering interventions show up as probability shifts, which are visualized as range plots and culture maps.", + "mechanism": "The core mechanism is a rank-centered logit contrast, C, computed per factor as a weighted sum of answer-token log-probabilities centered around the scale midpoint. Because it lives in log-space, C can detect probability redistributions even when the expected-score profile is pinned near a confident answer. This signal is gated on coherence metrics—probability mass on valid answer tokens (pmass) and entropy over valid answers—so a steer that breaks format or flattens answers is flagged rather than trusted. The intended-versus-unintended movement in C, at unchanged coherence, is the basis for judging a surgical steer.", + "scores": {"clarity": "4", "conciseness": "4", "technical_accuracy": "4"}, + "reason": "The document is well-organized and technically dense, but it assumes familiarity with activation steering and steering-lite, and it leaves several implementation details underspecified.", + "unclear": [ + "What the steering intervention actually is technically—prompt persona, activation addition, or something else.", + "The precise form of the 'single base-anchored surgical-informedness score' steering-lite uses.", + "How the WVS country positions are approximated from GlobalOpinionQA question items.", + "What 'inverted and negated frames' specifically look like for the survey items.", + "The format of the steering-lite run directory and how it is produced." + ], + "misunderstandings": [ + "The document mentions steering by 'authority-respecting versus authority-disregarding personas' but also refers to 'steering-lite' and 'nudging the model's internal state,' which invites conflating prompt-based personas with activation-vector steering.", + "Saying 'the base model already leans on authority well above it' could be misread as the model being more authoritarian overall rather than more likely to flag authority violations in MFV vignettes.", + "The strong MFQ-2 sweep is highlighted early, but Big Five and Humor Styles barely move under the same steer; a reader might overgeneralize the effect size across instruments." + ], + "missing_to_implement": [ + "Instructions for generating steering vectors or positive/negative steer pairs.", + "A complete API schema listing all return keys of `evaluate` and `administer` reports.", + "Dependency and environment details beyond `uv pip install`.", + "A minimal end-to-end example from raw model to plotted map.", + "How to interpret or reproduce the 'PCA ipsative' maps as a user." + ], + "questions": [ + "What kind of steering produces the red-to-blue steer paths? Best guess: contrastive activation steering via steering-lite, possibly with prompt persona variants.", + "Does the tinymfv package itself perform steering, or only evaluate steered runs? Best guess: it only evaluates and plots; steering is done by steering-lite or a similar external tool." + ], + "suggestions": [ + "Add a short 'What counts as steering here' paragraph distinguishing prompt personas from activation vectors and stating which one ships in this repo.", + "Document the full report dictionary returned by `evaluate` and `administer`.", + "Provide a minimal reproduction script that starts from a huggingface model and ends with the showcase figures.", + "Clarify the relationship to steering-lite and what inputs must come from it." + ], + "rewrites": [ + { + "section": "The nicest plots are the value (\"quadrant\") map. Each has two named axes borrowed from the psychology that built the survey, the human societies drawn as cultural regions, and the model as a black dot with a coloured path showing where steering takes it. Steering here means nudging the model's internal state toward the authority-respecting side (red, more Authority) or away from it (blue, less), without retraining.", + "rewrite": "The quadrant maps label two axes from the survey psychology, draw human societies as regions, and show the model as a black dot with a colored path for the steer. Steering nudges the model's internal state toward authority-respecting (red) or away from it (blue), without retraining.", + "why": "Removes filler like 'nicest' and 'where steering takes it,' drops the redundant 'each has' structure, and reads more like a direct human draft." + } + ] +} +``` \ No newline at end of file diff --git a/docs/reviews/readme_comprehension_merge_20260709/panel_nemotron-3-super-120b-a12b.json b/docs/reviews/readme_comprehension_merge_20260709/panel_nemotron-3-super-120b-a12b.json new file mode 100644 index 0000000..fedec1d --- /dev/null +++ b/docs/reviews/readme_comprehension_merge_20260709/panel_nemotron-3-super-120b-a12b.json @@ -0,0 +1,12 @@ +{ + "summary": "The document describes a project to build an honesty vs. credulity steering map for language models by using persona-based steering. It fixes earlier sampling flaws in the persona library (adopting stratified per‑source sampling and testing all templates), selects strict‑pass scenarios only, retrains steering vectors, and evaluates their effect on moral foundations and personality traits using the tinymfv toolkit.", + "mechanism": "The core mechanism is to steer a model's internal state along honesty and credulity axes via persona templates, then measure the resulting shift in answer‑token logits (the rank‑centered logit contrast C) and compare the model's forced‑choice or expected scores to human reference distributions to quantify effect sizes.", + "scores": {"clarity": "4", "conciseness": "2", "technical_accuracy": "4"}, + "reason": "The explanation is thorough and technically detailed but overly verbose and assumes familiarity with internal constructs such as bounded judge, C, KL, and strict‑pass criteria.", + "unclear": ["What a 'bounded judge' is and how it scores scenarios", "How the coefficients C and KL are computed and what they represent", "The exact definition of 'strict‑pass' criteria and the thresholds used"], + "misunderstandings": ["The plan says to stop if fewer than 10 strict‑pass scenarios are found, yet later it lowers the axis‑delta threshold from 3.0 to 2.0 to obtain enough strict‑pass cases, which can be read as a relaxation of the rule", "The document claims the 2D grid has 'pmass > 1.0', but pmass is a probability share and cannot exceed 1.0, suggesting a typo or confusion"], + "missing_to_implement": ["Access to the actual code bases (persona‑steering‑template‑library, steering‑lite) and all referenced datasets", "Step‑by‑step setup instructions for the UV environment, pueue, and just commands", "The exported selection files and vector checkpoints required to reproduce the 2D grid and plots"], + "questions": ["How is the 'overall_score' used for ranking computed from axis_delta, off‑axis, style, and echo/refusal/nocommit penalties?"], Best guess: It is a linear combination where overall_score = axis_delta - off_axis - style - 3*(echo+refusal+nocommit) as stated in the log entry of 2026-07-06 06:15.], + "suggestions": ["Add a concise glossary at the start of the plan defining key terms such as bounded judge, strict‑pass, C, KL, and overall_score to aid readers unfamiliar with the internal jargon."], + "rewrites": [{"section": "Since 1981 it has asked people in about ninety countries the same questions, and two axes drawn from it sort societies by how traditional or secular they are and how much they weigh survival over self‑expression.", "rewrite": "Since 1981, the World Values Survey has asked the same questions in about ninety countries; from these responses two axes are derived that rank societies by traditional versus secular values and by survival versus self‑expression values.", "why": "Removes the flowing, AI‑like narrative tone and reads like a plain, direct human statement while preserving the same facts."}] +} \ No newline at end of file diff --git a/docs/reviews/readme_comprehension_merge_20260709/panel_nemotron-3-super-120b-a12b_clean.json b/docs/reviews/readme_comprehension_merge_20260709/panel_nemotron-3-super-120b-a12b_clean.json new file mode 100644 index 0000000..722aa34 --- /dev/null +++ b/docs/reviews/readme_comprehension_merge_20260709/panel_nemotron-3-super-120b-a12b_clean.json @@ -0,0 +1,34 @@ +{ + "summary": "tinymfv provides a fast way to evaluate the values and personalities of local language models by having them answer standard human survey questions and moral vignettes, then reading the probability distribution over answer tokens to compute factor scores. These scores are compared to human norms from large surveys, and the tool is especially sensitive to small steering interventions that shift the model's internal state without retraining.", + "mechanism": "The core mechanism computes, for each survey item, the rank‑centered logit contrast (C) from the model’s answer‑token log probabilities, which yields a steer‑sensitive signal that does not saturate near confident answers, while gating the result on coherence via the probability mass (pmass) the model assigns to valid answer tokens.", + "scores": { + "clarity": 4, + "conciseness": 3, + "technical_accuracy": 5 + }, + "reason": "The document explains the method and its sensitivity clearly, but some sections are dense with plot descriptions and parameter details that slow reading.", + "unclear": [ + "How the 'rated sampling' procedure works for closed‑API models when answer probabilities are not available", + "How the human reference positions are derived from the GlobalOpinionQA dataset for the World Values Survey map", + "Exactly how the PCA‑derived axes are constructed and what the inset compass represents" + ], + "misunderstandings": [], + "missing_to_implement": [ + "A GPU‑enabled environment with the transformers library", + "A steering‑lite run directory containing the steering vectors and outputs", + "Knowledge of how to generate or obtain the steering coefficient vectors used in the plotting script" + ], + "questions": [ + "What effect does the coherence‑frac threshold have on selecting steering vectors, and how is it chosen in practice? – It discards any steering step where the model’s probability mass on valid tokens falls below that fraction of the baseline, ensuring the model remains coherent while still capturing steer‑sensitive changes." + ], + "suggestions": [ + "Add a short glossary at the beginning defining key terms such as pmass, entropy, C (rank‑centered logit contrast), and coherence‑frac to help readers unfamiliar with the notation." + ], + "rewrites": [ + { + "section": "Together that is the surgical-informedness view: reward intended change, penalize unintended change, gate on coherence.", + "rewrite": "In short, the approach rewards the intended change, penalizes unintended changes, and requires the model to stay coherent.", + "why": "Removes the nominalized phrase \"surgical-informedness view\" and AI‑style abstraction to read like a plain human explanation while keeping the same meaning." + } + ] +} \ No newline at end of file diff --git a/docs/reviews/readme_comprehension_merge_20260709/panel_nemotron-3-super-120b-a12b_rerun.json b/docs/reviews/readme_comprehension_merge_20260709/panel_nemotron-3-super-120b-a12b_rerun.json new file mode 100644 index 0000000..f3fe553 --- /dev/null +++ b/docs/reviews/readme_comprehension_merge_20260709/panel_nemotron-3-super-120b-a12b_rerun.json @@ -0,0 +1,12 @@ +{ + "summary": "The plan aims to fix earlier mistakes in building a persona library for steering language models along honesty and credulity axes by implementing stratified per-source sampling, testing all templates, and enforcing strict-pass criteria. It then re-validates the axes, exports clean scenario selections, retrains steering vectors, verifies their effect sizes and orthogonality, and finally generates a 2D grid showcase to visualize combined steering effects.", + "mechanism": "The core mechanism uses persona-based prompt templates to shift a model's internal state along defined honesty and credulity axes, measuring the resulting changes in moral survey responses via effect sizes relative to human cross-country variation while ensuring coherence and orthogonal steering.", + "scores": {"clarity": "4", "conciseness": "3", "technical_accuracy": "5"}, + "reason": "The plan is thorough and technically precise but somewhat verbose, which improves clarity and accuracy at the expense of conciseness.", + "unclear": ["What exact criteria define a 'strict-pass' scenario?", "How is the 'bounded judge' implemented and what are its thresholds?"], + "misunderstandings": ["The plan marks goals as completed ([x]) but the log shows some goals were later rejected and re-signed off, which could confuse readers about the actual status."], + "missing_to_implement": ["Access to the scenario data sources and OpenRouter API keys needed to run the validation scripts.", "The actual code for the validator and training scripts (only referenced, not included)."], + "questions": ["Did the updated validator with --n-per-source produce the expected stratified samples in practice?"], + "suggestions": ["Add a one-line summary at the top of each workflow step in SKILL.md that explicitly states the per-source sampling rule and the strict-pass-only rule, rather than burying it in explanations."], + "rewrites": [{"section": "The bounded-thinking judge, the two persona pairs, and goal-1 axis-separation are fine and committed.", "rewrite": "The bounded-thinking judge, the two persona pairs, and the goal-1 axis separation are all working correctly and have been committed.", "why": "Removes the AI-sounding phrase 'fine and committed' and makes the statement plain and direct."}] +} \ No newline at end of file diff --git a/docs/reviews/readme_comprehension_merge_20260709/prompt.md b/docs/reviews/readme_comprehension_merge_20260709/prompt.md new file mode 100644 index 0000000..b3b3a7c --- /dev/null +++ b/docs/reviews/readme_comprehension_merge_20260709/prompt.md @@ -0,0 +1,211 @@ +You are reading the document below for the FIRST time (a cold reader). +Answer ONLY from what it says; where something is unstated or ambiguous, say so. +Output ONE JSON object, no prose, no fences: +{ + "summary": "<2-3 sentences: restate the thesis/method in your OWN words>", + "mechanism": "", + "scores": {"clarity": "<1-5>", "conciseness": "<1-5>", "technical_accuracy": "<1-5>"}, + "reason": "", + "unclear": [""], + "misunderstandings": [""], + "missing_to_implement": [""], + "questions": [""], + "suggestions": [""], + "rewrites": [{"section": "", "rewrite": "", "why": ""}] +} + +DOCUMENT: +# tinymfv + +Fast value evals for local language models. It asks standard human survey questions and moral vignettes, reads the model's answer-token probabilities, and compares the profile to human norms. Built for steering work: the readout is sensitive enough that a small intervention shows up as a probability shift. + +The instruments are standard human ones, bundled with human reference data: World Values Survey items (via [GlobalOpinionQA](https://huggingface.co/datasets/Anthropic/llm_global_opinions)), [moral-foundation vignettes](https://scottaclifford.com/wp-content/uploads/2015/01/CICSA_MoralVignettes_BRM_ND.pdf) (Clifford et al. 2015, the repo's namesake), MFQ-2, Big Five, 16PF, and Humor Styles. An example item, from the World Values Survey: + +> Generally speaking, would you say that most people can be trusted or that you need to be very careful in dealing with people? + +## Are models moral aliens? + +Two things jump out of the plots below. First, before any steering the models are already psychological outliers. All seventeen frontier models sit outside the cultural mean of nearly every country on the World Values Survey map: more secular and more self-expression-leaning than almost any human society, an ultra Silicon Valley cultural point. And the open model we probe in depth, Qwen3-4B, scores below every surveyed country on Big Five openness and agreeableness, and reports more aggressive and less affiliative humor than every country except Malaysia. Second, steering is strong relative to human variation: on MFQ-2 a single sweep walks the model across most of the human range. + +### The whole field, on the world's value map + +The clearest single view comes from the World Values Survey, the standard culture map of the world. Since 1981 it has asked people in about ninety countries the same questions, and two axes drawn from it sort societies by how traditional or secular they are and how much they weigh survival over self-expression. We put seventeen frontier models through the same questions. + +![WVS culture map: 17 frontier models among about 90 human societies](docs/img/wvs/wvs_map_iw.png) + +Every model sits in the top-left: more secular and more self-expressive than almost any country on earth, deep in the rich-world corner and often past its edge, and none of them sits near the African or Muslim societies. This map is measured differently from everything else on the page. These frontier models are closed APIs with no answer probabilities to read, so each is scored by rated sampling (rate every option one to five, twelve times, with the option order shuffled), and the human positions are approximated from the GlobalOpinionQA question set. The steering plots below instead follow one open model we can push, Qwen3-4B. + +What happens when we steer them? Below we steer models with `authority-respecting` versus `authority-disregarding` personas. + +### Value maps: where a model sits, on named axes + +The nicest plots are the value ("quadrant") map. Each has two named axes borrowed from the psychology that built the survey, the human societies drawn as cultural regions, and the model as a black dot with a coloured path showing where steering takes it. Steering here means nudging the model's internal state toward the authority-respecting side (red, more Authority) or away from it (blue, less), without retraining. Every map keeps one orientation, the cultural West to the west and the global South to the south, so they all read the same way. + +![MFQ-2 value map: individual-first vs group-first morality, with the Authority steer path](docs/img/showcase/mfq2/map_value.png) + +Moral-foundations theory (Jonathan Haidt's) holds that our moral sense runs on a few basic concerns: caring for others, fairness, loyalty to the group, respect for authority, and a sense of the sacred. The MFQ-2 survey scores a person, or a model, on each. On this map, left to right runs from an individual-first morality (care, equality) to a group-first one (loyalty, authority, purity); bottom to top splits fairness into equal-shares versus earned-shares. The base model sits in the Western, individual-first corner, and pushing it toward Authority walks it clear across to the group-first corner shared by the African-Islamic and East-Asian societies. + +![Big Five value map: outgoing/open vs even-keeled axes, with the Authority steer path](docs/img/showcase/big5/map_value.png) + +Big Five personality collapses to two broad traits: how outgoing and open a person is (reserved to exploratory, left to right) and how even-keeled they are (volatile to stable, bottom to top). The Authority push barely moves the base model here, which is the point: it shifts values, not personality. + +![Humor Styles value map: adaptive vs maladaptive humor, with the Authority steer path](docs/img/showcase/humor_styles/map_value.png) + +Humor shows little variation on the map (although the range plots below show some nuance). On its axes (warm, healthy humor versus put-down humor; joking at yourself versus at others) the human regions overlap almost completely: humor style does not sort societies the way values do. Worth knowing a survey can't tell societies apart at all before reading anything into a steer on it. + +### Range plots: one factor at a time + +A range plot takes an instrument one factor at a time: the spread of human societies is a grey strip, their middle a black line, and the steer a red-to-blue sweep, so even a small model move stays visible against the whole human range. + +![MFV range plot: foundation emphasis beside Authority steering](docs/img/showcase/mfv/range.png) + +MFV (moral-foundation vignettes, the repo's namesake) hands the model a short story about someone breaking a moral rule and asks which kind of wrong it is: cruelty, cheating, betrayal, defiance of authority, or defiling the sacred. Pushed toward Authority, the model does what steering should: it flags the authority violations far more often and the others less. The grey dot per foundation is a pooled human reference; the base model already leans on authority well above it, and the steer pushes it further still. That human dot is pooled on purpose: MFV country norms fail cross-country measurement invariance ([Jimenez-Leal et al. 2025](https://doi.org/10.1525/collabra.128178)) and are stitched from five different studies, so MFV gets no culture map here, only this range against one pooled reference (details in [`src/tinymfv/data/human/MFV_country_norms_NOTE.md`](src/tinymfv/data/human/MFV_country_norms_NOTE.md)). + +![MFQ-2 range plot: human society ranges beside Authority steering](docs/img/showcase/mfq2/range.png) + +![Big Five range plot: human society ranges beside Authority steering](docs/img/showcase/big5/range.png) + +![Humor Styles range plot: human society ranges beside Authority steering](docs/img/showcase/humor_styles/range.png) + +The surveys echo their maps: MFQ-2's binding factors climb under the steer, while Big Five and humor stay flat. + +### Maps with data-picked axes + +As a cross-check on the value maps, we let the data pick the axes instead: find the two directions along which human societies differ most, and place the model in them. A small compass shows which traits each axis is built from, and an inset shows where the zoomed-in frame sits within the full crowd of human respondents. (MFV has no map here: its country norms are not comparable across societies, so it stays a range plot against a pooled reference.) + +![MFQ-2 culture map: Authority steering against human societies](docs/img/showcase/mfq2/map_pca_ipsative.png) + +![Big Five culture map: Authority steering against human societies](docs/img/showcase/big5/map_pca_ipsative.png) + +![Humor Styles culture map: Authority steering against human societies](docs/img/showcase/humor_styles/map_pca_ipsative.png) + + + +## Install + +```bash +uv pip install git+https://github.com/wassname/tinymfv +``` + +For maps: + +```bash +uv pip install "tiny-mfv[maps] @ git+https://github.com/wassname/tinymfv" +``` + +For repo development: + +```bash +git clone https://github.com/wassname/tinymfv +cd tinymfv +uv sync --extra maps --dev +just smoke +``` + +## Datasets + +| dataset | bundled data | human reference | profile used in plots | +|---|---|---|---| +| MFV classic | [132 moral vignettes, other](src/tinymfv/data/vignettes_classic_other_violate.jsonl) / [self](src/tinymfv/data/vignettes_classic_self_violate.jsonl) | per-vignette human foundation labels in the JSONL | forced-choice foundation probability profile | +| MFV scifi | [same items rewritten as sci-fi, other](src/tinymfv/data/vignettes_scifi_other_violate.jsonl) / [self](src/tinymfv/data/vignettes_scifi_self_violate.jsonl) | inherited labels from classic MFV | forced-choice foundation probability profile | +| MFV ai-actor | [same items rewritten with an AI actor, other](src/tinymfv/data/vignettes_ai-actor_other_violate.jsonl) / [self](src/tinymfv/data/vignettes_ai-actor_self_violate.jsonl) | inherited labels from classic MFV | forced-choice foundation probability profile | +| MFQ-2 | [36 items](src/tinymfv/data/surveys/mfq2/forward.json), plus inverted and negated frames | [country means](src/tinymfv/data/human/mfq2_country_foundations.csv), plus [raw respondents](src/tinymfv/data/atari_study2_raw.csv) | expected 1-5 score per foundation | +| Big Five | [50 items](src/tinymfv/data/surveys/big5/questionnaire.json), plus inverted and negated frames | [country means](src/tinymfv/data/human/big5_country_factors.csv) | expected 1-5 score per trait | +| 16PF | [162 items](src/tinymfv/data/surveys/16pf/questionnaire.json), plus inverted and negated frames | [country means](src/tinymfv/data/human/16pf_country_factors.csv) | expected 1-5 score per factor | +| Humor Styles | [32 items](src/tinymfv/data/surveys/humor_styles/questionnaire.json), plus inverted and negated frames | [country means](src/tinymfv/data/human/humor_styles_country_factors.csv), originally 1-7 | expected 1-5 score per style | + +MFV uses categorical answers: the answer is the foundation. The survey instruments use ordinal answers: the answer is a scale point. + +Each MFV item is asked in two perspectives, `other_violate` and `self_violate`. Each survey item is asked three ways, forward, scale-inverted, and content-negated. tinymfv canonicalizes these frames before averaging, so the profile is less tied to one wording. + +## API + +Run MFV vignettes with `evaluate`: + +```python +from transformers import AutoModelForCausalLM, AutoTokenizer +from tinymfv import evaluate, load_vignettes + +tok = AutoTokenizer.from_pretrained("Qwen/Qwen3-4B") +model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-4B").cuda() + +vignettes = load_vignettes("classic") # "classic", "scifi", "ai-actor", or "all" +report = evaluate(model, tok, vignettes=vignettes) + +print(report["profile"]) # mean forced-choice probability per foundation +print(report["mean_pmass_allowed"]) # format check: mass on valid answer tokens +``` + +Run survey instruments with `administer`: + +```python +from transformers import AutoModelForCausalLM, AutoTokenizer +from tinymfv import administer, get_instrument + +tok = AutoTokenizer.from_pretrained("Qwen/Qwen3-4B") +model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-4B").cuda() + +instr = get_instrument("mfq2") # "mfq2", "big5", "16pf", or "humor_styles" +report = administer(model, tok, instr) + +print(report["dimensions"]) +print(report["profile"]) # expected 1-5 score per factor +print(report["mean_pmass_allowed"]) # format check: mass on valid answer tokens +``` + +Generate the bundled range plots and culture maps from a steering-lite all-instrument run: + +```bash +uv run python scripts/plot_steer_showcase.py \ + --run-dir ../steering-lite/outputs/20260630T222000Z_pure_authority_mundane15_pca_readme_mfv_mfq2_humor_big5_n8 \ + --out docs/img/showcase \ + --vec-label "Authority steer, PCA (+c = more Authority)" \ + --coherence-frac 0.99 \ + --contrast-frac 0.000001 \ + --margin-frac 0.50 +``` + +The plotting code keeps only coefficients that all plotted instruments can still read. A row passes when answer mass, survey rank-logit contrast, and MFV top-foundation margin stay above the requested fraction of their base values: `pmass(c)/pmass(0) >= coherence-frac`, `mean_abs_C(c)/mean_abs_C(0) >= contrast-frac`, and `mean_margin(c)/mean_margin(0) >= margin-frac`. + +## Measurement + +Steering is an intervention, so we judge it like surgery: did the intended thing move a lot, did everything else move as little as possible, and is the model still coherent? tinymfv reads three quantities that answer those, in rising order of steer-sensitivity. + +Coherence is the gate. `pmass` is the share of probability the model puts on the valid answer tokens, and entropy is how spread-out the answer is within them: + +$$m(c) = \mathbb{E}_i \sum_{a \in A_i} P_c(a \mid i)$$ + +where $A_i$ is the valid answer-token set for item $i$. A steer that drives `pmass` toward zero, or the answers toward uniform, has broken the format, and any value read off it is noise. Coherence matters most on the unintended side: a strong steer that quietly turns answers to mush can look like change when it is really damage. + +The profile is what the maps plot: the human-comparable score per factor. For a survey it is the expected 1-5 answer (after reverse-keying); for MFV the mean forced-choice probability per foundation: + +$$\mathrm{profile}_d = \mathbb{E}_{i \in d}\sum_{k=1}^{M} k\,P(k \mid i) \qquad \mathrm{profile}_f = \mathbb{E}_i P(f \mid i)$$ + +with $i$ an item, $d$ a factor, $k$ a scale point up to $M$. This lands the model against human norms, but it hides steering: near a confident answer the expected score sits in a flat spot ($\partial E/\partial \ell_j = p_j (j - E)$ vanishes), so a steer that only reallocates the tails barely moves it. In the showcase CSVs this is the `mean` column; for MFV, model and human units differ, so the maps plot relative emphasis (each profile z-scored across foundations). + +The steer signal is `C`, the rank-centered logit contrast: the same shape as the profile but in log-space with midpoint-centered weights, so its derivative is a fixed weight with no $p_j$ suppression and it still sees the steer when the profile is pinned: + +$$C_d(c) = \mathbb{E}_{i \in d}\sum_{k=1}^{M}\left(k - \tfrac{M+1}{2}\right)\ell_{i,k}^{(c)} \qquad \Delta_f = \mathbb{E}_i\left(\ell_{i,f}^{(+1)} - \ell_{i,f}^{(-1)}\right)$$ + +where $\ell$ is the answer-token logprob at coefficient $c$. The intended change is $C$ (or $\Delta_f$) on the steered factor; the unintended change is $C$ moving on the other factors. A surgical steer has large intended change and small off-target change, at unchanged coherence. + +Together that is the surgical-informedness view: reward intended change, penalize unintended change, gate on coherence. tinymfv reports the pieces (pmass, entropy, per-factor profile and $C$, and for MFV a nominal informedness, the Youden's J of the model's top foundation against the human top foundation); steering-lite folds them into the single base-anchored surgical-informedness score it uses to rank steers. + +## Scope + +tinymfv is for fast paired steering comparisons, not full moral reasoning evaluation. It is useful when you want to compare base, positive-steer, and negative-steer runs against the same human reference plots. + +For behavior-heavy moral evals, see [machiavelli](https://huggingface.co/datasets/wassname/machiavelli), [AIRiskDilemmas](https://huggingface.co/datasets/kellycyy/AIRiskDilemmas), and [ethics_expression_preferences](https://huggingface.co/datasets/wassname/ethics_expression_preferences). + +Used in [steering-lite](https://github.com/wassname/steering-lite), [lora-lite](https://github.com/wassname/lora-lite), and [w2schar-mini](https://github.com/wassname/w2schar-mini). + +## Citation + +```bibtex +@misc{clark2026tinymfv, + title = {tinymfv: tiny moral/value eval for local LLMs}, + author = {Michael Clark}, + year = {2026}, + url = {https://github.com/wassname/tinymfv/} +} +```