hamo-score-0.6b — the little model that takes your pulse

给每句话把脉的小模型(中文版说明见下半部分)

hamo-score-0.6b reads one message from a mental-wellness conversation and scores five psychological pulse signals. It never writes replies. It is the first production-distilled component of Hamo AI's closed-loop wellness engine, released so that practitioner-supervised tools can run state scoring locally — no API, no data leaving the room.

⚠️ What this model is NOT. It is not a chatbot, not a diagnostic instrument, and not a crisis detector. In Hamo's own production system, crisis and self-harm content is short-circuited by an independent deterministic mechanism upstream of this model — it never reaches the scorer. Any deployment must reproduce that pattern (see LICENSE §3c).

The five pulses (AWEHB)

Each user message gets five scores on a 0.0–3.0 scale (0.5 grid):

Dim Name Plain reading
A Agency Is the person doing something for themselves? (incl. small plans, coping statements)
W Withdrawal Giving up, avoiding, disengaging?
E Extremity Catastrophizing chains, all-or-nothing thinking? (bounded realistic worry stays LOW)
H Hostility Attacking someone? (venting frustration without a target is NOT hostility)
B Boundary Can they speak from an "I" position — needs, limits, clear stance?

A note on B. Its theoretical root is differentiation of self (family-systems sense: a bounded two-person relationship vs. an enmeshed, undifferentiated one). A per-message scorer cannot see the relationship — it sees language. So B measures the linguistic footprint of boundaries: "I need… / I'm not willing… / this is my limit" scores high; panicked venting (self dissolved in affect) scores low; insults are H, not B. B is a per-message signal, not a relationship diagnosis.

The scores are designed to feed deterministic downstream code (stress update, state buckets, action gating) — in Hamo, an exponential blend 0.8 × history + 0.2 × message smooths per-message noise 5× before any decision is taken. We recommend the same pattern.

Quickstart

The model was trained on exactly one prompt format (its rubric is baked into the weights — do not add scoring instructions):

给来访者最新消息打分(AWEHB,0.0-3.0)。
此前对话:
user: <turn>
assistant: <turn>
最新消息: <message to score>

The context block (此前对话:) is optional; include up to the last 5 turns. Apply the Qwen3 chat template with thinking disabled, temperature 0. Output is a single JSON object.

transformers

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch, json, re

m = AutoModelForCausalLM.from_pretrained("HamoAI/hamo-score-0.6b", torch_dtype=torch.bfloat16)
tok = AutoTokenizer.from_pretrained("HamoAI/hamo-score-0.6b")

prompt = "给来访者最新消息打分(AWEHB,0.0-3.0)。\n此前对话:\nassistant: 这周过得怎么样?\n最新消息: 今天试着出门散了个步"
text = tok.apply_chat_template([{"role": "user", "content": prompt}],
                               add_generation_prompt=True, tokenize=False, enable_thinking=False)
out = m.generate(**tok(text, return_tensors="pt"), max_new_tokens=80, do_sample=False)
print(re.search(r"\{[^{}]*\}", tok.decode(out[0])).group())
# {"A": 1.5, "W": 0.0, "E": 0.0, "H": 0.0, "B": 1.0}

ollama / llama.cpp — a ready q8_0 GGUF is in gguf/. Modelfile:

FROM ./hamo-score-0.6b-v4.q8.gguf
TEMPLATE """<|im_start|>user
{{ .Prompt }}<|im_end|>
<|im_start|>assistant
<think>

</think>

"""
PARAMETER temperature 0
PARAMETER num_predict 80
PARAMETER stop <|im_end|>

Parse the first {...} in the response (the model may emit an empty <think> block first).

Evaluation

Held-out exam: 758 real, de-identified production turns (labels = the production-scale LLM scorer this model replaces; real data was never trained on — exam only).

Metric hamo-score-0.6b (v4) Teacher (DeepSeek, 440-question exam) Reference scorer self-consistency*
Dimension-level, within ±0.5 84.0% (A81 / W86 / E85 / H94 / B73) 88.7% 94–98%
Decision-level (state bucket after deterministic stress calc) 96.3% 97.5%
JSON validity ~100%

* Self-consistency = the same messages scored twice by the reference scorer in two live environments; its own agreement is only 94–98% at dimension level — the practical ceiling.

Latency (single message, warm): ~0.8 s on Apple M1 Pro (MLX bf16); 1.5–2.9 s on a 2-vCPU ARM server (q8 GGUF, CPU-only). Crisis-phrase W-recall improved 2× over the previous generation — but see the crisis disclaimer above: recall here is defense-in-depth, not the defense.

How it was trained

A three-stage distillation chain — the full story is in the companion write-up Distilling hamo-score-0.6b: Four Generations, Three Bugs, and Why Data Beat Model Size:

  1. Exam by the incumbent: 1,198 de-identified production turns with reference scores — split into a 440-question teacher-qualification exam and the 758-question held-out final.
  2. Affordable teacher: deepseek-chat running the exact production rubric, qualified at 89% agreement before being allowed to label anything.
  3. Synthetic textbook: ~20,000 admitted dialogue windows across 5 data generations (40+ scenario cells with per-cell label-band admission gates, style quotas for short/ fragmented/code-switched messages, crisis and boundary contrast pairs). No real client message ever entered training — by construction.
  4. Student: Qwen3-0.6B, LoRA on a single MacBook (MLX; prompt-masked loss, cosine decay, grad-checkpointing). Total API cost of the whole project: ~US$7.

Key lessons the hard way (kept as disciplines): gradient-mask the prompt (72% of gradient was being wasted); halve batch size when doubling sequence length (a silent fp16 explosion taught us); verify every deploy down to a landed row.

Limitations & known residuals

  • Chinese-primary (zh 60% / mixed 22% / en 18% in training); English works but is less tested.
  • Message-level footprint, not a person-level or relationship-level assessment.
  • Mid-band calibration is coarse (0.5 grid; mid-band usage 7.4% vs reference 21–32%).
  • Known residuals under repair (v5): under-crediting conversational actions (booking, coping statements) on A; occasional over-scoring of bounded multi-step worries on E.
  • Trained against one specific rubric; scores are relative to that rubric, not universal psychological ground truth.

Versions

Version Change Dim-level Decision-level
v2 first distillation (7.5k synthetic) 81% 95.4%
v3.x rebalance + defect repair 81% 96.8%
v4 (this release) 8-agent data audit → 15k corpus, masked loss 84% 96.3%
v5 A-convention + bounded-E patch in training

License

HAMO-RAIL-S 1.0 (see LICENSE): free commercial and non-commercial use, modification and redistribution, with four use restrictions — no standalone clinical determinations, no consequential decisions about individuals (employment / insurance / surveillance screening), consumer mental-wellness deployments must keep independent upstream crisis handling + AI disclosure, no re-identification. Base model Qwen3-0.6B remains Apache-2.0.


中文说明

hamo-score-0.6b 是 Hamo AI 闭环疗愈引擎里第一个蒸馏进生产的组件:给心理支持对话中 来访者的每一句话「把脉」,输出五路 0–3 分的脉象(A 行动力 / W 退缩 / E 极端化 / H 敌意 / B 边界感)。它从不写回复,也不是危机检测器——在 Hamo 生产系统里,危机内容在更上游被 独立的确定性机制短路,永远到不了把脉师面前;任何部署都必须复刻这个模式(见 LICENSE §3c)。

关于 B(边界感):它的理论本源是家庭治疗中的「自我分化」——是「我是我、你是你」的二元 关系,还是彼此淹没的混沌一元。逐句评分器看不见关系,只看得见语言,所以 B 测的是边界感的 语言足迹:「我需要…」「这是我的底线」得高分;惊慌的倾泻(自我淹没在情绪里)得低分; 骂人算 H 不算 B。B 是逐句信号,不是关系诊断。

成绩单:758 条真实脱敏生产对话终评(评分真值来自被替换的大模型评分器;真实数据只做考卷、 从未参与训练):维度级 ±0.5 一致率 84.0%,决策级(经确定性压力折算后的状态桶判定)96.3%; 参照系——同一批消息让原评分器自己打两遍,维度级自洽也只有 94–98%。单条延迟:M1 Pro 约 0.8 秒;2 vCPU ARM 服务器(纯 CPU,q8 GGUF)1.5–2.9 秒。

训练方式:三级师徒链——生产历史评分出考卷(1,198 条脱敏真题)→ DeepSeek 过 440 题 资格考(89%)后当教师 → 约 2 万段合成对话当教材(40+ 场景格子、逐格标签准入闸门、短句/ 碎片/中英混杂风格配额)→ Qwen3-0.6B 学生在一台 MacBook 上 LoRA 学成。全项目 API 成本 约 7 美元。训练语料不含任何真实来访者消息(构造上保证)。

许可证:HAMO-RAIL-S 1.0——自由商用与修改,但有四条使用限制:不得独立做临床判定、 不得用于对个人的重大决定(雇佣/保险/监控筛查)、面向消费者的心理健康部署必须保留独立的 上游危机处理与 AI 身份披露、不得试图重识别个人。

配套阅读(背景与方法论):《hamo-score-0.6b 是怎么蒸出来的:四代迭代、三个坑,以及数据为什么赢了参数量》。

Downloads last month
-
Safetensors
Model size
0.6B params
Tensor type
BF16
·
MLX
Hardware compatibility
Log In to add your hardware

Quantized

Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for HamoAI/hamo-score-0.6b

Finetuned
Qwen/Qwen3-0.6B
Quantized
(382)
this model
Quantizations
1 model