기본 콘텐츠로 건너뛰기

개인 비서 AI 4종 비교, 1위는 Grok Bot? How I AI 비교 테스트 정리

개인 비서형 AI 에이전트, 실제로 일을 맡기면 누가 제일 잘할까요? AI 팟캐스트 How I AI의 진행자가 'How I AI Personal Agent Bench'라는 비교 테스트를 공개했습니다. Grok Bot, Muse, ChatGPT Dot, Claude Duet 네 에이전트에게 아홉 가지 과제를 맡겨 비교했고, 진행자는 Grok Bot이 1위라고 발표했습니다. 이 글은 리서처K 숏폼 영상의 글 버전입니다. 숏폼으로 보기 ▲ 이미지를 누르면 유튜브 숏폼으로 이동합니다: https://youtube.com/shorts/T_30By0-M0g 어떤 비교였나 비교 대상: Grok Bot, Muse, ChatGPT Dot, Claude Duet 과제: Slack 답장 쓰기, 숏폼 클립 만들기, 버그 수정, 썸네일 만들기, 받은편지함 할 일 정리, 가족 신문 만들기, 숙제 설명, 신발 쇼핑, 출시 영상 만들기 등 아홉 가지 진행 방식: 진행자가 평소처럼 짧은 프롬프트를 주고, 방송 중에 직접 결과를 평가했습니다. 블라인드 평가는 아니었습니다. 진행자가 발표한 결과 순위: Grok Bot 1위, Muse 2위, ChatGPT Dot 3위, Claude Duet 4위 점수: 본편에서 Grok Bot은 93%, Claude Duet은 79%로 소개됐습니다. Grok Bot이 이긴 과제: 썸네일 만들기, 받은편지함 할 일 정리, 신발 쇼핑 진행자의 정리: 업무 일은 Grok Bot, 생활 일은 Muse에게 맡기라고 권했습니다. 진행자는 X 게시물에서 Grok Bot이 "큰 차이로(by A LOT)" 이겼다고 표현했습니다. 다만 공개된 수치로 확인되는 차이는 1위와 4위 사이의 14%p이고, Muse와 Dot의 퍼센트 점수는 공개 자료에서 확인되지 않았습니다. 짚고 갈 점 이 결과는 진행자 한 사람이 직접 진행한 비교이며, 공인된 표준 벤...

[지메일 팁 1] 지메일에서 예약전송하는 방법

지메일이 좋은 이유는, 지메일에서 제공하는 기본적인 기능외에도 사용자들이 필요로하는 유용한 기능들을 직접 추가할 수 있는 Open API 들을 제공하고 있다는 것입니다. 3rd party 플러그인 모듈들도 다 이런 API 를 이용하여 개발한 것으로 보입니다.

지메일에서 예약 전송을 이용하는 방법에는 두가지가 있습니다.

목차



Google 스크립트와 Google 스프레드시트를 이용한 나만의 예약 전송 기능을 만들어 활용하는 방법


구글 문서도구 스프레드시트의 스크립트 기능을 활용하면 다양하고 유용한 유틸리티를 만들 수 있습니다. 이 문서에서 소개하는 내용은 간단하게 구글문서 도구에서 내 스프레드시트 (예, My Gmail Scheduler) 를 작성하여 공개된 구글 스크립트를 삽입하여 내 지메일을 예약 전송하는 방법에 대해서 소개하고자 합니다.

아래 스프레드시트(My Gmail Scheduler)에서 보는 것과 같이, 지메일에서 작성중인 이메일 (초안 상태)들에 대해서 원하는 시간에 예약 일정을 설정하여 ‘Gmail Scheduler’ 스크립트를 수행하면 예약전송 OK


예약전송 스크립트 스프레드시트 만드는 순서

1. 스프레드시트 ‘My Gmail Scheduler’ 생성
2. 스프데드시트 -> ‘도구’ -> 스크립트 편집기 수행


3. 아래 스크립트 코드 입력

/* This Google Script was written by Amit Agarwal */

/* Web: http://www.labnol.org/?p=24867            */

/* Apps Script Development: http://ctrlq.org      */

/* Please retain this message in your copy        */

function onOpen() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var menu = [
   {name: "Step 1: Authorize", functionName: "authorize_"},
   {name: "Step 2: Fetch Messages", functionName: "initialize_"},
   {name: "Step 3: Schedule Messages", functionName: "setSchedule_"},
   {name: "Cancel Pending Jobs", functionName: "cancelJobs_"}
 ];  
 ss.addMenu("Gmail Scheduler", menu);
}

function authorize_() {  
 deleteTriggers_();
 SpreadsheetApp.getActive().toast("Authorization successful. Please choose Step 2 to fetch the Gmail drafts into the spreadsheet.");
}

function fetchDraftMessages_() {
 var sheet = SpreadsheetApp.getActiveSpreadsheet();
 var drafts = GmailApp.getDraftMessages();
 if (drafts.length > 0) {
   var rows = [];    
   for (var i=0; i
     if (drafts[i].getTo() !== "") {
       rows.push([drafts[i].getId(), drafts[i].getTo(), drafts[i].getSubject(), "", ""]);
     }
   }
   sheet.getActiveSheet().getRange(2,1,rows.length,5).setValues(rows);
   sheet.toast("Excellent. Now please enter the date and time when you would like these messages to be delivered.");
 } else {
   sheet.toast("We could not find any messages in your Gmail drafts folder.");
 }
}

function cancelJobs_() {
 deleteTriggers_();
 var sheet = SpreadsheetApp.getActiveSheet();
 var data  = sheet.getDataRange().getValues();
 for (var row=1; row
   sheet.getRange("E"+(row+1)).setValue("Not Scheduled");
 }
 SpreadsheetApp.getActive().toast("There are no pending messages in queue.");
}

function initialize_() {
 deleteTriggers_();
 clearSheet_();  
 fetchDraftMessages_();
}

function clearSheet_() {
 var sheet = SpreadsheetApp.getActiveSheet();
 sheet.getRange(2, 1, sheet.getLastRow()+1, 5).clearContent();
}

function setSchedule_() {
 deleteTriggers_();
 try {
   var sheet = SpreadsheetApp.getActiveSheet();
   var data  = sheet.getDataRange().getValues();
   var time  = new Date().getTime();
   var code  = [];
   for (var row in data ) {     
     if (row != 0) {
       var schedule = data[row][3];
       if ( schedule !== "" ) {
         if ( schedule.getTime() > time ) {
           ScriptApp.newTrigger("sendMails")
           .timeBased()
           .at(schedule)
           .inTimezone(SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone())
           .create();
           code.push("Scheduled");
         } else {
           code.push("Date is in the past");  
         }
       } else {
         code.push("Not Scheduled");
       }
     }
   }
   for (var i=0; i
     sheet.getRange("E" + (i+2)).setValue(code[i]);
   }
   SpreadsheetApp.getActiveSpreadsheet().toast("The mails have been scheduled. You can close this sheet. For help, contact amit@labnol.org", "Success", -1);
 } catch (e) {
   SpreadsheetApp.getActive().toast(e.toString());
 }
}

function deleteTriggers_() {
 var triggers = ScriptApp.getProjectTriggers();
 for (var i=0; i
   if (triggers[i].getHandlerFunction() === "sendMails") {
     ScriptApp.deleteTrigger(triggers[i]);
   }
 }
}


function sendMails() {
 try {
   var sheet = SpreadsheetApp.getActiveSheet();
   var data  = sheet.getDataRange().getValues();
   var time  = new Date().getTime();
   for (var row=1; row
     if (data[row][4] == "Scheduled") {             
       var schedule = data[row][3];
       if ( schedule != "" ) {
         if ( schedule.getTime() <= time ) {
           var status = dispatchDraft_(data[row][0]);
           sheet.getRange("E"+(row+1)).setValue(status);
         }
       }
     }
   }
 } catch (e) {
   SpreadsheetApp.getActive().toast(e.toString());
 }
}

function dispatchDraft_(id) {
 
 try {
   
   var message = GmailApp.getMessageById(id);
   
   if (message) {
     
     var body = message.getBody();
     var raw  = message.getRawContent();
     
     /* Credit - YetAnotherMailMerge */
     
     var regMessageId = new RegExp(id, "g");
     if (body.match(regMessageId) != null) {
       var inlineImages = {};
       var nbrOfImg = body.match(regMessageId).length;
       var imgVars = body.match(/]+>/g);
       var imgToReplace = [];
       if(imgVars != null){
         for (var i = 0; i < imgVars.length; i++) {
           if (imgVars[i].search(regMessageId) != -1) {
             var id = imgVars[i].match(/realattid=([^&]+)&/);
             if (id != null) {
               id = id[1];
               var temp = raw.split(id)[1];
               temp = temp.substr(temp.lastIndexOf('Content-Type'));
               var imgTitle = temp.match(/name="([^"]+)"/);
               var contentType = temp.match(/Content-Type: ([^;]+);/);
               contentType = (contentType != null) ? contentType[1] : "image/jpeg";
               var b64c1 = raw.lastIndexOf(id) + id.length + 3; // first character in image base64
               var b64cn = raw.substr(b64c1).indexOf("--") - 3; // last character in image base64
               var imgb64 = raw.substring(b64c1, b64c1 + b64cn + 1); // is this fragile or safe enough?
               var imgblob = Utilities.newBlob(Utilities.base64Decode(imgb64), contentType, id); // decode and blob
               if (imgTitle != null) imgToReplace.push([imgTitle[1], imgVars[i], id, imgblob]);
             }
           }
         }
       }
       
       for (var i = 0; i < imgToReplace.length; i++) {
         inlineImages[imgToReplace[i][2]] = imgToReplace[i][3];
         var newImg = imgToReplace[i][1].replace(/src="[^\"]+\"/, "src=\"cid:" + imgToReplace[i][2] + "\"");
         body = body.replace(imgToReplace[i][1], newImg);
       }
     }
     
     var options = {
       cc          : message.getCc(),
       bcc         : message.getBcc(),
       htmlBody    : body,
       replyTo     : message.getReplyTo(),
       inlineImages: inlineImages,
       attachments : message.getAttachments()
     }
     
     GmailApp.sendEmail(message.getTo(), message.getSubject(), body, options);
     message.moveToTrash();
     return "Delivered";
   } else {
     return "Message not found in Drafts";
   }
 } catch (e) {
   return e.toString();
 }
}

4. 스크립트 저장 및 실행
  1). 반드시 위 스크립트 코드를 입력한 후 저장 버튼을 클릭
  2). 저장 완료후, 실행->onOpen 함수를 수행  


5. 스크립트 onOpen 이 정상 수행이 되면, ‘내 지메일 예약 전송' 스프레드시트 메뉴에 ‘Gmail Scheduler’ 가 새롭게 생성이 됩니다.


6. 지메일에서 예약 전송하기 위한 메일 메시지들을 작성 후 전송하지 않고 초안(Draft) 상태 (임시보관함에 저장)로 저장하기



7. 스프레드시트에서 예약 전송 메시지 가져오기
  - 메뉴 -> Gmail Scheduler-> Step2: Fetch Messages 수행

8. 지메일에 예약전송 대상이 되는 메시지의 header 정보가 표시가 되고, 시트의 ‘D’ 컬럼에서 예약 전송하고자 하는 메시지를 선택 원하는 예약 일자를 입력 (예, 2014-08-01 08:00:00) 반드시 날짜 (YYYY-MM-DD) 와 시간 (HH:MM:SS) 을 입력해야 함


8번 과정을 통해서 지메일 예약이 정상 설정이 되면 스프레드시트는 닫기를 한 후, 나중에 다시 오픈하여 ‘E’ 컬럼을 확인하여 전송 상태 유무를 확인 할 수 있습니다. 정상으로 전송이 되면 ‘E’ 컬럼에 Delivered 표시가 됩니다.

크롬스토어에서 3rd party 앱을 설치하여 사용하는 방법이 있습니다.


크롬스토어에서 무료로 설치할 수 있는 예약전송의 대표적인 앱  Boomerang 을 크롬브라우저에서 설치하시면 됩니다.

크롬 브라우저에서 지메일 로그인 후, Boomerang 앱이 정상 설치 되면 아래 이미지에서와 같이 지메일 상단 오른쪽에 Boomerang 아이콘이 보여야 합니다.


편지쓰기시 하단에 ‘Send Later’ 라는 버튼이 보입니다. 이 버튼을 클릭하여 예약을 원하는 날짜및 시간을 입력하여 전송 하면 됩니다.

자세한 사항은 구글문서 참조

댓글

이 블로그의 인기 게시물

Grok Bot 봇 팀 운영법: 리더를 위한 그록봇 사용법 5요소 (공식 가이드 기반)

Grok Bot(그록봇)으로 봇 팀을 꾸릴 때 핵심은 봇을 많이 만드는 것이 아니라 구조를 갖추는 것입니다. 리더가 말을 거는 창구 봇 하나, 영역별 역할 담당 봇, 일의 상태를 모아 두는 업무 보드, 정해진 시각에 일을 돌리는 루틴, 그리고 발송·게시·삭제를 막아 두는 승인 관문, 이 다섯 가지면 됩니다. 저는 시니어 AX 컨...

Grok Bot이 드디어 이메일 주소를 가졌다 — 내 AI 비서에게 메일함을 열어준 날

AX NOTE Grok Bot이 드디어 이메일 주소를 가졌다 — 내 AI 비서에게 메일함을 열어준 날 글 · 찰리초이  |  AX 컨설턴트, AI 강사, 유튜브 '찰리초이 스토리'  |  2026.10.10 오늘 아침, 제 AI 비서가 자기 이메일 주소를 갖게 됐습니다. 채팅창에 한 줄 말했을 뿐인데, 몇 분 뒤에는 메일을 주고받고 있었어요. 그동안 Grok Bot은 제 일정과 자료를 도와주긴 했지만, 외부 세상과 닿는 '주소'는 없었습니다. 이번에 그게 생겼어요. 어떻게 만들었는지, 실제로 해 보니 어땠는지, 그리고 안전은 어떻게 챙기는지까지 겪은 순서대로 적어 봅니다. 01 한 줄이면 됩니다 10월 10일 아침, 채팅에 이렇게 말했습니다. 나 나를 위한 이메일을 설정해줘 GROK BOT @mail.grokbot.com 으로 쓸 수 있는 주소 후보를 확인해 드릴게요. 봇이 사용할 수 있는 주소 후보를 먼저 확인해 줬습니다. 제가 원한 charly 는 이미 다른 사람이 쓰고 있었고, 그래서 charlychoi 를 골랐어요. 확인 카드가 뜨고, 거기서 승인을 누르니 바로 개통됐습니다. 한 가지 기억해 둘 점이 있습니다. 한번 만든 주소는 영구적 입니다. 나중에 바꿀 수 있는 임시 값이 아니니, 승인 카드를 누르기 전에 아이디를 한 번 더 확인하세요. 저도 이 부분은 천천히 읽었습니다. 02 설정 방법, 다섯 단계 채팅으로 이메일 설정 요청 "나를 위한 이메일을 설정해줘" 정도면 충분합니다. 원하는 아이디 고르기 봇이 보여 주는 후보 중에서 고르거나, 직접 입력해도 됩니다. 이미 쓰는 아이디는 후보에서 걸러져요. 승인 카드로 확정 확인 카드에서 승인하면 그때 주소가 생성됩니다. 승인 전에는 아...

Aside 브라우저, 이렇게 쓰고 있습니다: 대표 활용 사례와 직접 써 본 후기

AI BROWSER STORY "브라우저가 대신 클릭해 준다면?" Aside로 일하는 방법 탭 수십 개를 오가며 하던 조사, 정리, 게시, 점검. 이 반복 작업을 AI 브라우저 Aside에게 맡긴 사례를 소개합니다. 다른 사용자들의 대표 사례와 제가 직접 써 본 경험을 함께 담았습니다. 01 CONCEPT Aside는 어떤 브라우저일까? 한 줄 요약: "AI가 내 대신 웹사이트를 직접 조작해 주는 브라우저" 크롬이나 웨일은 사람이 직접 클릭하고 입력합니다. Aside는 여기에 AI 에이전트가 들어 있어서, "쿠팡에서 최근 주문한 커피 장바구니에 담아줘"처럼 말로 지시하면 AI가 화면을 읽고 클릭하고 입력하며 작업을 끝냅니다. 일반 브라우저 사람이 검색하고, 복사하고, 붙여넣고, 로그인하고, 정리합니다. 단계마다 내 손이 필요합니다. Aside 브라우저 목표만 말하면 AI가 여러 사이트를 오가며 여러 단계를 이어서 처리합니다. 사람은 확인과 승인만 합니다. 내 로그인 그대로 이미 로그인한 사이트를 그대로 조작합니다. 별도 연동이나 API 설정이 필요 없습니다. 스킬 · 루틴 · 메모리 한 번 시킨 방식을 스킬로 저장하고, 주간·일간 루틴으로 자동 반복하며, 내 선호를 기억합니다. 브라우저 + 내 컴퓨터 웹 작업뿐 아니라 내 PC의 파일 읽기, 영상·문서 생성 같은 작업도 함께 처리합니다. Lasso(올가미) 선택 화면 영역을 드래그하거나 동그라미로 지정해 "이 부분 정리해줘"라고 전달합니다. 복사·붙여넣기가 필요 없습니다. 외부 도구 연결 CLI, MCP, Skill로 코딩 에이전트와 연동하고 Slack으로 원격 지시도 가능합니다. 모델 선택 원하는 AI 모델을 연결해 속도와 비용을 조절할 수 있습니다. 사용자 중에는 저렴한 모델을 붙여 주력으로 쓰는 분도 있습니다. 02 BACKGROUND 왜 AI 브라우저가 나왔을까? 챗봇은 ...

항공권 예약 그 이상 — Hermes Agent 326개 실사용 사례로 본 '에이전트 시대'의 실제 모습

항공권 예약 그 이상 — Hermes Agent 326개 실사용 사례로 본 '에이전트 시대'의 실제 모습 2026-10-05 · Nous Research 공식 발표 분석 Nous Research가 자사 X 계정을 통해 "Hermes Agent는 항공권 예약 그 이상이다"라며 실제 사용자 326개 사례 모음을 공개했다 ( 원문 트윗 · 전체 목록 ). X, Reddit, GitHub, YouTube, 블로그, 팟캐스트, 링크드인 등 11개 채널에서 수집된 이 사례들은 "에이전트가 실험실을 벗어나 실제로 무엇을 하고 있는가"를 보여주는 꽤 정직한 스냅샷이다. 1. 숫자로 보는 구도 326개 사례는 15개 카테고리로 분류되어 있다. 압도적 1위는 역시 개발 워크플로우지만, 2위인 '개인 비서'가 전체의 15%를 차지한다는 점이 주목할 만하다 — 비개발자 사용자층이 결코 작지 않다는 뜻이다. Dev Workflow 77 Personal Assistant 49 Integrations 32 Creative 26 Business Ops 23 Meta & Ecosystem 23 Cost Optimization 20 Privacy & Self-Hosted 13 Content Creation 12 Research 12 Enterprise 12 Messaging 11 출처 채널: Discord 116 · X/Twitter 61 · Reddit 60 · GitHub 38 · Blog 20 · YouTube 17 · GitHub Gist 4 · Hacker News 4 · LinkedIn 3 · Podcast 2 · Product Hunt 1 2. 다섯 가지 패턴 ① "24시간 켜져 있는 직원" 서사가 압도적으로 많다 $175짜리 중고 Dell OptiPlex, 라즈베리파이5, 5년 된 고장난 GPU 노트북처럼 저사양 장비에서 Her...

Grok Bot 안에서 Claude와 Codex를 같이 부린다 — 내 구독 그대로 연결하는 법

AX NOTE Grok Bot 안에서 Claude와 Codex를 같이 부린다 — 내 구독 그대로 연결하는 법 글 · 찰리초이(최흥식 프로)  |  AX 컨설턴트, 유튜브 '찰리초이 스토리' Grok Bot은 자기만의 리눅스 컴퓨터, 그러니까 클라우드 박스를 하나 가지고 있는 AI 비서입니다. 이번에 그 컴퓨터에 Claude Code와 OpenAI Codex CLI를 설치하고, 제가 이미 결제 중인 Claude 구독과 ChatGPT 구독으로 로그인시켜 봤어요. 결과부터 말씀드리면, 별도의 API 키 결제 없이 구독 한도 안에서 그대로 돌아갑니다. 설정도 생각보다 훨씬 간단했고요. 제가 실제로 한 순서대로 정리해 볼게요. 왜 이게 획기적인가 핵심은 채팅 한 곳에서 세 AI에게 역할을 나눠 줄 수 있다는 점입니다. 창을 여러 개 띄우고 복사해서 붙여넣는 수고가 사라져요. 제가 쓰는 역할 분담은 아래와 같습니다. AI 역할 맡기는 일 Grok Bot 총괄 조사, 메일·일정, 영상·이미지, 다른 봇 조율 Claude 글쓰기 긴 한국어 글 (강의 원고, 발표 대본, 보고서) Codex 코드 코드 작성·수정, 자동화, 코드 리뷰 여기에 한쪽이 만들고 다른 쪽이 검토하는 교차검증 도 할 수 있습니다. 예를 들어 Codex가 짠 코드를 Claude가 읽어 보게 하거나, 그 반대로 시키는 식이에요. 혼자 쓸 때보다 실수를 잡아낼 기회가 늘어납니다. 설정 방법 — 실제로 한 순서 전체 과정은 5분 남짓 걸렸습니다. 대부분은 봇이 알아서 하고, 저는 로그인 승인만 눌러 주면 돼요. 채팅에 "Claude Code와 Codex를 사용해 내 Claude와 ChatGPT 구독에 연결해" 라고 말합니다. 봇이 자기 컴퓨터에 두 도구를 설치합니다. 아래 명령어를 실행해요. npm i -g @anthropic-ai/claude-code @openai/codex ...