<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://blog.jagaldol.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.jagaldol.com/" rel="alternate" type="text/html" /><updated>2026-06-02T10:38:07+09:00</updated><id>https://blog.jagaldol.com/feed.xml</id><title type="html">자갈돌의 devLog</title><subtitle>jagaldol&apos;s coding/development blog.</subtitle><author><name>Hyejun An(26)</name><email>jagaldol.dev@gmail.com</email></author><entry><title type="html">ChatGPT Images 2.0 출시 - 이미지 생성조차 1위를 차지한 OpenAI</title><link href="https://blog.jagaldol.com/ai/chatgpt-images-2-0-release/" rel="alternate" type="text/html" title="ChatGPT Images 2.0 출시 - 이미지 생성조차 1위를 차지한 OpenAI" /><published>2026-04-30T17:36:44+09:00</published><updated>2026-04-30T17:36:44+09:00</updated><id>https://blog.jagaldol.com/ai/chatgpt-images-2-0-release</id><content type="html" xml:base="https://blog.jagaldol.com/ai/chatgpt-images-2-0-release/"><![CDATA[<p>OpenAI가 <a href="https://openai.com/index/introducing-chatgpt-images-2-0/">ChatGPT Images 2.0</a>(모델 ID <code class="language-plaintext highlighter-rouge">gpt-image-2</code>)을 공개했다.
이미지 생성의 약점이던 <strong>텍스트·다국어·일관성</strong>을 크게 끌어올리고,
대화형 편집과 프롬프트 재작성까지 하나의 흐름으로 묶은 OpenAI의 새 이미지 생성 모델이다.</p>

<table>
  <thead>
    <tr>
      <th>항목</th>
      <th>내용</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>공식명</td>
      <td><code class="language-plaintext highlighter-rouge">ChatGPT Images 2.0</code> (모델 ID <code class="language-plaintext highlighter-rouge">gpt-image-2</code>)</td>
    </tr>
    <tr>
      <td>공개일</td>
      <td>2026-04-21 (ChatGPT, API, Codex)</td>
    </tr>
    <tr>
      <td>이전 흐름</td>
      <td><code class="language-plaintext highlighter-rouge">gpt-image-1</code> → <code class="language-plaintext highlighter-rouge">gpt-image-1.5</code> → <code class="language-plaintext highlighter-rouge">gpt-image-2</code></td>
    </tr>
    <tr>
      <td>접근 경로</td>
      <td>ChatGPT + OpenAI API + Codex</td>
    </tr>
    <tr>
      <td>가격 (API)</td>
      <td>1024×1024 기준 <code class="language-plaintext highlighter-rouge">low</code> 약 $0.006, <code class="language-plaintext highlighter-rouge">medium</code> 약 $0.053, <code class="language-plaintext highlighter-rouge">high</code> 약 $0.211</td>
    </tr>
    <tr>
      <td>해상도</td>
      <td>1024×1024부터 2K, 실험적 4K급 출력까지 지원</td>
    </tr>
    <tr>
      <td>폐기 대상</td>
      <td><code class="language-plaintext highlighter-rouge">dall-e-2</code>, <code class="language-plaintext highlighter-rouge">dall-e-3</code> API 스냅샷: 2026-05-12 종료 예정</td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p>Weekly Tech Trend Talk 스터디(26.04.23)</p>
</blockquote>

<h2 id="공개-전부터-화제였던-duct-tape">공개 전부터 화제였던 “Duct Tape”</h2>

<p>사실 이 모델, 공식 발표 <strong>이전부터</strong> 커뮤니티를 들썩이게 만들었다.
2026-04-04 LMArena image arena에 세 개의 익명 변종이 조용히 등장했고,
이름이 모두 접착 테이프 계열이라 커뮤니티는 통칭 “Duct Tape”으로 불렀다.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">maskingtape-alpha</code></li>
  <li><code class="language-plaintext highlighter-rouge">gaffertape-alpha</code></li>
  <li><code class="language-plaintext highlighter-rouge">packingtape-alpha</code></li>
</ul>

<p>특히 한글·중국어·일본어 텍스트 렌더링이 압도적이라 아시아권 커뮤니티가 먼저 발견해 퍼뜨렸다.
며칠 뒤 세 변종은 아레나에서 조용히 제거됐고,
“신모델 사전 테스트다”라는 해석이 정설로 굳어졌다.
2026-04-21 ChatGPT Images 2.0이 공식 출시되면서 “그 Duct Tape이 이거였다”가 확정됐다.</p>

<p><img src="/assets/images/2026/04/30/gpt-image-2-duct-tape-arena.png" alt="LMArena Duct Tape 변종" /></p>

<p>지금도 Arena Text-to-Image Overall <strong>1위</strong>다.
<code class="language-plaintext highlighter-rouge">gpt-image-2 (medium)</code> 1,512점, 2위 <code class="language-plaintext highlighter-rouge">gemini-3.1-flash-image-preview</code> 1,270점으로 <strong>+242점 차이</strong>가 난다.
공개 전 익명 모델로 먼저 화제가 됐고, 출시 후에도 리더보드 상단을 유지하고 있다.</p>

<h3 id="그럼-세-변종은-각각-뭐였을까">그럼 세 변종은 각각 뭐였을까?</h3>

<p>OpenAI는 세 코드명의 의미를 공개하지 않았다. 커뮤니티 해석은 크게 두 갈래다.</p>

<p><strong>가설 A: 기능 분화설</strong></p>

<table>
  <thead>
    <tr>
      <th>익명 코드명</th>
      <th>테이프의 실제 용도</th>
      <th>추정 역할</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">maskingtape-alpha</code></td>
      <td>칠할 때 <em>가려두는</em> 테이프</td>
      <td>편집 / inpaint 강화형</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">gaffertape-alpha</code></td>
      <td>촬영장에서 쓰는 강력 전문 테이프</td>
      <td>고급 / 최종 품질형</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">packingtape-alpha</code></td>
      <td>박스 포장 테이프</td>
      <td>배치 / 대량 생성형</td>
    </tr>
  </tbody>
</table>

<p><strong>가설 B: 모드 매핑설</strong></p>

<table>
  <thead>
    <tr>
      <th>익명 코드명</th>
      <th>추정 매핑</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">maskingtape-alpha</code>, <code class="language-plaintext highlighter-rouge">gaffertape-alpha</code></td>
      <td>Instant Mode (빠른 즉시 생성)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">packingtape-alpha</code></td>
      <td>Thinking Mode (최대 2분 추론)</td>
    </tr>
  </tbody>
</table>

<p>세 변종과 실제 출시 모델의 1:1 대응은 공개되지 않았다.
출시 후 공개된 API에서는 <code class="language-plaintext highlighter-rouge">gpt-image-2</code> 단일 모델과 <code class="language-plaintext highlighter-rouge">quality</code> 파라미터(<code class="language-plaintext highlighter-rouge">low</code> / <code class="language-plaintext highlighter-rouge">medium</code> / <code class="language-plaintext highlighter-rouge">high</code>)가 핵심이다.</p>

<h2 id="dalle에서-gpt-image로">DALL·E에서 GPT Image로</h2>

<p>먼저 이름부터 정리해야 한다.
DALL·E는 OpenAI의 이전 이미지 생성 모델 라인이고,
GPT Image는 2025년부터 ChatGPT·API·Codex 이미지 생성을 묶어 가는 새 모델 패밀리다.</p>

<table>
  <thead>
    <tr>
      <th>시기</th>
      <th>모델 / 제품</th>
      <th>의미</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>2021-01</td>
      <td><code class="language-plaintext highlighter-rouge">DALL·E</code></td>
      <td>텍스트 프롬프트로 이미지를 만드는 OpenAI 초기 연구 모델</td>
    </tr>
    <tr>
      <td>2022</td>
      <td><code class="language-plaintext highlighter-rouge">DALL·E 2</code></td>
      <td>현실감, 편집, variation을 강화하며 제품형 이미지 생성으로 진화</td>
    </tr>
    <tr>
      <td>2023</td>
      <td><code class="language-plaintext highlighter-rouge">DALL·E 3</code></td>
      <td>ChatGPT가 사용자의 요청을 더 좋은 프롬프트로 바꿔 이미지 모델에 넘기는 흐름이 본격화</td>
    </tr>
    <tr>
      <td>2025-03</td>
      <td><code class="language-plaintext highlighter-rouge">GPT-4o Image Generation</code> / ChatGPT Images 1.0</td>
      <td>ChatGPT 안에서 이미지 생성이 대화형 기능으로 들어오기 시작</td>
    </tr>
    <tr>
      <td>2025-04</td>
      <td><code class="language-plaintext highlighter-rouge">gpt-image-1</code></td>
      <td>GPT Image 패밀리의 첫 API 모델. DALL·E 이후의 새 이미지 API 라인</td>
    </tr>
    <tr>
      <td>2025-12</td>
      <td><code class="language-plaintext highlighter-rouge">gpt-image-1.5</code></td>
      <td><code class="language-plaintext highlighter-rouge">gpt-image-1</code> 개선판. 편집 안정성, 지시 이행, 속도와 비용 효율 보강</td>
    </tr>
    <tr>
      <td>2026-04</td>
      <td><code class="language-plaintext highlighter-rouge">gpt-image-2</code> / ChatGPT Images 2.0</td>
      <td>텍스트·다국어·레이아웃·참조 이미지·고해상도 워크플로를 크게 강화한 최신 세대</td>
    </tr>
  </tbody>
</table>

<p>핵심 변화는 “DALL·E 이름이 GPT Image로 바뀌었다”가 아니다.
DALL·E 3까지는 이미지 전용 모델에 ChatGPT가 프롬프트를 잘 써주는 느낌이 강했다면,
GPT Image 계열은 <strong>생성·편집·참조 이미지·멀티턴 대화를 하나의 작업 흐름으로 묶는</strong> 쪽으로 진화하고 있다.</p>

<table>
  <thead>
    <tr>
      <th>항목</th>
      <th><code class="language-plaintext highlighter-rouge">gpt-image-1</code> / <code class="language-plaintext highlighter-rouge">gpt-image-1.5</code></th>
      <th><code class="language-plaintext highlighter-rouge">gpt-image-2</code></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>대표 위치</td>
      <td>GPT Image API 1세대와 중간 개선판</td>
      <td>ChatGPT Images 2.0의 API 모델</td>
    </tr>
    <tr>
      <td>API 흐름</td>
      <td>단일 이미지 생성·편집 중심</td>
      <td>단일 작업은 Image API, 대화형·멀티턴 편집은 Responses API 권장</td>
    </tr>
    <tr>
      <td>텍스트 렌더링</td>
      <td>개선됐지만 텍스트 밀도 높은 이미지에서는 실패가 남음</td>
      <td>더 선명한 글자, 일관된 레이아웃, 다국어 텍스트 렌더링 개선</td>
    </tr>
    <tr>
      <td>다국어 스크립트</td>
      <td>제한적</td>
      <td>한글·CJK·남아시아권 문자 등 글로벌 스크립트 대응 강화</td>
    </tr>
    <tr>
      <td>일관성</td>
      <td>단일 이미지와 간단한 편집 중심</td>
      <td>참조 이미지·멀티턴 편집에서 인물·제품·브랜드 요소 보존 강화</td>
    </tr>
    <tr>
      <td>해상도</td>
      <td><code class="language-plaintext highlighter-rouge">1024x1024</code>, <code class="language-plaintext highlighter-rouge">1024x1536</code>, <code class="language-plaintext highlighter-rouge">1536x1024</code> 중심</td>
      <td>제약 조건 안에서 유연한 size 지원. 2K 초과는 실험적</td>
    </tr>
    <tr>
      <td>Reasoning</td>
      <td>이미지 생성 전 의도 해석은 제한적</td>
      <td>메인 대화 모델의 요청 해석·프롬프트 재작성과 <code class="language-plaintext highlighter-rouge">gpt-image-2</code>의 시각 구성력이 결합</td>
    </tr>
  </tbody>
</table>

<p>DALL·E API 스냅샷은 2026-05-12부로 종료된다.
새 이미지 생성 작업은 이제 <code class="language-plaintext highlighter-rouge">gpt-image-2</code>를 기본 선택지로 두고 보는 편이 자연스럽다.</p>

<h2 id="무엇이-바뀌었나-개선의-네-축">무엇이 바뀌었나: 개선의 네 축</h2>

<table>
  <thead>
    <tr>
      <th>축</th>
      <th>체감 포인트</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>텍스트 렌더링</strong></td>
      <td>라틴·CJK·힌디·벵갈리 같은 다국어 텍스트 렌더링이 크게 개선. 포스터·메뉴·인포그래픽 같은 실사용 이미지에 강함</td>
    </tr>
    <tr>
      <td><strong>다국어 혼합 레이아웃</strong></td>
      <td>한글·일본·중국·영어가 한 이미지에 섞여도 각 스크립트 규칙을 지킴</td>
    </tr>
    <tr>
      <td><strong>참조 이미지·편집 일관성</strong></td>
      <td>멀티턴 편집과 참조 이미지 기반 작업에서 같은 캐릭터·제품·브랜드 요소를 더 잘 유지</td>
    </tr>
    <tr>
      <td><strong>Reasoning / planning</strong></td>
      <td>구조·레이아웃·세계지식 이해와 메인 대화 모델의 프롬프트 재작성·도구 호출이 결합된 흐름</td>
    </tr>
  </tbody>
</table>

<p>수치·공식 제약 근거는 다음과 같다.</p>

<ul>
  <li>LMArena Image Arena 1,512 Elo, 2위와 +242pt 마진</li>
  <li><code class="language-plaintext highlighter-rouge">gpt-image-2</code>는 최대 edge 3840px, 비율 3:1 이내, 총 8,294,400px 이하의 유연한 해상도 지원</li>
  <li>OpenAI 프롬프트 가이드는 핵심 능력으로 photorealism, identity preservation, reliable text rendering, structured visuals, real-world knowledge/reasoning을 명시</li>
</ul>

<p><img src="/assets/images/2026/04/30/gpt-image-2-text-rendering-sample.png" alt="다국어 텍스트 렌더링 샘플" /></p>

<h2 id="이미지-생성에서-말하는-reasoning">이미지 생성에서 말하는 Reasoning</h2>

<p>여기서 reasoning은 모델의 생각을 문장으로 보여준다는 뜻이 아니다.
사용자의 요청을 이미지로 바꾸기 전에
<strong>무엇을 그려야 하는지, 어떤 레이아웃이 맞는지, 어떤 정보와 맥락을 유지해야 하는지</strong>를
더 잘 구조화한다는 의미에 가깝다.</p>

<table>
  <thead>
    <tr>
      <th>질문</th>
      <th>답</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>reasoning token이 따로 보이나?</td>
      <td>아니다. 외부에 보이는 것은 텍스트 응답, <code class="language-plaintext highlighter-rouge">image_generation_call</code>, <code class="language-plaintext highlighter-rouge">revised_prompt</code>, 최종 이미지다.</td>
    </tr>
    <tr>
      <td>자연어 답변을 하다가 이미지 생성으로 넘어가나?</td>
      <td>반드시 그런 순서는 아니다. API 응답에서는 텍스트 메시지와 이미지 생성 호출이 별도 아이템으로 분리된다.</td>
    </tr>
    <tr>
      <td>ChatGPT가 프롬프트를 대신 다듬나?</td>
      <td>Responses API에서는 메인 대화 모델이 프롬프트를 자동 개선하고 <code class="language-plaintext highlighter-rouge">revised_prompt</code>로 남긴다.</td>
    </tr>
    <tr>
      <td>그래서 기존 프롬프트 래퍼와 뭐가 다른가?</td>
      <td>대화 맥락, 참조 이미지, 멀티턴 편집, generate/edit 선택이 하나의 흐름으로 묶인다.</td>
    </tr>
  </tbody>
</table>

<p>실제 API 흐름은 다음처럼 이해하면 된다.</p>

<table>
  <thead>
    <tr>
      <th>단계</th>
      <th>역할</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>요청 해석</td>
      <td><code class="language-plaintext highlighter-rouge">gpt-5.4</code> 같은 메인 대화 모델이 사용자의 의도를 읽는다.</td>
    </tr>
    <tr>
      <td>프롬프트 재작성</td>
      <td>이미지 모델이 잘 그릴 수 있도록 요청을 더 구체화한다.</td>
    </tr>
    <tr>
      <td>이미지 도구 호출</td>
      <td><code class="language-plaintext highlighter-rouge">image_generation</code> 도구가 호출된다.</td>
    </tr>
    <tr>
      <td>렌더링</td>
      <td><code class="language-plaintext highlighter-rouge">gpt-image-2</code>가 최종 이미지를 만든다.</td>
    </tr>
    <tr>
      <td>후속 편집</td>
      <td>이전 응답이나 이미지 ID를 이어받아 다시 수정한다.</td>
    </tr>
  </tbody>
</table>

<p>핵심은 “이미지 모델이 속으로 생각한다”가 아니라 <strong>이미지 생성이 대화형 작업 흐름 안으로 들어왔다</strong>는 점이다.
이제 사용자는 프롬프트를 한 번 던지는 사람이 아니라,
결과물을 보며 계속 디렉팅하는 사람에 가까워진다.</p>

<h2 id="어디서-누가-어떻게-쓰나">어디서, 누가, 어떻게 쓰나</h2>

<h3 id="플랫폼">플랫폼</h3>

<table>
  <thead>
    <tr>
      <th>경로</th>
      <th>상태</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ChatGPT 앱</td>
      <td>2026-04-21 공개</td>
    </tr>
    <tr>
      <td>OpenAI API (<code class="language-plaintext highlighter-rouge">gpt-image-2</code>)</td>
      <td>2026-04-21 공개</td>
    </tr>
    <tr>
      <td>Codex</td>
      <td>2026-04-21 공개. Codex 내장 이미지 생성은 <code class="language-plaintext highlighter-rouge">gpt-image-2</code> 사용</td>
    </tr>
  </tbody>
</table>

<h3 id="api-핵심-옵션">API 핵심 옵션</h3>

<table>
  <thead>
    <tr>
      <th>옵션</th>
      <th>의미</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">quality</code></td>
      <td><code class="language-plaintext highlighter-rouge">low</code> / <code class="language-plaintext highlighter-rouge">medium</code> / <code class="language-plaintext highlighter-rouge">high</code>로 속도와 품질을 조절</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">size</code></td>
      <td>정사각형, 세로형, 가로형, 2K, 4K급 출력 크기 지정</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">action</code></td>
      <td>새 이미지 생성과 기존 이미지 편집을 자동 선택하거나 강제</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">format</code></td>
      <td><code class="language-plaintext highlighter-rouge">PNG</code>, <code class="language-plaintext highlighter-rouge">JPEG</code>, <code class="language-plaintext highlighter-rouge">WebP</code> 출력 선택</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">compression</code></td>
      <td><code class="language-plaintext highlighter-rouge">JPEG</code> / <code class="language-plaintext highlighter-rouge">WebP</code> 압축률 조절</td>
    </tr>
  </tbody>
</table>

<h3 id="입출력-포맷">입출력 포맷</h3>

<p>지원 입력은 텍스트 프롬프트(다국어 포함), 참조 이미지(style reference), 마스크(inpaint), 멀티턴 대화형 편집이다.
출력은 다음과 같이 조절한다.</p>

<table>
  <thead>
    <tr>
      <th>항목</th>
      <th>옵션</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>포맷</td>
      <td><code class="language-plaintext highlighter-rouge">PNG</code> (기본) / <code class="language-plaintext highlighter-rouge">JPEG</code> / <code class="language-plaintext highlighter-rouge">WebP</code></td>
    </tr>
    <tr>
      <td>압축</td>
      <td><code class="language-plaintext highlighter-rouge">output_compression</code> 0~100%</td>
    </tr>
    <tr>
      <td>품질</td>
      <td><code class="language-plaintext highlighter-rouge">low</code> / <code class="language-plaintext highlighter-rouge">medium</code> / <code class="language-plaintext highlighter-rouge">high</code></td>
    </tr>
    <tr>
      <td>해상도</td>
      <td><code class="language-plaintext highlighter-rouge">1024x1024</code>, <code class="language-plaintext highlighter-rouge">1536x1024</code>, <code class="language-plaintext highlighter-rouge">2048x2048</code>, <code class="language-plaintext highlighter-rouge">3840x2160</code> 등</td>
    </tr>
    <tr>
      <td>비율</td>
      <td>최대 3:1</td>
    </tr>
    <tr>
      <td>멀티턴 편집</td>
      <td>이전 이미지나 응답을 이어받아 다시 수정</td>
    </tr>
    <tr>
      <td>투명 배경</td>
      <td>직접 출력은 미지원. 배경 제거 후처리로 해결</td>
    </tr>
  </tbody>
</table>

<h3 id="대표-활용">대표 활용</h3>

<table>
  <thead>
    <tr>
      <th>작업</th>
      <th>활용 포인트</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>신규 생성</td>
      <td>텍스트 → 이미지</td>
    </tr>
    <tr>
      <td>편집(inpaint)</td>
      <td>마스크 영역만 교체, 나머지 보존</td>
    </tr>
    <tr>
      <td>스타일 전이</td>
      <td>참조 이미지의 스타일 적용</td>
    </tr>
    <tr>
      <td>다국어 텍스트</td>
      <td>포스터·메뉴·간판 한글·CJK 직접 렌더링</td>
    </tr>
    <tr>
      <td>인포그래픽</td>
      <td>데이터·범례·색상 의미론 고려</td>
    </tr>
    <tr>
      <td>다중 패널 만화</td>
      <td>말풍선·페이싱·캐릭터 일관</td>
    </tr>
    <tr>
      <td>UI 목업</td>
      <td>타이포·레이아웃 추론</td>
    </tr>
    <tr>
      <td>제품 컨셉 이미지</td>
      <td>동일 제품 여러 앵글 유지</td>
    </tr>
  </tbody>
</table>

<h2 id="가격">가격</h2>

<p>API 가격은 text token, image input token, image output token을 합산한다.
첫 추산은 “이미지 한 장당 대략 얼마인가”에서 시작하면 된다.</p>

<table>
  <thead>
    <tr>
      <th>1024×1024 기준</th>
      <th style="text-align: right">예상 비용</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">low</code></td>
      <td style="text-align: right">약 $0.006 / image</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">medium</code></td>
      <td style="text-align: right">약 $0.053 / image</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">high</code></td>
      <td style="text-align: right">약 $0.211 / image</td>
    </tr>
  </tbody>
</table>

<table>
  <thead>
    <tr>
      <th>토큰 단가</th>
      <th style="text-align: right">입력</th>
      <th style="text-align: right">Cached 입력</th>
      <th style="text-align: right">출력</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Image</td>
      <td style="text-align: right">$8 / 1M</td>
      <td style="text-align: right">$2 / 1M</td>
      <td style="text-align: right">$30 / 1M</td>
    </tr>
    <tr>
      <td>Text</td>
      <td style="text-align: right">$5 / 1M</td>
      <td style="text-align: right">$1.25 / 1M</td>
      <td style="text-align: right">$10 / 1M</td>
    </tr>
  </tbody>
</table>

<p>참조 이미지가 많거나 멀티턴 편집이 길어질수록 입력 토큰 비용도 함께 늘어난다.</p>

<h2 id="공식이-밀고-있는-활용-카테고리">공식이 밀고 있는 활용 카테고리</h2>

<table>
  <thead>
    <tr>
      <th>카테고리</th>
      <th>예시</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>다국어 마케팅</td>
      <td>로컬라이즈된 광고·SNS 이미지</td>
    </tr>
    <tr>
      <td>인포그래픽</td>
      <td>리서치 요약, 통계 시각화</td>
    </tr>
    <tr>
      <td>메뉴판·포스터</td>
      <td>식당·행사·공연 실사용 가능한 타이포</td>
    </tr>
    <tr>
      <td>UI 프로토타이핑</td>
      <td>앱 화면 mock, 랜딩 페이지</td>
    </tr>
    <tr>
      <td>다중 패널 만화</td>
      <td>짧은 웹툰, 스토리보드</td>
    </tr>
    <tr>
      <td>매거진 레이아웃</td>
      <td>표지, 본문 페이지</td>
    </tr>
    <tr>
      <td>슬라이드</td>
      <td>발표 자료 키비주얼</td>
    </tr>
  </tbody>
</table>

<p><img src="/assets/images/2026/04/30/gpt-image-2-infographic-sample.png" alt="인포그래픽 샘플" /></p>

<h2 id="한계와-주의점">한계와 주의점</h2>

<table>
  <thead>
    <tr>
      <th>주의점</th>
      <th>이유</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>복잡한 요청은 느리다</td>
      <td>고품질, 고해상도, 참조 이미지, 멀티턴 편집이 붙을수록 대기 시간이 길어진다</td>
    </tr>
    <tr>
      <td>비용 차이가 크다</td>
      <td><code class="language-plaintext highlighter-rouge">low</code>와 <code class="language-plaintext highlighter-rouge">high</code>의 이미지당 비용 차이가 크므로 대량 생성은 품질 전략이 필요하다</td>
    </tr>
    <tr>
      <td>사실 정확도는 검증해야 한다</td>
      <td>지도, 과학 도해, 수치, 해부학처럼 정확성이 중요한 이미지는 별도 검수가 필요하다</td>
    </tr>
    <tr>
      <td>투명 배경은 후처리 영역</td>
      <td><code class="language-plaintext highlighter-rouge">gpt-image-2</code>는 투명 배경 직접 출력을 지원하지 않는다</td>
    </tr>
    <tr>
      <td>권리 이슈가 남는다</td>
      <td>실제 인물, 로고, 브랜드, IP가 들어가는 이미지는 사용 권한과 정책을 따로 봐야 한다</td>
    </tr>
  </tbody>
</table>

<p>Google Nano Banana Pro, Midjourney, Ideogram 등 이미지 생성 경쟁자도 공격적이다.
<code class="language-plaintext highlighter-rouge">gpt-image-2</code>의 우위는 오래 고정되지 않을 수 있다.
특히 <strong>텍스트 렌더링 격차는 빠르게 좁혀질 가능성</strong>이 높다.</p>

<h2 id="결론">결론</h2>

<p>DALL·E 3의 최대 약점이었던 <strong>텍스트·다국어·일관성</strong>을 크게 개선했고,
reasoning 모델과 이미지 생성 도구가 결합된 <strong>agentic image workflow</strong>를 주류화했다.</p>

<table>
  <thead>
    <tr>
      <th>상황</th>
      <th>권장</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>다국어·CJK 포스터·메뉴·인포그래픽</td>
      <td><code class="language-plaintext highlighter-rouge">gpt-image-2</code> 1순위</td>
    </tr>
    <tr>
      <td>동일 캐릭터·제품 연작</td>
      <td><code class="language-plaintext highlighter-rouge">gpt-image-2</code> + 참조 이미지·멀티턴 편집</td>
    </tr>
    <tr>
      <td>복잡한 레이아웃·텍스트 밀도 높은 이미지</td>
      <td><code class="language-plaintext highlighter-rouge">medium</code> / <code class="language-plaintext highlighter-rouge">high</code> 품질과 구조화된 프롬프트 활용</td>
    </tr>
    <tr>
      <td>실시간 대량 생성</td>
      <td><code class="language-plaintext highlighter-rouge">quality: low</code>부터 검증하거나 경량 모델 병행</td>
    </tr>
    <tr>
      <td>사실 정확도가 중요한 지도·과학 이미지</td>
      <td>결과물을 <strong>반드시 검증</strong></td>
    </tr>
  </tbody>
</table>

<p>이미지 생성은 더 이상 “프롬프트 한 줄로 결과를 받는” 작업이 아니다.
대화 맥락 위에서 디렉팅하고 편집하는 흐름으로 옮겨가고 있고,
<code class="language-plaintext highlighter-rouge">gpt-image-2</code>는 그 흐름의 현재 기준선이다.</p>

<h2 id="참고-자료">참고 자료</h2>

<h3 id="1차-공식-자료">1차 공식 자료</h3>

<ul>
  <li><a href="https://openai.com/index/dall-e/">DALL·E: Creating images from text</a></li>
  <li><a href="https://openai.com/index/dall-e-2/">DALL·E 2</a></li>
  <li><a href="https://openai.com/index/dall-e-3/">DALL·E 3</a></li>
  <li><a href="https://openai.com/index/introducing-4o-image-generation/">Introducing 4o Image Generation</a></li>
  <li><a href="https://openai.com/index/image-generation-api/">Introducing our latest image generation model in the API</a></li>
  <li><a href="https://openai.com/index/new-chatgpt-images-is-here/">The new ChatGPT Images is here</a></li>
  <li><a href="https://openai.com/index/introducing-chatgpt-images-2-0/">Introducing ChatGPT Images 2.0</a></li>
  <li><a href="https://developers.openai.com/api/docs/guides/image-generation">Image generation guide</a></li>
  <li><a href="https://developers.openai.com/api/docs/models/gpt-image-2">gpt-image-2 모델 페이지</a></li>
  <li><a href="https://developers.openai.com/cookbook/examples/multimodal/image-gen-models-prompting-guide">GPT Image Generation Models Prompting Guide</a></li>
  <li><a href="https://community.openai.com/t/introducing-gpt-image-2-available-today-in-the-api-and-codex/1379479">Introducing gpt-image-2: available in API and Codex</a></li>
</ul>

<h3 id="외부-평가-자료">외부 평가 자료</h3>

<ul>
  <li>TechCrunch: <a href="https://techcrunch.com/2026/04/21/chatgpts-new-images-2-0-model-is-surprisingly-good-at-generating-text/">ChatGPT’s new Images 2.0 model is surprisingly good at generating text</a></li>
  <li>The Decoder: <a href="https://the-decoder.com/openais-chatgpt-images-2-0-thinks-before-it-generates-adding-reasoning-and-web-search-to-image-creation/">ChatGPT Images 2.0 thinks before it generates</a></li>
  <li>VentureBeat: <a href="https://venturebeat.com/technology/openais-chatgpt-images-2-0-is-here-and-it-does-multilingual-text-full-infographics-slides-maps-even-manga-seemingly-flawlessly/">Multilingual text, infographics, slides, maps, even manga seemingly flawlessly</a></li>
  <li>Axios: <a href="https://www.axios.com/2026/04/21/chatgpt-images-major-update">Images in ChatGPT major update</a></li>
  <li>The New Stack: <a href="https://thenewstack.io/chatgpt-images-20-openai/">ChatGPT Images 2.0</a></li>
  <li>DEV Community: <a href="https://dev.to/ji_ai/openais-duct-tape-model-appeared-on-arena-then-vanished-2afn">OpenAI’s ‘duct-tape’ model appeared on Arena, then vanished</a></li>
</ul>]]></content><author><name>Hyejun An(26)</name><email>jagaldol.dev@gmail.com</email></author><category term="ai" /><summary type="html"><![CDATA[OpenAI가 ChatGPT Images 2.0(모델 ID gpt-image-2)을 공개했다. 이미지 생성의 약점이던 텍스트·다국어·일관성을 크게 끌어올리고, 대화형 편집과 프롬프트 재작성까지 하나의 흐름으로 묶은 OpenAI의 새 이미지 생성 모델이다.]]></summary></entry><entry><title type="html">Claude Opus 4.7 출시 - 업무형 에이전트로 무게가 실린 업데이트</title><link href="https://blog.jagaldol.com/ai/claude-opus-4-7-release/" rel="alternate" type="text/html" title="Claude Opus 4.7 출시 - 업무형 에이전트로 무게가 실린 업데이트" /><published>2026-04-23T16:21:36+09:00</published><updated>2026-04-23T16:21:36+09:00</updated><id>https://blog.jagaldol.com/ai/claude-opus-4-7-release</id><content type="html" xml:base="https://blog.jagaldol.com/ai/claude-opus-4-7-release/"><![CDATA[<p>Anthropic이 <a href="https://www.anthropic.com/news/claude-opus-4-7">Claude Opus 4.7</a>을 공개했다.
답변 품질을 조금 올린 챗봇 업데이트가 아니라,
<strong>코딩 에이전트</strong>, <strong>장기 업무 위임</strong>, <strong>고해상도 비전</strong>, <strong>엄격한 지시 이행</strong>을 축으로 개선된 Anthropic의 최상위 공개 모델이다.</p>

<table>
  <thead>
    <tr>
      <th>항목</th>
      <th>내용</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>공개일</td>
      <td>2026-04-16</td>
    </tr>
    <tr>
      <td>이전 세대</td>
      <td>Claude Opus 4.6</td>
    </tr>
    <tr>
      <td>API 모델 ID</td>
      <td><code class="language-plaintext highlighter-rouge">claude-opus-4-7</code></td>
    </tr>
    <tr>
      <td>가격</td>
      <td>입력 $5 / 출력 $25 (per 1M tokens)</td>
    </tr>
    <tr>
      <td>컨텍스트 / 최대 출력</td>
      <td>1M / 128K tokens</td>
    </tr>
    <tr>
      <td>지식 컷오프</td>
      <td>2026-01</td>
    </tr>
    <tr>
      <td>포지션</td>
      <td>Anthropic의 most capable GA model</td>
    </tr>
  </tbody>
</table>

<p>이번 글에서는 세 가지 질문에 답한다.</p>

<ul>
  <li>Opus 4.6과 비교해 실제로 무엇이 좋아졌는가?</li>
  <li>GPT-5.4, Gemini 3.1 Pro, Mythos Preview와 비교하면 어디쯤인가?</li>
  <li>어떤 작업에서는 오히려 기대치를 낮춰야 하는가?</li>
</ul>

<blockquote>
  <p>Weekly Tech Trend Talk 스터디(26.04.23)</p>
</blockquote>

<h2 id="이번-세대의-개선-축">이번 세대의 개선 축</h2>

<p>Opus 4.7이 내세우는 변화는 네 가지로 압축된다.
질문은 “이전보다 똑똑해졌나?”가 아니라 <strong>“어떤 업무를 덜 감독하고 맡길 수 있게 됐나?”</strong>에 가깝다.</p>

<table>
  <thead>
    <tr>
      <th>개선 축</th>
      <th>확인할 포인트</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>코딩 에이전트</td>
      <td>실제 GitHub issue·터미널 작업·코드 리뷰에서 오래 버티는가</td>
    </tr>
    <tr>
      <td>장기 업무 위임</td>
      <td>여러 도구와 긴 컨텍스트를 오가며 흐트러지지 않는가</td>
    </tr>
    <tr>
      <td>고해상도 비전</td>
      <td>화면·차트·문서·UI를 정확히 읽는가</td>
    </tr>
    <tr>
      <td>엄격한 지시 이행</td>
      <td>명시한 조건을 문자 그대로 지키는가</td>
    </tr>
  </tbody>
</table>

<h2 id="opus-46-대비-변화">Opus 4.6 대비 변화</h2>

<p>공식 메인 벤치마크 표부터 본다.</p>

<p><img src="/assets/images/2026/04/23/claude-opus-47-official-benchmark-table.png" alt="Claude Opus 4.7 공식 벤치마크 표" /></p>

<p>전반적 상승이 아니라 <strong>특정 영역에서 선명하게</strong> 올랐다.</p>

<table>
  <thead>
    <tr>
      <th>벤치마크</th>
      <th style="text-align: right">Opus 4.6</th>
      <th style="text-align: right">Opus 4.7</th>
      <th style="text-align: right">변화</th>
      <th>의미</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>SWE-bench Pro</td>
      <td style="text-align: right">53.4%</td>
      <td style="text-align: right">64.3%</td>
      <td style="text-align: right">+10.9pp</td>
      <td>산업형 코딩 과제에서 큰 상승</td>
    </tr>
    <tr>
      <td>SWE-bench Verified</td>
      <td style="text-align: right">80.8%</td>
      <td style="text-align: right">87.6%</td>
      <td style="text-align: right">+6.8pp</td>
      <td>검증된 GitHub issue 해결력 강화</td>
    </tr>
    <tr>
      <td>Terminal-Bench 2.0</td>
      <td style="text-align: right">65.4%</td>
      <td style="text-align: right">69.4%</td>
      <td style="text-align: right">+4.0pp</td>
      <td>터미널 디버깅·개발 작업 개선</td>
    </tr>
    <tr>
      <td>Finance Agent v1.1</td>
      <td style="text-align: right">60.1%</td>
      <td style="text-align: right">64.4%</td>
      <td style="text-align: right">+4.3pp</td>
      <td>업무형 agentic workflow 강화</td>
    </tr>
    <tr>
      <td>CharXiv no tools</td>
      <td style="text-align: right">69.1%</td>
      <td style="text-align: right">82.1%</td>
      <td style="text-align: right">+13.0pp</td>
      <td>차트·도식 시각 추론 대폭 향상</td>
    </tr>
  </tbody>
</table>

<p>가장 눈에 띄는 것은 SWE-bench Pro와 CharXiv다.
전자는 “진짜 개발 일을 맡길 수 있는가”, 후자는 고해상도 비전이라는 모델 레벨 변화와 직접 연결된다.
SWE-bench Verified는 상위 모델들이 포화 구간에 들어가고 있어,
단독 점수보다 어려운 작업형 벤치마크와 같이 읽는 편이 낫다.</p>

<h2 id="다른-모델과-비교한-순위">다른 모델과 비교한 순위</h2>

<p>Artificial Analysis Intelligence Index 기준 Opus 4.7은 <strong>57.3점</strong>이다.
Gemini 3.1 Pro 57.2, GPT-5.4 56.8과 95% 신뢰구간 ±1 안에 들어가
<strong>사실상 공동 1위 그룹</strong>으로 해석한다.</p>

<p><img src="/assets/images/2026/04/23/claude-opus-47-aa-intelligence-index.png" alt="Artificial Analysis Intelligence Index" /></p>

<p>BenchLM 리더보드도 같이 보면 위치가 더 뚜렷해진다.
공개된 exact-source benchmark 결과만 집계하는 사이트인데,
Mythos Preview가 1위로 올라와 있고 Opus 4.7이 바로 그 뒤를 잇는다.</p>

<p><img src="/assets/images/2026/04/23/claude-opus-47-benchlm-leaderboard.png" alt="BenchLM 리더보드" /></p>

<p>BenchLM은 provisional <code class="language-plaintext highlighter-rouge">#2/111</code>, verified <code class="language-plaintext highlighter-rouge">#2/15</code>로 표시한다.
단, 공개 exact-source benchmark가 아직 13개뿐이라 확정 순위가 아니라
<strong>현재 공개 지표 기반 상위권 위치</strong>로 읽는 편이 안전하다.
Mythos Preview는 제한 공개 모델이므로 일반 사용자 기준에서는 Opus 4.7이 사실상 최상단으로 볼 수 있다.</p>

<h2 id="강점">강점</h2>

<h3 id="1-실제-업무형-에이전트--gdpval-aa-1위">1. 실제 업무형 에이전트 — GDPval-AA 1위</h3>

<p>GDPval-AA는 44개 직업·9개 산업의 실제 지식 노동 태스크를 agentic loop로 평가한다.
Opus 4.7은 <strong>1,753 Elo</strong>로 1위, 다음 그룹(Sonnet 4.6, GPT-5.4)보다 약 79 Elo 앞선다.</p>

<p><img src="/assets/images/2026/04/23/claude-opus-47-aa-gdpval.png" alt="GDPval-AA 결과" /></p>

<p>퀴즈형 지식이 아니라 <strong>웹·셸을 쓰며 산출물을 만드는 업무</strong>에 강하다는 뜻이다.
기대할 변화도 “질문에 잘 답한다”보다
<strong>“기획·조사·작성·검증이 섞인 업무를 더 오래 맡긴다”</strong> 쪽이다.</p>

<h3 id="2-코딩-에이전트와-도구-사용">2. 코딩 에이전트와 도구 사용</h3>

<p>공식 표 기준 Opus 4.7은 일반 공개 모델 중
SWE-bench Pro, SWE-bench Verified, MCP-Atlas에서 강하다.
특히 MCP-Atlas는 복잡한 multi-turn tool-calling을 본다는 점에서
Claude Code 같은 도구의 체감 강점과 직결된다.</p>

<p>코드를 한 번에 쓰는 능력보다
<strong>작업을 나누고, 도구를 부르고, 실패를 회복하고, 검증까지 이어가는</strong> 능력이 올라간 쪽이다.</p>

<h3 id="3-고해상도-비전과-시각-추론">3. 고해상도 비전과 시각 추론</h3>

<p>이미지 입력 한계가 <code class="language-plaintext highlighter-rouge">1568px</code> → <code class="language-plaintext highlighter-rouge">2576px</code>(약 3.75MP)로 확장됐다.
변화는 CharXiv에서 그대로 드러난다.</p>

<table>
  <thead>
    <tr>
      <th>지표</th>
      <th style="text-align: right">Opus 4.6</th>
      <th style="text-align: right">Opus 4.7</th>
      <th style="text-align: right">변화</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>CharXiv no tools</td>
      <td style="text-align: right">69.1%</td>
      <td style="text-align: right">82.1%</td>
      <td style="text-align: right">+13.0pp</td>
    </tr>
    <tr>
      <td>CharXiv with tools</td>
      <td style="text-align: right">84.7%</td>
      <td style="text-align: right">91.0%</td>
      <td style="text-align: right">+6.3pp</td>
    </tr>
    <tr>
      <td>OSWorld-Verified</td>
      <td style="text-align: right">72.7%</td>
      <td style="text-align: right">78.0%</td>
      <td style="text-align: right">+5.3pp</td>
    </tr>
  </tbody>
</table>

<p>앞으로 차트·논문 그림·대시보드·앱 화면·스크린샷 디버깅에서
이전보다 높은 기대를 걸 수 있다.</p>

<h3 id="4-모르면-멈추는-능력">4. 모르면 멈추는 능력</h3>

<p>AA-Omniscience 결과에서 Opus 4.7은 Opus 4.6보다 hallucination rate가 크게 내려갔다.
정확도가 극적으로 오른 게 아니라, <strong>모르는 문제에서 더 자주 abstain</strong>하는 쪽에 가깝다.</p>

<p><img src="/assets/images/2026/04/23/claude-opus-47-aa-omniscience.png" alt="AA-Omniscience" /></p>

<p>업무용 에이전트에서는 “그럴듯한 오답”보다
<strong>“자료 부족 명시 + 다음 확인 단계 제안”</strong>이 훨씬 안전하다.</p>

<h2 id="약점과-주의점">약점과 주의점</h2>

<p>공식 발표만 보면 약점이 잘 보이지 않는다.
외부 자료와 표에서 후퇴하거나 밀리는 지점을 따로 봐야 한다.</p>

<h3 id="1-검색형-에이전트는-오히려-하락">1. 검색형 에이전트는 오히려 하락</h3>

<p>BrowseComp는 multi-step web research 지표인데,
Opus 4.6 83.7% → Opus 4.7 79.3%로 <strong>-4.4pp 하락</strong>했다.</p>

<table>
  <thead>
    <tr>
      <th>모델</th>
      <th style="text-align: right">BrowseComp</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>GPT-5.4 Pro</td>
      <td style="text-align: right">89.3%</td>
    </tr>
    <tr>
      <td>Claude Mythos Preview</td>
      <td style="text-align: right">86.9%</td>
    </tr>
    <tr>
      <td>Gemini 3.1 Pro</td>
      <td style="text-align: right">85.9%</td>
    </tr>
    <tr>
      <td>Claude Opus 4.6</td>
      <td style="text-align: right">83.7%</td>
    </tr>
    <tr>
      <td><strong>Claude Opus 4.7</strong></td>
      <td style="text-align: right"><strong>79.3%</strong> ↓</td>
    </tr>
  </tbody>
</table>

<p>에이전트 전반에서 무조건 상위호환이 아니다.
웹 검색을 많이 하고 여러 페이지를 종합하는 리서치 워크플로우라면
GPT-5.4나 Gemini 3.1 Pro가 더 맞을 수 있다.</p>

<h3 id="2-비용은-같지만-사용량이-달라질-수-있다">2. 비용은 같지만 사용량이 달라질 수 있다</h3>

<p>가격표는 Opus 4.6과 동일($5 / $25)이지만,
마이그레이션 가이드에 따르면 tokenizer가 바뀌어서
<strong>같은 입력이 최대 약 1.35배 더 많은 토큰</strong>으로 계산될 수 있다.
<code class="language-plaintext highlighter-rouge">xhigh</code>·<code class="language-plaintext highlighter-rouge">max</code> effort는 더 오래 생각하고 출력 토큰을 더 쓴다.</p>

<p><img src="/assets/images/2026/04/23/claude-opus-47-aa-cost.png" alt="Intelligence Index 실행 비용" /></p>

<p>단, Artificial Analysis 자체 측정에서 Intelligence Index 실행 비용은 오히려 낮게 나왔다.
Opus 4.7 ≈ $4,406 &lt; Opus 4.6 ≈ $4,970로, <strong>더 높은 점수를 내면서 출력 토큰을 덜 썼다</strong>.</p>

<p>tokenizer가 바뀌어서 같은 출력이 더 비싸 보일 수 있지만,
더 효율적인 처리 덕에 실제 쓰는 토큰의 절대량이 오히려 줄어들 수도 있다.
최종 비용은 workload, effort level, 이미지 사용량, 캐시 사용 여부에 따라 갈린다.</p>

<h3 id="3-마이그레이션-리스크">3. 마이그레이션 리스크</h3>

<p>Opus 4.7은 이전보다 지시를 문자 그대로 따른다.
잘 만든 프롬프트에서는 장점이지만,
기존 프롬프트가 모델의 관대한 해석에 기대고 있었다면 결과가 달라질 수 있다.</p>

<table>
  <thead>
    <tr>
      <th>항목</th>
      <th>변화</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>reasoning 방식</td>
      <td><code class="language-plaintext highlighter-rouge">extended thinking</code> 제거 → <code class="language-plaintext highlighter-rouge">adaptive thinking</code> 중심</td>
    </tr>
    <tr>
      <td>effort 단계</td>
      <td><code class="language-plaintext highlighter-rouge">low</code> / <code class="language-plaintext highlighter-rouge">medium</code> / <code class="language-plaintext highlighter-rouge">high</code> / <code class="language-plaintext highlighter-rouge">xhigh</code> / <code class="language-plaintext highlighter-rouge">max</code></td>
    </tr>
    <tr>
      <td>sampling</td>
      <td><code class="language-plaintext highlighter-rouge">temperature</code>, <code class="language-plaintext highlighter-rouge">top_p</code>, <code class="language-plaintext highlighter-rouge">top_k</code> 비기본값 사용 불가</td>
    </tr>
    <tr>
      <td>tokenizer</td>
      <td>같은 입력이 최대 약 1.35배 토큰으로 잡힐 수 있음</td>
    </tr>
    <tr>
      <td>이미지</td>
      <td>고해상도 이미지는 토큰 비용 증가 가능</td>
    </tr>
    <tr>
      <td>프롬프트 해석</td>
      <td>예전보다 문자 그대로 해석</td>
    </tr>
  </tbody>
</table>

<p>production에서는 모델 ID만 바꾸지 말고,
<strong>대표 작업에 대한 regression eval을 먼저</strong> 돌리는 편이 맞다.</p>

<h2 id="실전-사용-가이드">실전 사용 가이드</h2>

<h3 id="기대치를-올려도-되는-작업">기대치를 올려도 되는 작업</h3>

<table>
  <thead>
    <tr>
      <th>작업</th>
      <th>근거</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>큰 코드베이스 버그 수정</td>
      <td>SWE-bench Pro, SWE-bench Verified 상승</td>
    </tr>
    <tr>
      <td>Claude Code 장기 세션</td>
      <td>tool use, Terminal-Bench, xhigh effort와 연결</td>
    </tr>
    <tr>
      <td>코드 리뷰·리팩터링</td>
      <td>엄격한 지시 이행과 자기 검증 경향</td>
    </tr>
    <tr>
      <td>화면 기반 자동화</td>
      <td>고해상도 비전, OSWorld/CharXiv 상승</td>
    </tr>
    <tr>
      <td>금융·법률·업무 문서 분석</td>
      <td>GDPval-AA, Finance Agent 강세</td>
    </tr>
    <tr>
      <td>불확실성 관리</td>
      <td>AA-Omniscience에서 hallucination 감소</td>
    </tr>
  </tbody>
</table>

<h3 id="기대치를-낮춰야-할-작업">기대치를 낮춰야 할 작업</h3>

<table>
  <thead>
    <tr>
      <th>작업</th>
      <th>이유</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>순수 웹 리서치 에이전트</td>
      <td>BrowseComp에서 Opus 4.6보다 하락</td>
    </tr>
    <tr>
      <td>최저 비용 대량 처리</td>
      <td>Opus 라인 자체가 비싸고 effort에 따라 증가</td>
    </tr>
    <tr>
      <td>기존 프롬프트 무수정 전환</td>
      <td>문자 그대로 따르는 성향 탓에 결과 변화 가능</td>
    </tr>
    <tr>
      <td>보안 연구·침투 테스트</td>
      <td>고위험 사이버 요청 safeguard와 별도 verification program</td>
    </tr>
  </tbody>
</table>

<h2 id="결론">결론</h2>

<p>Claude Opus 4.7은 Anthropic이 어디에 집중하는지를 보여주는 모델이다.
예쁘게 답하는 챗봇보다, 코드를 고치고·도구를 쓰고·긴 작업을 끝까지 가져가고·모르면 멈추는
<strong>업무형 에이전트</strong> 쪽에 무게가 실려 있다.</p>

<p>다만 “최강 모델 하나로 통일”이라고 말하기엔 조심해야 한다.
Artificial Analysis 기준으로는 GPT-5.4, Gemini 3.1 Pro와 사실상 공동 1위 그룹이고,
웹 리서치처럼 오히려 후퇴한 영역도 있다.</p>

<table>
  <thead>
    <tr>
      <th>상황</th>
      <th>권장</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>복잡한 코딩·업무 위임·시각 자료 분석</td>
      <td>Opus 4.7 1순위 후보</td>
    </tr>
    <tr>
      <td>순수 웹 리서치·비용 민감 대량 처리</td>
      <td>다른 모델과 <strong>반드시 비교</strong></td>
    </tr>
  </tbody>
</table>

<p>빠르면 오늘 밤 GPT-5.5가 공개될 예정이다.
5.5가 나오면 이 순위는 곧바로 뒤집힐 가능성이 농후하다.</p>

<h2 id="참고-자료">참고 자료</h2>

<ul>
  <li><a href="https://www.anthropic.com/news/claude-opus-4-7">Introducing Claude Opus 4.7</a></li>
  <li><a href="https://www.anthropic.com/claude/opus">Claude Opus 제품 페이지</a></li>
  <li><a href="https://platform.claude.com/docs/en/about-claude/models/overview">Models overview</a></li>
  <li><a href="https://platform.claude.com/docs/en/about-claude/models/migration-guide">Migration guide</a></li>
  <li><a href="https://aws.amazon.com/blogs/aws/introducing-anthropics-claude-opus-4-7-model-in-amazon-bedrock/">Introducing Anthropic’s Claude Opus 4.7 model in Amazon Bedrock</a></li>
  <li><a href="https://artificialanalysis.ai/articles/opus-4-7-everything-you-need-to-know/">Artificial Analysis - Opus 4.7: Everything you need to know</a></li>
  <li><a href="https://benchlm.ai/models/claude-opus-4-7">BenchLM - Claude Opus 4.7</a></li>
</ul>]]></content><author><name>Hyejun An(26)</name><email>jagaldol.dev@gmail.com</email></author><category term="ai" /><summary type="html"><![CDATA[Anthropic이 Claude Opus 4.7을 공개했다. 답변 품질을 조금 올린 챗봇 업데이트가 아니라, 코딩 에이전트, 장기 업무 위임, 고해상도 비전, 엄격한 지시 이행을 축으로 개선된 Anthropic의 최상위 공개 모델이다.]]></summary></entry><entry><title type="html">Obsidian AI 비서에게 어떤 스킬을 주면 좋을까 - 기본 스킬과 직접 만든 비서 운영 스킬까지</title><link href="https://blog.jagaldol.com/obsidian/obsidian-ai-assistant-skill-stack/" rel="alternate" type="text/html" title="Obsidian AI 비서에게 어떤 스킬을 주면 좋을까 - 기본 스킬과 직접 만든 비서 운영 스킬까지" /><published>2026-04-22T20:00:26+09:00</published><updated>2026-04-22T20:00:26+09:00</updated><id>https://blog.jagaldol.com/obsidian/obsidian-ai-assistant-skill-stack</id><content type="html" xml:base="https://blog.jagaldol.com/obsidian/obsidian-ai-assistant-skill-stack/"><![CDATA[<p>처음에는 나도 Obsidian용 기본 스킬 몇 개만 있으면 AI 비서가 금방 돌아갈 줄 알았다. markdown을 읽고, <code class="language-plaintext highlighter-rouge">.base</code>를 만지고, CLI로 앱까지 건드릴 수 있으니 얼핏 보면 충분해 보이기 때문이다. 그런데 며칠만 써 보면 금방 차이가 드러난다. 파일을 다룰 수 있는 것과, 내 vault에서 무엇을 먼저 읽고 어떻게 판단해야 하는지를 아는 것은 전혀 다른 문제였다. 이번 글은 그 차이를 정리한 글이다. 공식 기본 스킬 5개는 어디까지 해 주는지 짧게 보고, 그다음부터는 내가 이 Obsidian 위에서 비서를 운영하려고 직접 만든 스킬이 왜 필요해졌는지를 실제 사례로 풀어보려 한다.</p>

<p><img src="/assets/images/2026/04/22/obsidian-skill-stack-hero.png" alt="Obsidian AI 비서를 위한 기본 스킬과 비서 운영 스킬의 계층을 표현한 대표 이미지" class="align-center" /></p>

<h2 id="기본-스킬의-기준선">기본 스킬의 기준선</h2>

<p>이번 글에서 말하는 기본 스킬은 공식 GitHub <a href="https://github.com/kepano/obsidian-skills"><code class="language-plaintext highlighter-rouge">kepano/obsidian-skills</code></a>를 기준으로 잡는다. README를 보면 현재 공식 팩에는 5개가 들어 있다. 이 다섯 개는 Obsidian을 다루는 바닥 능력을 넓게 깔아 주는 층에 가깝다. 노트 문법, Bases, Canvas, CLI, 웹 본문 정리처럼 “공통으로 필요한 일”은 대부분 여기서 출발한다.</p>

<table>
  <thead>
    <tr>
      <th>기본 스킬</th>
      <th>한 줄 역할</th>
      <th>왜 필요한가</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">obsidian-markdown</code></td>
      <td>Obsidian 문법에 맞는 markdown을 읽고 쓴다</td>
      <td>위키링크, callout, frontmatter를 덜 틀리게 다룰 수 있다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">obsidian-bases</code></td>
      <td><code class="language-plaintext highlighter-rouge">.base</code> 파일 구조와 뷰 구성을 다룬다</td>
      <td>Bases를 표, 카드, 칸반 관점에서 수정할 수 있다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">json-canvas</code></td>
      <td><code class="language-plaintext highlighter-rouge">.canvas</code> 파일의 node와 edge 구조를 다룬다</td>
      <td>시각 구조도도 결국 파일이라는 관점으로 다룰 수 있다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">obsidian-cli</code></td>
      <td>실행 중인 Obsidian과 상호작용한다</td>
      <td>읽기, 검색, 생성, 스크린샷까지 앱 레벨 작업이 가능하다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">defuddle</code></td>
      <td>웹페이지 본문을 markdown으로 정리한다</td>
      <td>외부 글을 vault로 들여오기 전에 잡음을 줄일 수 있다</td>
    </tr>
  </tbody>
</table>

<p>여기까지만 보면 꽤 든든하다. 실제로도 이 다섯 개만으로 할 수 있는 일이 적지 않다. 다만 이 스킬들은 어디까지나 Obsidian을 다루는 공용 능력이다. 내 vault의 기준 문서가 무엇인지, 어떤 정보는 장기 메모로 올리고 어떤 것은 그냥 메모에 남겨야 하는지 같은 판단까지 대신해 주지는 않는다.</p>

<h2 id="전체-스킬-맵">전체 스킬 맵</h2>

<p>지금 내가 실제로 굴리는 구성은 단순하다. 공식 기본 스킬 5개가 바닥에 있고, 그 위에 직접 만든 비서 운영 스킬 2개가 얹혀 있다. 위층은 공용 능력이고, 아래층은 내 운영 방식이다.</p>

<table>
  <thead>
    <tr>
      <th>스킬</th>
      <th>층위</th>
      <th>맡는 일</th>
      <th>실제 비중</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">obsidian-markdown</code></td>
      <td>기본 스킬</td>
      <td>노트 문법과 링크 구조를 안정적으로 다룬다</td>
      <td>기준선</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">obsidian-bases</code></td>
      <td>기본 스킬</td>
      <td><code class="language-plaintext highlighter-rouge">.base</code> 파일의 필터, 뷰, order를 수정한다</td>
      <td>기준선</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">json-canvas</code></td>
      <td>기본 스킬</td>
      <td><code class="language-plaintext highlighter-rouge">.canvas</code> 파일의 node, edge, group을 편집한다</td>
      <td>보조</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">obsidian-cli</code></td>
      <td>기본 스킬</td>
      <td>Obsidian 앱과 vault를 읽고 쓰고 검색한다</td>
      <td>높음</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">defuddle</code></td>
      <td>기본 스킬</td>
      <td>웹 글을 깔끔한 markdown으로 바꾼다</td>
      <td>보조</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">daily-note-followup</code></td>
      <td>비서 운영 스킬</td>
      <td>일간 기록 후처리와 장기 메모, TODO, 플레이스 분기를 묶는다</td>
      <td>핵심</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">organize-instructions</code></td>
      <td>비서 운영 스킬</td>
      <td>지침 구조를 점검하고 다시 정리한다</td>
      <td>핵심</td>
    </tr>
  </tbody>
</table>

<p>표로 보면 그냥 7개 나열처럼 보이지만, 성격은 꽤 다르다. 기본 스킬은 범위가 넓은 대신 얕다. 반대로 비서 운영 스킬은 범위는 좁지만 훨씬 깊다. 실제로는 읽어야 하는 기준 문서와 응답 형식까지 한 덩어리로 붙는다.</p>

<h2 id="비서-운영-스킬이-붙는-자리">비서 운영 스킬이 붙는 자리</h2>

<p>기본 스킬만으로도 꽤 많은 일은 된다. 그런데 어느 지점부터는 금방 한계가 보인다. 파일 포맷을 아는 것과, 내 vault에서 무엇이 기준 문서인지 아는 것은 완전히 다른 일이기 때문이다.</p>

<table>
  <thead>
    <tr>
      <th>작업 유형</th>
      <th>기본 스킬만으로 되는가</th>
      <th>비서 운영 스킬이 필요한 이유</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>위키링크와 frontmatter를 맞춰 노트를 쓴다</td>
      <td>대부분 된다</td>
      <td>Obsidian 문법 자체는 공용 규칙이기 때문이다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">.base</code>나 <code class="language-plaintext highlighter-rouge">.canvas</code> 파일 구조를 수정한다</td>
      <td>대부분 된다</td>
      <td>파일 스키마를 이해하는 일이 중심이기 때문이다</td>
    </tr>
    <tr>
      <td>웹 글을 읽어 markdown으로 정리한다</td>
      <td>대부분 된다</td>
      <td>본문 추출 자체는 공용 도구 문제이기 때문이다</td>
    </tr>
    <tr>
      <td>일간 기록을 읽고 일정, 장기 메모, TODO로 분기한다</td>
      <td>어렵다</td>
      <td>내 vault의 섹션 경계, 기준 문서, 응답 형식이 로컬 규칙이기 때문이다</td>
    </tr>
    <tr>
      <td>지침 문서 구조를 정리하고 기준 문서를 다시 잡는다</td>
      <td>어렵다</td>
      <td>어떤 문서가 기준인지와 어디로 detail을 내려야 하는지가 저장소마다 다르기 때문이다</td>
    </tr>
  </tbody>
</table>

<p>내가 직접 써 보며 가장 크게 느낀 차이도 여기였다. 기본 스킬은 “이 파일이 무엇인가”를 안다. 비서 운영 스킬은 “이 vault에서는 무엇을 먼저 읽고, 어디에 적고, 무엇은 섣불리 올리면 안 되는가”를 안다. 개인 비서처럼 오래 쓰려면 결국 뒤쪽이 필요해진다.</p>

<p>스킬을 언제 만들지도 여기서 갈린다. 그냥 시켜도 늘 잘 되는 일이라면 굳이 스킬로 만들지 않아도 된다. 반대로 원하는 능력은 분명한데 결과가 계속 마음에 들지 않아서, 피드백을 주고 결과물을 여러 번 고치게 되는 일이 있다. 내 경우에는 그런 작업이야말로 스킬 후보였다. 몇 번의 피드백 끝에 “이 정도면 내가 원하던 결과다” 싶은 상태가 되면, 그때까지의 피드백과 최종 결과물을 바탕으로 “다음에도 같은 요구가 오면 이렇게 처리해 달라”고 정리해서 스킬로 올리는 쪽이 가장 잘 맞았다.</p>

<h2 id="비서-운영-스킬-사례">비서 운영 스킬 사례</h2>

<p>내가 직접 붙인 비서 운영 스킬은 <code class="language-plaintext highlighter-rouge">daily-note-followup</code>와 <code class="language-plaintext highlighter-rouge">organize-instructions</code> 두 개다. 둘 다 공용 스킬 위에서 움직이지만, 실제 느낌은 “프롬프트 두 개”와는 거리가 멀다. 차라리 작은 작업 패키지에 가깝다. <code class="language-plaintext highlighter-rouge">SKILL.md</code>가 있고, 세부 판단을 담은 참조 문서가 있고, 필요하면 <code class="language-plaintext highlighter-rouge">agents/openai.yaml</code>까지 붙는다.</p>

<table>
  <thead>
    <tr>
      <th>비서 운영 스킬</th>
      <th>해결하는 문제</th>
      <th>읽는 참조 문서</th>
      <th>왜 직접 만들어야 하는가</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">daily-note-followup</code></td>
      <td>일간 기록을 후처리하고 장기 메모, TODO, 플레이스, 미래 일정으로 분기한다</td>
      <td>플레이북, 체크리스트, <code class="language-plaintext highlighter-rouge">references/action-rubric.md</code></td>
      <td>섹션 구조와 승격 기준이 내 vault 운영 방식에 묶여 있기 때문이다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">organize-instructions</code></td>
      <td>지침 문서를 점검하고 더 안정적인 구조로 다시 묶는다</td>
      <td><code class="language-plaintext highlighter-rouge">references/discovery-audit-workflow.md</code>, <code class="language-plaintext highlighter-rouge">classification-framework.md</code>, <code class="language-plaintext highlighter-rouge">output-contract.md</code></td>
      <td>같은 구조 정리라도 저장소마다 라우터 문서와 기준 문서가 다르기 때문이다</td>
    </tr>
  </tbody>
</table>

<h3 id="daily-note-followup">daily-note-followup</h3>

<p>이 스킬은 이름만 보면 “일기 정리” 정도로 들린다. 그런데 실제로 뜯어 보면 훨씬 넓다. 완성된 일간 기록 하나를 읽고 나서, 어디까지 자동 반영할지 정해 둔 운영 절차에 가깝다. 일기 교정, 일정 보정, 장기 메모 승격, TODO 생성, 장소 노트 승격, 미래 노트 생성이 한 흐름으로 이어진다.</p>

<p>폴더 구조도 이렇게 생겨 있다. <code class="language-plaintext highlighter-rouge">SKILL.md</code>만 있는 게 아니라, 판단 기준과 예시가 <code class="language-plaintext highlighter-rouge">references</code> 아래로 빠져 있다.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>daily-note-followup/
├── SKILL.md
├── agents/openai.yaml
└── references/
    ├── action-rubric.md
    ├── examples.md
    └── place-note-pattern.md
</code></pre></div></div>

<p>이 구조를 보면 역할도 바로 나뉜다. <code class="language-plaintext highlighter-rouge">SKILL.md</code>는 메인 흐름을 잡고, <code class="language-plaintext highlighter-rouge">action-rubric.md</code>는 자동 반영 기준과 섹션 경계를 더 세게 못 박는다. <code class="language-plaintext highlighter-rouge">place-note-pattern.md</code>는 장소 노트를 어떻게 만들지 패턴을 잡아 주고, <code class="language-plaintext highlighter-rouge">examples.md</code>는 실제 결과 모양을 맞출 때 참고점으로 쓴다.</p>

<p><code class="language-plaintext highlighter-rouge">SKILL.md</code>의 가운데 부분만 추리면 흐름은 대략 이렇게 읽힌다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">1.</span> Read the target daily note first.
<span class="p">2.</span> Locate the user-only block and the <span class="sb">`## 일기`</span> section before touching anything else.
<span class="p">7.</span> Sync the agent-managed sections after diary correction.
<span class="p">8.</span> Before mutating the vault, use these canonical references:
<span class="p">   -</span> <span class="sb">`00_agent_docs/플레이북/Base Board 작업 지침.md`</span>
<span class="p">   -</span> <span class="sb">`00_agent_docs/플레이북/일일기록 일정 작성 플레이북.md`</span>
<span class="p">   -</span> <span class="sb">`00_agent_docs/플레이북/개인 정보 업데이트 플레이북.md`</span>
<span class="p">9.</span> Apply the repository-specific rules in <span class="sb">`references/action-rubric.md`</span>.
<span class="p">17.</span> Create or update <span class="sb">`06_TODO`</span>, future daily notes, <span class="sb">`10_아이디어`</span>, and month or year hubs only when the rubric says the evidence is strong enough.
</code></pre></div></div>

<p>이 발췌에서 중요한 건 문장이 길다는 게 아니다. 스킬이 혼자 판단하지 않는다는 점이다. 먼저 일간 기록을 읽고, 그다음 기준 문서를 읽고, 그 기준 위에서만 움직인다. 그래서 이 스킬은 공용으로 돌리기 어렵다. 일간 기록에서 무엇을 장기 메모로 올릴지, 어떤 TODO를 자동 생성할지, <code class="language-plaintext highlighter-rouge">## 메모</code>와 <code class="language-plaintext highlighter-rouge">## 에이전트 메모</code>를 어디서 나눌지는 결국 내 운영 규칙이기 때문이다.</p>

<p>하위 참조 문서는 이 판단을 더 촘촘하게 만든다. 예를 들어 <code class="language-plaintext highlighter-rouge">action-rubric.md</code>는 섹션 경계와 자동 반영 기준을 이렇게 적어 둔다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">-</span> <span class="sb">`## 일정`</span>: Day Planner-compatible list only.
<span class="p">-</span> <span class="sb">`## 메모`</span>: Supplementary facts not already covered in the diary.
<span class="p">-</span> <span class="sb">`## 에이전트 메모`</span>: agent's own work log and future reference observations.
<span class="p">-</span> Auto-create a TODO only when the next action, actor, and intent are clear.
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">references</code> 내부 파일도 역할이 나뉘어 있다.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">action-rubric.md</code>: 자동 반영 범위, 섹션 경계, TODO 생성 조건처럼 가장 자주 흔들리는 판단 기준을 잡는다.</li>
  <li><code class="language-plaintext highlighter-rouge">examples.md</code>: 이 스킬이 언제 발동하고 어떤 결과 모양으로 끝나야 하는지 예시로 맞춘다.</li>
  <li><code class="language-plaintext highlighter-rouge">place-note-pattern.md</code>: 장소 노트를 언제 승격하고 어떤 구조로 만들지 패턴을 정리한다.</li>
</ul>

<p>그리고 <code class="language-plaintext highlighter-rouge">agents/openai.yaml</code>은 로직보다 표면을 다듬는 층에 가깝다. 여기서 이 스킬이 어떤 이름으로 보이고, 암묵 호출을 열어둘지 같은 사용감을 정리한다.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">interface</span><span class="pi">:</span>
  <span class="na">display_name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">일기</span><span class="nv"> </span><span class="s">정리"</span>
<span class="na">policy</span><span class="pi">:</span>
  <span class="na">allow_implicit_invocation</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>

<h3 id="organize-instructions">organize-instructions</h3>

<p><code class="language-plaintext highlighter-rouge">organize-instructions</code>는 2편과 3편에서 계속 이야기했던 문제를 실제로 다루는 스킬이다. 문서가 많아졌을 때 무엇이 라우터이고, 무엇이 기준 문서이고, detail을 어디로 내려야 하는지를 감으로 정리하지 않게 해 준다. 한마디로 하면 지침 구조를 점검하는 정리 스킬이다.</p>

<p>이 스킬도 마찬가지로, 프롬프트 한 장이라기보다 작은 점검 도구 세트에 가깝다.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>organize-instructions/
├── SKILL.md
├── agents/openai.yaml
└── references/
    ├── classification-framework.md
    ├── discovery-audit-workflow.md
    ├── local-example-obsidian-vault.md
    └── output-contract.md
</code></pre></div></div>

<p>여기서는 <code class="language-plaintext highlighter-rouge">discovery-audit-workflow.md</code>가 실제 지침 면을 어떻게 훑을지 안내하고, <code class="language-plaintext highlighter-rouge">classification-framework.md</code>가 규칙을 어떤 층으로 분류할지 잡아 준다. <code class="language-plaintext highlighter-rouge">output-contract.md</code>는 결과를 어떤 형식으로 내야 하는지 정리하고, <code class="language-plaintext highlighter-rouge">local-example-obsidian-vault.md</code>는 필요할 때만 참고하는 예시 축에 가깝다.</p>

<p>이쪽 <code class="language-plaintext highlighter-rouge">SKILL.md</code>도 중심 흐름은 꽤 분명하다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">1.</span> Discover the instruction surface.
<span class="p">2.</span> Classify each rule before moving it.
<span class="p">3.</span> Diagnose the current problems.
<span class="p">4.</span> Design the target architecture.
<span class="p">5.</span> Translate the design into concrete actions.
<span class="p">6.</span> Produce the final output with the correct contract.
</code></pre></div></div>

<p>내가 이 스킬을 따로 둔 이유도 여기에 있다. 단순히 “문서를 정리한다”가 아니라, 발견하고, 분류하고, 문제를 짚고, 구조를 다시 그리는 순서를 강제하기 때문이다. 그냥 손에 잡히는 파일부터 옮기기 시작하면 중복만 더 늘어날 때가 많았다.</p>

<p>하위 참조 문서는 이 흐름을 더 구체적으로 잘라 준다. <code class="language-plaintext highlighter-rouge">discovery-audit-workflow.md</code>만 봐도, 처음부터 파일을 옮기지 말고 실제 지침 면을 먼저 훑으라고 못 박는다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">1.</span> Top-level router docs
<span class="p">2.</span> Named operating areas
<span class="p">3.</span> Task-specific instruction packages
<span class="p">4.</span> Preference and operating context docs
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">references</code> 내부 파일도 각각 맡는 역할이 다르다.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">discovery-audit-workflow.md</code>: 실제 지침 표면을 어떤 순서로 훑고 inventory할지 정리한다.</li>
  <li><code class="language-plaintext highlighter-rouge">classification-framework.md</code>: 발견한 규칙을 어떤 층과 문서로 보낼지 분류 기준을 잡는다.</li>
  <li><code class="language-plaintext highlighter-rouge">output-contract.md</code>: 점검 결과를 어떤 형식으로 정리해 내놓을지 맞춘다.</li>
  <li><code class="language-plaintext highlighter-rouge">local-example-obsidian-vault.md</code>: 필요할 때만 참고하는 예시 자료로, 실제 구조를 감 잡는 데 쓴다.</li>
</ul>

<p>이 스킬은 <code class="language-plaintext highlighter-rouge">daily-note-followup</code>와 달리 암묵 호출을 열어두지 않았다. 매일 도는 루틴이라기보다, “지금 지침 구조를 점검해야겠다” 싶을 때 일부러 꺼내는 도구에 더 가깝기 때문이다.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">interface</span><span class="pi">:</span>
  <span class="na">display_name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Organize</span><span class="nv"> </span><span class="s">Instructions"</span>
<span class="na">policy</span><span class="pi">:</span>
  <span class="na">allow_implicit_invocation</span><span class="pi">:</span> <span class="no">false</span>
</code></pre></div></div>

<h2 id="직접-커스텀-스킬을-만들어야-하는-시점">직접 커스텀 스킬을 만들어야 하는 시점</h2>

<p>스킬은 많다고 좋은 게 아니다. 먼저 내 비서에게 어떤 능력이 필요한지 파악하는 게 먼저다. 그냥 시켜도 늘 잘 되는 일이라면 굳이 스킬로 고정할 필요가 없다. 내가 실제로 스킬을 만들게 되는 시점은, 결과가 계속 흔들리거나 같은 작업을 반복해서 시키게 될 때였다.</p>

<h3 id="에이전트의-결과물이-마음에-안-들-때">에이전트의 결과물이 마음에 안 들 때</h3>

<p>결과가 조금 아쉽다고 바로 스킬을 만들지는 않는다. 보통은 먼저 피드백을 주면서 내가 원하는 결과가 나올 때까지 계속 다듬는다. 이 단계가 중요한 이유는, 내가 원하는 결과물의 기준이 아직 선명하지 않을 때가 많기 때문이다.</p>

<p>내가 보통 거치는 흐름은 이렇다.</p>

<ul>
  <li>먼저 그냥 시켜 본다.</li>
  <li>결과가 자꾸 흔들리면 피드백을 주면서 원하는 모양으로 계속 고친다.</li>
  <li>몇 번 반복한 뒤 “이 정도면 다음에도 같은 요구를 잘 처리하겠다” 싶은 결과물이 나온다.</li>
  <li>그때까지 쌓인 피드백과 최종 결과물을 바탕으로 플레이북을 만든다.</li>
</ul>

<p>이때 플레이북에 남기는 재료도 꽤 분명하다.</p>

<ul>
  <li>지금까지의 피드백</li>
  <li>대화 내역</li>
  <li>실제 작업 흐름</li>
  <li>최종 결과물</li>
</ul>

<p>플레이북을 먼저 만드는 이유도 분명하다.</p>

<ul>
  <li>시행착오를 줄이기 위해</li>
  <li>다음에 같은 실수를 하지 않게 하기 위해</li>
  <li>같은 요구가 다시 왔을 때 기준 문서로 삼기 위해</li>
</ul>

<p>즉, 스킬보다 플레이북이 먼저 생기고, 스킬은 그 플레이북이 반복 실행 단위가 될 때 올라간다.</p>

<h3 id="반복해서-시키는-작업이-생겼을-때">반복해서 시키는 작업이 생겼을 때</h3>

<p>어떤 작업은 한 번 잘 끝나는 것으로는 부족하다. 다음 주에도, 다음 달에도 비슷한 요청을 또 하게 된다. 이런 작업은 단순 플레이북을 넘어 스킬 후보가 된다.</p>

<p>여기서 내가 나누는 기준은 비교적 단순하다. 플레이북은 사람이 읽어도 되는 절차 문서이고, 스킬은 에이전트가 명시적으로 호출해서 같은 작업을 반복 처리하게 만드는 실행 단위다.</p>

<p>특히 아래 조건이 겹치면 스킬로 올리기 좋았다.</p>

<ul>
  <li>요청 형태가 반복된다.</li>
  <li>원하는 결과물 모양이 비교적 명확하다.</li>
  <li>이미 플레이북과 피드백이 쌓여 있다.</li>
  <li>다음에도 같은 기준으로 처리되길 원한다.</li>
</ul>

<p>내 경우에는 이런 작업이 쌓일 때, 기존 플레이북과 원하는 결과물을 바탕으로 하나의 스킬로 승화시키는 편이 잘 맞았다. 그러면 다음부터는 매번 긴 설명을 다시 하지 않아도 되고, 비서도 같은 기준 위에서 움직이기 쉬워진다.</p>

<p>여기서 중요한 건 두 가지다. 하나는 스킬을 너무 빨리 만들지 않는 것이다. 그냥 시켜도 잘 되는 일은 굳이 스킬로 고정할 필요가 없다. 다른 하나는 공용 기본 스킬과 역할을 겹치지 않는 것이다. 기본 스킬이 이미 markdown, <code class="language-plaintext highlighter-rouge">.base</code>, <code class="language-plaintext highlighter-rouge">.canvas</code>, CLI, 웹 인입을 맡아주고 있다면, 비서 운영 스킬은 그 위에 내 판단 기준과 참조 문서만 얹는 편이 훨씬 깔끔하다. 모든 걸 로컬 스킬 하나에 우겨 넣기 시작하면 금방 다시 두꺼워진다.</p>

<h2 id="마무리">마무리</h2>

<p>지금 돌아보면 공식 기본 스킬 5개는 꽤 좋은 출발선이었다. 다만 거기서 멈췄다면 그냥 “Obsidian을 잘 다루는 AI” 정도였을 것이다. 내 vault에서 실제로 오래 쓰는 개인 비서가 되기 시작한 건, 직접 만든 비서 운영 스킬이 붙은 뒤였다.</p>

<p>결국 기본 스킬은 바닥이고, 비서 운영 스킬은 내 운영 방식이다. 내가 지금 쓰는 구조도 두 층을 섞기보다 겹쳐 놓는 쪽에 가깝다. 기본 스킬은 공용 능력을 맡고, 비서 운영 스킬은 내 기준 문서와 작업 습관을 맡는다. 지금으로서는 그 분리가 가장 덜 흔들린다.</p>]]></content><author><name>Hyejun An(26)</name><email>jagaldol.dev@gmail.com</email></author><category term="obsidian" /><summary type="html"><![CDATA[처음에는 나도 Obsidian용 기본 스킬 몇 개만 있으면 AI 비서가 금방 돌아갈 줄 알았다. markdown을 읽고, .base를 만지고, CLI로 앱까지 건드릴 수 있으니 얼핏 보면 충분해 보이기 때문이다. 그런데 며칠만 써 보면 금방 차이가 드러난다. 파일을 다룰 수 있는 것과, 내 vault에서 무엇을 먼저 읽고 어떻게 판단해야 하는지를 아는 것은 전혀 다른 문제였다. 이번 글은 그 차이를 정리한 글이다. 공식 기본 스킬 5개는 어디까지 해 주는지 짧게 보고, 그다음부터는 내가 이 Obsidian 위에서 비서를 운영하려고 직접 만든 스킬이 왜 필요해졌는지를 실제 사례로 풀어보려 한다.]]></summary></entry><entry><title type="html">Obsidian을 메모 앱이 아니라 작업 공간으로 만드는 핵심 플러그인 구성</title><link href="https://blog.jagaldol.com/obsidian/obsidian-workspace-plugin-stack/" rel="alternate" type="text/html" title="Obsidian을 메모 앱이 아니라 작업 공간으로 만드는 핵심 플러그인 구성" /><published>2026-04-21T16:00:00+09:00</published><updated>2026-04-21T16:00:00+09:00</updated><id>https://blog.jagaldol.com/obsidian/obsidian-workspace-plugin-stack</id><content type="html" xml:base="https://blog.jagaldol.com/obsidian/obsidian-workspace-plugin-stack/"><![CDATA[<p>VS Code 위에서도 개인 비서용 환경을 만들 수는 있다. 문제는 일정 화면, 칸반 보드, 템플릿, 첨부 정리까지 붙이기 시작하면 다시 도구를 만드는 일로 돌아가기 쉽다는 점이다. 내가 Obsidian을 계속 쓰는 이유는 markdown 파일 기반이라서만이 아니라, 이미 잘 만들어진 UI/UX와 플러그인 생태계 위에 에이전트를 얹으면 바닥부터 다시 짓지 않고도 통일성 있는 작업 공간을 만들 수 있기 때문이다.</p>

<p><img src="/assets/images/2026/04/21/obsidian-plugin-stack-hero.png" alt="Obsidian을 작업 공간으로 만드는 플러그인 조합과 AI 보조 운영을 상징적으로 표현한 대표 이미지" class="align-center" /></p>

<h2 id="작업-공간으로서의-obsidian">작업 공간으로서의 Obsidian</h2>

<p>이번 글은 실제로 남긴 핵심 플러그인 여섯 개가 각각 무엇을 맡고, 같이 붙었을 때 어떻게 작업 공간이 되는지를 정리한 글이다. Obsidian은 파일을 저장하는 앱에 그치지 않고, 이미 갖춰진 탐색 UI, 링크 구조, 사이드바, 뷰어, 플러그인 확장점 위에 작업 흐름을 얹을 수 있다. 그래서 에이전트도 바닥부터 앱을 다시 만들 필요 없이, 이미 만들어진 인터페이스와 고정된 규칙 위에서 움직이면 된다.</p>

<p>이 위에는 전역 Obsidian 스킬이 기본 읽기·쓰기 능력을 얹고, Vault 전용 로컬 스킬이 내 작업 절차를 얹는다. 다만 이번 글의 중심은 실제 플러그인 구성이고, 전역/로컬 스킬의 분업은 5편에서 따로 정리하겠다.</p>

<table>
  <thead>
    <tr>
      <th>흐름</th>
      <th>플러그인</th>
      <th>역할</th>
      <th>왜 남겼는가</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>기록</td>
      <td><code class="language-plaintext highlighter-rouge">periodic-notes</code>, <code class="language-plaintext highlighter-rouge">templater-obsidian</code>, <code class="language-plaintext highlighter-rouge">obsidian-day-planner</code></td>
      <td>날짜 경로 생성, 템플릿 고정, 타임라인 시각화</td>
      <td>일간 기록이 같은 형식으로 생성되고 바로 실행 인터페이스로 이어지기 때문</td>
    </tr>
    <tr>
      <td>실행</td>
      <td><code class="language-plaintext highlighter-rouge">base-board</code>, <code class="language-plaintext highlighter-rouge">dataview</code></td>
      <td>TODO 시각화, 조회와 집계 보강</td>
      <td>데이터는 파일에 남기고 UI는 가볍게 얹을 수 있기 때문</td>
    </tr>
    <tr>
      <td>정리</td>
      <td><code class="language-plaintext highlighter-rouge">obsidian-custom-attachment-location</code></td>
      <td>첨부 경로 자동 정렬</td>
      <td>이미지와 첨부를 다룰 때 에이전트 실패가 크게 줄어들기 때문</td>
    </tr>
  </tbody>
</table>

<h2 id="기록-플러그인-구성">기록 플러그인 구성</h2>

<p>기록 쪽에서는 <code class="language-plaintext highlighter-rouge">Periodic Notes</code>, <code class="language-plaintext highlighter-rouge">Templater</code>, <code class="language-plaintext highlighter-rouge">Day Planner</code> 세 개가 한 묶음으로 움직인다. 먼저 각 플러그인이 하는 일을 짧게 보면 아래와 같다.</p>

<table>
  <thead>
    <tr>
      <th>플러그인</th>
      <th>기본 역할</th>
      <th>내가 쓰는 방식</th>
      <th>에이전트 입장에서 좋은 점</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">periodic-notes</code></td>
      <td>날짜 기반 노트 생성 경로를 고정한다</td>
      <td>일간 기록을 <code class="language-plaintext highlighter-rouge">12_일일기록/YYYY/MM/YYYY-MM-DD.md</code> 규칙으로 만든다</td>
      <td>날짜 노트 위치를 매번 추측하지 않아도 된다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">templater-obsidian</code></td>
      <td>템플릿을 자동 적용한다</td>
      <td>일간 기록 경로 regex에 맞춰 같은 템플릿을 붙인다</td>
      <td>섹션 구조가 항상 같은 출발점에서 시작된다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">obsidian-day-planner</code></td>
      <td>일정 섹션을 타임라인으로 보여준다</td>
      <td><code class="language-plaintext highlighter-rouge">## 일정</code> 섹션을 읽어 시간표 UI로 바꾼다</td>
      <td>에이전트는 markdown만 정리하고 화면 출력은 플러그인이 맡는다</td>
    </tr>
  </tbody>
</table>

<h3 id="periodic-notes와-templater">Periodic Notes와 Templater</h3>

<p>기록 흐름은 노트 생성 규칙과 기본 섹션이 고정될 때 비로소 에이전트 친화적으로 바뀐다. <code class="language-plaintext highlighter-rouge">Periodic Notes</code>는 날짜 기반 생성 경로를 고정하고, <code class="language-plaintext highlighter-rouge">Templater</code>는 그 경로에 맞는 템플릿을 자동 적용한다. 이 둘이 같이 붙어 있어야 일간 기록이 단순한 빈 파일이 아니라, 처음부터 <code class="language-plaintext highlighter-rouge">일기</code>, <code class="language-plaintext highlighter-rouge">일정</code>, <code class="language-plaintext highlighter-rouge">메모</code>, <code class="language-plaintext highlighter-rouge">에이전트 메모</code> 같은 고정된 구조를 가진 작업 단위가 된다.</p>

<p>실제 설정은 거의 이렇게 읽힌다.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">//</span><span class="w"> </span><span class="err">periodic-notes</span><span class="w">
</span><span class="nl">"daily"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
  </span><span class="nl">"enabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
  </span><span class="nl">"format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"YYYY/MM/YYYY-MM-DD"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"folder"</span><span class="p">:</span><span class="w"> </span><span class="s2">"12_일일기록"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"template"</span><span class="p">:</span><span class="w"> </span><span class="s2">"_Templates/일일기록 일간 노트.md"</span><span class="w">
</span><span class="p">}</span><span class="w">

</span><span class="err">//</span><span class="w"> </span><span class="err">templater-obsidian</span><span class="w">
</span><span class="p">{</span><span class="w">
  </span><span class="nl">"regex"</span><span class="p">:</span><span class="w"> </span><span class="s2">"^12_일일기록/</span><span class="se">\\</span><span class="s2">d{4}/</span><span class="se">\\</span><span class="s2">d{2}/</span><span class="se">\\</span><span class="s2">d{4}-</span><span class="se">\\</span><span class="s2">d{2}-</span><span class="se">\\</span><span class="s2">d{2}</span><span class="se">\\</span><span class="s2">.md$"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"template"</span><span class="p">:</span><span class="w"> </span><span class="s2">"_Templates/일일기록 일간 노트.md"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>이 조합의 좋은 점은 “노트를 자동 생성한다”보다 “생성 규칙을 예측 가능하게 만든다”에 있다. <code class="language-plaintext highlighter-rouge">calendar</code>는 여기서 날짜 클릭과 이동을 도와주는 보조 유틸에 가깝다. 편하긴 하지만, 이 흐름의 핵심은 어디까지나 <code class="language-plaintext highlighter-rouge">Periodic Notes + Templater</code>다.</p>

<p>실제 일간 템플릿도 같은 방향이다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gu">## 일기</span>

<span class="gu">## 일정</span>

<span class="gu">## 메모</span>

<span class="gu">## 에이전트 메모</span>

<span class="gu">## 사진</span>
</code></pre></div></div>

<p>섹션 구조가 고정되면 사용자는 입력을 덜 고민하게 되고, 에이전트는 어디를 읽고 어디에 써야 하는지를 덜 틀리게 된다.</p>

<h3 id="day-planner">Day Planner</h3>

<p><code class="language-plaintext highlighter-rouge">obsidian-day-planner</code>는 여기서 기록을 다시 실행 인터페이스로 바꾼다. 이 vault에서는 일간 노트의 <code class="language-plaintext highlighter-rouge">## 일정</code>을 표준 섹션으로 쓰고, Day Planner가 그 섹션을 읽어 타임라인으로 보여준다.</p>

<p><img src="/assets/images/2026/04/14/obsidian-day-planner-timeline.png" alt="Day Planner에 반영된 시간표" class="align-center width-300px" /></p>

<p>내가 이 플러그인을 계속 남겨둔 이유는 AI 기능이 있어서가 아니다. 오히려 반대다. 에이전트는 markdown만 정리하면 되고, 화면 출력은 Day Planner가 맡는다. 그러면 사용자는 긴 노트 대신 “지금 무엇을 해야 하는가”를 바로 볼 수 있다.</p>

<h2 id="실행-플러그인-구성">실행 플러그인 구성</h2>

<p>실행 쪽에서는 <code class="language-plaintext highlighter-rouge">Base Board</code>와 <code class="language-plaintext highlighter-rouge">Dataview</code>가 각각 시각화와 조회를 맡는다. 둘 다 데이터를 따로 소유하지 않고 note와 frontmatter 위에 읽기 레이어를 얹는다는 점이 핵심이다.</p>

<table>
  <thead>
    <tr>
      <th>플러그인</th>
      <th>기본 역할</th>
      <th>내가 쓰는 방식</th>
      <th>에이전트 입장에서 좋은 점</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">base-board</code></td>
      <td>markdown과 frontmatter를 칸반처럼 보여준다</td>
      <td><code class="language-plaintext highlighter-rouge">06_TODO</code> 폴더의 note를 <code class="language-plaintext highlighter-rouge">status</code> 값 기준 보드로 묶는다</td>
      <td>보드 UI를 직접 조작하지 않고 파일 속성만 맞추면 된다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">dataview</code></td>
      <td>조건 조회와 집계를 보강한다</td>
      <td>TODO, 일정, 메모를 속성 조건으로 다시 묶어 본다</td>
      <td>note를 authoritative copy로 유지한 채 다양한 읽기 뷰를 만들 수 있다</td>
    </tr>
  </tbody>
</table>

<h3 id="base-board">Base Board</h3>

<p>실행 흐름은 UI가 데이터를 소유하지 않을 때 오래 간다. 이 점에서 <code class="language-plaintext highlighter-rouge">Base Board</code>는 생각보다 중요한 플러그인이다. 보드를 따로 관리하는 데이터베이스가 아니라, markdown 파일과 frontmatter를 읽어 칸반 뷰를 얹는 레이어이기 때문이다.</p>

<p><img src="/assets/images/2026/04/21/obsidian-base-board.png" alt="Base Board로 렌더링한 실제 TODO 보드 화면" class="align-center" /></p>

<p>실제 <code class="language-plaintext highlighter-rouge">.base</code> 파일을 보면 보드가 무엇을 읽고 어떻게 묶는지 바로 드러난다.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">filters</span><span class="pi">:</span>
  <span class="na">and</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s">file.inFolder("06_TODO")</span>
    <span class="pi">-</span> <span class="s">status != </span><span class="no">null</span>
<span class="na">views</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">type</span><span class="pi">:</span> <span class="s">kanban</span>
    <span class="na">name</span><span class="pi">:</span> <span class="s">TODO 칸반</span>
    <span class="na">groupBy</span><span class="pi">:</span>
      <span class="na">property</span><span class="pi">:</span> <span class="s">status</span>
    <span class="na">boardColumns</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">시작 전</span>
      <span class="pi">-</span> <span class="s">진행 중</span>
      <span class="pi">-</span> <span class="s">완료</span>
</code></pre></div></div>

<p>즉 카드 이동의 본질은 보드를 움직이는 일이 아니라, 결국 <code class="language-plaintext highlighter-rouge">status</code> 같은 frontmatter 값을 바꾸는 일이다. 그래서 에이전트도 보드 UI 자체를 조작하는 쪽보다 markdown 파일과 속성 값을 직접 다루는 쪽이 더 안정적이다.</p>

<p>TODO 템플릿도 이 원칙을 그대로 따른다.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">tags</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="s">&lt;% tp.file.folder(true).split("/").pop() %&gt;</span>
<span class="na">date</span><span class="pi">:</span> <span class="s">&lt;% tp.date.now("YYYY-MM-DD") %&gt;</span>
<span class="na">scheduled_date</span><span class="pi">:</span>
<span class="na">completed_date</span><span class="pi">:</span>
<span class="na">protected</span><span class="pi">:</span> <span class="no">false</span>
<span class="na">status</span><span class="pi">:</span> <span class="s">시작 전</span>
<span class="na">important</span><span class="pi">:</span> <span class="no">false</span>
<span class="na">kanban_order</span><span class="pi">:</span> <span class="m">0</span>
<span class="nn">---</span>
</code></pre></div></div>

<p>이렇게 보면 <code class="language-plaintext highlighter-rouge">Base Board</code>의 장점은 예쁜 칸반이 아니라, “파일이 곧 데이터”라는 사실을 깨지 않는 데 있다.</p>

<h3 id="dataview">Dataview</h3>

<p><code class="language-plaintext highlighter-rouge">Dataview</code>는 여기서 조회 레이어를 보강한다. Bases만으로는 어려운 동적 목록, 조건식, 집계, 역링크 기반 조회를 메워 주기 때문이다. 실제로는 특정 폴더의 TODO를 날짜순으로 다시 모아 보거나, 속성 기준으로 조건 목록을 만들 때 이 플러그인이 들어간다. 중요한 건 Dataview도 데이터 소유층이 아니라는 점이다. 실제 정보는 여전히 note와 frontmatter에 있고, Dataview는 그 위에 더 유연한 읽기 방법을 얹는다.</p>

<h2 id="정리-플러그인-구성">정리 플러그인 구성</h2>

<p>정리 쪽에서는 <code class="language-plaintext highlighter-rouge">obsidian-custom-attachment-location</code> 하나가 훨씬 큰 역할을 한다. 눈에 가장 덜 띄는 플러그인이지만, 에이전트 운영에서 실패를 가장 많이 줄이는 레이어이기도 하다.</p>

<table>
  <thead>
    <tr>
      <th>플러그인</th>
      <th>기본 역할</th>
      <th>내가 쓰는 방식</th>
      <th>에이전트 입장에서 좋은 점</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">obsidian-custom-attachment-location</code></td>
      <td>첨부 파일 경로와 이름을 자동 정리한다</td>
      <td>붙여넣는 순간 <code class="language-plaintext highlighter-rouge">_attachments/YYYY/MM/DD/</code> 규칙으로 저장한다</td>
      <td>loose file과 임시 이름이 줄어들어 이미지 처리 실패가 크게 줄어든다</td>
    </tr>
  </tbody>
</table>

<h3 id="custom-attachment-location">Custom Attachment Location</h3>

<p><code class="language-plaintext highlighter-rouge">obsidian-custom-attachment-location</code>은 붙여넣는 순간 첨부 파일 경로를 <code class="language-plaintext highlighter-rouge">_attachments/YYYY/MM/DD/</code> 규칙에 맞춰 주고, 이 단순한 자동화가 생각보다 큰 차이를 만든다.</p>

<p>실제 설정은 거의 그대로 이렇게 잡혀 있다.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"attachmentFolderPath"</span><span class="p">:</span><span class="w"> </span><span class="s2">"_attachments/${date:{momentJsFormat:'YYYY'}}/${date:{momentJsFormat:'MM'}}/${date:{momentJsFormat:'DD'}}"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"attachmentRenameMode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"All"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"shouldHandleRenames"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
  </span><span class="nl">"generatedAttachmentFileName"</span><span class="p">:</span><span class="w"> </span><span class="s2">"img-${date:{momentJsFormat:'YYYYMMDD-HHmmssSSS'}}"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>여기에 첨부 운영 플레이북이 한 번 더 기준을 잡아 준다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">-</span> 기본 저장 위치는 <span class="sb">`_attachments/YYYY/MM/DD/`</span>다.
<span class="p">-</span> <span class="sb">`_attachments/`</span> 루트에 첨부 파일을 직접 두지 않는다.
<span class="p">-</span> 파일명은 이미지 내용을 설명하는 짧은 한국어 캡션으로 정한다.
<span class="p">-</span> 옮기거나 이름을 바꿨다면 해당 파일을 참조하는 링크도 함께 갱신한다.
</code></pre></div></div>

<p>이 흐름이 중요한 이유는, 에이전트가 이미지를 다룰 때 “이 파일이 왜 여기 있지?” 같은 의문을 줄여 주기 때문이다. 경로와 이름 규칙이 고정돼 있으면 첨부 정리는 플레이북 문제로 내려가고, 매번 즉흥적으로 판단할 일이 크게 줄어든다.</p>

<h2 id="에이전트와의-결합">에이전트와의 결합</h2>

<p>에이전트는 플러그인을 직접 이해해서 똑똑해지는 게 아니라, 플러그인이 만들어 준 고정된 규칙 위에서 덜 틀리게 된다. 이번 시리즈에서 계속 등장한 <code class="language-plaintext highlighter-rouge">daily-note-followup</code>가 좋은 예다.</p>

<p>로컬 스킬은 작업 절차를 캡슐화하지만, 그 스킬이 매번 제멋대로 파일을 만들지는 않는다. 실제로는 아래처럼 canonical reference를 먼저 읽고 움직인다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">-</span> <span class="sb">`00_agent_docs/플레이북/Base Board 작업 지침.md`</span>
<span class="p">-</span> <span class="sb">`00_agent_docs/플레이북/일일기록 일정 작성 플레이북.md`</span>
<span class="p">-</span> <span class="sb">`00_agent_docs/플레이북/개인 정보 업데이트 플레이북.md`</span>
<span class="p">-</span> <span class="sb">`00_agent_docs/플레이북/13_my 업데이트 검증 체크리스트.md`</span>
</code></pre></div></div>

<p>여기서 플러그인 조합의 의미가 분명해진다.</p>

<table>
  <thead>
    <tr>
      <th>플러그인 조합</th>
      <th>실제 결과</th>
      <th>에이전트 입장에서 좋은 점</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Periodic Notes</code> + <code class="language-plaintext highlighter-rouge">Templater</code></td>
      <td>날짜별 노트가 같은 경로와 같은 섹션으로 생성된다</td>
      <td>파일명, 경로, 기본 구조를 매번 추측하지 않아도 된다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Day Planner</code> + <code class="language-plaintext highlighter-rouge">## 일정</code> 규칙</td>
      <td>같은 텍스트가 바로 실행 가능한 타임라인으로 보인다</td>
      <td>에이전트는 markdown만 정리하고, UI 출력은 플러그인이 맡는다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Base Board</code> + TODO 템플릿</td>
      <td>TODO 상태가 frontmatter로 고정된다</td>
      <td>보드 조작 대신 파일 속성만 정확히 맞추면 된다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Custom Attachment Location</code> + 첨부 플레이북</td>
      <td>첨부가 날짜 경로와 고정 규칙으로 정리된다</td>
      <td>이미지 이동, rename, 링크 보정에서 실패가 줄어든다</td>
    </tr>
    <tr>
      <td>전역 Obsidian 스킬 + 로컬 스킬</td>
      <td>기본 앱 조작 능력과 vault 맞춤 절차가 분리된다</td>
      <td>공용 능력과 개인 규칙을 한 층에 섞지 않아도 된다</td>
    </tr>
  </tbody>
</table>

<p>결국 전역 스킬은 Obsidian과 상호작용하는 기본 능력을 주고, 로컬 스킬은 내 Vault 규칙에 맞는 작업 절차를 얹는다. 이 둘이 잘 겹치려면, 그 사이에 있는 플러그인과 템플릿 규칙이 먼저 안정돼 있어야 한다.</p>

<h2 id="운영-포인트">운영 포인트</h2>

<p>좋은 플러그인 구성이란 기능이 많은 구성이 아니라 authoritative copy가 분명한 구성이다. 실제로 오래 쓰다 보면 기능보다 “무엇을 기준 문서로 삼을 것인가”가 더 중요해진다.</p>

<table>
  <thead>
    <tr>
      <th>운영 포인트</th>
      <th>자주 생기는 문제</th>
      <th>현재 운영 방식</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Day Planner</td>
      <td><code class="language-plaintext highlighter-rouge">## 일정</code> 안의 링크가 재직렬화 과정에서 깨질 수 있다</td>
      <td>일정 섹션은 plain text로 유지하고, 링크는 <code class="language-plaintext highlighter-rouge">## 메모</code>나 관련 노트로 보낸다</td>
    </tr>
    <tr>
      <td>Base Board</td>
      <td>보드를 데이터베이스처럼 오해하거나 상태 값을 추측하기 쉽다</td>
      <td><code class="language-plaintext highlighter-rouge">.base</code>와 플레이북을 먼저 읽고, 실제 파일과 frontmatter를 직접 수정한다</td>
    </tr>
    <tr>
      <td>Templater + Periodic Notes</td>
      <td>생성 경로와 템플릿 매핑이 어긋나면 노트 구조가 흔들린다</td>
      <td>날짜 경로, regex, 템플릿 파일을 같이 맞춘다</td>
    </tr>
    <tr>
      <td>Custom Attachment Location</td>
      <td>루트에 loose file이 쌓이거나 임시 이름이 남기 쉽다</td>
      <td><code class="language-plaintext highlighter-rouge">_attachments/YYYY/MM/DD/</code> 규칙과 첨부 플레이북을 같이 유지한다</td>
    </tr>
    <tr>
      <td>Dataview</td>
      <td>조회 레이어를 데이터 소유층처럼 쓰고 싶어진다</td>
      <td>Dataview는 읽기와 집계만 맡기고, 실제 데이터는 note/frontmatter에 둔다</td>
    </tr>
  </tbody>
</table>

<p>지금 내 기준에서 “핵심 플러그인”은 예쁜 기능을 추가하는 것보다, 에이전트가 덜 틀리고 사용자는 덜 헤매게 만드는 쪽에 더 가깝다.</p>

<h2 id="마무리">마무리</h2>

<p>내가 Obsidian을 메모 앱이 아니라 작업 공간으로 계속 쓰는 이유는, 모든 걸 바닥부터 만들지 않아도 되기 때문이다. <code class="language-plaintext highlighter-rouge">Periodic Notes</code>, <code class="language-plaintext highlighter-rouge">Templater</code>, <code class="language-plaintext highlighter-rouge">Day Planner</code>, <code class="language-plaintext highlighter-rouge">Base Board</code>, <code class="language-plaintext highlighter-rouge">Dataview</code>, <code class="language-plaintext highlighter-rouge">Custom Attachment Location</code>처럼 각자 작은 역할을 맡은 플러그인들이 연결되면, 기록은 기록대로, 실행은 실행대로, 정리는 정리대로 서로 다른 책임을 분담하게 된다.</p>

<p>그 위에서 에이전트는 갑자기 똑똑해지는 게 아니라, 더 적게 틀리게 된다. 이 시리즈의 5편에서는 Obsidian 기본 능력을 주는 전역 스킬을 왜 전역에 두고, 내 개인 비서용 절차는 왜 로컬 스킬로 분리했는지 정리해 보려 한다.</p>]]></content><author><name>Hyejun An(26)</name><email>jagaldol.dev@gmail.com</email></author><category term="obsidian" /><summary type="html"><![CDATA[VS Code 위에서도 개인 비서용 환경을 만들 수는 있다. 문제는 일정 화면, 칸반 보드, 템플릿, 첨부 정리까지 붙이기 시작하면 다시 도구를 만드는 일로 돌아가기 쉽다는 점이다. 내가 Obsidian을 계속 쓰는 이유는 markdown 파일 기반이라서만이 아니라, 이미 잘 만들어진 UI/UX와 플러그인 생태계 위에 에이전트를 얹으면 바닥부터 다시 짓지 않고도 통일성 있는 작업 공간을 만들 수 있기 때문이다.]]></summary></entry><entry><title type="html">AI Agent로 Obsidian 개인 비서를 오래 쓰는 법 - 지침과 장기 메모리 운영 실전편</title><link href="https://blog.jagaldol.com/obsidian/obsidian-ai-agent-maintenance/" rel="alternate" type="text/html" title="AI Agent로 Obsidian 개인 비서를 오래 쓰는 법 - 지침과 장기 메모리 운영 실전편" /><published>2026-04-20T17:02:55+09:00</published><updated>2026-04-20T17:02:55+09:00</updated><id>https://blog.jagaldol.com/obsidian/obsidian-ai-agent-maintenance</id><content type="html" xml:base="https://blog.jagaldol.com/obsidian/obsidian-ai-agent-maintenance/"><![CDATA[<p>Obsidian 구조를 잘 만들어도 오래 가는 건 별개다. 시간이 지나면 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>는 두꺼워지고, 장기 메모리와 임시 판단이 섞이고, 새 규칙이 생길 때마다 어디를 고쳐야 할지 헷갈리기 시작한다. <a href="/obsidian/obsidian-ai-assistant-daily-note/">1편</a>과 <a href="/obsidian/obsidian-ai-agent-vault-structure/">2편</a>이 왜 이 시스템을 다시 시도하게 됐는지와 구조를 어떻게 나눴는지를 다뤘다면, 이번 글은 새 정보가 생겼을 때 실제로 무엇을 읽고 어디를 고치는지를 다룬다.</p>

<p><img src="/assets/images/2026/04/20/obsidian-agent-maintenance-hero.png" alt="AI Agent가 Obsidian 문서와 장기 메모리를 정리하는 구조를 상징적으로 표현한 대표 이미지" class="align-center" /></p>

<h2 id="들어가기에-앞서-구조-다음에는-운영이-남는다">들어가기에 앞서: 구조 다음에는 운영이 남는다</h2>

<p>2편에서 구조를 나눴다면, 3편에서는 그 구조를 어떻게 덜 망가지게 유지하는지 본다. 폴더, 허브, <code class="language-plaintext highlighter-rouge">AGENTS.md</code>, 플레이북, 스킬을 한 번 만들어 둔다고 끝나지 않는다. 실제 운영에서는 새로운 사실이 일간 노트에 들어오고, 사용자 선호가 더 분명해지고, 작업 절차가 길어지면서 문서 역할이 계속 흔들린다.</p>

<p>이 글에서는 실제 vault의 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>, <code class="language-plaintext highlighter-rouge">에이전트 문서 운영</code>, <code class="language-plaintext highlighter-rouge">개인 정보 업데이트 플레이북</code>, 장기 메모 업데이트 검증 체크리스트(<code class="language-plaintext highlighter-rouge">13_my 업데이트 검증 체크리스트</code>), <code class="language-plaintext highlighter-rouge">daily-note-followup</code> 스킬을 바탕으로, 공개 가능한 범위만 일반화해 excerpt로 보여준다. 핵심은 처음부터 완벽한 문서를 쓰는 것이 아니라, 사용할수록 더 얇고 정확한 문서 체계로 수선하는 것이다.</p>

<h2 id="운영-원칙">운영 원칙</h2>

<p>문서 유지보수는 “무엇을 안다”보다 “이 정보가 어떤 종류인가”를 먼저 가르는 일에 가깝다. 그래서 새 입력이 오면 기록보다 분류를 먼저 한다.</p>

<h3 id="기본-분기-표">기본 분기 표</h3>

<table>
  <thead>
    <tr>
      <th>상황</th>
      <th>먼저 묻는 질문</th>
      <th>기본 수정 대상</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>오늘 있었던 사건이나 일정</td>
      <td>이 정보가 날짜를 벗겨도 남을 가치가 있는가</td>
      <td>일간 기록</td>
    </tr>
    <tr>
      <td>반복해서 드러난 선호나 판단 기준</td>
      <td>단발 사건이 아니라 장기 패턴인가</td>
      <td>대표 장기 메모 노트</td>
    </tr>
    <tr>
      <td>여러 번 반복될 작업 절차</td>
      <td>누가 다시 같은 작업을 수행할 가능성이 높은가</td>
      <td><code class="language-plaintext highlighter-rouge">00_agent_docs/플레이북</code></td>
    </tr>
    <tr>
      <td>모든 작업에 공통으로 적용되는 규칙</td>
      <td>이 규칙이 vault 전역 불변식인가</td>
      <td><code class="language-plaintext highlighter-rouge">AGENTS.md</code></td>
    </tr>
    <tr>
      <td>환경이나 도구의 안정적인 사실</td>
      <td>절차가 아니라 기준점인가</td>
      <td><code class="language-plaintext highlighter-rouge">00_agent_docs/장기 메모리</code></td>
    </tr>
  </tbody>
</table>

<h3 id="세-가지-운영-기준">세 가지 운영 기준</h3>

<h4 id="일회성인가-장기적인가">일회성인가 장기적인가</h4>

<p>같은 정보라도 날짜성 사건이면 일단 일간 기록에 남기고, 날짜를 벗겨도 다시 참고할 가치가 있을 때만 장기 메모로 올린다. 장기 기억은 많이 쌓는 것보다, 나중에도 다시 쓸 수 있는 정보만 남기는 쪽이 더 중요하다.</p>

<h4 id="전역-규칙인가-작업-절차인가">전역 규칙인가 작업 절차인가</h4>

<p>모든 일을 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>에 적기 시작하면 금방 라우터가 아니라 매뉴얼이 된다. 전역 불변 규칙은 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>, 단계별 수행 절차는 플레이북, 실제 실행 순서는 스킬로 내려보내는 분리가 핵심이다.</p>

<h4 id="새-문서가-필요한가-기존-문서를-갱신하면-되는가">새 문서가 필요한가 기존 문서를 갱신하면 되는가</h4>

<p>운영 문서는 새 파일을 만드는 비용도 크다. 같은 축의 정보가 이미 있으면 먼저 기존 문서에 흡수하고, 문서가 길어져 역할이 갈릴 때만 분리한다. 이 기준이 없으면 같은 규칙이 여러 파일에 중복되기 쉽다.</p>

<h2 id="실전-장면-1-새-정보가-생겼을-때">실전 장면 1: 새 정보가 생겼을 때</h2>

<p>새 입력이 들어오면 바로 장기 메모를 고치는 게 아니라, 먼저 그것이 사건인지 패턴인지 해석 수정 신호인지 분리해야 한다. 이 단계가 빠지면 장기 메모가 일기 복사본처럼 변한다.</p>

<h3 id="대표-excerpt">대표 excerpt</h3>

<h4 id="개인-정보-업데이트-플레이북의-기본-흐름">개인 정보 업데이트 플레이북의 기본 흐름</h4>

<p>실제 플레이북을 단순화하면 아래 순서에 가깝다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">1.</span> 입력의 핵심 사실을 먼저 뽑는다.
<span class="p">2.</span> 이 입력이 일간 노트에 남길 사건인지부터 판단한다.
<span class="p">3.</span> 관련 일간 기록과 기존 장기 메모 노트를 먼저 읽는다.
<span class="p">4.</span> <span class="sb">`새 사실`</span>, <span class="sb">`기존 패턴의 추가 증거`</span>, <span class="sb">`기존 해석 수정 신호`</span>로 구분한다.
<span class="p">5.</span> 장기 가치가 높을 때만 해당 대표 장기 메모 노트로 승격한다.
</code></pre></div></div>

<h4 id="검증-체크리스트가-마지막에-묻는-질문">검증 체크리스트가 마지막에 묻는 질문</h4>

<p>실제 체크리스트의 요지는 “썼는가”가 아니라 “비교했는가”다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">-</span> 이번 입력은 새로운 사실인가, 기존 패턴의 추가 증거인가, 기존 해석 수정 신호인가
<span class="p">-</span> 직접 비교해야 할 기존 노트는 무엇인가
<span class="p">-</span> 이미 기록된 사건의 연속 설명은 아닌가
<span class="p">-</span> 기존 기록과 충돌하거나 수정해야 할 내용은 없는가
<span class="p">-</span> 일반화 가능한 성향이나 기준이 드러났다면 어느 상시 노트에 올려야 하는가
</code></pre></div></div>

<h3 id="입력-분기-표">입력 분기 표</h3>

<table>
  <thead>
    <tr>
      <th>입력 종류</th>
      <th>남길 위치</th>
      <th>바로 올리면 안 되는 경우</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>그날의 사건, 약속, 이동</td>
      <td>일간 기록</td>
      <td>날짜를 벗긴 장기 의미가 아직 불명확할 때</td>
    </tr>
    <tr>
      <td>사용자가 직접 말한 안정적인 선호</td>
      <td>대표 장기 메모 노트</td>
      <td>한 번만 나온 감상인데 반복성이나 명시성이 약할 때</td>
    </tr>
    <tr>
      <td>기존 패턴을 강화하는 추가 증거</td>
      <td>기존 장기 메모 노트 업데이트</td>
      <td>이미 기록된 사건의 후속 설명일 뿐인지 확인 전일 때</td>
    </tr>
    <tr>
      <td>기존 해석을 뒤집는 신호</td>
      <td>장기 메모와 필요 시 분석 스냅샷까지 재검토</td>
      <td>기존 노트와 비교 없이 새 사실처럼 병렬 추가할 때</td>
    </tr>
  </tbody>
</table>

<h3 id="바로-적용할-규칙">바로 적용할 규칙</h3>

<ul>
  <li>일단 일간 기록에 남기고, 장기 가치가 확인되면 장기 메모로 승격한다.</li>
  <li>장기 메모를 반영하기 전에는 같은 축의 기존 노트를 먼저 읽어 중복과 충돌을 확인한다.</li>
  <li>새 입력이 해석을 바꾸는 신호라면, 상시 노트만 고치지 말고 분석 스냅샷까지 같이 볼지 판단한다.</li>
</ul>

<h2 id="실전-장면-2-새-규칙이-생겼을-때">실전 장면 2: 새 규칙이 생겼을 때</h2>

<p>새 규칙은 많아지는데 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>는 얇게 남아 있어야 한다. 그래서 규칙이 생길 때 가장 먼저 할 일은 “무슨 규칙인가”를 분류하는 것이다.</p>

<h3 id="대표-excerpt-1">대표 excerpt</h3>

<h4 id="agentsmd가-직접-소유하는-것"><code class="language-plaintext highlighter-rouge">AGENTS.md</code>가 직접 소유하는 것</h4>

<p>실제 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>의 역할을 줄이면 아래 세 줄로 요약된다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">-</span> 역할은 <span class="sb">`전역 불변 규칙 + 작업 트리거 + 정답 문서 안내`</span>로 한정한다.
<span class="p">-</span> 새 노트가 생겼다는 이유만으로 이 문서를 갱신하지 않는다.
<span class="p">-</span> 폴더 역할, 경로 패턴, 예외 규칙, 문서 라우팅이 바뀔 때만 갱신한다.
</code></pre></div></div>

<h4 id="운영-문서의-분류-기준">운영 문서의 분류 기준</h4>

<p><code class="language-plaintext highlighter-rouge">00_agent_docs/운영/에이전트 문서 운영.md</code>는 새 규칙을 어디로 보낼지 이렇게 자른다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">-</span> 전역 불변 규칙, 공통 경로 패턴, 예외 규칙이면 <span class="sb">`AGENTS.md`</span>
<span class="p">-</span> 사용자 선호나 금지사항이면 <span class="sb">`사용자 요구사항/`</span>
<span class="p">-</span> 단계별 수행 절차면 <span class="sb">`플레이북/`</span>
<span class="p">-</span> 안정적인 환경 정보면 <span class="sb">`장기 메모리/`</span>
</code></pre></div></div>

<h3 id="규칙-배치-표">규칙 배치 표</h3>

<table>
  <thead>
    <tr>
      <th>새 규칙 예시</th>
      <th>들어갈 위치</th>
      <th>이유</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>“새 노트를 만들기 전 기존 노트를 먼저 검색한다”</td>
      <td><code class="language-plaintext highlighter-rouge">AGENTS.md</code></td>
      <td>vault 전역에 적용되는 불변 규칙이기 때문</td>
    </tr>
    <tr>
      <td>“Day Planner용 <code class="language-plaintext highlighter-rouge">## 일정</code>에는 링크를 넣지 않는다”</td>
      <td><code class="language-plaintext highlighter-rouge">일일기록 일정 작성 플레이북</code></td>
      <td>특정 작업의 문법과 플러그인 제약이기 때문</td>
    </tr>
    <tr>
      <td>“사용자는 특정 형식의 응답을 선호한다”</td>
      <td><code class="language-plaintext highlighter-rouge">사용자 요구사항</code></td>
      <td>전역 구조 규칙이 아니라 사용자 선호이기 때문</td>
    </tr>
    <tr>
      <td>“메인 TODO 보드는 <code class="language-plaintext highlighter-rouge">Base Board</code>로 렌더링한다”</td>
      <td><code class="language-plaintext highlighter-rouge">장기 메모리</code></td>
      <td>자주 참조하지만 절차가 아닌 안정적 환경 사실이기 때문</td>
    </tr>
  </tbody>
</table>

<h3 id="바로-적용할-규칙-1">바로 적용할 규칙</h3>

<ul>
  <li><code class="language-plaintext highlighter-rouge">AGENTS.md</code>는 라우터처럼 쓰고, 설명서처럼 키우지 않는다.</li>
  <li>같은 규칙이 반복 실행 절차라면 플레이북으로 내리고, 실제 순서는 스킬이 읽게 만든다.</li>
  <li>새 규칙이 생겼을 때는 “어디를 고칠까”보다 “이 규칙의 수명이 얼마나 긴가”를 먼저 본다.</li>
</ul>

<h2 id="실전-장면-3-스킬이-문서를-읽고-움직일-때">실전 장면 3: 스킬이 문서를 읽고 움직일 때</h2>

<p>실제 운영에서는 스킬이 문서를 대신 읽고 움직이기 때문에, 문서 수정은 곧 실행 규칙 수정이 된다. 이 점을 이해하면 왜 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>를 얇게 유지해야 하는지도 같이 설명된다.</p>

<h3 id="대표-excerpt-2">대표 excerpt</h3>

<p><code class="language-plaintext highlighter-rouge">daily-note-followup</code> 스킬은 vault를 수정하기 전에 참조할 문서를 직접 지정해 둔다. 실제 스킬 파일의 핵심만 추리면 이런 구조다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Before mutating the vault, use these canonical references:
<span class="p">
-</span> <span class="sb">`00_agent_docs/플레이북/Base Board 작업 지침.md`</span>
<span class="p">-</span> <span class="sb">`00_agent_docs/플레이북/일일기록 일정 작성 플레이북.md`</span>
<span class="p">-</span> <span class="sb">`00_agent_docs/플레이북/개인 정보 업데이트 플레이북.md`</span>
<span class="p">-</span> <span class="sb">`00_agent_docs/플레이북/13_my 업데이트 검증 체크리스트.md`</span>
</code></pre></div></div>

<p>이 한 덩어리만 봐도 역할 분리가 분명하다. <code class="language-plaintext highlighter-rouge">AGENTS.md</code>는 작업 트리거와 섹션 경계만 알려주고, 실제 문법과 검증 질문은 플레이북과 체크리스트가 맡는다. 스킬은 그 문서를 읽는 실행기다.</p>

<h3 id="문서-계층과-실행-계층">문서 계층과 실행 계층</h3>

<table>
  <thead>
    <tr>
      <th>계층</th>
      <th>맡는 역할</th>
      <th>바꾸면 같이 영향을 받는 것</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">AGENTS.md</code></td>
      <td>전역 경계, 라우팅, 예외 규칙</td>
      <td>어떤 문서를 먼저 읽어야 하는지</td>
    </tr>
    <tr>
      <td>플레이북</td>
      <td>작업별 절차와 문법</td>
      <td>특정 작업의 판단 기준과 출력 형식</td>
    </tr>
    <tr>
      <td>체크리스트</td>
      <td>누락 방지용 검증 질문</td>
      <td>비교, 승격, 보류 판단의 정확도</td>
    </tr>
    <tr>
      <td>스킬</td>
      <td>실제 실행 순서와 응답 계약</td>
      <td>어떤 문서를 언제 읽고 어떤 작업을 자동 반영하는지</td>
    </tr>
  </tbody>
</table>

<h3 id="바로-적용할-규칙-2">바로 적용할 규칙</h3>

<ul>
  <li>작업 절차를 바꾸고 싶다면 스킬만 고치지 말고, 스킬이 읽는 기준 문서부터 점검한다.</li>
  <li>실행 결과가 흔들릴 때는 스킬 프롬프트보다 플레이북과 체크리스트의 authoritative copy가 어디인지 먼저 본다.</li>
  <li><code class="language-plaintext highlighter-rouge">AGENTS.md</code>까지 세부 절차를 밀어 올리지 않아야, 같은 규칙을 한 군데만 고쳐도 실행 계층 전체가 같이 정렬된다.</li>
</ul>

<h2 id="실전-장면-4-문서가-비대해질-때">실전 장면 4: 문서가 비대해질 때</h2>

<p>문서가 망가지는 신호는 보통 길이보다 역할 혼합에서 먼저 보인다. 조사 노트가 운영 문서에 섞이거나, 최신성이 높은 사실이 장기 메모리에 들어오기 시작하면 구조는 서서히 무너진다.</p>

<h3 id="대표-excerpt-3">대표 excerpt</h3>

<h4 id="운영-문서가-막는-비대화">운영 문서가 막는 비대화</h4>

<p>실제 운영 문서는 <code class="language-plaintext highlighter-rouge">00_agent_docs</code>에 이런 것을 두지 말라고 못 박는다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">-</span> 주제별 조사 노트, 원시 데이터, 서비스별 산출물을 두지 않는다.
<span class="p">-</span> 새 문서를 추가할 때는 먼저 기존 문서와 중복 여부를 확인한다.
<span class="p">-</span> 내용이 폐기되었거나 더 이상 유효하지 않으면 삭제하거나 관련 문서에 통합한다.
</code></pre></div></div>

<h4 id="장기-메모리에-남길-것과-빼야-할-것">장기 메모리에 남길 것과 빼야 할 것</h4>

<p>장기 메모리 문서는 범위를 더 좁게 잡는다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>여기에 기록할 것
<span class="p">
-</span> 현재 vault의 핵심 구조와 운영 방식
<span class="p">-</span> 자주 참조하는 메인 보드, 허브 노트, 기준 폴더
<span class="p">-</span> 설치된 핵심 플러그인과 그 역할

기록하지 않을 것
<span class="p">
-</span> 최신성이 매우 높은 사실
<span class="p">-</span> 특정 조사 작업의 결과
<span class="p">-</span> 금방 폐기될 임시 판단
</code></pre></div></div>

<h3 id="비대화-신호-표">비대화 신호 표</h3>

<table>
  <thead>
    <tr>
      <th>비대화 신호</th>
      <th>의미</th>
      <th>필요한 조치</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">00_agent_docs</code> 안에 조사 노트와 원시 데이터가 쌓인다</td>
      <td>운영 문서와 작업 산출물의 경계가 흐려졌다</td>
      <td>해당 주제 폴더로 이동하고 운영 문서에는 라우팅만 남긴다</td>
    </tr>
    <tr>
      <td>같은 규칙이 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>, 플레이북, 스킬에 반복된다</td>
      <td>authoritative copy가 불분명하다</td>
      <td>한 문서를 기준 문서로 정하고 나머지는 참조 관계로 정리한다</td>
    </tr>
    <tr>
      <td>장기 메모리에 최신성이 높은 사실이 들어간다</td>
      <td>장기 메모리가 캐시가 아니라 로그처럼 쓰이고 있다</td>
      <td>일간 노트나 해당 작업 노트로 내려보낸다</td>
    </tr>
    <tr>
      <td>새 노트가 생길 때마다 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>를 고치고 싶어진다</td>
      <td>전역 규칙과 폴더 인덱스를 혼동하고 있다</td>
      <td>허브나 운영 문서로 보내고 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>는 구조 변경 때만 갱신한다</td>
    </tr>
    <tr>
      <td>완료된 마이그레이션 기록, 차수, 수량이 운영 문서에 남는다</td>
      <td>유지 정책과 작업 로그가 섞였다</td>
      <td>관련 TODO나 작업 노트로 옮긴다</td>
    </tr>
  </tbody>
</table>

<h3 id="바로-적용할-규칙-3">바로 적용할 규칙</h3>

<ul>
  <li>문서가 길어졌다는 사실보다, 한 문서가 두 역할 이상을 동시에 맡기 시작했는지를 먼저 본다.</li>
  <li>지우는 것도 유지보수다. 더 이상 유효하지 않은 운영 정보는 남겨두지 말고 삭제하거나 통합한다.</li>
  <li>장기 메모리는 “오래 남아야 하는 것”만 넣고, “최근에 알게 된 것”은 자동 승격하지 않는다.</li>
</ul>

<h2 id="마무리">마무리</h2>

<p>Obsidian 개인 비서를 오래 쓰는 일은 좋은 구조를 한 번 만드는 것으로 끝나지 않는다. 새 정보가 들어올 때마다 사건과 장기 맥락을 구분하고, 새 규칙이 생길 때마다 전역 규칙과 작업 절차를 분리하고, 스킬이 읽는 기준 문서를 계속 authoritative copy로 유지해야 한다.</p>

<p>그래서 3편의 핵심은 거창한 유지보수 철학이 아니다. <code class="language-plaintext highlighter-rouge">AGENTS.md</code>는 얇게, 플레이북은 구체적으로, 장기 메모리는 좁게, 스킬은 그 문서를 읽는 실행기로 두는 것이다. 다음 편에서는 왜 VS Code 대신 Obsidian을 작업 공간으로 쓰는지, 그리고 실제로 남겨둔 핵심 플러그인들이 이 흐름을 어떻게 받쳐주는지 이어서 정리해보겠다.</p>]]></content><author><name>Hyejun An(26)</name><email>jagaldol.dev@gmail.com</email></author><category term="obsidian" /><summary type="html"><![CDATA[Obsidian 구조를 잘 만들어도 오래 가는 건 별개다. 시간이 지나면 AGENTS.md는 두꺼워지고, 장기 메모리와 임시 판단이 섞이고, 새 규칙이 생길 때마다 어디를 고쳐야 할지 헷갈리기 시작한다. 1편과 2편이 왜 이 시스템을 다시 시도하게 됐는지와 구조를 어떻게 나눴는지를 다뤘다면, 이번 글은 새 정보가 생겼을 때 실제로 무엇을 읽고 어디를 고치는지를 다룬다.]]></summary></entry><entry><title type="html">내 맥에 맞는 로컬 LLM 찾기 - llmfit로 추천 모델 고르는 법</title><link href="https://blog.jagaldol.com/ai/llmfit-local-llm-on-mac/" rel="alternate" type="text/html" title="내 맥에 맞는 로컬 LLM 찾기 - llmfit로 추천 모델 고르는 법" /><published>2026-04-15T18:00:00+09:00</published><updated>2026-04-15T18:00:00+09:00</updated><id>https://blog.jagaldol.com/ai/llmfit-local-llm-on-mac</id><content type="html" xml:base="https://blog.jagaldol.com/ai/llmfit-local-llm-on-mac/"><![CDATA[<p>로컬 LLM을 써보려 하면 가장 먼저 부딪히는 문제는 “어떤 모델이 제일 좋나?”보다 “내 맥에서 어떤 모델이 현실적으로 돌아가나?”다. <code class="language-plaintext highlighter-rouge">llmfit</code>는 이 질문에 먼저 답해주는 도구다. 모델을 직접 실행하는 프로그램은 아니지만, 내 하드웨어에 맞는 후보를 먼저 좁혀준다는 점에서 로컬 LLM 입문 단계에서 꽤 유용하다.</p>

<p><img src="/assets/images/2026/04/15/llmfit-dashboard.png" alt="llmfit 추천 모델 대시보드" class="align-center" /></p>

<div class="jekyll-linkpreview-wrapper">
  <div class="jekyll-linkpreview-wrapper-inner">
    <div class="jekyll-linkpreview-content">
      <div class="jekyll-linkpreview-image">
        <a href="https://alexsjones-llmfit.mintlify.app" target="_blank">
          <img src="https://alexsjones-llmfit.mintlify.app/mintlify-assets/_next/image?url=%2F_mintlify%2Fapi%2Fog%3Fdivision%3DDocumentation%26title%3Dllmfit%2BDocumentation%26description%3DRight-size%2BLLM%2Bmodels%2Bto%2Byour%2Bsystem%2527s%2BRAM%252C%2BCPU%252C%2Band%2BGPU%26logoLight%3Dhttps%253A%252F%252Fmedia.brand.dev%252F62d0fa4e-c959-4f96-8e84-9000c09a3b01.png%26logoDark%3Dhttps%253A%252F%252Fmedia.brand.dev%252F62d0fa4e-c959-4f96-8e84-9000c09a3b01.png%26primaryColor%3D%2523eabfac%26lightColor%3D%2523796a7b%26darkColor%3D%2523c0c093%26backgroundLight%3D%2523ffffff%26backgroundDark%3D%25230b0b0d&amp;w=1200&amp;q=100" />
        </a>
      </div>

      <div class="jekyll-linkpreview-body">
        <h2 class="jekyll-linkpreview-title">
          <a href="https://alexsjones-llmfit.mintlify.app" target="_blank">llmfit Documentation - llmfit</a>
        </h2>
        <div class="jekyll-linkpreview-description">Right-size LLM models to your system's RAM, CPU, and GPU</div>
      </div>
    </div>
    <div class="jekyll-linkpreview-footer">
      <a href="//alexsjones-llmfit.mintlify.app" target="_blank">alexsjones-llmfit.mintlify.app</a>
    </div>
  </div>
</div>

<div class="jekyll-linkpreview-wrapper">
  <div class="jekyll-linkpreview-wrapper-inner">
    <div class="jekyll-linkpreview-content">
      <div class="jekyll-linkpreview-image">
        <a href="https://github.com/AlexsJones/llmfit" target="_blank">
          <img src="https://opengraph.githubassets.com/b4ff909fdd1d0dbbc3ca86c5ca10bfe8f08cfc3b76c2ec0154d986d0ea3dd3ba/AlexsJones/llmfit" />
        </a>
      </div>

      <div class="jekyll-linkpreview-body">
        <h2 class="jekyll-linkpreview-title">
          <a href="https://github.com/AlexsJones/llmfit" target="_blank">GitHub - AlexsJones/llmfit: Hundreds of models &amp; providers. One command to find what runs on your hardware.</a>
        </h2>
        <div class="jekyll-linkpreview-description">Hundreds of models &amp; providers. One command to find what runs on your hardware. - AlexsJones/llmfit</div>
      </div>
    </div>
    <div class="jekyll-linkpreview-footer">
      <a href="//github.com" target="_blank">github.com</a>
    </div>
  </div>
</div>

<h2 id="llmfit이란">llmfit이란</h2>

<p><code class="language-plaintext highlighter-rouge">llmfit</code>는 모델 실행기라기보다 하드웨어 적합도 기반 추천 도구에 가깝다. 여러 모델을 무작정 내려받아 시험해보기 전에, 현재 기기에서 가능성이 높은 후보를 먼저 정리해준다는 점이 핵심이다.</p>

<table>
  <thead>
    <tr>
      <th>항목</th>
      <th>내용</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>역할</td>
      <td>현재 하드웨어에서 현실적으로 돌릴 수 있는 로컬 LLM 후보 추천</td>
    </tr>
    <tr>
      <td>입력</td>
      <td>CPU, RAM, GPU와 용도별 기준값</td>
    </tr>
    <tr>
      <td>출력</td>
      <td><code class="language-plaintext highlighter-rouge">Fit</code>, <code class="language-plaintext highlighter-rouge">Score</code>, <code class="language-plaintext highlighter-rouge">tok/s</code>, <code class="language-plaintext highlighter-rouge">Mem %</code>, <code class="language-plaintext highlighter-rouge">Mode</code>, <code class="language-plaintext highlighter-rouge">Quant</code> 등이 포함된 추천 목록</td>
    </tr>
    <tr>
      <td>잘하는 일</td>
      <td>후보군 좁히기, 비교 기준 제공, 다운로드 전 사전 판단</td>
    </tr>
    <tr>
      <td>하지 않는 일</td>
      <td>모델 자체 실행, 채팅 UI 제공, 추론 서버 대체</td>
    </tr>
  </tbody>
</table>

<p><code class="language-plaintext highlighter-rouge">llmfit</code>의 강점은 모델 자체의 절대 서열을 보여주는 데 있지 않다. 내 맥에서 어느 정도 여유로 돌아갈지, 어떤 용도에 더 맞는지까지 함께 보여주기 때문에 초기 선택 비용을 줄여준다. 특히 <code class="language-plaintext highlighter-rouge">Ollama</code>나 <code class="language-plaintext highlighter-rouge">LM Studio</code>에서 어떤 모델을 먼저 받아볼지 고민할 때 유용하다.</p>

<h2 id="설치와-실행">설치와 실행</h2>

<p>macOS에서는 Homebrew 설치가 가장 단순하다. 설치 후 <code class="language-plaintext highlighter-rouge">llmfit</code>를 실행하면 바로 추천 모델 대시보드를 볼 수 있다.</p>

<table>
  <thead>
    <tr>
      <th>단계</th>
      <th>내용</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Homebrew로 <code class="language-plaintext highlighter-rouge">llmfit</code> 설치</td>
    </tr>
    <tr>
      <td>2</td>
      <td>터미널에서 <code class="language-plaintext highlighter-rouge">llmfit</code> 실행</td>
    </tr>
    <tr>
      <td>3</td>
      <td>대시보드에서 현재 하드웨어 기준 추천 후보 확인</td>
    </tr>
  </tbody>
</table>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew <span class="nb">install </span>llmfit
llmfit
</code></pre></div></div>

<h2 id="추천-모델-판단-기준">추천 모델 판단 기준</h2>

<p><code class="language-plaintext highlighter-rouge">llmfit</code>의 핵심은 컬럼을 전부 외우는 데 있지 않다. 실제로는 몇 개 지표만 잘 읽어도 추천 모델을 꽤 빠르게 좁힐 수 있다.</p>

<table>
  <thead>
    <tr>
      <th>지표</th>
      <th>의미</th>
      <th>추천 모델 고를 때의 쓰임</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Fit</code></td>
      <td>현재 하드웨어에서 무리 없이 도는 정도</td>
      <td>아예 무리인 후보를 가장 먼저 걸러낸다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Score</code></td>
      <td>현재 환경 기준 종합 추천 점수</td>
      <td>절대 성능이 아니라, 내 환경에서 균형이 좋은 후보를 찾는다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">tok/s*</code></td>
      <td>예상 토큰 처리 속도</td>
      <td>체감 응답 속도를 가늠한다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Mem %</code></td>
      <td>가용 메모리 대비 사용 비율</td>
      <td>메모리 여유가 충분한지 확인한다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Mode</code></td>
      <td><code class="language-plaintext highlighter-rouge">GPU</code>, <code class="language-plaintext highlighter-rouge">CPU+GPU</code>, <code class="language-plaintext highlighter-rouge">CPU</code> 등 실행 경로</td>
      <td>어떤 자원을 주로 쓰는지 파악한다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Use Case</code></td>
      <td><code class="language-plaintext highlighter-rouge">General</code>, <code class="language-plaintext highlighter-rouge">Coding</code>, <code class="language-plaintext highlighter-rouge">Reasoning</code> 같은 용도 분류</td>
      <td>목적에 맞는 모델인지 확인한다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Model</code> / <code class="language-plaintext highlighter-rouge">Params</code></td>
      <td>모델 이름과 파라미터 규모</td>
      <td>비슷한 용도 후보들 사이에서 크기 차이를 본다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Quant</code></td>
      <td>현재 환경 기준 양자화 표기</td>
      <td>중요하지만 초반에는 보조 지표로만 보고, 자세한 해석은 번외에서 본다</td>
    </tr>
  </tbody>
</table>

<h3 id="추천-모델-판단-순서">추천 모델 판단 순서</h3>

<p>추천 모델은 <code class="language-plaintext highlighter-rouge">될까</code>를 먼저 보고, 그다음 <code class="language-plaintext highlighter-rouge">빠를까</code>와 <code class="language-plaintext highlighter-rouge">버틸까</code>를 확인하는 순서가 안정적이다.</p>

<table>
  <thead>
    <tr>
      <th>순서</th>
      <th>확인 항목</th>
      <th>보는 이유</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td><code class="language-plaintext highlighter-rouge">Fit</code></td>
      <td>아예 무리인 모델을 먼저 걸러낼 수 있다</td>
    </tr>
    <tr>
      <td>2</td>
      <td><code class="language-plaintext highlighter-rouge">Score</code></td>
      <td>현재 하드웨어와 용도 기준의 종합 우선순위를 빠르게 볼 수 있다</td>
    </tr>
    <tr>
      <td>3</td>
      <td><code class="language-plaintext highlighter-rouge">tok/s*</code></td>
      <td>체감 속도를 가늠할 수 있다</td>
    </tr>
    <tr>
      <td>4</td>
      <td><code class="language-plaintext highlighter-rouge">Mem %</code></td>
      <td>메모리 여유가 부족한 후보를 피할 수 있다</td>
    </tr>
    <tr>
      <td>5</td>
      <td><code class="language-plaintext highlighter-rouge">Mode</code></td>
      <td>GPU 활용 여부와 실행 성격을 이해할 수 있다</td>
    </tr>
    <tr>
      <td>6</td>
      <td><code class="language-plaintext highlighter-rouge">Model</code> / <code class="language-plaintext highlighter-rouge">Params</code> / <code class="language-plaintext highlighter-rouge">Use Case</code></td>
      <td>최종적으로 모델 성격과 쓰임새를 비교할 수 있다</td>
    </tr>
  </tbody>
</table>

<p><code class="language-plaintext highlighter-rouge">Score</code>는 절대 성능 점수라기보다 여러 요소를 합친 종합 추천 점수다. 그래서 본문에서는 <code class="language-plaintext highlighter-rouge">Score</code>를 “내 환경에서 균형이 좋은 후보를 찾는 지표” 정도로 읽고, 실제 계산식과 하위 점수 의미는 맨 뒤 번외에서 함께 보는 편이 흐름상 더 자연스럽다.</p>

<h2 id="활용-흐름">활용 흐름</h2>

<p><code class="language-plaintext highlighter-rouge">llmfit</code>는 모델을 직접 실행하는 도구라기보다, <code class="language-plaintext highlighter-rouge">Ollama</code>나 <code class="language-plaintext highlighter-rouge">LM Studio</code>에서 어떤 모델을 먼저 받아볼지 정하는 전 단계 도구로 쓰는 편이 가장 효율적이다.</p>

<table>
  <thead>
    <tr>
      <th>상황</th>
      <th>llmfit에서 볼 것</th>
      <th>다음 행동</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>첫 후보를 고를 때</td>
      <td><code class="language-plaintext highlighter-rouge">Fit</code>, <code class="language-plaintext highlighter-rouge">Score</code></td>
      <td>상위 후보 몇 개만 추려서 우선 다운로드</td>
    </tr>
    <tr>
      <td>속도가 중요한 채팅용 모델을 찾을 때</td>
      <td><code class="language-plaintext highlighter-rouge">tok/s*</code>, <code class="language-plaintext highlighter-rouge">Chat</code> 기준 <code class="language-plaintext highlighter-rouge">Score</code></td>
      <td>체감 속도가 높은 후보부터 테스트</td>
    </tr>
    <tr>
      <td>코딩용 모델을 찾을 때</td>
      <td><code class="language-plaintext highlighter-rouge">Coding</code> 기준 <code class="language-plaintext highlighter-rouge">Score</code>, <code class="language-plaintext highlighter-rouge">Context</code></td>
      <td>긴 문맥과 품질 균형이 좋은 후보 확인</td>
    </tr>
    <tr>
      <td>메모리가 빠듯한 맥에서 고를 때</td>
      <td><code class="language-plaintext highlighter-rouge">Mem %</code>, <code class="language-plaintext highlighter-rouge">Fit</code>, <code class="language-plaintext highlighter-rouge">Mode</code></td>
      <td>빡빡한 후보를 피하고 여유 있는 설정을 우선 검토</td>
    </tr>
    <tr>
      <td>실행 도구와 연결할 때</td>
      <td><code class="language-plaintext highlighter-rouge">Model</code>, <code class="language-plaintext highlighter-rouge">Quant</code>, <code class="language-plaintext highlighter-rouge">Use Case</code></td>
      <td><code class="language-plaintext highlighter-rouge">Ollama</code>, <code class="language-plaintext highlighter-rouge">LM Studio</code>에서 동일 계열 모델 우선 시도</td>
    </tr>
  </tbody>
</table>

<p>결국 핵심은 무작정 모델을 받아보는 대신, 내 컴퓨터에서 구동 가능한 후보 중 우선순위가 높은 모델부터 좁혀보는 데 있다. <code class="language-plaintext highlighter-rouge">llmfit</code>는 이 과정에서 “될 모델”과 “당장 시도해볼 모델”을 분리해주는 필터 역할을 한다.</p>

<h2 id="번외-세부-지표-해설">번외: 세부 지표 해설</h2>

<p>본문에서는 <code class="language-plaintext highlighter-rouge">Score</code>를 해석하는 데 집중했고, 여기서는 계산 방식과 세부 표기를 따로 정리한다. 이런 정보는 유용하지만, 초반에 너무 먼저 들어가면 오히려 모델 선택 기준이 흐려질 수 있다.</p>

<p><img src="/assets/images/2026/04/15/llmfit-columns.png" alt="llmfit 대시보드 컬럼 예시" class="align-center" /></p>

<h3 id="score-계산-방식">Score 계산 방식</h3>

<p><code class="language-plaintext highlighter-rouge">Score</code>는 아래 네 가지 하위 점수의 가중합이다. <code class="language-plaintext highlighter-rouge">llmfit</code>는 이 값을 소수점 한 자리까지 반올림해서 보여준다.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Score = Quality × wq + Speed × ws + Fit × wf + Context × wc
</code></pre></div></div>

<h4 id="하위-점수-의미">하위 점수 의미</h4>

<p>본문에서 보던 <code class="language-plaintext highlighter-rouge">Score</code>는 결국 이 네 가지 질문을 한 번에 요약한 값이다.</p>

<table>
  <thead>
    <tr>
      <th>하위 점수</th>
      <th>무슨 질문에 답하는가</th>
      <th>실전에서 볼 포인트</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Speed</code></td>
      <td>얼마나 빠른가</td>
      <td>채팅처럼 반응 속도가 중요한 경우 중요하다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Fit</code></td>
      <td>내 하드웨어에 얼마나 맞는가</td>
      <td>메모리 제약이 큰 환경에서는 가장 먼저 본다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Context</code></td>
      <td>필요한 문맥 길이를 감당하는가</td>
      <td>코딩이나 긴 추론 작업에서 더 중요하다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Quality</code></td>
      <td>모델 자체 잠재력이 어느 정도인가</td>
      <td>큰 모델이 유리할 수 있지만, 실제 추천은 다른 지표와 함께 봐야 한다</td>
    </tr>
  </tbody>
</table>

<table>
  <thead>
    <tr>
      <th>하위 점수</th>
      <th>계산 기준</th>
      <th>해석 포인트</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Speed</code></td>
      <td><code class="language-plaintext highlighter-rouge">estimated_tps / target_tps × 100</code>을 0~100으로 제한</td>
      <td>용도별 목표 <code class="language-plaintext highlighter-rouge">tok/s</code>에 얼마나 가까운지 본다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Fit</code></td>
      <td><code class="language-plaintext highlighter-rouge">required / available</code> 비율 기반</td>
      <td>메모리 사용이 적절한 구간에 들어오는지 본다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Context</code></td>
      <td>목표 컨텍스트 길이 대비 충족 정도</td>
      <td>필요한 문맥 길이를 감당하는지를 본다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Quality</code></td>
      <td>파라미터 수 기반 점수 + 모델 계열 가산점 - 양자화 패널티 + 용도별 가산점</td>
      <td>모델 자체 잠재 성능을 추정한다</td>
    </tr>
  </tbody>
</table>

<h4 id="세부-계산-기준">세부 계산 기준</h4>

<ul>
  <li><code class="language-plaintext highlighter-rouge">Speed</code>: 체감 응답 속도와 가장 직접적으로 연결된다.</li>
  <li><code class="language-plaintext highlighter-rouge">Fit</code>: 메모리 적합도를 가장 직접적으로 보여주는 지표다.</li>
  <li><code class="language-plaintext highlighter-rouge">Context</code>: 긴 문맥을 얼마나 감당할 수 있는지를 뜻한다.</li>
  <li><code class="language-plaintext highlighter-rouge">Quality</code>: 모델 자체 성능 기대치를 추정하는 축이다.</li>
</ul>

<p><code class="language-plaintext highlighter-rouge">Fit</code>은 50~80% 사용 구간을 가장 좋은 영역으로 보고 <code class="language-plaintext highlighter-rouge">100점</code>을 준다. <code class="language-plaintext highlighter-rouge">Context</code>는 목표 길이를 넘기면 <code class="language-plaintext highlighter-rouge">100점</code>, 절반 이상이면 <code class="language-plaintext highlighter-rouge">70점</code>, 그보다 작으면 <code class="language-plaintext highlighter-rouge">30점</code>으로 잡힌다. 이런 세부 규칙까지 보면 <code class="language-plaintext highlighter-rouge">Score</code>가 단순한 인기 순위가 아니라 현재 환경에 맞춘 계산 결과라는 점이 더 분명해진다.</p>

<h4 id="use-case별-가중치">Use Case별 가중치</h4>

<p>용도에 따라 무엇을 더 중요하게 볼지가 다르기 때문에, 같은 모델이라도 <code class="language-plaintext highlighter-rouge">Use Case</code>가 바뀌면 점수 해석도 달라진다.</p>

<table>
  <thead>
    <tr>
      <th>Use Case</th>
      <th style="text-align: right">Quality</th>
      <th style="text-align: right">Speed</th>
      <th style="text-align: right">Fit</th>
      <th style="text-align: right">Context</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">General</code></td>
      <td style="text-align: right">0.45</td>
      <td style="text-align: right">0.30</td>
      <td style="text-align: right">0.15</td>
      <td style="text-align: right">0.10</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Coding</code></td>
      <td style="text-align: right">0.50</td>
      <td style="text-align: right">0.20</td>
      <td style="text-align: right">0.15</td>
      <td style="text-align: right">0.15</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Reasoning</code></td>
      <td style="text-align: right">0.55</td>
      <td style="text-align: right">0.15</td>
      <td style="text-align: right">0.15</td>
      <td style="text-align: right">0.15</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Chat</code></td>
      <td style="text-align: right">0.40</td>
      <td style="text-align: right">0.35</td>
      <td style="text-align: right">0.15</td>
      <td style="text-align: right">0.10</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Multimodal</code></td>
      <td style="text-align: right">0.50</td>
      <td style="text-align: right">0.20</td>
      <td style="text-align: right">0.15</td>
      <td style="text-align: right">0.15</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Embedding</code></td>
      <td style="text-align: right">0.30</td>
      <td style="text-align: right">0.40</td>
      <td style="text-align: right">0.20</td>
      <td style="text-align: right">0.10</td>
    </tr>
  </tbody>
</table>

<p><code class="language-plaintext highlighter-rouge">Coding</code>과 <code class="language-plaintext highlighter-rouge">Reasoning</code>은 <code class="language-plaintext highlighter-rouge">Quality</code> 비중이 높고, <code class="language-plaintext highlighter-rouge">Chat</code>은 <code class="language-plaintext highlighter-rouge">Speed</code> 쪽 비중이 더 높다. 그래서 채팅용 모델과 코딩용 모델의 추천 순위가 다르게 나오는 것이 자연스럽다.</p>

<h3 id="quant-표기-해설">Quant 표기 해설</h3>

<p><code class="language-plaintext highlighter-rouge">Quant</code>가 헷갈리는 이유는 같은 모델이라도 어떤 런타임을 기준으로 보느냐에 따라 표기가 달라질 수 있기 때문이다. Apple Silicon에서는 <code class="language-plaintext highlighter-rouge">MLX</code> 쪽 표기가 자주 보이고, GGUF 계열에서는 <code class="language-plaintext highlighter-rouge">Q4_K_M</code>, <code class="language-plaintext highlighter-rouge">Q5_K_M</code>, <code class="language-plaintext highlighter-rouge">Q8_0</code> 같은 이름이 많이 보인다.</p>

<table>
  <thead>
    <tr>
      <th>표기</th>
      <th>런타임</th>
      <th>의미</th>
      <th>실전 해석</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">mlx-8bit</code></td>
      <td><code class="language-plaintext highlighter-rouge">MLX</code></td>
      <td>Apple Silicon용 8비트급 포맷</td>
      <td>품질 손실은 적지만 메모리를 더 쓴다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">mlx-4bit</code></td>
      <td><code class="language-plaintext highlighter-rouge">MLX</code></td>
      <td>Apple Silicon용 4비트급 포맷</td>
      <td>메모리 절약 폭이 크고 Apple Silicon에서 자주 본다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Q8_0</code></td>
      <td>GGUF / <code class="language-plaintext highlighter-rouge">llama.cpp</code></td>
      <td>거의 8비트급에 가까운 양자화</td>
      <td>품질 지향이지만 더 무겁다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Q6_K</code></td>
      <td>GGUF / <code class="language-plaintext highlighter-rouge">llama.cpp</code></td>
      <td>품질 쪽으로 기운 <code class="language-plaintext highlighter-rouge">K-quant</code></td>
      <td><code class="language-plaintext highlighter-rouge">Q4_K_M</code>보다 무겁지만 손실이 적은 편이다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Q5_K_M</code></td>
      <td>GGUF / <code class="language-plaintext highlighter-rouge">llama.cpp</code></td>
      <td>절충형 5비트급 <code class="language-plaintext highlighter-rouge">K-quant</code></td>
      <td>여유가 있으면 <code class="language-plaintext highlighter-rouge">Q4_K_M</code>보다 나은 선택이 될 수 있다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Q4_K_M</code></td>
      <td>GGUF / <code class="language-plaintext highlighter-rouge">llama.cpp</code></td>
      <td>대표적인 4비트급 절충안</td>
      <td>로컬 LLM에서 가장 자주 보는 균형형 선택지다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Q3_K_M</code></td>
      <td>GGUF / <code class="language-plaintext highlighter-rouge">llama.cpp</code></td>
      <td>강하게 압축한 3비트급</td>
      <td>메모리는 줄지만 품질 손실 가능성이 커진다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Q2_K</code></td>
      <td>GGUF / <code class="language-plaintext highlighter-rouge">llama.cpp</code></td>
      <td>매우 공격적인 압축</td>
      <td>메모리가 매우 부족할 때 맞추는 쪽에 가깝다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">AWQ-4bit</code></td>
      <td>CUDA/NVIDIA 계열</td>
      <td>사전 양자화 4비트 포맷</td>
      <td>Apple Silicon 주력 선택지라고 보기는 어렵다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">GPTQ-Int4</code></td>
      <td>CUDA/NVIDIA 계열</td>
      <td>4비트 정수 양자화 포맷</td>
      <td>주로 NVIDIA 생태계에서 본다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">F16</code> / <code class="language-plaintext highlighter-rouge">BF16</code></td>
      <td>여러 런타임</td>
      <td>원본에 가까운 부동소수점 weight</td>
      <td>품질 손실은 적지만 크고 무겁다</td>
    </tr>
  </tbody>
</table>

<p><code class="language-plaintext highlighter-rouge">Q4_K_M</code> 같은 이름은 “대략 4비트급 <code class="language-plaintext highlighter-rouge">K-quant</code> 계열의 <code class="language-plaintext highlighter-rouge">M</code> variant” 정도로 읽으면 충분하다. 중요한 건 표기 하나를 외우는 것보다, 현재 런타임과 하드웨어 기준으로 어떤 절충을 의미하는지 이해하는 것이다.</p>

<h4 id="apple-silicon-기준-해석">Apple Silicon 기준 해석</h4>

<p>Apple Silicon에서는 <code class="language-plaintext highlighter-rouge">llmfit</code>가 <code class="language-plaintext highlighter-rouge">MLX</code> 쪽을 우선 보기 때문에, GGUF 계열 모델도 <code class="language-plaintext highlighter-rouge">mlx-*</code>처럼 보일 수 있다. 그래서 <code class="language-plaintext highlighter-rouge">Quant</code>는 혼자 보기보다 <code class="language-plaintext highlighter-rouge">Fit</code>, <code class="language-plaintext highlighter-rouge">Score</code>, <code class="language-plaintext highlighter-rouge">Mode</code>와 함께 읽는 편이 맞다.</p>

<table>
  <thead>
    <tr>
      <th>상황</th>
      <th>우선 해석</th>
      <th>실전 판단</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">mlx-4bit</code>가 보일 때</td>
      <td>Apple Silicon에 맞춘 경량 선택지일 가능성이 크다</td>
      <td>메모리와 속도를 먼저 확인한다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">mlx-8bit</code>가 보일 때</td>
      <td>품질은 유리하지만 더 무거울 수 있다</td>
      <td><code class="language-plaintext highlighter-rouge">Mem %</code>가 높다면 부담이 커질 수 있다</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Q4_K_M</code>나 <code class="language-plaintext highlighter-rouge">Q5_K_M</code>가 보일 때</td>
      <td>GGUF 계열의 절충형 선택지다</td>
      <td>실행 런타임과 메모리 여유를 함께 본다</td>
    </tr>
    <tr>
      <td>낮은 비트 양자화가 보일 때</td>
      <td>더 작은 하드웨어에 맞추는 방향일 수 있다</td>
      <td>품질 손실 가능성을 감안해야 한다</td>
    </tr>
  </tbody>
</table>

<p>결국 <code class="language-plaintext highlighter-rouge">Quant</code>는 고정된 절대값이 아니라 현재 하드웨어와 런타임 기준으로 읽어야 하는 값이다. 아주 단순하게 보면, 더 높은 비트와 덜 공격적인 양자화는 품질 쪽에 유리하고, 더 낮은 비트와 더 강한 압축은 메모리 쪽에 유리하지만 품질 손실 가능성도 커진다.</p>

<h2 id="마무리">마무리</h2>

<p><code class="language-plaintext highlighter-rouge">llmfit</code>는 모델을 직접 돌리는 프로그램이라기보다, 내 맥에서 먼저 시도할 만한 로컬 LLM 후보를 좁혀주는 도구다. <code class="language-plaintext highlighter-rouge">Fit</code>, <code class="language-plaintext highlighter-rouge">Score</code>, <code class="language-plaintext highlighter-rouge">tok/s*</code>, <code class="language-plaintext highlighter-rouge">Mem %</code>를 먼저 읽고 후보를 줄인 뒤, 필요할 때만 번외의 세부 지표까지 확인하면 로컬 LLM 선택 과정의 시행착오를 꽤 줄일 수 있다.</p>]]></content><author><name>Hyejun An(26)</name><email>jagaldol.dev@gmail.com</email></author><category term="ai" /><summary type="html"><![CDATA[로컬 LLM을 써보려 하면 가장 먼저 부딪히는 문제는 “어떤 모델이 제일 좋나?”보다 “내 맥에서 어떤 모델이 현실적으로 돌아가나?”다. llmfit는 이 질문에 먼저 답해주는 도구다. 모델을 직접 실행하는 프로그램은 아니지만, 내 하드웨어에 맞는 후보를 먼저 좁혀준다는 점에서 로컬 LLM 입문 단계에서 꽤 유용하다.]]></summary></entry><entry><title type="html">AI Agent가 관리하는 Obsidian 구조 만들기 - AGENTS.md, 허브 노트, 00_agent_docs 설계</title><link href="https://blog.jagaldol.com/obsidian/obsidian-ai-agent-vault-structure/" rel="alternate" type="text/html" title="AI Agent가 관리하는 Obsidian 구조 만들기 - AGENTS.md, 허브 노트, 00_agent_docs 설계" /><published>2026-04-15T00:10:00+09:00</published><updated>2026-04-15T00:10:00+09:00</updated><id>https://blog.jagaldol.com/obsidian/obsidian-ai-agent-vault-structure</id><content type="html" xml:base="https://blog.jagaldol.com/obsidian/obsidian-ai-agent-vault-structure/"><![CDATA[<p>이 시리즈의 <a href="/obsidian/obsidian-ai-assistant-daily-note/">1편</a>에서는 <code class="language-plaintext highlighter-rouge">일일기록 -&gt; AI 후처리 -&gt; Day Planner</code> 흐름을 보여줬다. 그런데 그 자동화가 한두 번 반짝하고 끝나지 않으려면, 그 뒤에서 에이전트가 길을 잃지 않는 구조가 먼저 있어야 한다.</p>

<p>AI가 똑똑해도 vault가 읽히지 않으면 운영비는 다시 사람에게 돌아온다. 2편에서는 내가 Obsidian vault를 어떻게 나눴고, <code class="language-plaintext highlighter-rouge">AGENTS.md</code>, 허브 노트, <code class="language-plaintext highlighter-rouge">00_agent_docs</code>, 로컬 스킬을 어떤 계층으로 배치했는지를 실제 구조 그대로 보여주려 한다.</p>

<p><img src="/assets/images/2026/04/15/obsidian-vault-graph-overview.png" alt="전체 Obsidian vault 구조가 보이는 그래프 뷰" /></p>

<h2 id="왜-구조가-먼저-필요한가">왜 구조가 먼저 필요한가</h2>

<h3 id="먼저-용어를-짧게-맞춰두자">먼저 용어를 짧게 맞춰두자</h3>

<p>이 글에서 자주 나오는 말만 먼저 짧게 정리하면 이렇다.</p>

<ul>
  <li>허브 노트: 한 폴더의 대표 진입점이 되는 안내 노트</li>
  <li>front matter: 노트 맨 위의 YAML 메타데이터 영역</li>
  <li>위키링크: <code class="language-plaintext highlighter-rouge">[[노트 이름]]</code> 형태로 같은 vault 안 다른 노트를 가리키는 링크</li>
  <li>스킬: 특정 작업 절차를 캡슐화한 에이전트용 로컬 작업 단위</li>
</ul>

<h3 id="ai도-읽는-vault여야-한다">AI도 읽는 vault여야 한다</h3>

<p>보통 Obsidian 구조를 이야기할 때는 “내가 보기 편한가”를 먼저 생각한다. AI Agent를 붙이면 기준이 하나 더 생긴다. 사람이 아니라 에이전트도 이 vault를 읽고, 어디에 적어야 하고, 무엇을 건드리면 안 되는지 바로 판단할 수 있어야 한다.</p>

<p>이때 구조는 정리 취향이 아니라 인터페이스가 된다. 폴더 이름, 허브 노트, 전역 지침, 작업별 플레이북이 모두 “에이전트가 이 vault를 어떻게 읽을지”를 결정한다.</p>

<h3 id="구조가-없으면-다시-사람이-정리한다">구조가 없으면 다시 사람이 정리한다</h3>

<p>구조가 없을 때 생기는 문제는 꽤 단순하다.</p>

<ul>
  <li>새 노트가 루트나 임의의 폴더에 흩어진다.</li>
  <li>비슷한 주제 노트가 중복 생성된다.</li>
  <li>TODO와 일반 노트의 경계가 흐려진다.</li>
  <li>규칙이 바뀌어도 어디를 고쳐야 하는지 모른다.</li>
</ul>

<p>결국 AI를 붙여도 사람이 다시 뒤에서 정리해야 한다. 내가 1편에서 말했던 “유지비가 너무 커지는 문제”가 구조 레벨에서 다시 돌아오는 셈이다.</p>

<h2 id="내-vault를-이렇게-나눴다">내 vault를 이렇게 나눴다</h2>

<h3 id="최상위-폴더는-역할-단위로-자른다">최상위 폴더는 역할 단위로 자른다</h3>

<p>내가 실제로 쓰는 구조의 핵심만 뽑으면 이렇다.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/
├── .agents/           # Codex용 로컬 스킬
├── .claude/           # Claude Code용 로컬 스킬
├── 00_agent_docs/     # AI 운영 문서
├── 06_TODO/           # Base Board 실데이터
├── 12_일일기록/       # 일간·월간·연간 기록
├── 13_my/             # 날짜를 벗겨도 남길 장기 메모
├── 14_플레이스/       # 장기적으로 남길 만한 장소 노트
├── _attachments/      # 이미지 첨부
├── CLAUDE.md
└── AGENTS.md
</code></pre></div></div>

<p>핵심은 “주제”보다 “역할”을 먼저 나누는 것이다.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">12_일일기록/</code>은 날짜순 원본 기록</li>
  <li><code class="language-plaintext highlighter-rouge">13_my/</code>는 날짜를 벗겨도 다시 참고할 장기 맥락</li>
  <li><code class="language-plaintext highlighter-rouge">06_TODO/</code>는 보드가 아니라 실제 마크다운 데이터</li>
  <li><code class="language-plaintext highlighter-rouge">00_agent_docs/</code>는 에이전트 운영 문서</li>
</ul>

<p>이렇게 나눠두면 같은 정보라도 어디에 남겨야 하는지 판단이 쉬워진다. 예를 들어 오늘 일기에서 나온 장기 선호는 <code class="language-plaintext highlighter-rouge">12_일일기록</code>에 그대로 묻히지 않고 <code class="language-plaintext highlighter-rouge">13_my</code>로 승격할 수 있고, TODO는 일반 메모가 아니라 <code class="language-plaintext highlighter-rouge">06_TODO/</code> 실파일로 들어가야 한다는 규칙이 구조 자체에 드러난다.</p>

<h3 id="허브-노트는-readme이자-moc다">허브 노트는 README이자 MOC다</h3>

<p>이 구조에서 중요한 건 폴더만이 아니다. 대부분의 폴더에는 허브 노트를 둔다. 허브 노트는 파일 목록이 아니라 “이 폴더가 무엇이고, 어디서부터 읽으면 되는지”를 알려주는 README + MOC(Map of Content)에 가깝다.</p>

<p>실제 <code class="language-plaintext highlighter-rouge">00_agent_docs</code> 허브는 이렇게 생겼다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="sb">`00_agent_docs/`</span> 폴더 허브이자 단일 진입점. 루트 지침은 [[AGENTS]]와 [[CLAUDE]]에서 확인한다.

<span class="gu">## 바로 보기</span>
<span class="p">
-</span> 사용자 요구사항: [[사용자 요구사항 메모]]
<span class="p">-</span> 플레이북: [[Base Board 작업 지침]], [[일일기록 일정 작성 플레이북]]
<span class="p">-</span> 장기 메모리: [[장기 메모리 메모]]
<span class="p">-</span> 운영 원칙: [[에이전트 문서 운영]]
</code></pre></div></div>

<p>이게 중요한 이유는 에이전트가 폴더를 열었을 때 “전수 목록”보다 “대표 진입점”을 먼저 볼 수 있기 때문이다. 새 문서를 만들 때도 허브가 있으면 어디에 소속되는지 자연스럽게 정해진다.</p>

<p>코드블럭 안의 <code class="language-plaintext highlighter-rouge">[[AGENTS]]</code> 같은 표기는 Obsidian의 위키링크다. 일반 파일 경로보다 짧고, 허브끼리 연결 구조를 만들기 쉬워서 에이전트가 따라가기도 편하다.</p>

<p>허브가 잘 잡혀 있으면 그래프 뷰에서도 구조가 읽힌다. 아래처럼 허브가 중심이 되면, 단순히 노트가 많이 있는 vault가 아니라 어떤 묶음으로 운영되는지가 한눈에 드러난다.</p>

<p><img src="/assets/images/2026/04/15/obsidian-graph-view.png" alt="허브가 중심이 된 Obsidian 그래프 구조" /></p>

<h2 id="에이전트는-어떤-문서를-읽고-움직이는가">에이전트는 어떤 문서를 읽고 움직이는가</h2>

<h3 id="agentsmd는-얇은-라우터다"><code class="language-plaintext highlighter-rouge">AGENTS.md</code>는 얇은 라우터다</h3>

<p>내 vault에서 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>는 모든 걸 설명하는 매뉴얼이 아니다. 역할을 아주 좁게 둔다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gu">## 이 문서의 역할</span>
<span class="p">
-</span> 역할은 <span class="sb">`전역 불변 규칙 + 작업 트리거 + 정답 문서 안내`</span>로 한정한다.
<span class="p">-</span> 길이는 대략 200줄 내외를 유지한다.
<span class="p">-</span> 새 노트가 생겼다는 이유만으로 이 문서를 갱신하지 않는다.
</code></pre></div></div>

<p>즉, <code class="language-plaintext highlighter-rouge">AGENTS.md</code>는 얇아야 한다. 전역 작성 원칙, 폴더 구조, 예외 규칙, 문서 라우팅처럼 오래 안 바뀌는 것만 둔다. 세부 절차까지 다 넣기 시작하면 금방 비대해지고, 결국 아무도 안 읽는 문서가 된다.</p>

<h3 id="세부-절차는-00_agent_docs로-내린다">세부 절차는 <code class="language-plaintext highlighter-rouge">00_agent_docs/</code>로 내린다</h3>

<p>반복 작업에 필요한 상세 절차는 <code class="language-plaintext highlighter-rouge">00_agent_docs/</code> 아래로 내린다. 실제 운영 문서도 이 기준을 분명히 적고 있다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gu">## 문서 분류 기준</span>
<span class="p">
-</span> 전역 불변 규칙, 공통 경로 패턴, 예외 규칙이면 <span class="sb">`AGENTS.md`</span>, <span class="sb">`CLAUDE.md`</span>
<span class="p">-</span> 사용자 선호나 금지사항이면 <span class="sb">`사용자 요구사항/`</span>
<span class="p">-</span> 단계별 수행 절차면 <span class="sb">`플레이북/`</span>
<span class="p">-</span> 안정적인 환경 정보면 <span class="sb">`장기 메모리/`</span>
<span class="p">-</span> 폴더 운영 규칙, 인덱스, 유지보수 정책이면 <span class="sb">`운영/`</span>
</code></pre></div></div>

<p>이 계층을 두면 새 정보가 생겼을 때 어디에 적어야 하는지도 분명해진다. 예를 들어 “모든 일반 노트는 한국어로 쓴다”는 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>에 갈 전역 규칙이지만, “Day Planner용 <code class="language-plaintext highlighter-rouge">## 일정</code>은 어떤 문법으로 쓰는가”는 플레이북으로 내려가는 게 맞다.</p>

<h3 id="작업별-운영-로직은-스킬에-둔다">작업별 운영 로직은 스킬에 둔다</h3>

<p>여기서 더 아래로 내려가면 작업별 스킬이 있다. 지금 실제로 쓰고 있는 로컬 스킬은 이런 식이다.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>.agents/skills/
├── daily-note-followup/
└── organize-instructions/
</code></pre></div></div>

<p>Claude Code 쪽도 같은 구조를 <code class="language-plaintext highlighter-rouge">.claude/skills/</code>에 맞춰 두고 있다. 핵심은 전역 지침 문서가 작업별 절차를 다 품지 않고, 정말 작업 특화된 로직은 스킬 폴더로 내려보낸다는 점이다.</p>

<p>그래서 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>는 얇게 유지되고, 스킬은 작업별로 깊어질 수 있다. 이 분리가 없으면 top-level 문서가 금방 플레이북과 스킬의 역할까지 먹어버린다.</p>

<h2 id="이-구조가-실제로-어떻게-동작하는가">이 구조가 실제로 어떻게 동작하는가</h2>

<h3 id="예시-1-새-todo를-추가할-때">예시 1: 새 TODO를 추가할 때</h3>

<p>사용자가 할 일을 하나 추가해달라고 하면, 에이전트는 바로 카드 UI부터 건드리지 않는다. 먼저 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>에서 <code class="language-plaintext highlighter-rouge">TODO / Base Board</code> 라우팅을 보고, 그다음 <code class="language-plaintext highlighter-rouge">Base Board 작업 지침</code>과 <code class="language-plaintext highlighter-rouge">TODO LIST.base</code>를 확인한다.</p>

<p>실제 <code class="language-plaintext highlighter-rouge">.base</code> 파일에는 이런 정보가 들어 있다.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">filters</span><span class="pi">:</span>
  <span class="na">and</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s">file.inFolder("06_TODO")</span>
    <span class="pi">-</span> <span class="s">status != </span><span class="no">null</span>
<span class="na">views</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">type</span><span class="pi">:</span> <span class="s">kanban</span>
    <span class="na">boardColumns</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">시작 전</span>
      <span class="pi">-</span> <span class="s">진행 중</span>
      <span class="pi">-</span> <span class="s">완료</span>
</code></pre></div></div>

<p>이걸 먼저 읽어야 <code class="language-plaintext highlighter-rouge">status</code> 값을 추측하지 않고 정확한 문자열로 넣을 수 있다. 즉, 구조가 있으면 에이전트는 “할 일을 어디에 만들지”뿐 아니라 “어떤 스키마로 만들어야 하는지”까지 찾을 수 있다.</p>

<p>실제 TODO 노트 쪽에는 이런 값이 front matter나 속성으로 들어가고, <code class="language-plaintext highlighter-rouge">.base</code>는 그 값을 읽어 보드처럼 보여준다.</p>

<h3 id="예시-2-일일기록을-후처리할-때">예시 2: 일일기록을 후처리할 때</h3>

<p>1편에서 다룬 <code class="language-plaintext highlighter-rouge">daily-note-followup</code>도 같은 구조 위에서 움직인다. <code class="language-plaintext highlighter-rouge">AGENTS.md</code>는 <code class="language-plaintext highlighter-rouge">12_일일기록</code>의 섹션 소유권과 기본 경계를 설명하고, 실제 일정 문법이나 시간 해석 같은 상세 규칙은 <code class="language-plaintext highlighter-rouge">일일기록 일정 작성 플레이북</code>으로 내려간다. 그리고 작업 전체 오케스트레이션은 <code class="language-plaintext highlighter-rouge">daily-note-followup</code> 스킬이 맡는다.</p>

<p>이렇게 나눠두면 한 작업 안에서도 역할이 분리된다.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">AGENTS.md</code>: 전역 경계와 라우팅</li>
  <li>플레이북: 세부 문법과 절차</li>
  <li>스킬: 실제 작업 순서와 판단 흐름</li>
</ul>

<p>그래서 한 파일에 모든 판단 로직을 몰아넣지 않아도 된다.</p>

<h3 id="예시-3-새-규칙이-생겼을-때">예시 3: 새 규칙이 생겼을 때</h3>

<p>이 구조의 장점은 “새 규칙이 생겼을 때 어디를 고칠지”도 분명하다는 점이다.</p>

<p>예를 들어 어떤 규칙이 생겼다고 해보자. 그때 먼저 묻는 질문은 하나다. 이게 전역 불변 규칙인가, 사용자 선호인가, 작업 절차인가?</p>

<ul>
  <li>전역 불변 규칙이면 <code class="language-plaintext highlighter-rouge">AGENTS.md</code></li>
  <li>사용자 선호면 <code class="language-plaintext highlighter-rouge">00_agent_docs/사용자 요구사항/</code></li>
  <li>작업 절차면 <code class="language-plaintext highlighter-rouge">00_agent_docs/플레이북/</code></li>
</ul>

<p>이 분류가 있으면 규칙이 늘어나도 문서 체계가 쉽게 무너지지 않는다. 반대로 이 분류가 없으면 모든 게 <code class="language-plaintext highlighter-rouge">AGENTS.md</code> 한 파일로 몰리거나, 여기저기 중복된다.</p>

<h2 id="마무리">마무리</h2>

<p>2편에서 말하고 싶었던 건 단순하다. 좋은 Obsidian 개인 비서는 좋은 모델만으로 유지되지 않는다. AI가 읽을 수 있는 구조, 얇은 전역 지침, 허브 노트, 작업별 플레이북과 스킬이 함께 있어야 오래 간다.</p>

<p>1편에서 보여준 <code class="language-plaintext highlighter-rouge">일일기록 -&gt; 후처리 -&gt; Day Planner</code> 흐름도 결국 이 구조 위에서만 안정적으로 돌아간다. 구조는 보기 좋으라고 만드는 게 아니라, AI가 일관되게 일하기 위한 인터페이스다.</p>

<p>다음 편에서는 이 구조를 오래 굴리기 위해 규칙과 기억을 어떻게 유지보수하는지, 즉 <code class="language-plaintext highlighter-rouge">지침이 커질 때 어떻게 정리하고 분리하는가</code> 쪽을 이어서 다뤄보려고 한다.</p>]]></content><author><name>Hyejun An(26)</name><email>jagaldol.dev@gmail.com</email></author><category term="obsidian" /><summary type="html"><![CDATA[이 시리즈의 1편에서는 일일기록 -&gt; AI 후처리 -&gt; Day Planner 흐름을 보여줬다. 그런데 그 자동화가 한두 번 반짝하고 끝나지 않으려면, 그 뒤에서 에이전트가 길을 잃지 않는 구조가 먼저 있어야 한다.]]></summary></entry><entry><title type="html">AI Agent로 Obsidian 개인 비서 만들기 - 일일기록부터 Day Planner까지</title><link href="https://blog.jagaldol.com/obsidian/obsidian-ai-assistant-daily-note/" rel="alternate" type="text/html" title="AI Agent로 Obsidian 개인 비서 만들기 - 일일기록부터 Day Planner까지" /><published>2026-04-14T18:08:02+09:00</published><updated>2026-04-14T18:08:02+09:00</updated><id>https://blog.jagaldol.com/obsidian/obsidian-ai-assistant-daily-note</id><content type="html" xml:base="https://blog.jagaldol.com/obsidian/obsidian-ai-assistant-daily-note/"><![CDATA[<p>Obsidian을 오래 못 쓰는 이유는 기능이 부족해서가 아니다. 구조를 제대로 잡는 순간, 메모보다 유지 보수가 더 커지기 때문이다.</p>

<p>Claude Code, Codex, OpenClaw 같은 로컬 파일 기반 AI Agent가 등장하면서 이 전제도 바뀌기 시작했다. Obsidian은 이제 내가 끝까지 직접 관리해야 하는 메모 앱이 아니라, 정리와 유지 보수를 넘길 수 있는 작업 공간이 됐다.</p>

<p><img src="/assets/images/2026/04/14/obsidian-graph-view.png" alt="Obsidian 그래프 뷰로 보는 개인 비서용 vault 구조" /></p>

<h2 id="들어가기에-앞서-ai-agent가-필요한-이유">들어가기에 앞서: AI Agent가 필요한 이유</h2>

<h3 id="2년-전에는-유지비가-너무-컸다">2년 전에는 유지비가 너무 컸다</h3>

<p>2년 전에도 Obsidian을 진지하게 써보려 한 적이 있었다. 처음 며칠은 늘 괜찮다. 폴더를 만들고, 데일리 노트를 켜고, 태그를 붙이면 금방 체계가 생긴 것처럼 보인다. 문제는 그 다음이다.</p>

<p>시간이 지나면 초반에 대충 적어둔 노트를 다시 열어 제목을 고치고, 위치를 옮기고, 링크를 연결하고, 메타데이터를 손봐야 한다. 일정과 TODO까지 한곳에 넣기 시작하면 그 유지비는 더 커진다. 메모를 잘 쓰려고 만든 도구인데, 정작 메모를 유지하는 일이 너무 커졌다.</p>

<p>오래 못 간 이유를 줄이면 이렇다.</p>

<ul>
  <li>처음에는 아무 규칙 없이 적게 된다.</li>
  <li>시간이 지나면 폴더 구조, 링크 방식, front matter, 허브 노트 같은 규칙이 필요해진다.</li>
  <li>규칙이 생긴 뒤에는 기존 노트를 전부 다시 맞춰야 한다.</li>
  <li>일정, TODO, 지식 메모까지 한 곳에 넣으면 구조 유지 비용이 더 커진다.</li>
</ul>

<p>Obsidian이 나빠서가 아니었다. 사람이 직접 감당해야 할 유지비가 너무 커서 오래 못 갔다. 입력은 쉬웠지만 유지가 무거웠다.</p>

<h3 id="지금은-그-유지비를-넘길-수-있다">지금은 그 유지비를 넘길 수 있다</h3>

<p>지금은 상황이 다르다. Obsidian은 애초에 로컬 markdown 파일 기반이고, 요즘 AI Agent는 그 파일들을 직접 읽고 쓸 수 있다. 그래서 예전에는 사람이 하던 유지 작업을 이제는 에이전트에게 넘길 수 있다.</p>

<p>기존 노트를 검색해 중복을 막고, front matter 규칙을 맞추고, 관련 노트에 위키링크를 연결하고, 허브 노트나 장기 메모를 갱신하고, 일일기록에서 일정과 TODO를 다시 뽑아내는 일들이다.</p>

<p>중요한 건 자동화가 멋지다는 게 아니다. 사람이 지치던 반복 유지 작업을 대신 맡길 수 있다는 점이다. 그래서 Obsidian을 다시 열었을 때의 감각도 달라졌다. 예전에는 “이걸 또 언제 정리하지?”였다면, 지금은 “일단 적어두면 에이전트가 정리해주겠지”에 더 가깝다.</p>

<h2 id="내가-만들고-싶었던-것">내가 만들고 싶었던 것</h2>

<h3 id="목표는-메모-앱이-아니라-개인-비서였다">목표는 메모 앱이 아니라 개인 비서였다</h3>

<p>내가 원한 건 예쁜 노트 모음이 아니다. 하루 기록을 남기면, 그걸 다시 손으로 정리하지 않아도 오늘 바로 쓸 수 있는 형태로 바뀌는 시스템이었다.</p>

<p>핵심은 간단하다. 먼저 일일기록이라는 입력 노트에 편하게 적는다. 그러면 AI가 그 기록을 읽고 일정, 메모, TODO, 그리고 날짜를 벗겨도 남길 가치가 있는 장기 메모(<code class="language-plaintext highlighter-rouge">13_my</code>) 후보로 다시 분해한다. 내가 실제로 보는 최종 출력은 raw markdown이 아니라 Day Planner 타임라인이다. 입력은 느슨하게, 출력은 실행 가능하게 만들고 싶었다.</p>

<h3 id="바닥부터-새로-만들고-싶지는-않았다">바닥부터 새로 만들고 싶지는 않았다</h3>

<p>물론 처음부터 전용 앱을 만들 수도 있다. 하지만 그러면 다시 “도구를 만드는 일”이 본업이 된다. 내가 원한 건 바닥부터 새 시스템을 짜는 게 아니라, 이미 잘 만들어진 Obsidian의 UI/UX와 플러그인 생태계 위에 AI Agent 개인 비서를 올리는 방식이었다.</p>

<p>검색, 위키링크, 그래프 뷰, daily note, 플러그인 UI는 이미 있다. 에이전트는 그 위에서 파일을 읽고 쓰며 정리와 유지 보수를 맡으면 된다. 이 조합이 훨씬 실전적이었다.</p>

<h2 id="일일기록에서-day-planner까지">일일기록에서 Day Planner까지</h2>

<h3 id="1-입력-일일기록을-먼저-적는다">1. 입력: 일일기록을 먼저 적는다</h3>

<p>지금 내가 가장 자주 쓰는 패턴은 일일기록을 입력창처럼 쓰는 방식이다. Obsidian을 안 쓰는 사람에게 풀어 말하면, 하루 동안 있었던 일과 해야 할 일을 가장 먼저 흘려 적는 기본 노트다. 처음부터 완벽하게 구조화하려고 하지 않고, 그날 있었던 일과 해야 할 일, 짧은 일기를 먼저 적는다. 입력 단계에서는 마찰을 줄이고, 구조화는 후처리 단계로 넘긴다.</p>

<p>예를 들면 이런 식이다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gu">## 일기</span>

늦게 일어나서 카페에서 발표 자료를 정리했다.
다음 주 병원 예약도 잡아야 하는데 아직 못 했다.
요즘은 오전보다 밤에 더 집중이 잘 되는 느낌이다.
</code></pre></div></div>

<p><img src="/assets/images/2026/04/14/obsidian-daily-note-raw.png" alt="후처리 전 일일기록 화면" /></p>

<p>실제 화면도 비슷하다. 왼쪽에는 체크리스트와 일기가 있고, 오른쪽 Day Planner에는 아직 시간표가 채워지지 않았다. 사람이 읽으면 무슨 하루였는지는 알 수 있지만, 바로 따라갈 수 있는 일정은 아직 아니다.</p>

<h3 id="2-후처리-직접-만든-daily-note-followup-스킬이-다시-정리한다">2. 후처리: 직접 만든 <code class="language-plaintext highlighter-rouge">daily-note-followup</code> 스킬이 다시 정리한다</h3>

<p>그래서 여기서부터는 사람이 다시 정리하지 않는다. 내가 쓰는 핵심 워크플로우는 <code class="language-plaintext highlighter-rouge">daily-note-followup</code>라는 사용자 정의 스킬이다. 일일기록 후처리를 자동화하려고 직접 만든 스킬로, 일일기록을 읽고 오늘 노트 안의 <code class="language-plaintext highlighter-rouge">일정</code>, <code class="language-plaintext highlighter-rouge">메모</code>, <code class="language-plaintext highlighter-rouge">에이전트 메모</code>를 정리하고, 필요하면 TODO를 만들고 다음 날 노트나 장기 메모(<code class="language-plaintext highlighter-rouge">13_my</code>)까지 함께 갱신한다.</p>

<p>여기서도 경계는 분명하다. 사용자가 직접 쓰는 <code class="language-plaintext highlighter-rouge">## 일기</code>는 그대로 두고, 오타나 띄어쓰기처럼 의미를 바꾸지 않는 가벼운 교정만 예외적으로 한다. 실제 후처리의 중심은 에이전트가 관리하는 섹션이다. <code class="language-plaintext highlighter-rouge">## 일정</code>은 Day Planner가 읽을 시간표이고, <code class="language-plaintext highlighter-rouge">## 메모</code>는 일기를 반복하지 않는 보충 사실이며, <code class="language-plaintext highlighter-rouge">## 에이전트 메모</code>는 사용자의 하루를 다시 적는 곳이 아니라 에이전트가 한 작업과 나중에 참고할 맥락을 남기는 곳이다.</p>

<p>중요한 건 이 스킬이 아무 정보나 발명해서 채우지 않는다는 점이다. 시간 근거가 약하면 억지로 일정을 만들지 않고 <code class="language-plaintext highlighter-rouge">메모</code>로 남기거나 짧게 확인하고 멈춘다. 자동화의 핵심은 그럴듯한 요약이 아니라, 실제로 다시 써도 되는 수준의 정리다.</p>

<p>후처리 결과는 먼저 “무엇이 바뀌었는지”를 요약해서 보여준다. 실제 캡처에서도 일기 교정, 오늘 노트 보강, TODO 생성, 다음 날 노트 생성, 장기 메모 반영이 한 번에 묶여 있다.</p>

<p><img src="/assets/images/2026/04/14/obsidian-agent-followup-summary.png" alt="daily-note-followup가 보여주는 변경 요약" /></p>

<p>그리고 나면 같은 일일기록 안에 이런 식의 결과가 생긴다.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gu">## 일정</span>
<span class="p">
-</span> 08:10 - 11:30 집에서 오전 작업
<span class="p">-</span> 12:50 - 13:30 강가 산책로 따라 카페 이동
<span class="p">-</span> 13:30 - 16:30 카페에서 마무리 작업

<span class="gu">## 메모</span>
<span class="p">
-</span> 오전 수정 작업은 카드 리스트 정렬 문제와 모바일 여부 보정에 집중했다.
<span class="p">-</span> 카페에서는 문서 확인, 에러 로그 정리, 메모를 한 번에 처리했다.

<span class="gu">## 에이전트 메모</span>
<span class="p">
-</span> TODO 생성
<span class="p">-</span> 다음 날 노트 생성
<span class="p">-</span> 장기 메모 반영
</code></pre></div></div>

<p><img src="/assets/images/2026/04/14/obsidian-daily-note-with-schedule.png" alt="후처리 후 일정, 메모, 에이전트 메모가 정리된 일일기록" /></p>

<p>여기서 중요한 건 단순 요약이 아니라 재배치다. 오늘 바로 실행해야 할 것은 일정과 TODO로, 일기에 다 담기지 않은 보충 사실은 <code class="language-plaintext highlighter-rouge">메모</code>로, 장기적으로 다시 참고할 정보는 장기 메모(<code class="language-plaintext highlighter-rouge">13_my</code>)로 나뉜다. 그래서 같은 기록이 “읽는 글”에서 “운영 가능한 하루”로 바뀐다.</p>

<h3 id="3-출력-내가-실제로-보는-것은-day-planner다">3. 출력: 내가 실제로 보는 것은 Day Planner다</h3>

<p>이 흐름의 최종 출력은 markdown 자체가 아니다. 내가 실제로 보는 건 오른쪽의 Day Planner 타임라인이다. Day Planner는 별도의 AI 기능이 아니라, 일일기록 안의 <code class="language-plaintext highlighter-rouge">## 일정</code> 섹션을 읽어 시간표로 보여주는 Obsidian 플러그인이다. 상단에는 아직 시간에 얹지 않은 할 일이 남고, 아래에는 시간대별 일정이 배치된다.</p>

<p>즉, 일일기록은 입력 인터페이스에 가깝고, Day Planner는 실행 인터페이스에 가깝다. 나는 하루를 처음부터 다시 정리하는 대신, 타임라인을 보고 바로 움직인다. 핵심도 여기에 있다. 기록을 많이 남기는 게 아니라, 기록을 당장 쓸 수 있는 일정으로 바꾸는 것.</p>

<p><img src="/assets/images/2026/04/14/obsidian-day-planner-timeline.png" alt="Day Planner에 반영된 시간표" class="width-300px" /></p>

<h2 id="왜-하필-obsidian인가">왜 하필 Obsidian인가</h2>

<h3 id="로컬-markdown이라-에이전트와-궁합이-맞다">로컬 markdown이라 에이전트와 궁합이 맞다</h3>

<p>Obsidian에서는 노트가 곧 파일이다. 그래서 에이전트가 직접 읽고 쓰기 쉽고, 특정 서비스의 API나 폐쇄적인 데이터 구조에 덜 묶인다. 유지 보수를 맡기려면 결국 파일 단위로 건드릴 수 있어야 하는데, Obsidian은 그 점이 강하다.</p>

<h3 id="이미-갖춰진-uiux를-다시-만들-필요가-없다">이미 갖춰진 UI/UX를 다시 만들 필요가 없다</h3>

<p>내가 원한 건 새 제품을 만드는 일이 아니라, 이미 잘 만들어진 화면과 플러그인 위에 에이전트를 얹는 일이었다. 그래프 뷰로 vault를 훑고, daily note와 Day Planner를 그대로 쓰면서, 뒤쪽의 정리 작업만 에이전트에게 넘기면 된다.</p>

<h2 id="오래-쓰는-시스템으로-만들려면">오래 쓰는 시스템으로 만들려면</h2>

<h3 id="지침도-같이-관리해야-한다">지침도 같이 관리해야 한다</h3>

<p>에이전트가 노트를 대신 작성하고 정리해주기 시작하면, 다음 문제는 “무슨 규칙으로 움직이게 할 것인가”가 된다. 어디까지 수정해도 되는지, 어떤 폴더 구조를 따르는지, 일일기록에서 무엇을 추출해야 하는지 같은 기준이 있어야 결과가 흔들리지 않는다.</p>

<p>그래서 나는 vault 안에 <code class="language-plaintext highlighter-rouge">AGENTS.md</code> 같은 전역 지침 문서를 두고 운영한다. 다만 이 문서가 모든 절차를 다 적는 건 아니다. <code class="language-plaintext highlighter-rouge">AGENTS.md</code>는 전역 작성 원칙, 폴더 구조, 문서 라우팅 같은 큰 기준만 담는 얇은 문서이고, 작업별 세부 절차는 별도 운영 문서와 스킬 파일로 내려둔다. 에이전트를 오래 쓰려면 프롬프트보다 운영 문서가 더 중요해진다.</p>

<p><img src="/assets/images/2026/04/14/obsidian-agents-md.png" alt="vault 안에서 관리하는 AGENTS.md" /></p>

<h3 id="이-부분은-다음-편에서-더-다룰-생각이다">이 부분은 다음 편에서 더 다룰 생각이다</h3>

<p>다만 이 글에서 그 구조 설명을 길게 하지는 않으려 한다. 1편의 핵심은 “AI Agent 덕분에 Obsidian이 다시 실용적인 개인 비서가 됐다”는 점과, 그 감각이 <code class="language-plaintext highlighter-rouge">일일기록 -&gt; 후처리 -&gt; Day Planner</code> 흐름에서 가장 분명하게 드러난다는 점이기 때문이다. 폴더 구조, 허브 노트, 지침 설계는 다음 편에서 따로 정리해보겠다.</p>

<h2 id="마무리">마무리</h2>

<p>내가 Obsidian을 다시 쓰게 된 이유는 메모 습관이 갑자기 좋아져서가 아니다. 예전에는 내가 직접 떠안아야 했던 유지 비용을 이제는 AI Agent가 대신 처리해줄 수 있게 되었기 때문이다.</p>

<p>그래서 지금의 Obsidian은 단순한 메모 앱이 아니다. 일일기록에 먼저 적으면, 에이전트가 그 기록을 다시 읽어 일정과 메모, TODO와 장기 맥락으로 재배치한다. 나는 Day Planner에서 오늘을 따라간다. 2년 전에는 “좋아 보이지만 오래 못 쓰는 시스템”이었다면, 지금은 “내가 계속 쓸 수 있는 방식으로 돌아가는 시스템”에 더 가깝다.</p>

<p>이 시리즈의 1편에서는 왜 다시 시도할 만해졌는지, 그리고 그 출발점이 왜 하필 <code class="language-plaintext highlighter-rouge">일일기록</code>이었는지를 정리했다. 다음 편에서는 이 개인 비서를 오래 굴리기 위해 어떤 구조와 지침을 깔아뒀는지 이어서 다뤄보겠다.</p>]]></content><author><name>Hyejun An(26)</name><email>jagaldol.dev@gmail.com</email></author><category term="obsidian" /><summary type="html"><![CDATA[Obsidian을 오래 못 쓰는 이유는 기능이 부족해서가 아니다. 구조를 제대로 잡는 순간, 메모보다 유지 보수가 더 커지기 때문이다.]]></summary></entry><entry><title type="html">macOS Codex 앱 창 최소 너비가 안 줄어들 때 해결방법</title><link href="https://blog.jagaldol.com/development/codex-app-min-width-fix/" rel="alternate" type="text/html" title="macOS Codex 앱 창 최소 너비가 안 줄어들 때 해결방법" /><published>2026-03-28T15:08:25+09:00</published><updated>2026-03-28T15:08:25+09:00</updated><id>https://blog.jagaldol.com/development/codex-app-min-width-fix</id><content type="html" xml:base="https://blog.jagaldol.com/development/codex-app-min-width-fix/"><![CDATA[<p>macOS용 <code class="language-plaintext highlighter-rouge">Codex</code> 데스크톱 앱을 쓰다 보면 창 가로폭이 어느 지점 아래로 더 줄어들지 않는 경우가 있다.
사이드바를 닫아도 여전히 넓게 고정돼 있다면, 단순한 레이아웃 문제가 아니라 내부 상태값이 꼬인 경우일 수 있다.
내가 겪은 경우에는 창이 정확히 <code class="language-plaintext highlighter-rouge">1200px</code> 근처 아래로 더 줄어들지 않았고, 사이드바를 닫아도 그 최소 너비는 그대로였다.</p>

<p>비슷한 증상은 <a href="https://github.com/openai/codex/issues/14010">openai/codex 이슈 #14010</a>에도 등록돼 있다.</p>

<h2 id="증상">증상</h2>

<p>아래는 문제가 발생했을 때의 화면이다.</p>

<p><img src="/assets/images/2026/03/28/codex-app-min-width-before-sidebar.png" alt="Codex 창 최소 너비 문제 해결 전 - 사이드바 열림" /></p>

<ul>
  <li>스레드 목록 사이드바가 열린 상태에서 창이 넓게 고정돼 있다.</li>
</ul>

<p><img src="/assets/images/2026/03/28/codex-app-min-width-before-closed-sidebar.png" alt="Codex 창 최소 너비 문제 해결 전 - 사이드바 닫힘" /></p>

<ul>
  <li>사이드바를 닫아도 창 너비가 충분히 줄어들지 않는다.</li>
  <li>정확히는 창이 <code class="language-plaintext highlighter-rouge">1200px</code> 근처 아래로 더 줄어들지 않았고, 사이드바를 닫아도 최소로 줄일 수 있는 너비는 변하지 않았다.</li>
  <li>즉 패널이 열려 있어서 넓어 보이는 문제가 아니라, 최소 너비 자체가 비정상적으로 크게 잡힌 상태에 가깝다.</li>
</ul>

<h2 id="원인">원인</h2>

<p>문제의 핵심은 <code class="language-plaintext highlighter-rouge">~/.codex/.codex-global-state.json</code> 안의 <code class="language-plaintext highlighter-rouge">electron-persisted-atom-state.review-open</code> 값이었다.
리뷰 패널이 실제로는 닫혀 있어도 이 값이 <code class="language-plaintext highlighter-rouge">true</code>로 stale하게 남아 있으면, 앱이 계속 <code class="language-plaintext highlighter-rouge">리뷰가 열린 창</code>으로 판단하면서 최소 너비를 크게 잡는다.</p>

<p>확인했을 때 메인 창 최소 크기는 일반 상태에서 <code class="language-plaintext highlighter-rouge">800 x 600</code>, <code class="language-plaintext highlighter-rouge">review-open: true</code> 상태에서는 <code class="language-plaintext highlighter-rouge">1200 x 800</code>으로 잡혀 있었다.
다만 macOS Retina 환경에서는 스크린샷의 물리 픽셀보다 <code class="language-plaintext highlighter-rouge">pt</code> 기준 최소 크기로 이해하는 편이 맞다.</p>

<h2 id="해결-방법">해결 방법</h2>

<blockquote>
  <p><code class="language-plaintext highlighter-rouge">Codex</code>가 실행 중이면 종료 시 상태 파일을 다시 덮어쓸 수 있다. 반드시 앱을 완전히 종료한 뒤 수정해야 한다.</p>
</blockquote>

<ol>
  <li><code class="language-plaintext highlighter-rouge">Codex</code>를 <code class="language-plaintext highlighter-rouge">Cmd+Q</code>로 완전히 종료한다.</li>
  <li>필요하면 상태 파일을 먼저 백업한다.</li>
</ol>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cp</span> ~/.codex/.codex-global-state.json ~/.codex/.codex-global-state.json.bak
</code></pre></div></div>

<ol>
  <li>아래 명령으로 <code class="language-plaintext highlighter-rouge">review-open</code> 값을 <code class="language-plaintext highlighter-rouge">false</code>로 바꾼다.</li>
</ol>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>perl <span class="nt">-0pi</span> <span class="nt">-e</span> <span class="s1">'s/"review-open":true/"review-open":false/g'</span> ~/.codex/.codex-global-state.json
</code></pre></div></div>

<ol>
  <li>값이 잘 바뀌었는지 확인한다.</li>
</ol>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>jq <span class="s1">'."electron-persisted-atom-state"["review-open"]'</span> ~/.codex/.codex-global-state.json
</code></pre></div></div>

<ol>
  <li><code class="language-plaintext highlighter-rouge">false</code>가 나오면 <code class="language-plaintext highlighter-rouge">Codex</code>를 다시 실행한다.</li>
</ol>

<p>문제가 해결되면 같은 창이 훨씬 좁은 폭까지 줄어든다.</p>

<p><img src="/assets/images/2026/03/28/codex-app-min-width-after-fix.png" alt="Codex 창 최소 너비 문제 해결 후" /></p>

<h2 id="그래도-정확히-반-화면까지는-안-갈-수-있는-이유">그래도 정확히 반 화면까지는 안 갈 수 있는 이유</h2>

<p>이 방법은 <code class="language-plaintext highlighter-rouge">stale 상태 때문에 비정상적으로 넓게 고정되는 문제</code>를 푸는 방법이지, 모든 환경에서 무조건 반 화면 이하까지 줄여 주는 방법은 아니다.</p>

<p><code class="language-plaintext highlighter-rouge">Codex</code> 메인 창 자체에 기본 최소 너비가 있고, 현재 디스플레이의 실제 작업 영역 절반이 그보다 더 좁으면 반 화면 배치는 불가능하다.</p>

<p>예를 들어 내가 확인한 환경은 다음과 같았다.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">MacBook Pro 14형 (Apple M4)</code></li>
  <li>디스플레이 기본 해상도 사용</li>
  <li>내장 디스플레이 작업 영역 폭 약 <code class="language-plaintext highlighter-rouge">1512pt</code></li>
  <li>화면 절반 약 <code class="language-plaintext highlighter-rouge">756pt</code></li>
</ul>

<p>이 환경에서는 <code class="language-plaintext highlighter-rouge">review-open</code> 문제를 해결해도 기본 최소 너비 <code class="language-plaintext highlighter-rouge">800</code>보다 화면 절반 <code class="language-plaintext highlighter-rouge">756</code>이 더 좁기 때문에, 기본 해상도에서는 반 화면보다 약간 더 넓은 수준까지만 줄어드는 것이 정상이다.</p>

<h2 id="다시-같은-문제가-생기면">다시 같은 문제가 생기면</h2>

<ul>
  <li><code class="language-plaintext highlighter-rouge">~/.codex/.codex-global-state.json</code>의 <code class="language-plaintext highlighter-rouge">review-open</code> 값이 다시 <code class="language-plaintext highlighter-rouge">true</code>로 돌아갔는지 먼저 확인한다.</li>
  <li>값이 <code class="language-plaintext highlighter-rouge">true</code>인데 리뷰 패널이 실제로 닫혀 있다면 같은 종류의 stale state 문제일 가능성이 높다.</li>
</ul>

<p>화면이 넓게 고정되는 현상 때문에 <code class="language-plaintext highlighter-rouge">Codex</code>를 화면분할로 쓰기 어려웠다면, 먼저 이 상태값부터 확인해보면 된다.</p>]]></content><author><name>Hyejun An(26)</name><email>jagaldol.dev@gmail.com</email></author><category term="development" /><summary type="html"><![CDATA[macOS용 Codex 데스크톱 앱을 쓰다 보면 창 가로폭이 어느 지점 아래로 더 줄어들지 않는 경우가 있다. 사이드바를 닫아도 여전히 넓게 고정돼 있다면, 단순한 레이아웃 문제가 아니라 내부 상태값이 꼬인 경우일 수 있다. 내가 겪은 경우에는 창이 정확히 1200px 근처 아래로 더 줄어들지 않았고, 사이드바를 닫아도 그 최소 너비는 그대로였다.]]></summary></entry><entry><title type="html">Playwright 사용해보기 - MCP와 Skill의 차이 (feat. Codex)</title><link href="https://blog.jagaldol.com/ai/playwright-mcp-codex/" rel="alternate" type="text/html" title="Playwright 사용해보기 - MCP와 Skill의 차이 (feat. Codex)" /><published>2026-03-14T14:00:00+09:00</published><updated>2026-03-14T14:00:00+09:00</updated><id>https://blog.jagaldol.com/ai/playwright-mcp-codex</id><content type="html" xml:base="https://blog.jagaldol.com/ai/playwright-mcp-codex/"><![CDATA[<p>AI가 손쉽게 브라우저를 조작할 수 있도록 만들어주는 Playwright를 사용해보자.
GPT 5.4에서 <code class="language-plaintext highlighter-rouge">playwright-interactive</code> 스킬 기반으로 웹 앱/게임을 만들었다고 하는데, 이 Playwright가 뭘까?</p>

<blockquote>
  <p>Weekly Tech Trend Talk 스터디(26.03.12)</p>
</blockquote>

<hr />

<h2 id="playwright-mcp">Playwright MCP</h2>

<p>Codex에 Playwright MCP를 추가하면 AI가 직접 브라우저를 조작할 수 있게 된다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>codex mcp add playwright <span class="nt">--</span> npx @playwright/mcp@latest
</code></pre></div></div>

<h3 id="추가되는-tool-목록">추가되는 Tool 목록</h3>

<p>MCP를 추가하면 다양한 브라우저 조작 도구들이 생긴다. 의미별로 묶으면 다음과 같다.</p>

<ul>
  <li><strong>페이지 이동:</strong> <code class="language-plaintext highlighter-rouge">navigate</code>, <code class="language-plaintext highlighter-rouge">navigate_back</code>, <code class="language-plaintext highlighter-rouge">tabs</code>, <code class="language-plaintext highlighter-rouge">close</code></li>
  <li><strong>입력/조작:</strong> <code class="language-plaintext highlighter-rouge">click</code>, <code class="language-plaintext highlighter-rouge">hover</code>, <code class="language-plaintext highlighter-rouge">type</code>, <code class="language-plaintext highlighter-rouge">fill_form</code>, <code class="language-plaintext highlighter-rouge">select_option</code>, <code class="language-plaintext highlighter-rouge">press_key</code>, <code class="language-plaintext highlighter-rouge">drag</code>, <code class="language-plaintext highlighter-rouge">handle_dialog</code>, <code class="language-plaintext highlighter-rouge">file_upload</code></li>
  <li><strong>관찰/디버깅:</strong> <code class="language-plaintext highlighter-rouge">snapshot</code>, <code class="language-plaintext highlighter-rouge">take_screenshot</code>, <code class="language-plaintext highlighter-rouge">console_messages</code>, <code class="language-plaintext highlighter-rouge">network_requests</code>, <code class="language-plaintext highlighter-rouge">evaluate</code>, <code class="language-plaintext highlighter-rouge">run_code</code></li>
  <li><strong>환경 보조:</strong> <code class="language-plaintext highlighter-rouge">resize</code>, <code class="language-plaintext highlighter-rouge">wait_for</code>, <code class="language-plaintext highlighter-rouge">install</code></li>
</ul>

<p>이 tool들을 AI가 적절히 조합해서 브라우저를 자동화한다.</p>

<hr />

<h2 id="playwright-skills">Playwright Skills</h2>

<p>Codex에는 <code class="language-plaintext highlighter-rouge">skill-installer</code> 스킬로 설치할 수 있는 <code class="language-plaintext highlighter-rouge">playwright</code>, <code class="language-plaintext highlighter-rouge">playwright-interactive</code> 같은 Playwright 관련 스킬들이 있다.
<code class="language-plaintext highlighter-rouge">skill-installer</code>는 <a href="https://github.com/openai/skills">openai/skills</a> 레포의 curated 목록에서 스킬을 내려받아 설치한다.</p>

<p>MCP와 Skill은 경쟁 관계가 아니라 역할이 다르다.</p>

<ul>
  <li><strong>MCP</strong>는 Codex에 실제 브라우저 tool을 연결해 주는 방식이다. 외부 시스템에 대한 <strong>실행 능력</strong>을 추가한다.</li>
  <li><strong>Skill</strong>은 반복해서 쓰는 절차를 <code class="language-plaintext highlighter-rouge">SKILL.md</code>, scripts, references로 묶어 둔 <strong>워크플로우 패키지</strong>다.</li>
</ul>

<p>Skill은 metadata만 먼저 보이고, 선택되었을 때만 <code class="language-plaintext highlighter-rouge">SKILL.md</code>와 필요한 references/scripts를 읽는 progressive disclosure 방식으로 설계되어 있다.
반면 MCP는 tool 표면이 넓어질수록 action surface가 커지기 때문에, OpenAI 문서에서도 처음부터 모든 tool을 붙이지 말고 실제 workflow에 필요한 몇 개부터 연결하라고 권장한다.</p>

<h3 id="playwright-스킬">playwright 스킬</h3>

<p><code class="language-plaintext highlighter-rouge">playwright</code> 스킬은 브라우저 tool을 새로 추가하는 것이 아니라,
Codex가 <code class="language-plaintext highlighter-rouge">playwright-cli</code> 또는 번들 wrapper script를 사용해 브라우저를 자동화하도록 안내하는 <strong>CLI 중심 워크플로우</strong>다.</p>

<ul>
  <li>MCP처럼 <code class="language-plaintext highlighter-rouge">mcp__playwright__...</code> tool이 생기지는 않는다</li>
  <li><code class="language-plaintext highlighter-rouge">open</code>, <code class="language-plaintext highlighter-rouge">snapshot</code>, <code class="language-plaintext highlighter-rouge">click</code>, <code class="language-plaintext highlighter-rouge">fill</code>, <code class="language-plaintext highlighter-rouge">screenshot</code> 같은 절차를 CLI 명령으로 재사용하도록 돕는다</li>
  <li>브라우저 capability를 늘리는 것보다, <strong>절차를 재사용 가능하게 만드는 것</strong>에 가깝다</li>
</ul>

<h3 id="playwright-interactive-스킬">playwright-interactive 스킬</h3>

<p><code class="language-plaintext highlighter-rouge">playwright-interactive</code> 스킬은 <code class="language-plaintext highlighter-rouge">js_repl</code> 안에서 Playwright 세션을 계속 유지하면서,
같은 브라우저나 Electron 앱 핸들을 재사용해 반복 디버깅하는 워크플로우다.</p>

<p><img src="/assets/images/2026/03/14/playwright-interactive-games.png" alt="playwright-interactive로 만든 게임들" /></p>

<p><strong>GPT 5.4가 이 스킬을 사용하여 위와 같은 게임들을 만들었다고 한다.</strong>
스크린샷은 테마파크 시뮬레이션 게임으로, 이소메트릭 뷰의 놀이공원을 운영하는 “Miniature” 게임이다.
이 외에도 RPG 게임, 골든 게이트 브리지 상공 비행 게임 등 다양한 장르를 생성했다.</p>

<ul>
  <li>MCP처럼 tool을 추가하는 것이 아니라, <strong>지속 세션 기반 디버깅 절차</strong>를 제공한다</li>
  <li>코드 변경 후 reload/relaunch를 반복하며 QA와 시각 확인을 수행하기 좋다</li>
  <li>단발성 CLI 실행보다 로컬 웹 앱이나 Electron 앱을 오래 붙들고 점검하는 데 더 적합하다</li>
</ul>

<hr />

<h2 id="정리">정리</h2>

<table>
  <thead>
    <tr>
      <th>구분</th>
      <th>MCP</th>
      <th>Skill</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>역할</td>
      <td>실제 tool을 붙이는 레이어</td>
      <td>tool/CLI를 어떤 순서와 방식으로 쓸지 정의하는 레이어</td>
    </tr>
    <tr>
      <td>동작</td>
      <td>브라우저 조작 도구 추가</td>
      <td>워크플로우 절차 제공</td>
    </tr>
    <tr>
      <td>비용</td>
      <td>action surface 증가</td>
      <td>progressive disclosure로 최소화</td>
    </tr>
  </tbody>
</table>

<p>MCP는 실행 능력을 제공하고, Skill은 그 능력을 효과적으로 사용하는 방법을 제공하는 관계라고 볼 수 있다.</p>]]></content><author><name>Hyejun An(26)</name><email>jagaldol.dev@gmail.com</email></author><category term="ai" /><summary type="html"><![CDATA[AI가 손쉽게 브라우저를 조작할 수 있도록 만들어주는 Playwright를 사용해보자. GPT 5.4에서 playwright-interactive 스킬 기반으로 웹 앱/게임을 만들었다고 하는데, 이 Playwright가 뭘까?]]></summary></entry></feed>