Gemini Gems 만들기 — 감점제 AI 리뷰어 만드는 법

이미지
Gemini Gems로 감점제 AI 리뷰어를 만드는 방법이다. gemini.google.com에서 이름과 지시문을 입력하면 5분 안에 완성된다. 코딩 필요 없다. 만들고 나면 코드든 글이든 붙여넣을 때마다 “잘 짰습니다” 대신 감점 목록부터 나온다. Google Workspace를 쓰고 있다면 GPTs 대신 이쪽이 자연스럽다. Gemini도 칭찬부터 한다 Gemini에게 “이 코드 리뷰해줘”라고 하면 “잘 구현되었네요!”부터 나온다. ChatGPT, Claude 다 마찬가지다. AI는 칭찬하도록 훈련되어 있다. 이전 글 에서 ChatGPT GPTs로 감점제 리뷰어를 만드는 방법을 다뤘다. 이번에는 같은 원리를 Gemini Gems에 적용한다. Gemini를 주로 쓰는 사람이라면 이쪽이 맞다. Gems란 뭔가 Gems는 Gemini 안에서 만드는 맞춤형 AI다. 이름과 지시문을 설정하면 그 역할에 고정된 AI가 만들어진다. ChatGPT의 GPTs와 같은 기능이다. GPTs와의 차이는 Google 생태계 안에서 작동 한다는 점이다. Google Workspace를 쓰고 있다면 Gems 쪽이 자연스럽다. 그리고 Gems는 저장 전에 미리보기 로 바로 테스트할 수 있어서 지시문을 조정하기가 편하다. Gemini Gems로 감점제 리뷰어 만드는 방법 필요한 것: - Gemini Advanced (Google One AI Premium, 월 $19.99) - 웹 브라우저 매번 “솔직하게 말해줘”를 반복하는 시간이 쌓이면 한 달에 수십 번의 불필요한 타이핑이다. Gems로 한 번 고정하면 그 비용이 0이 된다. 1단계: Gems 생성 화면 열기 gemini.google.com 접속 좌측 메뉴 → Gems 탐색하기 새 Gem 클릭 2단계: 기본 정보 입력 이름 : 감점제 리뷰어 (또는 원하는 이름) 지시문 : 아래 내용을 그대로 붙여넣는다 3단계: 지시문 입력 이게 핵심이다. 이 지시문이 Gem의 행동...

ChatGPT GPTs 만들기 — 감점제 AI 리뷰어 만드는 법

이미지
ChatGPT GPTs로 감점제 AI 리뷰어를 만드는 방법이다. ChatGPT 화면에서 이름과 지시문을 입력하면 5분 안에 완성된다. 코딩 필요 없다. 만들고 나면 코드를 붙여넣을 때마다 “잘 짰습니다” 대신 감점 목록부터 나오는 리뷰어가 된다. 왜 ChatGPT 기본 리뷰로는 부족한가 ChatGPT에게 “이 코드 리뷰해줘”라고 하면 “전반적으로 잘 작성되었습니다”부터 나온다. 이건 ChatGPT가 거짓말을 하는 게 아니라 칭찬하도록 훈련된 결과다. RLHF(사용자가 ‘좋아요’를 누른 답변을 더 만드는 훈련)에서 기분 좋은 답변에 점수가 올라가니까 아첨을 학습한 것이다. “솔직하게 리뷰해줘”라고 써봐도 대화가 길어지면 다시 부드러워진다. 해결 방법은 GPTs로 역할 자체를 고정하는 것이다. GPTs란 뭔가 GPTs(Custom GPT)는 ChatGPT 안에서 만드는 맞춤형 AI다. 이름과 지시문을 설정하면 그 역할에 고정된 AI가 만들어진다. 매번 “솔직하게 말해줘”를 반복할 필요가 없어진다. 매번 지시를 반복하는 시간이 쌓이면 한 달에 수십 번의 불필요한 타이핑이다. GPTs로 역할을 한 번 고정하면 그 비용이 0이 된다. ChatGPT GPTs로 리뷰어 만드는 방법 1단계: GPTs 생성 화면 열기 ChatGPT 접속 좌측 메뉴 → GPTs 살펴보기 우측 상단 → 만들기 클릭 2단계: 기본 정보 입력 이름 : 감점제 리뷰어 (또는 원하는 이름) 설명 : 10점 만점에서 감점만 하는 코드/글 리뷰어. 칭찬 금지. 지시문 : 아래 시스템 프롬프트를 통째로 붙여넣는다 3단계: 시스템 프롬프트 입력 이게 핵심이다. 이 지시문이 GPT의 행동을 결정한다. 아래 내용을 “지시문” 칸에 그대로 붙여넣으면 된다. 내용을 이해할 필요 없다. 복사해서 붙여넣기만 하면 작동한다: 너는 코드와 글을 채점하는 심판이다. 규칙: - 10점 만점에서 감점만 한다. 가산점은 없다. - 칭찬은 금지다. “잘 ...

Claude Code 사용법 — 블로그 글 자동 발행 시스템 만들기

Claude Code로 블로그 자동 발행 스크립트를 만드는 방법이다. 마크다운 파일을 터미널에서 명령어 한 줄로 Blogspot에 발행한다. Google Cloud Console 설정 10분, Claude Code에 지시 20분, 테스트 5분이면 끝난다. 코드를 직접 쓰지 않고 Claude Code에게 지시만 해서 만들었다. Claude Code가 뭔가 터미널에서 “블로그 발행 자동화해줘”라고 치면 스크립트를 만들어주는 AI 코딩 도구다. Anthropic이 만들었다. IDE 플러그인이 아니라 독립 CLI 도구다. 프로젝트 폴더 전체를 읽고, 파일을 직접 생성하고 수정하고 실행까지 한다. 블로그 글 1편 올리는 데 15분이 걸렸다 Blogspot에 글을 올리려면 마크다운 → HTML 변환 → Blogger 접속 → 제목 입력 → HTML 모드 전환 → 본문 붙여넣기 → 라벨 설정 → 검색 설명 → 미리보기 → 발행. 1편에 15분. 한 달에 30편이면 7시간 이상을 “올리는 작업”에만 쓰는 셈이다. 글 쓰는 시간보다 올리는 시간이 더 길었다. 이걸 Claude Code에게 맡겼다. Claude Code에게 한 지시 터미널에서 Claude Code를 열고 이렇게 말했다: “마크다운 파일을 Blogger API v3으로 자동 발행하는 Python 스크립트를 만들어줘. frontmatter에서 제목, 라벨, 슬러그를 읽고, 마크다운을 HTML로 변환한 뒤, OAuth 2.0으로 인증해서 Blogger에 POST해줘. dry-run 옵션도 넣어줘.” Claude Code가 만든 것: publish.py 메인 스크립트 (약 200줄) requirements.txt 의존성 목록 config.json 설정 파일 OAuth(구글 로그인 인증) 흐름 (최초 1회 브라우저 인증 → 이후 자동) dry-run 모드 (발행 없이 HTML 미리보기) ...

AI 아첨을 감지하는 것과 줄이는 것은 다르다 — 감점제 AI 리뷰어를 만든 이유

왜 AI는 항상 "좋습니다"라고 하는가 AI에게 코드 리뷰를 시키면 "잘 짰습니다"부터 나온다. 이건 AI가 거짓말을 하는 게 아니라 칭찬하도록 훈련된 결과다. 프롬프트로 "솔직하게 말해줘"라고 해도 근본적으로 바뀌지 않는다. AI 모델은 사용자가 '좋아요'를 누른 답변을 더 많이 만들도록 훈련된다. 이 방식을 RLHF(인간 피드백 기반 강화학습)라고 한다. 문제는 사람이 정확한 답보다 기분 좋은 답에 '좋아요'를 더 많이 누른다는 것이다. AI 입장에서는 동의하면 점수가 올라가고, 칭찬하면 점수가 올라간다. 그래서 아첨을 학습한다. Anthropic이 이 문제를 직접 연구해서 논문으로 발표 했다. 2026년 3월에는 Stanford 연구팀이 AI 챗봇의 아첨이 "위험한 수준" 이라는 결과를 냈다. 코드 리뷰에서 이 문제가 특히 위험하다. 코드를 보여주면 "구조가 깔끔합니다"로 시작한다. 버그가 있어도 "전반적으로 잘 작성되었습니다"를 먼저 말하고 문제를 조심스럽게 언급한다. AI가 동의했으니까 맞겠지. 이 가정이 가장 위험하다. 감점제 — 칭찬할 구조가 없는 채점표 만든 도구의 이름은 brutal-review다. 원리는 단순하다. 10점 만점에서 시작해서 감점만 한다. 가산점이 없다. "잘한 점"을 말할 칸이 채점표에 없으니, AI가 칭찬을 끼워넣을 여지가 줄어든다. 실제 결과는 이렇게 나온다. SUDYA MYASNIK (The Butcher) — Final Scorecard ============================================== 종목 1. 구조적 정확성(Structural Correctness): 0.9 /...

맥스튜디오 도착 1주 전, 카페24가 오픈클로 VPS 를 풀었다 — 결정을 다시 한 5가지 기준

4월 중순에 맥스튜디오가 도착합니다. 그 1주 전인 어제, 카페24가 14,000원에 오픈클로(OpenClaw) VPS 를 풀었습니다. ( 헤럴드경제 보도 , 카페24 공식 페이지 ) 오픈클로는 2025년 11월에 공개된 후 두 달 만에 GitHub 스타 14만 개를 돌파한 오픈소스 AI 에이전트 프레임워크입니다 ( Milvus 가이드 ). 텔레그램·슬랙 같은 메신저와 OpenAI·Gemini 같은 LLM 을 연동해서 실제 작업을 수행하는 자율 에이전트 도구죠. 저는 2월부터 이걸 맥북 안에서 임시로 돌리고 있었습니다. 노트북 자원을 잡아먹는 게 부담이라, 맥스튜디오가 도착하면 거기에 본격적으로 셋업하려던 계획이었죠. 그 셋업 직전에 카페24가 14,000원이라는 가격으로 매니지드 옵션을 던졌습니다. "맥스튜디오에 오픈클로 셋업을 그대로 진행할까, 아니면 카페24로 갈아탈까?" 이 글은 AI 에이전트를 직접 운영 중이거나, 매니지드 호스팅 도입을 고민 중인 개발자 를 위한 글입니다. 어제 30분 동안 정리한 5가지 결정 기준 을 공유합니다. 카페24 출시를 계기로 정리하지만, 이 기준은 카페24에만 적용되는 게 아니라 모든 AI 에이전트 자가 호스팅 결정 에 적용됩니다. 1. 사용 시간 — 매일 8시간 이상인가, 주 1~2회인가 자가 호스팅의 모든 비용 (시간, 학습, 유지보수) 이 정당화되려면 충분한 사용량이 필요합니다. 매일 8시간 이상 : 셀프 호스팅의 한계 비용이 0에 가까워짐. 정당화됨. 주 1~2회 : 매니지드가 시간/심리적 부담 모두 적음. 14,000원의 가치가 명확. 저는 매일 8시간 이상 사용하는 케이스라 직접 호스팅 쪽으로 기울었습니다. 만약 가끔만 쓰는 상황이라면 카페24가 압도적으로 합리적인 선택입니다. 2. 데이터 민감도 — 사내 코드인가, 공개 가능한 작업인가 매니지드 호스팅은 데이터가 외부 서버를 통과합니다. 법적으로 문제 없지만...

LSTM 네트워크 이해하기

이미지
 이 글은 http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 를 번역하여 정리한 글입니다. -------------------------------------------------------------------------  RNN(Recurrent Neural Network)은 히든 노드가 방향을가진 엣지로 연결되어 순환 구조를 이루는 Neural Network의 한 종류이다. RNN이 기존 Neural Network와 다른 점은 지금 들어온 입력 데이터와 과거에 입력 받았던 데이터를 동시에 고려한다는 점이다. 순환 신경망은 내부에 정보가 지속되는 것을 돕는 순환 구조를 가진 네트워크이며, 과거의 데이터가 미래에 영향을 주는 구조를 가지고 있다. [그림 1] RNN의 기본구조  [그림 1]에서 신경망 A는 $X_t$를 입력 값으로 가지고 $h_t$를 결과 값으로 출력한다. 루프는 정보가 전 단계의 네트워크에서 그 다음 단계로 전달되도록 한다. 순환 신경망은 하나의 네트워크가 여러 개로 복사된 형태를 보이고 있는데, 각각의 네트워크는 현재 갖고있는 정보를 다음 단계로 넘겨준다. [ 그림 2] 펼쳐진 순환 신경망    [그림 2]는 [그림 1]의 순환 구조를 펼쳐 놓은 것이다. RNN의 사슬 같은 모양을 통해 RNN이 시퀀스와 리스트를 처리하는 것과 관련이 있음을 알 수 있다. 따라서 순환 신경망은 연속적인 이벤트, 리스트에 관한 문제를 해결하기 위한 알고리즘으로 적절하기 때문에 시계열 모형 수립에 활용할 수 있다. 순환 신경망의 단점 중 하나는 정보가 오래된 정보를 현재 정보에 반영할 수 없다는 점이다. 이를 해결하기 위해 나타난 것이 LSTM이다. LSTM의 기본 동작 원리는 정보를 오랫동안 기억하는 것이며 [그림 3]은 LSTM의 구조를 나타낸 그림이...

[알고리즘] 파이썬으로 Trie 구현하기(2)

이미지
 1편에 이어 2편이다. 지난 장에서는 trie의 간단한 개념과 생성과 입력 기능에 대해 알아보았다. 이번 편에서는 조회와 삭제에 대해 알아보도록 하겠다. 접두어로 검색  Trie의 가장 큰 장점이라고 생각하는 접두어 검색 기능이다. 단어의 일부분으로 전체단어를 검색할 수 있다. 예를들어 trie에 gold, good, gerald를 저장한 다음 검색어에 g를 입력하면 gold, good, gerald를 모두 검색할 수 있다. 이런 기능은 검색어 자동완성에 쓰인다고 한다. 우선 검색 부분의 코드를 보도록 하겠다. def search_with_prefix(self, prefix): words = list() if prefix is None: raise ValueError('Requires not-Null prefix') top_node = self.head for letter in prefix: if letter in top_node.children: top_node = top_node.children[letter] else: return words if top_node == self.head: queue = [node for key, node in top_node.children.items()] else: queue = [top_node] while queue: current_node = queue.pop() if current_node.data is not None: words.append(current_node.data) queue = [node f...