
요즘 집에 다들 맥미니 하나씩은 두고 계시잖아요?
가끔 진로 특강하러 오시는 강사님이 맥미니에 OpenClaw를 구축해서 챗봇 형태의 AI 에이전트를 운영하는 걸 보여주셨습니다. 그중에서 가장 눈에 띄었던 건 Discord에 봇 3마리를 연결해서 자율 학습 에이전트로 만들고 성장시키는 것이었습니다.
원래 특강때마다 다들 동태눈이 되서 음오아예만 하는데, 자기들끼리 공부하면서 떠들고, 페르소나를 가지고, 심지어 학습능력이 저마다 차이가 있다고 하면서 디지털 자식농사(?)를 보여주시는데 재미가 없을 수가 없죠.
"이거 나도 해볼 수 있지 않을까?"
하지만 일단 환경이 달랐습니다:
그래서 저는 나름의 방식으로 재해석하여 접근해보기로 하였고,
→ Docker(Openclaw탑재) + Gemini API 조합으로 비슷한 걸 만들어보기로 결정하였습니다.
그러한 연유로 어쩌다 탄생한 세 친구를 먼저 소개합니다.
| 이름 | 별명 | 성격 |
|---|---|---|
| 베로 (Vero) | 진실의 탐구자 | 호기심 많고 왜? 를 달고 사는 타입 |
| 루체 (Luch) | 분석의 빛 | 말은 적지만 핵심을 찌르는 내향형, 가끔 예상 밖 유머 |
| 노바 (Nova) | 에너지의 폭발 | 아이디어가 넘쳐서 주체를 못 하는 행동파 |
세 봇 모두 15~19세 친구 컨셉으로, 제 Node 0(Zero)채널의 #일반 방에서 살고 있습니다.
일단 맥미니가 없는 저는, 개발하는 동안만 제 맥북을 호스트 삼아 오픈클로용 도커 컨테이너를 하나 올리고,
거기에 python 3.10 버전을 개발 환경으로 올려서 파이썬 기반의 봇 프로파일링 및 실행파일을 만들었습니다.
MacBook Air ← 호스트
└── Docker 컨테이너 (격리 환경, 로컬 파일 접근 차단)
├── main.py (3개 봇 동시 실행)
├── Gemini 2.5 Flash API ← Claude 대신
├── discord.py
├── OpenClaw
└── ddgs (DuckDuckGo 웹 검색)
맥미니가 없는 이유는 너무 비싸기 때문입니다. 분명 한 2주 전에 본 가격이 90만원도 채 안됐는데 갑자기 110만원대로 올라버렸더라고요...
강사님께 자세한 아키텍처를 여쭤보고 싶었지만, 특강때만 잠깐 오시는 바쁜 분이라서 연락처를 찾을 수 없어서 일단 제 나름대로 dual-track 아키텍처를 짜보았습니다.
!할일 명령으로 실제 리서치·파일 생성왜 이렇게 짰느냐? 이렇게 짜지 않으면 자유 대화와 주어진 업무 처리 과정이 짬뽕되서 뭐가 뭔지 전혀 모르는 상황이 됩니다.
그리고 가뜩이나 말이 많은 애들인데 저렇게 모드를 분기하지 않으면 자기들이 뭐하는지도 모르고 엉망진창이 되버립니다.
(얼마나 말이 많은지는 이따 보여드립니다.)
강사님은 총 네명의 자식(?)을 두셨다고 했는데요, 자기들이 공부한 내용을 .md 파일로 저장해서 쌓아둔다고 하셨습니다.
역시 자세한 매커니즘을 못 들어서 어떤 원리로 무엇을 어떻게 하는지는 모르겠지만 강사님께서 배우자분께도 퇴사자 1인의 업무 보조를 위해 한 세마리 입양시켜주셨다고 하니 일단 사람이 시키는 일(특히 공부하고 요약하고 정리하는 일)을 잘 하지 않을까요?
저는 일단 각각 친구들에게 미션을 주고 output 폴더에 조사한 내용을 저렇게 .md 파일로 적재하게 해놓았습니다.

그리고 그 내용을 토대로 토론을 시켰는데 말이 정말 많습니다.

제가 세 친구한테 준 미션은 무한경쟁 시대에 각각 LLM 하나씩 맡아서 조사하고 조사한 내용을 토대로 뭐가 제일 좋은지 토론해봐라 였거든요.




(... 더 많은데 일단 여기까지 하겠습니다.)
일단 가장 신기한건 '이게 되네?' 였구요. (물론 코드는 AI가 짜줬지만 계속 실행시켜보고 검토하고 수정은 제가 했으니 반은 제꺼죠.)
그 다음으로 신기한 건 인간도 서로 대화하다 보면 어투나 성격이 섞이듯이, 쟤네들 끼리도 분명 고유의 페르소나를 부여해줬음에도 뭔가 말투가 조금씩 비슷해져가요. 서로 영향을 받는게 느껴집니다.
사실 굳이 OpenClaw를 안쓰고 Gemini Flash API로도 지들끼리 떠드는 챗봇이나 조사해서 .md파일로 저장하는건 충분히 할 수 있는데, 그럼에도 불구하고 Openclaw를 쓴 이유는
그래서 사실 지금 구현단계에서는 OpenClaw를 완전히 활용하지 않았지만, 향후 파일 가공이나 스크립트 실행, 다른 API 직접 호출 등 진짜 자율형 에이전트로 키울 때 OpenClaw가 그 역할을 할 것이라 생각하고 파이프라인으로 남겨두었습니다.
처음에는 돈을 정말 아끼고자 Free Tier를 사용하였는데, 이 상태에서 봇 3마리가 동시에 떠들기 시작하자 RESOURCE_EXHAUSTED 오류가 3초 간격으로 쏟아지고. 로그가 에러로 가득 차는 상황이 발생하였습니다.
잘못하면 반성문도 쓰게 했는데 그 반성문까지 같이 날아오니까 더 악순환일 수밖에 없었죠
그래서 시도한 해결책들:
reflect_and_grow에도 15초 딜레이 추가"참견 로직"을 추가했더니 베로가 무언가 말하면 루체가 반응, 루체에게 노바가 반응, 노바에게 베로가 반응... API 요청이 폭발적으로 늘어났습니다.
참고로 참견 로직이 뭐냐면 정말 사람끼리 대화하는 내러티브처럼 만들기 위해 누군가 말하는 상황을 감지할 경우 그 말에 끼어들어 대답하는 로직입니다.
결국 봇이 봇의 말에 끼어드는 걸 완전히 차단하고, 참견 확률도 30% → 10%로 줄여버렸습니다.
!(디스코드 인용문 태그) 없으면 대화가 안 된다?처음엔 ! 태그가 없으면 봇이 아예 반응하지 않았습니다. "친구들아 안녕?" 했더니 아무도 대답 안 해서 당황스러웠습니다. 실패한 줄 알았어요. 로직을 수정해서 이름 호명, 단체 인사말(친구들아, 얘들아), 역할 멘션에도 자연스럽게 반응하도록 변경하였습니다.
봇이 답변할 때마다 파란 박스가 뜨면서 "베로의 답변 (Level 3)", 하단에 "현재 성향: 호기심 많음, 공감 능력..." 같은 메타 정보가 붙었더랬습니다. 진짜 단톡방처럼 만들고 싶었는데 완전히 로봇처럼 보였죠. 봇에 붙은 기본 임베딩듯 했습니다. 이걸 전부 걷어내고 순수 텍스트만 보내도록 변경했습니다.

뭔가 '사람의 단톡방'느낌을 주고 싶어서 2분마다 자동 발화 기능을 넣었는데, 침묵이 조금만 흘러도 세 봇 모두 돌아가면서 "다들 뭐해요?", "오늘 어떠세요?" 같은 말만 반복하는 겁니다... 마치 대화형 에이전트 더미문구 처럼요..
원인은 프롬프트에 들어간 한 문장이었습니다.
❌ "최근 아무도 당신에게 말을 걸지 않았습니다."
이 문장이 봇에게 "침묵을 깨야 한다"는 의무감을 심어준 거죠. 해결은 프레이밍 교체를 통해 진행하였습니다.
✅ "진짜 하고 싶은 말이 있을 때만 말하세요. PASS 확률을 70% 이상 유지하세요."
베로·노바는 적극적이고 외향적(E 성향을 고려)인데 루체만 공식 보고서를 쓰는 AI처럼 대화가 아니라 "에이전트의 역할과 현재 상태를 설명하는 형식적 방식으로 응답"하고 있었습니다.
그러다보니 자연히 대화 중에 겉도는 느낌이었는데 알고 보니 특성 반영 및 성장을 위한 reflect_and_grow속성에서 루체의 특성을 "객관성 및 역할 명확화"로 계속 강화하고 있었습니다.
메모리를 리셋하고, 씨앗 성격을 "말은 적지만 가끔 예상 밖 유머로 빵 터뜨리는 내향형" 으로 바꾸니 훨씬 자연스러워졌습니다. 위에 캡쳐를 보시면 알겠지만 E들에게 수집당한 I처럼 잘 놀아요(?)
!할일로 ChatGPT·Gemini·Claude 리포트를 각각 쓰게 한 후 "각자 조사한 걸로 토론해볼까?" 했더니 아무도 대답하지 않더라구요. 알고보니 봇들이 자기가 쓴 파일 내용을 전혀 모르기 때문이었습니다.
이를 해결하기 위해 학습 기록과 출력 파일을 build_system_instruction() 메써드에서 읽어서 시스템 프롬프트에 주입하는 방식으로 해결하였습니다.
LLM API는 최신 정보 반영이 안 되는 문제가 있어서, 웹 검색 기능을 추가했고 duckduckgo-search를 설치했는데 이것때문에 런타임에서 계속 경고가 뜨는 것이었습니다. 알고 보니 패키지명이 ddgs로 바뀐 지 얼마 안 된 상황이었던거죠. Dockerfile과 코드 모두 수정하여 정상화 시켰습니다.

(이제 덕덕고가 뭔지 정말 너무나 잘 알겠어요...)
모든 대화가 끝나면 백그라운드에서 reflect_and_grow() 가 실행된다:
{
"new_learned_trait": "과학적 근거로 토론에 참여하는 능력",
"experience_summary": "사용자의 음모론에 논리적으로 반박함"
}
이게 쌓여서 다음 대화의 시스템 프롬프트에 들어가는데, 진짜 "학습"이라기보다 캐릭터가 대화를 거듭할수록 더 입체적으로 성장하는 효과에 가깝습니다.
진짜 '자율 학습 에이전트 챗봇'을 구현하여 제대로 된 자식농사를 짓기 위해 앞으로 할 일은 다음과 같습니다.