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

推荐订阅源

IT之家
IT之家
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
爱范儿
爱范儿
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
Y
Y Combinator Blog
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
Martin Fowler
Martin Fowler
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
M
MIT News - Artificial intelligence
博客园 - Franky
V
Visual Studio Blog
I
InfoQ
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
博客园 - 司徒正美
L
LangChain Blog

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