며칠 전부터 슬랙에 AI 팀원을 하나 만들고 있다. 이름도 붙였다. 마일로다. 처음 생각은 단순했다. 나는 이미 AI를 꽤 많이 사용하고 있는데, 이상하게도 일이 줄어든다는 느낌은 크지 않았다. AI가 글을 써주고 코드를 만들어줘도 그 결과물을 실제 업무에 옮기는 건 결국 내 일이었기 때문이다. AI가 문서를 작성하면 내가 복사해서 구글닥스에 넣었다. 코드를 만들어주면 내가 파일을 열어서 적용했다. 필요한 자료가 있으면 내가 찾아서 AI에게 전달했다. AI에게 머리는 빌리고 있었지만 손발은 여전히 내 것이었다. 그래서 아예 손발을 달아보기로 했다.
처음에는 그냥 슬랙에서 대화하고 싶었다
내가 원했던 모습은 회사에서 팀원에게 일을 시키는 것과 크게 다르지 않았다. 출근길에 휴대폰으로 슬랙을 열고 마일로에게 “어제 논의한 내용 정리해서 기획 문서에 반영해줘”라고 말한다. 마일로는 필요한 문서를 찾아서 읽고, 내용을 수정한 다음 작업이 끝났다고 알려준다. 그 정도면 충분했다.
그래서 처음에는 슬랙과 AI를 연결했다. 슬랙에서 마일로를 부르면 내 컴퓨터에서 실행 중인 노드JS가 메시지를 받고, 오픈AI API에 질문을 전달한 뒤 다시 슬랙으로 답변을 보내는 구조였다. 처음 마일로가 슬랙에서 답변했을 때는 꽤 재미있었다. 하지만 곧 문제가 보였다. 말만 잘했다. “구글 드라이브에 문서를 저장해줘”라고 하면 저장할 수 없었다. 구글 드라이브를 볼 수도 없었고, 문서를 만들 수도 없었다. 당연한 일이었다. AI에게는 구글 계정도 없었고 구글 드라이브에 접근할 권한도 없었다. 그때부터 일이 조금 달라졌다.
AI의 문제는 지능보다 권한이었다
구글 클라우드 프로젝트를 만들고 드라이브 API와 닥스 API를 연결했다. OAuth를 설정하고 내 구글 계정에 접근할 수 있도록 권한을 부여했다. 그리고 기능을 하나씩 만들었다. 구글 드라이브에서 파일을 검색하는 기능을 만들고 테스트했다. 실제 내 드라이브에 있는 파일 이름이 터미널에 나타났다. 그다음에는 구글닥스를 읽게 했다. 파일 이름으로 구글 드라이브를 검색하고, 검색 결과에서 문서 ID를 얻은 다음, 그 ID로 실제 문서의 본문을 가져왔다. 문서를 새로 만드는 기능도 추가했다. 노드JS를 실행하자 내 구글 드라이브에 실제 구글닥스 파일이 하나 생겼다.
처음에는 모든 기능을 내가 직접 호출했다.
searchFiles("회의록")
getDocument(documentId)
createDocumentWithContent(title, content)
이 상태에서는 자동화 프로그램이지 팀원이라고 부르기는 어려웠다. 무엇을 해야 하는지는 여전히 내가 결정하고 있었기 때문이다. 그래서 다음에는 이 함수들을 마일로에게 도구로 줬다. 구글 드라이브를 검색해야 한다고 판단하면 search_drive를 사용하고, 문서를 읽어야 한다고 판단하면 read_google_doc을 사용하도록 했다.
여기서 처음 재미있는 일이 벌어졌다. 나는 마일로에게 그냥 “구글 드라이브에서 마일로 구글닥스 테스트 문서를 찾아서 내용을 읽고 요약해줘”라고 말했다. 검색 함수를 실행하라는 말도 하지 않았고 문서 ID도 알려주지 않았다. 마일로는 먼저 구글 드라이브 검색 도구를 사용했다. 검색 결과에서 문서의 ID를 얻었고, 그 ID를 가지고 다시 문서 읽기 도구를 호출했다. 두 번의 작업이 끝난 뒤 실제 문서 내용을 읽고 요약해서 답했다. 아주 단순한 동작이다. 파일을 찾고, 파일을 읽었을 뿐이다. 그런데 이때부터 내가 명령어를 하나씩 실행하는 것과는 조금 다른 물건이 되어가기 시작했다. 나는 무엇을 할 것인지만 이야기했고, 어떻게 할 것인지는 마일로가 결정했다.
당연히 한 번에 되지는 않았다
첫 번째 연속 도구 호출에서는 바로 오류가 났다. 구글 드라이브 검색까지는 성공했는데 검색 결과를 받아 다음 도구를 사용하려는 순간 오픈AI API가 400 오류를 반환했다. 처음에는 도구 호출 방식이 잘못된 줄 알았다. 오류 메시지를 따라가 보니 원인은 다른 곳에 있었다. 오픈AI가 첫 번째 응답에서 만든 function_call만 다음 요청으로 넘기고, 함께 반환된 추론 상태를 버리고 있었다. 결국 첫 번째 응답 전체를 다음 요청에 유지하도록 코드를 바꿨다.
다시 실행했다. 이번에는 search_drive가 실행되고, 그 결과를 받은 마일로가 read_google_doc을 실행했다. 정상적으로 문서를 읽었다. 예전 같으면 이 문제를 해결한 과정을 블로그에 튜토리얼로 썼을 것 같다. “오픈AI 리스폰스 API에서 연속 함수 호출 구현하기.” 그런데 이제는 그런 글을 굳이 써야 하나 싶다. 나부터도 개발하다 모르는 것이 생기면 블로그를 거의 찾아보지 않는다. AI에게 물어본다. 오류 메시지를 그대로 붙여 넣으면 내 코드와 상황에 맞춰 설명해준다. 그렇다면 앞으로 사람들이 블로그에서 찾는 것도 달라지지 않을까.
개발 방법보다 내가 왜 이렇게 만들고 있는지가 더 중요할지도 모른다
오늘 마일로에게 새로운 기능을 하나 더 줬다. 기존 구글닥스의 마지막에 내용을 추가할 수 있게 했다. 이제 슬랙에서 마일로에게 문서를 찾아 내용을 추가하라고 말하면 마일로가 직접 구글 드라이브를 검색하고 실제 문서를 수정한다. 아직 대단한 일을 하는 것은 아니다. 현재 마일로가 할 수 있는 일은 구글 드라이브에서 파일을 찾고, 구글닥스를 읽고, 새 문서를 만들고, 기존 문서에 내용을 추가하는 정도다.
그런데 이걸 하나씩 만들다 보니 처음 생각했던 것과 다른 곳으로 가고 있다는 생각이 들었다. 처음에는 AI 챗봇 하나를 슬랙에 넣으려고 했다. 지금은 역할을 정의하고, 업무 원칙을 만들고, 접근 권한을 결정하고, 사용할 수 있는 도구를 제한하고 있다. 구글 계정에 접근할 수 있다고 해서 파일 삭제 기능까지 마일로에게 줄 필요는 없다고 판단했다. 기존 문서를 수정하는 기능도 처음부터 전체 내용을 마음대로 바꾸게 하지 않고 문서 끝에 내용을 추가하는 기능부터 줬다. 사람을 채용해서 업무 권한을 정하는 것과 묘하게 비슷하다. AI를 만들고 있었는데 어느 순간 조직을 설계하고 있었다.
내가 만들고 싶은 것은 AI가 아니었던 것 같다
생각해보면 게임을 만드는 이유도 비슷하다. 나는 게임 개발자가 되는 것 자체가 목적은 아니다. 내가 만든 제품을 사람들이 사용하고, 그 제품으로 수익을 만드는 구조를 갖고 싶은 것이다. 그러려면 기획도 해야 하고 개발도 해야 하고 디자인도 해야 한다. 출시하면 마케팅도 해야 한다. 혼자 하려면 결국 내가 전부 해야 한다.
AI가 등장하면서 이 구조를 조금 다르게 만들 수 있게 됐다. 내가 모든 일을 직접 하는 대신 업무를 분리하고, 각각의 역할을 AI에게 맡긴다. 마일로는 그 첫 번째 실험이다. 제품을 기획하고 요구사항을 관리하는 역할을 맡는다. 앞으로 개발을 담당하는 AI도 만들 수 있고, 콘텐츠와 마케팅을 담당하는 AI도 만들 수 있을 것이다. 이들이 서로 회의하는 가상회사를 만들 생각은 없다. 나는 그런 것이 필요하지 않다. 내가 결정하고 지시하면 각자 자기 일을 하면 된다.
결국 내가 만들고 있는 것은 AI 자체라기보다 혼자 제품을 만들기 위한 작업 시스템에 더 가까운 것 같다.
그래서 블로그에 무엇을 써야 할지도 조금 달라졌다
원래는 게임 개발 과정을 기록하는 개발 블로그를 생각했다. 어떤 기술을 사용했고, 어떤 코드를 작성했고, 어떤 문제가 발생했고, 어떻게 해결했는지를 기록하려 했다. 그런데 요즘 내가 블로그를 사용하지 않는다는 사실을 뒤늦게 깨달았다. 무언가 궁금하면 AI에게 물어본다. 그렇다면 내가 또 하나의 개발 튜토리얼 블로그를 만드는 것이 얼마나 의미가 있을까.
오히려 기록할 만한 것은 다른 쪽에 있는 것 같다. 왜 혼자 제품을 만들려고 하는지, 왜 AI 팀원을 만들기 시작했는지, 어떤 일을 AI에게 넘기고 어떤 일은 직접 하기로 했는지, 만들면서 예상과 달랐던 것은 무엇인지, 결국 이 방식으로 실제 제품을 출시하고 돈을 벌 수 있었는지. 코드가 필요하면 그 과정에서 등장하면 된다.
오늘 발생한 400 오류도 마찬가지다. 오류 해결법 자체보다 더 중요한 것은 그 오류를 해결하고 다시 실행했을 때 마일로가 처음으로 스스로 파일을 찾고, 그 결과를 이용해 다음 도구를 선택했다는 것이다. 그리고 오늘은 한 단계 더 갔다. 슬랙에서 마일로에게 기존 문서를 찾아 내용을 추가하라고 했다. 잠시 뒤 실제 구글닥스를 열어보니 내가 슬랙에서 지시한 문장이 문서 마지막에 들어가 있었다.
아직은 작은 기능이다. 하지만 처음 생각했던 그림은 조금씩 현실이 되고 있다. 나는 슬랙에 일을 적는다. 마일로는 필요한 도구를 고른다. 그리고 실제 파일이 바뀐다. 처음에는 AI와 대화하려고 시작했는데, 지금은 내가 일을 덜 하기 위한 시스템을 만들고 있다.