4단계 아홉 번째 논문. 이 글은 Emmanuel Ameisen 외의 Circuit Tracing Revealing Computational Graphs in Language Models 원문을 직접 읽고 썼다. 원문 공개일은 2025-03-27이다. 후속 사례 연구인 On the Biology of a Large Language Model과 구분한다. 이 글의 대상은 방법 논문이다. 확인 기준일은 2026-07-24이며, 공개 도구 소스는
safety-research/circuit-tracercommit8f1e2438이다.
이 글에서 얻을 답과 범위
이전 글의 Sparse Autoencoder(SAE, 희소 오토인코더)와 Scaling Monosemanticity는 activation vector를 사람이 읽을 만한 feature 후보의 합으로 바꾸려 했다. 하지만 feature가 Texas라는 이름으로 보인다고 해서, Dallas → Texas → Austin 답을 낼 때 그 feature가 실제 중간 계산에 쓰였다는 뜻은 아니다. Circuit Tracing은 한 prompt에서 한 output logit(softmax 이전 점수)까지 영향을 준 feature와 token의 연결을 graph로 만드는 방법이다.
읽은 뒤에는 아래를 설명할 수 있어야 한다.
- replacement model(대체 모델)이 original model(원 모델)을 새로 학습시키는 모델이 아닌 이유.
- CLT(Cross-Layer Transcoder, 층간 transocoder)가 per-layer SAE보다 circuit path를 짧게 만들 수 있는 이유.
- clean prompt에서 output을 정확히 맞춘 local replacement model이 causal mechanism(인과적 계산 과정)을 증명하지 않는 이유.
- attribution graph의 token embedding, active feature, error, logit 네 node가 각각 무엇인지.
QKattention circuit을 고정하면 무엇을 설명하고 무엇을 놓치는지.- Jacobian(야코비안) edge와 pruning이 수많은 경로에서 읽을 후보를 고르는 방식.
- graph의 feature label, graph influence, ablation(제거 실험)을 왜 같은 증거로 취급하면 안 되는지.
범위는 원문의 18-layer 연구 모델과 Claude 3.5 Haiku에서 쓴 방법, 그리고 2025년 공개 circuit-tracer 구현의 호출 흐름이다. Claude 내부를 완전히 읽었다거나 model의 생각을 문장으로 복원했다는 주장은 범위 밖이다. 후속 biology 논문의 planning, multi-hop reasoning, hallucination 사례는 방법의 사용 예일 뿐 여기서 별도 사실 주장으로 확장하지 않는다.
핵심 한 문장. Circuit Tracing은 “이 feature가 답과 비슷해 보인다”를 “이 clean prompt에서 이 feature의 변화가 어떤 linear path로 이 logit에 닿는가”라는 검증 가능한 가설로 바꾸는 도구다. 다만 그 graph는 고정한 attention·normalization과 reconstruction error 위에서만 local하게 성립한다.
왜 필요한가 — activation 하나를 읽어서는 계산 순서를 알 수 없다
사람이 계산기를 열어 36 + 59를 푼다고 하자. 최종 화면의 95만 보면 어떤 순서로 계산했는지 모른다. 1의 자리 6+9=15, carry, 10의 자리 처리 중 무엇을 했는지 중간 상태와 연결을 봐야 한다. LLM(Large Language Model, 대규모 언어 모델)도 마지막 layer의 Austin 점수만 봐서는 Dallas, Texas, 수도 지식이 어떤 순서로 만났는지 알 수 없다.
기존 activation 분석에는 세 공백이 있다.
| 관찰 | 알 수 있는 것 | 아직 모르는 것 |
|---|---|---|
| neuron 또는 SAE feature가 켜짐 | 특정 입력과 함께 나타난 candidate concept | 이 feature가 output에 필요한가 |
| feature가 특정 token logit을 올림 | direct residual 방향 효과 | 다른 feature를 거친 multi-step 효과 |
| activation patch/ablation 성공 | 한 intervention에서 출력이 달라짐 | 어떤 중간 경로가 실제 원인이었나 |
원문의 목표는 original Transformer의 모든 연산을 투명하게 만드는 것이 아니다. MLP(Multi-Layer Perceptron, 다층 퍼셉트론) 부분을 sparse feature로 바꾸고, 한 prompt에 국한한 local computation graph에서 input token부터 output logit까지 강한 연결을 찾는 것이다.원문 Introduction·Architecture
이 선택은 강점과 대가를 동시에 만든다. prompt 하나의 구체적 질문에는 깊게 내려갈 수 있지만, 다른 prompt에서도 같은 graph가 그대로 맞는다는 보장은 없다. 더 중요한 대가는 attention이 “어디에서 무엇을 가져올지” 정한 이유를 고정해 버린다는 점이다.
무엇인가 — 원 모델을 대신 설명하는 local graph
먼저 용어를 분리하자.
| 이름 | 역할 | 원 모델과의 관계 |
|---|---|---|
| original model | 실제 Transformer | 우리가 설명하고 싶은 대상 |
| CLT | MLP 출력을 sparse feature의 decoder 합으로 근사하는 dictionary | MLP와 같은 input/output을 흉내 내도록 학습 |
| replacement model | original MLP output을 CLT reconstruction으로 교체한 forward pass | 완전한 일치는 아님 |
| local replacement model | 특정 clean prompt에서 recorded error를 더하고 attention pattern·normalization denominator를 고정한 replacement | clean prompt의 activation·logit은 original과 정확히 맞춤 |
| attribution graph | local replacement model의 node와 direct linear edge | prompt 하나의 계산 가설 |
여기서 local이 핵심이다. original model을 f(x)라고 하고 clean prompt activation을 x₀라고 하자. local replacement model은 x₀에서는 original과 같은 값을 내도록 맞춘다. 하지만 x₀ + Δx처럼 입력을 바꾸면 original의 attention pattern, LayerNorm denominator, MLP gate도 바뀔 수 있다. local model은 그것을 고정했으므로 같은 방향으로 반응할 수도, 다르게 반응할 수도 있다.
따라서 다음 추론은 틀렸다.
clean prompt에서 replacement output = original output
→ replacement가 original과 같은 계산을 한다
→ graph가 original의 완전한 원인 설명이다
첫 줄만 원문 방법이 보장한다. 두 번째와 세 번째는 perturbation(개입)으로 따로 시험해야 한다.원문의 Local Replacement Model
선행 개념 — residual stream, MLP, logit, attention을 먼저 닫기
Transformer block은 공용 메모리에 정보를 더한다
Transformer token position마다 길이 d_model인 vector를 들고 layer를 통과한다. 이를 residual stream(잔차 흐름)이라고 부른다. 각 layer는 대략 아래처럼 이전 vector에 새 계산을 더한다.
residual stream
→ attention: 다른 token에서 정보를 읽어 옮김
→ MLP: position별 비선형 변환
→ residual stream에 덧셈
attention은 두 부분을 나눠 봐야 한다.
QK(Query-Key) — 현재 token이 어느 위치를 얼마나 볼지 정하는 attention pattern이다.OV(Output-Value) — 고른 위치의 정보를 어떤 vector로 옮길지 정하는 선형 변환이다.
Circuit Tracing은 clean prompt에서 실제로 나온 QK pattern을 고정한다. 그러므로 “Dallas 정보를 Austin 위치로 옮긴 영향”은 볼 수 있지만, “왜 Dallas에 attention했는가”는 설명하지 못한다. 원문도 이 방법이 QK circuit을 놓치고 OV circuit만 포착한다고 명시한다.원문의 Edge 정의와 QK/OV 한계
마지막 residual vector에 unembedding matrix를 곱하면 vocabulary token별 logit이 나온다. softmax는 logits를 확률로 바꾼다. graph는 확률 자체가 아니라 특정 token의 pre-softmax logit에 기여한 경로를 추적한다. 확률은 모든 logit의 경쟁 결과라서, 한 logit의 작은 변화가 확률의 작은 변화와 같지 않기 때문이다.
Jacobian은 작은 변화의 전달표다
함수 y=f(x)에서 x의 아주 작은 변화가 y를 얼마나 바꾸는지를 미분으로 쓴다. 입력·출력이 vector면 모든 입력 좌표와 출력 좌표의 미분을 표로 모은 것이 Jacobian(야코비안)이다.
[ J_{i,j}=\frac{\partial y_i}{\partial x_j} ]
이 논문은 원래 model의 모든 비선형 미분을 그대로 쓰지 않는다. clean prompt에서 기록한 attention pattern과 normalization denominator를 상수로 두고, MLP는 CLT로 대체한다. 그래서 남은 residual·OV 경로에서 source vector가 target feature preactivation에 미치는 영향이 linear map으로 계산된다. 이것이 edge를 더할 수 있게 만드는 전제다.
밑바닥 원리 — Cross-Layer Transcoder가 MLP 출력을 다시 쓰는 법
한 layer만 읽고 다음 여러 layer에 쓴다
L을 MLP layer 수, d를 residual dimension, F를 layer당 feature 수로 둔다. layer ℓ residual input을 x^ℓ ∈ ℝ^d라 하자. CLT의 encoder는 feature preactivation을 만들고 JumpReLU가 threshold를 넘은 것만 남긴다.
[ a^\ell=\operatorname{JumpReLU}(W_{enc}^\ell x^\ell) \tag{1} ]
W_enc^ℓ ∈ ℝ^{F×d}— residual vector에서 feature를 읽는 matrix.a^ℓ ∈ ℝ^F— layerℓfeature activation.JumpReLU(z;τ)—z > τ이면z, 아니면0을 반환하는 thresholded ReLU다. 대부분을 정확히 0으로 만들어 graph node 수를 줄인다.
일반 per-layer transcoder는 layer ℓ feature가 같은 layer MLP output만 복원한다. CLT의 layer ℓ′ feature는 ℓ′ 이후 모든 MLP layer에 decoder vector를 쓸 수 있다.
[ \hat y^\ell=\sum_{\ell'=1}^{\ell}W_{dec}^{\ell'\to\ell}a^{\ell'} \tag{2} ]
y^ℓ ∈ ℝ^d— original layerℓMLP output.ŷ^ℓ ∈ ℝ^d— CLT reconstruction.W_dec^{ℓ′→ℓ} ∈ ℝ^{d×F}— earlier feature를 current MLP output 방향으로 쓰는 decoder.
예를 들어 layer 0 feature가 Texas라는 중간 상태를 잡았다면, layer 0 MLP뿐 아니라 layer 1, 2의 MLP output reconstruction에도 직접 기여할 수 있다. 중간 MLP마다 Texas를 다시 증폭하는 feature chain을 모두 밟지 않아도 되므로 graph의 path가 짧아질 여지가 있다. 이것은 “원 model이 실제로 skip connection을 이렇게 썼다”는 뜻이 아니다. 설명용 replacement basis가 여러 layer 출력을 묶은 것이다.
CLT가 최적화하는 것은 설명 가능성과 복원의 trade-off다
원문은 모든 layer를 공동 학습하고, reconstruction error와 sparsity penalty의 합을 최소화한다.
[ L_{\text{MSE}}=\sum_{\ell=1}^{L}\left\lVert\hat y^\ell-y^\ell\right\rVert_2^2 \tag{3} ]
[ L_{\text{sparsity}}=\lambda\sum_{\ell=1}^{L}\sum_{i=1}^{F} \tanh!\left(c\left\lVert W_{\text{dec},i}^{\ell}\right\rVert a_i^\ell\right) \tag{4} ]
λ와 c는 hyperparameter(학습 전에 정하는 값)다. W_dec,i는 feature i가 여러 downstream layer에 쓰는 decoder vector들을 연결한 값이다. 식 (3)만 쓰면 모든 feature가 조금씩 켜지는 dense code가 쉬워진다. 식 (4)는 적은 feature만 켜지도록 압력을 준다. 반대로 sparsity만 강하면 MLP output을 제대로 복원하지 못한다.
원문은 18L(18-layer) 작은 Transformer와 Claude 3.5 Haiku에서 CLT를 훈련했다. 18L은 MLP가 없는 layer 0 때문에 17 CLT layer를 가지며, total feature 수는 18L에서 30만1,000만, Haiku에서 30만3,000만 범위다.원문의 CLT architecture·loss·training scope
replacement와 local replacement를 혼동하지 않는다
replacement model은 original forward pass 중 MLP output을 식 (2)의 ŷ로 덮어쓴다. 그래서 reconstruction error가 layer마다 누적될 수 있다. 원문의 largest 18L CLT는 특정 filtered pretraining-style prompt 집합에서 original과 같은 top-1 next-token completion을 낸 비율이 50%였다. 이것은 18L 정확도가 50%라는 뜻도, Claude 3.5 Haiku 결과도, “50%를 이해했다”는 뜻도 아니다.원문의 replacement-model 평가 범위
local replacement model은 clean prompt p에서 error를 다시 더한다.
[ e_{c,\ell}=\operatorname{MLP}{c,\ell}(p)-\operatorname{CLT}{c,\ell}(p) \tag{5} ]
c는 token position이다. clean prompt에서는 ŷ + e = y이므로 original activation과 logit이 정확히 일치한다. error node는 이 “CLT가 아직 설명하지 못한 MLP output”을 graph에 정직하게 남긴 node다. 원인을 모르는 값을 0으로 지워서 graph를 예쁘게 만들지 않는 장치다.
내부 구조와 실제 실행 흐름 — token에서 graph file까지
네 종류의 node
원문의 attribution graph는 아래 node를 둔다.
| node | graph에서 뜻 | error가 필요한 이유 |
|---|---|---|
| embedding node | prompt input token의 embedding vector | 계산의 출발점을 남김 |
| feature node | clean prompt에서 0이 아닌 (layer, position, feature) | 해석 후보인 중간 단위 |
| error node | 식 (5)의 CLT 미설명 MLP residual | reconstruction의 빈 구멍을 숨기지 않음 |
| logit node | output candidate token의 pre-softmax score | 추적할 목적지 |
실제 공개 라이브러리도 이 순서를 [active features, error nodes, token nodes, logit nodes]로 adjacency matrix에 저장한다.Graph.__init__ node order
edge는 “source activation × local derivative”다
source feature s의 activation을 a_s, target feature t의 preactivation을 h_t라 하자. local replacement model에서 virtual weight w_{s→t}는 a_s를 아주 조금 바꿨을 때 h_t가 변하는 비율이다.
[ w_{s\to t}=\frac{\partial h_t}{\partial a_s},\qquad A_{s\to t}=a_s w_{s\to t} \tag{6} ]
A가 graph edge weight다. w는 방향의 민감도이고 A는 이 prompt에서 실제 켜진 양까지 반영한 기여다. feature가 강한 decoder를 가져도 a_s=0이면 active-feature graph에는 node가 없다. 이 점이 뒤에서 설명할 inhibitory circuit(억제로 인해 켜지지 않은 feature)을 놓치는 원인이다.
원문은 backward Jacobian으로 edge를 효율적으로 얻는다. source s가 layer ℓ_s에서 layer ℓ들에 쓰고 target t가 layer ℓ_t에서 읽는다면,
[ A_{s\to t}=a_s\sum_{\ell_s\le\ell<\ell_t} \left(W_{\mathrm{dec},s}^{\ell_s\to\ell}\right)^T J^{\blacktriangledown}{c_s,\ell\to c_t,\ell_t} W{\mathrm{enc},t}^{\ell_t} \tag{7} ]
J^▽는 clean forward pass의 attention pattern·normalization denominator를 기록한 뒤, MLP output·attention pattern·normalization denominator에 stop-gradient를 적용한 Jacobian이다. 식 (7)은 source decoder가 residual·frozen OV path를 따라 target encoder에 얼마나 투영되는지 모두 더한다. 계산 결과는 original weight 하나가 아니라 prompt마다 만드는 virtual weight다.원문의 edge 수식·backward Jacobian
고정 덕분에 target preactivation은 이전 source edge의 합으로 쓸 수 있다.
[ h_t=\sum_{s\in\mathcal S_t}A_{s\to t} \tag{8} ]
여기서 𝒮_t는 earlier layer와 같은/earlier context position의 source node 집합이다. 이 linear decomposition은 아주 유용하지만 “Transformer가 본래 선형이다”를 뜻하지 않는다. clean prompt 주변에서만 비선형 경계를 멈춰 세운 것이다.
공개 구현은 어떤 순서로 실행되는가
2026-07-24에 확인한 공개 도구의 최소 흐름은 다음과 같다.
ReplacementModel.from_pretrained(model, transcoders)
→ attribute(prompt, model)
→ backend별 attribution 구현 선택
→ dense adjacency Graph 생성
→ prune_graph(graph)
→ create_graph_files(graph, slug, output_path)
→ feature/error/token/logit node JSON + edge JSON
→ local visualization server 또는 Neuronpedia UI
attribute()는 prompt와 frozen replacement model을 받고 backend를 nnsight 또는 TransformerLens 구현으로 route한다.attribute.py:20-92 create_graph_files()는 prune 뒤 node와 edge를 JSON으로 직렬화한다.create_graph_files.py:161-208
이는 paper의 18L·Haiku artifact를 그대로 재현하는 코드가 아니다. 현재 공개 library는 pre-trained transcoder가 있는 open-weight model에서 graph를 만들고 visualizing·feature intervention을 지원한다.공개 도구 README
알고리즘 — 수백만 edge에서 읽을 경로를 고르는 pruning
feature가 token마다 약 백 개만 active여도 prompt가 길면 edge 수는 수백만이 될 수 있다. 모든 edge를 읽는 것은 사람이 할 수 없다. 원문은 target row, source column 형태의 adjacency matrix에서 sign을 버리고 absolute value로 만든 unsigned matrix를 사용한다.
[ \widetilde A_{t,s}=\frac{|A_{t,s}|}{\sum_j|A_{t,j}|} \tag{9} ]
각 target의 들어오는 edge absolute contribution 합이 1이 된다. 그 다음 모든 path 길이의 influence를 더한다.
[ B=\widetilde A+\widetilde A^2+\widetilde A^3+\cdots \tag{10}
[ B=(I-\widetilde A)^{-1}-I \tag{11}
이 graph는 layer 시간 방향으로 진행하는 DAG(Directed Acyclic Graph, 방향 비순환 그래프)이므로 유효 경로 길이가 유한하다. 식 (11)은 같은 합을 빠르게 표현한 형태다. implementation은 matrix power를 반복해 logit influence를 계산한다.compute_influence 구현
원문 기본값은 다음 순서다.
- top logits의 누적 확률이 0.95 이상이 될 때까지 고르되, 10개에서 멈춘다.
- 그 logit rows를 output probability로 가중 평균해 node influence를 만든다.
- non-logit node 중 총 influence의 약 80%를 보존하는 최소 집합만 남긴다.
- 남은 graph에서 edge influence를 다시 계산해 약 98%를 보존하는 edge만 남긴다.
- 연결이 끊긴 node를 반복 제거한다.
80%와 98%는 자연 법칙이 아니라 읽기 쉬움과 보존량 사이의 사람이 고른 cutoff다. 같은 acronym prompt에서 원문은 threshold 0.95일 때 236 nodes·completeness 0.87, default 0.8일 때 55 nodes·0.70을 보고한다. graph가 짧아질수록 인간은 읽기 쉽지만, 설명하지 못한 부분은 커진다.원문의 pruning frontier
직접 검증 — 작은 CLT와 local error를 숫자로 계산하기
환경과 실행
- 환경 — macOS 26.4.1, Python 3.9.6, 표준 라이브러리만 사용.
- 검증 파일 —
/tmp/circuit-tracing-research/verify_circuit_tracing_toy.py. - 명령
python3 /tmp/circuit-tracing-research/verify_circuit_tracing_toy.py
실제 실행 결과는 아래였다.
CLT activations: a0=2.0, a1=2.0
cross-layer reconstructions: y0=1.0, y1=2.5
clean error/local/original: (0.19999999999999996, 0.5) / (1.2, 3.0) / (1.2, 3.0)
influence [input, feature, error, logit]: [0.677419, 0.645161, 0.322581, 1.0]
finite perturbation original/local: 0.0 / 1.4
checks passed
무엇을 계산했는가
첫 검증은 layer 0 feature a0=2가 0→0 decoder로 layer 0 reconstruction 1.0을 만들고, 0→1 decoder로 layer 1 reconstruction에 2.0을 더하는 것을 확인한다. layer 1 own feature가 0.5를 더해 ŷ¹=2.5가 된다. 이것이 식 (2)의 cross-layer sum이다.
두 번째 검증은 original MLP output (1.2, 3.0)에서 reconstruction (1.0, 2.5)를 빼 error (0.2, 0.5)를 만든다. clean prompt에서는 ŷ+e=y다. error node가 없어도 되는 noise가 아니라, 현재 CLT가 아직 설명하지 못한 실제 computation이라는 뜻이다.
세 번째 검증은 input → feature → logit의 two-hop path와 input → logit direct path, error → logit path를 unsigned normalized adjacency로 누적한다. input influence 0.677419에는 feature를 거친 path와 direct path가 같이 들어간다. direct edge만 보지 않고 path 전체를 더해야 하는 이유다.
마지막 검증은 가장 중요한 반례다. original toy MLP를 ReLU(2x-1)로 두고 clean x=2에서 local error를 고정했다. clean output은 둘 다 3.0으로 정확히 맞는다. 하지만 x=0.4로 perturb하면 original은 ReLU threshold를 넘어 0.0, frozen-error local model은 1.4다. baseline 일치가 finite intervention의 mechanism faithfulness를 보장하지 않는다.
이 검증은 논문의 수식·가정을 작은 산술로 확인한 것이다. PyTorch, pre-trained CLT, 18L, Claude 3.5 Haiku, paper graph, reported correlation을 재현하지 않았다. 실제 library에는 Torch와 model weights, GPU memory가 필요하다. Anthropic은 이후 supported open-weight model용 tracing tool을 공개했다.Anthropic 공개 안내
성능과 트레이드오프 — graph가 작아져도 truth가 늘어나는 것은 아니다
측정값을 무엇으로 읽어야 하는가
원문은 10M dictionary의 18L graph에서 CLT와 per-layer transcoder(PLT)를 비교했다.
| replacement type | completeness score | replacement score | 해석 |
|---|---|---|---|
| CLT 10M | 0.80 | 0.61 | 중요한 node input 중 non-error 비율과, token→logit 전체 path의 feature 경유 비율 |
| PLT 10M | 0.78 | 0.37 | 같은 좁은 evaluation에서 CLT보다 end-to-end feature path가 적음 |
completeness는 feature·embedding에서 온 incoming edge 비율에 partial credit을 준다. replacement는 token에서 logit까지 error 없이 feature를 거친 end-to-end path 비율이라 더 엄격하다. 둘 다 human-understandable label의 정확도나 original model의 완전한 causality score가 아니다.원문의 score 정의·10M 비교
시간·메모리 비용
graph edge 계산은 active feature 수에 선형이고, 실제 병목은 original model backward pass다. 그래서 원문은 output logit에서 시작해 가장 영향이 큰 feature queue를 확장하는 adaptive attribution을 쓴다. full dense graph를 전부 만든 뒤 80%를 버리는 일을 피하려는 선택이다.원문의 graph computation cost
| 선택 | 얻는 것 | 지불하는 것 |
|---|---|---|
| CLT feature 수 증가 | reconstruction·graph score 개선 가능성 | training FLOPs, decoder parameter, feature labeling 부담 |
| cross-layer decoder | 짧은 graph path, PLT보다 높은 replacement score 사례 | feature가 original layer 계산을 묶어 mechanism fidelity 위험 증가 |
| aggressive pruning | 사람이 읽을 node 수 감소 | error·weak negative path·대체 경로 손실 |
| frozen QK·normalization | linear attribution과 빠른 Jacobian | attention selection 이유·큰 perturbation 반응 미설명 |
| error node 보존 | reconstruction 빈 구멍을 드러냄 | graph가 덜 예쁘고 해석이 중단될 수 있음 |
원문이 공유한 Gemma 2 추정치에서 2B model의 200만 feature·10억 training token CLT run은 약 3.8e20 training FLOPs, 50% 효율 가정 약 210 H100-hours다. 이는 특정 setup의 rough estimate이지 일반적인 “circuit tracing 비용”이 아니다.원문의 estimated compute requirements
실패와 한계 — 이 graph가 말하지 않는 것
QK circuit을 얼리면 induction의 핵심을 놓칠 수 있다
Aunt Sally ... Aunt ___에서 model이 이전 Sally를 예측했다고 하자. graph가 Sally token에서 say Sally logit으로 간 edge만 보여 주면 정보가 이동했다는 사실은 보인다. 하지만 진짜 핵심은 “현재 Aunt 앞 문맥이 과거 Aunt Sally를 찾아 해당 위치에 attention하게 만들었다”는 QK matching이다. 원문은 이 경우가 방법의 명시적 실패 사례라고 든다.원문의 Missing Attention Circuits 예
error node는 dark matter를 가리는 경고등이다
CLT가 MLP output을 다 복원하지 못하면 graph의 error node는 input edge 없이 갑자기 등장한다. 난독화된 malware 요청을 거부한 Haiku 사례에서 원문은 obfuscated prompt token 부근이 거의 error node가 되어 refusal feature의 기원을 따라갈 수 없었다고 보고한다. error가 적다고 안전한 것도, error가 많다고 model이 틀린 것도 아니다. 이 prompt·이 dictionary가 설명하지 못한 computation이 남았다는 신호다.원문의 Reconstruction Errors and Dark Matter
active feature만 보면 “억제돼서 안 켜진 원인”을 놓친다
active feature graph에는 0인 feature가 없다. 그런데 어떤 answer를 내지 않은 이유가 cannot answer feature가 다른 feature에 의해 억제되어 비활성인 데 있을 수 있다. 원문은 hallucination/entity recognition 사례에서 이런 inhibitory circuit을 지적한다. 사후에 특정 inactive feature를 넣어 볼 수 있지만, 수천만 inactive feature 중 무엇을 고를지 자체가 어려운 문제다.원문의 inactive features limitation
운영·안전 판단
attribution graph를 production safety monitor로 바로 쓰면 안 된다. model checkpoint, transcoder checkpoint, prompt template, tokenizer, layer hook, pruning threshold, node label, intervention definition이 하나라도 바뀌면 같은 feature ID·edge score를 비교할 수 없다. 최소한 아래를 versioned artifact로 남겨야 한다.
model + tokenizer revision
transcoder revision + layer hook + feature index
prompt / token ids / target logits
frozen attention·normalization capture 방식
node·edge pruning threshold
ablation / steering protocol과 held-out 결과
error-node 비율과 실패 prompt
그럼에도 graph는 explanation hypothesis generator다. user permission, tool allowlist, authentication, audit log, red-team behavior evaluation을 대체하는 authorization control이 아니다.
대안과 선택 기준 — 질문에 맞는 증거를 쓴다
| 질문 | 우선 도구 | Circuit Tracing을 쓸 때 | 쓰지 않을 때 |
|---|---|---|---|
| RAG 답변이 틀린 이유 | retrieval trace, source citation, golden eval | 일반 LLM 내부 behavior 연구가 목적일 때 | 문서 누락·권한·chunk 문제를 먼저 봐야 할 때 |
| 특정 prompt의 internal feature path | CLT + attribution graph + intervention | sparse transcoder와 model access가 있을 때 | closed model API만 있고 internal activation이 없을 때 |
| attention이 왜 그 token을 골랐나 | QK circuit 분석, attention patching | OV path가 질문의 중심일 때 | selection/matching이 핵심일 때 |
| output 바꾸기 | prompt, fine-tuning, activation steering 비교 | discovered feature를 causal candidate로 시험할 때 | production behavior tuning의 유일한 수단으로 쓸 때 |
| model 안전성 판단 | behavior eval, red team, policy enforcement | 특정 mechanism의 후속 조사 후보를 만들 때 | graph label 하나로 risk verdict를 낼 때 |
원문은 feature-to-feature influence와 downstream ablation effect 사이 Spearman correlation 0.72를 보고했다. 이는 이 평가 설정에서 graph influence가 단순 activation magnitude나 direct edge보다 유용한 proxy라는 증거다. universal correctness 증명은 아니다. layer를 여러 개 지나면 perturbation discrepancy가 누적되고, one-layer-after intervention에서도 약 0.8 cosine similarity·약 0.4 normalized MSE라는 제한이 보고된다.원문의 mechanistic faithfulness 평가
흔한 오해와 최초 질문에 대한 답
Circuit Tracing은 LLM이 생각한 문장을 읽는가
아니다. prompt 하나에서 feature·embedding·error·logit 사이의 local linear attribution을 graph로 만든다. feature label은 activation example, logit effect, 연결을 보고 붙인 인간 가설이다.
clean output이 같으면 graph는 original circuit인가
아니다. clean point에서 activation과 logit은 맞춘다. QK pattern·normalization denominator·error를 고정했으므로 perturbation 시 같은 mechanism인지 별도 intervention으로 검증해야 한다.
edge가 크면 그 feature가 유일한 원인인가
아니다. graph에는 병렬 path와 error node가 있다. pruning은 영향이 작아 보이는 path를 제거한다. 크다는 것은 선택한 local metric에서 강하다는 뜻이다.
error node를 제거하면 해석이 좋아지는가
아니다. 그림은 단순해지지만 CLT가 못 설명한 계산을 숨긴다. error가 핵심이면 graph가 답하지 못한다고 결론 내리는 편이 정확하다.
이전 SAE 글과 이 논문의 연결은 무엇인가
SAE/CLT는 “어떤 feature 후보가 있는가”를 만든다. Circuit Tracing은 “이 prompt에서 어느 source가 어느 target feature를 거쳐 logit에 영향을 주었는가”를 edge와 path로 묻는다. feature 발견과 path 검증은 서로 대체하지 않는다.
다음에 읽을 논문은 무엇인가
다음은 Verbalizable Representations Form a Global Workspace in Language Models다. 이 논문이 CLT feature와 attribution graph로 prompt별 계산을 추적했다면, 다음 글은 Jacobian lens를 써서 model 안에서 verbal report·deliberate control·reasoning에 넓게 쓰이는 representation을 어떻게 찾으려 했는지 다룬다. Circuit Tracing의 local faithfulness·QK 누락 한계를 안 채로 global workspace 주장을 읽으면 과장하기 쉽다.
출처 및 검증 경로
1차 자료
- Ameisen 외. Circuit Tracing Revealing Computational Graphs in Language Models, Transformer Circuits Thread, 2025-03-27 — Introduction, §§2–5, §7, Appendix D–F·R을 직접 확인했다. CLT 식, local replacement, edge·Jacobian, pruning, metric, limitation, compute 추정의 원전이다.
- Anthropic. Open-sourcing circuit tracing tools, 2025-05-29 — open-weight model에서 graph 생성·visualization·intervention을 지원하는 공개 도구의 범위를 확인했다.
safety-research/circuit-tracer,8f1e2438, 확인일 2026-07-24 —attribute.py,Graph·pruning,CLT를 직접 읽어 원문의 구현 대응을 확인했다.
직접 실행 기록
- 환경 — macOS 26.4.1, Python 3.9.6, 표준 라이브러리만 사용.
- 명령 —
python3 /tmp/circuit-tracing-research/verify_circuit_tracing_toy.py. - 관찰 — layer 0 feature가 layer 0·1 reconstruction에 함께 쓰였고,
reconstruction + error는 clean original output과 일치했다. unsigned path influence는 input·feature·error의 multi-hop 기여를 분리했다. frozen-error local model은 finite perturbation에서 original ReLU model과0.0 / 1.4로 달라졌다. - 경계 — 이 실행은 논문 수식과 limitation의 toy 산술 검증이다. Torch/GPU, public transcoder, 18L·Claude 3.5 Haiku, feature label, paper benchmark,
0.72correlation을 재현하지 않는다.
보조 해석
- RAG 운영 trace, authorization control, artifact versioning의 비교는 원문의 local-faithfulness·error-node 한계를 바탕으로 한 필자의 시스템 설계 해석이다. 원문이 production safety control 또는 RAG debugging 절차를 제안했다고 주장하지 않는다.
댓글