LLM의 Context Blindness

박종영

LLM의 Context Blindness: 해결책은 더 많은 AI 호출이 아니라 '구조'다

AI를 활용한 제조 혁신 프로젝트를 진행하다 보면, 늘 마주치는 문제가 있습니다. "왜 AI는 내가 준 긴 문서의 중요한 부분을 놓칠까?" 바로 Context Blindness(컨텍스트 실명) 문제입니다.

많은 개발자들이 이 문제를 해결하기 위해 LLM을 여러 번 호출하거나, 더 큰 컨텍스트 윈도우를 가진 모델을 사용합니다. 하지만 오늘 소개할 글은 이런 접근이 근본적인 해결책이 아니라고 말합니다.

진짜 해결책은 '구조(Structure)' 에 있습니다.


Context Blindness란 무엇인가?

Context Blindness는 LLM이 긴 컨텍스트를 처리할 때 중요한 정보를 놓치는 현상입니다. 특히 "Lost in the Middle(중간에서 길을 잃다)" 현상으로 알려진, 컨텍스트 중간 부분의 정보를 간과하는 경향이 있습니다.

실제 사례

제조 현장에서 이런 상황을 생각해보세요:

[설계 사양서] + [공정 데이터] + [품질 검사 기록] + [불량 이력] + [작업 지시서]

이 모든 문서를 한번에 LLM에 입력하고 "불량의 근본 원인을 찾아줘"라고 요청하면, LLM은 앞부분의 설계 사양서와 뒷부분의 작업 지시서는 잘 참조하지만, 정작 중요한 중간의 품질 검사 기록을 놓칠 수 있습니다.
이것은 단순히 토큰 제한의 문제가 아닙니다. 정보를 처리하고 우선순위를 매기는 LLM의 구조적 한계입니다.

 

흔한 오해: 더 많은 호출, 더 큰 윈도우?

많은 개발자들이 선택하는 해결책:

  1. LLM을 여러 번 호출하기 → 비용 증가, 일관성 문제
  2. RAG 시스템 구축 → 검색 품질에 의존, 여전히 긴 컨텍스트 문제
  3. 더 큰 컨텍스트 윈도우 모델 → 비용 폭증, 근본 문제 미해결

이런 접근들은 증상을 완화할 뿐, 근본 원인을 해결하지 못합니다.


진짜 해결책: 구조적 사고

핵심 원칙은 간단합니다:

"LLM에게 생각을 강제하지 말고, 구조를 제공하라"

LLM이 한번에 모든 것을 처리하게 하는 대신, 명확한 단계와 구조를 제공하여 각 단계에서 집중할 수 있게 만드는 것입니다.

방법 1: 청크 분할 + 병합 (Chunking + Merging)

개념:

큰 데이터 → 관리 가능한 청크로 분할 → 각각 독립 처리 → 결과 병합

 

제조 현장 적용 예시:
대량의 용접 검사 데이터를 분석한다고 가정해봅시다.

# 기존 방식 (문제 발생)
전체_검사데이터 = load_all_inspection_data()  # 10,000건
결과 = llm.analyze(전체_검사데이터, "불량 패턴을 찾아줘")

# 구조적 방식 (해결)
청크_크기 = 500
청크들 = split_into_chunks(전체_검사데이터, 청크_크기)

청크별_분석 = []
for 청크 in 청크들:
    패턴 = llm.analyze(청크, "이 검사 데이터에서 불량 패턴을 추출해줘")
    청크별_분석.append(패턴)

최종_결과 = llm.synthesize(청크별_분석, "모든 패턴을 통합하여 주요 불량 원인을 도출해줘")
```

**장점:**
- 각 청크는 LLM이 충분히 집중할 수 있는 크기
- 병렬 처리 가능
- 중간 결과 검증 가능

### 방법 2: 계층적 처리 (Hierarchical Processing)

**개념:**
```
상세 데이터 → 요약 생성 → 계층적 구조 구축 → 필요시 드릴다운

 

제조 현장 적용 예시:
공정 전체의 데이터를 분석할 때:

# 1단계: 상세 데이터를 요약으로 변환
공정1_상세 = load_process_data("절단")
공정1_요약 = llm.summarize(공정1_상세, "핵심 지표만 추출")

공정2_상세 = load_process_data("용접")
공정2_요약 = llm.summarize(공정2_상세, "핵심 지표만 추출")

공정3_상세 = load_process_data("조립")
공정3_요약 = llm.summarize(공정3_상세, "핵심 지표만 추출")

# 2단계: 요약된 정보로 전체 분석
전체_요약 = {
    "절단": 공정1_요약,
    "용접": 공정2_요약,
    "조립": 공정3_요약
}

문제_공정 = llm.analyze(전체_요약, "어느 공정에 문제가 있는가?")

# 3단계: 필요시 해당 공정의 상세 데이터로 드릴다운
if 문제_공정 == "용접":
    상세_원인 = llm.deep_analyze(공정2_상세, "용접 공정의 구체적인 문제점 분석")
```

**장점:**
- 정보의 계층적 조직화
- 필요한 깊이까지만 탐색
- 전체 맥락 유지하면서 세부 사항 파악

### 방법 3: 명시적 검색 단계 (Explicit Retrieval Step)

**개념:**
```
1단계: 관련 정보 검색 및 식별
2단계: 검색된 정보로 실제 작업 수행

 

제조 현장 적용 예시:
설계 변경 이력과 품질 데이터가 섞여 있는 방대한 문서에서 특정 불량 원인을 찾을 때:

# 1단계: 명시적 검색
검색_쿼리 = "용접 강도 저하 관련 문서"
관련_문서들 = llm.search(전체_문서_DB, 
    f"""
    다음 기준으로 관련 문서를 찾아줘:
    1. 용접 강도 관련 품질 데이터
    2. 용접 파라미터 변경 이력
    3. 용접 불량 보고서
    
    각 문서의 관련도를 0-10 점수로 평가하고,
    7점 이상만 반환해줘.
    """)

# 2단계: 검색된 정보로 분석
원인_분석 = llm.analyze(관련_문서들,
    """
    검색된 문서들을 바탕으로:
    1. 용접 강도 저하의 시점을 특정해줘
    2. 해당 시점의 변경 사항을 찾아줘
    3. 인과관계를 분석해줘
    """)

장점:

  • 검색과 처리의 명확한 분리
  • 각 단계에서 집중도 향상
  • 중간 결과 검증 가능

실무 적용 가이드

언제 구조화가 필요한가?

다음 상황에서는 반드시 구조적 접근을 고려하세요:

긴 문서 분석

  • 수백 페이지의 기술 문서
  • 다년간의 생산 이력 데이터
  • 복합적인 품질 보고서

다중 소스 데이터 통합

  • MES + ERP + 품질 시스템 데이터 통합
  • 설계 정보 + 생산 실적 + 불량 이력 결합
  • 여러 공장의 데이터 비교 분석

복잡한 의사결정 프로세스

  • 근본 원인 분석 (RCA)
  • 공정 최적화 파라미터 도출
  • 예측 모델링

세밀한 정보 추출

  • 특정 규격 준수 여부 검증
  • 특정 조건을 만족하는 사례 추출
  • 암묵지의 형식지 변환

구현 시 핵심 팁

1. 프롬프트에 명확한 단계 명시

# 나쁜 예
prompt = "이 데이터를 분석해서 문제를 찾아줘"

# 좋은 예
prompt = """
다음 단계로 분석해줘:
1단계: 데이터에서 이상치를 식별 (기준: 3σ 벗어난 값)
2단계: 식별된 이상치의 발생 시점을 기록
3단계: 해당 시점의 공정 조건을 추출
4단계: 이상치와 공정 조건의 상관관계 분석
"""

 

2. 중간 결과물 저장 및 검증

결과들 = {}

# 각 단계의 결과를 저장
결과들['이상치'] = llm.find_outliers(데이터)
save_to_file(결과들['이상치'], 'step1_outliers.json')

결과들['시점'] = llm.find_timestamps(결과들['이상치'])
save_to_file(결과들['시점'], 'step2_timestamps.json')

# 중간 검증
if not validate(결과들['시점']):
    alert("2단계 결과 검증 실패")
    
결과들['공정조건'] = llm.extract_conditions(결과들['시점'])
save_to_file(결과들['공정조건'], 'step3_conditions.json')

 

3. 각 단계의 출력을 다음 단계의 명확한 입력으로 연결

class 분석파이프라인:
    def __init__(self):
        self.단계별_결과 = {}
    
    def 단계1_데이터수집(self, 조건):
        """명확한 입력: 조건 / 명확한 출력: 수집된 데이터"""
        데이터 = self.데이터소스.query(조건)
        self.단계별_결과['수집데이터'] = 데이터
        return 데이터
    
    def 단계2_전처리(self):
        """명확한 입력: 단계1의 수집데이터 / 명확한 출력: 정제된 데이터"""
        원본 = self.단계별_결과['수집데이터']
        정제됨 = self.전처리기.clean(원본)
        self.단계별_결과['정제데이터'] = 정제됨
        return 정제됨
    
    def 단계3_분석(self):
        """명확한 입력: 단계2의 정제데이터 / 명확한 출력: 분석 결과"""
        입력 = self.단계별_결과['정제데이터']
        결과 = llm.analyze(입력)
        self.단계별_결과['분석결과'] = 결과
        return 결과

 

제조 AI 프로젝트에 주는 시사점

제가 진행하는 SmartON AI Knowledge Fusion Pipeline 프로젝트에서 이 구조적 접근은 특히 중요합니다.

1. 제조 데이터 처리의 구조화

설계 → 생산 → 품질 → 서비스의 전 생명주기 데이터를 처리할 때:

# 기존 방식 (Context Blindness 발생)
모든_데이터 = {
    "설계": 설계_사양서,
    "생산": 작업_지시서 + 실적_데이터,
    "품질": 검사_데이터 + 불량_이력,
    "서비스": AS_이력 + 고객_피드백
}
분석 = llm.analyze(모든_데이터, "불량 원인 찾기")

# 구조적 방식
파이프라인 = 제조분석파이프라인()

# 1단계: 각 영역별 요약
설계_인사이트 = 파이프라인.분석_설계(설계_사양서)
생산_인사이트 = 파이프라인.분석_생산(작업_지시서, 실적_데이터)
품질_인사이트 = 파이프라인.분석_품질(검사_데이터, 불량_이력)
서비스_인사이트 = 파이프라인.분석_서비스(AS_이력, 고객_피드백)

# 2단계: 인사이트 통합
통합_분석 = 파이프라인.통합_분석({
    "설계": 설계_인사이트,
    "생산": 생산_인사이트,
    "품질": 품질_인사이트,
    "서비스": 서비스_인사이트
})

# 3단계: 필요시 드릴다운
if 통합_분석.문제영역 == "생산":
    상세_원인 = 파이프라인.상세_분석_생산(작업_지시서, 실적_데이터)

 

2. 암묵지 → 형식지 변환의 계층화

숙련 작업자의 지식을 온톨로지로 변환할 때:

# 계층 1: 작업자 인터뷰 → 핵심 키워드 추출
인터뷰_텍스트 = "용접할 때는 모재 온도를 손으로 확인하고..."
키워드들 = llm.extract_keywords(인터뷰_텍스트)
# 결과: ["모재온도", "손감지", "예열", ...]

# 계층 2: 키워드 → 개념 그룹핑
개념_그룹 = llm.group_concepts(키워드들)
# 결과: {"온도관리": [...], "품질검증": [...], ...}

# 계층 3: 개념 → 온톨로지 관계 정의
온톨로지 = llm.build_ontology(개념_그룹)
# 결과: OWL/RDF 구조

# 계층 4: 온톨로지 → 규칙 생성
규칙들 = llm.generate_rules(온톨로지)
# 결과: IF-THEN 규칙들

 

3. MES 데이터 통합의 명시적 검색

여러 소스의 제조 데이터를 통합할 때:

# 1단계: 관련 데이터 명시적 검색
검색결과 = {
    "작업지시": llm.search(MES_DB, "작업지시번호 W20240213-001 관련 모든 데이터"),
    "설비이력": llm.search(설비관리시스템, "W20240213-001 기간 중 사용 설비"),
    "품질데이터": llm.search(품질시스템, "W20240213-001 검사 결과"),
    "자재정보": llm.search(자재시스템, "W20240213-001 투입 자재 로트")
}

# 2단계: 검색된 데이터로 분석
통합_분석 = llm.analyze_integrated(검색결과, 
    """
    작업지시 W20240213-001의 품질 이슈를 분석하되:
    1. 설비 이상 여부
    2. 자재 품질 이슈
    3. 공정 파라미터 일탈
    순으로 확인
    """)

 

실전 체크리스트

다음번 LLM 프로젝트를 시작할 때 이 체크리스트를 활용하세요:

설계 단계

  •  전체 프로세스를 명확한 단계로 분해했는가?
  •  각 단계의 입력과 출력이 명확한가?
  •  단계 간 의존성이 정리되었는가?

구현 단계

  •  한 번의 LLM 호출이 처리하는 데이터 양이 적절한가?
  •  중간 결과물을 저장하고 검증하는가?
  •  각 단계가 독립적으로 테스트 가능한가?

최적화 단계

  •  병렬 처리 가능한 부분이 있는가?
  •  캐싱으로 중복 호출을 줄일 수 있는가?
  •  계층 구조를 활용해 불필요한 처리를 생략할 수 있는가?

결론

LLM의 Context Blindness 문제는 단순히 기술적 한계가 아닙니다. 우리가 정보를 조직하고 제공하는 방식의 문제입니다.

더 많은 LLM 호출, 더 큰 컨텍스트 윈도우는 비용만 증가시킬 뿐입니다. 진짜 해결책은:

  1. 청크 분할 + 병합: 큰 문제를 작은 조각으로
  2. 계층적 처리: 정보를 레벨별로 조직화
  3. 명시적 검색: 찾기와 처리를 분리

이 세 가지 구조적 접근을 활용하면, LLM이 훨씬 더 정확하고 효율적으로 작동합니다.

기억하세요: LLM에게 생각을 강제하지 말고, 구조를 제공하세요.


이 글이 도움이 되었다면, 여러분의 프로젝트에서 어떻게 구조적 접근을 적용했는지 댓글로 공유해주세요. 함께 배우고 성장합시다!

기업 홍보를 위한 확실한 방법
협회 홈페이지에 회사정보를 보강해 보세요.