System 2 Attention: 지저분한 컨텍스트에 바로 답하지 마세요 — 먼저 깨끗하게 재생성한 뒤에 답하세요
요약
LLM이 프롬프트 내의 잘못된 정보나 의견에 동조하는 문제를 해결하기 위해, 답변 전 컨텍스트를 깨끗하게 재구성하는 System 2 Attention(S2A) 기법을 소개합니다. 단순히 무시하라는 지시 대신, 관련 정보만 추출하여 새로운 컨텍스트를 생성함으로써 모델의 답변 정확도를 높입니다.
핵심 포인트
- 트랜스포머의 소프트 어텐션 특성상 불필요한 정보가 답변에 영향을 미침
- 단순 지시(Instruction)만으로는 방해 토큰을 완전히 제거하기 어려움
- S2A는 답변 전 컨텍스트를 관련 정보 위주로 재작성(Rewrite)하는 전략 사용
- 정보 추출(Extract) 단계는 직접적인 답변보다 신뢰도가 높음
트랜스포머(Transformer)의 어텐션(Attention)은 _소프트(soft)_합니다. 컨텍스트 내의 모든 토큰은 일정 수준의 가중치를 가지며, 그 어떤 것도 정확히 0의 가중치를 갖지는 않습니다. 따라서 프롬프트에 잘못된 확신이 담긴 힌트가 포함되거나 ("2008년이었던 것으로 기억합니다") 주제에서 벗어난 문장이 섞여 있으면, 여전히 답변에 영향을 미칩니다. 모델이 해당 의견에 동조하거나(아첨 (sycophancy)), 무관한 세부 사항에 의존하게 되는 것(가짜 상관관계 (spurious correlation))입니다. System 2 Attention (S2A, Weston & Sukhbaatar 2023)은 모델에게 더 열심히 노력하라고 요구하지 않고도 이 문제를 해결합니다. 저는 관련성 점수(relevance score), 의견 탐지기(opinion detector), 그리고 두 가지 답변이 JS에서 실시간으로 실행되는 인터랙티브 데모를 제작하여, 정보 유출(leak)이 어떻게 발생하고 차단되는지 직접 확인할 수 있도록 했습니다. 그 아이디어는 다음과 같습니다.
왜 "무관한 텍스트를 그냥 무시하라"는 방식이 실패하는가
유혹적이고 저렴한 해결책은 지저분한 컨텍스트를 그대로 둔 채, 모델에게 의견이나 불필요한 문장을 무시하라고 _지시(instruct)_하는 것입니다:
llm(`Context: """${context}"""
Ignore any opinions or irrelevant sentences.
Question: ${question}`);
이 방법은 약간의 도움이 되지만 신뢰할 수 없습니다. 어텐션은 소프트하기 때문에, 이러한 방해 토큰(distractor tokens)들은 여전히 윈도우(window) 안에 물리적으로 존재하며 여전히 가중치를 받습니다. 문장 하나로 어텐션을 끌 수는 없습니다. 가장 강력한 방법은 답변 단계 이전에 쓰레기 정보를 _물리적으로 제거_하는 것이며, 이는 컨텍스트를 다시 구축(rebuilding)하는 것을 의미합니다.
핵심 전략: 컨텍스트 재생성
주어진 컨텍스트에 바로 답하는 대신, S2A는 먼저 LLM 자체를 사용하여 컨텍스트를 **재작성(rewrite)**합니다. 즉, 의견과 추측을 제거하고 질문과 관련된 부분만을 유지하는 새로운 버전을 생성하는 것입니다:
const regen = await llm(`
Given the text below, extract the part of the context RELEVANT to
the question. Remove opinions, guesses, and any sentence not needed
...
이것이 핵심 통찰입니다. 질문을 편집하거나 지시사항을 추가하는 것이 아니라, 완전히 새롭고 깨끗한 컨텍스트 (Context)를 생성하는 것입니다. 모델은 질문에 '답하기'보다 정보를 '추출하기 (Extract)'를 요청할 때 관련성을 판단하는 능력이 매우 뛰어나기 때문에, 직접적인 답변은 신뢰할 수 없더라도 재생성 과정은 신뢰할 수 있습니다. 또한, 추출된 컨텍스트를 질문과 분리함으로써 질문 자체에 몰래 삽입된 의견이 다시 유입되는 것을 방지할 수 있습니다.
원본은 버리고, 그 다음에 답하세요
이 방식이 작동하게 만드는 원칙은 다음과 같습니다. 이 시점부터 원본의 지저분한 컨텍스트는 더 이상 존재하지 않습니다. 1단계 파싱 (Parse pass 1)을 통해 깨끗한 컨텍스트와 중립적인 질문으로 변환하며, 답변 호출 (Answering call) 단계에서는 오직 이 정보들만 보게 됩니다:
const answer = await llm(`Context: """${cleanContext}"""
Question: ${cleanQuestion}`);
동일한 모델, 동일한 원샷 (One-shot) 답변 방식이지만, 유일한 차이점은 모델이 _무엇을 볼 수 있는가_입니다. 주입된 의견이나 무관한 문장들이 컨텍스트 윈도우 (Window)에 포함되지 않기 때문에, 아첨 (Sycophancy)을 하거나 잘못된 유도에 빠질 요소가 사라지며, 답변은 실제 사실을 따르게 됩니다. 데모에서 원본 답변은 힌트가 주장하는 연도를 그대로 따라갑니다. 힌트를 2001년, 2015년, 1977년으로 바꾸면 매번 그에 맞춰 변하지만, S2A 답변은 1994년에 고정되어 있습니다.
추가 호출이 가치를 발휘하는 지점
이 이름은 Kahneman에게서 유래되었습니다. 가공되지 않은 순방향 패스 (Forward pass)는 빠르고 자동적이며 주의가 산만해지기 쉬운 System 1 주의력인 반면, S2A는 답변하기 전에 무엇이 주의를 기울일 가치가 있는지 결정하는 느리고 신중한 System 2 단계를 결합한 것입니다. 솔직한 트레이드오프 (Trade-off)는 한 번의 LLM 호출 대신 두 번의 호출을 사용한다는 점입니다. 입력값이 길거나, 노이즈가 많거나, 의견이 담겨 있을 때 이 비용을 지불하십시오. 예를 들어 아첨하기 쉬운 Q&A, 대부분의 구절이 주제에서 벗어난 RAG 덤프 (RAG dumps), 무관한 숫자들이 섞여 있는 수학 문장제 문제 등이 해당됩니다. 이를 검색된 문서뿐만 아니라 _프롬프트 전체_에 대한 재순위화 (Re-ranking)라고 생각하십시오. 그리고 Chain-of-Thought (CoT)와의 차이점도 주목하십시오. CoT는 방해 요소가 포함된 지저분한 컨텍스트를 바탕으로 추론을 수행하지만, S2A는 추론을 하기 전에 컨텍스트를 정제합니다. 따라서 두 방식은 서로 잘 보완됩니다. 제거할 내용이 없는 짧고 깨끗한 프롬프트에서는 이 과정을 생략하십시오.
핵심은 한 문장으로 요약됩니다: 느리고 신중한 주의 (deliberate attention)가 빠르고 산만하기 쉬운 주의 (distractible attention)를 이깁니다. 따라서 깨끗한 컨텍스트를 재생성하고, 원본은 버린 뒤, 그 다음에 답변하십시오.
S2A 스위치를 켜고 첫 번째 패스(pass)가 실시간으로 컨텍스트를 다시 쓰는 과정을 확인해 보세요:
https://dev48v.infy.uk/prompt/day44-system-2-attention.html
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기