惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
D
Docker
有赞技术团队
有赞技术团队
D
DataBreaches.Net
The GitHub Blog
The GitHub Blog
爱范儿
爱范儿
H
Help Net Security
美团技术团队
MyScale Blog
MyScale Blog
B
Blog RSS Feed
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
阮一峰的网络日志
阮一峰的网络日志
A
About on SuperTechFans
小众软件
小众软件
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
G
Google Developers Blog
月光博客
月光博客
Google DeepMind News
Google DeepMind News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
F
Fortinet All Blogs

Hacker News: Show HN

PurrrrrFocus: Pomodoro Timer App - App Store Workflow Engine — Multi-Step Orchestration for Bun RapidPhoto: Pro Photo Editor App - App Store GitHub - DheerG/swarms: Achieve extraordinary results with claude code across a variety of tasks SPICE simulation → oscilloscope → verification with Claude Code — Lucas Gerads Show HN: VCoding – A 5 MB native Windows IDE with no dynamic dependencies Show HN: LLMs don't hallucinate because they're bad at math, it's the format GitHub - Agent-FM/agentfm-core: AgentFM is a peer-to-peer network that turns everyday computers into a decentralized AI supercomputer. AgentFM lets you run massive AI workloads directly across a global mesh of idle CPUs and GPUs. Show HN: Tracking Top US Science Olympiad Alumni over Last 25 Years GitHub - Potarix/agent-hub: One place to talk to all your agents Show HN: Runtime security for AI agents(injection,tool abuse, data exfiltration) GitHub - dubeyKartikay/lazyspotify: Terminal Spotify client for macOS and Linux GitHub - the-banana-tool/king-louie: Easy to use GUI Personal AI Assistant. Win/Linux/Mac. Show HN I made my vacation rental bookable by AI agents–no Airbnb, 0% commission GitHub - basteez/jsf-autoreload: maven plugin to enable hot reload on jsf projects uvm32/hosts/host-gdbstub at main · ringtailsoftware/uvm32 GitHub - labsai/EDDI: Config-driven engine that turns JSON into production-grade AI agents. Multi-agent orchestration, 12+ LLM providers, MCP/A2A protocols, RAG, persistent memory, and enterprise compliance (EU AI Act, GDPR, HIPAA). Built on Quarkus. GitHub - glitchnsec/fortyone-oss: AI Executive Assistant Platform Quickstart | Alien GitHub - muxshed/shed: One stream in, or many. Every destination, simultaneously. No cloud middleman, no per-channel fees, no limits. GitHub - ocrbase-hq/ocrbase: 📄 PDF/IMG ->.MD/JSON Document OCR API for PaddleOCR and GLMOCR. Self-hostable. GitHub - impactjo/home-memory: MCP server that lets your AI assistant remember everything about your home. GitHub - Sets88/dbcls: DbCls is a powerful terminal database client that supports various databases GitHub - neptun2000/heor-agent-mcp GitHub - SeanFDZ/macmind: Single-layer transformer in HyperTalk for the classic Macintosh RollQuation: Math Puzzles - Apps on Google Play GitHub - dropbox/witchcraft Show HN: Agent-cache – Multi-tier LLM/tool/session caching for Valkey and Redis GitHub - opentalon/opentalon: OpenTalon is an open-source platform built from the ground up in Go as a robust alternative to OpenClaw LinkedIn™ 职位抓取工具 - Chrome 应用商店
GitHub - eigenweltlabs/emotion-steering: Extract and serv...
ChrisPoensge · 2026-05-06 · via Hacker News: Show HN

Extract and serve CAA-style emotion steering vectors for any HuggingFace causal LM, with a fast vLLM path for Qwen3.

            ┌────────────┐                          ┌────────────────────┐
   labeled  │ extract    │  vectors + AUC report    │ serve              │
  contrasts ├────────────┤ ─────────────────────▶   ├────────────────────┤
  (default: │            │  *_chosen.npy            │ POST /v1/chat/...  │ ← per-request
   GoEmotions│ HF-hooks   │  *_full_sweep.npy        │ GET  /v1/emotions  │   steering
  → Ekman 6)│ + AUC probe│  metadata.json           │ GET  /v1/models    │
            └────────────┘                          └────────────────────┘
                                                       │           │
                                              ┌────────┘           └────────┐
                                          vLLM fast (Qwen3)         HF transformers
                                          ~365 tok/s @ L4           any architecture
                                          continuous batching       single-stream

CAA reference: Rimsky et al., Steering Llama 2 via Contrastive Activation Addition. This implementation uses the same basic contrastive direction idea: mean(class) − mean(rest of contrast set) at a chosen residual-stream layer.

Install

pip install -e .                  # core (HF backend works for any model)
pip install -e .[vllm]            # add vLLM 0.20.x fast path (Qwen3 architecture)

Requires Python 3.10+. Extraction needs a CUDA GPU. Serving HF needs a GPU; serving vLLM needs a GPU + the vllm extra. The vLLM fast path patches Qwen3 internals and is intentionally version-pinned to vLLM 0.20.x.

CLI

Extract

emotion-steering extract \
  --model Qwen/Qwen3-8B \
  --emotions anger,joy,sadness,disgust,fear,surprise \
  --output ./vectors

Defaults: GoEmotions auto-mapped to Ekman 6, balanced classes, search layers spanning the middle ~30% of the network, contiguous 3-layer chosen window picked by AUC.

Layer selection:

emotion-steering extract --layers mid              # default middle band
emotion-steering extract --layers early,mid,late   # named preset bands
emotion-steering extract --layers 4,20,32 --window 1
emotion-steering extract --layer 20                # single layer; window=1

--layers accepts early, mid, late, all, integer layer ids, or comma-separated mixes. --search-layers remains available as the legacy explicit CSV option.

The output directory contains <emotion>_chosen.npy, <emotion>_full_sweep.npy, and metadata.json (model id, layers, AUC matrix, validation counts).

Test (offline)

emotion-steering test ./vectors

Prints validation ROC-AUC by layer and per-emotion L2 vector norms. ROC-AUC is unitless (0.5 chance, 1.0 perfect separation); norms are hidden-state vector magnitudes, not emotion intensity units.

Serve

emotion-steering serve --vectors ./vectors --model Qwen/Qwen3-8B

Auto-picks the vLLM fast path for Qwen3 (continuous batching, throughput parity with un-steered vLLM), and the HF slow path for any other arch.

To force a backend: --backend vllm or --backend hf.

The endpoint is OpenAI-compatible:

route purpose
POST /v1/chat/completions OpenAI-style; vLLM path reads body.vllm_xargs.steering; HF path also accepts body.steering
GET /v1/emotions id ↔ name map + bundle metadata
GET /v1/models OpenAI list
GET /healthz liveness

test-http (live smoke test)

emotion-steering test-http --base-url http://localhost:8000 --api-key $KEY

Hits /v1/emotions for the ID map, then fires a baseline + one request per emotion in parallel and prints continuations.

Steering API

Per-request, in the chat-completions body:

"vllm_xargs": {
  "steering": [emotion_id, alpha, emotion_id, alpha, ...]
}
  • IDs come from GET /v1/emotionsid_map.
  • alpha is a float; validated range −0.5 to 2.0.
  • Stack multiple emotions: [0, 1.0, 2, 0.5] = 1.0×anger + 0.5×sadness.
  • Negative alphas push away from the emotion.

For the HF compatibility backend, top-level body.steering is also accepted. For the vLLM fast path, use body.vllm_xargs.steering or pass it through the OpenAI SDK as an extra body field.

Two backends

HF transformers vLLM (fast path)
Architectures any HF causal LM Qwen3 (extensible)
Throughput @ L4 ~50–80 tok/s solo ~365 tok/s @ 32 concurrent
Continuous batching no (serialized) yes
Streaming not yet yes (vLLM-native)
Setup pip install emotion-steering + pip install emotion-steering[vllm] (vLLM 0.20.x)

To add a vLLM fast path for a new architecture, see .claude/skills/extend-vllm-fast-path.md.

Bundled example

examples/qwen3-8b-ekman6/ ships with all six Ekman vectors at layers 20/21/22 for Qwen/Qwen3-8B. These are the vectors used for our Qwen3-8B validation run. Drop-in:

emotion-steering serve --vectors examples/qwen3-8b-ekman6 --model Qwen/Qwen3-8B

Recommended alphas (validated):

emotion α note
anger 1.5
joy 1.5
sadness 1.5
disgust 1.0 very strong vector — too hot at 1.5
fear 1.5 mild — try 2.0 for stronger
surprise 0.75 largest norms; ≥ 1.5 produces degenerate output

How extraction works

  1. Dataset → contrastive labels. GoEmotions is auto-aggregated to Ekman 6 categories per Demszky 2020. Records with mixed Ekman categories are dropped; classes are then balanced to the smallest count.
  2. Capture activations. Forward hooks read the post-block residual stream at every search layer for the last non-pad token of each input.
  3. Build vectors. v_e = mean(activations | label = e) − mean(activations | label ∈ rest_of_targets).
  4. Validate per layer. GPU-LBFGS logistic-regression probe (one-vs-rest) gives AUC at each layer. Pick the contiguous 3-layer window with the highest mean micro-AUC.
  5. Save. <emotion>_chosen.npy for the chosen window, <emotion>_full_sweep.npy for every searched layer, plus metadata.json with the AUC report.

How serving works

vectors are added to the residual stream entering the layer after each chosen layer (i.e. hidden_states += alpha · v at the end of each chosen decoder block). Same convention as the capture step (post_block_residual_stream) so the vectors act in the space they were extracted from.

vLLM fast path: a small monkey-patch wraps GPUModelRunner.execute_model to build a per-token tensor from each request's SamplingParams.extra_args["steering"] and stash it on the runner; the patched decoder layer reads it during forward. The CLI installs that patch into the active vLLM package at serve startup, so use an isolated, writable virtualenv.

HF slow path: a forward hook is installed for the duration of each request, then removed.

Project layout

emotion-steering/
├── src/emotion_steering/
│   ├── cli.py             # extract / test / serve / test-http
│   ├── dataset.py         # GoEmotions Ekman + custom mappings
│   ├── extract.py         # capture + contrastive mean-difference vectors
│   ├── probe.py           # GPU-LBFGS LR probe
│   ├── vectors.py         # bundle save/load
│   └── serve/
│       ├── hf.py          # FastAPI + transformers (any model)
│       ├── vllm.py        # vLLM with monkey-patches (fast)
│       └── _patches/      # vLLM patch payload (qwen3.py, _steering.py, Dockerfile)
├── examples/qwen3-8b-ekman6/
├── tests/
└── .claude/skills/
    ├── emotion-steering-usage.md
    └── extend-vllm-fast-path.md

License

Apache 2.0. The vLLM-derived files in serve/_patches/ carry forward vLLM's Apache-2.0 license.

Citing & references