엑셀의 자동완성 기술이 규칙을 찾는 방법
[essay] 2 min read
Abstract
엑셀의 자동완성 기술은 사용자가 입력하는 데이터를 만들어낼 명령어를 역으로 추론해 낸다. 이 기술은 엑셀을 넘어서 관찰-분류에서도 쓰이는데, 현재는 데이터의 성질에 따라 다른 문법을 사용하지만, 해당 기술이 광범위하게 사용되면 한 가지 공통 문법이 제시될 수도 있을 것이다.
본문
엑셀의 자동 완성 기능은 사용자가 몇 개의 예를 입력하면 나머지 데이터를 추론하여 채워주는 유용한 도구다. 왼쪽 열 가득히 사람 이름이 채워져 있다고 하자. 오른쪽 열 첫 칸에 왼쪽 사람의 성을 한 번 적기만 해도 엑셀이 열의 나머지 칸 모두에 성을 자동으로 채워주며, 사용자는 \(\texttt{=LEFT(A\\)1, FIND(" “, A\(1)-1)}) 같은 복잡한 함수를 몰라도 된다.
명령어를 설명하자면 \(\texttt{FIND}\)가 왼쪽 칸(성과 이름이 공백으로 구분)의 공백 위치를 숫자로 반환하고, \(\texttt{LEFT}\)가 그 숫자 이전까지를 읽어 들여온다.
자동완성 기능을 위해선 프로그램이 다루는 자료를 서술할 수 있는 언어(DSL)를 설계하고, 주어진 예제의 규칙을 찾아내야 한다. 엑셀의 DSL은 이미 LEFT, FIND 등의 함수와 연산자로 설계되어 있다.
DSL은 \(\texttt{=LEFT(\_, \_)}\)의 양쪽 빈칸에 무엇이 들어갈 수 있는지도 제약을 걸어야 한다. \(\texttt{LEFT}\)는 지정한 칸의 글자 중 몇 번째 글자 이전까지를 읽어오는 함수이므로, 왼쪽에는 칸의 위치, 오른쪽에는 숫자나 숫자가 결과로 나오는 함수, 연산자가 들어가야 한다. 규칙을 찾아내기 위해 모든 명령어를 하나씩 탐색할 수는 없으니, 엑셀은 시작점 (빈 칸 하나)에서 시작해 빈 칸에 예제를 모두 만족하는 함수나 변수를 채우는 과정을 반복한다.1
이 기술은 엑셀을 넘어 여러 관찰-분류 문제에 활용된다. 예를 들어, 두 쥐의 거리를 시간별로 잰 자료를 가지고 쥐가 방금 한 행동을 구별하는 등이다. 거리 (숫자) 를 다룰 수 있는 DSL을 만드는 과정이 추가되지만 (사칙연산과 조건문 등이 포함되고, 거듭제곱 등은 빠진다), 빈칸에 함수들을 집어넣길 반복하는 과정은 전과 같다.
최근에는 탐색을 빨리 하기 위해 빈칸에 들어갈 (크기 조건 없던) 상수값을 구간 정적분석 (interval analysis)으로 나누고, 각 구간의 상수값으로 빈칸이 채워진 프로그램이 몇 개의 예제를 확실히 맞추거나 틀릴지를 토대로 확률이 높은 쪽부터 탐색해 나가, 결과적으로 가장 많은 예제를 맞추는 프로그램을 빠르게 합성하는 방법이 제시되었다.2
DSL은 공통 부분이 합쳐질 발전의 여지가 남아 있다. 현재는 분석을 원하는 데이터의 특징에 맞춰 DSL이 따로 제안되고 있는데, 이는 언어에 꼭 필요한 규칙만 넣어야 합성 시간을 줄일 수 있기 때문이다. 예를 들어 Quivr DSL3 등 새 DSL을 제안할 때는 데이터를 정확하되 빠르게 분류할 수 있다는 실험 검증이 덧붙여진다. 이는 언뜻 당연해 보이지만, 예전 컴파일러가 언어별로 따로 만들어졌던 것이 LLVM으로 통합된 것을 기억한다면 다르다. LLVM은 여러 언어의 중간언어를 하나의 컴파일러가 통합해 다루기 위한 필요성이 이끌었다. 즉 DSL의 통합이 필요하다면, 이는 여러 종류의 데이터를 분석하는 통합형 도구가 필요할 때일텐데, DSL에서도 LLVM에 비견되는 하나가 등장할 수도 있을 것이다.
Sumit Gulwani, ‘‘The Story of the Flash Fill Feature in Excel’’, https://blog.sigplan.org/2021/09/14/the-story-of-the-flash-fill-feature-in-excel/ ↩︎
Stephen Mell et al., ‘‘Optimal Program Synthesis via Abstract Interpretation’’, 2024. ↩︎
Stephen Mell et al., ‘‘Synthesizing Trajectory Queries from Examples’’, 2023 ↩︎