LLM의 대안을 만들 수 있을까? 8개월, 약 200번의 실패한 실험, 그리고 하나의 벽 (Part 2)
요약
LLM의 대안으로 비신경망 및 CPU 전용 시스템을 구축하려는 8개월간의 연구 기록입니다. 단순한 메모리 저장을 넘어, 경험을 통해 행동을 변화시키고 지식으로 전이될 수 있는 기질(Substrate)을 찾는 과정에서의 한계를 다룹니다.
핵심 포인트
- 단순 메모리 저장은 지식(Knowledge)이 될 수 없음
- 경험을 통해 행동을 변화시키는 전이 가능한 인과적 전이의 중요성
- 비신경망 기반의 지식 기질 구축 시도와 실패 원인 분석
- 메모리와 가중치 사이의 경계를 찾는 연구적 접근
이 글은 거대 언어 모델 (LLM)과 인접하면서도 어떤 면에서는 대안이 될 수 있는 무언가를 구축하려는 시도를 기록한 연구 시리즈의 파트 2입니다. 파트 1: "나의 합성 평가(Synthetic Eval)는 30/30이라고 했지만, LoCoMo는 0.13이라고 했다." 살아남은 코드는 AuraSDK에 있습니다.
챗봇 래퍼 (Chatbot wrapper)가 아닙니다.
또 다른 프롬프트 스택 (Prompt stack)도 아닙니다.
더 나은 UI를 가진 벡터 데이터베이스 (Vector database)도 아닙니다.
질문은 더 좁고 위험했습니다:
비신경망 (Non-neural), CPU 전용 시스템이 LLM을 재학습시키지 않고도 경험을 축적하고, 내부 상태를 변이시키며, 미래의 행동을 개선할 수 있는가?
8개월이 지난 지금, 솔직한 대답은 "예"가 아닙니다.
솔직한 대답은 다음과 같습니다:
일부 메커니즘은 살아남았고,
대부분의 캐리어 (Carriers)는 실패했으며,
벽은 명확해졌습니다.
벽은 저장 공간이 아닙니다. 저장은 쉽습니다.
벽은 전이 가능한 인과적 전이 (Transferable causal transition)입니다:
조건 -> 행동 -> 결과 -> 적용하지 말아야 할 때
그것이 제가 계속해서 보존하는 데 실패했던 것입니다.
1. "LLM의 대안"이라는 말의 의미
이 문구는 너무 광범위하므로 범위를 좁힐 필요가 있습니다.
저는 새로운 프런티어 모델 (Frontier model)을 만들려고 했던 것이 아닙니다. 트랜스포머 (Transformer)를 처음부터 학습시키려던 것도 아니었습니다. 언어 능력 면에서 GPT급 모델을 이기려 했던 것도 아닙니다.
목표는 더 작았습니다:
작고 변이 가능한 가중치 (Weights) 세트처럼 작동하는 지식 기질 (Knowledge substrate)을 찾는 것.
필요한 속성은 다음과 같았습니다:
- 경험 후에 변화할 것;
- 재시작 후에도 유지될 것;
- 코드 변경 없이 미래의 행동을 변화시킬 것;
- 보지 못한 유사한 사례로 전이될 것;
- 신호가 가짜라면 셔플/널(shuffled/null) 대조군에서 실패할 것;
- 단순히 압축된 바이트가 아니라 행동적 의미에서 컴팩트할 것;
- 지원되지 않는 경우 확신을 가지고 추측하는 대신 기권할 것.
다시 말해, 저는 메모리 (Memory)와 가중치 (Weights) 사이의 무언가를 찾고 있었습니다.
메모리는 일어난 일을 저장합니다.
가중치는 다음에 일어날 일을 변화시킵니다.
이 실험은 그 경계를 넘을 수 있는 기호적 (Symbolic) 또는 하이브리드 (Hybrid) 기질을 찾는 것이었습니다.
2. 왜 일반적인 메모리로는 충분하지 않았는가
가장 유혹적인 첫 번째 답변은 언제나 메모리입니다:
- 대화 내용을 추가(append)하기;
- 요약(summarize)하기;
- 사실(facts)을 저장하기;
- 관련 청크(chunks)를 검색(retrieve)하기;
- 그래프(graph)를 구축하기;
- 임베딩(embeddings) 추가하기;
- 점수(scores) 추가하기;
- 타입이 지정된 엣지(typed edges) 추가하기.
이 모든 것들은 유용한 엔지니어링 도구들입니다. 하지만 그 중 어느 것도 자동으로 지식(knowledge)이 되지는 않습니다.
그 차이는 냉혹했습니다:
저장(storage)은 사건을 보존할 수 있지만;
지식(knowledge)은 다음 행동을 변화시켜야 합니다.
로그(log)는 다음과 같이 말할 수 있습니다:
후보 A는 상황 X에서 실패했다
후보 B는 상황 X에서 성공했다
하지만 유용한 시스템은 그 이상의 것을 수행해야 합니다:
새로운 상황 X'에서,
X와 공유되는 요소를 인식하고,
A와 유사한 행동을 피하며,
...
마지막 이 지점에서 대부분의 설계가 실패했습니다.
3. 캐리어(Carrier) 비교 테스트
나는 지식의 여러 후보 "캐리어(carriers)"를 테스트했습니다. 캐리어란 경험을 보유하고 이를 재사용 가능하게 만드는 내부 형태를 의미합니다.
초기 목록은 합리적으로 보였습니다:
| 캐리어 | 보존한 것 | 실패한 지점 |
|---|---|---|
| 추가 전용 메모리 (append-only memory) | 이벤트 이력 (event history) | 보지 못한 사례로 전이되지 않음 |
| ... |
패턴은 일관적이었습니다.
각 캐리어는 결과의 한 가지 측면만을 보존했습니다:
- 무언가가 지지되었다는 사실;
- 무언가가 반박되었다는 사실;
- 선택에 압박(pressure)이 있었다는 사실;
- 두 역할이 연관되어 있다는 사실;
- 수치적 방향이 변했다는 사실;
- 국소적 충돌(local conflict)이 존재했다는 사실;
- 상태 전이(state transition)가 특정 형태를 가졌다는 사실.
하지만 초기 캐리어 중 그 어떤 것도 완전한 인과적 전이(causal transition)를 보존하지 못했습니다.
그것은 다음과 같은 차이입니다:
"A는 B 근처에서 좋았다"
그리고 다음과 같은 차이입니다:
"입력이 속성 P를 가지고 상태가 조건 C를 가질 때,
행동 A는 경계 조건 B가 활성화되지 않는 한,
상태 S를 방향 D로 변화시킨다."
두 번째 형태가 지식에 훨씬 더 가깝습니다.
또한, 이를 수행할 수 있는 모델을 이미 가지고 있지 않다면, 두 번째 형태를 습득하는 것은 훨씬 더 어렵습니다.
4. 실재했지만 충분하지 않았던 신호들
일부 결과는 단순한 의미에서의 실패가 아니었습니다. 그것들은 실재하는 신호(signals)였습니다.
하나의 경로 상태(route-state) 실험은 코드를 변경하지 않고도 내부 상태(internal state)가 동작을 변화시킬 수 있음을 증명했습니다. 시스템은 지지와 반박을 인지하고, 자신의 상태를 변이(mutate)시켰으며, 이후에 다른 선택을 내렸습니다. 셔플된 상태(shuffled-state)의 대조군은 실패했습니다. 이 점이 중요했습니다.
하지만 이것이 가중치(weights)를 대체할 수 있음을 증명한 것은 아니었습니다. 그것은 좁은 범위의 상징적 상태(symbolic state)가 선택에 영향을 미칠 수 있음을 증명했을 뿐입니다.
또 다른 실험에서는 단계적 결과 벡터(graded consequence vectors)를 사용했습니다. 이 벡터는 경사 하강법 기반의 훈련(gradient training)이 아니라 경험에 의해 업데이트되었습니다. 이는 다음과 같은 유용한 특성들을 보여주었습니다:
동일한 방향, 더 많은 지지 -> 더 큰 크기(magnitude)
50% 공유된 경험 -> 유사도 ~0.41
0% 공유된 경험 -> 유사도 ~0.05 (차이 0.35)
...
중요한 세부 사항은 다음과 같습니다. 부분적으로 공유된 경험에서 나타난 0.41(1.0이 아닌)이라는 수치는 암기(memorization)와 대조되는, 실제 일반화(generalization)가 나타나는 모습 그 자체였습니다. 유사성은 구조로부터 발생하며, 하드코딩된 것이 아닙니다. 이 또한 실재하는 신호였습니다.
하지만 그것만으로는 충분하지 않았습니다. 그것은 압력(pressure)과 유사성을 전달했을 뿐, 전이가 '언제' 발생해야 하는지에 대한 실행 가능한 규칙(executable rule)을 전달하지는 못했습니다.
이 결과들에 대한 가장 정직한 라벨은 다음과 같습니다:
해결책이 아닌, 신호(SIGNAL, not solution).
이러한 구분이 수개월간의 자기기만을 막아주었습니다.
5. "기권(Abstain)"의 교훈
가장 유용한 발견 중 하나는 부정적인 것이었습니다:
약한 지식 전달체(knowledge carrier)는 추측하는 대신 기권해야 한다.
여러 게이트(gates)에서, 시스템은 근접한 알려진 패턴으로 강제되는 대신 지원되지 않는 사례에 대해 "모릅니다"라고 답할 때 성능이 향상되었습니다.
이것이 중요한 이유는 많은 메모리 시스템들이 항상 답변을 내놓기 때문에 좋아 보일 뿐이기 때문입니다. 하지만 인과적 시스템(causal system)에서는 잘못된 전이가 침묵보다 더 해롭습니다.
만약 저장된 패턴이 다음과 같이 말한다면:
이 동작은 이전 사례를 복구했다
그리고 새로운 사례가 유사해 보이지만 경계 조건(boundary condition)이 다르다면, 해당 동작을 재사용하는 것은 능동적으로 해로울 수 있습니다.
실질적인 요구 사항은 다음과 같이 바뀌었습니다:
지원이 가능할 때 전이할 것;
결합(binding)이 정당화되지 않을 때는 기권할 것;
약한 유사성을 결코 확신으로 전환하지 말 것.
이 지점이 바로 많은 메모리 아키텍처 (memory architectures)가 조용히 실패하는 지점입니다. 모델은 무언가를 검색(retrieve)하고, 그것을 사용합니다. 답변은 근거가 있는 것처럼 보입니다. 하지만 과거의 증거와 새로운 상황 사이의 결합 (binding)이 유효하지 않을 수 있습니다.
6. 실행 가능한 세계 (Executable Worlds)가 실패를 더 선명하게 만들었다
합성 게이트 (Synthetic gates)는 유용하지만 위험합니다. 만약 당신이 세계를 설계한다면, 의도치 않게 성공을 설계할 수도 있기 때문입니다.
따라서 테스트의 일부는 작은 실행 가능한 세계 (executable worlds)로 이동했습니다: 코드 스니펫 (code snippets), 통제된 버그 (controlled bugs), 컴파일러 피드백 (compiler feedback), 복구 시도 (repair attempts), 그리고 실제 통과/실패 결과 (pass/fail consequences) 등이 포함되었습니다.
결과는 더 선명해졌습니다.
지역적 수치 흔적 (local numeric footprint)은 실제 경험된 결과 패턴 (lived consequence pattern)의 일부를 전이할 수 있었습니다. 변화가 선형적 복구 (linear repair)에 가까울 때는 작동했습니다:
이 값을 증가시킬 것;
이 수치적 경계 (numeric boundary)를 변경할 것;
이 지역적 잔차 (local residual)를 저 지역적 패치 (local patch)에 매핑할 것.
하지만 실제 메커니즘 (mechanism)이 필요한 사례에서는 실패했습니다:
비트 시프트 의미론 (bit-shift semantics);
분기 동작 (branch behavior);
경계 조건 (boundary conditions);
...
이것이 중요했습니다. 생성된 선형 복구 게이트를 통과했다는 것이 시스템이 코드를 학습했다는 것을 의미하지는 않습니다. 그것은 캐리어 (carrier)가 지역적 수치 방향 (local numeric direction)을 재사용할 수 있음을 의미할 뿐입니다.
기준은 더 엄격해졌습니다:
캐리어는 혼합된 비선형 실행 가능 스니펫 (mixed nonlinear executable snippets)에서 살아남아야 함:
- 수치적 델타 (numeric delta);
...
만약 지역적-선형 복구 (local-linear repair)만 통과한다면, 그것은 보조 연산자 (helper operator)일 뿐, 핵심 후보 (candidate core)가 아닙니다.
7. 단일 파일 뇌 시도 (The Single-File Brain Attempt)
한 가지 방향이 특히 매력적으로 보였습니다:
학습된 전체 상태 (learned state)가 하나의 가변 파일 (mutable file)에 담겨 있다면 어떨까?
아이디어는 간단했습니다:
- 시스템이 행동한다.
- 세계가 결과 (consequences)를 반환한다.
- 상태 파일 (state file)이 변이 (mutate)한다.
- 재시작 후에도, 파일은 여전히 미래의 행동을 변화시킨다.
이것은 데이터베이스 (database)가 되려던 것이 아니었습니다. 성장하는 행동 기질 (behavioral substrate)이 되려던 것이었습니다.
결과는 엇갈렸습니다:
전이 사이클 (transfer cycle): 3/5
맹목적 베이스라인 (blind baseline): 1/5
오답 (wrong): 1
따라서 파일은 죽은 저장소 (dead storage)가 아니었습니다. 파일은 성장했습니다. 변이했습니다. 경험된 전이 경험 (lived transition experience)의 일부를 전이했습니다. 맹목적 베이스라인을 이겼습니다.
하지만 wrong=1은 개선된 수치보다 더 중요합니다.
시스템은 지원되지 않는 전이(transfer)에 대해 단순히 기권(abstain)한 것이 아니었습니다. 때때로 잘못된 행동을 확신을 가지고 선택하기도 했습니다. 지식 전달자(knowledge carrier)에게 이는 치명적인 실패입니다.
진단 결과는 다음과 같습니다:
경계 전이 셀(bound transition-cells)의 용량은 증가했으나,
충분한 메커니즘을 보존하지 못했다.
이는 반복되는 패턴입니다:
더 많은 구조 != 더 많은 지식
더 풍부한 컨테이너(container)라 할지라도 여전히 잘못된 추상화(abstraction)를 담을 수 있습니다.
8. 벽은 결합 문제(Binding Problem)가 되었다
수많은 전달자(carrier)의 실패를 겪은 후, 질문이 바뀌었습니다.
처음에 저는 이렇게 물었습니다:
어떤 전달자가 지식을 가장 잘 저장하는가?
나중에 더 나은 질문은 이것이었습니다:
새로운 상황이 어떻게 과거의 경험과 결합(bind)되는가?
결합(binding)이 어려운 부분입니다.
시스템이 한 세계에서 유용한 전이(transition)를 학습했다고 가정해 봅시다:
노드 A가 노드 B에 영향을 미침
A를 변경하면 실패 F를 복구함
이제 시스템은 노드 이름이 다르고 표면 형태(surface form)가 다른 새로운 세계를 마주합니다.
어느 노드가 A에 대응할까요?
어느 노드가 B에 대응할까요?
어떤 국소적 구조(local structure)가 동일한 메커니즘이며, 어떤 것이 단지 표면적으로만 유사한 것일까요?
닻(anchor)이 없다면, 이는 그래프 매칭(graph matching) 문제로 변질됩니다. 제가 시도했던 게이트(gate) 중 하나에서는 훈련(train) 세계와 홀드아웃(heldout) 세계 사이의 자율적인 일대일 대응(bijection)을 직접 시도했으나, 바로 이 지점에서 실패했습니다. 대응 관계를 계산하기 위해서는 이미 대응 관계를 알고 있어야 했기 때문입니다. 그것은 그래프 동형성(graph isomorphism) 문제이며, 닻(anchor) 없이는 NP-난해(NP-hard) 문제입니다. 이는 공학적 장애물이 아니라 근본적인 문제입니다.
이로 인해 닻의 삼중 딜레마(anchor trilemma)가 발생했습니다.
9. 닻의 삼중 딜레마 (The Anchor Trilemma)
시도된 모든 해결책은 세 가지 범주 중 하나에 속했습니다.
옵션 1: 닻(anchor)이 주어지는 경우
인간이나 수동으로 작성된 규칙이 시스템에 어떤 부분이 대응하는지 알려준다면, 전이(transfer)는 훨씬 쉬워집니다.
하지만 이 경우 어려운 부분은 학습된 것이 아니라 공급된 것입니다.
이것은 여전히 유용한 공학적 접근일 수 있습니다. 하지만 대안적인 지식 기질(knowledge substrate)은 아닙니다.
옵션 2: 닻(anchor)을 탐색하는 경우
시스템이 가능한 결합(bindings)을 탐색한다면, 때때로 일치하는 항목을 찾을 수 있습니다.
하지만 탐색은 빠르게 폭발합니다. 노드(nodes), 관계(relations), 상태(states), 조건(conditions)이 많아질수록 이 방식의 매력은 떨어집니다.
당신은 저렴한 지식을 구축한 것이 아닙니다. 비용을 조합론적 탐색 (combinatorial search)으로 옮겼을 뿐입니다.
옵션 3: 모델이 닻(anchor)을 학습하는 경우
LLM, 임베딩 모델 (embedding model), 분석기 (analyzer), 또는 세계 탐사 시스템 (world-probing system)이 결합 (binding)을 제공한다면, 시스템은 훨씬 더 잘 작동합니다.
하지만 그렇게 되면 상징적 기질 (symbolic substrate)은 더 이상 핵심 지능의 원천이 아닙니다. 그것은 다른 지능 원천을 둘러싼 메모리, 캐시, 검증기 (verifier), 또는 최적화 도구 (optimizer)가 됩니다.
그것은 좋은 제품이 될 수는 있습니다.
하지만 더 이상 원래의 가설은 아닙니다.
삼자택일 (trilemma):
주어진 닻 (given anchor) -> 학습되지 않음
탐색된 닻 (searched anchor) -> 너무 비싸거나 불안정함
학습된 닻 (learned anchor) -> 모델/교사로부터 독립적이지 않음
이것이 바로 벽이었습니다.
10. 실제로 살아남은 것들
실패한 광범위한 주장은 다음과 같았습니다:
상징적 운반체 (symbolic carrier)는 충분한 구조적 결과 (structured consequences)를 저장함으로써 대안적인 가중치 (alternative weights)가 될 수 있다.
그 주장은 살아남지 못했습니다.
살아남은 것은 더 좁은 범위였습니다.
1. 결과 루프 (Consequence loops)가 중요하다
시스템은 세계의 피드백을 받을 때만 개선됩니다:
시도 (try) -> 관찰 (observe) -> 변이 (mutate) -> 재시도 (retry)
정적인 문서, 요약, 그래프는 결과 (consequences)와 연결되지 않는 한 취약합니다.
2. 결정론적 가드 (Deterministic guards)가 중요하다
일부 필드는 생성적 (generative)이거나 퍼지한 (fuzzy) 기질에 맡겨져서는 안 됩니다:
- ID;
- 날짜;
- 금액;
- 이름;
- 경로;
- 정확한 제약 조건;
- 상태 변경.
이것들을 추출하여 명시적으로 보존하십시오.
3. 세계의 판사 (World judges)가 중요하다
컴파일러, 테스트, 그리고 실행 가능한 체크 (executable checks)는 내부 점수보다 더 정직했습니다.
그들은 아키텍처가 얼마나 우아한지는 상관하지 않습니다. 그들은 오직 다음을 반환합니다:
통과 (pass) / 실패 (fail)
4. 절제 (Abstention)는 기능이다
항상 전달하려고 하는 취약한 시스템보다, 절제할 줄 아는 취약한 시스템이 더 유용합니다.
5. 일부 기관들은 여전히 가치가 있다
경로-상태 (Route-state), 흉터 (scars), 타입이 지정된 관계 (typed relations), 날짜 가드 (date guards), 추가 전용 메모리 (append-only memory), 저렴한 탐사 (cheap probes), 그리고 실행 가능한 판사 (executable judges)는 쓸모없는 것이 아닙니다.
그것들은 유용한 기관들입니다.
그것들은 완전한 뇌는 아닙니다.
11. 내가 주장하지 않는 것들
나는 LLM (Large Language Models)의 대안을 구축했다고 주장하는 것이 아닙니다.
나는 기호 시스템 (symbolic systems)이 작동할 수 없다고 주장하는 것도 아닙니다.
나는 모든 메모리 시스템 (memory systems)이 쓸모없다고 주장하는 것도 아닙니다.
나는 그 벽이 모든 형태에서 수학적으로 극복 불가능하다고 주장하는 것도 아닙니다.
정직한 주장은 더 좁습니다:
나의 실험에서, 저장된 구조 (stored structure)로서 지식을 보존하려 시도했던 모든 매개체 (carrier)들은 결국 전이 가능한 인과적 결합 (transferable causal binding) 단계에서 실패했습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기