저는 기계지능연구실 소속으로, CV 분야의 연구를 하고 있습니다.
기계지능연구실에서는 로봇의 시각 기능이나 자율적으로 행동하기 위한 지능 시스템에 대한 연구를 진행하고 있습니다(HP는 여기에서 확인 가능!).
최근 'macOS 27'이 출시되었습니다. 그중에서도 크게 다뤄지는 것이 'Siri AI'인데, 10월에 일본어로 베타 버전 제공이 시작되니 여기서 활기를 띨 것 같다고 생각합니다.
자, 이 'macOS 27'에서 개인적으로 궁금한 기사를 발견했습니다. 바로 'macOS 27에서는 Apple Intelligence가 사용하는 LLM을 로컬에서 이용할 수 있을 것 같다'는 내용이었습니다. 게다가 자신의 PC 사양으로도 구동할 수 있다고 했습니다. '이건 사용해 봐야겠다!'라고 생각했지만, 그냥 쓰는 것뿐만 아니라 조금 전에 유행했던 다이어그램 도구를 직접 만들어보려고 합니다. Keynote용 다이어그램 도구는 거의 없기 때문에, 이걸로 만들 수 있다면 Apple의 툴로 모든 것이 완결된다는 희망을 안고 제작에 착수합니다.
또한, 이 로컬 LLM에 대한 자세한 설명은 여기 기사가 이해하기 쉬우니 참고해 주세요.
이번에 사용할 LLM은 문장 이해나 구조화된 출력을 할 수는 있지만, LLM 단독으로는 Keynote 위에 도형을 배치해 줄 수는 없습니다. 따라서 이번에는 '논문 이해 및 텍스트를 통한 도식 설계 단계'와 '실제로 그림을 작성하는 단계'로 나누어 진행하려고 합니다.
이번에 구상한 처리 흐름은 다음과 같습니다.
- 텍스트를 로컬 LLM에 입력합니다. 로컬 LLM에게는 노드 추출, 노드의 의미적 분류, 노드 간의 관계성 추출을 주로 맡깁니다.
- 노드의 의미나 관계성을 바탕으로 어떻게 노드를 배치하고 연결할지 Python 파일을 사용하여 결정하고, 관계성을 저장해 둡니다(JSON 파일에 저장).
- 그 관계성을 기반으로 크기나 좌표를 정하여 실제로 작성합니다.
즉, LLM에게는 '무엇을 그릴지'에 대한 이해만 담당하게 하고, '어디에 그릴지'는 Python이, 'Keynote 위에 실제로 그리는 처리'는 AppleScript가 담당하도록 합니다.
로컬 LLM에서의 핵심 처리는 논문 내의 방법론 흐름을 바탕으로 사용된 모델이나 처리 흐름 등을 이해하고, 이들의 대응 관계를 파악하는 것입니다. 그래서 텍스트 입력과 로컬 LLM 호출, 관계성 저장까지 수행하는 'generate_figure_json.py' 파일을 작성합니다. 참고로, 어느 부분에서 무엇을 하는지 정리해서 말씀드리겠습니다.
- 입력할 문장을 Python 파일 내에 다음과 같이 설정합니다.
METHOD_DESCRIPTION = """
An input image is passed through an encoder to obtain a feature representation.
The feature representation is split into two branches.
...
- 각 노드가 어떤 것을 직접 입력으로 받는지, 그리고 각 노드의 종류 등을 설정하여 LLM이 다음과 같은 형태로 정리하게 합니다.
class MainNode:
id
type
...
- 로컬 LLM에게 다음과 같이 지시하여, 각 단어의 의미를 명시적으로 정의합니다.
model:
Encoder
Decoder
...
- 앞서 언급한 노드의 종류 등에 기재된 'input_ids(각 노드가 직접 받는 입력 원본 노드의 ID)'를 사용하여 관계 구축을 합니다.
def build_connections(plan: FigurePlan):
connections = []
for node in plan.main_flow:
...
- 그림 작성용 JSON 파일로 변환하여, 노드의 종류나 노드 간의 관계를 한 번에 JSON으로 정리합니다.
{
"id": node.id,
"type": renderer_node_type(node.type),
...
}
{
"semantic":
type = model
renderer:
...
}
JSON 출력이 완료되면, 다른 Python 파일을 사용하여 Keynote 위에서 실제로 그림을 작성해 나갑니다. 사전에 어떤 객체를 사용할지 등은 스스로 결정하고 JSON 파일의 내용을 그려냅니다.
이 부분도 코드가 길기 때문에 생략하지만, 대략적인 흐름은 다음과 같습니다.
- 레이블로부터 노드 크기 자동 결정
- Python 측에서 문자 폭을 추정하여 명시적으로 줄 바꿈
- 줄 바꿈 이후 높이 및 폰트 사이즈 재조정
...
이러한 배치 정보를 AppleScript로 변환하여 Keynote 상의 Shape, Text, Line으로 그려 나갑니다.
먼저 검증 차원에서 앞서 설명했던 'An input image is passed through an encoder to obtain a feature representation. The feature representation is split into two branches.'를 도식화 해보겠습니다.
그다음, 실제 논문인 「Neighborhood Feature Pooling for Remote Sensing Image Classification (https://arxiv.org/abs/2510.25077)」의 흐름 설명을 도식화해 보겠습니다. 설명은 다음과 같습니다: 'Full architecture illustration of the proposed model using MobileNetV3 [9] with NFP. Each block represents a stage in the feature extraction pipeline. After feature maps are extracted from the input, the features are aggregated through two branches: global average pooling (GAP) and NFP. The NFP branch first extracts the similarity maps then the similarity values are aggregated through GAP. The average NFP features are then upsampled to the same dimension using a 1 × 1 convolution. The final step is for the GAP and NFP feature vectors to be multiplied before being passed into the output classification layer. The ⊙ symbol denotes element-wise multiplication used to fuse the GAP and NFP feature vectors.'
실행할 PC 환경을 정리해 두겠습니다.
| 항목 | 내용 |
|---|
| 칩 | Apple M3 |
| ... | |
| image.png | |
검증의 경우, 색상이나 모양은 이번에 변경하지 않았기 때문에 같지만, 상상했던 것보다 잘 나왔습니다.
image.png
다음으로 실제 논문에서 생성한 결과와 논문에 실린 그림을 비교해 보겠습니다. 이렇게 보니 전체적인 위치 관계가 매우 엉망이 되어 있다는 것을 알 수 있습니다. 또한 노드 하나하나를 봐도 맞는 부분과 틀린 부분이 있습니다. 검증 시의 단순한 예에서는 '분기한다'는 정보만으로 배치가 가능하지만, 논문은 여러 처리가 있어 '어디까지를 하나의 노드로 다룰지', '어떤 처리가 어떤 특징량을 입력으로 하는지'에 대한 해석 자체가 필요하기 때문에, LLM에 의한 의미 분석 오류가 그대로 레이아웃 붕괴로 이어진 것으로 생각됩니다.
실제 환경에서 사용하려고 하니 역시 만만치 않은 것 같습니다.
이번에는 Mac에서 사용할 수 있는 로컬 LLM을 활용하여 Keynote용 작도 도구를 만들 수 있는지 시험해 보았습니다. 솔직히 말해서 전혀 작도가 불가능할 것이라고 생각했기 때문에, 검증 과정에서 그림이 만들어진 것만으로도 개인적으로는 만족합니다. 하지만 아무래도 실제 논문의 그림까지 만들 수 있다면 좋겠다는 생각이 들어서, 시간이 될 때 다시 도전해 보려고 합니다. 물론 요약이나 텍스트 이해 창의 용도로 사용한다면 편리한 로컬 LLM이라고 생각하기 때문에, Mac 사용자이면서 사양이 충족되는 분들은 꼭 한번 사용해보시길 바랍니다.