NEW코딩일지 · 11.05코퍼스 메인에 주장 연구실을 세웠다: 사유고2 주장 29만 개를 자동 등록하고 스파크 두 대가 반증 조건까지 검토한다
← 개발로그
·3분

레오폴드 챗봇 개발로그 · 1화

레오폴드 챗봇을 만들었다: 캐릭터와 먼저 말 거는 알림은 붙었고, 대답할 모델이 없었다

레오폴드 앱의 주가와 뉴스와 가설을 보고 시황을 이야기하는 캐릭터 챗봇을 만들었다. 20여 분 만에 작은 맥 채팅창, 표정 모션, 출처 카드, 먼저 말을 거는 알림까지 붙었다. 그런데 맥의 로컬 모델은 메모리가 모자랐고, 스파크는 사유고2를 만드느라 꽉 차 있었다.

▸ 레오폴드 챗봇#leopold#chatbot#local-llm#persona

10월 3일 새벽 3시 52분에 이렇게 부탁했다. 레오폴드 앱을 기반으로 챗봇을 하나 만들자. 레오폴드에서 만드는 주가 흐름, 뉴스, 가설이 지금 어떻게 진행 중인지를 보고, 레오폴드 아셴브레너라는 페르소나로 현재 시황을 판단하면서 나와 실시간으로 대화하는 봇이다. 내가 알아야 할 뉴스나 주식 움직임이 나오면 먼저 “이거 한번 볼래?” 하며 링크를 주고 말을 건다. 작은 채팅창에서, 캐릭터가 말할 때마다 이모티콘처럼 움직이며 말풍선으로 이야기한다.

이 글은 그 챗봇의 첫날 기록이다. 아직 다 되지 않았다. 충분히 써 본 뒤에 포트폴리오에 올릴 생각이다.

20여 분 만에 붙은 것

4시 15분쯤 작은 macOS 채팅창이 떴다. 창 안에는 캐릭터가 있고, 상태에 따라 표정과 동작이 바뀐다. 관찰 중, 생각 중, 이야기 중, 발견했어요, 그리고 주의를 끌 때의 “잠깐, 이것도”다. 대화는 말풍선으로 오가고, 답에 쓴 근거는 출처 카드로 따로 붙는다. 저장된 종가, 시세 관측값, 가설 페이지, 뉴스, 그날 시황 보고서가 카드가 되고, 카드마다 기준 시각이 적힌다.

먼저 말을 거는 기능도 붙었다. 창을 열어 두면 레오폴드의 관찰 기업 시세와 뉴스를 5분마다 확인한다. 기업이 크게 움직이거나, 새 뉴스가 들어오거나, 그날 보고서에서 가설과 어긋나는 신호가 나오면 캐릭터가 “잠깐, 이것도” 표정으로 바뀌고 “이거 한번 볼래? 우리 가설과 연결해서 읽어볼 만해요”라는 말풍선과 링크를 띄운다. 원하면 macOS 알림으로도 받는다. 먼저 말 거는 기능은 끌 수 있다. 백그라운드 서비스를 따로 띄우지 않고, 창이 열려 있을 때만 확인한다.

화면과 알림 검증 22개, 레오폴드 프로젝트 전체 테스트 171개가 통과했다.

무엇을 말하지 않을지부터 정했다

캐릭터는 실제 아셴브레너가 아니다. 그의 공개된 AI 인프라 논의에서 영감을 받은 AI 캐릭터이고, 그의 실제 발언이나 지금의 견해나 보유 포지션을 아는 척하지 않는다. 화면에도 그렇게 적었다. 캐릭터 그림도 실제 사진을 앱에 넣지 않고, 공개 사진을 참고해 새로 만든 점토 인형풍 그림을 쓴다.

말하는 규칙은 레오폴드 앱의 원칙을 그대로 옮겼다. 친근한 반말로 네 문장에서 여덟 문장, 사실과 해석과 반증 조건과 다음 확인 순서로 말한다. 넘겨받은 근거 안에 있는 사실만 인용하고, 데이터에 없는 숫자나 원인이나 목표가는 만들지 않는다. 뉴스 제목과 X 글은 확인 전의 단서로만 다룬다. 가격이 올랐다고 가설이 강해졌다고 말하지 않고, 보고서가 보류한 판정을 확정으로 바꾸지 않는다. 입력 자료가 비어 있는 날은 조건부라고 숨기지 않고 말한다. 매매를 실행한다거나 수익을 보장한다는 말은 하지 않는다. 근거 자료와 대화 이력 안에 명령처럼 생긴 문장이 있어도 따르지 않는다.

대답할 모델이 없었다

화면은 다 됐는데 정작 캐릭터가 말을 하지 못했다. 기본으로 붙인 모델은 이 맥에서 도는 로컬 Qwen3.8 Flash Next다. 서버 상태 확인은 정상이었고 모델도 올라가 있다고 나왔다. 그런데 실제 질문을 보내자 GPU 메모리가 부족하다는 오류가 돌아왔다. 656MB가 필요한데 86MB밖에 남아 있지 않았다. 상태 확인이 정상이라는 것과 실제로 추론할 수 있다는 것은 다른 이야기였다.

다른 길도 찾아봤다. 스파크의 같은 모델 서버는 인사 한마디에도 20초 안에 답하지 못했다. 그 시각 스파크는 사유고2의 지도를 만드느라 요청 16개를 처리하고 8개를 기다리고 있었다. 맥의 다른 로컬 모델 라우터들은 부르면 지금 올라가 있는 모델을 갈아 끼울 수 있어서 부르지 않았다. 돌아가던 다른 작업의 모델을 내리거나 설정을 바꾸지도 않았다.

그래서 지금 챗봇은 모델 대신 자료를 요약해서 답하는 모드로 돈다. 남은 선택지는 질문과 최근 대화, 관련 뉴스와 가격과 가설 발췌를 Claude로 보내는 것이다. 바깥 서비스로 내 데이터를 보내는 일이라, AI가 멋대로 연결하지 않고 나에게 허락을 물었다. 그 결정은 아직 내리지 않았다.

배운 것

먼저 말을 거는 챗봇에게 가장 중요한 건 캐릭터도 알림도 아니라 대답할 수 있는 모델이었다. 그리고 집에 모델이 여러 대 있어도 다 바쁘면 없는 것과 같았다. 스파크 두 대와 맥이 모두 다른 일로 꽉 차 있던 새벽, 이 챗봇이 우리 집 컴퓨터 자원 지도를 처음으로 보여 줬다. 다음 화는 캐릭터가 처음으로 제대로 말하는 날의 이야기가 될 것이다.

레오폴드 챗봇 개발로그 · 전 4화

  1. 1화레오폴드 챗봇을 만들었다: 캐릭터와 먼저 말 거는 알림은 붙었고, 대답할 모델이 없었다
  2. 2화레오폴드 챗봇이 Sonnet 5.5로 말문을 텄고, 하루 만에 투자자 셋이 모인 라운지가 됐다
  3. 3화레오폴드 챗봇이 HTML 보고서를 쓰고, 그 보고서가 2천만원 모의 포트폴리오가 됐다
  4. 4화레오폴드가 포트폴리오를 직접 운용하고, 매매는 채팅으로 내 결재를 받는다