Told by an idiot

Frame Problem

LLM을 딛고 AGI를 내다보는 연구들은 요즘에 어떻게 하면 “상식적인 추론(common-sense reasoning)“을 하게 할까를 많이 고민하는 것 같은데, 나는 여기서 종종 frame problem을 떠올린다. 고전적인 AI 연구에서 frame problem이란 first-order logic으로 AI 또는 로봇이 존재하는 실제 세계를 표현하려고 할 때 필요한 최소한의 공리 집합은 무엇인가, 라는 문제이다. 인간 아기도 배워야 하는 대상영속성(object permanence)를 예로 들어보자. 문을 닫은 결과 방 안에 있는 사람이 더 이상 보이지 않는다고 해서, 그 사람이 존재하지 않는다고 로봇이 자기 주변의 상태를 업데이트한다면 잘못된 일이다. 이렇게 하지 않으려면 대상영속성에 해당하는 공리를 추가해줘야 한다. 그런데 과연 어디까지가 필수적인 공리집합인가? 잘못하면 이 집합의 크기가 무한정 늘어나고 만다1.

원래 이 문제는 1차논리식에 대한 것이지만, 넓은 의미에서 어떤 에이전트가 세상과 문제 없이 상호작용하기 위해 미리 알아야 하는 지식 표상의 한계는 얼마만큼인가, 라는 질문으로 치환하면 common-sense reasoning과 맞닿아있다고 할 수 있겠다. LLM이 이 문제에 있어 가지는 한계는 “공리의 집합"이라는 견고한 지식 표상 대신 언어 발화에 대한 확률 분포만을 가지고 있다는 점, 그리고 논리적 추론은 창발적(emergent)인 속성이라는 점일 것이다. 며칠 전에 본 재미있는 예가 있다. 아래 코드는 온라인에서 찾은 코드리뷰 연습 예제이다.

public static int dayOfYear(int month, int dayOfMonth, int year) {
    if (month == 2) {
        dayOfMonth += 31;
    } else if (month == 3) {
        dayOfMonth += 59;
    } else if (month == 4) {
        dayOfMonth += 90;
    } else if (month == 5) {
        dayOfMonth += 31 + 28 + 31 + 30;
    } else if (month == 6) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31;
    } else if (month == 7) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30;
    } else if (month == 8) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31;
    } else if (month == 9) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
    } else if (month == 10) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
    } else if (month == 11) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
    } else if (month == 12) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 31;
    }
    return dayOfMonth;
}

일부러 엉터리로 만든 거니까, 이 코드에는 여러가지 문제가 있고 Llama3 7B 모델도 다양한 커멘트를 준다. 한데 수업 시간에 예제로 이 코드에 대한 리뷰를 시켰더니 기막힌 답이 나왔다. 이 코드는 유지보수가 힘들다며, *“만약에 나중에 달이 추가되면 어떻게 할 거냐”*라는 것이 아닌가. 저 수많은 분기문과 magic number의 나열을 보면 유지보수가 힘들다는 구조적인 관점은 전적으로 옳다. 하지만 달이 추가된다니? 이것은 1년은 열두달이고, 이 사실은 변하지 않는다는 상식의 결여에서 비롯한 리뷰라고 볼 수 있을 것 같다. 아마 여기서 대화를 이어서 “무슨 말이야, 1년은 열두달이라서 더 이상 추가되지는 않아"라고 답하면 언어모델은 스스로의 실수를 얼른 인정하고 올바른 답을 할 것이다. 하지만 그렇다고 “1년은 열두달"이라는 지식을 습득하는 것은 물론 아니다.

LLM에게 어떤 일을 시켰는데, 이런저런 실수를 하거나 예외적인 상황을 잘 처리하지 못해서 추가적으로 지시를 해야 할 때, 적어도 그 중 일부는 frame problem과 닿아 있을 수 있다. 모든 예외상황을 다 꼼꼼히 일러주려고 하면, 즉 올바른 답이 나올 수 있게 충분한 공리의 집합을 프롬프트에 집어 넣으려고 하면, 문제에 따라 생각보다 쉽지 않다는 사실을 깨닫게 될 것이다. 통계적 언어모델에게 상식을 어떻게 가르칠 것인가 하는 방법론적인 문제와 별도로, “일반적인 상식"의 범위가 어디까지인가는 그 자체로 정말 어려운 문제가 아닐까. 사실 현실 세계 전체에 대한 일반적인 상식은 고사하고, 특정한 문제만 푸는 에이전트를 설계하려고 해도 그 문제에 관련된 상식이 무엇인지 전부 표현하는 것이 쉽지 않다. 혹자는 이런 점에서 앞으로 요구공학의 시대가 돌아올 것이라고 내다본다. 일반적인 상식이란 말하자면 “암묵적인 요구사항(implicit requirement)“이기 때문에 아주 틀린 말은 아니지만, 고정된 기능을 가진 SW를 개발하기 위해 수집하는 요구사항과 자율성을 가진 에이전트가 올바른 행동을 하기 위해 필요한 상식의 범주는 크게 다를 것이고 우리는 아직 frame problem을 완전히 풀지 못했다는 점을 생각해보면 그 자체로 해결책은 아닌 것 같다. 여튼 똑똑한 기계를 만들려면 상식을 갖추는 문제가 반복적으로 제기된다는 패턴에는 매우 흥미로운 무언가가 있다.


  1. 여담이지만 FOL에 국한한 frame problem에 대한 해답으로 위키백과에 separation logic이 등재되어 있어서 재미있었다. 며칠 전에 Peter O’Hearn + 양홍석 교수님과 한 자리에서 잡담할 기회가 있었는데 그 때 이 항목을 알고 계신지 여쭤볼걸… ↩︎