<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>피터의 개발이야기</title>
    <link>https://peterica.tistory.com/</link>
    <description>기록으로 실력을 쌓자! 
기록하고 기억하며 새로운 개발 능력을 창출하는 백엔드 개발자를 꿈꿉니다.</description>
    <language>ko</language>
    <pubDate>Wed, 20 May 2026 14:34:49 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>기록하는 백앤드개발자</managingEditor>
    <image>
      <title>피터의 개발이야기</title>
      <url>https://tistory1.daumcdn.net/tistory/4353622/attach/b46072b914e149bd8a07eb59d30816ea</url>
      <link>https://peterica.tistory.com</link>
    </image>
    <item>
      <title>[온디바이스AI] 로컬 LLM에서 중요한 것은 CPU가 아니라 메모리다 - 맥미니와 모델 크기의 관계</title>
      <link>https://peterica.tistory.com/1078</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhwv0U/dJMcajoF5qx/geeobYKEmsyWtYJopU0zB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhwv0U/dJMcajoF5qx/geeobYKEmsyWtYJopU0zB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhwv0U/dJMcajoF5qx/geeobYKEmsyWtYJopU0zB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhwv0U%2FdJMcajoF5qx%2FgeeobYKEmsyWtYJopU0zB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;TL;DR&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 LLM 환경에서 가장 먼저 부딪히는 벽은 연산 성능보다 메모리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 모델은 &amp;ldquo;문장을 생성&amp;rdquo;하지만,&lt;br /&gt;큰 모델은 &amp;ldquo;컨텍스트를 유지하며 추론&amp;rdquo;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 로컬 AI 머신의 핵심은 CPU 속도가 아니라,&lt;br /&gt;얼마나 큰 모델과 Context를 메모리에 안정적으로 올릴 수 있는가에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 한 크루가 맥미니를 구매해서 로컬 LLM 기반 서비스를 직접 만들어 보고 싶다고 이야기했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면서 자연스럽게 이런 질문이 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;맥미니를 산다면 CPU가 중요할까, GPU가 중요할까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 보통 코어 수나 GPU 성능을 먼저 보게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 실제로 로컬 LLM을 구성해보면 병목은 생각보다 다른 곳에서 먼저 나타난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; 좀 더 자세한 글) &lt;a href=&quot;https://peterica.tistory.com/1067&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI] GPU vs PIM vs NPU - 내 시스템의 병목은 연산인가, 메모리인가&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 커질수록 가장 먼저 부족해지는 것은 연산 성능보다 메모리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Apple Silicon은 통합 메모리 구조이기 때문에 이 특징이 더 강하게 드러난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 로컬 LLM은 왜 메모리를 많이 먹는가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 PC에서는 CPU 메모리와 GPU VRAM이 분리되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Apple Silicon은 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU, GPU, Neural Engine이 모두 같은 메모리를 공유한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 로컬 LLM을 실행할 때 메모리는 단순히 &amp;ldquo;프로그램 실행 공간&amp;rdquo;이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 요소들이 모두 메모리를 사용한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델 가중치(weight)&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://llm-study-web.vercel.app/learn/kv-cache&quot;&gt;KV Cache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Context Window&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://llm-study-web.vercel.app/learn/embedding&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Embedding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://llm-study-web.vercel.app/learn/attention&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Attention&lt;/a&gt; 중간 상태&lt;/li&gt;
&lt;li&gt;RAG 데이터 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 모델이 커질수록 단순히 저장 공간만 늘어나는 것이 아니라,&lt;br /&gt;&amp;nbsp; &amp;ldquo;계속 읽어와야 하는 데이터&amp;rdquo;가 급격히 증가한다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 추론(decode) 단계에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전 토큰 상태를 계속 참조하고&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://llm-study-web.vercel.app/learn/kv-cache&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;KV Cache&lt;/a&gt;를 반복적으로 읽고&lt;/li&gt;
&lt;li&gt;긴 Context를 유지해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 AI 추론은 생각보다 &amp;ldquo;계산&amp;rdquo;보다 &amp;ldquo;메모리 접근&amp;rdquo; 비용이 더 커진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 로컬 LLM에서는 CPU 성능보다 메모리 용량과 대역폭이 훨씬 중요하게 체감된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 작은 모델은 왜 쉽게 맥락을 잃는가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 로컬 LLM을 접하면 7B~8B 모델만으로도 꽤 놀랍다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 번역도 되고,&lt;br /&gt;&amp;nbsp; 요약도 되고,&lt;br /&gt;&amp;nbsp; 코드도 어느 정도 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 조금만 복잡한 작업을 시키면 한계가 드러난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전 조건을 잊는다&lt;/li&gt;
&lt;li&gt;긴 문서를 읽다가 핵심을 놓친다&lt;/li&gt;
&lt;li&gt;여러 제약을 동시에 유지하지 못한다&lt;/li&gt;
&lt;li&gt;Agent 흐름이 쉽게 무너진다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 &amp;ldquo;프롬프트를 잘못 준 것 아닐까?&amp;rdquo;라고 생각했는데, 계속 사용하다 보니 단순 프롬프트 문제가 아니었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작은 모델은 &amp;ldquo;문장을 생성&amp;rdquo;하는 능력은 괜찮지만, 긴 흐름을 유지하며 추론하는 능력은 제한적이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 &lt;b&gt;말은 자연스럽지만, 생각의 지속성이 약하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 모델 크기가 커질수록 달라지는 점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14B~16B 정도부터는 확실히 느낌이 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구간부터는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 조건을 동시에 유지하고&lt;/li&gt;
&lt;li&gt;문서 구조를 이해하려 하고&lt;/li&gt;
&lt;li&gt;이전 Context를 덜 잊는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 RAG와 연결했을 때 차이가 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7B에서는 검색된 문서 일부만 참고하다가 핵심을 놓치는 경우가 많았는데,&lt;br /&gt;16B급부터는 &amp;ldquo;문서를 기반으로 답하려는 느낌&amp;rdquo;이 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 32B 구간부터는 체감이 더 커진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시점부터는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장기 Context 유지&lt;/li&gt;
&lt;li&gt;설계 reasoning&lt;/li&gt;
&lt;li&gt;Multi-Agent 흐름&lt;/li&gt;
&lt;li&gt;코드 구조 이해&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 작업이 꽤 안정적으로 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 이 구간부터 로컬 LLM이 단순 장난감이 아니라 &amp;ldquo;도구&amp;rdquo;처럼 느껴진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실사용 관점으로 정리하면 대략 이런 느낌이다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;모델급&lt;/td&gt;
&lt;td&gt;권장&amp;nbsp;메모리&lt;/td&gt;
&lt;td&gt;체감&amp;nbsp;능력&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7B~8B&lt;/td&gt;
&lt;td&gt;16GB&lt;/td&gt;
&lt;td&gt;번역, 요약, 단순 코드 보조, 짧은 질답&lt;/td&gt;
&lt;td&gt;추론 깊이가 얕음. 긴 대화에서 맥락 손실 잦음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14B~16B&lt;/td&gt;
&lt;td&gt;24~32GB&lt;/td&gt;
&lt;td&gt;간단한 추론, 문서 구조 이해, 기본 Agent 가능&lt;/td&gt;
&lt;td&gt;여러 조건 비교/장기 계획 약함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32B&lt;/td&gt;
&lt;td&gt;64GB&lt;/td&gt;
&lt;td&gt;&amp;ldquo;생각하는 느낌&amp;rdquo;이 생김. RAG 활용 안정화&lt;/td&gt;
&lt;td&gt;복합 추론에서 아직 실수 존재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70B&lt;/td&gt;
&lt;td&gt;128GB+&lt;/td&gt;
&lt;td&gt;클라우드 모델에 가까운 품질 체감&lt;/td&gt;
&lt;td&gt;비용/속도 부담 큼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MoE 대형 모델&lt;/td&gt;
&lt;td&gt;128GB~256GB&lt;/td&gt;
&lt;td&gt;특정 영역 매우 강력&lt;/td&gt;
&lt;td&gt;로컬 운영 난이도 매우 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 결국 맥미니에서 중요한 것은 메모리다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흥미로운 점은 &lt;b&gt;로컬 LLM 환경에서는 CPU 업그레이드보다 메모리 업그레이드 체감이 훨씬 크다는 점&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로는 다음처럼 느껴진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 점은 &amp;ldquo;실행 가능&amp;rdquo;과 &amp;ldquo;안정적으로 운용 가능&amp;rdquo;은 완전히 다르다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리가 부족하면 일부 데이터를 SSD swap으로 넘기게 되는데, 이 순간부터 응답 속도가 급격히 느려진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 단순히 느려지는 것을 넘어서,&amp;nbsp;추론 흐름 자체가 끊기는 느낌이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리 &amp;mdash; 로컬 LLM의 병목은 결국 메모리다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 로컬 AI 머신이라고 하면 CPU나 GPU 성능을 먼저 떠올리게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로 계속 실험해보면 생각보다 더 중요한 것은&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;ldquo;얼마나 큰 모델과 Context를 메모리에 안정적으로 유지할 수 있는가&amp;rdquo;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 로컬 LLM 환경에서 중요한 것은 단순 FLOPS가 아니라,&lt;br /&gt;Context를 잃지 않고 계속 유지할 수 있는 메모리 구조에 더 가까운 것 같다.&lt;/p&gt;</description>
      <category>AI/RAG</category>
      <category>Mac Mini</category>
      <category>PETERICA</category>
      <category>로컬 llm</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1078</guid>
      <comments>https://peterica.tistory.com/1078#entry1078comment</comments>
      <pubDate>Wed, 20 May 2026 11:20:07 +0900</pubDate>
    </item>
    <item>
      <title>[독후감] 협상의 기술</title>
      <link>https://peterica.tistory.com/1077</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5JlSV/dJMcaiiXaCN/oMOkFwvu0uJ5tcbtX7k041/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5JlSV/dJMcaiiXaCN/oMOkFwvu0uJ5tcbtX7k041/img.png&quot; data-alt=&quot;https://product.kyobobook.co.kr/detail/S000000597965&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5JlSV/dJMcaiiXaCN/oMOkFwvu0uJ5tcbtX7k041/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5JlSV%2FdJMcaiiXaCN%2FoMOkFwvu0uJ5tcbtX7k041%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;680&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://product.kyobobook.co.kr/detail/S000000597965&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 예전에 읽었던 &lt;b&gt;세이노의 가르침&lt;/b&gt;에서 추천했던 책이다.&lt;br /&gt;나는&amp;nbsp;책을&amp;nbsp;읽을&amp;nbsp;때&amp;nbsp;단순히&amp;nbsp;내용을&amp;nbsp;따라가기보다,&amp;nbsp;작가와&amp;nbsp;대화하듯&amp;nbsp;읽으려고&amp;nbsp;한다.&amp;nbsp;그래서&amp;nbsp;먼저&amp;nbsp;작가가&amp;nbsp;어떤&amp;nbsp;사람인지&amp;nbsp;이해하고,&amp;nbsp;어떤&amp;nbsp;경험과&amp;nbsp;관점으로&amp;nbsp;자신의&amp;nbsp;생각을&amp;nbsp;전달하려&amp;nbsp;하는지&amp;nbsp;살펴본다.&amp;nbsp;그리고&amp;nbsp;각&amp;nbsp;챕터가&amp;nbsp;그&amp;nbsp;핵심적인&amp;nbsp;생각을&amp;nbsp;어떤&amp;nbsp;방식으로&amp;nbsp;풀어내고&amp;nbsp;있는지&amp;nbsp;작가의&amp;nbsp;입장에서&amp;nbsp;따라가며&amp;nbsp;읽으려&amp;nbsp;노력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ ChatGPT 작가의 사고방식을 이해하며 읽기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허브 코헨을 이해하기 위해 단순히 책의 내용만 따라가지는 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책을&amp;nbsp;읽다가&amp;nbsp;생기는&amp;nbsp;궁금한&amp;nbsp;점이나&amp;nbsp;이해되지&amp;nbsp;않는&amp;nbsp;관점들을&amp;nbsp;계속&amp;nbsp;정리하며,&amp;nbsp;작가가&amp;nbsp;왜&amp;nbsp;이런&amp;nbsp;사례를&amp;nbsp;들었는지,&amp;nbsp;결국&amp;nbsp;어떤&amp;nbsp;생각을&amp;nbsp;전달하려&amp;nbsp;하는지&amp;nbsp;스스로&amp;nbsp;해석해보려&amp;nbsp;했다.&lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;허브&amp;nbsp;코헨은&amp;nbsp;일반적인&amp;nbsp;자기계발서처럼&amp;nbsp;핵심&amp;nbsp;이론을&amp;nbsp;먼저&amp;nbsp;설명하는&amp;nbsp;방식으로&amp;nbsp;글을&amp;nbsp;쓰지&amp;nbsp;않는다.&amp;nbsp;오히려&amp;nbsp;다양한&amp;nbsp;사례를&amp;nbsp;먼저&amp;nbsp;보여주고,&amp;nbsp;독자가&amp;nbsp;그&amp;nbsp;안에서&amp;nbsp;스스로&amp;nbsp;핵심을&amp;nbsp;발견하도록&amp;nbsp;유도하는&amp;nbsp;방식에&amp;nbsp;가깝다.&amp;nbsp;그래서&amp;nbsp;처음에는&amp;nbsp;&amp;ldquo;이&amp;nbsp;사례는&amp;nbsp;왜&amp;nbsp;등장했을까?&amp;rdquo;,&amp;nbsp;&amp;ldquo;결국&amp;nbsp;무엇을&amp;nbsp;말하려는&amp;nbsp;걸까?&amp;rdquo;라는&amp;nbsp;생각이&amp;nbsp;자주&amp;nbsp;들었다.&lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;이런&amp;nbsp;흐름을&amp;nbsp;따라가다&amp;nbsp;보니,&amp;nbsp;허브&amp;nbsp;코헨은&amp;nbsp;단순히&amp;nbsp;협상&amp;nbsp;기술을&amp;nbsp;설명하려는&amp;nbsp;사람이&amp;nbsp;아니라,&amp;nbsp;독자가&amp;nbsp;기존의&amp;nbsp;고정된&amp;nbsp;사고방식을&amp;nbsp;다시&amp;nbsp;바라보게&amp;nbsp;만드는&amp;nbsp;사람이라는&amp;nbsp;점을&amp;nbsp;조금씩&amp;nbsp;이해하게&amp;nbsp;되었다.&amp;nbsp;그는&amp;nbsp;정답을&amp;nbsp;직접&amp;nbsp;설명하기보다,&amp;nbsp;사례를&amp;nbsp;통해&amp;nbsp;독자의&amp;nbsp;생각을&amp;nbsp;흔들고&amp;nbsp;스스로&amp;nbsp;깨닫게&amp;nbsp;만드는&amp;nbsp;방식으로&amp;nbsp;글을&amp;nbsp;전개하고&amp;nbsp;있었다.&lt;br /&gt;&lt;br /&gt;이런 흐름을 더 깊게 이해하기 위해, 나는 ChatGPT에게 허브 코헨의 관점과 말하는 방식을 함께 분석하여 작가처럼 답변해달라고 요청했다. 단순히 내용을 요약해달라는 것이 아니라, 마치 허브 코헨 작가와 대화하듯 &amp;ldquo;왜 이런 사례를 들었는가&amp;rdquo;, &amp;ldquo;이 상황에서 무엇을 말하려는 것인가&amp;rdquo;를 계속 질문하며 읽었다.&lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;이해가&amp;nbsp;어려웠던&amp;nbsp;부분은&amp;nbsp;『세상에&amp;nbsp;불가능한&amp;nbsp;협상은&amp;nbsp;없다』&amp;nbsp;챕터였다.&amp;nbsp;사례는&amp;nbsp;계속&amp;nbsp;이어지는데&amp;nbsp;명확한&amp;nbsp;결론이&amp;nbsp;바로&amp;nbsp;드러나지&amp;nbsp;않아&amp;nbsp;처음에는&amp;nbsp;흐름을&amp;nbsp;따라가기&amp;nbsp;어려웠다.&amp;nbsp;하지만&amp;nbsp;대화를&amp;nbsp;이어가며,&amp;nbsp;허브&amp;nbsp;코헨은&amp;nbsp;협상&amp;nbsp;기술&amp;nbsp;자체를&amp;nbsp;설명하려는&amp;nbsp;사람이&amp;nbsp;아니라&amp;nbsp;독자의&amp;nbsp;고정된&amp;nbsp;사고방식을&amp;nbsp;흔들고&amp;nbsp;새로운&amp;nbsp;관점으로&amp;nbsp;상황을&amp;nbsp;바라보게&amp;nbsp;만드는&amp;nbsp;사람이라는&amp;nbsp;점을&amp;nbsp;조금씩&amp;nbsp;이해하게&amp;nbsp;되었다.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;과정은&amp;nbsp;단순히&amp;nbsp;책&amp;nbsp;내용을&amp;nbsp;정리하는&amp;nbsp;것과는&amp;nbsp;달랐다.&amp;nbsp;오히려&amp;nbsp;작가의&amp;nbsp;머릿속&amp;nbsp;사고&amp;nbsp;흐름을&amp;nbsp;따라가며&amp;nbsp;&amp;ldquo;왜&amp;nbsp;이런&amp;nbsp;생각을&amp;nbsp;했는가&amp;rdquo;를&amp;nbsp;추적하는&amp;nbsp;경험에&amp;nbsp;가까웠다.&amp;nbsp;덕분에&amp;nbsp;책의&amp;nbsp;내용을&amp;nbsp;외우기보다,&amp;nbsp;허브&amp;nbsp;코헨이&amp;nbsp;세상을&amp;nbsp;바라보는&amp;nbsp;방식을&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;이해하며&amp;nbsp;읽을&amp;nbsp;수&amp;nbsp;있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 작가에 대한 이해&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-sfc-root=&quot;c&quot; data-wiz-uids=&quot;Ne8njb_h&quot; data-sfc-cb=&quot;&quot; data-processed=&quot;true&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(230, 232, 240);&quot;&gt;&lt;span data-subtree=&quot;aimfl,mfl&quot; data-processed=&quot;true&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(230, 232, 240);&quot;&gt;허브 코헨(Herb Cohen)&lt;/span&gt;&lt;/span&gt;(1931~2015)은 50년 넘게 미국 대통령, 법무부, FBI, CIA 등에서 협상 자문을 맡아온 세계적인 실전 협상 전문가이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그의 특징은 &lt;b&gt;협상을 비즈니스 기술서&lt;/b&gt;가 아니라 &lt;b&gt;일상 인간관계의 본질&lt;/b&gt;로 본다는 점이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;여러분 각자 자신의 자리와 신념의 체계 안에서 자신만의 고유한 요구를 바탕으로 자신이 원하는 것을 얻는 방법을 깨닫기 바란다.&lt;br /&gt;머릿말, p9&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그는 협상을 기술적이나 법률적으로 설명하지 않고, 일상에 포함한 인간 행동의 문제로 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 책에서도 법칙이나 이론보다 실제 사례와 심리 묘사가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그의 문체 특징도 뚜렷하다.&lt;br /&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;이론보다&amp;nbsp;이야기&amp;nbsp;중심&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;우화&amp;middot;실화&amp;middot;농담이&amp;nbsp;많음&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;상대&amp;nbsp;심리를&amp;nbsp;해석하는&amp;nbsp;방식&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;독자에게&amp;nbsp;&amp;ldquo;세상은&amp;nbsp;이렇게&amp;nbsp;돌아간다&amp;rdquo;를&amp;nbsp;체험시키는&amp;nbsp;구조&lt;br /&gt;그래서 책을 읽다 보면 &amp;ldquo;논리적으로 설명한다&amp;rdquo;기보다, 마치 경험 많은 협상가가 옆에서 사례를 들려주는 느낌이 강하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허브 코헨의 핵심 관점은 크게 세 가지로 정리된다.&lt;br /&gt;&lt;b&gt;협상은 정보, 시간, 힘의 게임이다.&lt;/b&gt; p22&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;협상 능력이란 행동에 영향을 미치는 정보, 시간, 힘을 분석하여 요구가 자신이 원하는 방식대로 이루어지도록 만드는 것이다. p23&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;협상은 한계를 넘어서는 힘인 것이다. 하지만 그것이 윤리적 판단은 중립적이다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;협상가로서 위험을 감수하고, 과거의 경험에서 벗어나 자신이 세운 가정에 도전하고, 목표 수준을 높이고, 기대치를 높여야한다. p33&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 그의 글에는 &lt;b&gt;극단적인 초기 입장&lt;/b&gt;, &lt;b&gt;허세&lt;/b&gt;, &lt;b&gt;시간 끌기&lt;/b&gt;, &lt;b&gt;애매한 표현&lt;/b&gt;, &lt;b&gt;심리 압박&lt;/b&gt; 같은 요소가 자주 등장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 책을 읽으면서&amp;nbsp; 불편함을 느꼈던 부분도 바로 이런 지점이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현대 기준에서는 다소 공격적이거나 조작적으로 보일 수 있는 사례도 많아 비도덕적으로 느껴진다. 예로 말보로 담배 한개비 p78&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;힘이 그 자체로 좋거나 나쁘지는 않다. 도덕적이거나 비도덕적이지도 않다. 윤리적인 것도 비윤리적인 것도 아니다. 힘은 중립적이다. p73&lt;br /&gt;가능한 여러 목표에 따라 힘을 나눠보면 목표는 유쾌하게 '좋은 것' 또는 가증스럽게 '나쁜 것'일 수 있지만, 그 목표를 달성하는 데 사용하는 힘은 전기나 바람처럼 중립적이다. p74&lt;br /&gt;합당한 범위 내에서, 자신이 가진 옵션에 대해 알고 있고, 자신이 세운 가정을 시험해보고, 확실한 정보를 기반으로 계산한 위험을 감수하고, 자신이 힘을 가지고 있다고 믿는다면 당신은 자신이 원하는 것을 얻을 수 있다. p78&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;다만 허브 코헨은 &lt;b&gt;협상이 단순히 속이는 기술&lt;/b&gt;을 말하려는 사람은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오히려 인간 사회 자체가 완전히 합리적이지 않다는 현실을 인정하고, 그 현실 속에서 손해 보지 않기 위한 관찰력을 강조한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;윤리적인 윈윈 협상가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작가는 이상적인 윤리만으로는 실제 협상에서 밀릴 수 있다는 현실주의적 시각이 강하다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;일반적으로 협상이라고 하면 자신의 이익을 얻기 위한 기술을 떠올리기 쉽지만, 작가는 오히려 상대를 억압하거나 파괴하지 않고 사람들의 사고방식 자체를 변화시키려 했던 인물들을 예로 들고 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;두 사람은 초라한 옷을 입고 돌아다니며 사람들에게 질문하며 정보를 수집했다. 1명은 삼단논법을, 다른 1명은 비유를 사용했다. 그들에게는 목표와 기준이 있었다. 그들은 기꺼이 위험을 감수했다. ~중간생략~&lt;br /&gt;그 두 사람은 예수 그리스도와 소크라테스다. 내가 보기에 그 둘은 협상가였다. 그들은 윤리적인 윈윈 협상가들이었고, 힘을 가진 사람들이었다. p23&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예수님는 비도더적인 상황에서 십자가에 못박혀 돌아가셨다. 하지만 그의 협상가로서 성경을 통해 오늘도 그 힘은 영향력을 가지고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소크라테스도 당시&amp;nbsp;아테네&amp;nbsp;사회의&amp;nbsp;기존&amp;nbsp;가치와&amp;nbsp;권위에&amp;nbsp;계속&amp;nbsp;질문을&amp;nbsp;던졌고,&amp;nbsp;결국&amp;nbsp;많은&amp;nbsp;사람들에게&amp;nbsp;불편한&amp;nbsp;존재가&amp;nbsp;되었다.&amp;nbsp;특히&amp;nbsp;젊은이들을&amp;nbsp;타락시킨다는&amp;nbsp;혐의와&amp;nbsp;신을&amp;nbsp;부정했다는&amp;nbsp;이유로&amp;nbsp;재판에&amp;nbsp;넘겨졌고,&amp;nbsp;끝내&amp;nbsp;사형&amp;nbsp;선고를&amp;nbsp;받아&amp;nbsp;독배를&amp;nbsp;마시고&amp;nbsp;죽었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예수는&amp;nbsp;사랑과&amp;nbsp;용서를&amp;nbsp;통해&amp;nbsp;사람들의&amp;nbsp;삶의&amp;nbsp;방향을&amp;nbsp;바꾸려&amp;nbsp;했고,&amp;nbsp;소크라테스는&amp;nbsp;질문과&amp;nbsp;대화를&amp;nbsp;통해&amp;nbsp;스스로&amp;nbsp;생각하게&amp;nbsp;만들려&amp;nbsp;했다.&amp;nbsp;둘&amp;nbsp;다&amp;nbsp;강압적으로&amp;nbsp;상대를&amp;nbsp;이기려&amp;nbsp;하지&amp;nbsp;않았고,&amp;nbsp;오히려&amp;nbsp;사람들에게&amp;nbsp;새로운&amp;nbsp;관점을&amp;nbsp;제시하며&amp;nbsp;스스로&amp;nbsp;깨닫게&amp;nbsp;만들었다는&amp;nbsp;공통점이&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 현실 세계에서 도덕적 방식은 언제나 환영받는 것은 아니었다. 기존 질서와 사고방식을 흔드는 사람은 결국 불편한 존재가 되기 쉽기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 허브 코헨이 말하는 &lt;b&gt;&amp;ldquo;윤리적인 윈윈 협상가&amp;rdquo;&lt;/b&gt;라는 표현은 단순히 착하고 부드러운 사람이라는 뜻이 아니라, 자신의 기준과 가치관을 유지하면서도 사람들의 생각과 선택을 변화시키려 했던 사람들에 더 가까워 보였다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;권력에 의지하기 위해 폭력적이 될 필요는 없고,&amp;nbsp;&lt;br /&gt;양심적으로 말하기 위해 온순할 필요는 없다.&lt;br /&gt;가장 효과적인 행동은 권력에 의지하면서&amp;nbsp;&lt;br /&gt;양심적으로 행동하는 것이다. (바바라 데밍) p369&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 이해한 작가가 말하고자 하는 협상가는 상대를 이기려는 단일 목적이 아니라,&amp;nbsp; 사람들에게 새로운 관점을 제시하여 상생하는 윈윈 협상가이다. 다만 그 협상은 한계를 넘어서기 위해서 자신의 힘, 시간, 정보를 기반으로 합당한 범위 내에서 위험을 감수해야 한다. 작가는 이를 설명하기 위해 이 책에서 법칙이나 이론보다 실제 사례와 심리 묘사로 스스로 해석하게 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 협상으로 이루어진 세상&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 협상이란 무엇인가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허브 코헨은 협상을 단순한 대화 기술이 아니라, 상대의 선택과 행동을 변화시키는 과정으로 설명한다.&lt;br /&gt;특히 협상은 특별한 상황이 아니라 인간관계 속에서 이미 매일 반복되고 있는 일상적인 구조라고 바라본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인상적이었던 점은 협상을 &amp;ldquo;이기는 기술&amp;rdquo;보다 &amp;ldquo;원하는 결과를 얻기 위한 조율 과정&amp;rdquo;으로 설명한다는 점이었다.&lt;br /&gt;결국 협상은 말을 잘하는 능력보다, 사람과 상황을 어떻게 이해하고 움직이느냐의 문제에 가까워 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 세상에 불가능한 협상은 없다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 챕터는 처음 읽을 때 가장 이해하기 어려웠던 부분이었다.&lt;br /&gt;사례는 계속 이어지는데 명확한 결론이 바로 드러나지 않았기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 계속 읽다 보니 허브 코헨은 &amp;ldquo;불가능한 협상은 없다&amp;rdquo;는 말을 낙관적으로 사용하는 것이 아니었다.&lt;br /&gt;오히려 사람들이 스스로 조건을 고정된 것으로 생각하기 때문에 협상이 막히는 것이며, 관점을 바꾸면 새로운 선택지가 보일 수 있다는 점을 말하려 했던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 이 챕터의 핵심은 협상 기술보다, 기존 사고방식을 흔드는 데 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 협상의 세계에 발 들여놓기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허브 코헨은 협상을 거창한 비즈니스 기술이 아니라, 이미 우리의 삶 전체에 포함된 구조로 설명한다.&lt;br /&gt;가족, 친구, 직장, 식당 주문처럼 아주 작은 선택과 조율 속에서도 협상은 계속 일어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 챕터를 읽으며 느꼈던 것은, 협상을 특별한 능력으로 바라보기보다 인간관계를 이해하는 관점 자체로 받아들이고 있다는 점이었다. 경쟁을 붙이기, 필요 충족하기, 할인 중 등 직원과의 관계에서 안될 것 같은 협상에 정말 다양한 대안을 제시하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 협상을 좌우하는 3가지 변수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허브 코헨는 협상의 흐름을 결정하는 핵심 요소로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 힘(당신에게 힘이 있다는 사실을 인지하라),&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시간(협상은 인내심 싸움이다),&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 정보(상대가 말하지 않는 정보까지 캐내라)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 제시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 협상은 결국 이 세 가지 변수를 얼마나 잘 이해하고 활용하느냐에 따라 결과가 달라진다고 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 인상적이었던 점은, 이 요소들이 단순히 객관적인 사실만으로 작동하지 않는다는 점이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 힘보다 &lt;b&gt;&amp;ldquo;힘이 있다고 믿게 만드는 인식&amp;rdquo;&lt;/b&gt;이 더 중요하기도 하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 자체보다 &lt;b&gt;&amp;ldquo;누가 더 조급한가&amp;rdquo;&lt;/b&gt;가 협상의 흐름을 결정하기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 협상은 논리만의 문제가 아니라 인간 심리와 상황 인식의 문제에 더 가까워 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작가는 힘을 매우 현실적으로 바라본다.&lt;br /&gt;힘은 선하거나 악한 것이 아니라 목표를 이루기 위해 사용하는 중립적인 도구라고 설명한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;힘은 그 자체로 좋거나 나쁘지 않다. 힘은 결과가 아니라 수단이다.&amp;rdquo; p73~76&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 책 속에서는 경쟁 유도, 시간 끌기, 애매한 표현, 심리 압박 같은 현실적인 사례들도 자주 등장한다. 처음에는 이런 방식들이 다소 불편하게 느껴졌다. 하지만 허브 코헨은 이를 단순한 속임수로 설명하기보다, 현실 사회가 실제로 어떻게 움직이는지를 보여주려 했던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 이 챕터에서 가장 중요하게 느껴졌던 부분은, 협상은 말을 잘하는 사람이 유리한 게임이 아니라는 점이었다. 상대가 무엇을 원하고 있는지, 누가 더 급한지, 어떤 정보와 선택지를 가지고 있는지를 얼마나 잘 이해하느냐가 협상의 흐름을 결정하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 2가지 협상 스타일&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허브 코헨은 협상 방식을 크게 두 가지 스타일로 나누어 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7.&amp;nbsp;&amp;ldquo;무슨&amp;nbsp;수를&amp;nbsp;써서라도&amp;nbsp;이긴다&amp;rdquo;&amp;nbsp;소련&amp;nbsp;스타일&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째는 상대를 이겨야만 성공이라고 생각하는 &amp;ldquo;소련 스타일&amp;rdquo;이다. 이 방식은 극단적인 요구, 심리 압박, 시간 끌기, 허세 같은 방법을 적극적으로 사용한다. 협상을 서로의 조율 과정이 아니라 승패의 문제로 바라보며, 상대보다 우위를 점하는 것 자체를 중요하게 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 이런 방식이 다소 공격적이고 비도덕적으로 느껴졌다. 하지만 허브 코헨은 이런 사례들을 단순히 따라 하라고 설명하기보다, 현실 사회에서는 실제로 이런 방식으로 움직이는 사람들도 존재한다는 점을 보여주려 했던 것 같다. 결국 이런 스타일을 이해해야 상대의 전략에 휘둘리지 않을 수 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8.&amp;nbsp;&amp;ldquo;협상은&amp;nbsp;쌍방을&amp;nbsp;위한&amp;nbsp;것&amp;rdquo;&amp;nbsp;윈윈&amp;nbsp;스타일&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 작가가 궁극적으로 지향하는 방식은 &amp;ldquo;윈윈 스타일&amp;rdquo;이다. 이 방식은 상대를 무너뜨리는 것이 아니라, 서로가 원하는 것을 조율하며 함께 만족할 수 있는 결과를 찾는 협상에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흥미로웠던 점은 허브 코헨이 단순히 착하고 양보하는 태도를 윈윈이라고 설명하지 않는다는 점이었다. 오히려 자신의 힘과 정보, 기준을 명확히 이해한 상태에서 상대와 현실적인 균형점을 찾는 과정을 더 중요하게 바라본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;9. 상호&amp;nbsp;만족을&amp;nbsp;위한&amp;nbsp;협상의&amp;nbsp;기술&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 챕터에서는 실제로 어떻게 서로 만족할 수 있는 협상을 만들어가는지 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 책 초반에 예수와 소크라테스를 &amp;ldquo;윤리적인 윈윈 협상가&amp;rdquo;로 설명한 부분이 인상적이었다. 두 사람 모두 상대를 강압적으로 이기려 하기보다, 질문과 대화를 통해 사람들의 사고방식 자체를 변화시키려 했기 때문이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;나는 유혹이나 사기 게임에 대해 말하는 것이 아니다. 협력적인 셥셩에서는 음해, 위협, 수작을 부리기 위한 유려한 말솜씨, 조작, 허튼소리, 수완이나 흥정이 필요없다.&amp;nbsp;&lt;br /&gt;반대로 지속적인 관계를 만들고 유지하는 방향으로 전략을 수립하기 제안한다. 신뢰하는 당사자들은 동증하며 상호 간에 이익을 취할 수 있는 방향으로 문제를 해결하기 위해 에너지를 쏟아붓는다. p303&lt;br /&gt;&amp;nbsp;승리란 자신의 신념과 가치에 맞게 당신의 요구를 충족시키는 것을 의미한다. 승리는 상대측이 정말로 원하는 것을 아라내고 그들에게 당신이 원하는 것을 얻을 방법을 보여주는 것을 의미한다. p308&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 이 챕터를 읽으며 느꼈던 것은, 허브 코헨이 말하는 좋은 협상가는 단순히 말을 잘하거나 상대를 이기는 사람이 아니라는 점이었다. 자신의 기준과 가치관을 유지하면서도, 사람들의 선택과 생각을 긍정적인 방향으로 움직일 수 있는 사람이 더 이상적인 협상가에 가까워 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;어디서나,&amp;nbsp;누구와도&amp;nbsp;협상하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허브 코헨은 마지막 파트에서 협상을 단순한 이론이 아니라, 현실 속 인간관계와 실제 상황에서 어떻게 적용해야 하는지 설명한다.&lt;br /&gt;특히&amp;nbsp;이&amp;nbsp;챕터에서는&amp;nbsp;협상이&amp;nbsp;결국&amp;nbsp;사람&amp;nbsp;사이에서&amp;nbsp;이루어지는&amp;nbsp;일이라는&amp;nbsp;점을&amp;nbsp;반복해서&amp;nbsp;강조한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;10.&amp;nbsp;비대면&amp;nbsp;전화&amp;nbsp;협상에서&amp;nbsp;합의&amp;nbsp;각서는&amp;nbsp;필수&lt;/b&gt;&lt;br /&gt;허브 코헨은 전화 협상이나 비대면 협상에서는 특히 기록과 문서가 중요하다고 설명한다.&lt;br /&gt;대면 상황에서는 표정과 분위기, 관계를 통해 어느 정도 의도가 전달되지만, 전화나 문서 중심 협상에서는 작은 표현 차이도 오해로 이어질 수 있기 때문이다.&lt;br /&gt;그래서 그는 협상이 끝난 뒤 반드시 합의 내용을 정리하고 확인하는 과정을 중요하게 본다.&lt;br /&gt;특히&amp;nbsp;기억에&amp;nbsp;의존하지&amp;nbsp;말고,&amp;nbsp;서로가&amp;nbsp;이해한&amp;nbsp;내용을&amp;nbsp;문서로&amp;nbsp;남겨야&amp;nbsp;이후의&amp;nbsp;갈등과&amp;nbsp;책임&amp;nbsp;문제를&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있다고&amp;nbsp;말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 확실히 공감이 되는 부분인데, 나 또한 회의록을 중요시 여기기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 구두 내용이라도 메신저에 짧게 공유하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;읽으며&amp;nbsp;느꼈던&amp;nbsp;점은,&amp;nbsp;협상은&amp;nbsp;단순히&amp;nbsp;말을&amp;nbsp;잘하는&amp;nbsp;기술이&amp;nbsp;아니라&amp;nbsp;결국&amp;nbsp;신뢰와&amp;nbsp;책임의&amp;nbsp;문제라는&amp;nbsp;점이었다.&lt;br /&gt;좋은&amp;nbsp;협상은&amp;nbsp;상대를&amp;nbsp;설득하는&amp;nbsp;데서&amp;nbsp;끝나는&amp;nbsp;것이&amp;nbsp;아니라,&amp;nbsp;이후에도&amp;nbsp;서로&amp;nbsp;같은&amp;nbsp;이해를&amp;nbsp;유지할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;구조를&amp;nbsp;만드는&amp;nbsp;과정에&amp;nbsp;가까워&amp;nbsp;보였다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;11.&amp;nbsp;결정권자와&amp;nbsp;협상하라&lt;/b&gt;&lt;br /&gt;이 챕터에서 허브 코헨은 매우 현실적인 이야기를 한다.&lt;br /&gt;아무리&amp;nbsp;좋은&amp;nbsp;협상을&amp;nbsp;해도,&amp;nbsp;실제&amp;nbsp;결정을&amp;nbsp;내릴&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;사람과&amp;nbsp;이야기하고&amp;nbsp;있다면&amp;nbsp;결과는&amp;nbsp;바뀌지&amp;nbsp;않을&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연한 부분이다.&lt;br /&gt;&lt;br /&gt;실무자와&amp;nbsp;긴&amp;nbsp;시간&amp;nbsp;대화를&amp;nbsp;나누더라도,&amp;nbsp;결국&amp;nbsp;최종&amp;nbsp;승인권자가&amp;nbsp;따로&amp;nbsp;있다면&amp;nbsp;협상&amp;nbsp;내용이&amp;nbsp;뒤집히거나&amp;nbsp;처음부터&amp;nbsp;다시&amp;nbsp;시작되는&amp;nbsp;경우가&amp;nbsp;많다.&amp;nbsp;그래서&amp;nbsp;작가는&amp;nbsp;협상&amp;nbsp;초반부터&amp;nbsp;&amp;ldquo;누가&amp;nbsp;실제&amp;nbsp;결정권자인가&amp;rdquo;를&amp;nbsp;파악하는&amp;nbsp;것을&amp;nbsp;매우&amp;nbsp;중요하게&amp;nbsp;설명한다.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;부분을&amp;nbsp;읽으며&amp;nbsp;협상은&amp;nbsp;단순히&amp;nbsp;논리의&amp;nbsp;문제가&amp;nbsp;아니라&amp;nbsp;구조의&amp;nbsp;문제라는&amp;nbsp;생각이&amp;nbsp;들었다.&lt;br /&gt;무엇을&amp;nbsp;말할&amp;nbsp;것인가도&amp;nbsp;중요하지만,&amp;nbsp;누구와&amp;nbsp;이야기하고&amp;nbsp;있는가&amp;nbsp;역시&amp;nbsp;협상의&amp;nbsp;중요한&amp;nbsp;변수였다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;12.&amp;nbsp;사람&amp;nbsp;대&amp;nbsp;사람으로&amp;nbsp;협상하라&lt;/b&gt;&lt;br /&gt;허브 코헨이 마지막까지 강조하는 것은 결국 협상은 사람과 사람 사이의 관계라는 점이었다.&lt;br /&gt;&lt;br /&gt;회사,&amp;nbsp;조직,&amp;nbsp;계약이라는&amp;nbsp;형식을&amp;nbsp;이야기하고&amp;nbsp;있지만,&amp;nbsp;실제로는&amp;nbsp;결국&amp;nbsp;감정을&amp;nbsp;가진&amp;nbsp;사람들이&amp;nbsp;선택하고&amp;nbsp;판단한다.&amp;nbsp;그래서&amp;nbsp;그는&amp;nbsp;지나치게&amp;nbsp;형식적이거나&amp;nbsp;딱딱한&amp;nbsp;태도보다,&amp;nbsp;인간적으로&amp;nbsp;관계를&amp;nbsp;만들고&amp;nbsp;상대를&amp;nbsp;이해하려는&amp;nbsp;태도를&amp;nbsp;더&amp;nbsp;중요하게&amp;nbsp;바라본다.&lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;인상적이었던&amp;nbsp;부분은,&amp;nbsp;사람들은&amp;nbsp;논리만으로&amp;nbsp;움직이지&amp;nbsp;않는다는&amp;nbsp;점이었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;협상의 터닝 포인트(p375)&lt;br /&gt;1. 경찰관의 고나심을 교통 위반 딱지에서 다른 곳으로 돌린다.&lt;br /&gt;2. 경찰관이 당신을 개인적인 대상으로 인식하게 한다.&lt;br /&gt;3. 경찰관이 교통 위반 딱지에 볼펜을 갖다 대는 것을 막거나 적어도 지연시킨다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;존중받고&amp;nbsp;있다고&amp;nbsp;느끼는가,&amp;nbsp;자신의&amp;nbsp;입장이&amp;nbsp;이해받고&amp;nbsp;있다고&amp;nbsp;느끼는가&amp;nbsp;같은&amp;nbsp;감정적인&amp;nbsp;요소들도&amp;nbsp;협상&amp;nbsp;결과에&amp;nbsp;큰&amp;nbsp;영향을&amp;nbsp;미친다.&lt;br /&gt;&lt;br /&gt;결국&amp;nbsp;허브&amp;nbsp;코헨이&amp;nbsp;말하는&amp;nbsp;좋은&amp;nbsp;협상가는&amp;nbsp;단순히&amp;nbsp;말을&amp;nbsp;잘하거나&amp;nbsp;상대를&amp;nbsp;압박하는&amp;nbsp;사람이&amp;nbsp;아니었다.&amp;nbsp;상대를&amp;nbsp;하나의&amp;nbsp;인간으로&amp;nbsp;이해하고,&amp;nbsp;서로의&amp;nbsp;관계&amp;nbsp;속에서&amp;nbsp;현실적인&amp;nbsp;합의점을&amp;nbsp;만들어갈&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;사람이&amp;nbsp;더&amp;nbsp;좋은&amp;nbsp;협상가에&amp;nbsp;가까워&amp;nbsp;보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;『협상의 기술』은 단순히 협상 기술을 설명하는 책이 아니었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;사실 이 책을 읽으며 힘들었던 점은, 허브 코헨이 정답을 직접 설명하기보다 사례를 통해 그 의도 스스로 깨닫게 만든다는 점이었다. 그래서 이 책은 읽는 과정에서 중심 과제를 놓치게 되는 경향이 있었다. 작가의 핵심 의도를 먼저 파악하는게 중요하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;처음에는 말 잘하는 방법이나 설득 기술에 대한 이야기라고 생각했지만, 읽을수록 인간의 심리와 관계, 그리고 사람들이 어떻게 선택하고 움직이는지를 관찰하는 책에 더 가까웠다. 다시 말하지만, 중간 결론이 없어 ??만 남았지만 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 특히 허브 코헨은 협상을 단순한 승패의 문제로 바라보지 않았다. 현실적으로는 힘, 시간, 정보 같은 요소들이 매우 중요하게 작동하지만, 궁극적으로는 상대를 무너뜨리는 것이 아니라 서로가 원하는 방향을 조율하며 함께 살아가는 과정으로 협상을 바라보고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 물론 책 속 일부 사례들은 지금 기준에서 다소 공격적이거나 불편하게 느껴지기도 했다. 하지만 그런 부분들조차 현실 사회가 실제로 어떻게 움직이는지를 보여주기 위한 관찰의 과정이라고 생각하니, 단순히 기술을 배우는 느낌보다는 세상을 바라보는 새로운 관점을 배우는 경험에 가까웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 결국 내가 이해한 허브 코헨의 핵심 메시지는 단순히 &amp;ldquo;잘 협상하는 법&amp;rdquo;이 아니었다. 사람과 상황을 더 넓게 이해하고, 자신의 기준을 유지하면서도 서로가 함께 살아갈 수 있는 방향을 찾는 것. 그것이 그가 말하는 궁극적인 윈윈 협상가의 모습에 더 가까워 보였다.&lt;/p&gt;</description>
      <category>책이야기</category>
      <category>PETERICA</category>
      <category>독후감</category>
      <category>협상의 기술</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1077</guid>
      <comments>https://peterica.tistory.com/1077#entry1077comment</comments>
      <pubDate>Sun, 10 May 2026 00:25:26 +0900</pubDate>
    </item>
    <item>
      <title>[AI] GPU vs PIM vs NPU - 내 시스템의 병목은 연산인가, 메모리인가</title>
      <link>https://peterica.tistory.com/1067</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYukyP/dJMcad2ThL3/YEQKub7tupFXW97eAaFalk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYukyP/dJMcad2ThL3/YEQKub7tupFXW97eAaFalk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYukyP/dJMcad2ThL3/YEQKub7tupFXW97eAaFalk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYukyP%2FdJMcad2ThL3%2FYEQKub7tupFXW97eAaFalk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;TL;DR&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GPU와 PIM은 같은 축의 다음 세대가 아니라, 서로 다른 병목을 푸는 도구다.&lt;/li&gt;
&lt;li&gt;GPU는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;FLOPS를 늘리고&lt;/b&gt;, PIM은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Byte 이동을 줄인다&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 경쟁재가 아니라 조합재.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica.tistory.com/767&quot;&gt;[AI] 인공지능에 대한 이해(2017에 정리한 리포트)&lt;/a&gt;에서 PIM을 언급하고,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/767&quot;&gt;[AI] PIM(Processing In Memory)란?&lt;/a&gt;에서 PIM을 단독으로 정리한 적이 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이번에는 GPU&amp;middot;NPU와 함께 놓고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;'병목 위치'&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;관점에서 다시 본다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;AI 모델에 GPU를 쓰는 이유에 대한 글을 읽다가 자연스럽게 PIM(Processing In Memory)이 떠올랐다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 &quot;GPU 다음 세대&quot; 정도로 막연하게 묶어 두고 있었는데,&lt;br /&gt;정리하다 보니 둘은 같은 축이 아니었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;결론부터 말하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;GPU는 연산을 빠르게 하는 구조, PIM은 데이터 이동을 줄이는 구조다.&lt;/b&gt;&lt;br /&gt;같은 문제의 다른 단계를 푸는 도구다. 이 글은 그 차이를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;병목 위치 관점&lt;/b&gt;에서 정리한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 연산이 아니라 데이터 이동이 비싸졌다&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GPU의 강점은 분명하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;대규모 병렬 행렬&amp;middot;벡터 연산. 딥러닝의 핵심 연산 &amp;mdash;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;행렬 곱, 벡터 누적&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;은 GPU의 SIMT 구조와 정확히 맞아떨어진다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;문제는 모델이 커지면서 병목 위치가 이동했다는 점이다. 파라미터, activation, batch가 늘어나면 다음 증상이 나타난다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 대역폭이 먼저 포화된다&lt;/li&gt;
&lt;li&gt;GPU 코어는 대기 상태인데 데이터가 도착하지 않는다&lt;/li&gt;
&lt;li&gt;전력의 상당 부분이 &quot;연산&quot;이 아니라 &quot;이동&quot;하는데 쓰인다&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;연산은 점점 싸지고, 데이터 이동이 비싸지는 방향으로 비용 구조가 뒤집혔다. 이 지점에서 PIM이 등장한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ GPU vs PIM &amp;mdash; 두 구조의 핵심 차이&lt;/h4&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;축&lt;/td&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;PIM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;설계 목표&lt;/td&gt;
&lt;td&gt;FLOPS 극대화&lt;/td&gt;
&lt;td&gt;Byte 이동 최소화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;연산 위치&lt;/td&gt;
&lt;td&gt;코어에서 (DRAM에서 로드 후 계산)&lt;/td&gt;
&lt;td&gt;메모리 내부 (in-situ)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;강점 워크로드&lt;/td&gt;
&lt;td&gt;compute-bound (조밀 행렬곱)&lt;/td&gt;
&lt;td&gt;memory-bound (attention, embedding lookup)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;약점&lt;/td&gt;
&lt;td&gt;메모리 대역폭에 종속&lt;/td&gt;
&lt;td&gt;일반 연산 유연성이 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비유&lt;/td&gt;
&lt;td&gt;빠른 셰프, 식재료는 매번 멀리서 옮겨 옴&lt;/td&gt;
&lt;td&gt;식재료 옆에서 바로 손질하는 작은 부엌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;표를 한 줄로 압축하면 -&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GPU는 &quot;&lt;b&gt;FLOPS를 늘리는 전략&lt;/b&gt;&quot;,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;PIM은 &quot;&lt;b&gt;Byte 이동을 깎는 전략&lt;/b&gt;&quot;이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;둘은 경쟁재가 아니라&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;다른 층의 병목을 푸는 조합재&lt;/b&gt;다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ AI 워크로드는 왜 memory-bound 인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1;&quot; href=&quot;https://peterica.tistory.com/1071&quot;&gt;[온디바이스AI] 내 폰으로 나만의 RAG 만들기(온디바이스 RAG 최소 아키텍처)&lt;/a&gt;를 진행하면서 흥미로운 차이를 확인했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;맥미니 M1(8GB)과 갤럭시 S23 Ultra(12GB)에서 동일 모델을 실행했을 때,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로는 CPU 성능이 더 좋은 맥이 빠를 것으로 예상했지만 실제 응답 속도는 메모리가 더 큰 갤럭시가 더 빨랐다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 결과는 연산 성능보다 메모리 접근이 병목이 되는 상황을 잘 보여준다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 추론 과정에서는 단순한 계산보다, 큰 파라미터와 KV 캐시를 반복적으로 읽어오는 비용이 더 크게 작용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 말을 풀어서 보면, AI 모델은 &amp;ldquo;계산을 많이 하는 것&amp;rdquo;보다 &amp;ldquo;필요한 데이터를 계속 가져오는 것&amp;rdquo;에 더 많은 시간을 쓴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 두 가지 작업이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째는 &lt;b&gt;Attention&lt;/b&gt;이다.&lt;br /&gt;모델이 문장을 이해하거나 다음 단어를 예측할 때, 앞에서 나온 단어들을 다시 참고하는 과정이다.&lt;br /&gt;이때 이전에 계산해 둔 값(KV 캐시)을 계속 읽어와야 하는데, 문장이 길어질수록 이 데이터 양이 빠르게 증가한다.&lt;br /&gt;즉, 계산 자체보다 &amp;ldquo;과거 정보를 다시 가져오는 비용&amp;rdquo;이 더 커진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째는 &lt;b&gt;Embedding lookup&lt;/b&gt;이다.&lt;br /&gt;단어를 숫자로 바꾸는 과정이라고 보면 된다.&lt;br /&gt;모델은 &amp;ldquo;사전&amp;rdquo;처럼 아주 큰 테이블(차원)을 가지고 있고, 각 단어마다 대응되는 벡터가 저장되어 있다.&lt;br /&gt;특정 단어가 들어오면 이 테이블에서 해당 위치를 찾아 값을 꺼내는데, 문제는 이 접근이 랜덤하게 일어난다는 점이다.&lt;br /&gt;그래서 CPU나 GPU의 캐시가 잘 활용되지 않고, 결국 메모리에서 직접 데이터를 가져오는 비용이 커진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 두 경우 모두 공통점은 하나다.&lt;br /&gt;계산이 복잡해서 느린 것이 아니라, 필요한 데이터를 계속 불러오느라 시간이 걸린다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 AI 워크로드는 &amp;ldquo;&lt;b&gt;compute-bound&lt;/b&gt;&amp;rdquo;가 아니라 &amp;ldquo;&lt;b&gt;memory-bound&lt;/b&gt;&amp;rdquo;라고 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 온디바이스/엣지에서 더 명확해진다&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모바일과 엣지로 가면 제약이 세 가지로 좁혀진다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;b&gt;전력&lt;/b&gt;, &lt;b&gt;메모리 대역폭&lt;/b&gt;, &lt;b&gt;발열&lt;/b&gt;.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 센터에서는 보조적이던 제약이 여기서는 1차 제약으로 올라온다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음 다이어그램은 방향성을 보여 주는 도식이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;PIM은 아직 데이터센터&amp;middot;온디바이스 모두에서 초기 단계이며, 표준화된 프로그래밍 모델은 자리잡는 중이다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;  워크로드 진화               하드웨어 진화
───────────────       ──────────────────────
순차 알고리즘       ──&amp;rarr;         CPU
대규모 병렬 학습     ──&amp;rarr;         GPU
거대 모델 추론      ──&amp;rarr;          ?    &amp;larr; bandwidth wall
온디바이스 추론     ──&amp;rarr;     NPU + PIM (memory-centric)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NPU&lt;/b&gt;는&lt;b&gt; 연산 패턴을 좁혀 와트당 효율을 끌어올리는 쪽&lt;/b&gt;이고,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PIM&lt;/b&gt;은 &lt;b&gt;이동 비용 자체를 깎는 쪽&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;둘은 서로를 대체하지 않는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;같은 디바이스 안에서도 어떤 연산은 &lt;b&gt;NPU&lt;/b&gt;로,&lt;br /&gt;어떤 접근은 메모리 근처에서 처리하는 식으로 역할이 갈린다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 자연스럽게 따라오는 질문이 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;mdash;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;GPU는 언제 안 쓰는가?&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 이동 전력이 워크로드 본체 전력을 넘기 시작할 때,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 모델이 한 번에 계산하는 방식이 아니라,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;단어를 하나씩 생성(decode)하면서 이전에 저장해 둔 값을 계속 꺼내 쓰고(lookup), 그 과정이 반복되는 형태일 때다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 센터의 학습은 여전히 GPU의 무대지만, 엣지의 추론은 그렇지 않다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리 &amp;mdash; 내 시스템의 병목은 연산인가, 메모리인가&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GPU와 PIM은 경쟁 관계가 아니다. 같은 문제의 다른 층을 푸는 도구다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;선택의 기준은 &quot;더 좋은 칩&quot;이 아니라 &quot;내 워크로드의 병목이 어디인가&quot;다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://llm-study-web.vercel.app/&quot;&gt;llm-study-web&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: LLM 시스템의 전체 흐름을 개념학습, 시스템 맵, 인터랙티브 실험으로 배우는 교육 플랫폼&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica-website.vercel.app/&quot;&gt;peterica-website&lt;/a&gt;: 기록하는 백엔드개발자 피터 포트폴리오 웹사이트&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1067</guid>
      <comments>https://peterica.tistory.com/1067#entry1067comment</comments>
      <pubDate>Sat, 2 May 2026 07:10:11 +0900</pubDate>
    </item>
    <item>
      <title>어디서든 브라우저 VS Code로 마크다운만 떨어뜨리면 LLM 이 개인 위키로 자동 정리 - silva-omnium</title>
      <link>https://peterica.tistory.com/1075</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 언제 어디서든 브라우저 VS Code로 정보를 입력하면, 모든 것이 쌓이는 개인 지식 숲을 만들었습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노트는 한 번만 작성합니다. 분류&amp;middot;요약&amp;middot;교차참조&amp;middot;인용 부착&amp;middot;모순 표시는 LLM 이 알아서 &amp;mdash; 영속 위키에 계속 누적되도록.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/80ADX/dJMcahqHwPD/LXo7L0GIZHswM4zKa7gfn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/80ADX/dJMcahqHwPD/LXo7L0GIZHswM4zKa7gfn1/img.png&quot; data-origin-width=&quot;3034&quot; data-origin-height=&quot;2020&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.9058%; margin-right: 10px;&quot; data-widthpercent=&quot;50.49&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/80ADX/dJMcahqHwPD/LXo7L0GIZHswM4zKa7gfn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F80ADX%2FdJMcahqHwPD%2FLXo7L0GIZHswM4zKa7gfn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3034&quot; height=&quot;2020&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7YHCo/dJMcaf0F4V9/SElDu13zJklUqFhICNw7z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7YHCo/dJMcaf0F4V9/SElDu13zJklUqFhICNw7z1/img.png&quot; data-origin-width=&quot;3016&quot; data-origin-height=&quot;2048&quot; data-is-animation=&quot;false&quot; width=&quot;604&quot; style=&quot;width: 48.9314%;&quot; data-widthpercent=&quot;49.51&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7YHCo/dJMcaf0F4V9/SElDu13zJklUqFhICNw7z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7YHCo%2FdJMcaf0F4V9%2FSElDu13zJklUqFhICNw7z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3016&quot; height=&quot;2048&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 문제: 매번 0 부터 발견&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 으로 문서를 다루는 가장 흔한 패턴 &amp;mdash; PDF 나 노트를 챗 인터페이스에 붙여 넣고 질문, 답을 받고, 닫는다. 다음에 같은 주제가 또 떠오르면 같은 문서를 다시 붙이고, 같은 추론을 다시 하게 시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 자료에 10번 질문하면 LLM 은 그 자료를 10번 처음부터 발견한다. 토큰값과 시간이 든다. 더 큰 문제는 &lt;b&gt;이전에 얻은 통찰이 어디에도 누적되지 않는다&lt;/b&gt;는 것이다. 다음에 비슷한 주제를 마주쳐도 처음 만나는 것과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 발상: 한 번만 발견하고 위키에 쌓자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스를 LLM 에 한 번만 읽게 한다. LLM 은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그 소스를 영속 위키 페이지로 종합한다&lt;/li&gt;
&lt;li&gt;기존 페이지와 연관 있으면 합치거나 모순을 표시한다&lt;/li&gt;
&lt;li&gt;모든 사실에 원본을 가리키는 각주를 단다&lt;/li&gt;
&lt;li&gt;카테고리&amp;middot;태그&amp;middot;별칭 같은 메타데이터를 채운다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에 같은 주제가 또 들어오면 LLM 은 새 raw 만 보면 된다. 위키는 이미 그 주제의 누적 종합이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10번째 질문 즈음이면 위키가 이미 답을 갖고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 이름은 왜 silva-omnium 인가?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라틴어로 &quot;사물의 숲&quot;. 두 가지 계보를 합쳤다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Andrej Karpathy 의 LLM Wiki 패턴&lt;/b&gt; &amp;mdash; 본인 노트를 LLM 으로 정리해 자기만의 위키를 만드는 &lt;a href=&quot;https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f&quot;&gt;디자인 원형&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;폴란드-리투아니아 연합의 silva rerum&lt;/b&gt; &amp;mdash; 17~18세기 가문 대대로 이어 쓴 잡록. 일기&amp;middot;계약서&amp;middot;시&amp;middot;여행기&amp;middot;조리법 다 들어가는 두꺼운 한 권. 후손이 이어 쓰면서 가문의 기억이 책 자체에 누적된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 &lt;a href=&quot;https://en.wikipedia.org/wiki/Memex&quot;&gt;Vannevar Bush 의 Memex (1945)&lt;/a&gt; &amp;mdash; &quot;기억의 확장 장치&quot; 개념 &amp;mdash; 도 함께 둔다. 50년 후 하이퍼링크로 절반 정도 구현된 그 아이디어를, LLM 이 나머지 절반을 채워줄 수 있다고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 어떻게 동작하는가?&lt;/h4&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;raw/ ──(watcher / make ingest)──▶ wiki/ ──(make build)──▶ 정적 사이트 + Obsidian 그래프&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2284&quot; data-origin-height=&quot;1910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUtLEp/dJMcaiQCQ9w/JHMscVRWXububjxwdxaJ3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUtLEp/dJMcaiQCQ9w/JHMscVRWXububjxwdxaJ3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUtLEp/dJMcaiQCQ9w/JHMscVRWXububjxwdxaJ3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUtLEp%2FdJMcaiQCQ9w%2FJHMscVRWXububjxwdxaJ3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;373&quot; data-origin-width=&quot;2284&quot; data-origin-height=&quot;1910&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;사람&lt;/b&gt;: &lt;code&gt;raw/&lt;/code&gt; 디렉토리에 노트를 떨어뜨린다. 형식 자유. 원본은 절대 수정 안 함 (불변).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LLM&lt;/b&gt; (Ollama 또는 Claude): 새 raw 가 생기면 읽고, 위키에 어떻게 통합할지 결정한다 &amp;mdash; 새 페이지 만들기 / 기존 페이지에 붙이기 / 모순 표시 &amp;mdash; 그리고 frontmatter (title, category, tags, src 인용) 까지 채운다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9LpcQ/dJMcabquw1z/70UoNAwJ95j1boL6DGg8Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9LpcQ/dJMcabquw1z/70UoNAwJ95j1boL6DGg8Lk/img.png&quot; data-origin-width=&quot;3034&quot; data-origin-height=&quot;2020&quot; data-is-animation=&quot;false&quot; width=&quot;441&quot; style=&quot;width: 49.9058%; margin-right: 10px;&quot; data-widthpercent=&quot;50.49&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9LpcQ/dJMcabquw1z/70UoNAwJ95j1boL6DGg8Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9LpcQ%2FdJMcabquw1z%2F70UoNAwJ95j1boL6DGg8Lk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3034&quot; height=&quot;2020&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwZvf0/dJMcaduY4L6/g2x2xIIoxbvyCxx6vakIJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwZvf0/dJMcaduY4L6/g2x2xIIoxbvyCxx6vakIJK/img.png&quot; width=&quot;323&quot; height=&quot;219&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;2048&quot; data-origin-width=&quot;3016&quot; style=&quot;width: 48.9314%;&quot; data-widthpercent=&quot;49.51&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwZvf0/dJMcaduY4L6/g2x2xIIoxbvyCxx6vakIJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwZvf0%2FdJMcaduY4L6%2Fg2x2xIIoxbvyCxx6vakIJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3016&quot; height=&quot;2048&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위키&lt;/b&gt;: 시간에 따라 쌓인다. Astro Starlight 로 빌드하면 검색 가능한 사이트가 되고, 같은 디렉토리를 Obsidian vault 로 열면 그래프 뷰가 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wJAwa/dJMcadV48ak/QxNyM9vpHGFunPGsKNt5B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wJAwa/dJMcadV48ak/QxNyM9vpHGFunPGsKNt5B1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wJAwa/dJMcadV48ak/QxNyM9vpHGFunPGsKNt5B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwJAwa%2FdJMcadV48ak%2FQxNyM9vpHGFunPGsKNt5B1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;178&quot; height=&quot;227&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;raw 와 wiki 의 분리&lt;/b&gt;다. raw 는 사용자의 원본 흐름 &amp;mdash; Obsidian 클리핑이든, 블로그 즐겨찾기든, 회의록이든. wiki 는 LLM 이 그 흐름을 종합한 영속층. 둘 다 마크다운 파일이라 어떤 도구로도 열 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 작은 설계 결정들&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 인용 강제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 이 만든 위키 페이지의 모든 사실은 &lt;code&gt;[^src-2026-04-27-tailscale-funnel]&lt;/code&gt; 같은 각주를 달고, 페이지 끝에 정의가 붙는다. &lt;b&gt;prompt 에 hard rule 로 박았다.&lt;/b&gt; 안 그러면 LLM 이 자기 사전 지식과 raw 의 사실을 섞어 출력한다 &amp;mdash; 위키가 LLM 의 환각을 누적하는 도구가 되어버린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 모순 callout&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;raw 의 사실이 기존 위키 페이지와 충돌하면 &quot;병합&quot; 하지 않는다. 기존 페이지에 &lt;code&gt;&amp;gt; [!conflict] ...&lt;/code&gt; 형태의 callout 으로 양쪽을 다 적는다. 사용자가 직접 판단할 수 있게 &amp;mdash; 어느 쪽이 더 최신인지, 더 신뢰할 출처인지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. provider 플러그형&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;scripts/llm_providers/&lt;/code&gt; 에 ollama, claude (Anthropic SDK), claude-cli (&lt;code&gt;claude -p&lt;/code&gt; subprocess) 3개.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 인터페이스, 다른 백엔드. ingest 명령 하나로 전환:&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;make ingest                  # default = claude-cli
make ingest-ollama           # 로컬 Ollama (오프라인)
make ingest-claude           # Anthropic API key&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 ollama qwen2.5:3b 로 시작했는데, 8GB RAM 환경에서 큰 raw 가 timeout 났다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;1046&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KLWzd/dJMcadhv3AV/LWKwWE8c5Pi0lT96pxwPck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KLWzd/dJMcadhv3AV/LWKwWE8c5Pi0lT96pxwPck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KLWzd/dJMcadhv3AV/LWKwWE8c5Pi0lT96pxwPck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKLWzd%2FdJMcadhv3AV%2FLWKwWE8c5Pi0lT96pxwPck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;335&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;1046&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 모델은 instruction following 이 약해 카테고리&amp;middot;슬러그도 흔들렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kLH3S/dJMcaaE7Ize/3mTTzmtWEFQVDl8O3KlvD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kLH3S/dJMcaaE7Ize/3mTTzmtWEFQVDl8O3KlvD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kLH3S/dJMcaaE7Ize/3mTTzmtWEFQVDl8O3KlvD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkLH3S%2FdJMcaaE7Ize%2F3mTTzmtWEFQVDl8O3KlvD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1906&quot; height=&quot;448&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;claude-cli 로 default 를 바꾸니 같은 prompt 인데 분류 정확도가 눈에 띄게 좋아졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토큰 비용은 구독 안에 들어가서 추가 청구 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;자체호스팅 (선택)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상시 켜져 있는 머신 (예: Mac mini) 에 띄우면 어디서든 브라우저로 편집&amp;middot;열람&amp;middot;AI 협업이 가능하다. 구성:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;code-server&lt;/b&gt; (VS Code in browser) &amp;mdash; 트리&amp;middot;에디터&amp;middot;미리보기&amp;middot;통합 터미널&amp;middot;&lt;code&gt;claude&lt;/code&gt; 명령 사전 설치&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Caddy&lt;/b&gt; &amp;mdash; 정적 위키 서빙 + &lt;code&gt;/edit/*&lt;/code&gt; 를 code-server 로 reverse_proxy&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Tailscale Funnel&lt;/b&gt; &amp;mdash; 공개 URL (&lt;code&gt;&amp;lt;host&amp;gt;.&amp;lt;tailnet&amp;gt;.ts.net&lt;/code&gt;) 자동 발급. 도메인&amp;middot;포트포워딩 불필요. 무료&lt;/li&gt;
&lt;li&gt;&lt;b&gt;fswatch + launchd&lt;/b&gt; &amp;mdash; &lt;code&gt;raw/&lt;/code&gt; 변경 감지 &amp;rarr; &lt;code&gt;make ingest &amp;amp;&amp;amp; make build&lt;/code&gt; 자동 트리거&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트는 ollama 만 native, 나머지는 Docker로 구성하였다. 다른 프로젝트와 brew 의존이 섞이지 않도록 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저로 같은 URL 을 열면 mini 의 code-server 가 그대로 뜬다. AI 호출과 git push 모두 mini 의 네트워크에서 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 한계 &amp;mdash; 솔직하게&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;며칠 운영하며 드러난 것들:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Watcher race condition&lt;/b&gt; &amp;mdash; raw 여러 파일이 한 번에 도착하면 (예: git pull) 디바운스가 진행 중인 ingest 를 kill 해 &lt;br /&gt;부분 누락 가능. lockfile 또는 더 큰 latency 필요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Funnel + 단일 비밀번호&lt;/b&gt; &amp;mdash; code-server 가 password 만으로 보호. 추측 어려운 24자 비밀번호긴 하지만, &lt;br /&gt;다음 단계로 Caddy basic_auth 추가 또는 Cloudflare Access 전환 후보.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ollama 11434 외부 노출&lt;/b&gt; &amp;mdash; &lt;code&gt;OLLAMA_HOST=0.0.0.0&lt;/code&gt; 로 두면 같은 LAN 의 다른 디바이스가 인증 없이 접근 가능.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;categories.yaml 일관성&lt;/b&gt; &amp;mdash; 작은 모델로 ingest 시 새 카테고리 만들고 yaml 등록 안 함. claude-cli 전환으로 거의 해결됐지만 완벽하진 않음.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 결함들도 위키에 페이지로 들어간다 &amp;mdash; 자기 자신을 자료 삼아 누적되는 게 silva rerum 의 정신.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;코드 + 셋업&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub: &lt;a href=&quot;https://github.com/peterica/silva-omnium&quot;&gt;https://github.com/peterica/silva-omnium&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Quick start (1분):&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;git clone https://github.com/peterica/silva-omnium.git
cd silva-omnium
make setup

mkdir -p raw/2026
echo &quot;# 첫 노트&quot; &amp;gt; raw/2026/test.md

make ingest &amp;amp;&amp;amp; make build &amp;amp;&amp;amp; make dev
# &amp;rarr; http://localhost:4321&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자체호스팅까지 셋업하려면 &lt;code&gt;infra/README.md&lt;/code&gt; 의 1회 부트스트랩 스크립트 실행.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억을 쌓는 도구가 결국 자기 자신을 자료로 쌓는다는 게 흥미롭다. 다음 글에선 ingest 파이프라인의 내부 구조 (provider 추상화, 인용 강제 prompt, frontmatter 스키마) 를 더 자세히 다루겠습니다.&lt;/p&gt;</description>
      <category>AI/RAG</category>
      <category>LLM-WIKI</category>
      <category>PETERICA</category>
      <category>나만의 WIKI</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1075</guid>
      <comments>https://peterica.tistory.com/1075#entry1075comment</comments>
      <pubDate>Tue, 28 Apr 2026 01:42:56 +0900</pubDate>
    </item>
    <item>
      <title>[온디바이스AI] 청크는 쌓는 게 아니라 덜어내는 일 &amp;mdash; 약한 청크 25개를 덜어내 MRR이 0.15 올랐다</title>
      <link>https://peterica.tistory.com/1074</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ&lt;span&gt;&amp;nbsp;&lt;/span&gt;TL;DR&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;약한 청크 =&lt;span&gt;&amp;nbsp;&lt;/span&gt;moc/&amp;middot;entities/&amp;middot;concepts/의 &quot;관련 포스트&quot;, &quot;주요 태그&quot;, 연도 그룹, 순수 링크 목록&lt;/li&gt;
&lt;li&gt;본문 없고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;키워드만 풍부&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 임베딩 유사도가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;가짜로 높게&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;나온다&lt;/li&gt;
&lt;li&gt;해법: 경로&amp;middot;헤딩 한 줄 필터 (새 모델&amp;middot;인덱스&amp;middot;리랭커 0개)&lt;/li&gt;
&lt;li&gt;실측 기준:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;청크 수:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;118 &amp;rarr; 93&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(-25, -21%)&lt;/li&gt;
&lt;li&gt;MRR(Mean Reciprocal Rank):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;0.794 &amp;rarr; 0.947&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(+0.15)&lt;/li&gt;
&lt;li&gt;R@3(Recall@3):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;0.933 &amp;rarr; 1.000&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;결론:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모델을 바꾸기 전에 청크를 봐야 한다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 이 문제를 발견했나&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;폰에서 &quot;쿠버네티스에서 graceful shutdown이란?&quot;을 물었다.&lt;br /&gt;top-3에 정답 블로그 183번 글과 함께,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;MOC 파일의 &quot;관련 포스트&quot; 링크 목록&lt;/b&gt;이 두 개 섞여 들어왔다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그 목록 청크의 본문을 열어봤다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 내용 거의 없음&lt;/li&gt;
&lt;li&gt;&quot;kubernetes, graceful shutdown, pod, deployment...&quot; 키워드만 나열&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;링크 목록이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;본문보다 먼저 검색된다&lt;/b&gt;는 건 설계 실패에 가깝다.&lt;br /&gt;모델을 바꿀까 생각하다가 멈췄다 &amp;mdash; 이건 모델 문제가 아니라&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;청크 문제&lt;/b&gt;였다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 약한 청크의 정체&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MOC(Map of Content)&amp;middot;entity&amp;middot;concepts 경로의 파일은 원래&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;지식의 허브 역할&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 그 안의 일부 섹션은 검색 관점에서 본문이라고 부를 수 없다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;관련 포스트&quot; 링크 목록&lt;/li&gt;
&lt;li&gt;&quot;주요 태그&quot; 나열&lt;/li&gt;
&lt;li&gt;연도 그룹 헤딩 (&quot;2024년&quot;, &quot;2023년 작성 글&quot;)&lt;/li&gt;
&lt;li&gt;반복되는 테이블&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정답 본문은 없고 관련 키워드만 모인 청크라서, 임베딩 벡터가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;주변 문서들의 키워드 평균&lt;/b&gt;처럼 형성된다.&lt;br /&gt;본문이 없으니 구체성은 없는데, 키워드 밀도가 높아&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;유사도가 가짜로 높게&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;나온다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;  결과:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 쿼리가 어느 주제든 이 청크들이 top-k에 쉽게 얹힌다&lt;/li&gt;
&lt;li&gt;정답 본문이 top-3 밖으로 밀려나는 경우가 생긴다&lt;/li&gt;
&lt;li&gt;LLM은 근거로 받은 &quot;키워드 목록&quot;으로 답을 짜야 해서 대답이 빈약해진다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 해법은 한 번의 경로&amp;middot;헤딩 필터&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;chunk.py에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;경로+헤딩 매칭 필터&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;한 규칙을 넣었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;경로:&lt;span&gt;&amp;nbsp;&lt;/span&gt;moc/,&lt;span&gt;&amp;nbsp;&lt;/span&gt;entities/,&lt;span&gt;&amp;nbsp;&lt;/span&gt;concepts/&lt;span&gt;&amp;nbsp;&lt;/span&gt;중 하나에 속하면&lt;/li&gt;
&lt;li&gt;헤딩 또는 섹션 내용이 &quot;관련 포스트&quot;, &quot;주요 태그&quot;, 연도 그룹, 순수 링크 목록에 해당하면&lt;/li&gt;
&lt;li&gt;청크 생성에서 제외&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그 외에는 건드리지 않는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델 그대로&lt;/li&gt;
&lt;li&gt;차원 그대로&lt;/li&gt;
&lt;li&gt;검색 알고리즘 그대로&lt;/li&gt;
&lt;li&gt;인덱스 그대로&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;배포 구성이나 검색 스택을 바꾸지 않는, 데이터 단계의 단일 개입이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 실측 &amp;mdash; 22 쿼리 평가 하네스&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;변경 전후를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;같은 쿼리 세트&lt;/b&gt;로 비교해야 의미가 있다.&lt;br /&gt;한국어 22 쿼리(DevOps&amp;middot;RAG&amp;middot;K8s&amp;middot;모니터링)에 정답 청크를 라벨링해 둔 평가 하네스(server/scripts/embed_eval.py)로 돌렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지표필터 전필터 후변화&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;청크 수&lt;/td&gt;
&lt;td&gt;118&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;td&gt;-25 (-21%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRR&lt;/td&gt;
&lt;td&gt;0.794&lt;/td&gt;
&lt;td&gt;&lt;b&gt;0.947&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;+0.153&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R@3&lt;/td&gt;
&lt;td&gt;0.933&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1.000&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;+0.067&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모델&amp;middot;차원&amp;middot;검색 알고리즘은 전혀 건드리지 않은 결과다.&lt;br /&gt;이번 실험에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모델을 바꾸지 않고도, 데이터 정리만으로 MRR이 0.153 올랐다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/chunking/moc-entity-filter.md&quot;&gt;청크 필터 case 문서&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 운영 &amp;mdash; ETag로 자동 재동기화&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;필터 규칙이 바뀌면 폰의 로컬 DB도 최신으로 맞춰야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ETag에&lt;span&gt;&amp;nbsp;&lt;/span&gt;chunker_version을 포함시켜, 필터 규칙이 바뀌면 폰 DB가 자동 재동기화되게 했다.&lt;br /&gt;필터 변경 없는 날은 304 &amp;mdash; 전송량 0.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;  청크 필터는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;단순 규칙 + 단순 동기화&lt;/b&gt;로 운영 복잡도도 거의 없다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 이 결정이 &quot;최소 구현&quot;에 맞는가&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;추가 인프라 0&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 새 모델&amp;middot;인덱스&amp;middot;리랭커 없음. 데이터 정리 한 번.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;평가 하네스가 증거&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 22 쿼리 전후 비교가 의사결정을 대신한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단순한 규칙&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 경로&amp;middot;헤딩 매칭만으로 동작. 새 위키 구조에 이식하기 쉽다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확장 여지 유지&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 청크가 수만 개가 되면 정답 라벨 쿼리 평가를 다시 돌려 필터를 진화시키면 된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;덜&quot;이 정당성&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 최소 구현이 &quot;덜 넣는&quot; 쪽으로 편향되는 근거가 됐다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 내가 바꾼 생각&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 이렇게 접근했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서를 많이 쌓자&lt;/li&gt;
&lt;li&gt;임베딩만 좋으면 품질은 따라온다&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;지금은 이렇게 바뀌었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문서는 선별해서 쌓자&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;품질은 모델보다 데이터가 결정한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;  결론:&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RAG 품질을 올리는 가장 빠른 길은 모델 교체가 아니라, 잘못 넣은 청크를 덜어내는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 참고&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;이 프로젝트 문서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/chunking/moc-entity-filter.md&quot;&gt;청크 필터 case 문서&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 초기 가정&amp;middot;실험 설계&amp;middot;재검토 트리거&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/embedding/embedding-benchmark-ko.md&quot;&gt;임베딩 벤치마크 case&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 모델 선택 근거&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/00-main/ondevice-rag-minimal-guide.md&quot;&gt;최소 구현 가이드&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 8단계 파이프라인&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/tree/main/ondevice-rag&quot;&gt;문서 허브&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 독자 유형별 읽기 경로&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;관련 블로그&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica.tistory.com/1071&quot;&gt;1071 &amp;mdash; 내 폰이 내 블로그에 답하게 만들었다: 다섯 가지 기술&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 본편 (섹션 2 &quot;청크 품질&quot;이 이 글의 배경)&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica.tistory.com/1072&quot;&gt;1072 &amp;mdash; 처음 만드는 온디바이스 RAG: 핵심원칙 10가지&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 원칙 3 &quot;데이터가 성능&quot;&amp;middot;원칙 4 &quot;청크는 제거&quot;의 심도편&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica.tistory.com/1073&quot;&gt;1073 &amp;mdash; LiteRT-LM: 온디바이스 LLM을 &quot;돌리게&quot; 만드는 런타임&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 같은 시리즈의 런타임 편&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;더 공부하기 &amp;mdash; LLM System Lab&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://llm-study-web.vercel.app/topic/rag-pipeline&quot;&gt;RAG Pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://llm-study-web.vercel.app/topic/embedding&quot;&gt;Embedding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://llm-study-web.vercel.app/labs/chunking&quot;&gt;Chunking (실험)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 한 줄 정리&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;청크는 쌓는 작업이 아니라 덜어내는 작업이다. 잘 섞지 않는 것도 엔지니어링이다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>AI/RAG</category>
      <category>PETERICA</category>
      <category>Rag</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1074</guid>
      <comments>https://peterica.tistory.com/1074#entry1074comment</comments>
      <pubDate>Thu, 23 Apr 2026 23:00:10 +0900</pubDate>
    </item>
    <item>
      <title>[AI] RTK &amp;mdash; AI 에이전트 터미널 출력을 60~90% 압축하는 CLI 프록시</title>
      <link>https://peterica.tistory.com/1066</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ TL;DR&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RTK는&lt;span&gt;&amp;nbsp;&lt;/span&gt;github.com/rtk-ai/rtk&lt;span&gt;&amp;nbsp;&lt;/span&gt;의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;실존 OSS&lt;/b&gt;다. 아키텍처 개념이 아니라&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;단일 Rust 바이너리&lt;/b&gt;로 배포되는 CLI 프록시.&lt;/li&gt;
&lt;li&gt;AI 에이전트(Claude Code, Cursor, Gemini CLI 등)가 실행한 터미널 명령 출력을 가로채,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;60~90% 압축&lt;/b&gt;한 뒤 LLM에 전달한다.&lt;/li&gt;
&lt;li&gt;동작 방식은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;shell hook 이&lt;span&gt;&amp;nbsp;&lt;/span&gt;git status&lt;span&gt;&amp;nbsp;&lt;/span&gt;를&lt;span&gt;&amp;nbsp;&lt;/span&gt;rtk git status&lt;span&gt;&amp;nbsp;&lt;/span&gt;로 자동 치환&lt;/b&gt;. 에이전트 코드 수정 없이 붙는다.&lt;/li&gt;
&lt;li&gt;오버헤드는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;10ms, 공식 지원 서브커맨드 30+ (git, test, jest, vitest, tsc, next, docker, kubectl 등). Apache-2.0 / MIT.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 이게 필요한가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 에이전트는 매 작업마다 아래를 실행한다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;npm install
pytest
git status
docker build .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력은 대부분 &lt;b&gt;진행바, 다운로드 로그, 성공 라인&lt;/b&gt; 이다. LLM은 이 노이즈를 전부 context window 에 싣고 추론한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨텍스트 창이 빠르게 소진된다&lt;/li&gt;
&lt;li&gt;토큰 과금이 불필요하게 증가한다&lt;/li&gt;
&lt;li&gt;attention 이 노이즈에 분산돼 판단이 무뎌진다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ RTK 가 실제로 하는 일&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 문서 기준 &lt;b&gt;12가지 최적화 전략&lt;/b&gt;을 사용한다. 핵심만 추리면:&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #008300; color: #ffffff;&quot;&gt;전략&lt;/td&gt;
&lt;td style=&quot;background-color: #008300; color: #ffffff;&quot;&gt;동작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;Stats Extraction&lt;/td&gt;
&lt;td&gt;git status&lt;span&gt;&amp;nbsp;&lt;/span&gt;의 수십 줄 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;3 modified, 1 added, 1 untracked&lt;span&gt;&amp;nbsp;&lt;/span&gt;한 줄로 요약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;Failure Focus&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;테스트 러너의 통과 로그는 버리고, 실패 블록만 남김&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;Grouping&lt;/td&gt;
&lt;td&gt;TypeScript 에러를 파일별로 묶어&lt;span&gt;&amp;nbsp;&lt;/span&gt;TS2322 (5x)&lt;span&gt;&amp;nbsp;&lt;/span&gt;식으로 집계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;Deduplication&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;동일한 연속 로그는 카운터로 접음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;Progress Filtering&lt;/td&gt;
&lt;td&gt;ANSI escape, 다운로드 진행바 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;Three-Tier JSON Parsing&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;full &amp;rarr; partial &amp;rarr; passthrough 순서로 JSON 보존&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;Tree Compression&lt;/td&gt;
&lt;td&gt;디렉토리 구조는 20 dir / 10 file 단위로 요약&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;나머지 5종: NDJSON Streaming, Block-Based State Machine, Language-Aware Code Stripping, JSON Object Extraction, Economic Metrics Tracking.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;단순 텍스트 trim 이 아니라 의미 단위 재구성&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 설치와 동작 방식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;macOS 기준 Homebrew 가 가장 깔끔하다 (공식 formula, Apache-2.0).&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 설치
brew install rtk
# 또는 공식 install.sh (linux/macOS 공용)
curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh

# 버전 확인
rtk --version   # &amp;rarr; rtk 0.37.2 (2026-04 기준)

# 수동 호출
rtk git status
rtk ls -la
rtk tree -L 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 끝이면 에이전트가 매번 &lt;code&gt;rtk&lt;/code&gt; 를 prefix 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;shell auto-rewrite hook&lt;/b&gt; 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2010&quot; data-origin-height=&quot;1116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNSlA3/dJMcah5mmVj/Q520YeEQfUnLEXT7RifE0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNSlA3/dJMcah5mmVj/Q520YeEQfUnLEXT7RifE0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNSlA3/dJMcah5mmVj/Q520YeEQfUnLEXT7RifE0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNSlA3%2FdJMcah5mmVj%2FQ520YeEQfUnLEXT7RifE0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2010&quot; height=&quot;1116&quot; data-origin-width=&quot;2010&quot; data-origin-height=&quot;1116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;rtk init -g   # 전역 hook 설치&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hook 을 활성화하면, 에이전트가 &lt;code&gt;git status&lt;/code&gt; 를 보내도 shell 이 내부적으로 &lt;code&gt;rtk git status&lt;/code&gt; 로 치환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;에이전트 코드 수정 0줄, 설정 변경 0줄&lt;/b&gt;로 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원 확인된 에이전트:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Claude Code, Cursor, GitHub Copilot (VS Code / CLI)&lt;/li&gt;
&lt;li&gt;Gemini CLI, Codex, Windsurf, Cline / Roo Code&lt;/li&gt;
&lt;li&gt;OpenCode, OpenClaw, Kilo Code, Google Antigravity&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Before / After 예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는&amp;nbsp;이&amp;nbsp;블로그를&amp;nbsp;쓰는&amp;nbsp;리포지토리&amp;nbsp;(peterica-blog)&amp;nbsp;에서&amp;nbsp;rtk&amp;nbsp;0.37.2&amp;nbsp;로&amp;nbsp;직접&amp;nbsp;측정한&amp;nbsp;결과다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;git status&lt;span&gt;&amp;nbsp;&lt;/span&gt;비교&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Before &amp;mdash; 원본&lt;span&gt;&amp;nbsp;&lt;/span&gt;git status&lt;span&gt;&amp;nbsp;&lt;/span&gt;(705 bytes)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;On branch main
No commits yet
Changes to be committed:
  (use &quot;git rm --cached &amp;lt;file&amp;gt;...&quot; to unstage)
    new file:   CLAUDE_CODE_PROJECT_SETUP_PROMPT.md
    new file:   README.md
    new file:   writing/0415/idea.md
Changes not staged for commit:
  (use &quot;git add &amp;lt;file&amp;gt;...&quot; to update what will be committed)
  (use &quot;git restore &amp;lt;file&amp;gt;...&quot; to discard changes in working directory)
    modified:   CLAUDE_CODE_PROJECT_SETUP_PROMPT.md
    ...
Untracked files:
  (use &quot;git add &amp;lt;file&amp;gt;...&quot; to include in what will be committed)
    .gitignore
    PRD.md
    ...&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;After &amp;mdash;&lt;span&gt;&amp;nbsp;&lt;/span&gt;rtk git status&lt;span&gt;&amp;nbsp;&lt;/span&gt;(475 bytes, 44.1% 절감)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;* No commits yet on main
+ Staged: 3 files
   CLAUDE_CODE_PROJECT_SETUP_PROMPT.md
   README.md
   writing/0415/idea.md
~ Modified: 3 files
   CLAUDE_CODE_PROJECT_SETUP_PROMPT.md
   ...
? Untracked: 10 files
   .gitignore
   PRD.md
   ...&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사라진 것&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;(use &quot;git rm --cached ...&quot; to unstage)&lt;span&gt;&amp;nbsp;&lt;/span&gt;류의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;도움말 라인 전부&lt;/b&gt;. 사람에겐 유용하지만 LLM 에겐 노이즈.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;rtk find&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 99.8% 절감의 정체&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;원본&lt;span&gt;&amp;nbsp;&lt;/span&gt;find . -type f&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 2,309 라인을 모두 출력한다 (374KB).&lt;span&gt;&amp;nbsp;&lt;/span&gt;rtk find&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 이걸 이렇게 바꾼다:&lt;/p&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;2309F 26D:

./ PRD.md README.md requirements.txt
data/ posts.jsonl posts_wiki.jsonl reclassify_llm.json urls.txt wiki_id_to_stem.json
data/shards/ 0001.jsonl 0001.raw.jsonl 0001.txt 0002.jsonl ... 0014.txt
+2259 more

ext: .md(2203) .jsonl(42) .py(26) .txt(22) .sh(5)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 변환&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 카운트 (2309F 26D) 를 맨 위에 배치&lt;/li&gt;
&lt;li&gt;디렉토리별로 파일을 한 줄에 묶음&lt;/li&gt;
&lt;li&gt;일정 수 이후는&lt;span&gt;&amp;nbsp;&lt;/span&gt;+2259 more&lt;span&gt;&amp;nbsp;&lt;/span&gt;로 생략&lt;/li&gt;
&lt;li&gt;맨 아래&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;확장자별 통계&lt;/b&gt;를 집계 &amp;mdash; &quot;이 프로젝트는 md 2203 개가 주류&quot; 를 LLM 이 즉시 파악&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;단순 truncation 이 아니라&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&quot;이 디렉토리가 어떤 곳인지&quot;를 압축해서 보여주는&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;설계다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 Rust 인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔지니어링 관점에서 Rust 선택은 합리적이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;단일 바이너리&lt;/b&gt;: 런타임&amp;middot;인터프리터 없음. 어떤 환경에도 copy &amp;amp; run.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;stdin/stdout 스트림 처리&lt;/b&gt;: 블로킹 없는 파이프 중계.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;lt;10ms 오버헤드&lt;/b&gt;: 매 명령마다 프록시를 통과해도 체감되지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, Rust 는 수단이다. Go 나 Zig 로도 동일 요구사항을 만족할 수 있다. 본질은 &lt;b&gt;터미널 출력 스트림을 낮은 오버헤드로 중간 가공하는 파이프 레이어&lt;/b&gt; 라는 구조다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 한계와 주의점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RTK 를 무작정 켜기 전에 알아야 할 것.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;exit code 는 보존되지만, 일부 CI 파서는 깨질 수 있다&lt;/b&gt;. 에이전트 용 프록시지 CI 용이 아니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;100+ 명령 외&lt;/b&gt;는 passthrough 되거나 압축률이 낮다. 지원 목록 확인 필요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;로그 기반 디버깅이 필요한 순간&lt;/b&gt;엔 명령 앞의 `rtk` 를 떼고 원본 출력을 그대로 받아야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;shell hook 방식&lt;/b&gt;은 사용자의 shell rc 파일을 수정한다. 팀 환경 배포 시 주의.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 유사 제품 비교&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RTK 만 있는 건 아니다. 같은 문제를 다른 각도로 푸는 도구들이 있다.&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;도구&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;위치&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;특징&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;RTK&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;터미널 출력 단&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;shell hook, Rust 바이너리, 60~90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Tamp&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;에이전트 &amp;harr; API 중간&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;tool result 분류 후 압축, 60~70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;LeanCTX&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;파일 read 단&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;intent-aware, 재읽기 캐시 시 99%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RTK 는 &lt;b&gt;쉘 레이어&lt;/b&gt;, Tamp 는 &lt;b&gt;API 레이어&lt;/b&gt;, LeanCTX 는 &lt;b&gt;파일 read 레이어&lt;/b&gt; 로 삽입 지점이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조합해서 써도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RTK 는 &quot;AI 에이전트용 로그 전처리 프록시&quot;다. 추상 개념이 아니라 실제로 설치&amp;middot;실행 가능한 OSS.&lt;/li&gt;
&lt;li&gt;적용 지점은 &lt;b&gt;shell hook&lt;/b&gt;, 효과는 &lt;b&gt;60~90% 토큰 절감&lt;/b&gt;, 오버헤드는 &lt;b&gt;&amp;lt;10ms&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;단순 길이 축소가 아니라 &lt;b&gt;12가지 의미 단위 재구성 전략&lt;/b&gt;을 적용한다.&lt;/li&gt;
&lt;li&gt;장기적으로는 RAG 전처리, 온디바이스 LLM 입력 최적화에도 같은 구조가 쓰인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트가 느리거나 컨텍스트가 빨리 차는 팀이라면, 붙여보고 &lt;code&gt;rtk gain&lt;/code&gt; 으로 실측하는 것이 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 참고&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rtk-ai/rtk &amp;mdash; &lt;a href=&quot;https://github.com/rtk-ai/rtk&quot;&gt;https://github.com/rtk-ai/rtk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DeepWiki: Token Optimization Strategies &amp;mdash; &lt;a href=&quot;https://deepwiki.com/rtk-ai/rtk/3.2-token-optimization-strategies&quot;&gt;https://deepwiki.com/rtk-ai/rtk/3.2-token-optimization-strategies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tamp (비교군) &amp;mdash; &lt;a href=&quot;https://github.com/sliday/tamp&quot;&gt;https://github.com/sliday/tamp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 모델&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.googleblog.com/bring-state-of-the-art-agentic-skills-to-the-edge-with-gemma-4/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Gemma 4 Edge 블로그&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/google/embeddinggemma-300m&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;google/embeddinggemma-300m&amp;nbsp;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1776957837081&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;google/embeddinggemma-300m &amp;middot; Hugging Face&quot; data-og-description=&quot;We&amp;rsquo;re on a journey to advance and democratize artificial intelligence through open source and open science.&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/google/embeddinggemma-300m&quot; data-og-url=&quot;https://huggingface.co/google/embeddinggemma-300m&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b99AuP/dJMb8VNxWFC/h4FG0Z34x5kkfmM37K80Gk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/ilh0H/dJMb8WeB89z/bPWGcVjVSvtMRiSM397kzk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/google/embeddinggemma-300m&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/google/embeddinggemma-300m&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b99AuP/dJMb8VNxWFC/h4FG0Z34x5kkfmM37K80Gk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/ilh0H/dJMb8WeB89z/bPWGcVjVSvtMRiSM397kzk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;google/embeddinggemma-300m &amp;middot; Hugging Face&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;We&amp;rsquo;re on a journey to advance and democratize artificial intelligence through open source and open science.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 도구&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Google AI Edge Gallery: &lt;a href=&quot;https://github.com/google-ai-edge/gallery&quot;&gt;https://github.com/google-ai-edge/gallery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;minja (llama.cpp 내장 Jinja2): &lt;a href=&quot;https://github.com/google/minja&quot;&gt;https://github.com/google/minja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LiteRT: &lt;a href=&quot;https://ai.google.dev/edge/litert&quot;&gt;https://ai.google.dev/edge/litert&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;sqlite-vec: &lt;a href=&quot;https://github.com/asg017/sqlite-vec&quot;&gt;https://github.com/asg017/sqlite-vec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 더 공부하기 &amp;mdash; &lt;a href=&quot;https://llm-study-web.vercel.app/&quot;&gt;LLM System Lab&lt;/a&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LLM 시스템의 전체 흐름을 개념학습, 시스템 맵, 인터랙티브 실험으로 배우는 교육 플랫폼&lt;/li&gt;
&lt;li&gt;RAG Pipeline: &lt;a href=&quot;https://llm-study-web.vercel.app/topic/rag-pipeline&quot;&gt;https://llm-study-web.vercel.app/topic/rag-pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Embedding: &lt;a href=&quot;https://llm-study-web.vercel.app/topic/embedding&quot;&gt;https://llm-study-web.vercel.app/topic/embedding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Production RAG 사례: &lt;a href=&quot;https://llm-study-web.vercel.app/case-studies/production-rag-system&quot;&gt;https://llm-study-web.vercel.app/case-studies/production-rag-system&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 이전 글&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://peterica-website.vercel.app/&quot;&gt;peterica-website&lt;/a&gt;: 기록하는 백엔드개발자 피터 포트폴리오 웹사이트&lt;/li&gt;
&lt;li&gt;Mac Mini RAG 구축기: &lt;a href=&quot;https://peterica.tistory.com/1064&quot;&gt;https://peterica.tistory.com/1064&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;sqlite-vec 선택 이유: &lt;a href=&quot;https://peterica.tistory.com/1065&quot;&gt;https://peterica.tistory.com/1065&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI/AI코딩 | 실습</category>
      <category>google ai edge</category>
      <category>litert</category>
      <category>minja</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1066</guid>
      <comments>https://peterica.tistory.com/1066#entry1066comment</comments>
      <pubDate>Thu, 23 Apr 2026 20:44:55 +0900</pubDate>
    </item>
    <item>
      <title>[온디바이스AI] LiteRT-LM &amp;mdash; 온디바이스 LLM을 실제로 &amp;ldquo;돌리게&amp;rdquo; 만드는 런타임</title>
      <link>https://peterica.tistory.com/1073</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI] Peterica의 AI공부와 비젼 정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;a href=&quot;https://github.com/google-ai-edge/litert-lm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LiteRT-LM&lt;/a&gt; &amp;mdash; 온디바이스 LLM을 실제로 &amp;ldquo;돌리게&amp;rdquo; 만드는 런타임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ TL;DR&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LiteRT-LM = 온디바이스 LLM &lt;b&gt;추론 런타임&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;핵심 차별점: &lt;b&gt;&lt;code&gt;.litertlm&lt;/code&gt; (모델 + 토크나이저 + 템플릿 번들)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;서버 런타임(vLLM/Ollama)은 모바일에 그대로 못 옮긴다&lt;/li&gt;
&lt;li&gt;실제 기준:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Galaxy S23 Ultra&lt;/li&gt;
&lt;li&gt;Gemma 4 E2B&lt;/li&gt;
&lt;li&gt;약 40초/응답&lt;/li&gt;
&lt;li&gt;모델 크기 약 2.4GB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;결론: &lt;b&gt;모델만큼 런타임 선택이 초기에 결정된다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 LiteRT-LM까지 오게 됐는가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gemma 4 E2B를 폰에서 돌리는 데 48시간을 썼다.&lt;br /&gt;시간의 대부분은 모델이 아니라 &lt;b&gt;런타임에서 막혔다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;llama.cpp &amp;rarr; Android NDK / NPU 활용 제한&lt;/li&gt;
&lt;li&gt;서버 구조(vLLM/Ollama) &amp;rarr; 모바일 이식 불가&lt;/li&gt;
&lt;li&gt;tokenizer / ABI / 메모리 문제 반복&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 문제는 하나였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;ldquo;모델이 아니라 실행 계층이 없다.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ LiteRT-LM의 핵심 역할 (고유성)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:contentReference[oaicite:0]{index=0}은 단순한 추론 엔진이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 이 포맷이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;.&lt;b&gt;litertlm&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 파일에 포함:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델 weight&lt;/li&gt;
&lt;li&gt;토크나이저&lt;/li&gt;
&lt;li&gt;chat template&lt;/li&gt;
&lt;li&gt;실행 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결과:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;별도 tokenizer 배포 불필요&lt;/li&gt;
&lt;li&gt;프롬프트 포맷 일관성 유지&lt;/li&gt;
&lt;li&gt;모바일 배포 단순화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 다른 런타임과의 결정적 차이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 서버 런타임이 그대로 안 되는 이유&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 기준 사고:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;GPU&lt;/li&gt;
&lt;li&gt;Python runtime&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모바일 현실:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;arm64 + NDK&lt;/li&gt;
&lt;li&gt;제한된 메모리&lt;/li&gt;
&lt;li&gt;NPU delegate (Hexagon 등)&lt;/li&gt;
&lt;li&gt;앱 내 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cross compile 필요&lt;/li&gt;
&lt;li&gt;tokenizer 네이티브 의존성&lt;/li&gt;
&lt;li&gt;GPU 대신 NPU 경로 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  그래서 구조가 바뀐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;ldquo;모델 서버&amp;rdquo; &amp;rarr; &amp;ldquo;앱 내 추론 시스템&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 실제 실행 흐름 (LiteRT-LM 기준)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 LLM 흐름과 다르게, LiteRT-LM은 이 단계가 핵심이다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;HuggingFace 모델 준비&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.litertlm&lt;/code&gt; 포맷으로 변환 (핵심 단계)&lt;/li&gt;
&lt;li&gt;앱 assets 또는 외부 저장소 배치&lt;/li&gt;
&lt;li&gt;LiteRT-LM 런타임 로딩&lt;/li&gt;
&lt;li&gt;delegate 선택 (CPU / GPU / NPU)&lt;/li&gt;
&lt;li&gt;프롬프트 입력 &amp;rarr; 토큰 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  차이:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tokenizer 별도 로딩 없음&lt;/li&gt;
&lt;li&gt;prompt template 내장&lt;/li&gt;
&lt;li&gt;디바이스 최적화 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 실제 측정 기준 (내 환경)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Device: Galaxy S23 Ultra&lt;/li&gt;
&lt;li&gt;Model: Gemma 4 E2B&lt;/li&gt;
&lt;li&gt;Size: 약 2.4GB&lt;/li&gt;
&lt;li&gt;Latency: 약 40초 / 응답&lt;/li&gt;
&lt;li&gt;Acceleration: Hexagon NPU&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 수치가 의미하는 건 하나다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;돌아간다&amp;rdquo;와 &amp;ldquo;쓸 수 있다&amp;rdquo;는 다르다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 내가 바꾼 생각&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 이렇게 접근했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 모델이 좋을까&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 이렇게 바뀌었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 런타임으로 돌릴 수 있을까&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  결론:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;모델을 고르는 문제만큼,&lt;br /&gt;&amp;nbsp; 런타임을 고르는 문제도 초기에 결정된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 참고&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LiteRT-LM GitHub&lt;/li&gt;
&lt;li&gt;Gemma 4 E2B 실행 케이스 (Galaxy S23)&lt;/li&gt;
&lt;li&gt;온디바이스 RAG 전체 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 한 줄 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LiteRT-LM은 &amp;ldquo;모델을 실행 가능한 형태로 바꾸는 계층&amp;rdquo;이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;a href=&quot;https://llm-study-web.vercel.app/&quot;&gt;llm-study-web&lt;/a&gt; : LLM 시스템의 전체 흐름을 개념학습, 시스템 맵, 인터랙티브 실험으로 배우는 교육 플랫폼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ㅇ&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://github.com/google-ai-edge/litert-lm&quot;&gt;LiteRT-LM&lt;/a&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 온디바이스 LLM을 실제로 &amp;ldquo;돌리게&amp;rdquo; 만드는 런타임&lt;/span&gt;&lt;/p&gt;</description>
      <category>AI/RAG</category>
      <category>LiteRT-LM</category>
      <category>LLM</category>
      <category>PETERICA</category>
      <category>온디바이스AI</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1073</guid>
      <comments>https://peterica.tistory.com/1073#entry1073comment</comments>
      <pubDate>Thu, 23 Apr 2026 00:00:58 +0900</pubDate>
    </item>
    <item>
      <title>[온디바이스AI] 처음 만드는 온디바이스 RAG &amp;mdash; 핵심원칙 10가지</title>
      <link>https://peterica.tistory.com/1072</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;TL;DR&lt;/h4&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 72.093%; height: 336px;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;#&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;원칙&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;핵심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;목표 축소&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;완벽한 RAG ❌ &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;끝까지 도는 최소 사이클 1개&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;모델 통일&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;서버/모바일 분리 ❌ &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;동일 임베딩 모델&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;데이터가 성능&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;모델보다&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;청크 품질&lt;/b&gt;이 MRR을 움직인다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;청크는 제거&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;추가 ❌ &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;약한 청크 제거로 R@3 올리기&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 15px;&quot;&gt;
&lt;td style=&quot;width: ;height: 15px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: ;height: 15px;&quot;&gt;검색은 단순하게&lt;/td&gt;
&lt;td style=&quot;width: ;height: 15px;&quot;&gt;N &amp;lt; 1k &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;brute-force가 정답&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;배포 단위&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;모델 ❌ &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모델 + 토크나이저 + 설정 세트&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;양자화는 필수&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;선택 ❌ &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;배포 조건&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;프롬프트 욕심 금지&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;작은 모델 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;짧고 단순하게&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;속도 기대치 현실화&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;40초 느림 =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;독립성과 바꾼 비용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;제약을 받아들여라&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;장애 ❌ &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;설계 기준&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 요약&lt;/b&gt;: 작게 만들고, 단순하게 유지하고, 끝까지 동작시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버&amp;middot;네트워크 없이, Galaxy S23 Ultra에서 40초 뒤 두 문장으로 답하는 RAG를 만들었다.&lt;br /&gt;기술 다섯 가지의 실측은 &lt;a href=&quot;https://peterica.tistory.com/1071&quot;&gt;이전 글 1071&lt;/a&gt;에 정리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들면서 설계는 여러 번 뒤집혔다.&lt;br /&gt;&quot;큰 모델&quot;, &quot;많은 청크&quot;, &quot;복잡한 프롬프트&quot; &amp;mdash; 자연스러워 보였던 셋 다 틀렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 기술이 아니라, &lt;b&gt;처음 만들 때 반드시 잡아야 할 원칙 10가지&lt;/b&gt;다.&lt;br /&gt;각 원칙마다 실측 수치와 case 문서 링크를 같이 붙였다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  전체 문서&amp;middot;소스코드: &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag&quot;&gt;github.com/peterica/peterica-edge-rag&lt;/a&gt;&lt;br /&gt;  문서 허브: &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/tree/main/ondevice-rag&quot;&gt;ondevice-rag/README.md&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 목표 축소 &amp;mdash; 최소 사이클부터 완성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;완벽한 RAG ❌ &amp;rarr; &lt;b&gt;&quot;질문 한 줄 &amp;rarr; 두 문장 답&quot; 한 사이클&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;재랭크&amp;middot;멀티홉&amp;middot;복합 질의는 &lt;b&gt;나중에&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;최소 사이클이 돌아야 &lt;b&gt;어디가 병목인지&lt;/b&gt; 보인다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;&quot;안 만드는 것&quot;이 설계의 절반이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/00-main/ondevice-rag-minimal-guide.md&quot;&gt;최소 구현 가이드&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 모델 통일 &amp;mdash; 하나의 벡터 공간&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버/폰 다른 모델 ❌ &amp;rarr; &lt;b&gt;벡터 공간이 다르면 DB도, 임베딩도 두 벌&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;22쿼리 3모델 벤치마크 &amp;rarr; &lt;code&gt;e5-small-ko-v2&lt;/code&gt;(384d) 선정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MRR 0.947 &amp;middot; R@3 1.000&lt;/b&gt;로 &lt;code&gt;bge-m3&lt;/code&gt;(1024d)&amp;middot;&lt;code&gt;EmbeddingGemma&lt;/code&gt;(768d) 모두 앞섬&lt;/li&gt;
&lt;li&gt;통일 후: DB 2개 &amp;rarr; 1개, 임베딩 2회 &amp;rarr; 1회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;모델이 다르면 시스템도 두 개다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/embedding/embedding-benchmark-ko.md&quot;&gt;embedding-benchmark-ko&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 데이터가 성능 &amp;mdash; 모델보다 청크가 MRR을 움직인다&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델 교체로 얻은 이득은 작았다&lt;/li&gt;
&lt;li&gt;청크 필터 한 번이 &lt;b&gt;MRR 0.794 &amp;rarr; 0.947 (+0.15)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;같은 모델에서 데이터만 바꿨을 때의 변화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;검색 품질의 뿌리는 모델, 흙은 청크다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/chunking/moc-entity-filter.md&quot;&gt;moc-entity-filter&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 청크는 제거 &amp;mdash; 많을수록 나빠진다&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MOC&amp;middot;entity의 링크 목록, 연도 그룹 = &lt;b&gt;본문 없고 키워드만 풍부한 약한 청크&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;25개(21%) 제거 &amp;rarr; &lt;b&gt;118 &amp;rarr; 93&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;그 결과 &lt;b&gt;R@3 0.933 &amp;rarr; 1.000&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;&quot;잘 섞지 않는 것&quot;도 엔지니어링이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/chunking/moc-entity-filter.md&quot;&gt;moc-entity-filter&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 검색은 단순하게 &amp;mdash; N &amp;lt; 1k면 brute-force&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;sqlite-vec&lt;/code&gt; arm64 Android 바이너리 ❌&lt;/li&gt;
&lt;li&gt;sqlite에 float32 BLOB 저장 + Kotlin 전수 스캔&lt;/li&gt;
&lt;li&gt;93청크 &amp;times; 384차원 = 143KB, cosine &lt;b&gt;&amp;lt; 1ms&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;HNSW의 이점은 &lt;b&gt;수만 청크&lt;/b&gt; 이상에서 본격화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;&quot;작은 규모 + 비지원 플랫폼&quot;이면 가장 얕은 알고리즘이 정답.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/retrieval/brute-force-vs-sqlite-vec.md&quot;&gt;brute-force-vs-sqlite-vec&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 배포 단위 &amp;mdash; 모델이 아니라 세트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델만 넣으면 됨 ❌ &amp;rarr; &lt;b&gt;토크나이저가 바이트 단위로 다르면 벡터 공간 붕괴&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;HuggingFace Fast(Python/Rust), DJL(arm64 native 부재) 모두 실패&lt;/li&gt;
&lt;li&gt;해법: &lt;code&gt;onnxruntime-extensions&lt;/code&gt;로 SentencepieceTokenizer를 ONNX 그래프 내장&lt;/li&gt;
&lt;li&gt;검증: HF Fast &amp;harr; ONNX &lt;b&gt;byte-exact parity 24/24&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;배포 단위는 &quot;모델 파일&quot;이 아니라 &quot;모델 + 토크나이저 + 설정&quot; 세트.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/deployment/tokenizer-onnx-embedding.md&quot;&gt;tokenizer-onnx-embedding&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. 양자화 &amp;mdash; 선택이 아니라 배포 조건&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원본 fp32: &lt;b&gt;448MB&lt;/b&gt; &amp;rarr; APK가 무겁고 다운로드 불친절&lt;/li&gt;
&lt;li&gt;&lt;code&gt;optimum-cli export onnx&lt;/code&gt; &amp;rarr; &lt;code&gt;onnxruntime.quantize_dynamic&lt;/code&gt; (INT8)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;113MB&lt;/b&gt; (원본의 25%) &amp;middot; cosine 0.97~0.98 &amp;middot; Top-1 5/5 일치&lt;/li&gt;
&lt;li&gt;거리 0.003~0.006 증가했지만 &lt;b&gt;상대 순위는 동일&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;엣지에서 양자화는 &quot;해볼까&quot;가 아니라 &quot;안 하면 배포 불가&quot;.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/deployment/onnx-int8-quantization.md&quot;&gt;onnx-int8-quantization&lt;/a&gt; &amp;middot; &lt;a href=&quot;https://peterica.tistory.com/1069&quot;&gt;블로그 1069&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. 프롬프트 욕심 금지 &amp;mdash; 작은 모델은 짧고 단순하게&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버(4B)에서 규칙 준수율 0.57 &amp;rarr; 0.89로 올린 v4 JSON 스키마 프롬프트를 폰(2B)에 이식&lt;/li&gt;
&lt;li&gt;JSON 파싱은 완벽. 그런데 답변이 &lt;b&gt;&quot;질문 제목 한 줄&quot;&lt;/b&gt;로 축소&lt;/li&gt;
&lt;li&gt;원인: 2B는 &quot;양식 + 규칙 + 내용&quot;을 동시에 챙길 &lt;b&gt;사고 여유&lt;/b&gt; 부족&lt;/li&gt;
&lt;li&gt;대응: 자연어 프롬프트로 롤백, 파서&amp;middot;로그 인프라는 보존&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;큰 모델은 제약이 품질 방어벽, 작은 모델은 제약이 여유 세금.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/llm/json-schema-prompt-failure-on-edge.md&quot;&gt;json-schema-prompt-failure-on-edge&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9. 속도 기대치 현실화 &amp;mdash; 느리지만 독립적&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Gemma 4 E2B + LiteRT-LM + Hexagon NPU &amp;rarr; &lt;b&gt;40초/응답&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;서버 LLM 기준으론 &quot;쓸 수 있나&quot; 싶은 수준&lt;/li&gt;
&lt;li&gt;그러나 40초 동안 &lt;b&gt;네트워크 없이&lt;/b&gt; 내 지식에 닿는다&lt;/li&gt;
&lt;li&gt;사용 결: 오프라인&amp;middot;비밀&amp;middot;저지연 통신 불가 상황에서 빛남&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;엣지 LLM의 속도는 &quot;느림&quot;이 아니라 &quot;독립성과 바꾼 비용&quot;.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/llm/gemma4-e2b-on-galaxy-s23.md&quot;&gt;gemma4-e2b-on-galaxy-s23&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10. 제약을 받아들여라 &amp;mdash; 설계 기준이 된다&lt;/h4&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 48.3721%; height: 126px;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: ;&quot;&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;제약&lt;/td&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;결과로 강제된 설계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;sqlite-vec arm64 ❌&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;brute-force cosine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;DJL native ❌&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;ONNX 토크나이저 내장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;2B 모델 여유 부족&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;자연어 프롬프트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제약이 없었다면 HNSW&amp;middot;JSON 프롬프트를 굳이 얹었을 것&lt;/li&gt;
&lt;li&gt;유지 부담도, 배포 크기도 지금보다 컸을 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;제약은 자원의 한계가 아니라 가장 단순한 설계를 강제하는 힘이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/00-main/ondevice-rag-minimal-guide.md&quot;&gt;최소 구현 가이드&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 한 줄 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;온디바이스 RAG는 &quot;작게 만들고, 단순하게 유지하고, 끝까지 동작시키는 것&quot;이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10개 중 절반은 &lt;b&gt;&quot;안 하기&quot;&lt;/b&gt;로 시작한다.&lt;br /&gt;기능 줄이기, 듀얼 DB 안 만들기, 청크 덜 쌓기, 인덱스 안 얹기, JSON 안 강제하기.&lt;br /&gt;&quot;안 하기&quot;가 설계의 절반을 차지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 글&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  이 레포의 다른 문서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/tree/main/ondevice-rag&quot;&gt;문서 허브 README&lt;/a&gt; &amp;mdash; 8단계 네비게이션 + 독자 유형별 읽기 경로&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/00-main/ondevice-rag-minimal-guide.md&quot;&gt;최소 구현 가이드&lt;/a&gt; &amp;mdash; 결론&amp;middot;파이프라인&amp;middot;8단계&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/00-main/ondevice-rag-architecture.md&quot;&gt;아키텍처&lt;/a&gt; &amp;mdash; 컴포넌트 경계&amp;middot;데이터 흐름&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/00-main/ondevice-rag-checklist.md&quot;&gt;체크리스트&lt;/a&gt; &amp;mdash; 구현 검증 항목&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  이전 블로그 시리즈&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://peterica.tistory.com/1064&quot;&gt;1064 &amp;mdash; 맥미니 RAG 구축기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peterica.tistory.com/1066&quot;&gt;1066 &amp;mdash; 맥미니 RAG를 넘어서, 모바일 온디바이스 AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peterica.tistory.com/1067&quot;&gt;1067 &amp;mdash; 3트랙 병렬 리서치&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peterica.tistory.com/1068&quot;&gt;1068 &amp;mdash; 엣지 RAG의 AI 도구 지도&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peterica.tistory.com/1069&quot;&gt;1069 &amp;mdash; 448MB가 113MB 되는 길: ONNX INT8 양자화 실전&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href=&quot;https://peterica.tistory.com/1071&quot;&gt;1071 &amp;mdash; 내 폰이 내 블로그에 답하게 만들었다: 온디바이스 RAG 다섯 가지 기술&lt;/a&gt;&lt;/b&gt; &amp;larr; 본편&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  더 공부하기 &amp;mdash; LLM System Lab&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://llm-study-web.vercel.app/topic/rag-pipeline&quot;&gt;RAG Pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://llm-study-web.vercel.app/topic/embedding&quot;&gt;Embedding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://llm-study-web.vercel.app/topic/on-device-ai&quot;&gt;On-Device AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://llm-study-web.vercel.app/topic/model-capacity&quot;&gt;Model Capacity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://llm-study-web.vercel.app/topic/quantization&quot;&gt;Quantization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/RAG</category>
      <category>PETERICA</category>
      <category>온디바이스AI</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1072</guid>
      <comments>https://peterica.tistory.com/1072#entry1072comment</comments>
      <pubDate>Wed, 22 Apr 2026 21:00:49 +0900</pubDate>
    </item>
    <item>
      <title>[온디바이스AI] 내 폰으로 나만의 RAG 만들기(온디바이스 RAG 최소 아키텍처)</title>
      <link>https://peterica.tistory.com/1071</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1064&quot;&gt;이전 글&lt;/a&gt;에서 맥미니 위에 RAG 서버를 올려 내 블로그 1,000편을 검색하게 만들었다.&lt;br /&gt;그 글 마지막에 &quot;문서 1,000개는 보유만으로는 창고. 검색이 붙는 순간 &lt;b&gt;두 번째 뇌&lt;/b&gt;가 된다&quot;고 썼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 그 뇌는 맥미니가 켜져 있을 때만 일했다.&lt;br /&gt;와이파이가 없으면, 서버가 내려가면, 내 지식에 닿지 않았다.&lt;br /&gt;그래서 질문을 바꿨다 &amp;mdash; &lt;b&gt;내 기억을 내 주머니로 옮길 수 있을까.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Galaxy S23 Ultra를 비행기 모드로 둔 채 물어봤다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;쿠버네티스에서 graceful shutdown이란?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;40초 뒤 폰이 내 블로그 183번 글의 청크를 인용하며 두 문장으로 답했다.&lt;br /&gt;서버 없이, 네트워크 없이, 내 손 안에서.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 그 한 번의 응답까지 가기 위해 검토해야 했던 &lt;b&gt;다섯 가지 기술&lt;/b&gt;의 요약이다.&lt;br /&gt;상세한 벤치마크&amp;middot;시행착오&amp;middot;case 문서는 GitHub 저장소에 따로 정리했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 문서&amp;middot;소스코드: &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag&quot;&gt;github.com/peterica/peterica-edge-rag&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 결론&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내 기계가 내 지식을 안다&lt;/b&gt; &amp;mdash; 이 한 줄이 이번 테스트의 결론이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트를 하면서 알게 된 네 가지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 측정이 설계를 이긴다&lt;br /&gt;&lt;/b&gt;&amp;nbsp; &amp;mdash; &quot;큰 임베딩이 좋다&quot;, &quot;청크 많이 넣자&quot;, &quot;서버 프롬프트 그대로 이식하자&quot; 셋 다 22개 평가 쿼리 앞에서 뒤집혔다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 제약은 단순함을 강제한다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;mdash; sqlite-vec arm64 부재, DJL native 부재, 2B 모델 여유 부족이 합쳐지자 가장 얕은 알고리즘이 정답이 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 인프라는 보존, 결과만 롤백&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;mdash; 실패한 프롬프트 실험에서 파서&amp;middot;로그 훅은 살리고 프롬프트 문자열만 되돌려 다음 시도의 진입 비용을 낮췄다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 배포 단위는 &quot;기술&quot;이 아니라 &quot;세트&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;mdash; 서버에선 &lt;code&gt;pip install&lt;/code&gt; 한 줄이 감춰주던 의존성이, 엣지에선 파일 단위로 APK에 직접 넣어야 할 문제가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 전체 파이프라인&lt;/h4&gt;
&lt;pre class=&quot;less&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;[마크다운 위키]
      │  청크 분리 + 약한 청크 필터
      ▼
[청크 N개]
      │  서버에서 임베딩 (sentence-transformers)
      ▼
[float32 벡터 + 메타데이터]
      │  sqlite 단일 파일
      ▼
[mobile.db]
      │  /sync ETag로 폰에 다운로드
      ▼
[폰 내부 저장소]
      │  쿼리 임베딩 (ONNX INT8) + brute-force cosine
      ▼
[top-K 청크]
      │  LiteRT-LM 프롬프트 조립
      ▼
[Gemma 4 E2B 추론]
      │  문장별 [#n] 인용 렌더링
      ▼
[답변 + 근거 링크]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 다섯 가지 필수 기술&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온디바이스 RAG는 &lt;b&gt;검색과 생성을 모두 폰 안에 넣는 것&lt;/b&gt;이다.&lt;br /&gt;다섯 가지를 순서대로 검토해야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 임베딩 모델&amp;middot;차원 선택&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 &lt;code&gt;bge-m3&lt;/code&gt;(1024d) + 폰 &lt;code&gt;EmbeddingGemma&lt;/code&gt;(768d) 듀얼 DB로 시작.&lt;br /&gt;22 쿼리 3모델 벤치마크에서 가장 작은 &lt;code&gt;multilingual-e5-small-ko-v2&lt;/code&gt;(384d)가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MRR 0.947 &amp;middot; R@3 1.000&lt;/b&gt;으로 두 큰 모델을 앞섰다.&lt;br /&gt;결과적으로 &lt;b&gt;서버&amp;middot;폰 같은 모델로 통일&lt;/b&gt;, DB 크기 60% 감소.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 청크 품질&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약한 청크(MOC&amp;middot;entity의 링크 목록, 연도 그룹 헤딩)가 top-k를 오염시켰다.&lt;br /&gt;&lt;code&gt;moc/&lt;/code&gt;&amp;middot;&lt;code&gt;entities/&lt;/code&gt;&amp;middot;&lt;code&gt;concepts/&lt;/code&gt; 경로의 약한 헤딩을 제외.&lt;br /&gt;청크 118 &amp;rarr; 93 (21% 감소), &lt;b&gt;MRR 0.794 &amp;rarr; 0.947&lt;/b&gt;, R@3 0.933 &amp;rarr; 1.000.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 폰에서의 벡터 검색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sqlite-vec는 arm64 Android 바이너리가 배포되지 않았다.&lt;br /&gt;대안으로 sqlite에 float32 BLOB만 저장 + &lt;b&gt;brute-force cosine&lt;/b&gt; 전수 스캔.&lt;br /&gt;93청크 &amp;times; 384차원: &lt;b&gt;&amp;lt; 1ms&lt;/b&gt;.&lt;br /&gt;수만 청크가 넘어야 HNSW 인덱스의 이점이 드러나는 구간.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 임베딩 모델 경량화와 토크나이저 동봉&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폰은 &lt;b&gt;모델 파일을 APK에 직접&lt;/b&gt; 넣는다. 원본 448MB는 무거웠다.&lt;br /&gt;&lt;code&gt;optimum-cli export onnx&lt;/code&gt; &amp;rarr; &lt;code&gt;onnxruntime.quantize_dynamic&lt;/code&gt; &amp;rarr; &lt;b&gt;113MB&lt;/b&gt; (INT8, 원본의 25%).&lt;br /&gt;한국어 5쿼리 cosine 0.97~0.98, Top-1 5/5 일치.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델만으로는 안 돌아간다. &lt;b&gt;서버와 바이트 단위로 동일한&lt;/b&gt; 토크나이저가 필요.&lt;br /&gt;HuggingFace Fast는 Python/Rust라 안드로이드 불가, DJL은 arm64 native 부재.&lt;br /&gt;&lt;code&gt;onnxruntime-extensions&lt;/code&gt;로 SentencepieceTokenizer를 ONNX 그래프로 빌드해 &lt;code&gt;tokenizer.onnx&lt;/code&gt;(~5MB) 동봉.&lt;br /&gt;HuggingFace Fast &amp;harr; ONNX &lt;b&gt;byte-exact parity 24/24&lt;/b&gt; 통과.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양자화 이론과 파이프라인 상세: &lt;a href=&quot;https://peterica.tistory.com/1069&quot;&gt;448MB가 113MB 되는 길 &amp;mdash; ONNX INT8 양자화 실전&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 경량 LLM 실행과 프롬프트 여유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Gemma 4 E2B&lt;/b&gt;(2B) + &lt;b&gt;LiteRT-LM&lt;/b&gt; + Hexagon NPU &amp;mdash; S23 Ultra에서 &lt;b&gt;40초/응답&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복병은 프롬프트였다.&lt;br /&gt;서버(4B)에서 규칙 준수율 0.57 &amp;rarr; 0.89로 올린 v4 JSON 스키마 프롬프트를 폰에 그대로 이식하자, 답변이 &quot;Kubernetes 환경에서 graceful shutdown이란 [#1].&quot; &amp;mdash; &lt;b&gt;질문 제목 한 줄&lt;/b&gt;로 축소됐다.&lt;br /&gt;2B는 &quot;양식 + 규칙 + 내용&quot;을 동시에 챙길 &lt;b&gt;사고 여유&lt;/b&gt;가 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대응: 시스템 프롬프트만 자연어로 롤백. 파서&amp;middot;로그 인프라는 유지.&lt;br /&gt;&lt;b&gt;큰 모델은 제약이 품질 방어벽, 작은 모델은 제약이 여유 세금.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 8단계 네비게이션&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 경험한 8단계와 그 근거를 정리하였다.&lt;/p&gt;
&lt;/div&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;단계&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;선택&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;근거 (case)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;임베딩 모델 선택&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;e5-small-ko-v2 (384d)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;a style=&quot;color: #0969da;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/embedding/embedding-benchmark-ko.md&quot;&gt;embedding-benchmark-ko&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;청크 분리 + 약한 청크 필터&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;MOC/entity 제외, 118 &amp;rarr; 93&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;a style=&quot;color: #0969da;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/chunking/moc-entity-filter.md&quot;&gt;moc-entity-filter&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;서버 임베딩 파이프라인&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;FastAPI + sentence-transformers&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;(main만 참조)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;임베딩 모델 경량화&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;ONNX INT8 (448MB &amp;rarr; 113MB)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;a style=&quot;color: #0969da;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/deployment/onnx-int8-quantization.md&quot;&gt;onnx-int8-quantization&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;토크나이저 동봉&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;onnxruntime-extensions (ONNX 그래프)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;a style=&quot;color: #0969da;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/deployment/tokenizer-onnx-embedding.md&quot;&gt;tokenizer-onnx-embedding&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;폰 벡터 검색&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;sqlite + brute-force cosine (&amp;lt;1ms)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;a style=&quot;color: #0969da;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/retrieval/brute-force-vs-sqlite-vec.md&quot;&gt;brute-force-vs-sqlite-vec&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;온디바이스 LLM&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Gemma 4 E2B on LiteRT-LM (~40s)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;a style=&quot;color: #0969da;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/llm/gemma4-e2b-on-galaxy-s23.md&quot;&gt;gemma4-e2b-on-galaxy-s23&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;프롬프트 전략&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;자연어 + 인용 지시 (JSON 강제 반려)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;a style=&quot;color: #0969da;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/02-cases/llm/json-schema-prompt-failure-on-edge.md&quot;&gt;json-schema-prompt-failure-on-edge&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 선택의 전체 요약 표는&amp;nbsp;&lt;a style=&quot;color: #0969da;&quot; href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/00-main/ondevice-rag-minimal-guide.md#%EC%84%A0%ED%83%9D-%EC%9A%94%EC%95%BD-%ED%91%9C&quot;&gt;minimal-guide&lt;/a&gt;에 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 결국 선택한 스택&lt;/h4&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 110px; height: 19px;&quot;&gt;레이어&lt;/td&gt;
&lt;td style=&quot;width: 401px; height: 19px;&quot;&gt;기술&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 110px; height: 19px;&quot;&gt;LLM (폰)&lt;/td&gt;
&lt;td style=&quot;width: 401px; height: 19px;&quot;&gt;Gemma 4 E2B on LiteRT-LM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 110px; height: 19px;&quot;&gt;임베딩&lt;/td&gt;
&lt;td style=&quot;width: 401px; height: 19px;&quot;&gt;multilingual-e5-small-ko-v2&lt;span&gt;&amp;nbsp;&lt;/span&gt;INT8 (113MB, 384d)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 110px; height: 19px;&quot;&gt;벡터 검색 (폰)&lt;/td&gt;
&lt;td style=&quot;width: 401px; height: 19px;&quot;&gt;sqlite + float32 BLOB + brute-force cosine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 110px; height: 19px;&quot;&gt;토크나이저 (폰)&lt;/td&gt;
&lt;td style=&quot;width: 401px; height: 19px;&quot;&gt;onnxruntime-extensions (ONNX 그래프 내장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 110px; height: 19px;&quot;&gt;서버 (dev)&lt;/td&gt;
&lt;td style=&quot;width: 401px; height: 19px;&quot;&gt;FastAPI + sqlite-vec + Ollama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 110px; height: 19px;&quot;&gt;동기화&lt;/td&gt;
&lt;td style=&quot;width: 401px; height: 19px;&quot;&gt;/sync&lt;span&gt;&amp;nbsp;&lt;/span&gt;ETag (wiki_commit&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;span&gt;&amp;nbsp;&lt;/span&gt;chunker_version)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 전체 문서와 소스코드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 요약이다.&lt;br /&gt;각 기술의 문제 정의&amp;middot;초기 가정&amp;middot;실험&amp;middot;결과&amp;middot;선택 근거를 &lt;b&gt;case 단위로 분리해&lt;/b&gt; GitHub 저장소에 정리했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;저장소&lt;/b&gt;: &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag&quot;&gt;github.com/peterica/peterica-edge-rag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문서 허브&lt;/b&gt;: &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/tree/main/ondevice-rag&quot;&gt;ondevice-rag/README.md&lt;/a&gt; &amp;mdash; 8단계 네비게이션 + 독자 유형별 읽기 경로&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최소 구현 가이드&lt;/b&gt;: &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/00-main/ondevice-rag-minimal-guide.md&quot;&gt;ondevice-rag/00-main/ondevice-rag-minimal-guide.md&lt;/a&gt; &amp;mdash; 결론&amp;middot;파이프라인&amp;middot;8단계&lt;/li&gt;
&lt;li&gt;&lt;b&gt;아키텍처&lt;/b&gt;: &lt;a href=&quot;https://github.com/peterica/peterica-edge-rag/blob/main/ondevice-rag/00-main/ondevice-rag-architecture.md&quot;&gt;ondevice-rag/00-main/ondevice-rag-architecture.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;case 문서&lt;/b&gt;: 임베딩 벤치마크 / MOC&amp;middot;entity 필터 / brute-force vs sqlite-vec / ONNX INT8 양자화 / 토크나이저 ONNX 내장 / Gemma 4 E2B 실기 / JSON 프롬프트&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폰을 꺼내 물어봤고, 내 블로그가 자기 기억을 꺼내 답했다.&lt;br /&gt;서버 없이, 네트워크 없이.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다섯 가지 기술 검토를 돌고 나니 온디바이스 RAG가 &lt;b&gt;하나의 트릭&lt;/b&gt;이 아니라 &lt;b&gt;다섯 겹의 타협&lt;/b&gt;으로 성립한다는 걸 알게 됐다.&lt;br /&gt;측정이 설계를 이기고, 제약이 단순함을 강제하고, 실패한 실험도 인프라는 남고, 배포 단위는 기술이 아니라 세트다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완성보다 경험이, 제품보다 이해가 더 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 시스템 구성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LiteRT-LM (Gemma on-device): &lt;a href=&quot;https://ai.google.dev/edge/litert/models/gemma&quot;&gt;https://ai.google.dev/edge/litert/models/gemma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;sqlite-vec: &lt;a href=&quot;https://github.com/asg017/sqlite-vec&quot;&gt;https://github.com/asg017/sqlite-vec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;onnxruntime-extensions: &lt;a href=&quot;https://github.com/microsoft/onnxruntime-extensions&quot;&gt;https://github.com/microsoft/onnxruntime-extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;optimum (HuggingFace ONNX export&amp;middot;양자화): &lt;a href=&quot;https://github.com/huggingface/optimum&quot;&gt;https://github.com/huggingface/optimum&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 더 공부하기 &amp;mdash; LLM System Lab&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RAG Pipeline: &lt;a href=&quot;https://llm-study-web.vercel.app/topic/rag-pipeline&quot;&gt;https://llm-study-web.vercel.app/topic/rag-pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Embedding: &lt;a href=&quot;https://llm-study-web.vercel.app/topic/embedding&quot;&gt;https://llm-study-web.vercel.app/topic/embedding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;On-Device AI: &lt;a href=&quot;https://llm-study-web.vercel.app/topic/on-device-ai&quot;&gt;https://llm-study-web.vercel.app/topic/on-device-ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Model Capacity: &lt;a href=&quot;https://llm-study-web.vercel.app/topic/model-capacity&quot;&gt;https://llm-study-web.vercel.app/topic/model-capacity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Quantization: &lt;a href=&quot;https://llm-study-web.vercel.app/topic/quantization&quot;&gt;https://llm-study-web.vercel.app/topic/quantization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 이전 글&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Mac Mini RAG 구축기: &lt;a href=&quot;https://peterica.tistory.com/1064&quot;&gt;https://peterica.tistory.com/1064&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;sqlite-vec 선택 이유: &lt;a href=&quot;https://peterica.tistory.com/1065&quot;&gt;https://peterica.tistory.com/1065&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;맥미니 RAG를 넘어서 &amp;mdash; 모바일 온디바이스 AI를 시작하다: &lt;a href=&quot;https://peterica.tistory.com/1066&quot;&gt;https://peterica.tistory.com/1066&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;448MB가 113MB 되는 길 &amp;mdash; ONNX INT8 양자화 실전: &lt;a href=&quot;https://peterica.tistory.com/1069&quot;&gt;https://peterica.tistory.com/1069&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI/RAG</category>
      <category>PETERICA</category>
      <category>온디바이스AI</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1071</guid>
      <comments>https://peterica.tistory.com/1071#entry1071comment</comments>
      <pubDate>Tue, 21 Apr 2026 01:39:18 +0900</pubDate>
    </item>
    <item>
      <title>[AI] sqlite-vec vs ANN: 왜 지금은 KNN이 더 적합한가</title>
      <link>https://peterica.tistory.com/1065</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI] Peterica의 AI공부와 비젼 정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;지난 글,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica.tistory.com/1064&quot;&gt;[AI] 1,000개 블로그 글 Wiki에 로컬 RAG 챗봇 붙이기 &amp;mdash; peterica-blog-chat&lt;/a&gt;에서 sqlite-vec에 대해서 언급하였다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;sqlite-vec는 파일 하나(wiki.db)가 벡터 스토어의 전부이다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 sqlite-vec를 선택하였는가?&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ DB와 인덱스가 파일 하나(`data/wiki.db`)로 구성된다.&lt;br /&gt;&amp;nbsp; &amp;rarr; 별도의 서버 없이도 하나의 파일만으로 데이터와 검색 구조를 함께 관리할 수 있다.&lt;br /&gt;&lt;br /&gt;ㅇ&amp;nbsp;백업과&amp;nbsp;복구가&amp;nbsp;단순하다.&lt;br /&gt;&amp;nbsp; &amp;rarr; 백업은 파일을 복사(`cp`)하면 끝이고, 문제가 생기면 파일을 교체하는 방식으로 롤백이 가능하다. 운영 복잡도가 매우 낮다.&lt;br /&gt;&lt;br /&gt;ㅇ&amp;nbsp;별도의&amp;nbsp;서버나&amp;nbsp;런타임이&amp;nbsp;필요&amp;nbsp;없다.&lt;br /&gt;&amp;nbsp; &amp;rarr; sqlite 확장 형태로 동작하는 순수 C 기반 라이브러리이며,&lt;br /&gt;&amp;nbsp; &amp;nbsp; `better-sqlite3`에서 `.load()` 한 줄로 바로 사용할 수 있다.&lt;br /&gt;&lt;br /&gt;ㅇ&amp;nbsp;SQL을&amp;nbsp;그대로&amp;nbsp;활용할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&amp;nbsp; &amp;rarr; `chunk_vec`라는 가상 테이블을 사용하여, 기존 메타데이터 테이블과 일반적인 JOIN으로 연결할 수 있다.&lt;br /&gt;&amp;nbsp; &amp;rarr; 새로운 쿼리 언어나 시스템을 배울 필요 없이 기존 SQL 흐름에 자연스럽게 통합된다.&lt;br /&gt;&lt;br /&gt;ㅇ&amp;nbsp;단순하지만&amp;nbsp;정확한&amp;nbsp;벡터&amp;nbsp;검색&amp;nbsp;방식&lt;br /&gt;&amp;nbsp; &amp;rarr; sqlite-vec는 &amp;ldquo;가장 가까운 벡터를 찾는 방식(KNN, k-Nearest Neighbors)&amp;rdquo;을 사용한다.&lt;br /&gt;&amp;nbsp; &amp;rarr; 쉽게 말하면, &amp;ldquo;질문과 가장 비슷한 데이터를 직접 전부 비교해서 찾아내는 방식&amp;rdquo;이다.&lt;br /&gt;&amp;nbsp; &amp;rarr; 일부 벡터 DB처럼 속도를 위해 근사값(ANN)을 사용하는 것이 아니라,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 모든 데이터를 비교하기 때문에 정확도가 항상 100%다.&lt;br /&gt;&amp;nbsp; &amp;rarr; 수천~수만 개 수준의 데이터에서는 오히려 별도 튜닝 없이 안정적으로 동작하는 장점이 있다.&lt;br /&gt;&lt;br /&gt;ㅇ&amp;nbsp;현재&amp;nbsp;프로젝트&amp;nbsp;규모에&amp;nbsp;적합하다&lt;br /&gt;&amp;rarr; 약 5,000~10,000개의 벡터, 수 ms 단위 응답 속도 기준에서는 과도한 인프라 없이도 충분히 빠르게 동작한다.&lt;br /&gt;&amp;rarr;&amp;nbsp;만약&amp;nbsp;데이터가&amp;nbsp;100만&amp;nbsp;건&amp;nbsp;이상으로&amp;nbsp;증가하거나,&amp;nbsp;p95&amp;nbsp;기준&amp;nbsp;20ms&amp;nbsp;이하의&amp;nbsp;응답&amp;nbsp;속도가&amp;nbsp;필요해진다면&lt;br /&gt;&amp;nbsp; 그 시점에서 Qdrant나 pgvector 같은 전문 벡터 DB로 확장하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ ANN vs brute-force KNN &amp;mdash; 개념&amp;nbsp;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;KNN (K-Nearest Neighbors)&lt;/b&gt;&lt;br /&gt;&amp;ldquo;가장 비슷한 것 k개를 찾는다&amp;rdquo;는 의미다.&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;방법은 단순하다.&lt;br /&gt;질문(벡터)을 기준으로 저장된 모든 데이터와 하나씩 전부 비교한다.&lt;br /&gt;그래서 항상 가장 정확한 결과를 반환한다. (놓치는 경우가 없다)&lt;br /&gt;대신 데이터가 많아질수록 비교해야 할 대상이 늘어나기 때문에 속도가 점점 느려진다.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;ldquo;다 비교해서 정확하게 찾는 방식&amp;rdquo;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;ANN (Approximate Nearest Neighbors)&lt;/b&gt;&lt;br /&gt;속도를 위해 일부만 비교하는 방식이다.&lt;br /&gt;전체를 다 보지 않고, &lt;b&gt;&amp;ldquo;비슷할 것 같은 후보들만 빠르게 골라서&amp;rdquo;&lt;/b&gt; 그 안에서 찾는다.&lt;br /&gt;그래서 훨씬 빠르지만, 아주 드물게는 최적의 결과를 놓칠 수도 있다.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;&amp;ldquo;빠르게 대충 찾는 대신, 아주 미세하게 틀릴 수도 있는 방식&amp;rdquo;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;왜 이런 방식이 필요할까?&lt;/b&gt;&lt;br /&gt;데이터가 수십만~수백만 개로 커지면, KNN처럼 전부 비교하는 방식은 현실적으로 느려진다.&lt;br /&gt;그래서 ANN 같은 &amp;ldquo;속도 최적화 구조&amp;rdquo;가 필요해진다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;대표적인 ANN 방식 (참고)&lt;/b&gt;&lt;br /&gt;- HNSW: 그래프를 만들어서 가까운 데이터로 빠르게 이동하며 탐색&lt;br /&gt;- IVF: 데이터를 여러 그룹으로 나누고, 관련 있는 그룹만 탐색&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;하지만 현재 프로젝트 규모(수천~수만 벡터)에서는&lt;br /&gt;이런 최적화 없이도 KNN이 충분히 빠르고, 오히려 더 단순하고 정확하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 언제 한계가 오는가?&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;벡터가 수십만~수백만 단위로 커지고, 응답 시간이 민감해지는 순간 ANN 기반 DB를 고려하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;비슷한 글을 여기에서도 작성한 적이 있다.&lt;br /&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1030&quot;&gt;[AI]&amp;nbsp;HNSW&amp;nbsp;-&amp;nbsp;ANN부터&amp;nbsp;파라미터&amp;nbsp;튜닝까지,&amp;nbsp;RAG&amp;nbsp;검색&amp;nbsp;성능의&amp;nbsp;진짜&amp;nbsp;핵심&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 많지 않은 초기 단계에서는&lt;br /&gt;&amp;nbsp; &amp;ldquo;빠르게 근사값을 찾는 것&amp;rdquo;보다&lt;br /&gt;&amp;nbsp; &amp;ldquo;단순하게, 그리고 정확하게 찾는 것&amp;rdquo;이 더 중요하다.&lt;br /&gt;&lt;br /&gt;sqlite-vec는&amp;nbsp;별도의&amp;nbsp;인프라&amp;nbsp;없이도&lt;br /&gt;&amp;nbsp; 이 &amp;lsquo;정확한 검색&amp;rsquo;을 가장 단순한 형태로 제공한다.&lt;br /&gt;&lt;br /&gt;그래서&amp;nbsp;현재처럼&lt;br /&gt;&amp;nbsp; 수천 ~ 수만 개 규모의 벡터를 다루는 환경에서는&lt;br /&gt;&amp;nbsp; 복잡한 ANN 구조보다 KNN 기반 접근이 더 현실적인 선택이다.&lt;br /&gt;&lt;br /&gt;&amp;rarr;&amp;nbsp;지금은&amp;nbsp;&amp;ldquo;단순함&amp;nbsp;+&amp;nbsp;정확도&amp;rdquo;가&amp;nbsp;최적화다.&lt;br /&gt;&amp;rarr;&amp;nbsp;규모가&amp;nbsp;커지는&amp;nbsp;순간,&amp;nbsp;그때&amp;nbsp;ANN으로&amp;nbsp;확장하면&amp;nbsp;된다.&lt;br /&gt;&lt;br /&gt;기술&amp;nbsp;선택은&amp;nbsp;항상&amp;nbsp;&amp;ldquo;지금의&amp;nbsp;문제&amp;nbsp;크기&amp;rdquo;에&amp;nbsp;맞춰야&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://llm-study-web.vercel.app/&quot;&gt;llm-study-web&lt;/a&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: LLM 시스템의 전체 흐름을 개념학습, 시스템 맵, 인터랙티브 실험으로 배우는 교육 플랫폼&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica-website.vercel.app/&quot;&gt;peterica-website&lt;/a&gt;: 기록하는&amp;nbsp;백엔드개발자&amp;nbsp;피터&amp;nbsp;포트폴리오&amp;nbsp;웹사이트&lt;/p&gt;</description>
      <category>AI/AI코딩 | 실습</category>
      <category>Ann</category>
      <category>KNN</category>
      <category>PETERICA</category>
      <category>sqlite-vec</category>
      <category>vector</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1065</guid>
      <comments>https://peterica.tistory.com/1065#entry1065comment</comments>
      <pubDate>Thu, 16 Apr 2026 03:11:56 +0900</pubDate>
    </item>
    <item>
      <title>[AI] 1,000개 블로그 글 Wiki에 로컬 RAG 챗봇 붙이기 &amp;mdash; peterica-blog-chat</title>
      <link>https://peterica.tistory.com/1064</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI] Peterica의 AI공부와 비젼 정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 &lt;a href=&quot;https://peterica.tistory.com/1054&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI를 잘 운영하는 개발자로 성장하기&lt;/a&gt;위해 노력하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 지난 글 &lt;a href=&quot;https://peterica.tistory.com/1059&quot;&gt;[AI] 1000개 블로그 글을 LLM Wiki로 만든 이야기 &amp;mdash; Karpathy의 아이디어를 실전에 적용하다&lt;/a&gt;에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1,000개 문서짜리 제 Obsidian Wiki를 만들었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg1T8j/dJMcadhm6xx/cEqnyH81aXoTqlBH6gvTW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg1T8j/dJMcadhm6xx/cEqnyH81aXoTqlBH6gvTW0/img.png&quot; data-origin-width=&quot;1948&quot; data-origin-height=&quot;2280&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.1929%; margin-right: 10px;&quot; data-widthpercent=&quot;45.72&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg1T8j/dJMcadhm6xx/cEqnyH81aXoTqlBH6gvTW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg1T8j%2FdJMcadhm6xx%2FcEqnyH81aXoTqlBH6gvTW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1948&quot; height=&quot;2280&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IeG03/dJMcahD3oi2/3sz7mlfj1vgKkiobPuZfoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IeG03/dJMcahD3oi2/3sz7mlfj1vgKkiobPuZfoK/img.png&quot; data-origin-width=&quot;1862&quot; data-origin-height=&quot;1836&quot; data-is-animation=&quot;false&quot; width=&quot;544&quot; height=&quot;536&quot; style=&quot;width: 53.6443%;&quot; data-widthpercent=&quot;54.28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IeG03/dJMcahD3oi2/3sz7mlfj1vgKkiobPuZfoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIeG03%2FdJMcahD3oi2%2F3sz7mlfj1vgKkiobPuZfoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1862&quot; height=&quot;1836&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 그 위에 로컬 RAG 챗봇을 올렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 그 구축 기록이고, 동시에 왜 Vercel을 버리고 맥미니 + Cloudflare Tunnel로 갔는지에 대한 기록이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2216&quot; data-origin-height=&quot;2310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coSaml/dJMcahxkgnC/46PDQprOKGBqEudHk2Lmuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coSaml/dJMcahxkgnC/46PDQprOKGBqEudHk2Lmuk/img.png&quot; data-alt=&quot;공부하면서 정리한 LLM System Lam 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coSaml/dJMcahxkgnC/46PDQprOKGBqEudHk2Lmuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoSaml%2FdJMcahxkgnC%2F46PDQprOKGBqEudHk2Lmuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;386&quot; data-origin-width=&quot;2216&quot; data-origin-height=&quot;2310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공부하면서 정리한 LLM System Lam 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 공부한 llm모델의 임베딩, 로컬 시스템으로 연동하여 나에게 필요한 백터디비의 사양을 파악하는 연습을 하기 위해서다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리집 맥미니 M1 8GB에서 local LLM으로 가동 중이다. &lt;a href=&quot;https://largest-equal-rain-lucas.trycloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;peterica-blog-chat&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 요구사항&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 매일 밤 갱신 &amp;rarr; 검색에 즉시 반영&lt;br /&gt;ㅇ 위키 원문을 외부 서비스에 업로드하지 않음&lt;br /&gt;ㅇ 어떤 청크가 top-k에 떴는지 직접 확인 가능&lt;br /&gt;ㅇ 임베딩 모델 / 청킹 전략 / 시스템 프롬프트 교체 자유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;rarr; 위 네 줄이 들어가면 &quot;직접 만든다&quot;로 귀결.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 아키텍처&lt;/h4&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;peterica-blog-wiki (~1000 .md)
        │  npm run ingest
        ▼
scripts/ingest.ts     gray-matter + 헤딩 단위 청킹 (target 800자, 코드블록 보존)
        │
        ▼
Ollama /api/embed     bge-m3 (1024d)
        │
        ▼
sqlite-vec            chunks + chunk_vec 가상 테이블 (data/wiki.db 단일 파일)
        │  top-k
        ▼
lib/rag.ts            시스템 프롬프트 조립 + citation 강제
        │
        ▼
AI SDK v6 streamText  Ollama(exaone3.5) / Anthropic swap
        │
        ▼
Next.js 15 App Router useChat + DefaultChatTransport
        │
        ▼
Cloudflare Tunnel  &amp;rarr;  https://largest-equal-rain-lucas.trycloudflare.com/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 주요 컴포넌트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;청킹 (&lt;code&gt;lib/chunk.ts&lt;/code&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;gray-matter&lt;/code&gt;로 frontmatter 분리&lt;/li&gt;
&lt;li&gt;헤딩 경계를 유지하면서 target 800자 근처로 병합&lt;/li&gt;
&lt;li&gt;코드블록 중간 분할 금지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;임베딩 (&lt;code&gt;lib/embed.ts&lt;/code&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ollama REST &lt;code&gt;/api/embed&lt;/code&gt;, 모델 &lt;code&gt;bge-m3&lt;/code&gt; (1024d)&lt;/li&gt;
&lt;li&gt;한/영 혼합 코퍼스에서 오픈소스 중 SOTA 체감&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;검색 (&lt;code&gt;lib/db.ts&lt;/code&gt;, &lt;code&gt;lib/rag.ts&lt;/code&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;sqlite-vec&lt;/code&gt; 가상 테이블 &lt;code&gt;chunk_vec&lt;/code&gt;, L2 거리 기준 top-k&lt;/li&gt;
&lt;li&gt;외부 VectorDB 없음. 인덱스 = 파일 1개(&lt;code&gt;data/wiki.db&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;생성 (&lt;code&gt;lib/provider.ts&lt;/code&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;LLM_PROVIDER=ollama|anthropic&lt;/code&gt; 한 줄로 LLM 교체&lt;/li&gt;
&lt;li&gt;임베딩은 스왑 대상 아님 (공간 바뀌면 인덱스 전체 무효)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;인제스트 (&lt;code&gt;scripts/ingest.ts&lt;/code&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DELETE &amp;rarr; 재삽입. 중간 상태 없음&lt;/li&gt;
&lt;li&gt;출력: &lt;code&gt;indexed N chunks across M files.&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 의식적으로 뺀 것&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;Weaviate / Qdrant&lt;/b&gt; &amp;mdash; 1,000개 규모에 서버 한 대 추가는 오버킬. sqlite-vec로 충분, 백업은 &lt;code&gt;cp&lt;/code&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;LangChain / LlamaIndex&lt;/b&gt; &amp;mdash; 청킹 + top-k + 프롬프트 조립은 ~300줄. 프레임워크 끼우면 실패 역추적에 레이어 하나 추가.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;Vercel&lt;/b&gt; &amp;mdash; Ollama는 로컬 MPS에서 돌아야 의미가 있음. Vercel Function에서 원격 Ollama를 치는 구성은 레이턴시/비용 모두 불리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;Pinecone / 관리형 벡터&lt;/b&gt; &amp;mdash; 매일 밤 전체 재인덱싱이 전제. 외부 API 비용 및 데이터 유출 리스크 회피.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 sqlite-vec인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;DB와 인덱스가 파일 하나&lt;/b&gt;(`data/wiki.db`). 백업은 `cp`, 롤백은 파일 교체.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;별도&amp;nbsp;서버&amp;middot;런타임&amp;nbsp;없음&lt;/b&gt;. 순수 C 확장, `better-sqlite3`에 `.load()` 한 줄.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;SQL 네이티브&lt;/b&gt;. 가상 테이블 `chunk_vec`를 메타데이터 테이블과 일반 `JOIN`으로 엮음.&lt;br /&gt;ㅇ &lt;b&gt;brute-force KNN&lt;/b&gt;(ANN 미지원). 수천~수만 벡터에선 오히려 장점 &amp;mdash; 정확도 1.0, 재인덱싱&amp;middot;튜닝 불필요.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;프로젝트는&amp;nbsp;5,000~10,000&amp;nbsp;벡터,&amp;nbsp;검색&amp;nbsp;수&amp;nbsp;ms.&amp;nbsp;100만&amp;nbsp;벡터&amp;nbsp;넘거나&amp;nbsp;p95&amp;nbsp;&amp;lt;20ms&amp;nbsp;요구가&amp;nbsp;생기면&amp;nbsp;그때&amp;nbsp;Qdrant/pgvector로&amp;nbsp;졸업.&lt;br /&gt;&amp;nbsp;&quot;pgvector가 과한 규모&quot;에 정확히 맞는 도구.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 배포 구성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 맥미니 M1 8GB에서 앱은 Docker로&amp;nbsp; 상시 가동 중&lt;br /&gt;ㅇ Ollama는 &lt;b&gt;호스트&lt;/b&gt;에서 실행, 컨테이너 내부에서는 &lt;code&gt;host.docker.internal:11434&lt;/code&gt;로 접근한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Docker 컨테이너 안에서는 CPU만 사용하기 때문에 포퍼먼스가 떨어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ Cloudflare Tunnel이 8600 &amp;rarr; 공개 HTTPS URL로 노출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 공개 URL: &lt;a href=&quot;https://largest-equal-rain-lucas.trycloudflare.com/&quot;&gt;https://largest-equal-rain-lucas.trycloudflare.com/&lt;/a&gt;&lt;br /&gt;(trycloudflare 무료 터널이기 대문에 맥미니가 꺼지면 다시 이곳을 수정해야한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 품질 게이트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 테스트 프레임워크 없음. 대신:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;npm run typecheck&lt;/code&gt; &amp;mdash; 회귀 1차 방어선&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/api/search?q=...&lt;/code&gt; &amp;mdash; top-k 청크 직접 확인 (검색 품질 검증 전용 엔드포인트)&lt;/li&gt;
&lt;li&gt;고정 쿼리 세트 10개 &amp;rarr; 상위 3개 중 2개 이상 관련 시 PASS&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 만들면서 확인한 것&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ RAG 품질은 &lt;b&gt;검색&lt;/b&gt;에서 결정됨. LLM을 바꿔도 top-k가 틀리면 답도 틀림.&lt;br /&gt;ㅇ 답변 끝의 출처 링크는 시스템 프롬프트에서 &lt;b&gt;강제&lt;/b&gt;하지 않으면 누락됨.&lt;br /&gt;ㅇ 청킹 전략 변경 = 전체 재인덱싱. 그래서 ingest는 항상 전량 재삽입.&lt;br /&gt;ㅇ 인덱스가 파일 1개이면 백업&amp;middot;이사&amp;middot;롤백이 &lt;code&gt;cp&lt;/code&gt; 한 번.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 다음 작업&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 증분 업데이트 (현재: 전량 재삽입)&lt;br /&gt;ㅇ 리랭커 단 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;mdash; &lt;code&gt;bge-reranker-v2-m3&lt;/code&gt; 후보&lt;br /&gt;ㅇ 고정 쿼리 세트 기반 RAG 회귀 자동화 (&lt;code&gt;verify-rag-quality&lt;/code&gt; 스킬 연계)&lt;br /&gt;ㅇ Obsidian 링크 그래프를 검색 결과에 동반 노출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리 한 줄&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 1,000개 문서는 보유만으로는 창고. 검색이 붙는 순간 &lt;b&gt;두 번째 뇌&lt;/b&gt;가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://llm-study-web.vercel.app/&quot;&gt;llm-study-web&lt;/a&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: LLM 시스템의 전체 흐름을 개념학습, 시스템 맵, 인터랙티브 실험으로 배우는 교육 플랫폼&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica-website.vercel.app/&quot;&gt;peterica-website&lt;/a&gt;: 기록하는&amp;nbsp;백엔드개발자&amp;nbsp;피터&amp;nbsp;포트폴리오&amp;nbsp;웹사이트&lt;/p&gt;</description>
      <category>AI/AI코딩 | 실습</category>
      <category>cloudflare-tunnel</category>
      <category>ollama</category>
      <category>PETERICA</category>
      <category>Rag</category>
      <category>sqlite-vec</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1064</guid>
      <comments>https://peterica.tistory.com/1064#entry1064comment</comments>
      <pubDate>Thu, 16 Apr 2026 01:15:05 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code에 FDE 메인 디스패처 붙이기 - 스킬을 부르는 스킬</title>
      <link>https://peterica.tistory.com/1063</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI] Peterica의 AI공부와 비젼 정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에 &lt;a href=&quot;https://peterica.tistory.com/&quot;&gt;&quot;Claude Code를 소프트웨어처럼 설계하기 &amp;mdash; 프롬프트 하네스 아키텍처&quot;&lt;/a&gt; 라는 글에서 정리한 적이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트가 코드이고, 스킬이 함수이며, 에이전트가 마이크로서비스라는 관점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 위에서 블로그 1,000편을 스크래핑하고 위키로 변환하는 파이프라인을 운영했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간이 지나니 스킬이 17개, 18개, 20개로 늘어났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한편으로는 좋았지만, 다른 한편으로는 &lt;b&gt;&quot;어떤 스킬을 언제 불러야 하는지&quot;&lt;/b&gt; 를 나조차 자주 잊어버렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이 초안 팩트체크도 하고 폴리싱도 하고 발행준비도 해줘&quot;라고 말하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude가 어떤 스킬을 어떤 순서로 부를지 매번 다르게 해석했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 하나 더 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 &lt;b&gt;스킬을 부르는 스킬&lt;/b&gt; - FDE(Forward Deployed Engineer) 역할의 메인 디스패처다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 그 설계와 동작 방식을 짧게 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 문제 &amp;mdash; 스킬이 늘어날수록 라우팅이 어려워진다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스킬 하나는 잘 정의된 워크플로를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;blog-factcheck&lt;/code&gt;, &lt;code&gt;blog-polish&lt;/code&gt;, &lt;code&gt;blog-publish-prep&lt;/code&gt; 각자 명확하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 사용자는 자연어로 말한다:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;task/11_새주제에 초안 만들고 팩트체크&amp;middot;폴리시&amp;middot;발행준비까지 해줘&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 한 줄에 4개의 하위 작업이 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각 다른 스킬과 매칭되며, 일부는 병렬 가능하고 일부는 의존성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 매번 사람이 분해해서 &quot;먼저 이거 실행하고, 그다음 저거 실행하고&amp;hellip;&quot; 라고 지시하기는 번거롭다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어로 치면 &lt;b&gt;라우터가 없는 마이크로서비스 군집&lt;/b&gt; 같은 상태다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 해결 &amp;mdash; FDE 역할의 디스패처 스킬&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Forward Deployed Engineer의 핵심 역할은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 고객의 모호한 요청을 실행 가능한 작업으로 분해&lt;/b&gt;하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 역할을 스킬로 캡슐화했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동작은 5단계로 고정한다.&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;1. 분석 (Analyze)   &amp;rarr; 자연어 지시 파싱, 의도&amp;middot;산출물&amp;middot;제약 추출
2. 계획 (Plan)      &amp;rarr; 원자 단위로 분해 + 스킬 매칭 + 의존성 그래프
3. 제안 (Propose)   &amp;rarr; 실행 계획 테이블 제시 (사용자 승인 대기)
4. 위임 (Dispatch)  &amp;rarr; 승인 후 Wave 단위 병렬 실행 (&amp;le;3)
5. 통합 (Integrate) &amp;rarr; 결과 회수 + 충돌 조정 + 최종 보고&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;3번 제안 단계에서 반드시 멈춘다&lt;/b&gt;는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어의 &lt;b&gt;Plan/Apply 패턴&lt;/b&gt; (Terraform, kubectl diff)과 같다 &amp;mdash; 계획을 먼저 보여주고, 승인받은 후에만 상태를 바꾼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 스킬 매칭은 어떻게 하나 &amp;mdash; 3-tier Lookup&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 지시에서 추출한 하위 작업을 스킬에 매칭할 때, 우선순위 3단으로 탐색한다.&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: ;&quot;&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;Tier&lt;/td&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;방법&lt;/td&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;근거 파일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: ;&quot;&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;Exact keyword&lt;/td&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;skill-cross-reference.md, 4&lt;span&gt;&amp;nbsp;&lt;/span&gt;트리거 매트릭스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: ;&quot;&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;Category match&lt;/td&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;skill_info.md, 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;카테고리 분류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: ;&quot;&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;Fallback&lt;/td&gt;
&lt;td style=&quot;width: ;height: ;&quot;&gt;직접 수행 또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;manage-skills&lt;span&gt;&amp;nbsp;&lt;/span&gt;에 신규 스킬 제안 위임&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 매칭에 &lt;b&gt;Confidence&lt;/b&gt; (High / Medium / Low)를 부여한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Low면 사용자에게 확인을 요청한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 구조는 CDN의 &lt;b&gt;캐시 계층&lt;/b&gt; 과 닮았다&amp;nbsp;&amp;mdash; L1 미스면 L2, 그래도 없으면 오리진으로 간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;왜&amp;nbsp;승인&amp;nbsp;단계를&amp;nbsp;넣었는가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스패처를 만들면서 가장 고민한 건 &quot;언제 멈출 것인가&quot; 였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자연어 지시에서 바로 실행으로 넘어가면 편하지만, 내가 의도하지 않은 스킬이 호출되는 순간 되돌리기 어려워진다.&lt;br /&gt;&lt;br /&gt;그래서&amp;nbsp;실행&amp;nbsp;계획을&amp;nbsp;표로&amp;nbsp;제시하고&amp;nbsp;승인받는&amp;nbsp;단계를&amp;nbsp;강제했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Terraform&amp;nbsp;이나&amp;nbsp;kubectl&amp;nbsp;의&amp;nbsp;plan&amp;nbsp;/&amp;nbsp;diff&amp;nbsp;가&amp;nbsp;한&amp;nbsp;번&amp;nbsp;검토를&amp;nbsp;강제하는&amp;nbsp;것과&amp;nbsp;같은&amp;nbsp;이유다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람이&amp;nbsp;&quot;예&quot;라고&amp;nbsp;말하기&amp;nbsp;전까지는&amp;nbsp;어떤&amp;nbsp;스킬도&amp;nbsp;건드리지&amp;nbsp;않는다.&lt;br /&gt;&lt;br /&gt;편의를&amp;nbsp;조금&amp;nbsp;포기하는&amp;nbsp;대신,&amp;nbsp;예상&amp;nbsp;가능한&amp;nbsp;실행을&amp;nbsp;얻었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 글로벌로 승격했는가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 블로그 레포 하나에서만 쓰려고 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 다른 레포로 옮겨 작업하다가 같은 사고 패턴이 또 필요해졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 같은데 레포마다 스킬 목록&amp;middot;참조 파일&amp;middot;경로가 다르다는 것이다.&lt;br /&gt;&lt;br /&gt;그래서&amp;nbsp;~/.claude/skills/&amp;nbsp;로&amp;nbsp;올렸다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 프로젝트마다 환경이 다르니 있으면 쓰고, 없으면 다음 층을 본다는 fallback 체인으로 설계했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 특화 정보가 풍부하면 정확히 매칭되고, 아무것도 없으면 세션 레지스트리 description 만으로도 동작한다.&lt;br /&gt;&lt;br /&gt;한&amp;nbsp;줄로&amp;nbsp;요약하면&amp;nbsp;&amp;mdash;&amp;nbsp;&lt;b&gt;&quot;환경은&amp;nbsp;다르지만&amp;nbsp;사고&amp;nbsp;패턴은&amp;nbsp;같다&quot;&lt;/b&gt;&amp;nbsp;를&amp;nbsp;코드로&amp;nbsp;옮긴&amp;nbsp;것이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;ㅁ&amp;nbsp;스킬에&amp;nbsp;스킬을&amp;nbsp;붙인다는&amp;nbsp;것&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스킬 1~2개일 때는 필요 없는 고민이다. 그때는 그냥 부르면 된다.&lt;br /&gt;&lt;br /&gt;그런데&amp;nbsp;스킬이&amp;nbsp;20개쯤&amp;nbsp;되자&amp;nbsp;내가&amp;nbsp;먼저&amp;nbsp;잊기&amp;nbsp;시작했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그&amp;nbsp;시점부터는&amp;nbsp;스킬을&amp;nbsp;더&amp;nbsp;만드는&amp;nbsp;것보다&amp;nbsp;스킬을&amp;nbsp;고르는&amp;nbsp;방식&amp;nbsp;을&amp;nbsp;설계하는&amp;nbsp;게&amp;nbsp;효율적이었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수가&amp;nbsp;늘면&amp;nbsp;라우터를,&amp;nbsp;마이크로서비스가&amp;nbsp;늘면&amp;nbsp;API&amp;nbsp;게이트웨이를&amp;nbsp;붙이는&amp;nbsp;것과&amp;nbsp;같은&amp;nbsp;순서다.&lt;br /&gt;&lt;br /&gt;도구의&amp;nbsp;수가&amp;nbsp;임계점을&amp;nbsp;넘으면,&amp;nbsp;도구보다&amp;nbsp;도구를&amp;nbsp;고르는&amp;nbsp;방식이&amp;nbsp;더&amp;nbsp;중요해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 스킬 하나로 시작했다. 몇 개 더 만들면서 편해졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열 개가 넘어가자 &lt;b&gt;어떤 스킬이 있는지 내가 잊기 시작했다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스무 개쯤 되자 &lt;b&gt;Claude 도 라우팅을 흔들기 시작했다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 시점에서 필요한 건 더 많은 스킬이 아니라 &lt;b&gt;스킬을 부르는 스킬&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FDE 디스패처는 그렇게 태어났다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;도구가 늘어나면 도구를 고르는 도구가 필요해진다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://peterica.tistory.com/&quot;&gt;Claude Code를 소프트웨어처럼 설계하기 &amp;mdash; 프롬프트 하네스 아키텍처&lt;/a&gt; (이 글의 선행 맥락)&lt;/li&gt;
&lt;li&gt;Claude Code 공식 문서 &amp;mdash; &lt;a href=&quot;https://docs.claude.com/en/docs/claude-code&quot;&gt;https://docs.claude.com/en/docs/claude-code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Terraform Plan/Apply &amp;mdash; &lt;a href=&quot;https://developer.hashicorp.com/terraform/cli/commands/plan&quot;&gt;https://developer.hashicorp.com/terraform/cli/commands/plan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;사용 기술&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Claude Code (Opus) &amp;mdash; 메인 오케스트레이터&lt;/li&gt;
&lt;li&gt;Sonnet subAgent &amp;mdash; 병렬 실행 워커 (&amp;le;3)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.claude/skills/&lt;/code&gt; &amp;mdash; 스킬 레지스트리&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skill_info.md&lt;/code&gt; &amp;mdash; 스킬 카탈로그&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skill-cross-reference.md&lt;/code&gt; &amp;mdash; 의도&amp;rarr;스킬 매핑 테이블&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI/AI코딩 | 실습</category>
      <category>Claude</category>
      <category>claude code</category>
      <category>fde</category>
      <category>PETERICA</category>
      <category>스킬 생성</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1063</guid>
      <comments>https://peterica.tistory.com/1063#entry1063comment</comments>
      <pubDate>Wed, 15 Apr 2026 00:23:46 +0900</pubDate>
    </item>
    <item>
      <title>Argo CD vs Jenkins &amp;mdash; 왜 하나로 묶지 않고 역할을 분리하는가</title>
      <link>https://peterica.tistory.com/1062</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI]&amp;nbsp;Peterica의&amp;nbsp;AI공부와&amp;nbsp;비젼&amp;nbsp;정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ &lt;span style=&quot;font-size: 1.25em; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;들어가며&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 회의 시간에 나온 질문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;왜 Argo CD로 다 안 하고 Jenkins로 빌드하죠?&quot; 쿠버네티스 도입 초기 팀에서 자주 나오는 질문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Argo CD 이름에 &quot;CD&quot;가 박혀 있으니 CI/CD 풀스택으로 오해하기 쉽지만, 실제로는 그렇지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 말하면 &lt;b&gt;이미지 빌드는 Jenkins, 클러스터 배포는 Argo CD&lt;/b&gt; 다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘은 경쟁재가 아니라 &lt;b&gt;조합재&lt;/b&gt;다. 이 글은 그 역할 분리가 왜 자연스러운 설계인지 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 역할이 애초에 다르다 &amp;mdash; CI vs CD&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jenkins와 Argo CD는 파이프라인에서 서로 다른 영역을 책임진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Jenkins&lt;br /&gt;&lt;/b&gt; &amp;mdash; 코드 변경 &amp;rarr; 빌드 &amp;rarr; 테스트 &amp;rarr; Docker 이미지 생성 &amp;rarr; 레지스트리 푸시. &lt;b&gt;CI (Continuous Integration)&lt;/b&gt; 영역.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Argo CD&lt;/b&gt; &lt;br /&gt;&amp;mdash; Git 상태와 Kubernetes 상태를 동기화. &lt;b&gt;CD (Continuous Delivery / GitOps)&lt;/b&gt; 영역.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 Argo CD는 &quot;이미 만들어진 이미지&quot;를 배포하는 도구이지, 빌드 도구가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어로 치면 &lt;b&gt;컴파일러와 배포 오케스트레이터&lt;/b&gt;가 서로 다른 일을 하는 것과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Docker 이미지 빌드 관점 비교&lt;/h4&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;축&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;Jenkins&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;Argo CD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;역할&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;CI (빌드&amp;middot;테스트&amp;middot;푸시)&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;CD (Git&amp;harr;K8s 동기화)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;Docker 빌드&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;주요 기능&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;플러그인&amp;middot;파이프라인&amp;middot;스캔&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;Git manifest 동기화 (이미지 태그 자동화는 Image Updater 조합)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;강점&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;병렬&amp;middot;캐싱&amp;middot;분기, OSS/라이선스 체크&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;GitOps 선언형, 롤백&amp;middot;드리프트 감지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;적합 상황&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;복잡한 빌드/검증 로직&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;Kubernetes 배포 자동화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Argo CD만으로 &quot;빌드 파이프라인&quot; 자체를 구성하지는 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드가 필요하면 Jenkins나 GitHub Actions 같은 CI 도구를 별도로 둬야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jenkins는 오랜 역사 덕에 CI 분야에서 가장 널리 쓰이는 선택지 중 하나다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 현실적인 권장 아키텍처&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[개발자 push]
   &amp;darr;
Jenkins (CI)
 - Docker build
 - test
 - image push (Docker Hub 등)
   &amp;darr;
Git (manifest or helm 업데이트)
   &amp;darr;
Argo CD (CD)
 - Kubernetes 배포&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 결과물은 &lt;b&gt;레지스트리&lt;/b&gt;로,&amp;nbsp;배포 선언은 &lt;b&gt;Git manifest&lt;/b&gt; 로 흘러들어 간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Argo CD는 Git을 &lt;b&gt;단일 진실 원천(Single Source of Truth)&lt;/b&gt; 으로 삼아 클러스터 상태를 맞춘다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 팀장이 Jenkins를 고집하는 이유 (추정 3가지)&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;빌드 자동화 경험&lt;/b&gt; &amp;mdash; Jenkins는 오래된 표준이라 안정성과 레퍼런스가 많다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;복잡한 파이프라인 필요&lt;/b&gt; &amp;mdash; OSS 검증, 라이선스 체크, 사내 하네스 실행 등. Argo CD는 이런 로직을 처리하지 못한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;Argo CD = CI/CD&quot; 오해 방지&lt;/b&gt; &amp;mdash; 이름 때문에 CD 전용임이 잘 전달되지 않는다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp; 종합 &amp;mdash; 문제 &amp;rarr; 해결 &amp;rarr; 소프트웨어 대응 개념&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;문제&lt;/td&gt;
&lt;td&gt;해결 메커니즘&lt;/td&gt;
&lt;td&gt;소프트웨어 대응 개념&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;빌드 로직 복잡성&lt;/td&gt;
&lt;td&gt;Jenkins Pipeline&lt;/td&gt;
&lt;td&gt;빌드 도구 (Make / Bazel)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배포 상태 일관성&lt;/td&gt;
&lt;td&gt;Argo CD GitOps&lt;/td&gt;
&lt;td&gt;상태 머신 (Reconciliation Loop)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배포 추적&amp;middot;롤백&lt;/td&gt;
&lt;td&gt;Git commit 이력&lt;/td&gt;
&lt;td&gt;버전 관리 (Git 자체)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;클러스터 드리프트&lt;/td&gt;
&lt;td&gt;Argo 자동 동기화&lt;/td&gt;
&lt;td&gt;선언적 인프라 (Terraform state)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 CI와 CD를 한 도구로 묶으려는 시도는 &lt;b&gt;단일 책임 원칙(SRP)&lt;/b&gt; 을 위배하는 셈이다. 각자 잘하는 영역이 다르고, 도구를 분리하면 각 영역을 독립적으로 진화시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;내 선택&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이미지 빌드&lt;/b&gt; &amp;rarr; Jenkins&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클러스터 배포&lt;/b&gt; &amp;rarr; Argo CD&lt;/li&gt;
&lt;li&gt;&lt;b&gt;연결 고리&lt;/b&gt; &amp;rarr; Git manifest 리포지토리 + 이미지 태그 업데이트 훅&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소규모 팀이라면 GitHub Actions + Argo CD 조합도 충분하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 건 &lt;b&gt;&quot;빌드와 배포를 하나의 도구로 묶지 말 것&quot;&lt;/b&gt; 이라는 원칙이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI와 CD를 같은 박스로 취급하면 파이프라인은 빠르게 엉킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할이 다른 도구를 억지로 통합하기보다, &lt;b&gt;책임을 분리하고 계약만 명확히 하자&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jenkins는 아티팩트를 만들고, Argo CD는 그것을 클러스터에 흘려보낸다. 그 사이를 Git이 이어준다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Argo CD는 배포 동기화 도구, Jenkins는 빌드/테스트 실행 엔진이다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Argo CD 공식 문서 &amp;mdash; &lt;a href=&quot;https://argo-cd.readthedocs.io/en/stable/&quot;&gt;https://argo-cd.readthedocs.io/en/stable/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenGitOps Principles (CNCF) &amp;mdash; &lt;a href=&quot;https://opengitops.dev/&quot;&gt;https://opengitops.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[Jenkins] Docker 기반 Jenkins quick start &amp;mdash; &lt;a href=&quot;https://peterica.tistory.com/407&quot;&gt;https://peterica.tistory.com/407&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[kubernetes] cdk8s란 무엇인가요? &amp;mdash; &lt;a href=&quot;https://peterica.tistory.com/523&quot;&gt;https://peterica.tistory.com/523&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[kubernets] skaffold란, Kubernetes 로컬 개발환경 &amp;mdash; &lt;a href=&quot;https://peterica.tistory.com/245&quot;&gt;https://peterica.tistory.com/245&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 사용 기술&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jenkins &amp;mdash; CI / 빌드 오케스트레이터&lt;/li&gt;
&lt;li&gt;Argo CD &amp;mdash; CD / GitOps 컨트롤러&lt;/li&gt;
&lt;li&gt;Kubernetes &amp;mdash; 배포 대상&lt;/li&gt;
&lt;li&gt;Docker / ECR &amp;mdash; 이미지 빌드 / 레지스트리&lt;/li&gt;
&lt;li&gt;Git &amp;mdash; 단일 진실 원천 (Single Source of Truth)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>DevOps/Jenkins</category>
      <category>argocd</category>
      <category>docker</category>
      <category>Jenkins</category>
      <category>Kubernetes</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1062</guid>
      <comments>https://peterica.tistory.com/1062#entry1062comment</comments>
      <pubDate>Tue, 14 Apr 2026 23:49:24 +0900</pubDate>
    </item>
    <item>
      <title>샘플 프롬프트 모음 &amp;mdash; Claude Code 하네스 설계 실전 예시</title>
      <link>https://peterica.tistory.com/1061</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI]&amp;nbsp;Peterica의&amp;nbsp;AI공부와&amp;nbsp;비젼&amp;nbsp;정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; font-size: 16px; letter-spacing: 0px;&quot;&gt;이 문서는 이전 글&amp;nbsp;&lt;a href=&quot;https://peterica.tistory.com/1060&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Claude Code를 소프트웨어처럼 설계하기 - 프롬프트 하네스 아키텍처&lt;/a&gt; 에서 설명한 각 설계 패턴을 실제로 구현할 때 사용한 프롬프트 예시를 모아둔 것이다.&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; font-size: 16px; letter-spacing: 0px;&quot;&gt;그대로 복사해서 쓸 수 있도록 작성했다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. CLAUDE.md &amp;mdash; 글로벌 행동 규칙 정의&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프롬프트: 글로벌 규칙 파일 작성 요청&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;~/.claude/CLAUDE.md에 다음 규칙을 추가해줘:

1. 코드 수정 전 반드시 해당 파일을 Read 한 후 Edit 한다
2. git commit은 명시적 요청 없이 절대 하지 않는다
3. 임시 파일은 작업 완료 후 반드시 삭제한다
4. 테스트가 있는 프로젝트에서는 코드 수정 후 테스트를 실행한다
5. feature 브랜치에서만 작업하고, main에 직접 커밋하지 않는다&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프롬프트: 프로젝트 CLAUDE.md 작성&lt;/h4&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;이 프로젝트의 CLAUDE.md를 작성해줘. 다음 내용을 포함해야 한다:

## 프로젝트 개요
- Tistory 블로그(1,000+ 글) 스크래핑&amp;middot;요약&amp;middot;위키 변환 파이프라인
- Harness 구조: Claude(계획/평가) + Codex(배치 실행)

## 폴더 구조
- scripts/: Python 파이프라인 스크립트
- data/: URLs, JSONL, shards
- docs/: 최종 산출물 (INDEX.md)

## 핵심 규칙
- 생성 결과물(data/, docs/)은 직접 수정하지 말고, scripts/ 수정 후 재생성
- 서브 에이전트 병렬 처리는 동시 최대 3개
- 모든 생성물은 Rubric 평가를 거친 후에만 병합&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 스킬 파일 작성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트: 스크래핑 스킬 생성&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;.claude/skills/blog-scrape.md 스킬을 만들어줘.

트리거: /blog-scrape
입력: shard 파일 경로 (예: data/shards/0001.txt)
동작:
  1. shard 파일에서 URL 목록을 읽는다
  2. scripts/scrape_shard.py를 실행하여 HTML을 fetch하고 본문을 파싱한다
  3. 출력 JSONL의 각 레코드가 스키마를 만족하는지 검증한다
  4. 실패 건이 있으면 에러 리포트를 출력한다

출력 스키마:
  {id, title, url, published_at, body, word_count, source_hash}

검증 조건:
  - 모든 필드 non-null
  - word_count &amp;gt; 10
  - source_hash는 SHA-256 형식&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트: 평가 스킬 생성&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;.claude/skills/blog-evaluate.md 스킬을 만들어줘.

트리거: /blog-evaluate
입력: shard JSONL 파일 경로
동작:
  1. JSONL의 각 레코드에 대해 Rubric 체크리스트를 평가한다
  2. PASS/FAIL 판정과 사유를 기록한다
  3. FAIL 레코드에 대해 구체적 개선 피드백을 생성한다
  4. 평가 리포트를 reports/ 디렉토리에 출력한다

Rubric 체크리스트:
  - summary가 2문장 이상이고 본문 핵심을 반영하는가?
  - tags가 3~8개이고 관련성이 있는가?
  - category가 허용 목록(12개 MOC)에 포함되는가?
  - keywords가 summary에 1개 이상 등장하는가?

FAIL 시 피드백 형식:
  &quot;id: 0042, reason: summary가 1문장, fix: 본문의 두 번째 핵심 논점을 추가&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 에이전트 정의&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트:&amp;nbsp;하네스&amp;nbsp;오케스트레이션&amp;nbsp;규칙&amp;nbsp;(CLAUDE.md&amp;nbsp;또는&amp;nbsp;세션&amp;nbsp;초두에&amp;nbsp;입력)&lt;/p&gt;
&lt;pre id=&quot;code_1776099159584&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;너는 Opus 역할의 메인 에이전트다.
계획 수립, 우선순위 결정, 결과 통합, 최종 판단은 직접 수행하라.
독립적이고 병렬 가능한 조사/구현/검증 작업은 Sonnet 성격의 subAgent에게 위임하라.

규칙:
- 먼저 작업을 하위 작업으로 분해한다.
- 여러 파일 조사, 테스트 확인, 리팩터링 후보 탐색, 초안 작성은 subAgent에 맡긴다.
- 아키텍처 판단, 충돌 조정, 최종 반영 여부는 직접 결정한다.
- subAgent 결과는 근거 중심으로 회수하고, 메인 에이전트가 통합 결론을 작성한다.
- 항상 &quot;분해 &amp;rarr; 위임 &amp;rarr; 통합 &amp;rarr; 최종판단&quot; 순서로 일한다.&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 프롬프트는 개별 에이전트를 정의하기 전에,&amp;nbsp;메인과 서브의 협력 원칙을 선언하는 것이다.&lt;br /&gt;CLAUDE.md에 영구 규칙으로 넣거나, 복잡한 작업 시작 시 세션 초두에 입력한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트: 배치 워커 에이전트 생성&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;.claude/agents/blog-batch-worker.md 에이전트를 만들어줘.

역할: Codex 서브워커. 단일 shard(50 URL)를 받아서 scrape &amp;rarr; summarize &amp;rarr; tag을 수행하고, 검증된 JSONL을 출력한다.

실행 절차:
  1. shard 파일에서 URL 50건을 읽는다
  2. scripts/scrape_shard.py를 실행하여 HTML fetch + 본문 파싱
  3. 파싱 결과에 대해 요약&amp;middot;태그&amp;middot;카테고리&amp;middot;키워드를 생성한다
  4. 출력 JSONL의 각 레코드를 스키마 검증한다
  5. 검증 통과 건만 포함한 .jsonl 파일을 data/shards/에 저장한다

제약 조건:
  - 한 번에 하나의 shard만 처리한다
  - 외부 API 호출 없이 로컬 LLM만 사용한다
  - 실패한 URL은 .failed.txt에 기록한다

사용 도구: Bash, Read, Write, Grep&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. Evaluator-Optimizer 루프&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트: 재생성 루프 실행&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;data/shards/0003.jsonl에 대해 Evaluator-Optimizer 루프를 실행해줘.

1단계 &amp;mdash; 평가:
  /blog-evaluate data/shards/0003.jsonl

2단계 &amp;mdash; FAIL 건 재생성:
  평가 리포트에서 FAIL 판정을 받은 레코드에 대해,
  피드백을 반영하여 summary와 tags를 재생성해줘.
  재생성 결과를 0003.retry1.jsonl로 저장한다.

3단계 &amp;mdash; 재평가:
  0003.retry1.jsonl을 다시 /blog-evaluate로 평가한다.
  여전히 FAIL이면 2단계를 반복한다. 최대 3회까지.

4단계 &amp;mdash; 병합:
  최종 PASS 건만 data/shards/0003.final.jsonl로 출력한다.
  최종 FAIL 건은 reports/fail_0003.md에 사유와 함께 기록한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 세션 관리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트: 세션 시작&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;/session-start

PLAN.md와 PROGRESS.md를 읽고, 현재 상태를 3줄 이내로 보고해줘.
진행 중(`[~]`)인 작업이 있으면 어떤 작업인지 알려줘.
다음으로 착수해야 할 P0 작업이 무엇인지 추천해줘.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트: 세션 종료&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;/session-end

이번 세션에서 수행한 작업을 PROGRESS.md에 추가해줘.
형식:
  ## 세션: 2026-04-14
  - 수행: [작업 내용]
  - 결과: [산출물]
  - 다음: [이어서 해야 할 작업]

PLAN.md에서 완료된 항목을 [x]로 변경해줘.
임시 파일이 있으면 정리해줘.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. FLAGS 활용&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;FLAGS 시스템은 이 프로젝트의 ~/.claude/FLAGS.md에 정의된 커스텀 규약이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code의 공식 기능이 아니라, CLAUDE.md를 통해&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;내가 &quot;이 플래그가 오면 이렇게 행동하라&quot;고 사전 지시받은 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플래그는&amp;nbsp;&lt;b&gt;자주&amp;nbsp;쓰는&amp;nbsp;지시를&amp;nbsp;단축어로&amp;nbsp;만든&amp;nbsp;것&lt;/b&gt;이라고 보면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alias&amp;nbsp;ll='ls&amp;nbsp;-la'처럼.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트: 깊은 분석이 필요한 경우&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;--think-hard

현재 프로젝트의 스크래핑 파이프라인에 에러 핸들링이 충분한지 분석해줘.
scripts/ 디렉토리의 모든 Python 파일을 읽고:
  1. 네트워크 에러 처리 현황
  2. 파싱 실패 시 복구 전략
  3. 부분 실패 시 전체 배치에 미치는 영향
을 평가해줘.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트: 대량 작업 위임&lt;/p&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;--delegate

data/shards/ 디렉토리에 있는 모든 shard 파일(0001~0020)에 대해
blog-batch-worker 에이전트를 병렬로 실행해줘.
동시 실행 최대 3개로 제한하고,
각 배치 완료 시 진행 상황을 보고해줘.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트: 토큰 절약 모드&lt;/p&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;--token-efficient

posts.jsonl의 987개 레코드를 카테고리별로 집계하고,
카테고리당 게시글 수, 평균 word_count, 태그 분포를 표로 정리해줘.
출력은 최소한으로, 표와 수치만.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. 하네스 전체 파이프라인 실행&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트: 전체 파이프라인 오케스트레이션&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;블로그 목차 자동 생성 파이프라인을 전체 실행해줘.

Phase 1 &amp;mdash; Discover:
  /blog-discover로 전체 URL을 수집하여 data/urls.txt에 저장

Phase 2 &amp;mdash; Shard:
  data/urls.txt를 50건 단위로 분할하여 data/shards/에 저장

Phase 3 &amp;mdash; Scrape + Summarize:
  각 shard에 대해 blog-batch-worker 에이전트를 실행 (최대 3 병렬)
  각 배치 완료 후 /blog-evaluate로 Rubric 검증
  FAIL 건은 Evaluator-Optimizer 루프로 재생성 (최대 3회)

Phase 4 &amp;mdash; Merge:
  모든 shard의 .final.jsonl을 data/posts.jsonl로 병합

Phase 5 &amp;mdash; Render:
  /blog-render로 docs/INDEX.md와 docs/INDEX_BY_TAG.md 생성

Phase 6 &amp;mdash; Verify:
  /verify-posts-jsonl로 최종 검증
  reports/build_report.md에 전체 결과 기록

각 Phase 완료 시 진행 상황을 보고하고, PLAN.md를 업데이트해줘.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. Memory 활용&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트: 피드백 기억 요청&lt;/p&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;이것 기억해줘: Docker 재시작이나 빌드 같은 운영 작업은 sonnet 서브에이전트에 위임해.
이유: Opus 토큰을 운영 작업에 쓰는 건 낭비이고, sonnet이 충분히 처리 가능하다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프롬프트: 프로젝트 컨텍스트 기억 요청&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;프로젝트 메모로 저장해줘:
현재 posts.jsonl에는 987개 레코드가 있고,
LLM 카테고리(151건) 중 41건(27.2%)이 오분류되어 있었다.
키워드 기반 재분류로 해결했고, wiki_validate_refs.py로 교차 검증 완료.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;활용 팁&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;스킬은 작게 시작한다&lt;/b&gt; &amp;mdash; 처음부터 완벽한 스킬을 만들 필요 없다. 기본 절차와 출력 형식만 정의하고, 실행하면서 검증 조건을 추가한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CLAUDE.md는 점진적으로 성장한다&lt;/b&gt; &amp;mdash; 처음에는 3줄이어도 된다. 세션을 반복하면서 &quot;이건 매번 설명해야 하네&quot;라는 것을 발견할 때마다 추가한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rubric은 구체적이어야 한다&lt;/b&gt; &amp;mdash; &quot;좋은 요약인가?&quot;보다 &quot;2문장 이상이고 본문 키워드를 포함하는가?&quot;가 기계적 판정에 적합하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FLAGS는 상황에 맞게 쓴다&lt;/b&gt; &amp;mdash; 모든 작업에 &lt;code&gt;--ultrathink&lt;/code&gt;를 쓰면 토큰 낭비다. 단순 작업은 기본 모드로, 복잡한 분석만 깊은 모드로.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Memory는 &quot;놀라운 것&quot;만 저장한다&lt;/b&gt; &amp;mdash; 코드에서 읽을 수 있는 것은 저장하지 않는다. &quot;사용자가 3000 포트를 싫어한다&quot;처럼 코드에 없는 선호만 기억한다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>AI/AI코딩 | 실습</category>
      <category>Claude</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1061</guid>
      <comments>https://peterica.tistory.com/1061#entry1061comment</comments>
      <pubDate>Tue, 14 Apr 2026 01:58:06 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code를 소프트웨어처럼 설계하기 - 프롬프트 하네스 아키텍처</title>
      <link>https://peterica.tistory.com/1060</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI] Peterica의 AI공부와 비젼 정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code를 처음 쓸 때는 대화창에 &quot;이거 만들어줘&quot;라고 치면 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 1,000개 블로그 글을 자동으로 스크래핑하고, 요약하고, 위키로 변환하는 파이프라인을 만들면서 한계를 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 같은 맥락을 설명해야 했고, 세션이 바뀌면 전부 잊어버렸고, 반복 작업에 비싼 모델의 토큰을 낭비했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 접근을 바꿨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Claude를 &quot;대화 상대&quot;가 아니라 &quot;프로그래밍 가능한 실행 엔진&quot;으로 설계&lt;/b&gt;하기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트가 코드이고, 스킬이 함수이며, 에이전트가 마이크로서비스인 구조다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서 그 설계를 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 계층적 프롬프트 주입 &amp;mdash; 설정 파일처럼 쓰는 CLAUDE.md&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 대화 시작 시 여러 레벨의 설정 파일을 자동으로 로드한다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;글로벌 (~/.claude/CLAUDE.md)        &amp;larr; 모든 프로젝트에 적용
  ├── RULES.md                      &amp;larr; 행동 규칙
  ├── PRINCIPLES.md                 &amp;larr; 엔지니어링 원칙
  └── FLAGS.md                      &amp;larr; 실행 모드 플래그
프로젝트 (./CLAUDE.md)              &amp;larr; 이 프로젝트에만 적용
  ├── Skills (.claude/skills/)      &amp;larr; 재사용 가능한 작업 단위
  ├── Agents (.claude/agents/)      &amp;larr; 위임 가능한 서브 에이전트
  └── References (.claude/references/) &amp;larr; 공유 컨텍스트
메모리 (memory/)                    &amp;larr; 세션 간 지속 학습&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조는 소프트웨어의 설정 관리와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt;는 &lt;code&gt;.gitconfig&lt;/code&gt; 같은 글로벌 설정이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 &lt;code&gt;CLAUDE.md&lt;/code&gt;는 &lt;code&gt;.eslintrc&lt;/code&gt; 같은 프로젝트 설정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;관심사의 분리(Separation of Concerns)&lt;/b&gt;다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;글로벌 규칙&lt;/b&gt;은 &quot;어떻게 일할 것인가&quot;를 정의한다 &amp;mdash; 코드 리뷰 스타일, Git 워크플로우, 안전 규칙 등&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로젝트 설정&lt;/b&gt;은 &quot;무엇을 할 것인가&quot;를 정의한다 &amp;mdash; 스크래핑 대상, 데이터 스키마, 파이프라인 단계 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 사람이 다른 프로젝트를 열면 행동 규칙은 유지하면서 도메인 컨텍스트만 교체된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마치 같은 개발자가 다른 프로젝트의 &lt;code&gt;.eslintrc&lt;/code&gt;를 따르듯이.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 스킬(Skill) 시스템 &amp;mdash; 프롬프트를 함수처럼 캡슐화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스킬은 &lt;code&gt;.claude/skills/&lt;/code&gt; 디렉토리에 정의된 마크다운 파일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;/blog-discover&lt;/code&gt;, &lt;code&gt;/blog-scrape&lt;/code&gt; 같은 슬래시 커맨드로 호출한다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# .claude/skills/blog-scrape.md (예시 구조)
---
name: blog-scrape
description: Shard 단위 HTML 파싱&amp;middot;본문 추출
trigger: blog-scrape
---

###### 입력
- shard 파일 경로 (예: data/shards/0001.txt)

###### 절차
1. shard 파일에서 URL 목록 로드
2. httpx로 병렬 fetch
3. selectolax로 본문&amp;middot;제목&amp;middot;날짜 파싱
4. 결과를 JSONL로 출력

###### 출력 스키마
{id, title, url, published_at, body, word_count, source_hash}

###### 검증 기준
- 모든 필드 non-null
- word_count &amp;gt; 10
- source_hash는 SHA-256&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것의 가치는 세 가지다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;재현성&lt;/b&gt; &amp;mdash; &quot;URL 수집해줘&quot;라는 자연어 대신, 사전 정의된 절차&amp;middot;검증 기준&amp;middot;출력 형식이 캡슐화되어 있다. 누가 언제 호출해도 동일한 품질의 결과를 기대할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;체이닝&lt;/b&gt; &amp;mdash; &lt;code&gt;discover &amp;rarr; scrape &amp;rarr; summarize &amp;rarr; evaluate &amp;rarr; render&lt;/code&gt; 파이프라인을 스킬 단위로 연결한다. 각 스킬은 입력&amp;middot;출력 스키마가 명확하므로 파이프 연결이 자연스럽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위임 가능&lt;/b&gt; &amp;mdash; 스킬은 서브 에이전트에 위임할 수 있다. 메인 Claude가 스킬을 호출하면, 해당 작업은 별도 컨텍스트에서 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 공학에서 코드를 함수로 분리하듯, &lt;b&gt;LLM의 행동을 스킬로 분리&lt;/b&gt;한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Harness 패턴 &amp;mdash; 이중 에이전트 분업 구조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하네스(Harness)는 Claude(Main)와 Codex/로컬 LLM(Sub)의 분업 구조다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;Claude (Main/Orchestrator)          Codex / Local LLM (Sub/Worker)
┌─────────────────────┐            ┌─────────────────────┐
│ 계획 수립            │            │ 배치 스크래핑        │
│ Rubric 평가          │──위임──&amp;rarr;  │ 요약 생성            │
│ 병합/렌더            │            │ 태깅                 │
│ 품질 판정            │&amp;larr;──결과──  │ JSONL 출력           │
└─────────────────────┘            └─────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 이렇게 나누는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;토큰 경제성&lt;/b&gt; &amp;mdash; Claude Opus는 토큰 단가가 높다. 1,000개 게시글의 반복적 스크래핑/요약을 Opus에서 직접 하면 비용이 폭증한다. 단순 반복 작업은 더 저렴한 모델(Codex, qwen3:8b)에 위임하고, Opus는 판단&amp;middot;평가&amp;middot;오케스트레이션에 집중한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컨텍스트 윈도우 보호&lt;/b&gt; &amp;mdash; 1,000개 게시글의 HTML을 메인 대화에 로드하면 컨텍스트가 즉시 포화된다. Shard 단위(50건)로 서브 에이전트에 위임하면 메인 컨텍스트는 깨끗하게 유지된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;병렬성&lt;/b&gt; &amp;mdash; 최대 3개 배치를 동시에 처리할 수 있어 처리량이 3배로 늘어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조는 마이크로서비스 아키텍처와 유사하다. 메인 서비스(Claude)가 API 게이트웨이 역할을 하고, 워커 서비스(Codex/로컬 LLM)가 실제 데이터 처리를 담당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. Evaluator-Optimizer 루프 &amp;mdash; 자기 교정 메커니즘&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM의 근본적 약점은 비결정성이다. 같은 입력에 다른 출력이 나올 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대한 대응이 Evaluator-Optimizer 루프다.&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;생성(Generate) &amp;rarr; 평가(Evaluate) &amp;rarr; PASS? ──&amp;rarr; 병합
                      &amp;darr; FAIL
               피드백(Feedback) &amp;rarr; 재생성 (최대 3회)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Rubric&lt;/b&gt;은 기계적 판정 기준이다. 예를 들어:&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;###### Rubric 체크리스트
- [ ] summary가 2문장 이상인가?
- [ ] tags가 3개 이상인가?
- [ ] category가 허용 목록에 포함되는가?
- [ ] summary가 본문 내용과 관련 있는가?
- [ ] keywords가 summary에 등장하는가?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 루프가 보장하는 것:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;품질 하한선&lt;/b&gt; &amp;mdash; Rubric을 통과하지 못하면 최종 산출물에 포함되지 않는다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추적 가능성&lt;/b&gt; &amp;mdash; 어떤 기준에서 실패했는지 리포트로 기록된다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수렴성&lt;/b&gt; &amp;mdash; 최대 3회 제한으로 무한 루프를 방지한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어의 CI/CD 파이프라인에서 테스트가 실패하면 배포를 막는 것과 같은 원리다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 세션 연속성 &amp;mdash; LLM에 장기 기억을 시뮬레이션&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM의 가장 큰 제약은 세션 간 기억 상실이다. 새 대화를 열면 이전에 무엇을 했는지 전부 잊는다. 이 프로젝트는 세 가지 메커니즘으로 이를 해결한다.&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: ;height: 17px;&quot;&gt;&lt;b&gt;메커니즘&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: ;height: 17px;&quot;&gt;파일&lt;/td&gt;
&lt;td style=&quot;width: ;height: 17px;&quot;&gt;용도&lt;/td&gt;
&lt;td style=&quot;width: ;height: 17px;&quot;&gt;수명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;&lt;b&gt;Memory&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;memory/*.md&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;사용자 선호, 피드백, 프로젝트 컨텍스트&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;영구&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;&lt;b&gt;Plan&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;PLAN.md&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;작업 체크리스트와 상태 ([ ],&lt;span&gt;&amp;nbsp;&lt;/span&gt;[~],&lt;span&gt;&amp;nbsp;&lt;/span&gt;[x])&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;프로젝트 수명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;&lt;b&gt;Progress&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;PROGRESS.md&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;세션별 작업 기록&lt;/td&gt;
&lt;td style=&quot;width: ;height: 19px;&quot;&gt;프로젝트 수명&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 시작 시 &lt;code&gt;session-start&lt;/code&gt; 스킬이 이 세 파일을 읽고 상태를 보고한다:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt; PLAN.md: P0 작업 8/10 완료, P1 작업 3/7 완료
&amp;gt; PROGRESS.md: 마지막 세션 &amp;mdash; wiki concepts 122개 생성, Rubric 100% PASS
&amp;gt; memory: 사용자는 84XX 포트 대역 선호, Docker 작업은 sonnet에 위임&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 소프트웨어의 &lt;b&gt;상태 관리(State Management)&lt;/b&gt;다. React의 Context나 Redux처럼, 세션 간 공유해야 하는 상태를 파일 시스템에 영속화한 것이다. Memory가 Redux Store, PLAN.md가 To-Do State, PROGRESS.md가 Activity Log에 해당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. FLAGS 시스템 &amp;mdash; 런타임 행동 제어&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 Claude에게 상황에 따라 다른 행동 모드를 적용하는 플래그 시스템이다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;## 분석 깊이 조절
--think          &amp;rarr; 표준 분석 (~4K 토큰)
--think-hard     &amp;rarr; 깊은 분석 (~10K 토큰)
--ultrathink     &amp;rarr; 최대 깊이 (~32K 토큰)

## 실행 모드
--delegate       &amp;rarr; 서브 에이전트 병렬 위임
--token-efficient &amp;rarr; 압축 커뮤니케이션 모드
--safe-mode      &amp;rarr; 최대 검증, 보수적 실행

## 도구 선택
--context7       &amp;rarr; 공식 문서 조회 활성화
--sequential     &amp;rarr; 구조화된 추론 활성화&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 프로그래밍의 &lt;b&gt;Feature Flag&lt;/b&gt; 또는 &lt;b&gt;런타임 설정(Runtime Configuration)&lt;/b&gt;과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어에서 &lt;code&gt;DEBUG=true&lt;/code&gt;로 로그 레벨을 바꾸듯, &lt;code&gt;--think-hard&lt;/code&gt;로 분석 깊이를 바꾼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 가치는 &lt;b&gt;하나의 모델을 여러 전문가처럼 전환&lt;/b&gt;할 수 있다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 파일 수정에 &lt;code&gt;--ultrathink&lt;/code&gt;를 쓰면 토큰 낭비이고, 아키텍처 설계에 기본 모드를 쓰면 깊이가 부족하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황에 맞는 행동 모드를 선택할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. 종합 &amp;mdash; 이 설계가 해결하는 5가지 문제&lt;/h4&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;문제&lt;/td&gt;
&lt;td&gt;해결 메커니즘&lt;/td&gt;
&lt;td&gt;소프트웨어 대응 개념&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;매번 다른 결과&lt;/td&gt;
&lt;td&gt;Skill + Rubric&lt;/td&gt;
&lt;td&gt;함수 + 단위 테스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비싼 토큰 비용&lt;/td&gt;
&lt;td&gt;Harness (역할 분업)&lt;/td&gt;
&lt;td&gt;마이크로서비스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;대량 데이터 처리&lt;/td&gt;
&lt;td&gt;Shard 병렬 처리&lt;/td&gt;
&lt;td&gt;배치 프로세싱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;세션 간 기억 상실&lt;/td&gt;
&lt;td&gt;Memory + PLAN + PROGRESS&lt;/td&gt;
&lt;td&gt;상태 관리 (Redux)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;상황별 행동 조절&lt;/td&gt;
&lt;td&gt;FLAGS 시스템&lt;/td&gt;
&lt;td&gt;Feature Flag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 이 구조는 &lt;b&gt;LLM을 소프트웨어 시스템처럼 설계&lt;/b&gt;한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트가 코드이고, 스킬이 함수이며, 에이전트가 마이크로서비스이고, CLAUDE.md가 설정 파일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 내가 사용한 샘플 프롬프트 모음을 남기도록 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샘플 프롬프트 모음 &amp;mdash; &lt;a href=&quot;https://peterica.tistory.com/1061&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Claude Code 하네스 설계 실전 예시&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 강력한 도구지만, &quot;강력한 도구를 잘 쓰는 것&quot;은 별개의 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대화형으로만 쓰면 매번 같은 설명을 반복하고, 품질이 들쭉날쭉하고, 비용이 제어되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트를 코드처럼, 스킬을 함수처럼, 에이전트를 서비스처럼 설계하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;mdash; LLM은 &quot;대화 상대&quot;에서 &lt;b&gt;&quot;프로그래밍 가능한 실행 엔진&quot;&lt;/b&gt;으로 전환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;좋은 AI 결과는 모델이 아니라, 설계된 시스템에서 나온다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Claude Code 공식 문서: &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code&quot;&gt;https://docs.anthropic.com/en/docs/claude-code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Karpathy LLM Wiki: &lt;a href=&quot;https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f&quot;&gt;https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;블로그: &lt;a href=&quot;https://peterica.tistory.com&quot;&gt;https://peterica.tistory.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 사용 기술&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Claude Code (Opus) &amp;mdash; 메인 오케스트레이터&lt;/li&gt;
&lt;li&gt;Codex / qwen3:8b &amp;mdash; 서브 워커&lt;/li&gt;
&lt;li&gt;Python &amp;mdash; 파이프라인 스크립트&lt;/li&gt;
&lt;li&gt;Obsidian &amp;mdash; 지식 위키 시각화&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>Claude</category>
      <category>claude code</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1060</guid>
      <comments>https://peterica.tistory.com/1060#entry1060comment</comments>
      <pubDate>Tue, 14 Apr 2026 01:21:44 +0900</pubDate>
    </item>
    <item>
      <title>[AI] 1000개 블로그 글을 LLM Wiki로 만든 이야기 &amp;mdash; Karpathy의 아이디어를 실전에 적용하다</title>
      <link>https://peterica.tistory.com/1059</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI] Peterica의 AI공부와 비젼 정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3300&quot; data-origin-height=&quot;3004&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HzxSe/dJMcaduNUWF/qWEyZ1QxEERnly48bK7XgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HzxSe/dJMcaduNUWF/qWEyZ1QxEERnly48bK7XgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HzxSe/dJMcaduNUWF/qWEyZ1QxEERnly48bK7XgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHzxSe%2FdJMcaduNUWF%2FqWEyZ1QxEERnly48bK7XgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3300&quot; height=&quot;3004&quot; data-origin-width=&quot;3300&quot; data-origin-height=&quot;3004&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그 글을 1000개 쓰면 뿌듯할 줄 알았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 어느 날 내가 뭘 아는지 스스로 설명하지 못하는 자신을 발견했다. 글은 많은데, 체계가 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DevOps 글이 여기저기 흩어져 있고, Kubernetes 관련 글은 카테고리가 3개로 나뉘어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;내가 Kubernetes에 대해 뭘 알고 있지?&quot;라는 질문에 블로그 목록을 위아래로 스크롤하는 것 말고는 방법이 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러던 중 Andrej Karpathy가 공유한 &lt;a href=&quot;https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;LLM-Wiki&lt;/b&gt;&lt;/a&gt; 아이디어를 봤다.&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 간단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&quot;RAG처럼 매번 원본을 검색하지 말고, LLM이 위키를 만들고 유지보수하게 하라.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 이 아이디어를 987개 블로그 글에 실제로 적용한 과정을 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;LLM-WIKI의&amp;nbsp;핵심&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Karpathy의 LLM Wiki는 LLM이 단순히 문서를 검색하는 도구가 아니라, 원본 데이터(raw sources)를 읽어 스스로 구조화된 Markdown 위키를 생성&amp;middot;유지하며 지식을 누적(compound)시키는 시스템 패턴으로, immutable한 소스 계층과 LLM이 관리하는 wiki 계층, 그리고 동작 규칙을 정의하는 schema 계층으로 구성되며, 새로운 문서가 들어올 때마다 요약&amp;middot;개념화&amp;middot;상호연결을 수행해 기존 지식을 업데이트하고 모순을 검출함으로써 &amp;ldquo;질문할 때마다 다시 찾는 RAG&amp;rdquo;가 아니라 &amp;ldquo;한 번 컴파일하고 계속 발전하는 지속적 지식 아티팩트&amp;rdquo;를 만든다는 점이 핵심이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 포스트 목록 &amp;ne; 지식 위키&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 구분해야 할 것이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;포스트 목록&lt;/b&gt;은 글의 나열이다. 제목, 날짜, 카테고리로 정렬된 INDEX.md는 &quot;어떤 글이 있는지&quot;를 보여줄 뿐, &quot;내가 무엇을 이해하고 있는지&quot;는 보여주지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지식 위키&lt;/b&gt;는 여러 글에서 추출한 개념을 재합성한 것이다. 예를 들어 &quot;Kubernetes 네트워킹&quot;이라는 개념 페이지는 Service, Ingress, CNI에 대한 8개 포스트를 읽고 합성한 결과물이다. 개별 글의 요약이 아니라, 글들 사이의 관계와 패턴을 정리한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Karpathy는 이것을 3계층으로 설명한다:&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;Raw Sources (원본)  &amp;rarr;  Wiki (합성 지식)  &amp;rarr;  Schema (구조 규칙)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 프로젝트에서는 이렇게 매핑했다:&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Karpathy Layer&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;구현&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Raw Sources&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;posts/&lt;span&gt;&amp;nbsp;&lt;/span&gt;(987개 md)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;원본, 수정 안 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Wiki&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;concepts/,&lt;span&gt;&amp;nbsp;&lt;/span&gt;entities/,&lt;span&gt;&amp;nbsp;&lt;/span&gt;moc/&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;LLM이 합성한 지식 페이지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Schema&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;SCHEMA.md&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;위키 구조&amp;middot;규칙&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 전체 아키텍처&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅇ 파이프라인 6단계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;987개 포스트를 위키로 변환하는 과정은 6단계이다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 1. 카테고리 재정리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 69개 카테고리를 12개 MOC(Map of Content)로 통합했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - LLM이 생성한 카테고리는 &quot;DevOps&quot;, &quot;CI/CD&quot;, &quot;Infrastructure&quot; 처럼 같은 주제를 다른 이름으로 분류하는 경우가 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Python 스크립트(&lt;code&gt;wiki_categorize.py&lt;/code&gt;)로 매핑 테이블을 만들어 일괄 정리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 2. MOC 페이지 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;12개 카테고리 각각에 대한 진입점 페이지를 자동 생성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;MOC-DevOps, MOC-Kubernetes, MOC-LLM 등.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;각 MOC에는 해당 카테고리의 포스트 목록과 상위 태그가 포함된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 3. 위키링크 삽입&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;987개 포스트 md 파일에 &lt;code&gt;[[MOC-DevOps]]&lt;/code&gt;, &lt;code&gt;#kubernetes&lt;/code&gt; 같은 Obsidian 호환 링크를 자동 삽입했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 4. Concept/Entity 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;이 단계가 핵심이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Local LLM(qwen3:8b)이 MOC별 포스트 메타데이터를 읽고, &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;이 글들의 공통 주제는 무엇인가?&quot;를 추출하여 개념(Concept) 페이지와 기술(Entity) 페이지를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 5. 크로스링크&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;모든 페이지 간 &lt;code&gt;[[]]&lt;/code&gt; 상호 참조를 보강하고, 위키 진입점(&lt;code&gt;_index.md&lt;/code&gt;)을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 6. Obsidian 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;그래프 뷰 색상 그룹, 커뮤니티 플러그인 설정 등.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅇ 위키 페이지 4계층&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 산출물은 4가지 유형의 페이지로 구성된다:&lt;/p&gt;
&lt;table style=&quot;height: 113px;&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;b&gt;유형&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;수량&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;역할&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;MOC&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;12&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;카테고리 진입점&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;MOC-DevOps, MOC-Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;Concept&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;122&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;여러 포스트에서 합성한 지식&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&quot;CI/CD 파이프라인 설계&quot;, &quot;컨테이너 네트워킹&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;Entity&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;61&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;기술/도구 정의 + 사용 경험&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Docker, Jenkins, Terraform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;Post&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;987&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;블로그 원본&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;개별 블로그 글&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 토큰 절약 &amp;mdash; Local LLM 하이브리드 전략&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;987개 포스트에서 개념을 추출하려면 LLM 호출이 대량으로 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 API를 쓰면 비용이 많이 든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;b&gt;3계층 하네스(Harness)&lt;/b&gt; 구조를 설계했다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Claude Main (Opus) ─── 오케스트레이터, 계획&amp;middot;평가만
    ├── Python 스크립트 ─── Steps 1-3, 5-6 (LLM 불필요)
    └── Local LLM (qwen3:8b) ─── Step 4 벌크 생성 (무료)
         └── Codex ─── confidence=low 건만 재생성 (제한적)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 절약 전략: 요약 기반 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포스트 전문을 LLM에 넘기면 건당 평균 500자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이미 요약&amp;middot;태그&amp;middot;키워드가 &lt;code&gt;posts.jsonl&lt;/code&gt;에 있으므로, 이 메타데이터만 전달하면 건당 80자. &lt;b&gt;84% 토큰 절감&lt;/b&gt;이다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;포스트 전문 입력: 500자 &amp;times; 8건 = 4,000자
요약+태그+키워드: 80자 &amp;times; 8건 = 640자  &amp;rarr; 84% 절감&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;qwen3:8b는 Ollama로 로컬에서 무료로 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Codex는 품질이 낮은 건(confidence=low)에만 선별 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅇ 대형 MOC 배치 분할&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DevOps(147건), Kubernetes(142건), LLM(151건) 같은 대형 MOC는 한 번에 LLM에 넣으면 타임아웃이 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;60건씩 배치를 분할하여 해결했다.&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;MAX_POSTS_PER_BATCH = 60
batches = [posts[i:i + MAX_POSTS_PER_BATCH]
           for i in range(0, len(posts), MAX_POSTS_PER_BATCH)]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 결과: &lt;b&gt;122 Concepts + 61 Entities&lt;/b&gt;, Rubric 평가 &lt;b&gt;183/183 (100%) PASS&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 위키링크 정합성 &amp;mdash; 발견과 교정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위키를 생성한 후 Obsidian에서 열어보니, 링크가 대량으로 깨져 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: &lt;br /&gt;&amp;nbsp; LLM이 관련 포스트를 &lt;code&gt;[[722]]&lt;/code&gt; 같은 숫자 ID로 참조했는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 실제 포스트 파일명은 &lt;code&gt;0722-Linux-ssh-keygen-명령어를-사용하여-SSH-키를-생성.md&lt;/code&gt;였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Obsidian은 파일명(stem) 기준으로 링크를 해석하므로, &lt;code&gt;[[722]]&lt;/code&gt;를 클릭하면 빈 파일이 생성되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결&lt;/b&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 포스트 ID &amp;rarr; 파일명 매핑 JSON을 생성하고, 정규식으로 815건의 숫자 링크를 일괄 교정했다.&lt;/p&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;# [[722]] &amp;rarr; [[0722-Linux-ssh-keygen-명령어를-사용하여-SSH-키를-생성]]
new_content = re.sub(r&quot;\[\[(\d+)\]\]&quot;, replacer, content)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;두 번째 문제&lt;/b&gt;: &amp;nbsp;카테고리 오분류로 인한 무관한 참조.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSO 글이 &quot;프롬프트 엔지니어링&quot; entity에 연결되어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근본 원인은 &lt;code&gt;posts.jsonl&lt;/code&gt;의 category 필드 자체가 오염된 것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM MOC 151건 중 41건(27.2%)이 오분류. 이를 키워드 기반으로 재분류하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MOC 교차 검증(&lt;code&gt;wiki_validate_refs.py&lt;/code&gt;)으로 30건의 무효 참조를 자동 제거했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종: &lt;b&gt;792/792 (100%) 참조 정합&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Obsidian 그래프 뷰 - 지식의 시각화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위키의 최종 시각화는 Obsidian의 그래프 뷰다. 4색 그룹으로 계층을 구분했다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;빨강&lt;/b&gt;: MOC (카테고리 허브, 12개)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;청록&lt;/b&gt;: Concept (개념 페이지, 122개)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주황&lt;/b&gt;: Entity (기술/도구, 61개)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;회색&lt;/b&gt;: Post (블로그 원본, 987개)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 Post가 MOC에 직접 연결되어 있어서 계층 구조가 안 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Post &amp;rarr; Concept 역링크를 삽입하고, concept가 있는 포스트에서는 MOC 직접 링크를 제거하여,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;MOC &amp;rarr; Concept &amp;rarr; Post&lt;/code&gt; 3계층 구조가 그래프에서 시각적으로 드러나게 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 순환 파이프라인 &amp;mdash; 살아있는 위키&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Karpathy Wiki의 핵심은 &quot;한 번 만들고 끝&quot;이 아니라 &lt;b&gt;지속적으로 유지보수되는&lt;/b&gt; 것이다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;새 블로그 글 작성 &amp;rarr; 스크래핑 &amp;rarr; 요약&amp;middot;태깅
    &amp;darr;
wiki/INDEX.md 업데이트 (블로그 인덱스)
wiki/posts/ 에 md 생성 (포스트)
wiki/concepts/ 업데이트 (위키)
    &amp;darr;
Obsidian에서 지식 갭 발견 &amp;rarr; 새 블로그 글 작성 &amp;rarr; 반복&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;증분 파이프라인(&lt;code&gt;run_incremental.sh&lt;/code&gt;)이 매일 자동 실행되어, 새 글이 추가되면 인덱스와 위키가 함께 업데이트된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글 자체도 작성 후 위키에 반영될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 배운 것&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;LLM의 bookkeeping 능력&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Karpathy가 말한 대로, LLM은 &quot;읽기나 사고&quot;보다 &lt;b&gt;&quot;정리 작업(bookkeeping)&quot;&lt;/b&gt;에서 가장 큰 가치를 발휘한다. 987개 글에서 공통 주제를 추출하고, 크로스 링크를 만들고, frontmatter를 채우는 작업을 사람이 했다면 며칠이 걸렸을 것이다. Local LLM으로 30분 만에 끝났다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;품질 검증은 자동화해야 한다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM이 생성한 결과물을 그대로 쓰면 안 된다. 카테고리 오분류(27.2%), 위키링크 깨짐(815건), 무관한 참조(30건) &amp;mdash; 모두 자동 검증 스크립트로 잡았다. Rubric 기반 평가 + MOC 교차 검증의 조합이 효과적이었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;토큰 절약은 설계의 문제다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;모든 것을 LLM에 넣으면 된다&quot;는 접근은 비용과 품질 모두에서 실패한다. 어떤 단계에 LLM이 필요한지, 입력을 얼마나 줄일 수 있는지, 어떤 LLM을 쓸지를 미리 설계해야 한다. 이 프로젝트에서는 6단계 중 1단계만 LLM을 사용하고, 입력을 84% 줄이는 것으로 비용을 최소화했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;987개의 글은 내가 걸어온 길의 기록이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM Wiki는 그 기록을 &lt;b&gt;시스템으로 전환&lt;/b&gt;한 결과물이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Karpathy의 통찰처럼, 지식 시스템을 유지하는 것은 &quot;읽고 생각하는 것&quot;이 아니라 &quot;정리하는 것&quot;이 어렵다. LLM이 그 정리를 맡으면, 인간은 읽고 생각하는 것에 집중할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&quot;좋은 AI 결과는 모델이 아니라, 설계된 시스템에서 나온다.&quot;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Karpathy LLM Wiki: &lt;a href=&quot;https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f&quot;&gt;https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;샘플 프롬프트 모음 &amp;mdash; Claude Code 하네스 설계 실전 예시: &lt;a href=&quot;https://peterica.tistory.com/1061&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://peterica.tistory.com/1061&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;포트폴리오: &lt;a href=&quot;https://peterica-website.vercel.app&quot;&gt;https://peterica-website.vercel.app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 사용 기술&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Python (httpx, selectolax) &amp;mdash; 스크래핑&amp;middot;파이프라인&lt;/li&gt;
&lt;li&gt;Ollama + qwen3:8b &amp;mdash; Local LLM 개념 생성&lt;/li&gt;
&lt;li&gt;Obsidian &amp;mdash; 지식 위키 시각화&lt;/li&gt;
&lt;li&gt;Next.js 16 + react-force-graph-2d &amp;mdash; 포트폴리오 그래프 뷰&lt;/li&gt;
&lt;li&gt;Claude + Codex &amp;mdash; 하네스 오케스트레이션&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/AI코딩 | 실습</category>
      <category>Claude</category>
      <category>LLM-WIKI</category>
      <category>Obsidian</category>
      <category>ollama</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1059</guid>
      <comments>https://peterica.tistory.com/1059#entry1059comment</comments>
      <pubDate>Mon, 13 Apr 2026 00:17:06 +0900</pubDate>
    </item>
    <item>
      <title>SSH에서 쿠버네티스로 &amp;mdash; 하네스 엔지니어링이란 무엇인가</title>
      <link>https://peterica.tistory.com/1056</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI] Peterica의 AI공부와 비젼 정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 LLM을 활용한 개발 방식을 정리하다가,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;제가 프롬프트 엔지니어링과 하네스 엔지니어링을 &lt;b&gt;같은 층위의 기술&lt;/b&gt;로 착각하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;처음에 저는 하네스를 &quot;프롬프트를 잘 쓰는 기술의 확장판&quot; 정도로 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;여러 LLM 호출을 연결해서 토큰을 줄이는 요령, 그 이상도 이하도 아니라고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 실무 하네스를 뜯어보면서 이 생각이 완전히 뒤집혔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하네스는 프롬프트를 잘 쓰는 기술이 아니라, 프롬프트를 덜 쓰게 만드는 시스템 설계였다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 개발자 관점에서 제가 왜 그렇게 생각이 바뀌었는지를 정리한 글이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 질문은 하나이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;하네스 엔지니어링은 프롬프트 엔지니어링과 무엇이 본질적으로 다른가?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ SSH와 쿠버네티스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비유 하나로 시작하면,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 기존 &lt;b&gt;프롬프트 방식&lt;/b&gt;은 &lt;b&gt;SSH로 서버에 직접 들어가서 작업하는 것&lt;/b&gt;과 유사하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;매번 사람이 전체 상태를 기억하고, 필요한 명령을 직접 입력하고, 결과를 직접 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;한 번의 접속 품질이 작업 전체의 품질을 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 &lt;b&gt;하네스&lt;/b&gt;는 &lt;b&gt;쿠버네티스에 가깝다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;사용자는 &quot;무엇을 할 것인가&quot;를 선언하고, 상태는 시스템이 관리하며, 실행은 루프가 담당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;상태&amp;middot;루프&amp;middot;컨트롤러가 각각의 계층으로 분리되어 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트 엔지니어링 = 한 번 잘 질문하기&lt;br /&gt;하네스 엔지니어링 = 질문을 시스템으로 만들기&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지는 제가 처음에 가지고 있던 그림이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 실무 하네스를 하나씩 뜯어보니, 이 쿠버네티스 비유가 &lt;b&gt;절반만 맞다&lt;/b&gt;는 사실이 드러났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 상태는 하나가 아니라 계층입니다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 전환점이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 처음에 &quot;하네스의 상태는 외부 저장소 &lt;b&gt;하나&lt;/b&gt;에 두면 된다&quot;고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠버네티스의 &lt;b&gt;etcd 같은 이미지&lt;/b&gt;였다. &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;그런데 실무 하네스는 상태를 하나에 두지 않다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;삼중으로 계층화한&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #008300; color: #ffffff;&quot;&gt;계층&lt;/td&gt;
&lt;td style=&quot;background-color: #008300; color: #ffffff;&quot;&gt;저장&amp;nbsp;위치&lt;/td&gt;
&lt;td style=&quot;background-color: #008300; color: #ffffff;&quot;&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;핫 상태&lt;/td&gt;
&lt;td&gt;메모리 싱글턴&lt;/td&gt;
&lt;td&gt;세션/비용/캐시, 즉시 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;체크포인트&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;파일 / DB&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;재개&amp;middot;복구용 스냅샷&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef;&quot;&gt;감사 로그&lt;/td&gt;
&lt;td&gt;이벤트 스트림&lt;/td&gt;
&lt;td&gt;재생&amp;middot;디버깅&amp;middot;패턴 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Claude Code&lt;/b&gt;는 부트스트랩 싱글턴(세션&amp;middot;비용&amp;middot;캐시)과 34줄짜리 UI 스토어를 분리하고, 루프가 돌 때마다 &lt;b&gt;완전히 새로운 state 객체&lt;/b&gt;를 만들어낸다. 즉 상태를 &quot;불변 스냅샷&quot;으로 취급한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AutoGen&lt;/b&gt;은 &lt;code&gt;save_state()&lt;/code&gt; 결과를 JSON으로 직렬화해 파일/DB에 저장하고, TTL&amp;middot;요약 정책으로 외부 저장소 비용을 제어한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cursor&lt;/b&gt;는 초기에 &quot;공유 파일&quot;로 다중 에이전트를 조정하려다 &lt;b&gt;락 경합과 데드락&lt;/b&gt; 때문에 이 방식을 폐기한다. 대신 타임스탬프 이벤트 로그에 모든 메시지&amp;middot;명령을 기록한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;파일 vs DB vs 메모리&quot;는 이분법이 아니라 계층의 문제였다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단독&amp;middot;단기 작업이면 파일만으로 충분하고, 멀티 에이전트&amp;middot;장기 작업으로 갈수록 DB와 이벤트 로그를 더한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 루프는 자동 실행 흐름이다&amp;nbsp;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;두&amp;nbsp;번째&amp;nbsp;전환점이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;저는 처음에 &amp;ldquo;작업을 여러 단계로 잘게 나누는 게 하네스의 본질&amp;rdquo;이라고 생각했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 실제로 동작하는 구조를 보니, 본질은 분해가 아니었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;핵심은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;ldquo;언제 멈출지 정하고, 무한 반복하지 않게 제어하는 것&amp;rdquo;&lt;/b&gt;이었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;참조:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://code.claude.com/docs/en/agent-sdk/agent-loop?utm_source=chatgpt.com&quot;&gt;How&amp;nbsp;the&amp;nbsp;agent&amp;nbsp;loop&amp;nbsp;works&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;루프는 사람이 계속 프롬프트를 넣지 않아도, 작업을 이어서 실행해주는 구조이다. 대신 아무 조건 없이 돌리면 끝없이 토큰을 쓰게 되기 때문에, 반드시 종료 조건과 제한이 필요하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제가 이해한 루프는 이 정도이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;언제 작업을 끝낼지 정한다&lt;/li&gt;
&lt;li&gt;실패했을 때 다시 시도할지 결정한다&lt;/li&gt;
&lt;li&gt;너무 많은 비용을 쓰지 않도록 제한한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 세 가지를 시스템이 대신 관리한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 중요한 질문도 바뀌었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;ldquo;얼마나 잘게 나눌까?&amp;ldquo;&lt;/b&gt;가 아니라,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 각 단계가 실패해도 다시 시도할 수 있는가,&lt;br /&gt;&amp;nbsp; &amp;nbsp;- 언제 멈출지 명확한가,&lt;br /&gt;&amp;nbsp; &amp;nbsp;- 작업이 자동으로 이어질 수 있는가.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 세 가지이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;분해 단위는 이 조건을 만족하는 범위에서 가장 크게 잡는 게 맞다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;잘게 나눌수록 오히려 프롬프트 호출이 늘어나고, 토큰과 조정 비용이 더 커진다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Planner(기획)-Executor(실행)-Evaluator(평가)는 필수가 아닙니다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 번째 전환점이다. 이게 가장 충격적이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 &lt;b&gt;&quot;하네스라면 당연히 planner-executor-evaluator 3단 구조가 필요하다&quot;&lt;/b&gt;고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 업계는 이 질문에 &lt;b&gt;반으로 갈라져 있었다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LangGraph&lt;/b&gt;: Planner &amp;rarr; Executor &amp;rarr; Replan 노드 기본형. LLM 호출 수와 비용을 줄이고 전체 reasoning을 강제한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ReWOO / LLMCompiler&lt;/b&gt;: Planner가 DAG를 생성하고 Task Fetching Unit이 &lt;b&gt;병렬 실행&lt;/b&gt;, Joiner가 결과를 심사해 재계획 여부를 결정한다. Evaluator가 내장된 3단 구조이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AutoGen&lt;/b&gt;: Planner Agent + AssistantAgent + UserProxy가 Plan &amp;rarr; Act &amp;rarr; Observe 루프를 구성한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CrewAI&lt;/b&gt;: Manager-Worker 모드로 계획 LLM과 실행 LLM을 분리하거나, Flows로 선언적 파이프라인을 구성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지만 보면 3단 구조가 정답처럼 보인다. 그런데 반대 극단이 존재한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SmolAgents&lt;/b&gt;: 1,000 라인 미만 미니멀 루프 + 코드 실행형 CodeAgent로 &lt;b&gt;단일 에이전트 자율 루프&lt;/b&gt;를 지향한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OpenAI Swarm&lt;/b&gt;: Agent + handoff 함수만으로 경량 라우팅을 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cognition (Devin 개발사)&lt;/b&gt;: &quot;멀티 에이전트는 컨텍스트 손실&amp;middot;조정 실패가 잦으므로, &lt;b&gt;강한 단일 에이전트 + 컨텍스트 엔지니어링&lt;/b&gt;이 우선이다&quot;라고 공개적으로 반대 입장을 폈다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Anthropic&lt;/b&gt;: &quot;단일 에이전트 &amp;rarr; 스킬 증강 &amp;rarr; 멀티 에이전트&quot;로 &lt;b&gt;점진적 확장&lt;/b&gt;을 권장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 이렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Planner-Executor-Evaluator 3단 구조는 기본이 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본은 &lt;b&gt;&quot;강한 단일 에이전트 + 컨텍스트 엔지니어링&quot;&lt;/b&gt;으로 시작하고, &lt;b&gt;관측&amp;middot;추적&amp;middot;비용이 문제가 될 때&lt;/b&gt; planner-executor로 분리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Evaluator는 &lt;b&gt;&quot;실패를 기록하고 재계획해야 할 때&quot;&lt;/b&gt;만 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;하네스 = 멀티 에이전트&quot;는 제가 가지고 있던 잘못된 등식이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 가지 전환점을 다시 한 줄씩 정리하면 이렇다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상태는 하나가 아니라 &lt;b&gt;3계층&lt;/b&gt;이다 (핫 + 체크포인트 + 감사 로그).&lt;/li&gt;
&lt;li&gt;루프는 분해가 아니라 &lt;b&gt;종료 사유 ladder + 예산 수호자&lt;/b&gt;다.&lt;/li&gt;
&lt;li&gt;3단 구조는 기본이 아니라, &lt;b&gt;단일 에이전트로 버티다가&lt;/b&gt; 필요할 때 꺼내는 카드다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 개를 관통하는 메시지는 하나이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하네스는 프롬프트를 잘 쓰는 기술이 아니라, 프롬프트를 덜 쓰게 만드는 시스템 설계이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토큰 절약은 목적이 아니라 &lt;b&gt;결과이&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 상태를 계층화하면 매번 전체 컨텍스트를 주입할 필요가 없고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 루프가 종료 조건을 가지면 무한 재시도로 토큰을 태우지 않고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 단일 에이전트로 버티면 멀티 에이전트 조정 비용이 들지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 가지 모두 &quot;&lt;b&gt;프롬프트를 잘 쓰는 것&lt;/b&gt;&quot;과는 다른 층위의 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 차이를 이해해야 LLM을 &lt;b&gt;도구&lt;/b&gt;가 아니라 &lt;b&gt;플랫폼&lt;/b&gt;처럼 사용할 수 있다고 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트 엔지니어링이 SSH 명령어를 잘 치는 기술이라면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 하네스 엔지니어링은 명령어를 직접 치지 않아도 되는 &lt;b&gt;선언적 시스템을 설계하는 기술&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 한 가지 단서를 달아둔다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;1356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uekTM/dJMcaaSrm2x/mQJUnc5i3FAQ5nT3NW8bB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uekTM/dJMcaaSrm2x/mQJUnc5i3FAQ5nT3NW8bB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uekTM/dJMcaaSrm2x/mQJUnc5i3FAQ5nT3NW8bB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuekTM%2FdJMcaaSrm2x%2FmQJUnc5i3FAQ5nT3NW8bB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;561&quot; height=&quot;487&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;1356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 글에서 언급한 &lt;a href=&quot;https://claude-code-from-source.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;claude-code-from-source.com&lt;/a&gt;은 &lt;b&gt;역공학 기반의 비공식 자료&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 아키텍처 문서가 아니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://claude-code-from-source.com/ch03-state/&quot;&gt;Claude Code from Source Ch.3 State&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://claude-code-from-source.com/ch05-agent-loop/&quot;&gt;Claude Code from Source Ch.5 Agent Loop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://platform.claude.com/docs/en/agent-sdk/agent-loop&quot;&gt;Claude Agent SDK: Agent Loop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://microsoft.github.io/autogen/dev/user-guide/agentchat-user-guide/tutorial/state.html&quot;&gt;AutoGen State Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://autogenhub.github.io/autogen/docs/notebooks/agentchat_planning/&quot;&gt;AutoGen: Collaborative Task Solving with Planning Agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cursor.com/blog/self-driving-codebases&quot;&gt;Cursor: Self-driving Codebases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cursor.directory/plugins/context-engineering&quot;&gt;Cursor Context Engineering plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.openhands.dev/sdk/arch/agent&quot;&gt;OpenHands SDK Arch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cognition.ai/blog/closing-the-agent-loop-devin-autofixes-review-comments&quot;&gt;Cognition: Closing the Agent Loop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jxnl.co/writing/2025/09/11/why-cognition-does-not-use-multi-agent-systems/&quot;&gt;Why Cognition Does Not Use Multi-Agent Systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.langchain.com/blog/planning-agents&quot;&gt;LangChain: Planning Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.crewai.com/guides/agents/crafting-effective-agents&quot;&gt;CrewAI: Crafting Effective Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tribe.ai/applied-ai/smolagents-small-footprint-big-autonomy&quot;&gt;Tribe.ai: SmolAgents review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openai/swarm&quot;&gt;OpenAI Swarm GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://resources.anthropic.com/hubfs/Building%20Effective%20AI%20Agents-%20Architecture%20Patterns%20and%20Implementation%20Frameworks.pdf&quot;&gt;Anthropic: Building Effective AI Agents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <category>ai개발</category>
      <category>ai에이전트</category>
      <category>PETERICA</category>
      <category>프롬프트엔지니어링</category>
      <category>하네스엔지니어링</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1056</guid>
      <comments>https://peterica.tistory.com/1056#entry1056comment</comments>
      <pubDate>Fri, 10 Apr 2026 07:02:13 +0900</pubDate>
    </item>
    <item>
      <title>[AI] Autoresearch 기반 지식 진화 시스템 정리</title>
      <link>https://peterica.tistory.com/1058</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI]&amp;nbsp;Peterica의&amp;nbsp;AI공부와&amp;nbsp;비젼&amp;nbsp;정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 AI를 활용한 개발을 하면서 한 가지 고민이 반복되었다.&lt;br /&gt;&amp;ldquo;이걸 한 번 잘 만드는 게 아니라, 계속 더 잘하게 만들 수는 없을까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 프롬프트를 잘 작성하거나, 좋은 모델을 선택하는 수준에서는&lt;br /&gt;결과의 일관성과 운영 가능성을 확보하기 어렵다는 것을 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러던 중 &lt;b&gt;autoresearch 기반 접근&lt;/b&gt;을 접하게 되었고,&lt;br /&gt;이 방식이 단순한 자동화가 아니라 &lt;b&gt;지식을 계속 발전시키는 구조&lt;/b&gt;라는 점에서 인상적이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 아래 자료들이 큰 참고가 되었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/karpathy/autoresearch&quot;&gt;https://github.com/karpathy/autoresearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/oh-my-claudecode&quot;&gt;https://github.com/oh-my-claudecode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openclaw-autoresearch&quot;&gt;https://github.com/openclaw-autoresearch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 위 내용을 기반으로&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;ldquo;자동으로 발전하는 시스템&amp;rdquo;이 무엇인지 정리하고,&lt;br /&gt;&amp;nbsp; &amp;nbsp;실제 어떻게 적용할 수 있을지에 대해 정리해본다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 기존 방식의 한계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 일반적으로 지식을 다루는 방식은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서를 작성한다&lt;/li&gt;
&lt;li&gt;사람이 판단한다&lt;/li&gt;
&lt;li&gt;필요할 때 다시 참고한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 경험은 쌓이지만,&lt;br /&gt;다음과 같은 문제가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과가 반복되지 않는다&lt;/li&gt;
&lt;li&gt;품질이 사람에 의존한다&lt;/li&gt;
&lt;li&gt;개선이 구조화되지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;지식이 쌓이긴 하지만 발전하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 새로운 관점 &amp;mdash; 지식은 &amp;ldquo;상태&amp;rdquo;다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;autoresearch를 보면서 가장 크게 바뀐 관점은 이것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지식은 문서가 아니라, 계속 개선되는 상태다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 관점에서 지식은 다음과 같이 정의된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지식 = 평가 기준 + 현재 상태&lt;/li&gt;
&lt;li&gt;지식은 반복을 통해 개선된다&lt;/li&gt;
&lt;li&gt;지식은 고정된 것이 아니라 변화한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ autoresearch의 핵심 구조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;autoresearch의 구조는 매우 단순하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mutate &amp;rarr; evaluate &amp;rarr; select &amp;rarr; repeat&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mutate: 다양한 시도 생성&lt;/li&gt;
&lt;li&gt;evaluate: 결과 평가&lt;/li&gt;
&lt;li&gt;select: 좋은 결과 선택&lt;/li&gt;
&lt;li&gt;repeat: 반복&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조는 진화 알고리즘과 유사하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은 &amp;ldquo;한 번 잘 만드는 것&amp;rdquo;이 아니라&lt;br /&gt;&lt;b&gt;&amp;ldquo;반복을 통해 더 나아지는 것&amp;rdquo;&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 시스템 구성 관점에서의 이해&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조를 시스템으로 보면 3가지 레이어로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 방법론 (autoresearch)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지식을 어떻게 발전시킬 것인가&lt;/li&gt;
&lt;li&gt;반복 구조 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② 실행 엔진 (openclaw-autoresearch)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로 지식을 개선&lt;/li&gt;
&lt;li&gt;SKILL.md + eval.json 기반 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ 오케스트레이션 (oh-my-claudecode)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 작업을 동시에 수행&lt;/li&gt;
&lt;li&gt;agent 기반 workflow 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 가지가 결합되면&lt;br /&gt;&lt;b&gt;&amp;ldquo;지식을 자동으로 발전시키는 시스템&amp;rdquo;&lt;/b&gt;이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 자동으로 발전하는 시스템이란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 이런 구조다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;[문제 정의]&lt;br /&gt;&amp;rarr; agent 실행&lt;br /&gt;&amp;rarr; 반복 평가&lt;br /&gt;&amp;rarr; 개선&lt;br /&gt;&amp;rarr; 축적&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 포인트는 두 가지다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;평가 기준이 존재한다 (eval)&lt;/li&gt;
&lt;li&gt;반복이 자동화되어 있다 (loop)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사람이 직접 개선하지 않아도 되고&lt;/li&gt;
&lt;li&gt;시스템이 스스로 더 나아진다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ OSS 검증에 적용해보기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조를 현재 하고 있는 OSS 검증에 적용해보면 의미가 명확해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존 방식:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사람이 license 확인&lt;/li&gt;
&lt;li&gt;케이스마다 판단&lt;/li&gt;
&lt;li&gt;경험에 의존&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;적용 방식:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇSKILL.md&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;license 판단 로직 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ eval.json&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정확도&lt;/li&gt;
&lt;li&gt;risk 기준&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ loop&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다양한 케이스 반복&lt;/li&gt;
&lt;li&gt;결과 비교&lt;/li&gt;
&lt;li&gt;최적 로직 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검증 로직이 점점 더 정교해진다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 단순 자동화가 아니라&lt;br /&gt;&lt;b&gt;검증 시스템 자체가 성장하는 구조&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 핵심 인사이트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조를 이해하면서 얻은 가장 큰 인사이트는 이것이다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;측정할 수 있어야 개선된다&lt;/li&gt;
&lt;li&gt;반복이 없으면 지식이 아니다&lt;/li&gt;
&lt;li&gt;실패는 버리는 것이 아니라 데이터다&lt;/li&gt;
&lt;li&gt;제약이 있어야 성능이 나온다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;autoresearch는 단순한 도구가 아니라&lt;br /&gt;&lt;b&gt;지식을 다루는 방식 자체를 바꾸는 개념&lt;/b&gt;이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;autoresearch &amp;rarr; 방법론&lt;/li&gt;
&lt;li&gt;openclaw &amp;rarr; 실행 엔진&lt;/li&gt;
&lt;li&gt;oh-my-claudecode &amp;rarr; 운영 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 한 문장으로 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI를 사용하는 것이 아니라&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; AI가 스스로 더 잘하게 되는 시스템을 만든다&lt;/b&gt;&lt;/p&gt;</description>
      <category>AI</category>
      <category>autoresearch</category>
      <category>OSS</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1058</guid>
      <comments>https://peterica.tistory.com/1058#entry1058comment</comments>
      <pubDate>Thu, 9 Apr 2026 22:45:40 +0900</pubDate>
    </item>
    <item>
      <title>AI를 잘 운영하는 개발자로 성장하기</title>
      <link>https://peterica.tistory.com/1054</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI]&amp;nbsp;Peterica의&amp;nbsp;AI공부와&amp;nbsp;비젼&amp;nbsp;정리&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Backend + SRE 엔지니어가 AI 시스템의 운영 문제를 해결하는 과정&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 모든 팀이 AI를 도입한다.&lt;br /&gt;ChatGPT API를 붙이고, RAG를 만들고, Agent를 설계한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 한 가지 빠져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;그걸 어떻게 운영할 건데?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 Backend와 SRE를 해온 엔지니어다.&lt;br /&gt;서비스를 만드는 것보다 &lt;b&gt;돌아가게 만드는 것&lt;/b&gt;이 얼마나 어려운지 안다.&lt;br /&gt;AI 시스템도 마찬가지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 내가 AI 시스템의 운영 문제를 어떻게 이해하고,&lt;br /&gt;어떤 방식으로 해결하고 있는지를 정리한 글이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ AI 시스템은 왜 운영이 안 되는가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI를 도입하면 네 가지 문제가 반복된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 결과가 매번 다르다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 질문을 해도 답이 다르다.&lt;br /&gt;모델을 바꾸면 품질이 바뀐다.&lt;br /&gt;프롬프트 한 줄이 달라지면 결과가 완전히 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 소프트웨어에서는 있을 수 없는 일이다.&lt;br /&gt;하지만 AI 시스템에서는 &lt;b&gt;이것이 기본 상태&lt;/b&gt;다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 틀려도 나아지지 않는다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 시스템이 틀린 답을 했다.&lt;br /&gt;사용자가 떠났다.&lt;br /&gt;그리고 다음 날, 같은 질문에 같은 틀린 답을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실패가 수집되지 않고, 피드백 루프가 없기 때문이다.&lt;br /&gt;&lt;b&gt;시간이 지나도 품질이 그대로다.&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 사람이 빠지면 멈춘다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검증을 사람이 한다.&lt;br /&gt;판단 기준이 사람 머릿속에만 있다.&lt;br /&gt;그 사람이 휴가를 가면 프로세스가 멈춘다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI를 도입했는데, 실행 구조는 여전히 수동이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 경험이 쌓이지 않는다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI와 대화한 결과는 어디로 가는가?&lt;br /&gt;대부분 사라진다.&lt;br /&gt;같은 작업을 반복하고, 같은 실수를 반복한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;경험이 시스템 자산이 되지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 나는 이걸 어떻게 풀고 있는가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 이 문제들을 Backend + SRE 관점에서 접근한다.&lt;br /&gt;AI를 &quot;도구&quot;가 아니라 &lt;b&gt;&quot;운영해야 할 시스템&quot;&lt;/b&gt;으로 본다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;비결정성 &amp;rarr; 구조로 통제한다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 결과가 흔들리는 이유는 단순하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택지가 너무 많기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결: 입력을 구조화하고, 출력의 범위를 제한한다.&lt;br /&gt;모델이 바뀌어도 결과가 같도록 &lt;b&gt;시스템으로 통제&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 Harness Engineering의 핵심이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 AI 결과는 모델이 아니라, 설계된 시스템에서 나온다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 관련 글&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1. &lt;a href=&quot;https://peterica.tistory.com/1043&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;개발자가 직접 만드는 Agent Harness&lt;/a&gt;&lt;br /&gt;&amp;nbsp;2. &lt;a href=&quot;https://peterica.tistory.com/1049&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI를 잘 쓰는 게 아니라, AI를 통제해야 한다&lt;/a&gt;&lt;br /&gt;&amp;nbsp;3. &lt;a href=&quot;https://peterica.tistory.com/1050&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI를 다루는 방법의 진화 (Prompt &amp;rarr; Context &amp;rarr; Harness &amp;rarr; AIOps)&lt;/a&gt;&lt;br /&gt;&amp;nbsp;4. &lt;a href=&quot;https://peterica.tistory.com/1051&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;하네스는 시스템을 설계하는 일이다&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 운영 부재 &amp;rarr; 실패를 개선 루프로 연결한다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 시스템이 틀린 답을 했으면,&lt;br /&gt;그 실패는 &lt;b&gt;다음 개선의 트리거&lt;/b&gt;가 되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 이런 구조를 설계했다:&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;질문 &amp;rarr; 응답 &amp;rarr; 실패 감지 &amp;rarr; 지식 개선 &amp;rarr; 재인덱싱 &amp;rarr; 품질 향상&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답(rag-chat), 관찰(rag-monitor), 지식관리(rag-kms)를 분리하여&lt;br /&gt;&lt;b&gt;시간이 지날수록 품질이 좋아지는 RAG 시스템&lt;/b&gt;을 설계했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; (구현 완료 후 링크 추가 예정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;자동화 부재 &amp;rarr; Agent + Policy Gate&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복 검증을 사람이 하지 않아도 되는 구조.&lt;br /&gt;Agent가 역할별로 분리되고, Policy Gate를 통과해야만 결과가 확정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Evidence 없는 판단은 금지.&lt;br /&gt;자동 확정도 금지.&lt;br /&gt;&lt;b&gt;구조가 판단하고, 사람은 검토한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;지식 소멸 &amp;rarr; 구조 기반 축적&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI와의 대화 결과가 사라지지 않도록,&lt;br /&gt;컨텍스트를 파일 단위로 분리하고 구조화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자유 텍스트가 아니라 &lt;b&gt;섹션 기반 구조&lt;/b&gt;를 강제하여&lt;br /&gt;누가 봐도 이해할 수 있는 형태로 지식을 축적한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; (Context Note 완성 후 링크 추가 예정)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;경력 경로: 왜 내가 이 문제를 푸는가&lt;/h4&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;Backend Engineer (서비스 구조)
   &amp;darr;
DevOps (자동화, 파이프라인)
   &amp;darr;
SRE (안정성, 관측성, 장애 대응)
   &amp;darr;
AI Native Engineer (AI 시스템 설계 + 운영)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 단계에서 배운 것이 다음 단계의 기반이 됐다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Backend에서 &lt;b&gt;서비스 구조 설계&lt;/b&gt;를 배웠다&lt;/li&gt;
&lt;li&gt;DevOps에서 &lt;b&gt;자동화와 파이프라인&lt;/b&gt;을 배웠다&lt;/li&gt;
&lt;li&gt;SRE에서 &lt;b&gt;안정성과 관측성&lt;/b&gt;을 배웠다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 지금, 이 모든 경험이 &lt;b&gt;AI 시스템을 운영 가능하게 만드는 문제&lt;/b&gt;로 수렴되고 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 프로젝트&lt;/h4&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;프로젝트&lt;/td&gt;
&lt;td&gt;해결하는 문제&lt;/td&gt;
&lt;td&gt;상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://llm-study-web.vercel.app/&quot;&gt;LLM System Lab&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;AI를 시스템으로 이해하기&lt;/td&gt;
&lt;td&gt;완료, &lt;a href=&quot;https://github.com/peterica/llm-study-web&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;git&lt;/a&gt;, &lt;a href=&quot;https://llm-study-web.vercel.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;vercel&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harness Engineering&lt;/td&gt;
&lt;td&gt;AI 출력의 비결정성 통제&lt;/td&gt;
&lt;td&gt;블로그 발행 완료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG Platform&lt;/td&gt;
&lt;td&gt;실패해도 개선되지 않는 RAG&lt;/td&gt;
&lt;td&gt;설계&amp;nbsp;완료,&amp;nbsp;구현&amp;nbsp;중&amp;nbsp;&amp;rarr;&amp;nbsp;구현&amp;nbsp;완료&amp;nbsp;(모니터링&amp;nbsp;+&amp;nbsp;지식&amp;nbsp;개선&amp;nbsp;루프)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ContextChat&lt;/td&gt;
&lt;td&gt;RAG를&amp;nbsp;서비스로&amp;nbsp;제공하기&lt;/td&gt;
&lt;td&gt;구현&amp;nbsp;완료&amp;nbsp;(멀티테넌트&amp;nbsp;+&amp;nbsp;Citation&amp;nbsp;검증)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IntentFlow&lt;/td&gt;
&lt;td&gt;LLM&amp;nbsp;의존&amp;nbsp;최소화&amp;nbsp;+&amp;nbsp;파이프라인&amp;nbsp;통제&lt;/td&gt;
&lt;td&gt;구현 완료 (의도 정확도 87%),&amp;nbsp;&lt;a href=&quot;https://github.com/peterica/intentflow&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;git&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&amp;nbsp;Note&lt;/td&gt;
&lt;td&gt;지식이 축적되지 않는 문제&lt;/td&gt;
&lt;td&gt;구현 완료 (구조 기반 위키), &lt;a href=&quot;https://peterica.tistory.com/1048&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;tistory&lt;/a&gt;, &lt;a href=&quot;https://github.com/peterica/context-note&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;git&lt;/a&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;마치며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI를 잘 쓰는 시대는 이미 왔다.&lt;br /&gt;다음은 &lt;b&gt;AI를 잘 운영하는 시대&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 그 문제를 풀고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;이 글은 프로젝트가 완성될 때마다 업데이트됩니다.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;마지막 업데이트: 2026-04-05&lt;/i&gt;&lt;/p&gt;</description>
      <category>AI</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1054</guid>
      <comments>https://peterica.tistory.com/1054#entry1054comment</comments>
      <pubDate>Thu, 9 Apr 2026 16:36:58 +0900</pubDate>
    </item>
    <item>
      <title>sourcetree 커스텀액션 이용해서 인텔리제이 실행하기</title>
      <link>https://peterica.tistory.com/1053</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 프로젝트를 동시에 관리하다 보면&lt;br /&gt;SourceTree에서 특정 프로젝트를 선택한 뒤 바로 IntelliJ로 열고 싶은 경우가 많다.&lt;br /&gt;이&amp;nbsp;글에서는&amp;nbsp;SourceTree&amp;nbsp;커스텀&amp;nbsp;액션을&amp;nbsp;이용하여&amp;nbsp;선택한&amp;nbsp;repository를&amp;nbsp;IntelliJ로&amp;nbsp;바로&amp;nbsp;실행하는&amp;nbsp;방법을&amp;nbsp;정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 커스텀 액션 추가 방법&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TaA31/dJMcahw9SyR/NS8EEU3HnFk5zsMRsqHrp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TaA31/dJMcahw9SyR/NS8EEU3HnFk5zsMRsqHrp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TaA31/dJMcahw9SyR/NS8EEU3HnFk5zsMRsqHrp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTaA31%2FdJMcahw9SyR%2FNS8EEU3HnFk5zsMRsqHrp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;624&quot; height=&quot;628&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;커스텀 액션 &amp;gt; 편집&lt;/b&gt;으로 이동한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tytj9/dJMcafsx2p7/39KkEmTxekmoZbhRr68QvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tytj9/dJMcafsx2p7/39KkEmTxekmoZbhRr68QvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tytj9/dJMcafsx2p7/39KkEmTxekmoZbhRr68QvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftytj9%2FdJMcafsx2p7%2F39KkEmTxekmoZbhRr68QvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;855&quot; height=&quot;397&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 메뉴 설명에 원하는 이름을 적는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 실행할 스트립트&lt;/p&gt;
&lt;pre id=&quot;code_1775100347683&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/Applications/IntelliJ IDEA.app/Contents/MacOS/idea&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 인자는 $REPO&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ㅁ 인텔리 실행&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wp92o/dJMcahjDXiM/KV0xqtYi2iS3hBAcVj5foK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wp92o/dJMcahjDXiM/KV0xqtYi2iS3hBAcVj5foK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wp92o/dJMcahjDXiM/KV0xqtYi2iS3hBAcVj5foK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWp92o%2FdJMcahjDXiM%2FKV0xqtYi2iS3hBAcVj5foK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;624&quot; height=&quot;628&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;커스텀 액션 &amp;gt; 인텔리 실행&lt;/b&gt;을 클릭하면 해당 프로젝트를 볼 수 있다.&lt;/p&gt;</description>
      <category>개발이야기</category>
      <category>PETERICA</category>
      <category>sourcetree</category>
      <category>인텔리제이</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1053</guid>
      <comments>https://peterica.tistory.com/1053#entry1053comment</comments>
      <pubDate>Thu, 2 Apr 2026 12:29:53 +0900</pubDate>
    </item>
    <item>
      <title>LLM은 언제 &amp;lsquo;기억&amp;rsquo;하는가 &amp;mdash; RAG를 넘어서 D2L까지</title>
      <link>https://peterica.tistory.com/1052</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI]&amp;nbsp;Peterica의&amp;nbsp;AI공부와&amp;nbsp;비젼&amp;nbsp;정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Sakana AI의 &lt;a href=&quot;https://github.com/SakanaAI/doc-to-lora?tab=readme-ov-file&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Doc-to-LoRA(D2L)&lt;/a&gt; 프로젝트를 살펴보면서, 기존에 내가 익숙하게 사용하던 RAG 구조를 다시 생각하게 되었다.&lt;br /&gt;문서를 검색해서 프롬프트에 붙이는 방식이 아니라, &lt;b&gt;문서를 모델 내부에 반영한다는 접근&lt;/b&gt;은 단순한 개선이 아니라 방향 자체가 다르게 느껴졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 특히 인상적이었던 점은,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식이 DB의 옵티마이저처럼 &amp;ldquo;실행 전에 구조를 바꿔 효율을 높인다&amp;rdquo;는 점에서는 유사하지만,&lt;br /&gt;결과적으로는 단순한 성능 개선이 아니라 &lt;b&gt;결과 자체를 바꾼다&lt;/b&gt;는 점에서 전혀 다른 레벨의 기술이라는 것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 그 차이를 이해하기 위해 정리한 개인적인 학습 기록이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 우리가 익숙한 방식 &amp;mdash; RAG는 무엇을 하고 있는가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 LLM 시스템은 대부분 RAG 구조를 따른다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;질문 &amp;rarr; 벡터DB 검색 &amp;rarr; 관련 문서 선택 &amp;rarr; 프롬프트에 삽입 &amp;rarr; LLM 응답
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조의 핵심은 명확하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;LLM은 아무것도 기억하지 않는다. &lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;필요한 정보를 매번 외부에서 가져온다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 매우 실용적이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최신 데이터 반영 가능&lt;/li&gt;
&lt;li&gt;근거 추적 가능&lt;/li&gt;
&lt;li&gt;구현이 비교적 단순&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 한계도 분명하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;retrieval 실패 &amp;rarr; 잘못된 답변&lt;/li&gt;
&lt;li&gt;context 길이 제한&lt;/li&gt;
&lt;li&gt;프롬프트 길이 증가 &amp;rarr; 비용/속도 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, RAG는 결국 &lt;b&gt;&amp;ldquo;찾는 문제&amp;rdquo;&lt;/b&gt;를 해결하는 구조다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 질문의 전환 &amp;mdash; &amp;ldquo;찾지 말고 기억하게 할 수 없을까?&amp;rdquo;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 자연스럽게 다음 질문이 나온다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;문서를 매번 찾지 말고, 모델이 직접 기억하게 만들 수는 없을까?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 질문에 대한 하나의 답이 바로 D2L이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ D2L의 핵심 &amp;mdash; 문서를 &amp;lsquo;모델로 변환한다&amp;rsquo;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D2L의 구조를 단순화하면 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;문서 &amp;rarr; LoRA weight 생성 &amp;rarr; 모델에 주입 &amp;rarr; 이후 응답 변화
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 더 정확히 표현하면:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문서를&amp;nbsp;입력하면,&amp;nbsp;그&amp;nbsp;문서에&amp;nbsp;맞는&amp;nbsp;LoRA(weight&amp;nbsp;변화)를&amp;nbsp;생성하여&lt;/b&gt;&lt;br /&gt;&lt;b&gt;모델을 즉석에서 튜닝한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 중요한 점은 다음이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학습(training)이 아니다&lt;/li&gt;
&lt;li&gt;gradient descent가 없다&lt;/li&gt;
&lt;li&gt;데이터셋이 필요 없다&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;문서를 학습하는 것이 아니라, 문서를 모델 구조로 변환한다&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅁ 오해하기 쉬운 부분 &amp;mdash; 캐시나 DB가 아니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 보면 D2L은 캐시처럼 보인다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서를 넣고&lt;/li&gt;
&lt;li&gt;이후에 영향을 준다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로는 완전히 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RAG / Vector DB&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장 &amp;rarr; 검색 &amp;rarr; 가져오기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Redis&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;key &amp;rarr; value 조회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;D2L&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서 &amp;rarr; 모델 weight 변경 &amp;rarr; 생성 방식 변화&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보를 꺼내는 구조가 아니라&lt;br /&gt;모델의 해석 방식 자체를 바꾼다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ DB 옵티마이저와의 비교 &amp;mdash; 비슷하지만 결정적으로 다르다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 지점에서 DB 옵티마이저와의 유사성이 떠올랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ㅇ &lt;b&gt;공통점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 전에 구조를 바꾼다&lt;/li&gt;
&lt;li&gt;중간 결과(LoRA / execution plan)를 만든다&lt;/li&gt;
&lt;li&gt;성능 향상을 목표로 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 결정적인 차이가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;DB 옵티마이저&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 더 빠르게 읽기 위한 실행 전략&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과는 동일해야 함&lt;/li&gt;
&lt;li&gt;연산 순서만 바뀜&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ&amp;nbsp;&lt;b&gt;D2L&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 자체를 바꿔 결과를 바꾸는 방식&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;attention 구조 변화&lt;/li&gt;
&lt;li&gt;표현 방식 변화&lt;/li&gt;
&lt;li&gt;결과 자체가 달라질 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵티마이저는 &amp;ldquo;길을 바꾸는 것&amp;rdquo;이고&lt;br /&gt;D2L은 &amp;ldquo;생각하는 방식을 바꾸는 것&amp;rdquo;이다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ &amp;ldquo;세션 기반 LLM 튜닝&amp;rdquo;이라는 관점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D2L을 가장 직관적으로 표현하면 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 단위로 LLM을 튜닝하는 방식&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에서도 이 특징이 드러난다.&lt;/p&gt;
&lt;pre class=&quot;stan&quot;&gt;&lt;code&gt;model.internalize(doc)  # 적용
model.reset()           # 원복
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필요할 때 모델을 바꾸고&lt;/li&gt;
&lt;li&gt;필요 없으면 원래 상태로 돌아간다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 기존 Fine-tuning과는 완전히 다르다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 95px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Fine-tuning&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;D2L&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;방식&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;학습&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;지속성&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;영구&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;일시적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;비용&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;높음&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;속도&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;느림&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;즉시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 이 방식이 중요한가&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM을 &amp;ldquo;고정된 모델&amp;rdquo;이 아니라&lt;br /&gt;상황에 따라 변하는 시스템으로 만든다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RAG &amp;rarr; 외부 기억&lt;/li&gt;
&lt;li&gt;Fine-tuning &amp;rarr; 장기 기억&lt;/li&gt;
&lt;li&gt;D2L &amp;rarr; 단기/즉시 기억&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이라는 구조가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 실무 관점 &amp;mdash; 대체가 아니라 조합&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은 D2L이 RAG를 대체하지 않는다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할이 다르다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RAG &amp;rarr; 찾는 문제 (recall)&lt;/li&gt;
&lt;li&gt;D2L &amp;rarr; 이해하는 문제 (interpretation)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현실적인 구조는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;RAG &amp;rarr; 전체 정보 탐색
D2L &amp;rarr; 핵심 문서 내부화
Fine-tuning &amp;rarr; 기본 능력 강화
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LICENSE 원문 &amp;rarr; RAG로 확보&lt;/li&gt;
&lt;li&gt;LICENSE 해석 &amp;rarr; D2L로 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 개인적인 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 D2L을 보면서 가장 크게 느낀 점은 이것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM의 발전은 &amp;ldquo;더 큰 모델&amp;rdquo;이 아니라&lt;br /&gt;&amp;ldquo;모델을 어떻게 다루느냐&amp;rdquo;의 문제로 이동하고 있다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 D2L은 그 흐름에서 중요한 신호처럼 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직은 연구 단계에 가깝지만,&lt;br /&gt;Agent, Memory, Personalization 영역에서는&lt;br /&gt;굉장히 큰 변화를 만들 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 &amp;ldquo;문서를 찾아서 읽는 방식&amp;rdquo;이고&lt;br /&gt;D2L은 &amp;ldquo;문서를 읽고 모델을 바꾸는 방식&amp;rdquo;이다&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>D2L</category>
      <category>PETERICA</category>
      <category>Rag</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1052</guid>
      <comments>https://peterica.tistory.com/1052#entry1052comment</comments>
      <pubDate>Mon, 30 Mar 2026 12:49:09 +0900</pubDate>
    </item>
    <item>
      <title>하네스는 모델을 보완하는 게 아니라, 시스템을 설계하는 일이다</title>
      <link>https://peterica.tistory.com/1051</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI]&amp;nbsp;Peterica의&amp;nbsp;AI공부와&amp;nbsp;비젼&amp;nbsp;정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;최근 Anthropic의 &amp;ldquo;&lt;a href=&quot;https://www.anthropic.com/engineering/harness-design-long-running-apps&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Harness design for long-running application development&lt;/a&gt;&amp;rdquo; 글을 읽었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하네스 엔지니어링을 공부하는 입장에서 꽤 인상적인 글이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 &amp;ldquo;에이전트를 잘 만드는 방법&amp;rdquo;이 아니라,&lt;br /&gt;&lt;b&gt;모델의 한계를 어떻게 시스템적으로 다루는가&lt;/b&gt;에 대한 이야기였기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 문제: 모델은 생각보다 쉽게 무너진다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글에서 가장 공감된 부분은 이거다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 작업에서 모델은 결국 망가진다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨텍스트가 길어지면 일관성이 깨진다&lt;/li&gt;
&lt;li&gt;스스로 평가하면 항상 &amp;ldquo;잘했다&amp;rdquo;고 한다&lt;/li&gt;
&lt;li&gt;복잡한 작업에서는 중간에 방향을 잃는다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 내가 직접 실험하면서도 느꼈던 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 &amp;ldquo;self-evaluation 문제&amp;rdquo;는 명확했다.&lt;br /&gt;모델은 절대 자기 작업을 제대로 비판하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 포인트는 하나였다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❗ 문제는 모델이 아니라 구조다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 구조: 하네스는 역할 분리다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서 제시한 핵심 구조는 단순하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Planner&lt;/li&gt;
&lt;li&gt;Generator&lt;/li&gt;
&lt;li&gt;Evaluator&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 그냥 멀티 에이전트 구조가 아니다.&lt;br /&gt;&lt;b&gt;&amp;ldquo;책임을 분리한 구조&amp;rdquo;&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Generator&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 실제로 무언가를 만든다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Evaluator&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 만든 것을 깨려고 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Planner&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 방향을 정의한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Generator는 절대 판단하지 않는다&lt;br /&gt;Evaluator는 절대 만들지 않는다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 분리가 만들어내는 효과는 명확하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;self-bias 제거&lt;/li&gt;
&lt;li&gt;반복 개선 루프 생성&lt;/li&gt;
&lt;li&gt;품질 기준 명확화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 보고 느낀 건 하나였다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하네스는 &amp;ldquo;프롬프트 기술&amp;rdquo;이 아니라&lt;br /&gt;조직 구조 설계에 가깝다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 핵심 인사이트: 좋은 기준이 없으면 개선도 없다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드 디자인 실험 부분이 특히 흥미로웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이 디자인이 좋은가?&amp;rdquo;&lt;br /&gt;&amp;rarr; 모델은 답을 못 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 기준을 이렇게 바꾼다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Design quality&lt;/li&gt;
&lt;li&gt;Originality&lt;/li&gt;
&lt;li&gt;Craft&lt;/li&gt;
&lt;li&gt;Functionality&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;추상적 질문 &amp;rarr; 측정 가능한 기준으로 변환&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 하네스 설계에서 굉장히 중요한 포인트다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델은 생각하지 않는다&lt;br /&gt;모델은 &amp;ldquo;기준에 맞춰 반응&amp;rdquo;한다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 성능을 끌어올리는 핵심은&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 프롬프트가 아니라&lt;br /&gt;좋은 평가 기준이다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 또 하나의 핵심: Context Reset vs Compaction&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서 기술적으로 가장 인상 깊었던 부분은 이거다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Compaction &amp;rarr; 요약해서 이어가기&lt;/li&gt;
&lt;li&gt;Reset &amp;rarr; 아예 새로 시작 + 상태 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론은 명확했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reset이 더 강력하다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 꽤 반직관적이다.&lt;br /&gt;보통은 &amp;ldquo;연속성 유지&amp;rdquo;가 좋다고 생각하니까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;context 불안 제거&lt;/li&gt;
&lt;li&gt;오염된 상태 초기화&lt;/li&gt;
&lt;li&gt;더 안정적인 장기 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 보면서 느낀 건&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하네스는 &amp;ldquo;메모리를 유지하는 기술&amp;rdquo;이 아니라&lt;br /&gt;언제 버릴지 결정하는 기술이다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 실무 관점에서의 깨달음&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 읽고 내 생각이 바뀐 부분은 명확하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ 기존 생각&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프롬프트를 잘 짜면 된다&lt;/li&gt;
&lt;li&gt;모델이 좋아지면 해결된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 바뀐 생각&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구조가 없으면 무조건 망한다&lt;/li&gt;
&lt;li&gt;모델은 구조 안에서만 성능이 나온다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 가장 중요한 한 줄:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하네스는 모델을 보완하는 게 아니라&lt;br /&gt;모델을 &amp;ldquo;일하게 만드는 환경&amp;rdquo;이다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 읽고 느낀 건 단순하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 중요한 건&lt;br /&gt;&amp;ldquo;모델을 어떻게 쓰느냐&amp;rdquo;가 아니라 &amp;ldquo;어떤 구조로 일하게 하느냐&amp;rdquo;다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하네스 엔지니어링은 아직 초기 단계지만,&amp;nbsp;확실히 다음 단계의 개발 방식이라는 느낌이 든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/AI코딩 | 실습</category>
      <category>ai개발</category>
      <category>autotask</category>
      <category>PETERICA</category>
      <category>멀티에이전트</category>
      <category>하네스엔지니어링</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1051</guid>
      <comments>https://peterica.tistory.com/1051#entry1051comment</comments>
      <pubDate>Sun, 29 Mar 2026 12:48:12 +0900</pubDate>
    </item>
    <item>
      <title>AI를 다루는 방법의 진화(Prompt &amp;rarr; Context &amp;rarr; Harness &amp;rarr; AIOps)</title>
      <link>https://peterica.tistory.com/1050</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI]&amp;nbsp;Peterica의&amp;nbsp;AI공부와&amp;nbsp;비젼&amp;nbsp;정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI를 활용하는 방식은 단순한 &amp;ldquo;질문&amp;rdquo;에서 시작했지만,&lt;br /&gt;점점 더 &lt;b&gt;구조화되고, 시스템화되고, 운영 자동화 단계&lt;/b&gt;로 진화하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문서는 AI를 다루는 방식을&lt;br /&gt;&lt;b&gt;4단계 진화 구조&lt;/b&gt;로 정리한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 전체 구조&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prompt &amp;rarr; Context &amp;rarr; Harness &amp;rarr; AIOps&lt;br /&gt;= 요청 &amp;rarr; 이해 &amp;rarr; 검증 &amp;rarr; 운영&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Prompt Engineering&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;AI에게 잘 말하는 단계&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;핵심: 질문, 지시문, 포맷 설계&lt;/li&gt;
&lt;li&gt;목표: 원하는 출력 유도&lt;/li&gt;
&lt;li&gt;특징:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문장 구조에 의존&lt;/li&gt;
&lt;li&gt;결과 변동성 큼&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  한 줄 정의&lt;br /&gt;&amp;rarr; &amp;ldquo;좋은 답을 얻기 위해 잘 묻는 기술&amp;rdquo;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Context Engineering&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;AI가 이해할 수밖에 없는 상태를 만드는 단계&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;핵심: 정보, 역할, 히스토리, 환경 구성&lt;/li&gt;
&lt;li&gt;목표: 일관된 이해 기반 제공&lt;/li&gt;
&lt;li&gt;구성 요소:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Memory (대화/지식)&lt;/li&gt;
&lt;li&gt;Role (페르소나)&lt;/li&gt;
&lt;li&gt;Data (문서, RAG)&lt;/li&gt;
&lt;li&gt;Environment (상태)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  한 줄 정의&lt;br /&gt;&amp;rarr; &amp;ldquo;AI의 사고 환경을 설계하는 기술&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Harness Engineering&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;결과를 통제하고 검증하는 단계&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;핵심: 평가, 테스트, 기준 정의&lt;/li&gt;
&lt;li&gt;목표: 모델이 달라도 동일한 결과 확보&lt;/li&gt;
&lt;li&gt;구성 요소:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Test Case&lt;/li&gt;
&lt;li&gt;Evaluation Metric&lt;/li&gt;
&lt;li&gt;Feedback Loop&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  한 줄 정의&lt;br /&gt;&amp;rarr; &amp;ldquo;결과의 품질을 보장하는 시스템&amp;rdquo;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ AIOps&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;AI가 시스템을 운영하는 단계&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;핵심: 자동화, 모니터링, 대응&lt;/li&gt;
&lt;li&gt;목표: 지속적인 운영 최적화&lt;/li&gt;
&lt;li&gt;수행 역할:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이상 탐지&lt;/li&gt;
&lt;li&gt;자동 대응&lt;/li&gt;
&lt;li&gt;성능 최적화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  한 줄 정의&lt;br /&gt;&amp;rarr; &amp;ldquo;AI가 시스템을 계속 굴리게 만드는 것&amp;rdquo;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 단계별 차이 요약&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;단계&lt;/td&gt;
&lt;td&gt;초점&lt;/td&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt&lt;/td&gt;
&lt;td&gt;입력&lt;/td&gt;
&lt;td&gt;말하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;이해&lt;/td&gt;
&lt;td&gt;환경 설계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harness&lt;/td&gt;
&lt;td&gt;품질&lt;/td&gt;
&lt;td&gt;검증/통제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AIOps&lt;/td&gt;
&lt;td&gt;운영&lt;/td&gt;
&lt;td&gt;자동 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 구조적 해석&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 4단계는 단순 기술 구분이 아니라&lt;br /&gt;&lt;b&gt;AI 시스템 성숙도의 단계&lt;/b&gt;이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Prompt: 개인 사용 수준&lt;/li&gt;
&lt;li&gt;Context: 시스템 설계 시작&lt;/li&gt;
&lt;li&gt;Harness: 제품/서비스 수준&lt;/li&gt;
&lt;li&gt;AIOps: 운영 시스템 수준&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 활용은 더 이상 &amp;ldquo;잘 물어보기&amp;rdquo;에 머무르지 않는다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;결국&amp;nbsp;핵심은&amp;nbsp;&quot;AI를&amp;nbsp;어떻게&amp;nbsp;통제하고,&amp;nbsp;어떻게&amp;nbsp;운영할&amp;nbsp;것인가&quot;이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름을 이해하면&lt;br /&gt;단순 활용자에서 &amp;rarr; &lt;b&gt;AI 시스템 설계자&lt;/b&gt;로 전환할 수 있다.&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>AI</category>
      <category>aiops</category>
      <category>AI시스템</category>
      <category>AI아키텍처</category>
      <category>AI활용</category>
      <category>LLM</category>
      <category>PETERICA</category>
      <category>생성형AI</category>
      <category>하네스엔지니어링</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1050</guid>
      <comments>https://peterica.tistory.com/1050#entry1050comment</comments>
      <pubDate>Wed, 25 Mar 2026 16:36:26 +0900</pubDate>
    </item>
    <item>
      <title>AI를 잘 쓰는 게 아니라, AI를 통제해야 한다 &amp;mdash; Harness Engineering 정리</title>
      <link>https://peterica.tistory.com/1049</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI] Peterica의 AI공부와 비젼 정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 AI를 활용한 개발 이야기를 들으면 늘 비슷한 고민으로 돌아온다.&lt;br /&gt;&amp;ldquo;어떤 모델을 써야 더 잘 나오지?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 한 영상을 보고 나서 이 질문 자체가 틀렸을 수 있다는 생각이 들었다.&lt;br /&gt;문제는 모델이 아니라, &lt;b&gt;결과를 만드는 방식&lt;/b&gt;에 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 AI는 항상 들쭉날쭉할까&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude를 쓰다가 Codex를 쓰고, 다시 Gemini를 쓰면&lt;br /&gt;같은 요구사항인데도 결과는 매번 달라진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 날은 구조가 깔끔하고&lt;/li&gt;
&lt;li&gt;어떤 날은 naming이 엉망이고&lt;/li&gt;
&lt;li&gt;어떤 날은 아예 설계가 틀어진다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 우리는 보통 이렇게 생각한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;더 좋은 모델을 써야겠다&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Harness Engineering은 정반대의 이야기를 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;AI는 믿을 수 없다. 대신 시스템으로 통제해야 한다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 본질 &amp;mdash; Harness Engineering이란 무엇인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Harness Engineering은 단순한 프롬프트 기법이 아니다.&lt;br /&gt;AI를 잘 사용하는 방법이 아니라, &lt;b&gt;AI가 원하는 방식으로 출력하도록 만드는 구조 설계 방법론&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 하나다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 바뀌어도 결과는 같아야 한다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 다음을 통제한다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서 구조&lt;/li&gt;
&lt;li&gt;설계 방식&lt;/li&gt;
&lt;li&gt;코드 규칙&lt;/li&gt;
&lt;li&gt;평가 기준&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, AI를 도구로 쓰는 것이 아니라&lt;br /&gt;&lt;b&gt;규격화된 생산 시스템 안에 넣는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 구조적 해석 &amp;mdash; CPS + 개발 파이프라인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식의 중심에는 CPS 프레임워크가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Context: 지금 상황은 무엇인가&lt;/li&gt;
&lt;li&gt;Problem: 해결해야 할 문제는 무엇인가&lt;/li&gt;
&lt;li&gt;Solution: 어떻게 풀 것인가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 단순 문서가 아니라&lt;br /&gt;&lt;b&gt;팀의 사고 방식 자체를 정렬하는 도구&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 CPS는 개발 전체 흐름으로 이어진다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;요구사항 입력 (비정형 가능)&lt;/li&gt;
&lt;li&gt;회의 및 로그 정리&lt;/li&gt;
&lt;li&gt;CPS 구조화&lt;/li&gt;
&lt;li&gt;PRD 및 설계 문서 생성&lt;/li&gt;
&lt;li&gt;코드 생성 + 린터 적용&lt;/li&gt;
&lt;li&gt;평가(Evaluation)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 포인트는 하나다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드가 아니라, 프로세스를 통제한다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 핵심 메커니즘 &amp;mdash; &amp;ldquo;선택지를 제거한다&amp;rdquo;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 결과가 흔들리는 이유는 단순하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;naming이 다르고&lt;/li&gt;
&lt;li&gt;파일 구조가 다르고&lt;/li&gt;
&lt;li&gt;코드 스타일이 다르기 때문이다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Harness Engineering은 이를 이렇게 해결한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;린터로 강제한다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일명 규칙 고정&lt;/li&gt;
&lt;li&gt;import 순서 고정&lt;/li&gt;
&lt;li&gt;구조 패턴 고정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI가 선택할 수 있는 경우의 수가 줄어들고&lt;/li&gt;
&lt;li&gt;출력은 점점 하나로 수렴한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 중요한 관점이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 결과는 생성하는 것이 아니라, 제한해서 만든다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 시스템 관점 &amp;mdash; Evaluation이 핵심이다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI의 결과는 항상 불확실하다.&lt;br /&gt;그래서 Harness Engineering에서는 &amp;ldquo;평가&amp;rdquo;가 핵심이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평가 기준 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문맥 적합성&lt;/li&gt;
&lt;li&gt;정확성&lt;/li&gt;
&lt;li&gt;데이터 근거&lt;/li&gt;
&lt;li&gt;누락 여부&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 더 중요한 건 이것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평가 기준은 조직마다 달라야 한다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 조직은 정확성이 우선이고&lt;/li&gt;
&lt;li&gt;어떤 조직은 속도가 우선이다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, AI 품질은 모델이 아니라&lt;br /&gt;&lt;b&gt;조직이 정의한 기준으로 결정된다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 운영 관점 &amp;mdash; 왜 이 방식이 중요한가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 접근은 특히 조직 단위에서 강력하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유지보수 용이&lt;/li&gt;
&lt;li&gt;협업 효율 증가&lt;/li&gt;
&lt;li&gt;모델 교체에도 안정성 유지&lt;/li&gt;
&lt;li&gt;엔터프라이즈 환경에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초기 설계 비용 큼&lt;/li&gt;
&lt;li&gt;유연성 감소&lt;/li&gt;
&lt;li&gt;AI 입장에서는 비효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제 개발에서는 명확하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유연성보다 일관성이 더 중요하다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 정리 &amp;mdash; AI 시대의 개발 패러다임 변화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 지금까지 이렇게 생각해왔다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 프롬프트를 만들면 된다&lt;/li&gt;
&lt;li&gt;좋은 모델을 쓰면 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이제는 바뀌어야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프롬프트 중심 &amp;rarr; X&lt;/li&gt;
&lt;li&gt;모델 중심 &amp;rarr; X&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시스템 중심 &amp;rarr; O&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 핵심은 이것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 AI 결과는 모델이 아니라, 설계된 시스템에서 나온다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;a href=&quot;https://youtu.be/A8PMyC7W_vg?si=scSS4owIgXnZGaG1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/A8PMyC7W_vg?si=scSS4owIgXnZGaG1&lt;/a&gt;&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>AgenticWorkflow</category>
      <category>AI</category>
      <category>ai개발</category>
      <category>ContextEngineering</category>
      <category>HARNESS</category>
      <category>HarnessEngineering</category>
      <category>LLM</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1049</guid>
      <comments>https://peterica.tistory.com/1049#entry1049comment</comments>
      <pubDate>Wed, 25 Mar 2026 08:24:53 +0900</pubDate>
    </item>
    <item>
      <title>Context Note &amp;mdash; 컨텍스트를 &amp;ldquo;쌓지 않고 구조화&amp;rdquo;하는 새로운 방식</title>
      <link>https://peterica.tistory.com/1048</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI]&amp;nbsp;Peterica의&amp;nbsp;AI공부와&amp;nbsp;비젼&amp;nbsp;정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM과 협업을 하다 보면 공통적인 문제가 발생한다.&lt;br /&gt;대화가 길어질수록 컨텍스트는 계속 누적되고, 결국 핵심 의사결정이 희석된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해 만든 프로젝트가 &lt;b&gt;Context Note&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Context Note는 파일 트리 구조로 컨텍스트를 분리하고, 구조화된 에디터로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;의사결정 중심 문서&lt;/b&gt;를 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NowFm/dJMcag5WSKe/G0XH7FJNTXQSJ5W1BjBvN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NowFm/dJMcag5WSKe/G0XH7FJNTXQSJ5W1BjBvN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NowFm/dJMcag5WSKe/G0XH7FJNTXQSJ5W1BjBvN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNowFm%2FdJMcag5WSKe%2FG0XH7FJNTXQSJ5W1BjBvN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;545&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠르게 PRD를 구성하고 MD파일로 저장된 문서는 바로 사용가능한 docs 형태가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 필요한가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 노트 시스템(Notion, Obsidian 등)은 정보를 &amp;ldquo;쌓는 구조&amp;rdquo;다.&lt;br /&gt;하지만 실제 개발이나 의사결정은 &amp;ldquo;구조화된 컨텍스트 관리&amp;rdquo;가 핵심이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 LLM 기반 작업에서는 다음 문제가 반복된다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨텍스트가 길어질수록 품질 저하&lt;/li&gt;
&lt;li&gt;중요한 의사결정이 묻힌다&lt;/li&gt;
&lt;li&gt;실행 가능한 형태로 정리되지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GTP와 Claude의 CoWorking&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우, GPT가 기획자 역할을 수행하고, Claude가 개발을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT에서 요구사항을 정리하여 이름 PRD로 구성하고,&lt;br /&gt;Claude는 이를 점검하여 Agentic Workflow로 개발 POC를 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PRD를 수립할 때에 에디터를 이용하면&lt;br /&gt;&amp;nbsp;선택된 텍스트 구조로 대화를 이어가고 보충 및 수정이 편리하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Context Note의 접근 방식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Context Note는 단순한 노트 앱이 아니다.&lt;br /&gt;&amp;ldquo;컨텍스트를 구조로 관리하는 시스템&amp;rdquo;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 개념은 다음과 같다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;File Tree = Context Structure&lt;br /&gt;&amp;rarr; 주제별로 컨텍스트를 분리하여 관리&lt;/li&gt;
&lt;li&gt;Structured Editor&lt;br /&gt;&amp;rarr; 자유 서술이 아닌, 구조 기반 작성&lt;/li&gt;
&lt;li&gt;Template Injection&lt;br /&gt;&amp;rarr; Problem / Design / Dev / Test / Decision / Next 자동 생성&lt;/li&gt;
&lt;li&gt;Decision Required&lt;br /&gt;&amp;rarr; 모든 문서는 반드시 &amp;ldquo;결정&amp;rdquo;을 포함해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁStructured&amp;nbsp;Editor&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;슬래시 메뉴(/)로 Heading, List, Code Block 등 블록을 빠르게 삽입합니다. Toolbar에서 Init Template 버튼으로 기본 섹션 구조를 자동 생성할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDT8NO/dJMcaiinnD4/4NUiXdePD3ZwEUCQf2LWu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDT8NO/dJMcaiinnD4/4NUiXdePD3ZwEUCQf2LWu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDT8NO/dJMcaiinnD4/4NUiXdePD3ZwEUCQf2LWu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDT8NO%2FdJMcaiinnD4%2F4NUiXdePD3ZwEUCQf2LWu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;743&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ Preview&amp;nbsp;Mode&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Editor / Preview 탭 전환으로 렌더링된 문서를 확인합니다. 파일 트리에서 문서 구조를 한눈에 파악할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxBavR/dJMcabKmvIr/EymRMEkQC5lNEfYzGFdWH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxBavR/dJMcabKmvIr/EymRMEkQC5lNEfYzGFdWH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxBavR/dJMcabKmvIr/EymRMEkQC5lNEfYzGFdWH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxBavR%2FdJMcabKmvIr%2FEymRMEkQC5lNEfYzGFdWH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;1100&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 기존 노트와의 차이&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 107px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;기존 노트&lt;/td&gt;
&lt;td&gt;Context Note&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;구조&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;자유 서술&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;구조 강제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;목적&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;기록&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;의사결정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;컨텍스트&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;누적&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;분리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;결과&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;읽기&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;실행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 기술 스택&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Next.js (App Router, TypeScript)&lt;/li&gt;
&lt;li&gt;TipTap Editor (WYSIWYG)&lt;/li&gt;
&lt;li&gt;Zustand (State)&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;Docker 기반 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬에서 바로 실행 가능:&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 핵심 인사이트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 시대에는 &amp;ldquo;잘 쓰는 것&amp;rdquo;보다&lt;br /&gt;&lt;b&gt;컨텍스트를 어떻게 구조화하느냐가 더 중요하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Context Note는 이 지점을 해결하려는 시도다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트는 아직 초기 단계지만,&lt;br /&gt;다음과 같은 방향으로 확장할 수 있다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LLM Agent와 직접 연결&lt;/li&gt;
&lt;li&gt;Context 기반 자동 실행&lt;/li&gt;
&lt;li&gt;Decision tracking 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  GitHub: &lt;a href=&quot;https://github.com/peterica/context-note&quot;&gt;https://github.com/peterica/context-note&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨텍스트를 &amp;ldquo;쌓지 말고 구조화&amp;rdquo;해보자.&lt;/p&gt;</description>
      <category>AI/AI실험 | 기록</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1048</guid>
      <comments>https://peterica.tistory.com/1048#entry1048comment</comments>
      <pubDate>Mon, 23 Mar 2026 22:44:35 +0900</pubDate>
    </item>
    <item>
      <title>[AI] AI Agent 시대, Garbage Context를 줄이는 방법 - Claude /compact를 포함한 Context Engineering 전략</title>
      <link>https://peterica.tistory.com/1047</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI]&amp;nbsp;Peterica의&amp;nbsp;AI공부와&amp;nbsp;비젼&amp;nbsp;정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 한 크루와 컨텍스트 낭비와 토큰 부족에 관해 이야기를 나누면서 정리한 글이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM을 쓰다 보면 초반에는 정확하던 답변이 점점 흐려지고, 결과는 길어지지만 핵심은 사라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 현상의 본질은 모델 성능 문제가 아니라, &lt;b&gt;컨텍스트 오염(Context Pollution)&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agentic 코딩에서는 이 문제가 더 치명적이다.&lt;br /&gt;왜냐하면 LLM은 단순 답변이 아니라 &lt;b&gt;&amp;ldquo;상태를 기반으로 행동하는 실행 주체&amp;rdquo;&lt;/b&gt;이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI agentic 코딩에서는 &lt;b&gt;모델이 &amp;ldquo;추론&amp;rdquo;이 아니라 &amp;ldquo;구조를 따라 실행&amp;rdquo;하도록 만드는 것&lt;/b&gt;이 핵심이다. 이때 SSOT, MECE, DoD는 단순한 문서 원칙이 아니라, &lt;b&gt;에이전트가 안정적으로 동작하기 위한 제어 장치(control layer)&lt;/b&gt; 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 Garbage Context가 문제인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 입력된 컨텍스트를 &lt;b&gt;&amp;ldquo;진실&amp;rdquo;&lt;/b&gt;로 간주한다.&lt;br /&gt;문제는 이 컨텍스트가 다음과 같이 구성된다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이전 대화의 잔여 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이미 해결된 문제의 흔적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;서로 충돌하는 지시사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;중복된 설명과 불필요한 장문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태가 되면 모델은:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;무엇이 최신 정보인지 판단해야 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;무엇이 중요한지 추론해야 하며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;모순을 스스로 해결하려 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불필요한 추론 비용이 증가하고 정확도는 감소한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ /compact의 의미: 단순 요약이 아니다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude의 /compact는 단순한 요약 기능이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 기능의 본질은 다음과 같다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;기존 대화 &amp;rarr; 핵심 상태만 남김&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;불필요한 토큰 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;현재 작업에 필요한 정보만 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;/compact는 &amp;ldquo;대화를 줄이는 기능&amp;rdquo;이 아니라 &amp;ldquo;작업 상태를 재정의하는 기능&quot;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 구조적으로 보면: Context Engineering 문제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Garbage Context 문제는 도구가 아니라 구조의 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 상태(State)와 기록(Log)을 분리해야 한다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 경우 대화는 다음을 혼합한다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 상태 (해야 할 일)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 과거 기록 (왜 이렇게 되었는가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent에게 필요한 것은 대부분 &lt;b&gt;상태(State)&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 대화 전체를 유지하지 말고 현재 상태만 재정의해야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/compact는 이 작업을 자동으로 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ SSOT&amp;nbsp;(Single&amp;nbsp;Source&amp;nbsp;of&amp;nbsp;Truth)의&amp;nbsp;필요성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트는 동일한 정보를 여러 곳에서 참조할 때 쉽게 충돌한다.&lt;br /&gt;특히 LLM 기반 시스템에서는 다음 문제가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;프롬프트 vs 코드 vs 문서 간 불일치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;여러 agent가 서로 다른 상태를 기준으로 판단&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;ldquo;그럴듯한 잘못된 판단(hallucination)&amp;rdquo; 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 컨텍스트를 계속 누적하는 방식 &amp;rarr; 실패&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;394&quot; data-start=&quot;359&quot; data-ke-size=&quot;size16&quot;&gt;SSOT가 없으면 에이전트는 &lt;b&gt;결정을 &amp;ldquo;추론&amp;rdquo;으로 메꾼다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;394&quot; data-start=&quot;359&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;SSOT 기반으로 컨텍스트를 재구성해야 한다&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 기준 문서를 중심으로 재로딩 &amp;rarr; 안정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;모든 판단 기준 &amp;rarr; 한 곳에서만 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;agent는 추론이 아니라 &lt;b&gt;lookup + execution&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;변경 시 영향 범위 명확 (diff 기반 운영 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CLAUDE.md&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PRD.md&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- task_flow.md&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문서들이 컨텍스트의 &amp;ldquo;기준점&amp;rdquo;이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 대화는 참고, 문서는 기준&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ MECE&amp;nbsp;(Mutually&amp;nbsp;Exclusive,&amp;nbsp;Collectively&amp;nbsp;Exhaustive)의&amp;nbsp;필요성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MECE는 상호 배타적이면서(중복 없이), 전체 포괄적인(누락 없이) 상태를 의미합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트는 &amp;ldquo;경계가 모호한 문제&amp;rdquo;를 가장 어려워한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MECE가&amp;nbsp;없는&amp;nbsp;경우:&lt;br /&gt;&amp;nbsp;- 동일&amp;nbsp;작업을&amp;nbsp;여러&amp;nbsp;agent가&amp;nbsp;중복&amp;nbsp;수행&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt; &lt;/span&gt;&lt;/span&gt;책임&amp;nbsp;경계&amp;nbsp;불명확&amp;nbsp;&amp;rarr;&amp;nbsp;무한&amp;nbsp;루프/충돌&amp;nbsp;발생&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt; &lt;/span&gt;&lt;/span&gt;누락&amp;nbsp;케이스&amp;nbsp;발생&amp;nbsp;(특히&amp;nbsp;edge&amp;nbsp;case)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 작업이 섞여 있을수록 컨텍스트는 길어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;ㄴ 분석 + 설계 + 구현 + 리뷰가 한 대화에 존재&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;ㄴ&lt;span&gt; &lt;/span&gt;&lt;/span&gt;서로&amp;nbsp;다른&amp;nbsp;레벨의&amp;nbsp;정보가&amp;nbsp;혼재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;ldquo;검증&amp;rdquo;이라는 작업이 &amp;rarr; 라이선스 검증 / 코드 origin 검증 / 보안 검증이 섞여 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MECE = agent 분업을 가능하게 하는 최소 단위 분해 구조&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MECE하게 쪼개야 컨텍스트가 줄어든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MECE 적용 시:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- task 단위로 분리&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- agent 역할 분리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 작업 단위가 분해됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 각 agent 역할이 명확해짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- orchestration 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러면 각 컨텍스트는 자연스럽게 작아진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ DoD&amp;nbsp;(Definition&amp;nbsp;of&amp;nbsp;Done)의&amp;nbsp;필요성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트에게&amp;nbsp;가장&amp;nbsp;위험한&amp;nbsp;상태는&amp;nbsp;&amp;ldquo;끝났다고&amp;nbsp;착각하는&amp;nbsp;것&amp;rdquo;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ DoD가&amp;nbsp;없으면:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;- agent가&amp;nbsp;중간&amp;nbsp;결과를&amp;nbsp;완료로&amp;nbsp;판단&lt;br /&gt;&amp;nbsp;- 품질&amp;nbsp;기준&amp;nbsp;없이&amp;nbsp;결과&amp;nbsp;생성&lt;br /&gt;&amp;nbsp;- 재현&amp;nbsp;불가능&amp;nbsp;(same&amp;nbsp;input&amp;nbsp;&amp;rarr;&amp;nbsp;different&amp;nbsp;output)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;DoD가 없으면 컨텍스트는 계속 쌓인다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완료 기준이 없으면 대화는 끝나지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &amp;ldquo;조금 더 수정&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &amp;ldquo;이 부분만 다시&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &amp;ldquo;이것도 추가&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 반복이 Garbage Context의 주요 원인이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ DoD를&amp;nbsp;정의하면:&lt;br /&gt;&amp;nbsp;- 완료&amp;nbsp;조건이&amp;nbsp;명시됨&amp;nbsp;(ex:&amp;nbsp;테스트&amp;nbsp;통과,&amp;nbsp;근거&amp;nbsp;URL&amp;nbsp;존재,&amp;nbsp;diff&amp;nbsp;생성&amp;nbsp;등)&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt; &lt;/span&gt;&lt;/span&gt;결과&amp;nbsp;검증이&amp;nbsp;자동화&amp;nbsp;가능&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt; &lt;/span&gt;&lt;/span&gt;self-check&amp;nbsp;/&amp;nbsp;evaluator&amp;nbsp;agent&amp;nbsp;설계&amp;nbsp;가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DoD를 두면&amp;nbsp;완료 시점이 명확해지고&amp;nbsp;새로운 컨텍스트로 전환 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DoD = 결과를 &amp;lsquo;판단&amp;rsquo;이 아닌 &amp;lsquo;검증 가능한 상태&amp;rsquo;로 만드는 기준이 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 실무 적용 패턴 (나의 구조 기준)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 세&amp;nbsp;가지는&amp;nbsp;개별&amp;nbsp;개념이&amp;nbsp;아니라&amp;nbsp;하나의&amp;nbsp;구조로&amp;nbsp;동작한다.&lt;br /&gt;&amp;nbsp;- &lt;b&gt;SSOT&lt;/b&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;&amp;ldquo;무엇을&amp;nbsp;기준으로&amp;nbsp;판단할&amp;nbsp;것인가&amp;rdquo;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;MECE&lt;/b&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;&amp;ldquo;누가&amp;nbsp;무엇을&amp;nbsp;할&amp;nbsp;것인가&amp;rdquo;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;DoD&lt;/b&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;&amp;ldquo;언제&amp;nbsp;끝났다고&amp;nbsp;볼&amp;nbsp;것인가&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 그래서 내가 만드는 구조는 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;SSOT&lt;/b&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;[docs]&amp;nbsp;(architecture,&amp;nbsp;policy,&amp;nbsp;standard)&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;MECE&lt;/b&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;[command]&amp;nbsp;(역할&amp;nbsp;단위&amp;nbsp;실행&amp;nbsp;명령)&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;DoD&lt;/b&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;각&amp;nbsp;command의&amp;nbsp;완료&amp;nbsp;조건&amp;nbsp;+&amp;nbsp;검증&amp;nbsp;기준&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 Vibe Coding 흐름은 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실행 전&lt;br /&gt;&amp;rarr; SSOT 문서 로딩 (docs 기반)&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;2&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;작업 수행&lt;br /&gt;&amp;rarr; 필요한 최소 컨텍스트만 유지&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;3&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;일정 단위 종료&lt;br /&gt;&amp;rarr; /compact 수행&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;4&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;결과 저장&lt;br /&gt;&amp;rarr; 로그는 외부에 기록 (Git, MD)&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;5&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다음 작업&lt;br /&gt;&amp;rarr; 새로운 상태로 시작&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 핵심 운영 원칙&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 다음 네 가지로 수렴된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컨텍스트는 누적하지 말고 재구성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대화보다 문서를 기준으로 삼는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작업은 작게 나눈다 (MECE)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 완료되면 끊고 리셋한다 (DoD + compact)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;Context&amp;nbsp;Engineering은&amp;nbsp;AI&amp;nbsp;튜닝이다:&amp;nbsp;DB&amp;nbsp;최적화&amp;nbsp;관점에서&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 AI에게 프롬프트를 주는 일을 단순 질의가 아니라, 일종의 실행 계획 설계라고 본다.&lt;br /&gt;MySQL이&amp;nbsp;옵티마이저를&amp;nbsp;통해&amp;nbsp;최적의&amp;nbsp;plan을&amp;nbsp;만들고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 필요하면 중간 결과를 임시 테이블이나 집계 구조로 정리해 성능을 높이듯,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; AI Agent 기반 Vibe Coding에서도 agent와 skill을 적절히 분리하고 각 단계에 필요한 컨텍스트만 공급해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI Agent 환경에서도 전체 대화를 계속 누적시키는 대신, 현재 작업에 필요한 상태만 재구성해 넘기는 것이 유사한 역할을 한다. 즉, /compact, SSOT 문서, task별 분리, role별 agent 설계는 AI 쪽의 실행 계획 최적화라고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;결국&amp;nbsp;Context&amp;nbsp;Engineering은&amp;nbsp;프롬프트를&amp;nbsp;잘&amp;nbsp;쓰는&amp;nbsp;기술이&amp;nbsp;아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; AI 활용 성능을 높이기 위한 구조적 튜닝 작업입니다.&amp;nbsp;&lt;br /&gt;고급&amp;nbsp;AI&amp;nbsp;Native&amp;nbsp;개발자로&amp;nbsp;성장하기&amp;nbsp;위해서는 컨텍스트에 대한 구조적&amp;nbsp;튜닝에&amp;nbsp;대해&amp;nbsp;공부가&amp;nbsp;필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM을 잘 쓰는 사람과 아닌 사람의 차이는 &lt;b&gt;프롬프트가 아니라 컨텍스트 관리 능력&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Agentic 환경에서는 더 명확하다. 컨텍스트를&amp;nbsp;관리하지&amp;nbsp;않으면&amp;nbsp;모델이&amp;nbsp;아니라&amp;nbsp;&amp;ldquo;잡음&amp;rdquo;이&amp;nbsp;동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SSOT,&amp;nbsp;MECE,&amp;nbsp;DoD는&amp;nbsp;AI&amp;nbsp;agent가&amp;nbsp;&amp;lsquo;생각하는&amp;nbsp;존재&amp;rsquo;가&amp;nbsp;아니라&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;lsquo;예측 가능한 실행 시스템&amp;rsquo;으로 동작하게 만드는 최소 조건이다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;좋은 AI 시스템은 더 많이 넣는 것이 아니라, 덜 남기는 시스템이다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고&amp;nbsp;/compact는&amp;nbsp;단순한&amp;nbsp;기능이&amp;nbsp;아니라&amp;nbsp;그&amp;nbsp;철학을&amp;nbsp;구현하는&amp;nbsp;하나의&amp;nbsp;인터페이스다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>AI/AI코딩 | 실습</category>
      <category>Claude</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1047</guid>
      <comments>https://peterica.tistory.com/1047#entry1047comment</comments>
      <pubDate>Wed, 18 Mar 2026 22:15:33 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] 운영체제마다 다른 시작 프로그램 관리 방식</title>
      <link>https://peterica.tistory.com/1046</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 운영하다 보면 서비스를 &lt;b&gt;시스템 시작과 함께 자동으로 실행&lt;/b&gt;해야 하는 경우가 많다.&lt;br /&gt;웹 서버, 모니터링 에이전트, 메시지 큐, 데이터베이스 등 대부분의 인프라 서비스는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부팅과 동시에 올라와야 하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;흥미로운 점은 운영체제마다 &lt;b&gt;시작 프로그램을 관리하는 방식과 명령어가 전부 다르다&lt;/b&gt;는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux에서는 &lt;b&gt;systemd&lt;/b&gt;를 사용하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;macOS는 &lt;b&gt;launchd,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows는 &lt;b&gt;Service&amp;nbsp;Manager&lt;/b&gt;를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 운영체제별 &lt;b&gt;시작 프로그램 관리 구조와 명령어의 차이&lt;/b&gt;를 정리하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 운영체제마다 서비스 관리 방식이 다른가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제가 부팅될 때 가장 먼저 실행되는 프로그램을 &lt;b&gt;init 시스템&lt;/b&gt;이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 init 시스템의 역할은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 초기화&lt;/li&gt;
&lt;li&gt;서비스 실행&lt;/li&gt;
&lt;li&gt;프로세스 관리&lt;/li&gt;
&lt;li&gt;시스템 상태 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제마다 이 init 시스템을 구현하는 방식이 달라지면서&lt;br /&gt;&lt;b&gt;서비스 관리 방법도 자연스럽게 달라졌다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 서비스 관리 시스템은 다음과 같다.&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%; height: 70px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;운영체제&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;서비스 관리 시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Linux&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;systemd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;macOS&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;launchd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Windows&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Service Control Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Linux의 서비스 관리 : systemd&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 대부분의 Linux 배포판(Ubuntu, Debian, CentOS, RHEL 등)은 &lt;b&gt;systemd&lt;/b&gt;를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;systemd는 &lt;b&gt;서비스 관리 플랫폼에 가까운 구조&lt;/b&gt;를 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스는 &lt;b&gt;Unit 파일&lt;/b&gt;이라는 설정 파일로 정의된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;/etc/systemd/system/my-service.service&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 관리는 &amp;nbsp;&lt;code&gt;systemctl&lt;/code&gt; 명령어로 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대표적인 명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl enable nginx
systemctl status nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 특징은 systemd가 &lt;b&gt;의존성 기반 서비스 실행 구조&lt;/b&gt;를 가진다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ macOS의 서비스 관리 : launchd&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;macOS는&amp;nbsp; &lt;b&gt;launchd&lt;/b&gt;라는 시스템을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux의 systemd와 유사한 역할을 하지만 구조적으로는 &lt;b&gt;이벤트 기반 서비스 실행 모델&lt;/b&gt;에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 설정은 &lt;b&gt;plist 파일&lt;/b&gt;로 정의된다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;/Library/LaunchDaemons
~/Library/LaunchAgents&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리 명령어는 &lt;code&gt;launchctl&lt;/code&gt;이다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;launchctl load service.plist
launchctl unload service.plist
launchctl start service
launchctl stop service
launchctl list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;macOS의 특징은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 서비스와 시스템 서비스를 분리&lt;/li&gt;
&lt;li&gt;이벤트 기반 실행&lt;/li&gt;
&lt;li&gt;로그인 기반 서비스 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 Linux처럼 &lt;b&gt;서버 서비스 중심 구조라기보다는 데스크톱 환경 중심 구조&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 운영체제별 서비스 관리 구조 비교&lt;/h4&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%; height: 65px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;서비스 시스템&lt;/td&gt;
&lt;td&gt;설정 방식&lt;/td&gt;
&lt;td&gt;관리 명령&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Linux&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;systemd&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;unit 파일&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;systemctl&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;macOS&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;launchd&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;plist 파일&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;launchctl&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Windows&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;SCM&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;registry / service DB&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;sc, net&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;겉으로 보면 단순히 명령어 차이처럼 보이지만&lt;br /&gt;사실은 &lt;b&gt;운영체제 철학의 차이&lt;/b&gt;가 반영된 결과다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 인프라 운영 관점에서 보는 차이&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 인프라 환경에서는 다음과 같은 특징이 나타난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Linux&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버 인프라 표준&lt;/li&gt;
&lt;li&gt;systemd 기반 서비스 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;macOS&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발 환경 중심&lt;/li&gt;
&lt;li&gt;사용자 세션 기반 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Windows&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기업 애플리케이션 서비스 중심&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 &lt;b&gt;클라우드 서버, Docker, Kubernetes 환경에서는 Linux + systemd 구조가 사실상 표준&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 DevOps나 SRE 업무를 하다 보면&lt;br /&gt;결국 &lt;code&gt;systemctl&lt;/code&gt; 명령어를 가장 많이 사용하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ㅁ 마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제마다 시작 프로그램 관리 방식이 다른 이유는&lt;br /&gt;단순히 명령어 차이가 아니라 &lt;b&gt;시스템 아키텍처 차이&lt;/b&gt; 때문이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Linux &amp;rarr; 의존성 기반 서비스 그래프 (systemd)&lt;/li&gt;
&lt;li&gt;macOS &amp;rarr; 이벤트 기반 실행 (launchd)&lt;/li&gt;
&lt;li&gt;Windows &amp;rarr; 서비스 관리자 구조 (SCM)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이를 이해하면 새로운 운영체제를 접하더라도&lt;br /&gt;&lt;b&gt;서비스가 어떻게 시작되고 관리되는지 구조적으로 이해할 수 있다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <category>PETERICA</category>
      <category>시작프로그램</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1046</guid>
      <comments>https://peterica.tistory.com/1046#entry1046comment</comments>
      <pubDate>Wed, 18 Mar 2026 06:40:30 +0900</pubDate>
    </item>
    <item>
      <title>[AI] AI Agent는 모델이 아니라 Workflow다 &amp;mdash; Claude가 말하는 Agent 설계 패턴</title>
      <link>https://peterica.tistory.com/1045</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI] Peterica의 AI공부와 비젼 정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 Claude을 효율적으로 사용하기 위해서는&amp;nbsp;&lt;b&gt;워크플로우 구조(workflow)&lt;/b&gt;를 이해해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 단지 추론 엔진일 뿐이고, 실제 문제 해결은 &lt;b&gt;여러 단계의 작업을 어떻게 연결하느냐&lt;/b&gt;에 따라 결정된다.&lt;br /&gt;Anthropic에서 정리한 글 &amp;ldquo;&lt;a href=&quot;https://claude.com/blog/common-workflow-patterns-for-ai-agents-and-when-to-use-them&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Common workflow patterns for AI agents&lt;/a&gt;&amp;rdquo; 역시 같은 메시지를 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;좋은 Agent 시스템은 좋은 Workflow 설계에서 나온다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Agent 시스템의 본질&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI Agent는 단순한 모델 호출이 아닌, 실제로는 다음 요소들이 결합된 &lt;b&gt;작은 프로그램 구조&lt;/b&gt;에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ LLM reasoning(한번더 생각한다)&lt;br /&gt;ㅇ tool / API 호출&lt;br /&gt;ㅇ 중간 결과 저장&lt;br /&gt;ㅇ 반복적인 평가와 개선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 Agent는 다음과 같이 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;Agent = Model + Tools + Workflow&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 똑똑하다고 해서 시스템이 자동으로 좋아지는 것은 아니다.&lt;br /&gt;오히려 &lt;b&gt;workflow 설계가 전체 성능을 좌우하는 경우가 많다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 가장 기본적인 Agent Workflow 패턴&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic은 여러 Agent 구조 중에서도 실제로 자주 사용되는 패턴을 몇 가지로 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;Sequential Workflow (순차 처리)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기본적인 형태이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Task &amp;rarr; Step1 &amp;rarr; Step2 &amp;rarr; Step3 &amp;rarr; Result&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 작업에 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 문서 분석 &amp;rarr; 요약 &amp;rarr; 보고서 작성&lt;br /&gt;ㅇ 코드 생성 &amp;rarr; 테스트 &amp;rarr; 수정&lt;br /&gt;ㅇ 데이터 처리 파이프라인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조의 특징은 단순함이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 문제는 사실 &lt;b&gt;이 구조만으로도 충분히 해결된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;Parallel Workflow (병렬 처리)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 Agent가 동시에 작업을 수행하는 구조이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Task&lt;br /&gt;├ Agent A&lt;br /&gt;├ Agent B&lt;br /&gt;└ Agent C&lt;br /&gt;&amp;darr;&lt;br /&gt;결과 통합&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예를 들면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 여러 검색 전략 수행&lt;br /&gt;ㅇ 다양한 답변 후보 생성&lt;br /&gt;ㅇ 여러 관점에서 분석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 &lt;b&gt;탐색 문제(exploration)&lt;/b&gt;\에서 특히 강력하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;Evaluator &amp;ndash; Optimizer Workflow&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성과 평가를 반복하며 결과를 개선하는 구조이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Generate &amp;rarr; Evaluate &amp;rarr; Improve &amp;rarr; Evaluate &amp;rarr; ...&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 예&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 코드 생성 &amp;rarr; 테스트 &amp;rarr; 수정&lt;br /&gt;ㅇ 글 작성 &amp;rarr; 품질 평가 &amp;rarr; 개선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ LLM 응답 품질 개선 루프&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조는 &lt;b&gt;정답이 명확하지 않은 문제에서 효과적&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Agent 설계에서 가장 중요한 원칙&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서 특히 인상적인 부분은 다음 메시지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대부분의 문제는 Multi-Agent가 필요하지 않다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 사람들이 Agent 시스템을 만들 때 다음과 같은 실수를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 불필요하게 많은 Agent 생성&lt;br /&gt;ㅇ 복잡한 orchestration&lt;br /&gt;ㅇ 디버깅 어려움&lt;br /&gt;ㅇ 비용 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic의 권장 접근 방식은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ Single Agent + Simple Workflow&lt;br /&gt;2️⃣ 필요하면 Parallel 확장&lt;br /&gt;3️⃣ 필요하면 Evaluation Loop 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;Simple &amp;rarr; Complex&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서로 발전시키라는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 개발자 관점에서의 핵심 통찰&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 읽고 나면 Agent 시스템이 사실 &lt;b&gt;특별한 AI 기술이 아니라 &amp;ldquo;워크플로우 설계 문제&amp;rdquo;&lt;/b&gt;라는 것을 깨닫게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent 시스템은 결국 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 작은 프로그램 구조&lt;br /&gt;ㅇ 단계적 workflow&lt;br /&gt;ㅇ tool orchestration&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 여기서 중요한 것은 모델이 아니라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;작업을 어떻게 분해하고 연결할 것인가&amp;rdquo;&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 빠르게 MVP 적용해 보자&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;2052&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ylpq6/dJMcabcmACz/jhOIJTs1Z4vPEd86NNngsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ylpq6/dJMcabcmACz/jhOIJTs1Z4vPEd86NNngsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ylpq6/dJMcabcmACz/jhOIJTs1Z4vPEd86NNngsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fylpq6%2FdJMcabcmACz%2FjhOIJTs1Z4vPEd86NNngsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;740&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;2052&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ Claude Agent를 이용해 빠르게 개발을 진행했던 프로젝트였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 아이의 문법교육을 고민하면서 서점을 다녀오면서 아이디어를 얻게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ Claude Agent 연습 + AI Grammar 교육 컨텐츠를 목적으로 작업을 시작하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 03-14 14시, 둘째 성당 첫영성체 교리 때문에 성당 카페에서 시작하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ GPT로 PRD를 구성하기 위해 컨텍스트 레이아웃을 쌓았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;GPT에서 PRD 구성&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p8ZFy/dJMcajanmeM/rCxdap2mxJC2ZsXkAW6CI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p8ZFy/dJMcajanmeM/rCxdap2mxJC2ZsXkAW6CI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p8ZFy/dJMcajanmeM/rCxdap2mxJC2ZsXkAW6CI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp8ZFy%2FdJMcajanmeM%2FrCxdap2mxJC2ZsXkAW6CI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;258&quot; height=&quot;214&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 작업은 &lt;b&gt;Agent Workflow 기반 개발 준비 과정&lt;/b&gt;으로 진행되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 제품 목표를 정의하는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; PRD(Product Requirements Document)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 작성하고, 이를 바탕으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; UI 설계(WIREFRAME), 컴포넌트 구조(COMPONENT), LLM 프롬프트 설계(PROMPT_LIBRARY),&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 로컬 모델 연동(LLM_INTEGRATION)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서를 단계적으로 정리하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 AI는 단순 코드 생성 도구가 아니라&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;제품 기획 &amp;rarr; 시스템 아키텍처 설계 &amp;rarr; 인터페이스 정의 &amp;rarr; LLM 활용 전략 수립&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;까지 협력하는 에이전트 역할을 수행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 Claude Harness와 같은 에이전트 기반 개발 환경에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 구현 가능한 수준의 &lt;b&gt;구조화된 개발 문서 세트&lt;/b&gt;를 구축하는 것을 목표로 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Claude Code AI 에이전트 환경 구축, Harness&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude CLI에서 AI가 프로젝트를 분석하고 스킬/에이전트/워크플로우를 자동 구축하도록 하였다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Phase 1: 프로젝트 기반 설정 (CLAUDE.md)
Phase 2: 진행 상황 및 계획 관리
Phase 3: 핵심 파일 관리 정책
Phase 4: 스킬/에이전트 설계
Phase 5: 스킬 및 에이전트 생성 (품질 기준 준수)
Phase 6: 레퍼런스 문서 구성
Phase 7: 검증 및 유지보수 루프
Phase 8: 자율 반복 워크플로우&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vNAGc/dJMcacWEa1E/TDWJ12bcmbQ1qovx7tsV7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vNAGc/dJMcacWEa1E/TDWJ12bcmbQ1qovx7tsV7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vNAGc/dJMcacWEa1E/TDWJ12bcmbQ1qovx7tsV7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvNAGc%2FdJMcacWEa1E%2FTDWJ12bcmbQ1qovx7tsV7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;263&quot; height=&quot;405&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;orchestrator-Worker with Parallelization&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 95px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;패 턴&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;적용 여부&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;Orchestrator-Worker&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;0 (메인이 계획, 서브가 실행)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;Parallelization&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;0 (라운드 내 최대 3개 병렬)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;Sequential&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;0 (라운드 간 의존 관계)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;Evaluator-Optimizer&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span&gt;X (평가-재생성 루프 없음)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 사용한 Workflow 패턴은 &quot;orchestrator-Worker with Parallelization&quot; 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4112&quot; data-origin-height=&quot;2658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFDISh/dJMcahwU2ZX/8f7QiDmtDWmLzSp2M54Xc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFDISh/dJMcahwU2ZX/8f7QiDmtDWmLzSp2M54Xc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFDISh/dJMcahwU2ZX/8f7QiDmtDWmLzSp2M54Xc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFDISh%2FdJMcahwU2ZX%2F8f7QiDmtDWmLzSp2M54Xc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4112&quot; height=&quot;2658&quot; data-origin-width=&quot;4112&quot; data-origin-height=&quot;2658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 자율 반복 workflow를 이용하여 PLAN에 따라 순차적, 병렬로 작업을 수행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ harness에 정의되어 있는 방향성대로 AI가 메인과 서브로 나뉘어&amp;nbsp; Orchestrator-Worker를 수행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sz4sw/dJMcai3AGjz/i6amZruEdLlckyqrxgKY30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sz4sw/dJMcai3AGjz/i6amZruEdLlckyqrxgKY30/img.png&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;2052&quot; data-is-animation=&quot;false&quot; style=&quot;width: 42.3137%; margin-right: 10px;&quot; data-widthpercent=&quot;42.81&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sz4sw/dJMcai3AGjz/i6amZruEdLlckyqrxgKY30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSz4sw%2FdJMcai3AGjz%2Fi6amZruEdLlckyqrxgKY30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1514&quot; height=&quot;2052&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdGBSy/dJMcafsjbMf/SjMuCQHqFiinoPfzjnor4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdGBSy/dJMcafsjbMf/SjMuCQHqFiinoPfzjnor4k/img.png&quot; data-origin-width=&quot;2052&quot; data-origin-height=&quot;2082&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.5235%;&quot; data-widthpercent=&quot;57.19&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdGBSy/dJMcafsjbMf/SjMuCQHqFiinoPfzjnor4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdGBSy%2FdJMcafsjbMf%2FSjMuCQHqFiinoPfzjnor4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2052&quot; height=&quot;2082&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/quW9V/dJMcagdHXPl/BInb5zh0blMc1iA6518KLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/quW9V/dJMcagdHXPl/BInb5zh0blMc1iA6518KLk/img.png&quot; data-origin-width=&quot;1734&quot; data-origin-height=&quot;1582&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.1089%; margin-right: 10px;&quot; data-widthpercent=&quot;43.62&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/quW9V/dJMcagdHXPl/BInb5zh0blMc1iA6518KLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FquW9V%2FdJMcagdHXPl%2FBInb5zh0blMc1iA6518KLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1734&quot; height=&quot;1582&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lnPED/dJMcafsjbMm/KnHAgrb5gAuPpxkW1vC9D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lnPED/dJMcafsjbMm/KnHAgrb5gAuPpxkW1vC9D0/img.png&quot; data-origin-width=&quot;1740&quot; data-origin-height=&quot;1228&quot; data-is-animation=&quot;false&quot; style=&quot;width: 55.7283%;&quot; data-widthpercent=&quot;56.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lnPED/dJMcafsjbMm/KnHAgrb5gAuPpxkW1vC9D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlnPED%2FdJMcafsjbMm%2FKnHAgrb5gAuPpxkW1vC9D0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1740&quot; height=&quot;1228&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 03-14 15시 35분 1차 개발이 완료되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 일부 버그가 존재하였지만 2시간 미만에 MVP를 구성 및 개발이 가능하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 이 프로젝트는 아내와 함께 더 고도화해 나갈 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI Agent를 설계할 때 많은 사람들이 모델이나 프롬프트에 집중한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로 시스템을 만들다 보면 중요한 것은 다음 질문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;ldquo;이 작업을 어떤 workflow로 구성할 것인가?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 Agent는 좋은 모델에서 나오는 것이 아니라&lt;br /&gt;좋은 Workflow 설계에서 시작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 작업을 통해 다시 한번 느낀 점은 AI는 단순히 코드를 생성해 주는 도구가 아니라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 문제를 구조화하고&lt;br /&gt;ㅇ 작업을 분해하고&lt;br /&gt;ㅇ 실행 가능한 개발 흐름을 설계하는&lt;br /&gt;협력형 개발 파트너라는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Agent와 Harness 구조를 이용해 실제로 작은 프로젝트를 실행해 보니&lt;br /&gt;&lt;b&gt;&amp;nbsp; 기획(PRD) &amp;rarr; 설계(Wireframe, Component) &amp;rarr; LLM 전략(Prompt, Integration) &amp;rarr; 구현&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;까지 이어지는 &lt;b&gt;Agent 기반 개발 workflow&lt;/b&gt;를 비교적 짧은 시간 안에 구성할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 AI Agent 기반 개발 방식은 단순한 코드 자동화를 넘어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 제품 기획&lt;br /&gt;ㅇ 시스템 아키텍처 설계&lt;br /&gt;ㅇ 개발 workflow 자동화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;까지 확장될 가능성이 높다고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 작은 실험 수준이지만&lt;br /&gt;&amp;nbsp; 이러한 workflow를 계속 반복하고 정리하다 보면&lt;br /&gt;&amp;nbsp; 언젠가는 &lt;b&gt;개발자와 AI가 함께 만드는 새로운 개발 방식&lt;/b&gt;이 만들어질 것이라 기대한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나 역시 그 흐름 속에서 기록하고 실험하며 계속 배워가려고 한다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>Agent workflow</category>
      <category>Claude</category>
      <category>HARNESS</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1045</guid>
      <comments>https://peterica.tistory.com/1045#entry1045comment</comments>
      <pubDate>Sun, 15 Mar 2026 12:54:58 +0900</pubDate>
    </item>
    <item>
      <title>[AI] 나는 아직도 배우는 중이다</title>
      <link>https://peterica.tistory.com/1044</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DBhFn/dJMcabwC677/I9wFpim22msOnxySkjTGKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DBhFn/dJMcabwC677/I9wFpim22msOnxySkjTGKk/img.jpg&quot; data-origin-width=&quot;2476&quot; data-origin-height=&quot;3492&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.332%; margin-right: 10px;&quot; data-widthpercent=&quot;49.91&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DBhFn/dJMcabwC677/I9wFpim22msOnxySkjTGKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDBhFn%2FdJMcabwC677%2FI9wFpim22msOnxySkjTGKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2476&quot; height=&quot;3492&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/909U1/dJMcahcx6oP/XzoiXftuc1HhKVOCvZGn20/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/909U1/dJMcahcx6oP/XzoiXftuc1HhKVOCvZGn20/img.jpg&quot; data-origin-width=&quot;2516&quot; data-origin-height=&quot;3536&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50.09&quot; style=&quot;width: 49.5052%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/909U1/dJMcahcx6oP/XzoiXftuc1HhKVOCvZGn20/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F909U1%2FdJMcahcx6oP%2FXzoiXftuc1HhKVOCvZGn20%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2516&quot; height=&quot;3536&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 02학번으로 가톨릭대 신학교를 졸업했다.&lt;br /&gt;그리고 2013년부터 소프트웨어 개발자로 살아왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 서로 다른 길처럼 보였다.&lt;br /&gt;신학은 존재와 의미를 묻는 학문이었고,&lt;br /&gt;개발은 현실의 문제를 해결하는 기술이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 삶을 살아가면서 깨닫게 되었다.&lt;br /&gt;배움은 현실과 분리된 것이 아니라&lt;br /&gt;현실을 살아가기 위해 계속 이어지는 과정이라는 것을.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자로 일하면서 나는 더 깊이 이해하고 싶었다.&lt;br /&gt;소프트웨어가 어떻게 만들어지는지,&lt;br /&gt;그리고 앞으로 세상을 바꿀 인공지능이 무엇인지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 다시 학교에 들어갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어공학을 공부했고,&lt;br /&gt;그 다음에는 인공지능과 빅데이터를 공부했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신학교 이후&lt;br /&gt;사이버대학교를 두 번 더 졸업했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;돌아보면 나의 길은 단순하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현실이 나에게 질문을 던졌고,&lt;br /&gt;나는 그 질문에 답하기 위해 다시 배웠다.&lt;br /&gt;그리고 지금도 여전히 배우고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/759&quot;&gt;[AI]&amp;nbsp;인공지능에&amp;nbsp;대한&amp;nbsp;이해(2017에&amp;nbsp;정리한&amp;nbsp;리포트)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어공학부를 다니면서 작성했던 인공지능 리포트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI, 머신러닝, 딥러닝, 그리고 LLM.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때 공부했던 내용들은&lt;br /&gt;지금 내가 하고 있는 일들과 다시 연결되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI플랫폼팀에 있었지만, 공부는 끝이 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 오늘도 오픈소스 검증을 위한&lt;br /&gt;로컬 LLM 연동 방법을 고민하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;롤 기반 정적 분석과&lt;br /&gt;맥북에서 동작하는 로컬 LLM을 이용해&lt;br /&gt;코드 분석 도우미를 만드는 작업을 진행하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI는 발전하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2017년 리포트에도 언급하였듯이&amp;nbsp;&lt;br /&gt;PIM과 같은 하드웨어적 혁신이 오면&lt;br /&gt;기술성장은 기하급수적으로 발전하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현실의 필요성 앞에서&lt;br /&gt;나는 하기 위해 배우고,&lt;br /&gt;배우기 위해 다시 해 나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배움이 끝나서 일이 시작되는 것이 아니라&lt;br /&gt;일을 하면서 다시 배우게 되고&lt;br /&gt;배우면서 또 새로운 일을 시작하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 과정은&lt;br /&gt;어떤 끝이 있는 길이라기보다&lt;br /&gt;계속 이어지는 하나의 여정처럼 느껴진다.&lt;/p&gt;
&lt;p data-end=&quot;609&quot; data-start=&quot;590&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;609&quot; data-start=&quot;590&quot; data-ke-style=&quot;style2&quot;&gt;&amp;ldquo;나는&amp;nbsp;하기&amp;nbsp;위해&amp;nbsp;배우고,&amp;nbsp;배우면서&amp;nbsp;해&amp;nbsp;나가는&amp;nbsp;여정&amp;nbsp;위에&amp;nbsp;있다.&amp;rdquo;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/761&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI]&amp;nbsp;Peterica의&amp;nbsp;AI공부와&amp;nbsp;비젼&amp;nbsp;정리&lt;/a&gt;&lt;/p&gt;</description>
      <category>AI</category>
      <category>ai study</category>
      <category>PETERICA</category>
      <category>고려사이버대학교</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1044</guid>
      <comments>https://peterica.tistory.com/1044#entry1044comment</comments>
      <pubDate>Thu, 12 Mar 2026 02:13:55 +0900</pubDate>
    </item>
    <item>
      <title>[AI] 개발자가 직접 만드는 Agent Harness - Ralph Loop와 Agentic Workflow Harness의 차이</title>
      <link>https://peterica.tistory.com/1043</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSNb%2FbtsDwEYjHwl%2FgfNRKiPAkerKOYJ40TLVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;1026&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1041&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI] Agentic Workflow와 harness 개념 중심&lt;/a&gt;을 작성하면서 &lt;b&gt;Harness&lt;/b&gt;(발음은 &quot;하-니스&quot;이다^^)에 대해서 알게 되었다.&lt;br /&gt;처음에는 단순히 &amp;ldquo;LLM을 실행시키는 코드&amp;rdquo; 정도로 이해했지만, 최근 여러 사례를 살펴보면서 생각이 조금 바뀌었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 자체는 &lt;b&gt;두뇌&lt;/b&gt;일 뿐이다.&lt;br /&gt;실제 시스템에서 일을 하게 만드는 것은 &lt;b&gt;Harness&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 한 개발자가 다음 두 가지에 대해서 비교 질문을 주었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Ralph Loop (Ralph Wiggum Technique)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Agentic Workflow Harness&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 AI 에이전트를 실행하는 구조이지만, 철학과 구현 방식이 상당히 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이를 이해하면 &lt;b&gt;AI 에이전트 시스템을 어떻게 설계해야 하는지&lt;/b&gt; 방향이 보이기 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ㅁ Harness란 무엇인가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Harness는 단순히 말하면 다음과 같은 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ LLM에게 작업을 전달한다&lt;br /&gt;ㅇ 실행 결과를 수집한다&lt;br /&gt;ㅇ 필요한 도구(tool)를 호출하게 한다&lt;br /&gt;ㅇ 반복 실행을 관리한다&lt;br /&gt;ㅇ 상태와 기록을 관리한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM을 실제 시스템에서 &amp;ldquo;일하게 만드는 실행 인프라&amp;rdquo; &lt;span style=&quot;color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;라고 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 에이전트 시스템을 만들 때 중요한 것은 모델 자체보다 &lt;b&gt;이 Harness 설계&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Ralph Loop의 Harness 구조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ralph Loop는 매우 단순한 방식이다.&lt;br /&gt;핵심 철학은 &lt;b&gt;순진한 끈기 (naive persistence)&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 구현 방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bash while loop&lt;/li&gt;
&lt;li&gt;쉘 스크립트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 기본 동작&lt;/p&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;while true
    LLM에게 작업 요청
    코드 생성
    테스트 실행
    실패하면 다시 요청&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 놀라울 정도로 단순하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 에이전트에게 다음을 계속 반복한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 작업 명세 (spec.md) 전달&lt;br /&gt;ㅇ 코드 생성&lt;br /&gt;ㅇ 테스트 실행&lt;br /&gt;ㅇ 실패 시 수정&lt;br /&gt;ㅇ 완료될 때까지 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정이 밤새도록 돌아간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Ralph Loop의 특징&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;Stateless 구조&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 실행은 거의 새로 시작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태는 다음을 통해 간접적으로 유지된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Git history&lt;/li&gt;
&lt;li&gt;파일 시스템&lt;/li&gt;
&lt;li&gt;생성된 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리가 아니라 코드 자체가 상태가 된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;설정이 매우 단순&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임워크가 필요 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 다음 정도면 끝난다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;prompt.md
run_tests.sh
ralph.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 개발자가 실험하기에는 매우 좋은 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;문제점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 목표 검증이 약함&lt;br /&gt;- 무한 루프 가능&lt;br /&gt;- 잘못된 방향으로 계속 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끈기는 있지만 통제가 약하다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ㅁ Agentic Workflow의 Harness&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 등장하는 Agent 시스템은 완전히 다른 접근을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 철학은 다음이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI를 통제 가능한 시스템으로 만든다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 Harness는 단순 실행 루프가 아니라 &lt;b&gt;소프트웨어 인프라&lt;/b&gt;가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 구현 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 다음과 같은 계층으로 구성된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Agent framework (LangChain / CrewAI / custom)&lt;/li&gt;
&lt;li&gt;Tool system&lt;/li&gt;
&lt;li&gt;Memory system&lt;/li&gt;
&lt;li&gt;Guardrails&lt;/li&gt;
&lt;li&gt;Human-in-the-loop&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&amp;nbsp;LLM을 감싸는 &lt;b&gt;제어 레이어&lt;/b&gt;가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Agent Harness의 구조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 구조는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Task Planner
     &amp;darr;
Agent Executor
     &amp;darr;
Tool Layer
     &amp;darr;
Memory
     &amp;darr;
Observation / Logging&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징은 &lt;b&gt;stateful 시스템&lt;/b&gt;이라는 점이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전 행동 기록&lt;/li&gt;
&lt;li&gt;실패 로그&lt;/li&gt;
&lt;li&gt;작업 진행 상태&lt;/li&gt;
&lt;li&gt;&amp;nbsp;메모리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;모든&amp;nbsp;것이&amp;nbsp;관리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ㅁ Ralph Loop vs Agent Harness&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 차이는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분Ralph LoopAgent Harness&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Ralph Loop&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Agent Harness&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;핵심 개념&lt;/td&gt;
&lt;td&gt;단순 반복&lt;/td&gt;
&lt;td&gt;시스템 제어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구현 난이도&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;상태 관리&lt;/td&gt;
&lt;td&gt;거의 없음&lt;/td&gt;
&lt;td&gt;Stateful&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;제어&lt;/td&gt;
&lt;td&gt;약함&lt;/td&gt;
&lt;td&gt;강함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;개인 개발 실험&lt;/td&gt;
&lt;td&gt;장기 자동화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ralph Loop = 끈기 기반 자동화&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Noto Serif KR', serif; text-align: center;&quot;&gt;Agent Harness = &lt;/span&gt;&lt;b&gt;거버넌스 기반 자동화&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 앞으로의 방향&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 AI 에이전트 시스템의 흐름은 점점 명확해지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2024 &amp;rarr; 모델 경쟁&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2025 &amp;rarr; Agent 등장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2026 &amp;rarr; &lt;b&gt;Agent Harness 경쟁&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 중요한 것은 모델이 아니라 &lt;b&gt;에이전트를 어떻게 통제하는가&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이 문제는 결국 &lt;b&gt;소프트웨어 아키텍처 문제&lt;/b&gt;가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ralph Loop는 매우 흥미로운 접근이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순한 반복만으로도 AI 에이전트를 꽤 강력하게 활용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제 서비스 환경에서는 다음이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상태 관리&lt;br /&gt;- 실행 통제&lt;br /&gt;- 안전 장치&lt;br /&gt;- 장기 작업 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 결국 시스템은 &lt;b&gt;Agent Harness 형태로 발전하게 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 에이전트 시대에는&lt;br /&gt;모델보다 Harness 설계가 더 중요해질 가능성이 높다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>HARNESS</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1043</guid>
      <comments>https://peterica.tistory.com/1043#entry1043comment</comments>
      <pubDate>Wed, 11 Mar 2026 21:35:08 +0900</pubDate>
    </item>
    <item>
      <title>[독후감] 환율의 대전환, 오건영(읽는 중)</title>
      <link>https://peterica.tistory.com/1042</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부의 흐름을 이해하고 싶어서 읽었던 책이 &lt;b&gt;부의 대이동&lt;/b&gt;이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시 책을 읽으며 느낀 점은 하나였다. 이 책은 단순히 투자 전략을 설명하는 책이 아니라, 돈이 이동하는 구조를 설명하는 책이라는 점이다. 금리, 환율, 채권, 달러 같은 요소들이 각각 따로 움직이는 것이 아니라 하나의 시스템 안에서 서로 영향을 주며 움직인다는 관점이 인상적이었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그래서 이번에는 &lt;b&gt;환율의 대전환&lt;/b&gt;을 읽어 보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 바로 책의 내용을 따라가기보다는, 먼저 저자가 어떤 방식으로 시장을 설명하는 사람인지 이해하는 것이 더 중요하다고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 작가를 먼저 이해하려 하는가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경제서를 읽다 보면 같은 현상을 전혀 다른 방식으로 설명하는 저자들을 만나게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 사람은 시장을 예측하려 하고, 어떤 사람은 특정 자산을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;b&gt;오건영&lt;/b&gt;의 설명 방식은 조금 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그는 시장을 맞히려 하지 않는다.&lt;br /&gt;대신 시장이 왜 그런 방향으로 움직일 수밖에 없는지를 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 그의 책을 읽을 때 중요한 것은 &amp;ldquo;지금 무엇을 사야 하는가&amp;rdquo;가 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 자본이 그 방향으로 이동하는가&lt;/b&gt;를 이해하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 오건영이 시장을 설명하는 방식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오건영의 설명은 항상 하나의 공통된 관점에서 시작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 시장을 개별 자산으로 보지 않는다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환율, 금리, 채권, 주식, 달러, 금을 각각 따로 보는 것이 아니라 하나의 시스템으로 바라본다.&lt;br /&gt;한 자산의 변화는 다른 자산의 원인이 되기도 하고 결과가 되기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 결과보다 구조를 설명한다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 시점의 주가나 환율을 맞히는 것에는 큰 의미를 두지 않는다.&lt;br /&gt;대신 금리 정책, 유동성, 자본 이동 같은 요소들이 어떤 구조로 연결되어 있는지를 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 위기는 예외가 아니라 반복되는 현상으로 본다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금융 위기는 항상 예상하지 못한 방식으로 찾아온다.&lt;br /&gt;하지만 위기가 올 때 강해지는 자산과 자본의 이동 방향은 일정한 패턴을 가진다고 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 이번 책을 읽는 관점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 이유로 나는 &lt;b&gt;환율의 대전환&lt;/b&gt;을 투자 전략서로 읽기보다는 금융 시스템을 이해하는 책으로 읽어 보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환율을 단순히 통화의 가격으로 보는 것이 아니라&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;금리 변화&lt;/li&gt;
&lt;li&gt;글로벌 자본 이동&lt;/li&gt;
&lt;li&gt;달러 시스템&lt;/li&gt;
&lt;li&gt;금융 위기 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 네 가지 축 속에서 바라보는 것이 이 책을 읽는 핵심 관점이 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 오건영의 책은 자산을 추천하는 책이라기보다 시장을 읽는 사고 방식을 훈련시키는 책에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 글에서는 먼저 작가의 관점을 정리했고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;환율의 대전환을 읽으며 정리한 내용&lt;/b&gt;을 차례로 기록해 보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Part 1 &amp;mdash; 달러&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-end=&quot;547&quot; data-start=&quot;515&quot; data-ke-size=&quot;size16&quot;&gt;달러를 이해해야 환율이 보인다&lt;/p&gt;
&lt;p data-end=&quot;568&quot; data-start=&quot;549&quot; data-ke-size=&quot;size16&quot;&gt;이 파트의 핵심 메시지는 단순하다.&lt;/p&gt;
&lt;p data-end=&quot;601&quot; data-start=&quot;570&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;환율은 통화의 가격이 아니라 자본 이동의 결과다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;634&quot; data-start=&quot;603&quot; data-ke-size=&quot;size16&quot;&gt;그리고 그 중심에는 항상 &lt;b&gt;달러 시스템&lt;/b&gt;이 존재한다.&lt;/p&gt;
&lt;h4 data-end=&quot;657&quot; data-start=&quot;641&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 원화는 정말 약한 통화일까?&lt;/h4&gt;
&lt;p data-end=&quot;715&quot; data-start=&quot;659&quot; data-ke-size=&quot;size16&quot;&gt;우리는 흔히 원화를 약한 통화라고 말한다.&lt;br /&gt;하지만 책에서는 이 질문 자체를 다시 생각하게 만든다.&lt;/p&gt;
&lt;p data-end=&quot;715&quot; data-start=&quot;659&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f7f7f7; color: #000000; text-align: start;&quot;&gt;관점에 따라 원화 가치는 달라진다. 오히려 다른 나라보다 안정적이었다.&lt;/span&gt;&lt;span style=&quot;background-color: #f7f7f7; color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;759&quot; data-start=&quot;717&quot; data-ke-size=&quot;size16&quot;&gt;환율은 절대적인 값이 아니라 &lt;b&gt;두 나라 경제의 상대 비교&lt;/b&gt;이기 때문이다.&lt;/p&gt;
&lt;p data-end=&quot;784&quot; data-start=&quot;761&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;784&quot; data-start=&quot;761&quot; data-ke-size=&quot;size16&quot;&gt;환율을 결정하는 요소는 크게 다음과 같다.&lt;/p&gt;
&lt;p data-end=&quot;818&quot; data-start=&quot;786&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ 금리&lt;br /&gt;ㅇ 성장률&lt;br /&gt;ㅇ 무역 구조&lt;br /&gt;ㅇ 자본 이동&lt;/p&gt;
&lt;p data-end=&quot;867&quot; data-start=&quot;820&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;867&quot; data-start=&quot;820&quot; data-ke-size=&quot;size16&quot;&gt;즉 원화가 약하다기보다&lt;br /&gt;&lt;b&gt;달러와 비교했을 때 상대적인 위치가 변하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;908&quot; data-start=&quot;869&quot; data-ke-size=&quot;size16&quot;&gt;달러원 환율 그래프를 보면 사실상 한국 경제의 역사가 그대로 나타난다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;961&quot; data-start=&quot;910&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;922&quot; data-start=&quot;910&quot;&gt;IMF 외환위기&lt;/li&gt;
&lt;li data-end=&quot;935&quot; data-start=&quot;923&quot;&gt;글로벌 금융위기&lt;/li&gt;
&lt;li data-end=&quot;948&quot; data-start=&quot;936&quot;&gt;중국 성장 특수&lt;/li&gt;
&lt;li data-end=&quot;961&quot; data-start=&quot;949&quot;&gt;최근의 강달러 흐름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;979&quot; data-start=&quot;963&quot; data-ke-size=&quot;size16&quot;&gt;환율은 경제 사건들의 결과다.&lt;/p&gt;
&lt;h4 data-end=&quot;1001&quot; data-start=&quot;986&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 한국 원화가 강했던 시대, 미국이 약했던 시기&lt;/h4&gt;
&lt;p data-end=&quot;1069&quot; data-start=&quot;1003&quot; data-ke-size=&quot;size16&quot;&gt;2000년대 이후 원화는 비교적 안정적인 흐름을 보였다.&lt;br /&gt;많은 사람들이 이를 한국 경제의 체력 때문이라고 생각한다.&lt;/p&gt;
&lt;p data-end=&quot;1095&quot; data-start=&quot;1071&quot; data-ke-size=&quot;size16&quot;&gt;하지만 책에서는 조금 다른 해석을 제시한다.&lt;/p&gt;
&lt;p data-end=&quot;1113&quot; data-start=&quot;1097&quot; data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;중국 특수&lt;/b&gt;였다.&lt;/p&gt;
&lt;p data-end=&quot;1124&quot; data-start=&quot;1115&quot; data-ke-size=&quot;size16&quot;&gt;당시 한국 경제는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1168&quot; data-start=&quot;1126&quot;&gt;중국으로의 대규모 수출&lt;/li&gt;
&lt;li data-end=&quot;1168&quot; data-start=&quot;1126&quot;&gt;구조적인 무역 흑자&lt;/li&gt;
&lt;li data-end=&quot;1168&quot; data-start=&quot;1126&quot;&gt;외환보유고 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1197&quot; data-start=&quot;1170&quot; data-ke-size=&quot;size16&quot;&gt;이 세 가지 요소로 인해 달러 유입이 지속되었다.&lt;/p&gt;
&lt;p data-end=&quot;1248&quot; data-start=&quot;1199&quot; data-ke-size=&quot;size16&quot;&gt;즉 원화 강세는&lt;br /&gt;한국 자체의 힘이라기보다 &lt;b&gt;글로벌 무역 구조의 결과&lt;/b&gt;였던 셈이다.&lt;/p&gt;
&lt;p data-end=&quot;1248&quot; data-start=&quot;1199&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1269&quot; data-start=&quot;1255&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 강달러가 나타나는 구조&lt;/h4&gt;
&lt;p data-end=&quot;1310&quot; data-start=&quot;1271&quot; data-ke-size=&quot;size16&quot;&gt;최근 글로벌 금융 시장에서 가장 중요한 변화는 &lt;b&gt;강달러 흐름&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1337&quot; data-start=&quot;1312&quot; data-ke-size=&quot;size16&quot;&gt;저자는 그 이유를 미국 경제 구조에서 찾는다.&lt;/p&gt;
&lt;p data-end=&quot;1337&quot; data-start=&quot;1312&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1355&quot; data-start=&quot;1339&quot; data-ke-size=&quot;size16&quot;&gt;대표적인 요소는 다음과 같다.&lt;/p&gt;
&lt;p data-end=&quot;1403&quot; data-start=&quot;1357&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ 셰일 오일 혁명&lt;br /&gt;ㅇ 기술 산업 성장&lt;br /&gt;ㅇ 높은 생산성&lt;br /&gt;ㅇ 자본시장 규모&lt;/p&gt;
&lt;p data-end=&quot;1430&quot; data-start=&quot;1405&quot; data-ke-size=&quot;size16&quot;&gt;미국은 여전히 전 세계 자본이 몰리는 경제다.&lt;/p&gt;
&lt;p data-end=&quot;1491&quot; data-start=&quot;1432&quot; data-ke-size=&quot;size16&quot;&gt;위기가 발생하면 자본은 가장 안전한 시장으로 이동한다.&lt;br /&gt;그 결과 달러는 반복적으로 강세를 보이게 된다.&lt;/p&gt;
&lt;p data-end=&quot;1491&quot; data-start=&quot;1432&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1512&quot; data-start=&quot;1498&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 한국 환율 구조의 변화&lt;/h4&gt;
&lt;p data-end=&quot;1547&quot; data-start=&quot;1514&quot; data-ke-size=&quot;size16&quot;&gt;Part 1에서 가장 중요한 내용은 이 부분이라고 생각한다.&lt;/p&gt;
&lt;p data-end=&quot;1600&quot; data-start=&quot;1549&quot; data-ke-size=&quot;size16&quot;&gt;저자는 한국 환율의 큰 흐름이&lt;br /&gt;앞으로 이전과는 다른 방향으로 움직일 가능성을 이야기한다.&lt;/p&gt;
&lt;p data-end=&quot;1600&quot; data-start=&quot;1549&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1615&quot; data-start=&quot;1602&quot; data-ke-size=&quot;size16&quot;&gt;그 이유는 다음과 같다.&lt;/p&gt;
&lt;p data-end=&quot;1668&quot; data-start=&quot;1617&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 중국 성장 둔화&lt;/b&gt;&lt;br /&gt;&lt;b&gt;ㅇ 대중 수출 감소&lt;/b&gt;&lt;br /&gt;&lt;b&gt;ㅇ 무역 흑자 축소&lt;/b&gt;&lt;br /&gt;&lt;b&gt;ㅇ 미국과의 금리 역전&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1750&quot; data-start=&quot;1670&quot; data-ke-size=&quot;size16&quot;&gt;과거에는 무역 흑자가 환율을 안정시키는 역할을 했다.&lt;br /&gt;하지만 앞으로는 &lt;b&gt;자본 이동과 금리 차이가 환율을 더 크게 움직일 가능성&lt;/b&gt;이 높다.&lt;/p&gt;
&lt;p data-end=&quot;1750&quot; data-start=&quot;1670&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1777&quot; data-start=&quot;1757&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 환율은 방향보다 변동성이 중요하다&lt;/h4&gt;
&lt;p data-end=&quot;1812&quot; data-start=&quot;1779&quot; data-ke-size=&quot;size16&quot;&gt;최근 글로벌 경제에서 또 하나 중요한 변수는 &lt;b&gt;정치&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-end=&quot;1842&quot; data-start=&quot;1814&quot; data-ke-size=&quot;size16&quot;&gt;특히 미국 정치 변화는 환율 변동성을 크게 만든다.&lt;/p&gt;
&lt;p data-end=&quot;1879&quot; data-start=&quot;1844&quot; data-ke-size=&quot;size16&quot;&gt;책에서는 트럼프 정책을 예로 들며 다음과 같은 구조를 설명한다.&lt;/p&gt;
&lt;p data-end=&quot;1912&quot; data-start=&quot;1881&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ 관세 정책&lt;br /&gt;ㅇ 감세 정책&lt;br /&gt;ㅇ 무역 불균형 조정&lt;/p&gt;
&lt;p data-end=&quot;1966&quot; data-start=&quot;1914&quot; data-ke-size=&quot;size16&quot;&gt;이 정책들은 달러 강세를 만들기도 하지만 동시에 &lt;b&gt;환율 변동성을 확대&lt;/b&gt;시킬 가능성이 높다.&lt;/p&gt;
&lt;p data-end=&quot;2018&quot; data-start=&quot;1968&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2018&quot; data-start=&quot;1968&quot; data-ke-size=&quot;size16&quot;&gt;즉 앞으로 환율 시장의 특징은&lt;br /&gt;단순한 상승이나 하락보다 &lt;b&gt;변동성 확대&lt;/b&gt;일 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2018&quot; data-start=&quot;1968&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;2040&quot; data-start=&quot;2025&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 달러원 환율의 장기 흐름&lt;/h4&gt;
&lt;p data-end=&quot;2063&quot; data-start=&quot;2042&quot; data-ke-size=&quot;size16&quot;&gt;Part 1의 결론은 비교적 명확하다.&lt;/p&gt;
&lt;p data-end=&quot;2087&quot; data-start=&quot;2065&quot; data-ke-size=&quot;size16&quot;&gt;저자가 보는 구조적 흐름은 다음과 같다.&lt;/p&gt;
&lt;p data-end=&quot;2105&quot; data-start=&quot;2089&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ 단기: 환율 변동성 확대&lt;/p&gt;
&lt;p data-end=&quot;2122&quot; data-start=&quot;2107&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ 중기: 환율 밴드 상승&lt;/p&gt;
&lt;p data-end=&quot;2140&quot; data-start=&quot;2124&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ 장기: 완만한 달러 강세&lt;/p&gt;
&lt;p data-end=&quot;2209&quot; data-start=&quot;2142&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2209&quot; data-start=&quot;2142&quot; data-ke-size=&quot;size16&quot;&gt;환율은 한 방향으로 움직이기보다&lt;br /&gt;&lt;b&gt;&amp;nbsp; 위아래로 크게 흔들리는 구조 속에서 조금씩 상승할 가능성&lt;/b&gt;이 있다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Part 2 &amp;mdash; 엔화&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Part 1에서 달러를 읽으며 느꼈던 것은 &lt;b&gt;&amp;ldquo;돈은 결국 달러로 모인다&amp;rdquo;&lt;/b&gt;는 구조였다.&lt;br /&gt;그렇다면 자연스럽게 이런 질문이 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그 돈은 어디에서 시작되는 걸까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Part 2를 읽으며 그 답이 엔화라는 것을 이해하게 되었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 엔화는 투자되는 돈이 아니라, 시작되는 돈이다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 엔화 약세를 단순하게 생각했다.&lt;br /&gt;일본 경제가 약하니까 통화 가치도 약해지는 것이라고.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 책을 읽으며 이 생각이 완전히 바뀌었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔화는 약한 통화라서 약한 것이 아니라,&lt;br /&gt;&lt;b&gt;역할 자체가 다른 통화&lt;/b&gt;였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔화는 투자되는 돈이 아니라&lt;br /&gt;&lt;b&gt;투자하기 위해 빌리는 돈&lt;/b&gt;이었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 하필 엔화인가?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책을 읽으며 이해한 구조는 단순했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일본은 오랜 기간 저금리 상태를 유지해 왔다.&lt;br /&gt;돈을 빌리는 입장에서는 가장 부담이 적은 통화다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 다른 나라, 특히 미국은 금리가 높다.&lt;br /&gt;투자하면 더 많은 수익을 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 투자자들은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;엔화를 빌리고 &amp;rarr; 달러로 바꿔 &amp;rarr; 미국에 투자&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름이 반복되면서 엔화는 자연스럽게&lt;br /&gt;&lt;b&gt;글로벌 투자 자금의 출발점&lt;/b&gt;이 된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 이해가 안 됐던 부분&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽으면서 가장 이해가 안 됐던 부분은 이것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;돈을 계속 풀면 인플레이션이 생겨야 하는 것 아닌가?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 알고 있던 상식은 이랬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;돈을 많이 찍으면 &amp;rarr; 물가 상승 &amp;rarr; 통화 가치 하락 &amp;rarr; 결국 문제 발생&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 일본은 오랫동안 이 구조에서 벗어나 있었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 일본은 달랐을까&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책을 읽으며 이해한 건, 일본은 돈을 풀어도&lt;br /&gt;&amp;nbsp; 그 돈이 경제 안에서 강하게 돌지 않는 구조였다는 점이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사람들은 소비보다 저축을 선택하고&lt;/li&gt;
&lt;li&gt;기업은 투자보다 현금을 쌓아두고&lt;/li&gt;
&lt;li&gt;경제 전체의 성장 기대가 낮다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 환경에서는 돈이 늘어나도 수요가 크게 증가하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 물가도 쉽게 오르지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조 덕분에 일본은 오랫동안 저금리를 유지할 수 있었고, 그 결과 엔화는 조달 통화가 될 수 있었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 그래서 엔화는 두 가지 얼굴을 가진다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조를 이해하고 나니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;엔화의 움직임도 자연스럽게 이해되기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평상시에는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엔화를 빌려서 투자하기 때문에&lt;br /&gt;&amp;rarr; 엔화는 계속 시장에 공급되고&lt;br /&gt;&amp;rarr; 약세를 보인다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 위기가 발생하면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;투자자들이 자산을 정리하면서&lt;br /&gt;&amp;rarr; 빌렸던 엔화를 갚아야 하고&lt;br /&gt;&amp;rarr; 엔화를 다시 사게 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 이때 엔화는 강세를 보인다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Part 2를 읽고 나서&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Part 2를 읽으며 가장 크게 바뀐 점은&amp;nbsp;엔화를 바라보는 관점이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에는 엔화를 단순히&amp;ldquo;일본의 통화&amp;rdquo;로만 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 지금은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 엔화를 보면 일본 경제가 아니라&lt;b&gt;&amp;nbsp;글로벌 자본이 어떻게 움직이고 있는지&lt;/b&gt;를 보게 된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp; 엔화는 일본의 통화가 아니라. 글로벌 투자 자금이 시작되는 통화다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>책이야기</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1042</guid>
      <comments>https://peterica.tistory.com/1042#entry1042comment</comments>
      <pubDate>Sat, 7 Mar 2026 15:47:45 +0900</pubDate>
    </item>
    <item>
      <title>[독후감] 처음 만나는 마음챙김 명상</title>
      <link>https://peterica.tistory.com/1038</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 작가 이해하기: 존 카밧진은 어떤 사람인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;『처음 만나는 마음챙김 명상』을 읽으면서 한 가지 궁금해졌다.&lt;br /&gt;이 책을 쓴 사람은 어떤 배경에서 이런 언어를 선택했을까.&lt;br /&gt;작가를 이해하면, 글은 설명이 아니라 대화가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 존 카밧진의 배경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;존 카밧진(Jon Kabat-Zinn)은 종교 지도자가 아니다. 그는 MIT에서 수학한 분자생물학 박사이며, 매사추세츠 의과대학 교수였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그의 출발점은 수행이 아니라 과학이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1979년 그는 병원 내에 MBSR(Mindfulness-Based Stress Reduction, 마음챙김 기반 스트레스 완화) 프로그램을 만들었다.&lt;br /&gt;만성 통증과 스트레스 환자들을 대상으로 8주간 명상 훈련을 진행했고, 그 효과를 임상 데이터로 검증했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 그는 명상을 &amp;lsquo;신비 체험&amp;rsquo;이 아니라 &amp;lsquo;훈련 가능한 기술&amp;rsquo;로 다룬 사람이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;그는 무엇을 번역했는가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;존 카밧진은 불교 수행 전통(선, 위빠사나)에서 핵심 원리를 가져왔다.&lt;br /&gt;그러나 종교적 용어는 제거했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 이렇게 번역했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;깨달음 &amp;rarr; 자각&lt;/li&gt;
&lt;li&gt;수행 &amp;rarr; 훈련&lt;/li&gt;
&lt;li&gt;해탈 &amp;rarr; 반응하지 않는 주의 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그는 명상을 믿음의 영역이 아니라 관찰의 영역으로 이동시켰다.&lt;br /&gt;그래서 그의 문장은 감정적이지 않고, 절제되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 생각에 문제가 있는 것은 아니다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생각을 없애라고 하지 않고, 생각을 &amp;lsquo;보라&amp;rsquo;고 말한다.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;감정을 억누르라고 하지 않고, 감정이 일어나는 과정을 알아차리라고 말한다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각을 자각(알아차림)이라는 보다 큰 장에 담아 살피지 않는다면 생각은 우리의 통제력을 벗어나 문제를 일으킬 수도 있다. 제대로 살피지 않은 유해한 감정과 결합될 때 생각은 우리 자신과 타인 그리고 어쩌면 세상에 커다란 고통을 입힐 수도 있다.( p24)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한편 우리의 마음 자체는 깊은 바다처럼 그 특성이 깊고 방대하고 본질적으로 고요하다.(p25)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;그의 태도&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그는 위로하지 않는다.&lt;br /&gt;대신 질문한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;지금 이 순간, 무엇을 경험하고 있습니까?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 질문은 친절하지만 단호하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;생각을 없애라고 하지 않고, 생각을 &amp;lsquo;보라&amp;rsquo;고 말한다.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;감정을 억누르라고 하지 않고, 감정이 일어나는 과정을 알아차리라고 말한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그의 글이 건조하게 느껴지는 이유는 여기에 있다.&lt;br /&gt;그는 상담가가 아니라 연구자에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;그래서 이 책은 무엇인가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 책은 힐링 에세이가 아니다.&lt;br /&gt;&lt;b&gt;의식의 작동 방식을 설명하는 매뉴얼&lt;/b&gt;에 가깝다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생각은 문제인가? 아니다.&lt;/li&gt;
&lt;li&gt;문제는 생각과 동일시되는 자동 반응이다.&lt;/li&gt;
&lt;li&gt;자각은 통제가 아니라 관찰이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그의 메시지는 단순하다.&lt;br /&gt;삶을 바꾸기 전에, 먼저 주의를 바꾸라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 가톨릭 신자의 관점에서 본 마음챙김 명상&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;『처음 만나는 마음챙김 명상』을 읽으면서 나는 자연스럽게 &amp;lsquo;기도&amp;rsquo;를 떠올렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;나는 가톨릭 신자이기 때문에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책에서 말하는 명상의 경험을 전혀 낯설게 느끼지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오히려 오래전부터 교회 안에서 경험해 왔던 묵상과 관상 기도의 방식과 상당히 닮아 있다고 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 자각에 머문다는 것과 기도&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책에서는 끊임없이 &lt;b&gt;&amp;ldquo;자각(알아차림)에 머무는 것&amp;rdquo;&lt;/b&gt;을 강조한다.&lt;br /&gt;생각과 감정이 일어나더라도 그것을 억누르지 않고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;판단하지도 않고, 그저 알아차리는 상태를 유지하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 설명을 읽으며 나는 기도할 때의 상태를 떠올렸다.&lt;br /&gt;기도는 단순히 말을 많이 하는 시간이 아니라, 하느님 앞에서 조용히 머무는 시간이기도 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각이 떠오르기도 하고 감정이 움직이기도 하지만, 그 모든 것을 하느님 앞에서 바라보는 상태가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 명상에서 말하는 자각의 상태는,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신앙의 언어로 말하면 &lt;b&gt;하느님 앞에 머무는 현존의 상태&lt;/b&gt;와 크게 다르지 않다고 느껴졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 하느님의 사랑 안에서의 자각&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책에서는 자각을 &lt;b&gt;&amp;ldquo;엄마가 아이를 안아 주듯 경험을 품어 안는 상태&amp;rdquo;&lt;/b&gt;라고 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 표현을 읽으며 &lt;b&gt;나는 하느님이 인간을 바라보는 방식과 닮아 있다는 생각&lt;/b&gt;이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가톨릭 신앙에서 하느님은 인간을 있는 그대로 사랑하시는 분이다.&lt;br /&gt;완벽해서 사랑받는 것이 아니라, 부족함과 약함까지 포함한 존재 자체를 사랑하신다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;b&gt;기도 속에서 자신의 생각과 감정, 상처와 불안을 그대로 바라볼 수 있는 것이다.&lt;/b&gt;&lt;br /&gt;그 모든 것을 판단하지 않고 받아들이는 자각의 태도는, 어쩌면 &lt;b&gt;하느님의 사랑을 신뢰하는 태도&lt;/b&gt;와 연결되어 있는지도 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ 명상과 기도의 차이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 마음챙김 명상과 가톨릭 기도는 동일한 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마음챙김 명상은 자각 그 자체에 머무는 훈련에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 가톨릭 기도는 그 자각 속에서 &lt;b&gt;하느님과의 관계를 경험하는 행위&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 두 경험은 서로 충돌하기보다는, 서로를 이해할 수 있는 지점이 있다고 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마음챙김 명상은 &lt;b&gt;주의를 맑게 하는 훈련&lt;/b&gt;이고,&lt;br /&gt;기도는 그 맑은 주의 속에서 &lt;b&gt;하느님을 만나는 경험&lt;/b&gt;이라고 볼 수 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅁ 마무리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작가를 알고 나니 이 책의 톤이 이해된다.&lt;br /&gt;따뜻함보다는 명료함, 위로보다는 구조 설명.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;존 카밧진과 대화하는 느낌은 누군가가 조용히 옆에 앉아 묻는 질문에&amp;nbsp;스스로 답하게 되는 경험에 가깝다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 책을 읽으며 나는 명상을 새로운 수행으로 받아들이기보다는, 내가 이미 알고 있던 기도의 또 다른 표현처럼 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 생각을 억누르지 않고 바라보는 것,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 판단하지 않고 현재에 머무는 것,&lt;br /&gt;&amp;nbsp; 그리고 그 순간 안에서 존재를 있는 그대로 받아들이는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 모든 경험은 결국 하나의 질문으로 이어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;지금 이 순간, 나는 무엇을 바라보고 있는가.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 신앙의 언어로 다시 말하면,&lt;br /&gt;그 질문은 결국 이렇게 바뀌는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;지금 이 순간, 나는 하느님 앞에 어떻게 서 있는가.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;</description>
      <category>책이야기</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1038</guid>
      <comments>https://peterica.tistory.com/1038#entry1038comment</comments>
      <pubDate>Sat, 7 Mar 2026 15:35:35 +0900</pubDate>
    </item>
    <item>
      <title>[AI] Agentic Workflow와 harness 개념 중심</title>
      <link>https://peterica.tistory.com/1041</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI]&amp;nbsp;Peterica의&amp;nbsp;AI공부와&amp;nbsp;비젼&amp;nbsp;정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;a href=&quot;https://youtu.be/EQ-Rnx-k-Ec?si=gCwsrlAwW0J69-eQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;EP 86. 진짜 내 일을 해결하는 Agentic Workflow (Lablup 신정규 대표) 영상&lt;/a&gt;의&amp;nbsp;핵심&amp;nbsp;흐름을&amp;nbsp;Agentic&amp;nbsp;Workflow와&amp;nbsp;harness&amp;nbsp;개념&amp;nbsp;중심으로&amp;nbsp;챕터화한&amp;nbsp;요약이다.&amp;nbsp;각&amp;nbsp;구간은&amp;nbsp;실제&amp;nbsp;대화&amp;nbsp;흐름&amp;nbsp;기준으로&amp;nbsp;묶었으며,&amp;nbsp;실무&amp;nbsp;적용&amp;nbsp;포인트를&amp;nbsp;중심으로&amp;nbsp;정리하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;Agentic&amp;nbsp;AI의&amp;nbsp;패러다임&amp;nbsp;전환&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 인사이트(약&amp;nbsp;31:27)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI 성능 확장은 더 이상 &lt;b&gt;모델 크기 증가만으로 해결되지 않는다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;대신 &lt;b&gt;에이전트 수를 늘리는 방식(agent swarm)&lt;/b&gt;으로 확장한다.&lt;/li&gt;
&lt;li&gt;즉, &lt;b&gt;단일 모델 &amp;rarr; 다수 에이전트 협업 구조&lt;/b&gt;로 패러다임이 이동 중이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트를 하나에서 10개, 20개로 늘리는 방향으로 확장이 이동했다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 적용&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 시스템 구조도 동일한 흐름으로 진화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;User &amp;rarr; LLM &amp;rarr; Result
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;현재&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;User
  &amp;darr;
Planner Agent
  &amp;darr;
Tool Agent / Retrieval Agent / Coding Agent
  &amp;darr;
Evaluator Agent
  &amp;darr;
Result
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;모델 성능이 아니라 orchestration 설계&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Agentic&amp;nbsp;Workflow의&amp;nbsp;본질&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 인사이트(약&amp;nbsp;51:45)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agentic workflow는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;결과를 만드는 것&quot;이 아니라&lt;br /&gt;&quot;결과를 만드는 시스템을 만드는 것&quot;이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말로 코딩을 하는데 대상이 결과물이 아니라&lt;br /&gt;코딩을 하는 애를 만드는 것이다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;기존 개발
&amp;rarr; 코드 작성

Agentic 개발
&amp;rarr; 코드 생성 시스템 작성
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 적용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 개발자의 역할 변화&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;기존&lt;/td&gt;
&lt;td&gt;Agentic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;코드 작성&lt;/td&gt;
&lt;td&gt;에이전트 설계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기능 구현&lt;/td&gt;
&lt;td&gt;워크플로 설계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;테스트&lt;/td&gt;
&lt;td&gt;자동 평가 루프&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 &lt;b&gt;&quot;프로그램 작성자 &amp;rarr; 시스템 설계자&quot;&lt;/b&gt;로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Harness 개념 (Agent 운영 프레임워크)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 인사이트(약&amp;nbsp;50:40)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Harness는&amp;nbsp;&lt;b&gt;에이전트를 실행&amp;middot;통제하는 자동화 구조&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TDD harness&lt;/li&gt;
&lt;li&gt;task 분산 harness&lt;/li&gt;
&lt;li&gt;queue harness&lt;/li&gt;
&lt;li&gt;workflow harness&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대화에서 언급된 내용:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 harness들(TDD, 작업 분산 등)을 쓰는 경우도 있다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제 실무에서는 &lt;b&gt;&amp;ldquo;내 일을 줄여주는 harness부터 만들라&amp;rdquo;&lt;/b&gt;는 접근을 강조한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 적용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Harness 예시&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;task-harness
 ├ planning agent
 ├ coding agent
 ├ review agent
 └ test agent
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제 개발 자동화 예시&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;PR 생성
 &amp;rarr; 코드 생성
 &amp;rarr; 테스트 실행
 &amp;rarr; lint 검사
 &amp;rarr; 리뷰 생성
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Harness = 회사의 구조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 인사이트(약&amp;nbsp;52:30)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 harness를 중첩하면&amp;nbsp;&lt;b&gt;회사 조직 구조와 동일해진다.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 harness를 중첩하면 그게 회사가 된다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조 예&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Company Harness
 ├ Product Harness
 │   ├ Dev Harness
 │   └ QA Harness
 └ Marketing Harness
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Agent system = 조직 구조
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 적용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ AI 조직 구조&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 85px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;역할&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;PM&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Planner agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Dev&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Coding agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;QA&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Test agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Ops&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Deploy agent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Agentic 개발의 핵심 철학&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 인사이트(약&amp;nbsp;53:00)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 직접 결과물을 수정하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 &lt;b&gt;&quot;생성하는 장치를 수정한다.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과물을 직접 고치지 않고&lt;br /&gt;결과를 만드는 장치를 계속 고친다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 적용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;버그 발생
&amp;rarr; 코드 수정
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Agentic 방식&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;버그 발생
&amp;rarr; 에이전트 프롬프트 수정
&amp;rarr; 테스트 harness 수정
&amp;rarr; 워크플로 수정
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;debug 대상이 코드가 아니라 시스템이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Workflow 설계 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 인사이트(약&amp;nbsp;60:10)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent workflow는 처음부터 완성되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;step-by-step으로 만들어진다&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;workflow는 처음부터 만들어지는 것이 아니라 step으로 구축된다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 적용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent 구축 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 문제 정의&lt;br /&gt;&amp;nbsp;- 필요한 agent 식별&lt;br /&gt;&amp;nbsp;- command 설계&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;harness 연결&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;반복 개선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 핵심 개념 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ Agentic&amp;nbsp;Workflow&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정의&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;AI 에이전트들이 협력하여
복잡한 작업을 자동으로 수행하는 시스템
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구조&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;mathematica&quot;&gt;&lt;code&gt;Planner &amp;rarr; Worker &amp;rarr; Evaluator
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ&amp;nbsp;Harness&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정의&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;에이전트들을 실행하고
작업 흐름을 통제하는 자동화 프레임워크
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;CI harness
Dev harness
Research harness
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;실무 적용 요약 (개발자 관점)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;에이전트보다 workflow가 중요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 잘못된 접근: 좋은&amp;nbsp;모델&amp;nbsp;찾기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 올바른 접근: workflow&amp;nbsp;설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;결과보다 시스템&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;코드 작성
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Agentic&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;코드 생성 시스템 작성
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;Harness를 먼저 만든다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;research harness
coding harness
blog harness
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;ldquo;우리는 이제 코드를 만드는 것이 아니라&lt;br /&gt;&amp;nbsp; &amp;nbsp; 코드를 만드는 시스템을 만든다.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/AI리뷰 | 에세이</category>
      <category>HARNESS</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1041</guid>
      <comments>https://peterica.tistory.com/1041#entry1041comment</comments>
      <pubDate>Fri, 6 Mar 2026 21:08:15 +0900</pubDate>
    </item>
    <item>
      <title>Agentic Workflow &amp;mdash; 이제 우리는 코드를 만드는 것이 아니라 시스템을 만든다</title>
      <link>https://peterica.tistory.com/1040</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI]&amp;nbsp;Peterica의&amp;nbsp;AI공부와&amp;nbsp;비젼&amp;nbsp;정리&lt;/a&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 도구를 처음 접하면 대부분 이렇게 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이제 코드를 대신 써주는 도구가 생겼구나.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로 Agent 기반 개발을 이해하게 되면 생각이 완전히 바뀐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI는 단순히 코드를 대신 작성하는 도구가 아니라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;코드를 만들어내는 시스템 자체를 설계하는 기술&lt;/b&gt;로 발전하고 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름을 이해하려면 두 가지 개념이 중요하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Agentic Workflow&lt;/li&gt;
&lt;li&gt;Harness&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 개념은 앞으로 AI 개발 방식의 구조를 설명하는 핵심 키워드가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Agentic Workflow &amp;mdash; AI가 일을 수행하는 방식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agentic Workflow는 간단히 말하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AI 에이전트들이 협력하여 하나의 작업을 완성하는 구조&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 AI 사용 방식은 매우 단순했다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;사용자 &amp;rarr; LLM &amp;rarr; 결과
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 복잡한 작업에서는 이 구조가 한계를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 등장한 구조가 Agent Workflow다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;User
 &amp;darr;
Planner Agent
 &amp;darr;
Worker Agent (코드 / 검색 / 분석)
 &amp;darr;
Evaluator Agent
 &amp;darr;
Result
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 에이전트는 서로 다른 역할을 수행한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Planner &amp;rarr; 문제를 분해한다&lt;/li&gt;
&lt;li&gt;Worker &amp;rarr; 실제 작업을 수행한다&lt;/li&gt;
&lt;li&gt;Evaluator &amp;rarr; 결과를 평가한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조는 흥미롭게도 &lt;b&gt;회사 조직 구조와 매우 유사하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Harness &amp;mdash; 에이전트를 움직이는 운영 시스템&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent Workflow가 &lt;b&gt;조직 구조&lt;/b&gt;라면&lt;br /&gt;Harness는 &lt;b&gt;조직을 운영하는 시스템&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Harness는 다음 역할을 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업을 큐로 관리&lt;/li&gt;
&lt;li&gt;에이전트 실행&lt;/li&gt;
&lt;li&gt;결과 검증&lt;/li&gt;
&lt;li&gt;반복 자동화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 코드 개발 자동화 시스템을 만든다면 다음과 같은 구조가 된다.&lt;/p&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;coding-harness
 ├ planning agent
 ├ coding agent
 ├ review agent
 └ test agent
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 실행 흐름은 이렇게 돌아간다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;PR 생성
 &amp;rarr; 코드 생성
 &amp;rarr; 테스트 실행
 &amp;rarr; 리뷰 생성
 &amp;rarr; 수정
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 Harness는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;에이전트들이 협력하여 일을 수행하도록 만드는 자동화 프레임워크다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Agentic 개발의 본질 &amp;mdash; 결과가 아니라 시스템을 수정한다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent 기반 개발의 가장 중요한 특징은&lt;br /&gt;개발자의 수정 대상이 바뀐다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 개발 방식&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;버그 발생
 &amp;rarr; 코드 수정
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agentic 개발 방식&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;버그 발생
 &amp;rarr; 프롬프트 수정
 &amp;rarr; workflow 수정
 &amp;rarr; harness 수정
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 개발자는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과물을 수정하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과를 만들어내는 시스템을 수정한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이는 매우 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Harness를 중첩하면 회사가 된다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent 시스템을 조금 더 확장하면 재미있는 현상이 나타난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 Harness를 조합하면 구조가 회사 조직과 동일해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어&lt;/p&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;Company Harness
 ├ Dev Harness
 │   ├ coding agent
 │   ├ review agent
 │   └ test agent
 ├ Research Harness
 │   ├ search agent
 │   └ summarizer agent
 └ Marketing Harness
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조는 사실상&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발팀&lt;/li&gt;
&lt;li&gt;리서치팀&lt;/li&gt;
&lt;li&gt;마케팅팀&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 Agent 시스템은 &amp;ldquo;&lt;b&gt;디지털 조직 구조&lt;/b&gt;&amp;rdquo;라고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Agent Workflow는 한번에 만들어지지 않는다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 사람들이 Agent 시스템을 만들 때 처음부터 거대한 구조를 설계하려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로는 그렇게 만들어지지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 다음 단계로 발전한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1️⃣ 작은 작업 자동화&lt;br /&gt;&amp;nbsp; 2️⃣ 반복 작업 Harness 생성&lt;br /&gt;&amp;nbsp; 3️⃣ 여러 Harness 연결&lt;br /&gt;&amp;nbsp; 4️⃣ 조직 구조 수준 Workflow 형성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 Agent 시스템은&amp;nbsp;&lt;b&gt;작은 자동화에서 시작해 점진적으로 확장된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 개발자의 역할 변화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 변화는 개발자의 역할 자체를 바꾸고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 개발자&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드를 작성한다&lt;/li&gt;
&lt;li&gt;기능을 구현한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent 시대 개발자&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Workflow를 설계한다&lt;/li&gt;
&lt;li&gt;Agent 역할을 정의한다&lt;/li&gt;
&lt;li&gt;Harness를 만든다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 개발자는 이제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;ldquo;코드 작성자&amp;rdquo;에서&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;ldquo;시스템 설계자&amp;rdquo;로 이동하고 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리 &amp;mdash; 우리는 이제 코드를 만드는 것이 아니다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agentic 개발의 핵심은 이 문장으로 정리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 이제 코드를 만드는 것이 아니라 &lt;b&gt;코드를 만드는 시스템을 만든다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent Workflow는 조직 구조이고 Harness는 그 조직을 운영하는 시스템이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조가 완성되면 AI는 단순한 도구가 아니라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제로 일을 수행하는 디지털 조직&lt;/b&gt;이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 함께 보면 좋은 사이트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/EQ-Rnx-k-Ec?si=qXgXcE7KVRuj7XT5&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/EQ-Rnx-k-Ec?si=qXgXcE7KVRuj7XT5&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/AI개발전략 | 기획</category>
      <category>Agentic Workflow</category>
      <category>HARNESS</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1040</guid>
      <comments>https://peterica.tistory.com/1040#entry1040comment</comments>
      <pubDate>Fri, 6 Mar 2026 20:33:34 +0900</pubDate>
    </item>
    <item>
      <title>선거를 보면 정치가 아니라 유동성이 보인다 - 금리&amp;middot;달러&amp;middot;자산시장으로 해석하는 금융 사이클</title>
      <link>https://peterica.tistory.com/1039</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며 &amp;mdash; 선거를 보면 정치가 아니라 금융 조건이 보인다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=RyOrBmiAaCI&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=RyOrBmiAaCI&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=RyOrBmiAaCI&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bivoDq/dJMb8WewKLb/5pGvzZrLE8bo921CljpOD1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=300_78_864_288,https://scrap.kakaocdn.net/dn/3mYKu/dJMb84XVSrm/46GcTmkL9zhHLfPt4PWbuk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=300_78_864_288&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;&amp;quot;베센트의 선거 전략 밝혀졌다&amp;quot; 금 비트코인 하락한 진짜 이유 [이슈임당]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/RyOrBmiAaCI&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 영상은 특정 인물이나 선거 전술을 설명하는 것처럼 보이지만, 실제로는 &lt;b&gt;금리&amp;ndash;유동성&amp;ndash;달러&amp;ndash;자산시장&lt;/b&gt;이 하나의 시스템으로 움직이는 구조를 해석하는 내용에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 보통 선거를 이념, 공약, 지지율로 해석한다.&lt;br /&gt;하지만 시장은 전혀 다른 질문을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;ldquo;누가 당선되는가?&amp;rdquo;가 아니라&lt;br /&gt;&amp;nbsp; &amp;ldquo;어떤 금융 환경이 만들어지는가?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 영상은 바로 그 지점을 파고든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선거는 원인이 아니라 &lt;b&gt;금리와 유동성 경로를 바꾸는 트리거&lt;/b&gt;로 작동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 정치 이벤트를 이야기하지만 본질은 거시 금융 사이클이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 금리가 모든 것의 중심에 있는가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금리는 단순히 물가를 잡는 도구가 아니다.&lt;br /&gt;시스템 전체의 속도를 조절하는 레버다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금리가 내려가면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정부의 이자 부담 감소&lt;/li&gt;
&lt;li&gt;기업의 자금 조달 개선&lt;/li&gt;
&lt;li&gt;자산 가격 상승&lt;/li&gt;
&lt;li&gt;소비 심리 회복&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금리가 올라가면 그 반대가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 금리는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경제 지표 하나가 아니라&lt;br /&gt;&lt;b&gt;자산시장 + 재정 + 고용 + 소비를 동시에 움직이는 축&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선거 전에 금리 방향이 중요한 이유는&lt;br /&gt;유권자가 체감하는 경기를 바꾸기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 유동성이 만들어내는 &amp;ldquo;체감 경기&amp;rdquo;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람들이 느끼는 경기는 GDP가 아니라&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주가&lt;/li&gt;
&lt;li&gt;집값&lt;/li&gt;
&lt;li&gt;일자리 안정감&lt;/li&gt;
&lt;li&gt;대출 부담&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 결정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 네 가지는 모두 유동성과 연결되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 선거 국면에서 중요한 것은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경기를 실제로 성장시키는 것이 아니라&lt;br /&gt;&lt;b&gt;경기가 좋아 보이게 만드는 금융 환경&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 달러 패권 구조 &amp;mdash; 위기의 시작과 해결이 동시에 미국인 이유&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영상에서 반복적으로 깔려 있는 전제는 하나다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;글로벌 금융 시스템의 중심은 달러다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조에서는 특이한 현상이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위기가 발생하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 글로벌 자산 하락&lt;br /&gt;&amp;nbsp;- 달러 부채 상환 필요&lt;br /&gt;&amp;nbsp;- 달러 수요 증가&lt;br /&gt;&amp;nbsp;- 달러 강세&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위기의 진원지가 미국이어도&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;rarr; 해결 수단도 달러다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 달러가 최종 안전자산으로 작동하는 이유다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 정치 이벤트의 실제 역할&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선거는 방향을 만드는 것이 아니라&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;이미 필요한 방향을 정당화하는 과정&lt;/b&gt;에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시장 입장에서 중요한 것은&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;재정 확대가 가능한가&lt;/li&gt;
&lt;li&gt;금리 인하 압력이 생기는가&lt;/li&gt;
&lt;li&gt;유동성이 공급되는가&lt;/li&gt;
&lt;li&gt;달러가 약세로 전환되는가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정치 메시지는 표면이고 금융 조건이 실제 내용이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 시장을 해석하는 새로운 프레임&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 영상이 던지는 핵심적인 사고 방식은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 질문&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;rarr; 누가 이길까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조적 질문&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;rarr; 어떤 정책 조합이 시장을 움직일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 관점으로 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 선거&lt;br /&gt;&amp;nbsp; - 금리&lt;br /&gt;&amp;nbsp; - 유동성&lt;br /&gt;&amp;nbsp; - 자산시장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 서로 분리된 이벤트가 아니라&lt;br /&gt;&lt;b&gt;하나의 사이클&lt;/b&gt;로 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리 - 선거는 금융 사이클의 일부다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 영상의 핵심을 한 문장으로 정리하면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;선거는 정치 이벤트가 아니라&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 금리와 유동성 경로를 조정하는 매크로 이벤트다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 시장은 후보의 말이 아니라 그 결과로 만들어질 &lt;b&gt;금융 조건&lt;/b&gt;을 먼저 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>LifeStory/생활정보</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1039</guid>
      <comments>https://peterica.tistory.com/1039#entry1039comment</comments>
      <pubDate>Thu, 26 Feb 2026 07:24:20 +0900</pubDate>
    </item>
    <item>
      <title>[AI] HBM은 왜 LLM 시대의 핵심이 되었는가?</title>
      <link>https://peterica.tistory.com/1037</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSNb%2FbtsDwEYjHwl%2FgfNRKiPAkerKOYJ40TLVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;1026&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;연산이 아니라 데이터 이동이 병목이었다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 인프라를 처음 이해할 때 가장 많이 하는 오해가 있다.&lt;br /&gt;&amp;nbsp; 성능이 부족한 이유를 GPU의 FLOPS에서 찾는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 하지만 실제 운영 환경에서 마주치는 병목은 전혀 다른 곳에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPU는 계산을 못 해서 느린 것이 아니라,&lt;br /&gt;&amp;nbsp; 계산에 필요한 weight가 메모리에서 도착하기를 기다리느라 멈춰 있는 시간이 대부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 정리를 통해 HBM 세대의 진화는 단순한 속도 향상이 아니라&lt;br /&gt;&lt;b&gt;&amp;nbsp; 데이터 이동 구조 자체를 바꾸는 과정&lt;/b&gt;이었다는 것을 이해하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;FLOPS(Floating Point Operations Per Second)&lt;br /&gt;&amp;rarr;&amp;nbsp;초당&amp;nbsp;부동소수점&amp;nbsp;연산&amp;nbsp;횟수&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 LLM은 메모리 중심 워크로드인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM의 연산 흐름은 놀라울 정도로 단순하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;weight를 메모리에서 가져온다 &amp;rarr; activation과 곱한다 &amp;rarr; 결과를 다음 레이어로 넘긴다 &amp;rarr; 다음 weight를 다시 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정이 레이어 수만큼 반복된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 연산 자체보다 &lt;b&gt;메모리 접근 횟수가 절대적으로 많다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 LLM에서는 FLOPS보다&lt;br /&gt;&amp;nbsp; &amp;nbsp;  메모리 대역폭이 곧 성능이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 개념 정리 &amp;ndash; weight와 activation&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;weight&lt;/b&gt;는 모델이 학습을 통해 얻은 장기 기억이다.&lt;br /&gt;&amp;nbsp; 평소에는 HBM에 저장되어 있다가 연산 순간에 GPU로 불려와 사용된다.&lt;br /&gt;&amp;nbsp; 즉 모델이 알고 있는 지식 자체다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;activation&lt;/b&gt;은 현재 문맥에서 실제 계산에 사용되고 있는 작업 기억이다.&lt;br /&gt;&amp;nbsp; 토큰이 레이어를 통과할 때마다 계속 형태가 바뀌며 다음 연산으로 전달된다.&lt;br /&gt;&amp;nbsp; 사람이 어떤 문제를 풀 때 머릿속에 떠올려 놓고 정리해 나가는 생각의 흐름과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM의 대부분의 연산은 다음 한 줄로 정리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;activation &amp;times; weight&lt;/b&gt; &amp;rarr; &lt;b&gt;새로운 activation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 기존 DRAM 구조의 한계 &amp;ndash; 창고는 큰데 길이 좁다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 메모리는 저장 용량은 충분했지만 데이터가 이동하는 통로가 좁았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 GPU는 대부분의 시간을&amp;nbsp;데이터를 기다리는 데 사용하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태가 바로 &lt;b&gt;memory-bound&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ HBM의 본질 &amp;ndash; 컨베이어를 1024차선으로 만든 것&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HBM을 단순히 DRAM을 쌓은 기술로 이해하면 핵심을 놓치게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HBM의 본질&lt;/b&gt;은 &lt;b&gt;용량 증가&lt;/b&gt;가 아니라&lt;br /&gt;&amp;nbsp;   초광폭 I/O 구조다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 메모리가 32차선 도로라면 HBM은 1024차선 고속도로다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 병렬로 동시에 이동하면서 GPU가 멈추지 않게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 적층(쌓기)의 진짜 의미 &amp;ndash; 용량이 아니라 거리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DRAM을 수직으로 쌓는 이유는 저장 공간을 늘리기 위해서가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPU 바로 옆에 메모리를 붙여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 신호 이동 거리를 줄이고&lt;br /&gt;&amp;nbsp; 전력 소모를 낮추고&lt;br /&gt;&amp;nbsp; 대역폭을 극대화하기 위함이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 적층의 본질은&lt;br /&gt;&lt;b&gt;&amp;nbsp; 물리적 거리 단축을 통한 전송 효율 개선&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 세대별 변화가 만드는 구조적 체감&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;HBM2 &amp;rarr; HBM3&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;&amp;ldquo;GPU가&amp;nbsp;처음으로&amp;nbsp;AI에서&amp;nbsp;굶지&amp;nbsp;않기&amp;nbsp;시작&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 학습이 가능한 대역폭에 도달한 첫 세대.&lt;br /&gt;GPU가 굶지 않기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대역폭이&amp;nbsp;딥러닝&amp;nbsp;학습&amp;nbsp;요구치에&amp;nbsp;도달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대형&amp;nbsp;모델&amp;nbsp;학습&amp;nbsp;가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;but, 하나의 GPU에 모델을 담을 수 없어 multi-GPU 사용, 통신 오버헤드 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;HBM3 &amp;rarr; HBM3E&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;&amp;ldquo;LLM용&amp;nbsp;메모리&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1TB/s급 대역폭과 12-Hi 적층(용량증가).&lt;br /&gt;70B급 모델을 단일 GPU에 올리는 것이 현실이 되었다.&lt;br /&gt;더 큰 모델을 한 GPU에 탑재하여, multi-GPU 통신 감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;HBM3E&amp;nbsp;&amp;rarr;&amp;nbsp;HBM4&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;구조&amp;nbsp;변화&amp;nbsp;세대&lt;br /&gt;인터페이스가 2배로 증가(1024&amp;nbsp;&amp;rarr;&amp;nbsp;2048bit)하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 컨트롤러가 base die로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미:&lt;br /&gt;&amp;nbsp; - GPU 설계 단순화&lt;br /&gt;&amp;nbsp; -&amp;nbsp;커스텀 HBM 가능&lt;br /&gt;&amp;nbsp; -&amp;nbsp;전력 효율 개선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 인프라 체감:&lt;br /&gt;&amp;nbsp; -&amp;nbsp;NVLink 트래픽 감소&lt;br /&gt;&amp;nbsp; -&amp;nbsp;shard&amp;nbsp;전략&amp;nbsp;변화&lt;br /&gt;&amp;nbsp; - latency&amp;nbsp;안정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시점부터는&lt;br /&gt;&amp;nbsp; GPU 수를 늘려 성능을 확보하는 구조에서&lt;br /&gt;&amp;nbsp; GPU 하나가 처리할 수 있는 모델 체급을 키우는 구조로 바뀐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표로 만들면...&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;세대인프라&lt;/td&gt;
&lt;td&gt;체감&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;HBM2&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;모델을 여러 GPU에 강제로 분산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;HBM3&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;대형 모델 학습 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;HBM3E&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;70B급 단일 GPU 처리 현실화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;HBM4&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;multi-GPU 의존도 감소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;HBM5&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;메모리가 연산 일부 담당 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 인프라 관점에서의 변화 &amp;ndash; 분산에서 단일 노드로&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HBM 용량&lt;/b&gt;이 커질수록 KV cache를 로컬에 유지할 수 있고&lt;br /&gt;&lt;b&gt;HBM 대역폭&lt;/b&gt;이 커질수록 GPU idle이 줄어든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; multi-GPU shard 구조 &amp;rarr; single GPU 중심 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 로 서빙 방식이 단순해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;latency&lt;/b&gt;는 안정되고 &lt;b&gt;NVLink&lt;/b&gt; 트래픽은 감소한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 세대 진화의 본질 &amp;ndash; 통신을 줄이는 역사&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HBM의 발전은 세 가지로 정리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;대역폭 증가&lt;/b&gt; &amp;rarr; GPU idle 제거&lt;br /&gt;&amp;nbsp; &lt;b&gt;용량 증가&lt;/b&gt; &amp;rarr; 모델 local 탑재&lt;br /&gt;&amp;nbsp; &lt;b&gt;통신 감소&lt;/b&gt; &amp;rarr; 클러스터 구조 단순화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 속도의 문제가 아니라&lt;br /&gt;&lt;b&gt;&amp;nbsp; 데이터 이동을 줄여 온 과정&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 다음 단계 &amp;ndash; PIM이 의미하는 것&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HBM까지는 데이터를 빠르게 이동시키는 기술이다.&lt;br /&gt;&lt;b&gt;PIM은 데이터를 이동시키지 않는 기술이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계가 되면 메모리는 저장 장치가 아니라 연산 장치가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컴퓨팅의 중심&lt;/b&gt;이&amp;nbsp;&lt;b&gt;GPU에서 메모리로 이동&lt;/b&gt;하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ HBM 세대별 비교&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 251px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구분&lt;/td&gt;
&lt;td&gt;HBM2 / 2E&lt;/td&gt;
&lt;td&gt;HBM3&lt;/td&gt;
&lt;td&gt;HBM3E&lt;/td&gt;
&lt;td&gt;HBM4 (차세대)&lt;/td&gt;
&lt;td&gt;HBM5 (로드맵)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;세대 시기&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;~2020&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2022&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2023~현재&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2025~&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2027~예상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;핵심 역할&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;GPU 메모리 대역폭 확보&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;AI 학습 대응&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;LLM 대응 본격화&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;GPU 구조 변화 시작&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;메모리 중심 컴퓨팅 준비&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;핀 속도 (per pin)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;~3.6Gbps&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;~6.4Gbps&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;~9.6Gbps&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;~13Gbps&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;16Gbps+ 예상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;인터페이스 폭&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;1024-bit&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;1024-bit&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;1024-bit&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;2048-bit&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2048-bit 이상 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;스택당 대역폭&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;~410GB/s&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;~819GB/s&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;~1.2TB/s&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;~2TB/s&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;3TB/s+ 예상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;최대 용량 (stack)&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;8~16GB&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;16GB&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;24~36GB&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;48~64GB+&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;100GB+ 가능성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;적층 높이&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;4~8-Hi&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;8-Hi&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;12-Hi&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;16-Hi 이상&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;더 높은 적층&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;전력 효율&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;개선 시작&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;개선&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;LLM 대응 수준&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;대역폭 대비 효율 증가&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;구조적 변화 목표&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;메모리 컨트롤러 위치&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;GPU 내부&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;GPU 내부&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;GPU 내부&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;Base die 이동&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;메모리 쪽 연산 가능성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;패키징&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;2.5D 인터포저&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;동일&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;동일&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;고급 패키징 필수&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;광인터커넥트 가능성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;주요 사용처&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;HPC / 초기 AI&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;AI 학습&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;b&gt;LLM 학습&amp;middot;추론&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;차세대 AI GPU&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;메모리 중심 AI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리 &amp;ndash; LLM 인프라는 메모리 구조의 진화다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 시대의 병목은 연산이 아니라 데이터 이동이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HBM&lt;/b&gt;은 &lt;b&gt;DRAM을 쌓은 기술&lt;/b&gt;이 아니라&lt;br /&gt;&amp;nbsp; &amp;nbsp;GPU가 멈추지 않게 만드는 초광폭 데이터 통로다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;세대 진화&lt;/b&gt;는 &lt;b&gt;클럭 상승&lt;/b&gt;이 아니라&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;시스템 구조를 바꾸는 방향으로 진행&lt;/b&gt;되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/AI산업 | 동향</category>
      <category>hbm</category>
      <category>HBM 삼성</category>
      <category>PETERICA</category>
      <category>PIM 메모리</category>
      <category>차세대 메모리</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1037</guid>
      <comments>https://peterica.tistory.com/1037#entry1037comment</comments>
      <pubDate>Mon, 23 Feb 2026 23:09:57 +0900</pubDate>
    </item>
    <item>
      <title>[독후감] 부의 대이동</title>
      <link>https://peterica.tistory.com/1010</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 이 책을 읽게 된 이유&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 책은 단순한 투자서가 아니라,&lt;br /&gt;환율&amp;middot;금리&amp;middot;채권&amp;middot;달러&amp;middot;금이라는 요소들이 어떻게 연결되어 움직이는지를&lt;br /&gt;&lt;b&gt;&amp;lsquo;돈의 흐름&amp;rsquo;이라는 하나의 구조로 설명&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개별 자산의 전망을 맞히는 것이 아니라,&lt;br /&gt;위기와 성장 국면에서 &lt;b&gt;자본이 어디로 이동하는지 판단하는 기준&lt;/b&gt;을 얻고자 읽었다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 오건영은 누구인가?&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오건영은 예측하는 사람이 아니라 구조를 설명하는 사람이다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 시점의 주가나 환율을 맞히는 데 관심이 없다&lt;/li&gt;
&lt;li&gt;왜 그런 방향으로 움직일 수밖에 없는지를 설명한다&lt;/li&gt;
&lt;li&gt;결과보다 과정과 연결 관계를 중시한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그는 시장을 단일 자산으로 보지 않는다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환율, 금리, 채권, 주식, 달러, 금을 분리하지 않는다&lt;/li&gt;
&lt;li&gt;하나의 자산 변화는 다른 자산의 원인이자 결과가 된다&lt;/li&gt;
&lt;li&gt;항상 &amp;lsquo;자본 이동&amp;rsquo;이라는 공통 축으로 설명한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;오건영의 설명은 정책과 시장을 구분하는 데서 시작된다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기준금리는 중앙은행의 의지다&lt;/li&gt;
&lt;li&gt;시장금리는 투자자들의 불안과 신뢰다&lt;/li&gt;
&lt;li&gt;두 금리가 어긋날 때 위기의 신호가 발생한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그는 위기를 예외가 아니라 반복되는 현상으로 본다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;금융 위기는 항상 예상 밖의 방식으로 찾아온다&lt;/li&gt;
&lt;li&gt;하지만 위기 때 강해지는 자산은 반복적으로 등장한다&lt;/li&gt;
&lt;li&gt;달러와 같은 방어 자산의 역할을 강조한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;달러를 바라보는 관점이 일관되어 있다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;달러는 미국의 통화이기 이전에 글로벌 시스템의 통화다&lt;/li&gt;
&lt;li&gt;위기의 원인이 미국이어도 달러 수요는 증가한다&lt;/li&gt;
&lt;li&gt;달러 패권은 감정이 아니라 구조의 문제로 설명한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;금을 신화화하지 않는다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;금을 절대적 안전 자산으로 보지 않는다&lt;/li&gt;
&lt;li&gt;달러 정책과 유동성의 결과물로 해석한다&lt;/li&gt;
&lt;li&gt;금 역시 타이밍과 환경의 영향을 받는 자산이다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;한국 경제를 감정이 아닌 구조로 평가한다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IMF 외환위기의 기억에만 기대어 판단하지 않는다&lt;/li&gt;
&lt;li&gt;현재 한국 경제의 외환 구조와 금융 시스템을 근거로 든다&lt;/li&gt;
&lt;li&gt;원화를 &amp;lsquo;약한 통화&amp;rsquo;로 단정 짓는 시각을 경계한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그의 설명 방식은 불안을 낮추는 데 목적이 있다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위기를 과장하지 않는다&lt;/li&gt;
&lt;li&gt;동시에 낙관도 강요하지 않는다&lt;/li&gt;
&lt;li&gt;이해하면 공포는 줄어든다는 전제를 깔고 설명한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;오건영의 글과 강연이 주는 핵심 태도
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시장을 맞히려 하지 말 것&lt;/li&gt;
&lt;li&gt;구조를 이해할 것&lt;/li&gt;
&lt;li&gt;자산을 분리해서 보지 말 것&lt;/li&gt;
&lt;li&gt;방어 자산의 의미를 잊지 말 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 이 책의 핵심 메시지&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;돈의 가치는 절대값이 아니라 &lt;b&gt;항상 비교의 결과&lt;/b&gt;다.&lt;/li&gt;
&lt;li&gt;환율&amp;middot;금리&amp;middot;채권&amp;middot;주식은 분리된 개념이 아니라 &lt;b&gt;하나의 시스템&lt;/b&gt;이다.&lt;/li&gt;
&lt;li&gt;위기는 반복되며, 위기 국면에서 &lt;b&gt;강해지는 자산은 정해져 있다&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;예측보다 중요한 것은 &lt;b&gt;구조를 이해하고 대비하는 것&lt;/b&gt;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ PART 1 &amp;mdash; 기초 지식 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;환율&amp;middot;금리&amp;middot;채권을 바라보는 기본 프레임&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ㅇ 환율은 무엇인가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환율은 한 나라 화폐의 &amp;lsquo;값&amp;rsquo;이 아니라 &lt;b&gt;두 나라 경제 상태를 비교한 결과&lt;/b&gt;다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;물가(인플레이션)&lt;/li&gt;
&lt;li&gt;금리&lt;/li&gt;
&lt;li&gt;성장률&lt;/li&gt;
&lt;li&gt;자본 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 요소들이 종합되어 환율이 결정된다.&lt;br /&gt;따라서 환율 상승이나 하락은 &lt;b&gt;원인이 아니라 결과&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화폐는 기준 통화가 없는 주식과 같아서, 한 화폐의 가치는 비교를 통해 비교 분석된다.&lt;br /&gt;달러 가치 상승(달러 주식 상승) -&amp;gt; 원화 가치는 상대적 하락한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ㅇ 환율과 자산 시장의 관계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외국 자본 유입 &amp;rarr; 환율 하락(원화 강세) &amp;rarr; 주식 시장 우호적&lt;/li&gt;
&lt;li&gt;자본 유출 &amp;rarr; 환율 상승(원화 약세) &amp;rarr; 주식&amp;middot;부동산 압박&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 기관&amp;middot;외국인 자금은 주가보다 &lt;b&gt;환율을 먼저 움직이는 경우가 많다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ㅇ 채권과 금리의 역관계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;금리 상승 &amp;rarr; 기존 채권 가격 하락&lt;/li&gt;
&lt;li&gt;금리 하락 &amp;rarr; 기존 채권 가격 상승&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국채 역시 안전 자산이지만, &lt;b&gt;금리 변동 리스크에서 자유롭지 않다&lt;/b&gt;는 점을 강조한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ㅇ 기준금리와 시장금리의 괴리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기준금리는 정책 신호이고, 시장금리는 &lt;b&gt;불안과 신뢰의 정도&lt;/b&gt;를 반영한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기준금리 인하 + 시장금리 상승 &amp;rarr; 경제에 대한 불안 증가 신호&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 회사채 스프레드가 확대되며, 이는 &lt;b&gt;위기의 전조 지표&lt;/b&gt;로 활용된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVAzut/dJMcagKZ6cJ/i842ToT6oSpWjmGUPglHck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVAzut/dJMcagKZ6cJ/i842ToT6oSpWjmGUPglHck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVAzut/dJMcagKZ6cJ/i842ToT6oSpWjmGUPglHck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVAzut%2FdJMcagKZ6cJ%2Fi842ToT6oSpWjmGUPglHck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;354&quot; height=&quot;571&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;739&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ PART 2 &amp;mdash; 달러 투자에 대한 관점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ㅇ 달러는 왜 &amp;lsquo;궁극의 안전 자산&amp;rsquo;인가&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금융 위기 때마다 반복되는 현상:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위기의 진원지 &amp;rarr; 미국&lt;/li&gt;
&lt;li&gt;위기의 해결 수단 &amp;rarr; 달러 유동성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위기 상황에서 달러는 &lt;b&gt;문제의 원인이면서 동시에 피난처&lt;/b&gt;가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p71 은행들이 보유하고 있는 주택 담보 대출 증서들을 담보로 해서 하나의 채권을 만드는 겁니다. 이걸 '자산유동화 증권'이라고 불러요.&lt;br /&gt;p72 자산유동화 증권을 모아 모기지 채권을 발행함. 문제는 집값이 하락하면서 금융 기관들이 손실이 발생함.&lt;br /&gt;금융사(투자자대출) -&amp;gt; 부동산 하락 -&amp;gt; 투자금 회수 -&amp;gt; 현금 확보 -&amp;gt; 자산가치 하락&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;금융 위기의 진원지가 미국인 경우가 많음에도, 해결 수단이 달러가 되는 이유는 &lt;b&gt;글로벌 금융 시스템 자체가 달러를 중심으로 설계되어 있기 때문&lt;/b&gt;이다. 세계의 부채, 결제, 담보, 안전자산 기준이 모두 달러에 묶여 있다.&lt;/li&gt;
&lt;li&gt;달러는 &lt;b&gt;문제의 원인이면서 동시에 피난처&lt;/b&gt;가 된다. 문제를 만든 통화이지만, 그 문제를 수습할 수 있는 유일한 통화이기 때문이다. 이 점에서 오건영은 달러를 &amp;lsquo;궁극의 안전 자산&amp;rsquo;이라고 설명한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;미국 국채와 달러가 동시에 안전자산으로 기능&lt;/b&gt;하기 때문이다. 위기 국면에서 투자자들은 신용 위험이 가장 낮고, 언제든 현금화 가능한 자산을 찾는다. 그 조건을 충족하는 거의 유일한 자산이 미국 국채이며, 국채 매입 과정에서 자연스럽게 달러 수요가 증가한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;달러 부족(dollar shortage)&lt;/b&gt; 현상 때문이다. 글로벌 금융기관과 기업들은 달러로 빚을 내고, 달러로 결제한다. 위기가 발생하면 위험 회피가 급격히 강화되면서 달러 대출이 위축되고, 기존 달러 부채를 상환하려는 수요가 폭증한다. 이 순간 시장에는 &amp;ldquo;달러가 모자라는 상황&amp;rdquo;이 발생하고, 달러 가치는 급등한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;미국 중앙은행(Fed)만이 달러를 무제한으로 공급할 수 있는 주체&lt;/b&gt;다. 위기가 심화되면 Fed는 기준금리 인하, 양적완화, 달러 스왑라인 등을 통해 전 세계에 달러 유동성을 공급한다. 이 기능은 다른 나라 중앙은행이 대체할 수 없다. 그래서 위기의 원인이 미국에서 시작되었더라도, 시스템을 안정시키는 역할 역시 미국과 달러가 맡게 된다.&lt;/li&gt;
&lt;li&gt;이 구조는 &lt;b&gt;신뢰의 문제&lt;/b&gt;다. 위기 상황에서는 &amp;ldquo;누가 잘못했는가&amp;rdquo;보다 &amp;ldquo;누가 끝까지 책임질 수 있는가&amp;rdquo;가 중요해진다. 미국은 세계 최대의 경제 규모, 군사력, 금융 시장을 갖고 있고, 달러는 그 신뢰를 바탕으로 글로벌 최종 결제 수단 역할을 한다. 감정적으로는 미국 책임론이 제기되지만, 자본은 결국 가장 안전한 곳으로 이동한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 만든 통화이지만, 그 문제를 수습할 수 있는 유일한 통화이기 때문이다.&lt;br /&gt;이 점에서 오건영은 달러를 &amp;lsquo;궁극의 안전 자산&amp;rsquo;이라고 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ &amp;nbsp;PART&amp;nbsp;3&amp;nbsp;&amp;mdash;&amp;nbsp;금&amp;nbsp;투자에&amp;nbsp;대한&amp;nbsp;관점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 금은 정말 안전 자산인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금은 세기를 거듭하여서도 부의 축적 자원으로 사용되었다. 그래서 금은 안전 자산으로 인식되지만, 가격은 주식처럼 크게 변동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 달러가 급등하면 금이 약세가 되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 저금리,유동성 과잉이 되면 금이 강세가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금의 안전성은 절대적 개념이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 원자재로서의 금&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p234 금의 3가지 특성 정의: 원자재, 실물화폐, 귀금속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금은 다른 원자재와 달리 공급이 제한적이며, 산업 수요보다 가치 저장 수단 성격이 강하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;귀금속으로서 심리적 신뢰 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 시장을 움직이는 실물 화폐, 금의 비밀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;p257. &lt;br /&gt;&amp;nbsp;- 달러 공급이 늘어서 달러 가치 하락 -&amp;gt; 금값 상승(달러 신뢰 바닥)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 달러 공급 축소, 달러 가치 상승 -&amp;gt; 금값 하락&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;달러 강세이면 금이 약세이고, 달러 약세 및 저금리 장기화되면 금의 매력의 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p 262&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;금은 안전 자산이 아니고, 실물 화폐의 성격을 갖고 있는 자신이다. 달러가 강해지면 주식시장이 무너지는데, 금은 포트폴리오 방어 효과를 주지 못한다.&amp;nbsp;결국 금의 방향성은 달러 정책과 유동성 환경에 크게 좌우 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ PART&amp;nbsp;4&amp;nbsp;&amp;mdash;&amp;nbsp;최종&amp;nbsp;정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 경기&amp;nbsp;침체&amp;nbsp;시나리오&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 달러 강세&lt;br /&gt;&amp;nbsp; - 자산 가격 조정&lt;br /&gt;&amp;nbsp; - 금리 변동성 확대&lt;br /&gt;&amp;nbsp; - 신용 스프레드 확대&lt;br /&gt;-&amp;gt; 위기에 강한 자산의 역할이 중요해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ 경기 회복 시나리오&lt;br /&gt;&amp;nbsp; - 무역 갈등 완화&lt;br /&gt;&amp;nbsp; - 자산 시장 분산 투자 환경&lt;br /&gt;&amp;nbsp; - 단일 자산 베팅의 위험 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 에필로그&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p347&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 책 전반에 걸쳐서 달러 투자는 '포트폴리오의 보험 컨셉'에서 접근. 금은 화폐 가치의 하락으로부터 내 투자 포트폴리오를 지킬 수 있는 자산이다. 어디까지나 전체 투자 포트폴리오에서 금과 달러를 감안할 필요가 있다. 특정 자산에 몰빵하지 말고, 주식, 채권을 나누고, 주시고가 채권의 분산만으로 커버할 수 없는 위기가 올 때에 금과 달러 자산이 큰 도움을 줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 나는 오건영의 설명 방식이 설득력을 가지는 이유가 다음과 같다고 본다.&amp;nbsp;&lt;br /&gt;&amp;nbsp; &lt;b&gt;그는 달러와 금을 이론이나 신념으로 설명하지 않는다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 금리 변화, 달러 인덱스, 국채 수익률, 위기 당시의 자본 흐름 같은 실질적인 데이터의 맥락을 짚어가며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 그런 움직임이 나타났는지를 연결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 독자는 단순히 &amp;ldquo;달러가 안전하다&amp;rdquo;는 결론을 받아들이는 것이 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 조건에서 달러가 강해지고 어떤 환경에서 금이 주목받는지를 스스로 이해하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 그는 자산을 추천하는 사람이 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차트를 읽는 사고방식을 훈련시키는 사람에 가깝다고 느껴진다.&lt;/p&gt;</description>
      <category>책이야기</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1010</guid>
      <comments>https://peterica.tistory.com/1010#entry1010comment</comments>
      <pubDate>Sun, 15 Feb 2026 23:10:31 +0900</pubDate>
    </item>
    <item>
      <title>[AI] LLM 학습 노트 공개 - Transformer부터 RAG까지, 그리고 운영 가능한 AI 시스템을 향해</title>
      <link>https://peterica.tistory.com/1017</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/761&quot;&gt;[AI] Peterica의 AI공부와 비젼 정리&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 백엔드 개발자로 시작했고, DevOps와 SRE 성격의 업무를 거치며 서비스 운영을 경험해 왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다 최근 LLM 기반 시스템을 직접 설계하면서 관점이 바뀌었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI는 더 이상 &amp;ldquo;모델 호출&amp;rdquo;이 아니라&lt;br /&gt;&lt;b&gt;운영 대상 시스템&lt;/b&gt;이라는 생각이 들기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 개인적으로 LLM 학습 노트를 만들었다.&lt;br /&gt;단순 이론 정리가 아니라, 실제 서비스를 만들고 운영한다는 관점에서 정리한 기록이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 LLM 학습 노트를 만들었나&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 RAG 구현이 목적이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 파고들수록 느꼈다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Retriever 품질은 Embedding과 Chunking에서 결정되고&lt;/li&gt;
&lt;li&gt;RAG 성능은 VectorDB 튜닝과 Reranking에서 갈리며&lt;/li&gt;
&lt;li&gt;최종 응답 품질은 결국 Transformer 구조와 Prompt 설계로 돌아온다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각이 따로 존재하는 게 아니라, 하나의 파이프라인이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 다음 흐름으로 학습을 재구성했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer &amp;rarr; Embedding &amp;rarr; VectorDB &amp;rarr; RAG &amp;rarr; Quantization&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;모델&amp;rdquo;이 아니라 &lt;b&gt;시스템 전체 흐름&lt;/b&gt;으로 이해하는 것이 목표였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Month 1 학습 구성 요약&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅇ Week 1: Transformer 완전 이해&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 76px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 18.3721%; height: 20px; text-align: center;&quot;&gt;주제&lt;/td&gt;
&lt;td style=&quot;width: 15.2327%; height: 20px; text-align: center;&quot;&gt;핵심 내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 18.3721%; height: 18px;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1018&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI]&amp;nbsp;Attention&amp;nbsp;메커니즘&amp;nbsp;&amp;mdash;&amp;nbsp;LLM은&amp;nbsp;어떻게&amp;nbsp;&amp;lsquo;중요한&amp;nbsp;정보&amp;rsquo;를&amp;nbsp;골라내는가&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.2327%; height: 18px;&quot;&gt;Self-Attention,&amp;nbsp;Q/K/V,&amp;nbsp;Multi-Head&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 18.3721%; height: 20px;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1023&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI]&amp;nbsp;Transformer&amp;nbsp;Encoder-Decoder&amp;nbsp;구조&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://peterica.tistory.com/1023&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&amp;nbsp; - Attention 다음 단계, 메커니즘에서 시스템으로&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.2327%; height: 20px;&quot;&gt;Encoder/Decoder&amp;nbsp;구조,&amp;nbsp;Cross-Attention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 18.3721%; height: 18px;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1024&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI] KV Cache &amp;mdash; LLM은 어떻게 &amp;lsquo;생각의 흐름&amp;rsquo;을 기억하는가&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.2327%; height: 18px;&quot;&gt;KV&amp;nbsp;Cache&amp;nbsp;원리,&amp;nbsp;메모리&amp;nbsp;계산,&amp;nbsp;최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;ㅇ Week&amp;nbsp;1&amp;nbsp;마무리&amp;nbsp;&amp;mdash;&amp;nbsp;Transformer&amp;nbsp;완전&amp;nbsp;이해&lt;br /&gt;Week 1의 목표는 단순히 Transformer 구조를 외우는 게 아니었다.&lt;br /&gt;&lt;br /&gt;Attention,&amp;nbsp;Encoder&amp;ndash;Decoder,&amp;nbsp;KV&amp;nbsp;Cache를&amp;nbsp;따라가다&amp;nbsp;보니&lt;br /&gt;&amp;nbsp; 결국 하나의 질문으로 수렴했다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;ldquo;LLM은&amp;nbsp;어떻게&amp;nbsp;문맥을&amp;nbsp;이해하고,&amp;nbsp;생각을&amp;nbsp;이어가는가?&amp;rdquo;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;답은&amp;nbsp;의외로&amp;nbsp;단순했다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;사람&lt;/b&gt;은&amp;nbsp;&lt;b&gt;감각적으로&lt;/b&gt;&amp;nbsp;의미를&amp;nbsp;연결하고,&lt;br /&gt;&lt;b&gt;Transformer&lt;/b&gt;는&amp;nbsp;그&amp;nbsp;과정을&amp;nbsp;&lt;b&gt;벡터와&amp;nbsp;확률로&lt;/b&gt;&amp;nbsp;계산한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Encoder&lt;/b&gt;는&amp;nbsp;&lt;b&gt;문장을&amp;nbsp;의미&amp;nbsp;공간으로&amp;nbsp;압축&lt;/b&gt;하고,&lt;br /&gt;&lt;b&gt;Decoder&lt;/b&gt;는&amp;nbsp;&lt;b&gt;그&amp;nbsp;공간&amp;nbsp;위에서&amp;nbsp;다음&amp;nbsp;토큰을&amp;nbsp;만들어&lt;/b&gt;내며,&lt;br /&gt;&lt;b&gt;KV&amp;nbsp;Cache&lt;/b&gt;는&amp;nbsp;&lt;b&gt;이미&amp;nbsp;지나온&amp;nbsp;사고&amp;nbsp;흐름을&amp;nbsp;기억&lt;/b&gt;한다.&lt;br /&gt;&lt;br /&gt;표현&amp;nbsp;방식만&amp;nbsp;다를&amp;nbsp;뿐,&lt;br /&gt;&amp;nbsp; 과거 맥락을 참고하고&lt;br /&gt;&amp;nbsp; 현재 상태를 재해석하며&lt;br /&gt;&amp;nbsp; 다음 생각을 만들어간다는 점에서&lt;br /&gt;&amp;nbsp; 사람과 모델은 놀라울 만큼 닮아 있다.&lt;br /&gt;&lt;br /&gt;그래서&amp;nbsp;내가&amp;nbsp;느낀&amp;nbsp;&amp;ldquo;Transformer&amp;nbsp;완전&amp;nbsp;이해&amp;rdquo;란,&lt;br /&gt;&amp;nbsp; &lt;b&gt;모델 구조를 아는 것이 아니라&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; 사람의 이해 방식이 어떻게 벡터로 구현되는지를 체감하는 과정&lt;/b&gt;이었다.&lt;br /&gt;&lt;br /&gt;이제부터는 모델이 아니라, &lt;br /&gt;&amp;nbsp; 이 의미 흐름이 &lt;b&gt;Embedding&lt;/b&gt;, &lt;b&gt;VectorDB&lt;/b&gt;, &lt;b&gt;RAG&lt;/b&gt;로 어떻게 확장되는지를 살펴보려 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅇ Week2: Embedding &amp;amp; Vector Database&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 53.4883%;&quot;&gt;주제&lt;/td&gt;
&lt;td style=&quot;width: 46.5117%;&quot;&gt;&lt;span style=&quot;background-color: #008300; color: #ffffff; text-align: start;&quot;&gt;핵심 내용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 53.4883%;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1025&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI] Embedding 기초 - Transformer가 만든 의미를 저장하는 방법&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.5117%;&quot;&gt;임베딩&amp;nbsp;모델&amp;nbsp;비교,&amp;nbsp;선택&amp;nbsp;가이드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 53.4883%;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1027&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI] Chunking Strategy - 청크 전략과 크기 최적화, RAG 품질의 출발점&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.5117%;&quot;&gt;청크&amp;nbsp;전략,&amp;nbsp;크기&amp;nbsp;최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 53.4883%;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1029&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI]&amp;nbsp;Vector&amp;nbsp;Similarity&amp;nbsp;&amp;mdash;&amp;nbsp;RAG에서&amp;nbsp;&amp;ldquo;가장&amp;nbsp;중요한&amp;nbsp;수학&amp;rdquo;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.5117%;&quot;&gt;Cosine/Dot/L2&amp;nbsp;메트릭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 53.4883%;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1030&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI] HNSW - ANN부터 파라미터 튜닝까지, RAG 검색 성능의 진짜 핵심&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.5117%;&quot;&gt;HNSW 알고리즘, 파라미터 튜닝&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 53.4883%;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1031&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI] Weaviate Usage - VectorDB를 &amp;ldquo;검색 엔진&amp;rdquo;이 아니라 &amp;ldquo;의미 저장소&amp;rdquo;로 쓰는 법&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.5117%;&quot;&gt;Weaviate&amp;nbsp;사용법,&amp;nbsp;하이브리드&amp;nbsp;검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 53.4883%;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1032&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI]&amp;nbsp;RAG용&amp;nbsp;VectorDB&amp;nbsp;튜닝&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.5117%;&quot;&gt;프로덕션&amp;nbsp;튜닝,&amp;nbsp;모니터링&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI] Embedding부터 VectorDB까지, Week2 학습 내용 정리&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅇ Week 3: RAG 구현 및 튜닝&lt;/h4&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%; height: 137px;&quot; border=&quot;1&quot; data-ke-style=&quot;style14&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #008300; color: #ffffff; height: 20px; width: 53.1395%;&quot;&gt;문서&lt;/td&gt;
&lt;td style=&quot;background-color: #008300; color: #ffffff; height: 20px; width: 46.7442%;&quot;&gt;&lt;span style=&quot;background-color: #008300; color: #ffffff; text-align: start;&quot;&gt;핵심 내용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #efefef; height: 20px; width: 53.1395%;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1033&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI]&amp;nbsp;RAG&amp;nbsp;파이프라인&amp;nbsp;전체&amp;nbsp;구조&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 46.7442%;&quot;&gt;RAG 파이프라인 전체 구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #efefef; height: 20px; width: 53.1395%;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1034&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI W3] RAG 기초 - Retriever(벡터, 키워드, Hybrid)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; height: 20px; width: 46.7442%;&quot;&gt;Dense/Sparse/Hybrid 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;background-color: #efefef; height: 18px; width: 53.1395%;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1035&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI&amp;nbsp;W3]&amp;nbsp;RAG&amp;nbsp;기초&amp;nbsp;-&amp;nbsp;Ranker의&amp;nbsp;필요성&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 46.7442%;&quot;&gt;Cross-Encoder,&amp;nbsp;Reranking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;background-color: #efefef; width: 53.1395%; height: 19px;&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1036&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI&amp;nbsp;W3]&amp;nbsp;Reader(LLM)&amp;nbsp;프롬프트&amp;nbsp;설계와&amp;nbsp;Hallucination을&amp;nbsp;다루는&amp;nbsp;방법&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; width: 46.7442%; height: 19px;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;LLM&amp;nbsp;프롬프트&amp;nbsp;설계,&amp;nbsp;Hallucination&amp;nbsp;방지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;background-color: #efefef; height: 20px; width: 53.1395%;&quot;&gt;05_End_To_End_RAG_Practice.md&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 46.7442%;&quot;&gt;실습&amp;nbsp;결과,&amp;nbsp;평가&amp;nbsp;지표&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅇ Week 4: 양자화 &amp;amp; 모델 최적화&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 56px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 31.2791%; height: 18px;&quot;&gt;문서&lt;/td&gt;
&lt;td style=&quot;width: 68.7209%; height: 18px;&quot;&gt;핵심&amp;nbsp;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 31.2791%; height: 20px;&quot;&gt;01_Quantization_Concepts&lt;/td&gt;
&lt;td style=&quot;width: 68.7209%; height: 20px;&quot;&gt;GPTQ/AWQ/GGUF,&amp;nbsp;양자화&amp;nbsp;원리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 31.2791%; height: 18px;&quot;&gt;02_4bit_8bit_Performance&lt;/td&gt;
&lt;td style=&quot;width: 68.7209%; height: 18px;&quot;&gt;비트별&amp;nbsp;성능&amp;nbsp;비교,&amp;nbsp;품질&amp;nbsp;평가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 건 &amp;ldquo;각 기술&amp;rdquo;이 아니라&lt;br /&gt;&lt;b&gt;이 기술들이 어떻게 연결되는지&lt;/b&gt;였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ RAG를 검색 기능이 아니라 지식 수명주기로 보기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습을 하면서 가장 크게 바뀐 관점은 이것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 검색 시스템이 아니다.&lt;br /&gt;지식 수명주기 시스템이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 다음 구조를 기본 전제로 잡았다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사람이 검증한 SSOT(Single Source of Truth)&lt;/li&gt;
&lt;li&gt;벡터는 파생 데이터&lt;/li&gt;
&lt;li&gt;지식 변경 시 재임베딩 가능&lt;/li&gt;
&lt;li&gt;Agent가 컨텍스트를 구성&lt;/li&gt;
&lt;li&gt;실행 결과는 다시 지식으로 환류&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;지식 생성 &amp;rarr; 정제 &amp;rarr; 저장 &amp;rarr; 검색 &amp;rarr; 재생산&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;이 흐름이 끊기지 않아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 다음 단계: Multi-Agent + AI DevOps&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Month 1은 &amp;ldquo;AI 기본기 + RAG&amp;rdquo;였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Month 2부터는 다음으로 확장한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Multi-Agent 구조&lt;/li&gt;
&lt;li&gt;Tool Calling&lt;/li&gt;
&lt;li&gt;Policy Chain / Guardrail&lt;/li&gt;
&lt;li&gt;LLM Gateway&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Month 3에서는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GPU Inference&lt;/li&gt;
&lt;li&gt;KServe / Triton&lt;/li&gt;
&lt;li&gt;OTEL 기반 LLM Tracing&lt;/li&gt;
&lt;li&gt;Token Cost 모델링&lt;/li&gt;
&lt;li&gt;SLO 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; AI DevOps + Observability&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 단순히 모델을 잘 쓰는 게 아니라,&lt;br /&gt;&amp;nbsp; AI 서비스를 운영 가능한 플랫폼으로 만드는 것이 목표다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 학습 노트는 결과물이 아니라 과정 기록이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설계하고, 실패하고, 다시 구조를 바꾸는 반복 속에서&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;ldquo;내가 만들고 싶은 시스템의 형태&amp;rdquo;가 조금씩 명확해지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 더 잘 코딩하는 개발자가 되고 싶은 게 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;시스템을 설계하고&lt;br /&gt;&amp;nbsp; &amp;nbsp;운영하고&lt;br /&gt;&amp;nbsp; &amp;nbsp;진화시키는 엔지니어가 되고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 Month 2, Month 3도 차근히 정리해 공유할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 고민을 하는 분들에게 참고가 되길 바란다.&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>Agent</category>
      <category>AI 학습</category>
      <category>LLM</category>
      <category>PETERICA</category>
      <category>Rag</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1017</guid>
      <comments>https://peterica.tistory.com/1017#entry1017comment</comments>
      <pubDate>Tue, 10 Feb 2026 06:09:10 +0900</pubDate>
    </item>
    <item>
      <title>[AI W3] Reader(LLM) 프롬프트 설계와 Hallucination을 다루는 방법</title>
      <link>https://peterica.tistory.com/1036</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSNb%2FbtsDwEYjHwl%2FgfNRKiPAkerKOYJ40TLVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;1026&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1017&quot;&gt;[AI]&amp;nbsp;LLM&amp;nbsp;학습&amp;nbsp;노트&amp;nbsp;공개&amp;nbsp;-&amp;nbsp;Transformer부터&amp;nbsp;RAG까지,&amp;nbsp;그리고&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;AI&amp;nbsp;시스템을&amp;nbsp;향해&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG를 처음 붙였을 때 가장 쉽게 드는 생각은 이거다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;문서는 잘 검색되는데, 왜 답변은 여전히 애매할까?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retriever도 튜닝했고, Ranker도 붙였고, 모델도 바꿔봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데도 답변 품질은 기대만큼 올라가지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 지점에서 많은 사람이 LLM 성능을 의심한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로 문제의 원인은 대부분 &lt;b&gt;Reader 단계&lt;/b&gt;,&lt;br /&gt;&amp;nbsp;정확히 말하면 &lt;b&gt;프롬프트와 컨텍스트 구성&lt;/b&gt;에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는&lt;br /&gt;&amp;nbsp; RAG의 마지막 단계인 Reader를 단순한 &amp;ldquo;모델 호출&amp;rdquo;이 아니라&lt;br /&gt;&lt;b&gt;&amp;nbsp; 품질을 결정하는 최종 시스템 레이어&lt;/b&gt;로 바라보며,&lt;br /&gt;&amp;nbsp; 프롬프트 설계와 Hallucination 문제를 어떻게 다뤄야 하는지 정리해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Reader는 왜 중요한가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 파이프라인을 한 줄로 요약하면 이렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; Retriever &amp;rarr; Ranker &amp;rarr; Reader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞단에서 아무리 좋은 문서를 가져와도&lt;br /&gt;&amp;nbsp; Reader가 그 문서를 제대로 읽지 못하면&lt;br /&gt;&amp;nbsp; RAG의 가치는 사라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reader의 역할은 단순하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 주어진 컨텍스트를 바탕으로 답변을 생성하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 단순한 역할 때문에 오히려 가장 많은 책임을 떠안는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서가 많으면 많다고 문제고,&lt;br /&gt;문서가 적으면 적다고 문제고,&lt;br /&gt;문서가 애매하면 Hallucination이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Reader는&lt;br /&gt;&amp;nbsp; &lt;b&gt;&amp;ldquo;LLM을 잘 고르는 문제&amp;rdquo;가 아니라&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;LLM이 사고할 수 있는 범위를 어떻게 제한할 것인가&lt;/b&gt;의 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 프롬프트 설계의 본질&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG에서 프롬프트 설계는&amp;nbsp;말을 예쁘게 쓰는 작업이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트는 Reader에게 다음을 명확히 정의한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;nbsp; 어떤 문서만 신뢰해야 하는지&lt;br /&gt;&amp;nbsp; 문서에 없을 때 어떻게 행동해야 하는지&lt;br /&gt;&amp;nbsp; 추론을 어디까지 허용하는지&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 프롬프트는&lt;br /&gt;&lt;b&gt;&amp;nbsp; 지식의 경계를 설정하는 제어 장치&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 RAG용 프롬프트에는 반드시 포함되어야 할 메시지가 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;제공된 문서만 사용한다&lt;br /&gt;문서에 없는 내용은 답하지 않는다&lt;br /&gt;모르면 모른다고 말한다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 가지가 빠진 프롬프트에서&lt;br /&gt;Hallucination은 구조적으로 발생할 수밖에 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Hallucination은 왜 생기는가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hallucination은 흔히&lt;br /&gt;&amp;nbsp; &lt;b&gt;&amp;ldquo;모델이 틀린 답을 만든다&amp;rdquo;&lt;/b&gt;라고 설명된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 RAG 환경에서의 Hallucination은&lt;br /&gt;&amp;nbsp; 대부분 모델 문제가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인은 훨씬 단순하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;nbsp; Reader가 참조 가능한 지식의 범위를 모른다&lt;br /&gt;&amp;nbsp; 답할 수 없는 상황에 대한 규칙이 없다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서 LLM은 침묵하는 대신 추론을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Hallucination은 모델 결함이 아니라&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;컨텍스트 경계가 흐릿할 때 발생하는 정상 동작&lt;/b&gt;에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Lost in the Middle 문제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reader를 다룰 때 반드시 고려해야 할 특성이 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;LLM은&lt;br /&gt;컨텍스트의 처음과 끝에 있는 정보를&lt;br /&gt;중간보다 더 잘 활용한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서가 길어질수록 가장 중요한 정보가 중간에 묻히는 문제가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 바로 Lost in the Middle 현상이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 RAG에서는 무조건 많은 문서를 넣는 것이 정답이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 중요한 문서만 남기고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 문서 수를 Top-3~5 수준으로 제한하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 필요하면 요약해서 전달한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reader에게 중요한 건&lt;br /&gt;&amp;nbsp; 문서의 &amp;ldquo;양&amp;rdquo;이 아니라&lt;br /&gt;&lt;b&gt;&amp;nbsp; 집중할 수 있는 구조&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Context Window는 자원이 아니라 제약이다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Context Window가 커졌다고 해서&lt;br /&gt;&amp;nbsp; 문제를 마음대로 밀어 넣을 수 있는 건 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오히려 컨텍스트가 길어질수록&lt;br /&gt;&amp;nbsp; 토큰 비용은 증가하고&lt;br /&gt;&amp;nbsp; 핵심 정보 활용률은 떨어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Reader 단계에서는 항상 토큰 예산을 기준으로 생각해야 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;시스템 프롬프트&lt;br /&gt;사용자 질의&lt;br /&gt;문서 컨텍스트&lt;br /&gt;답변 여유&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 네 가지가&amp;nbsp;하나의 고정된 예산 안에서 경쟁한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 Reader 튜닝이란&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;정보를 얼마나 줄일 수 있는가의 싸움&lt;/b&gt;이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Reader는 생각보다 단순하다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 RAG 실패 사례를 보면 LLM에게 너무 많은 걸 기대하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;b&gt;Reader&lt;/b&gt;는 &lt;b&gt;의미를 &amp;ldquo;판단&amp;rdquo;하는 주체가 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;판단은 Retriever와 Ranker에서 끝나야 하고&lt;br /&gt;&amp;nbsp; Reader는 그 결과를 언어로 표현할 뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨텍스트가 정확하면&lt;br /&gt;&amp;nbsp; 모델은 생각보다 안정적으로 답한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 컨텍스트가 흔들리면&lt;br /&gt;&amp;nbsp; 어떤 모델을 써도 결과는 흔들린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Hallucination을 줄이는 가장 확실한 방법은&lt;br /&gt;&amp;nbsp; 모델을 바꾸는 게 아니라&lt;br /&gt;&lt;b&gt;Reader 앞단을 정제하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 핵심&amp;nbsp;개념&amp;nbsp;한&amp;nbsp;줄&amp;nbsp;정의&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-sheets-baot=&quot;1&quot; data-sheets-root=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;개념&lt;/td&gt;
&lt;td&gt;정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reader&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;검색된 문서를 기반으로 답변을 생성하는 LLM&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context Window&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;LLM이 한 번에 처리할 수 있는 최대 토큰 수&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grounding&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;답변을 검색된 문서에 근거하도록 하는 기법&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Citation&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;답변에 출처 문서를 명시하는 것&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hallucination&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;LLM이 문서에 없는 내용을 지어내는 현상&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lost in the Middle&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;긴 컨텍스트 중간에 있는 정보를 잘 활용하지 못하는 현상&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.25em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;ㅁ 마무리 &amp;ndash; Reader를 시스템으로 바라본다는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reader를 이해한다는 것은 프롬프트 템플릿을 외운다는 뜻이 아니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;어디까지를 지식으로 인정할 것인가&lt;br /&gt;언제 답변을 포기할 것인가&lt;br /&gt;문서를 어떻게 배치할 것인가&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 결정들을&lt;b&gt;&amp;nbsp;시스템 레벨에서 설계하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG에서 좋은 답변은 LLM이 만들어내는 게 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 좋은 답변은&lt;br /&gt;&amp;nbsp; 잘 정의된 컨텍스트와&lt;br /&gt;&amp;nbsp; 명확한 사고 경계에서 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reader는 그 경계를 지키는 마지막 관문이다.&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>PETERICA</category>
      <category>Rag</category>
      <category>reader</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1036</guid>
      <comments>https://peterica.tistory.com/1036#entry1036comment</comments>
      <pubDate>Tue, 10 Feb 2026 00:15:00 +0900</pubDate>
    </item>
    <item>
      <title>[AI W3] RAG 기초 - Ranker의 필요성</title>
      <link>https://peterica.tistory.com/1035</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSNb%2FbtsDwEYjHwl%2FgfNRKiPAkerKOYJ40TLVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;1026&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1017&quot;&gt;[AI]&amp;nbsp;LLM&amp;nbsp;학습&amp;nbsp;노트&amp;nbsp;공개&amp;nbsp;-&amp;nbsp;Transformer부터&amp;nbsp;RAG까지,&amp;nbsp;그리고&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;AI&amp;nbsp;시스템을&amp;nbsp;향해&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며 - Retriever 다음에 반드시 필요한 이유&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선 글에서 Retriever를 정리하였다.&amp;nbsp;&lt;b&gt;Retriever는 빠르지만, 정확하지는 않다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VectorDB 검색&lt;/b&gt;이든 &lt;b&gt;BM25&lt;/b&gt;든,&lt;b&gt; Retriever&lt;/b&gt;의 역할은 어디까지나 &lt;b&gt;&amp;ldquo;후보군을 넓게 가져오는 것&amp;rdquo;&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 구조는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Retriever: 관련 있어 보이는 문서 &lt;b&gt;Top-50 ~ 100&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Ranker: 그중에서 &lt;b&gt;정말 중요한 문서 Top-5 ~ 10&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 단계를 분리하지 않으면&amp;nbsp;속도와 정확도를 동시에 만족시키기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는&lt;br /&gt;&lt;b&gt;&amp;nbsp; 왜 Ranker가 필요한지&lt;/b&gt;,&lt;br /&gt;&amp;nbsp; 그리고 &lt;b&gt;Cross-Encoder 기반 Reranking이 왜 사실상 표준이 되었는지&lt;/b&gt;를 정리해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 Ranker가 필요한가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retriever 단계의 특징을 정리하면 명확하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;속도 우선&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;대규모 문서 풀에서도 빠르게 검색&lt;/li&gt;
&lt;li&gt;대신 순위 품질은 &amp;ldquo;대략적&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조에서 자주 발생하는 문제는 이것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답 문서는 Top-100 안에는 있는데,&lt;br /&gt;상위에 오지 않는다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 보통 상위 몇 개 문서만 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;정답이 있어도 아래에 깔려 있으면 없는 것과 같다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 중간에 한 단계가 더 필요해진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Retriever: &amp;ldquo;관련 있을 법한 문서 모으기&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Ranker: &amp;ldquo;이 중에서 진짜 중요한 순서 다시 매기기&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 분리가 바로 RAG 검색 품질을 한 단계 끌어올리는 핵심이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Bi-Encoder vs Cross-Encoder&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이를 이해하면 왜 Ranker가 느리지만 정확한지 바로 납득된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;Bi-Encoder (Retriever)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;질의와 문서를 &lt;b&gt;각각 따로 인코딩&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;벡터 간 유사도로 비교&lt;/li&gt;
&lt;li&gt;빠르고 확장성 높음&lt;/li&gt;
&lt;li&gt;대신 세밀한 문맥 비교는 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;Cross-Encoder (Ranker)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;질의와 문서를 &lt;b&gt;한 번에 입력&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;토큰 단위 Attention으로 직접 비교&lt;/li&gt;
&lt;li&gt;느리지만 훨씬 정확함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직관적으로 말하면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Bi-Encoder&lt;/b&gt;는&lt;br /&gt;&lt;b&gt;&amp;ldquo;이 질문이랑 이 문서가 비슷해 보이네?&amp;rdquo;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cross-Encoder&lt;/b&gt;는&lt;br /&gt;&lt;b&gt;&amp;ldquo;질문의 이 부분이 문서의 이 문장과 정확히 연결되네&amp;rdquo;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 차이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 구조는 자연스럽게 이렇게 나뉜다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Bi-Encoder &amp;rarr; 대량 후보 추출&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cross-Encoder &amp;rarr; 소수 후보 정밀 정렬&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Cross-Encoder 기반 Reranking 흐름&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 파이프라인에서 Ranker는 보통 이런 식으로 동작한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Retriever로 Top-K 문서 검색 (예: 100개)&lt;/li&gt;
&lt;li&gt;질의-문서 쌍을 Cross-Encoder에 입력&lt;/li&gt;
&lt;li&gt;관련도 점수 계산&lt;/li&gt;
&lt;li&gt;점수 기준으로 재정렬&lt;/li&gt;
&lt;li&gt;상위 N개만 LLM에 전달&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 단순하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ranker는 검색 결과를 &amp;ldquo;줄이는&amp;rdquo; 단계가 아니라&lt;br /&gt;&amp;ldquo;순서를 바로잡는&amp;rdquo; 단계다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 주요 Reranker 모델 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 자주 쓰이는 모델만 정리해보면 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ms-marco-MiniLM 계열&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가볍고 빠름&lt;/li&gt;
&lt;li&gt;영어 중심&lt;/li&gt;
&lt;li&gt;POC나 응답 속도가 중요한 환경에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;bge-reranker-v2-m3&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다국어 지원&lt;/li&gt;
&lt;li&gt;정확도 높음&lt;/li&gt;
&lt;li&gt;온프레미스/자체 서빙에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cohere / Jina Rerank&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API 기반&lt;/li&gt;
&lt;li&gt;운영 편의성 높음&lt;/li&gt;
&lt;li&gt;비용 고려 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택 기준은 결국 이 두 가지다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서 수와 언어&lt;/li&gt;
&lt;li&gt;허용 가능한 지연 시간&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 성능 튜닝 관점에서의 Ranker&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ranker는 무조건 많이 쓰는 게 답이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 자주 쓰는 기준은 다음 정도다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Retriever: Top-50 ~ 100&lt;/li&gt;
&lt;li&gt;Ranker 결과: Top-5 ~ 10&lt;/li&gt;
&lt;li&gt;Ranker 지연 시간: 100~200ms 내&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 반드시 지켜야 할 원칙이 하나 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**Ranker는 전체 검색 품질을 바꾸지&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ranker는 Retriever가 가져온 후보 문서를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;정밀하게 재정렬&lt;/b&gt;하는 단계이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cross-Encoder&lt;/b&gt;는 질의와 문서를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;함께 인코딩&lt;/b&gt;해 높은 정확도를 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로덕션 RAG는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Retriever(속도) + Ranker(정확도)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;구조가 기본이 된다.&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>PETERICA</category>
      <category>Rag</category>
      <category>ranker</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1035</guid>
      <comments>https://peterica.tistory.com/1035#entry1035comment</comments>
      <pubDate>Mon, 9 Feb 2026 06:43:26 +0900</pubDate>
    </item>
    <item>
      <title>[AI W3] RAG 기초 - Retriever(벡터, 키워드, Hybrid)</title>
      <link>https://peterica.tistory.com/1034</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSNb%2FbtsDwEYjHwl%2FgfNRKiPAkerKOYJ40TLVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;1026&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1017&quot;&gt;[AI]&amp;nbsp;LLM&amp;nbsp;학습&amp;nbsp;노트&amp;nbsp;공개&amp;nbsp;-&amp;nbsp;Transformer부터&amp;nbsp;RAG까지,&amp;nbsp;그리고&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;AI&amp;nbsp;시스템을&amp;nbsp;향해&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;LLM이 똑똑하면 답변도 좋아지겠지.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로 RAG를 운영해보면, 품질 문제의 원인은 거의 항상 같은 지점에서 시작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Retriever가 잘못된 문서를 가져온다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 아무리 좋은 LLM을 써도, 아무리 프롬프트를 다듬어도, 입력 컨텍스트가 틀리면 결과는 틀릴 수밖에 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG에서도 결국 이 원칙이 그대로 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; Garbage In, Garbage Out&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 RAG 파이프라인의 첫 단계인&lt;br /&gt;&amp;nbsp; &lt;b&gt;Retriever&lt;/b&gt;를 중심으로,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Dense&lt;/b&gt; 검색&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sparse&lt;/b&gt; 검색&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hybrid&lt;/b&gt; 검색&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 가지 방식이 왜 등장했고, 실무에서는 왜 Hybrid가 사실상 기본이 되었는지를 정리해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Retriever란 무엇인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Retriever&lt;/b&gt;는 RAG 파이프라인의 첫 번째 단계다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할은 단순하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;질의와 관련된 문서를 빠르게 찾아오는 것&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 &amp;ldquo;빠르게&amp;rdquo;와 &amp;ldquo;관련된&amp;rdquo;이라는 조건이 &lt;b&gt;Retriever&lt;/b&gt;를 가장 어려운 컴포넌트로 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retriever는 보통 다음 구조를 가진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;질의와 문서를 각각 인코딩하는 Bi-Encoder 구조&lt;/li&gt;
&lt;li&gt;대규모 문서 집합에서 Top-K 후보를 빠르게 검색&lt;/li&gt;
&lt;li&gt;정확도보다 Recall을 우선하는 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Retriever의 목표는 &lt;b&gt;정답을 고르는 것이 아니라, 정답을 포함할 후보군을 놓치지 않는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Dense Retrieval &amp;mdash; 의미를 기준으로 찾는다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dense Retrieval&lt;/b&gt;은 임베딩 벡터 간의 유사도를 기준으로 문서를 검색한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작동 흐름은 비교적 단순하다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;질의를 임베딩 모델로 벡터화&lt;/li&gt;
&lt;li&gt;사전에 계산된 문서 벡터들과 유사도 계산&lt;/li&gt;
&lt;li&gt;가장 가까운 Top-K 문서 반환&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식의 핵심은 &lt;b&gt;&amp;ldquo;같은 의미를 다른 표현으로 말해도 찾을 수 있다&amp;rdquo;&lt;/b&gt;는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동의어, 유사 표현, 문장 구조가 달라도 의미가 비슷하면 검색된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 일반적인 &lt;b&gt;QA&lt;/b&gt;나 &lt;b&gt;대화형 검색&lt;/b&gt;에서는 &lt;b&gt;Dense Retrieval&lt;/b&gt;이 강력하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 단점도 명확하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정확한 키워드 매칭에 약함&lt;/li&gt;
&lt;li&gt;고유명사, 숫자, 코드 토큰에 취약&lt;/li&gt;
&lt;li&gt;임베딩 모델 품질에 크게 의존&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dense&lt;/b&gt; 검색만으로 &lt;b&gt;RAG&lt;/b&gt;를 구성하면, &amp;ldquo;비슷한 말은 찾는데, 정작 정확한 문서는 놓치는&amp;rdquo; 상황이 자주 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Sparse Retrieval &amp;mdash; 키워드를 기준으로 찾는다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Sparse Retrieval&lt;/b&gt;은 &lt;b&gt;BM25&lt;/b&gt;와 같은 키워드 기반 검색 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 의미를 이해하지 않는다. 대신 &lt;b&gt;단어의 출현 빈도와 희귀성&lt;/b&gt;을 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 다음과 같은 경우에 강하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정확한 용어가 중요한 검색&lt;/li&gt;
&lt;li&gt;법률, 계약, 정책 문서&lt;/li&gt;
&lt;li&gt;코드, 함수명, 설정 키워드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BM25의 장점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동작 방식이 직관적이다&lt;/li&gt;
&lt;li&gt;결과를 설명하기 쉽다&lt;/li&gt;
&lt;li&gt;계산이 빠르고 안정적이다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 단점도 분명하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;의미적 유사성은 전혀 고려하지 않는다&lt;/li&gt;
&lt;li&gt;동의어에 약하다&lt;/li&gt;
&lt;li&gt;오타나 표현 변화에 취약하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Sparse 검색은 &lt;b&gt;&amp;ldquo;정확한 단어가 맞을 때는 강하지만, 문맥에는 둔감하다.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Hybrid Search &amp;mdash; 현실적인 타협이 아니라 기본 전제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dense와 Sparse는 서로의 단점이 너무 명확하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그래서 실무에서는 자연스럽게 &lt;b&gt;Hybrid Search&lt;/b&gt;로 수렴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hybrid Search의 핵심은 단순하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Dense: 의미를 놓치지 않기 위해&lt;/li&gt;
&lt;li&gt;Sparse: 정확한 키워드를 놓치지 않기 위해&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 점수를 결합해 최종 순위를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 흔한 방식은 선형 결합이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dense&lt;/b&gt; 점수에 가중치를 주고, &lt;b&gt;Sparse&lt;/b&gt; 점수에 나머지 가중치를 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인에 따라 가중치는 달라진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반 QA: 의미와 키워드 균형&lt;/li&gt;
&lt;li&gt;법률/코드: 키워드 비중 증가&lt;/li&gt;
&lt;li&gt;대화형 QA: 의미 비중 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은, &lt;b&gt;Hybrid&lt;/b&gt;는 &lt;b&gt;&amp;ldquo;고급 옵션&amp;rdquo;&lt;/b&gt;이 아니라 &lt;b&gt;프로덕션 RAG의 기본 형태&lt;/b&gt;라는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Retriever와 ANN &amp;mdash; 빠른 검색은 근사다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dense Retrieval&lt;/b&gt;이 가능하려면 대규모 벡터를 빠르게 검색할 수 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 등장하는 개념이 &lt;b&gt;ANN(Approximate Nearest Neighbor)&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG에서 사용하는 벡터 검색은 &lt;b&gt;정확한 최근접 탐색이 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빠른 속도&lt;/li&gt;
&lt;li&gt;충분한 Recall&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 목표로 한 근사 검색이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 HNSW가 사실상 표준처럼 쓰인다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색 속도와 품질의 균형&lt;/li&gt;
&lt;li&gt;튜닝 가능한 파라미터&lt;/li&gt;
&lt;li&gt;다양한 VectorDB에서 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retriever 품질 문제는 결국 HNSW 파라미터 튜닝 문제로 이어지는 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/1030&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI] HNSW - ANN부터 파라미터 튜닝까지, RAG 검색 성능의 진짜 핵심&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리 - Retriever는 선택지가 아니라 설계 영역이다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Retriever&lt;/b&gt;를 단순히 &amp;ldquo;검색 모듈 하나&amp;rdquo;로 보면 RAG는 계속 흔들린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retriever는 다음 요소들이 수렴하는 지점이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Embedding&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Chunking&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Similarity Metric&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ANN 인덱스&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;VectorDB 설정&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 RAG 품질은 모델보다, 프롬프트보다, Retriever 설계에서 가장 크게 갈린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dense / Sparse / Hybrid 검색&lt;/b&gt;을 이해한다는 것은 기능을 고르는 게 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RAG 파이프라인의 첫 단추를 제대로 끼우는 일&lt;/b&gt;이다.&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>Dense Sparse Hybrid</category>
      <category>PETERICA</category>
      <category>Rag</category>
      <category>retriever</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1034</guid>
      <comments>https://peterica.tistory.com/1034#entry1034comment</comments>
      <pubDate>Mon, 9 Feb 2026 06:12:29 +0900</pubDate>
    </item>
    <item>
      <title>[AI] RAG 파이프라인 전체 구조</title>
      <link>https://peterica.tistory.com/1033</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSNb%2FbtsDwEYjHwl%2FgfNRKiPAkerKOYJ40TLVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;1026&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1017&quot;&gt;[AI]&amp;nbsp;LLM&amp;nbsp;학습&amp;nbsp;노트&amp;nbsp;공개&amp;nbsp;-&amp;nbsp;Transformer부터&amp;nbsp;RAG까지,&amp;nbsp;그리고&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;AI&amp;nbsp;시스템을&amp;nbsp;향해&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG(Retrieval-Augmented Generation)를 처음 접했을 때는 구조가 단순해 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문을 받고 &amp;rarr; 문서를 찾고 &amp;rarr; LLM에게 넘긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 자연스럽게 이렇게 생각하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;LLM만 잘 고르고, 임베딩만 잘 쓰면 되는 거 아닐까?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로 RAG를 붙여서 몇 번만 질의응답을 반복해보면&lt;br /&gt;금방 다른 감각을 얻게 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;답변이 애매하다&lt;/li&gt;
&lt;li&gt;근거 문서가 엉뚱하다&lt;/li&gt;
&lt;li&gt;모델을 바꿔도 품질이 크게 나아지지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 문제는 대부분 LLM이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 &lt;b&gt;모델 기술이 아니라 아키텍처 문제&lt;/b&gt;에 가깝다.&lt;br /&gt;이번 글에서는 RAG를 기능이 아닌 &lt;b&gt;시스템 파이프라인&lt;/b&gt;으로 바라보며,&lt;br /&gt;왜 구조 이해가 중요한지 정리해보려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ RAG를 한 줄로 요약하면&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Retriever &amp;rarr; Ranker &amp;rarr; Reader&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Retriever: 관련 문서를 빠르게 찾는다&lt;/li&gt;
&lt;li&gt;Ranker: 그중에서 정말 중요한 문서를 고른다&lt;/li&gt;
&lt;li&gt;Reader: 선택된 문서를 읽고 답변을 생성한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은 LLM(Reader)은 &lt;b&gt;마지막 단계&lt;/b&gt;라는 것이다.&lt;br /&gt;앞단이 흔들리면, 아무리 좋은 모델을 써도 결과는 흔들린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Retriever - RAG 품질이 시작되는 지점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RAG&lt;/b&gt; 품질을 좌우하는 가장 중요한 컴포넌트는 &lt;b&gt;Retriever&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;b&gt;Retriever&lt;/b&gt;는 하나의 모듈이 아니다.&lt;br /&gt;여러 설계 결정이 겹쳐진 결과물이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Retriever&lt;/b&gt;를 구성하는 요소를 풀어보면 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서를 어떻게 나눌 것인가 (&lt;b&gt;Chunking&lt;/b&gt;)&lt;/li&gt;
&lt;li&gt;의미를 어떻게 벡터로 표현할 것인가 (&lt;b&gt;Embedding&lt;/b&gt;)&lt;/li&gt;
&lt;li&gt;무엇을 &amp;ldquo;가깝다&amp;rdquo;고 판단할 것인가 (&lt;b&gt;Similarity&lt;/b&gt;)&lt;/li&gt;
&lt;li&gt;얼마나 정밀하게 탐색할 것인가 (&lt;b&gt;ANN / HNSW&lt;/b&gt;)&lt;/li&gt;
&lt;li&gt;이 모든 것을 어떻게 저장하고 운영할 것인가 (&lt;b&gt;VectorDB&lt;/b&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;Retriever&lt;/b&gt;는&lt;br /&gt;&lt;b&gt;&lt;a href=&quot;https://peterica.tistory.com/1017&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Week 2&lt;/a&gt;에서 다뤘던 모든 요소가 수렴하는 지점&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;b&gt;RAG&lt;/b&gt;에서 검색 품질이 낮을 때&lt;br /&gt;모델보다 먼저 &lt;b&gt;Retriever&lt;/b&gt;를 의심해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Dense, Sparse, 그리고 Hybrid Search&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Retriever&lt;/b&gt;를 구현하는 방식은 크게 세 가지로 나뉜다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Dense Retrieval&lt;/b&gt;: 벡터 유사도 기반 검색&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sparse Retrieval&lt;/b&gt;: BM25 같은 키워드 기반 검색&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hybrid Search&lt;/b&gt;: 두 방식을 결합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dense 검색&lt;/b&gt;은 &lt;b&gt;의미&lt;/b&gt;를 잘 잡지만,&lt;br /&gt;&amp;nbsp; 고유명사나 숫자, 정확한 키워드에는 약하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 &lt;b&gt;Sparse 검색&lt;/b&gt;은 &lt;b&gt;키워드&lt;/b&gt;에는 강하지만&lt;br /&gt;&amp;nbsp; 의미적 유사성은 놓치기 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 실무에서는 대부분&lt;br /&gt;&lt;b&gt;&amp;nbsp; Hybrid Search가 기본 전제&lt;/b&gt;가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계의 목표는 단 하나다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;정답을 포함할 가능성이 있는 후보군을 최대한 놓치지 않는 것&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Ranker - 빠른 검색과 정확한 판단의 분리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Retriever&lt;/b&gt;는 속도가 우선이다.&lt;br /&gt;그래서 결과는 &lt;b&gt;&amp;ldquo;대략 맞는 후보군&amp;rdquo;&lt;/b&gt; 수준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 필요한 것이 &lt;b&gt;Ranker&lt;/b&gt;(&lt;b&gt;Reranker&lt;/b&gt;)다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ranker&lt;/b&gt;는 질의와 문서를 &lt;b&gt;함께 비교&lt;/b&gt;해&lt;br /&gt;&amp;nbsp; 정확한 순서를 다시 매긴다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Retriever: 빠른 후보 생성 (Recall 중심)&lt;/li&gt;
&lt;li&gt;Ranker: 정밀한 재정렬 (Precision 중심)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조 덕분에&lt;br /&gt;&amp;nbsp; RAG는 속도와 정확도를 동시에 확보할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 RAG 품질이 한 단계 올라가는 순간은&lt;br /&gt;&amp;nbsp; 대부분 &lt;b&gt;Reranking&lt;/b&gt;을 붙였을 때다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Reader - LLM은 생각보다 단순하다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 경우 LLM이 너무 많은 책임을 떠안고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Reader의 역할은 명확하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주어진 컨텍스트를 바탕으로 답변을 생성하는 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨텍스트가 정확하면 모델은 비교적 안정적으로 답한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 컨텍스트가 틀리면 환각은 구조적으로 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Hallucination 문제는 프롬프트보다 &lt;b&gt;검색과 컨텍스트 구성 문제&lt;/b&gt;인 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ RAG는 검색 기능이 아니라 지식 파이프라인이다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG를 제대로 운영하려면&lt;br /&gt;&amp;nbsp; 검색 기능이 아니라 &lt;b&gt;지식 수명주기&lt;/b&gt;로 봐야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원본 문서는 &lt;b&gt;SSOT&lt;/b&gt;(Source of Truth)&lt;/li&gt;
&lt;li&gt;벡터는 언제든 재생성 가능한 파생 데이터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지식 변경&lt;/b&gt; &amp;rarr; &lt;b&gt;재임베딩&lt;/b&gt; &amp;rarr; &lt;b&gt;재인덱싱&lt;/b&gt; 가능해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 관점이 없으면 운영 중인 RAG는 빠르게 망가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리 - RAG 아키텍처를 이해한다는 것&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG를 이해한다는 것은 모델을 하나 더 붙이는 방법을 아는 게 아니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어디서 의미가 결정되는지&lt;/li&gt;
&lt;li&gt;어디서 품질이 갈리는지&lt;/li&gt;
&lt;li&gt;어디가 튜닝 포인트인지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름을 구조로 이해하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 RAG 아키텍처의 핵심은 단순하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;좋은 답변은 LLM이 아니라,&lt;br /&gt;좋은 검색 파이프라인에서 시작된다.&lt;/blockquote&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>PETERICA</category>
      <category>Rag</category>
      <category>RAG 아키텍처</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1033</guid>
      <comments>https://peterica.tistory.com/1033#entry1033comment</comments>
      <pubDate>Mon, 9 Feb 2026 05:31:14 +0900</pubDate>
    </item>
    <item>
      <title>[AI] RAG용 VectorDB 튜닝</title>
      <link>https://peterica.tistory.com/1032</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSNb%2FbtsDwEYjHwl%2FgfNRKiPAkerKOYJ40TLVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;1026&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1017&quot;&gt;[AI]&amp;nbsp;LLM&amp;nbsp;학습&amp;nbsp;노트&amp;nbsp;공개&amp;nbsp;-&amp;nbsp;Transformer부터&amp;nbsp;RAG까지,&amp;nbsp;그리고&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;AI&amp;nbsp;시스템을&amp;nbsp;향해&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG를 처음 설계할 때는 자연스럽게 LLM과 Embedding에 시선이 간다.&lt;br /&gt;하지만 실제로 RAG를 붙여서 질의응답을 반복해보면,&lt;br /&gt;어느 순간 이런 느낌을 받게 된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;모델은 괜찮은데, 답변이 뭔가 애매하다&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 많은 경우 문제는 LLM이 아니다.&lt;br /&gt;&lt;b&gt;VectorDB 설정&lt;/b&gt;, 더 정확히 말하면 검색 튜닝에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는&lt;br /&gt;&amp;nbsp; RAG 파이프라인에서 VectorDB가 어떤 역할을 하고,&lt;br /&gt;&amp;nbsp; 왜 튜닝이 성능을 좌우하는지,&lt;br /&gt;&amp;nbsp; 그리고 어떤 기준으로 설정을 조정해야 하는지를 정리해보려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ RAG에서 VectorDB가 병목이 되는 이유&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG의 흐름을 단순화하면 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;질문 &amp;rarr; 임베딩 &amp;rarr; VectorDB 검색 &amp;rarr; 컨텍스트 구성 &amp;rarr; LLM 응답&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중 VectorDB는 단순한 저장소가 아니다.&lt;br /&gt;&lt;b&gt;검색 품질과 응답 속도를 동시에 책임지는 지점&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 항상 충돌하는 두 가지 지표가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색 정확도 (Recall)&lt;/li&gt;
&lt;li&gt;응답 지연 (Latency)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;검색 범위&lt;/b&gt;를 넓히면 &lt;b&gt;더 정확해지지만 느려지고&lt;/b&gt;,&lt;br /&gt;&lt;b&gt;빠르게 응답&lt;/b&gt;하면 &lt;b&gt;관련 문서를 놓치기 쉽다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 VectorDB 튜닝의 본질은&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Recall과 Latency 사이의 균형점을 찾는 일&lt;br /&gt;이라고 볼 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ HNSW, RAG 검색의 사실상 표준&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 대부분의 VectorDB는&lt;br /&gt;&amp;nbsp; HNSW(Hierarchical Navigable Small World) 알고리즘을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; HNSW는 모든 벡터를 전부 비교하지 않고도,&lt;br /&gt;&amp;nbsp; 그래프 탐색을 통해 &lt;b&gt;근사 최근접 이웃(ANN)&lt;/b&gt; 을 빠르게 찾는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은&lt;br /&gt;&amp;nbsp; HNSW는 &amp;ldquo;알고리즘 하나&amp;rdquo;라기보다&lt;br /&gt;&lt;b&gt;&amp;nbsp; 파라미터에 따라 성격이 완전히 달라지는 구조&lt;/b&gt;라는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 같은 데이터, 같은 임베딩이라도 설정값에 따라 결과 품질이 크게 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ RAG에서 꼭 이해해야 할 핵심 파라미터&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HNSW 튜닝에서 실제로 중요한 값은 많지 않다.&lt;br /&gt;하지만 의미를 잘못 이해하면 튜닝 방향이 틀어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;튜닝을 위한 핵심 개념 한 줄 정의&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.7209%;&quot;&gt;개념&lt;/td&gt;
&lt;td style=&quot;width: 71.2791%;&quot;&gt;정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.7209%;&quot;&gt;ef&amp;nbsp;(efConstruction)&lt;/td&gt;
&lt;td style=&quot;width: 71.2791%;&quot;&gt;HNSW&amp;nbsp;인덱스&amp;nbsp;빌드&amp;nbsp;시&amp;nbsp;탐색&amp;nbsp;범위&amp;nbsp;(높을수록&amp;nbsp;정확,&amp;nbsp;느림)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.7209%;&quot;&gt;ef&amp;nbsp;(efSearch)&lt;/td&gt;
&lt;td style=&quot;width: 71.2791%;&quot;&gt;HNSW&amp;nbsp;검색&amp;nbsp;시&amp;nbsp;탐색&amp;nbsp;범위&amp;nbsp;(높을수록&amp;nbsp;정확,&amp;nbsp;느림)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.7209%;&quot;&gt;M&amp;nbsp;(maxConnections)&lt;/td&gt;
&lt;td style=&quot;width: 71.2791%;&quot;&gt;HNSW&amp;nbsp;그래프의&amp;nbsp;연결&amp;nbsp;수&amp;nbsp;(높을수록&amp;nbsp;정확,&amp;nbsp;메모리&amp;nbsp;증가)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.7209%;&quot;&gt;Recall@K&lt;/td&gt;
&lt;td style=&quot;width: 71.2791%;&quot;&gt;상위&amp;nbsp;K개&amp;nbsp;중&amp;nbsp;실제&amp;nbsp;관련&amp;nbsp;문서&amp;nbsp;비율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.7209%;&quot;&gt;QPS&lt;/td&gt;
&lt;td style=&quot;width: 71.2791%;&quot;&gt;초당&amp;nbsp;처리&amp;nbsp;쿼리&amp;nbsp;수&amp;nbsp;(Queries&amp;nbsp;Per&amp;nbsp;Second)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;efConstruction&lt;/b&gt;&lt;br /&gt;인덱스를 만들 때 얼마나 정성 들여 구성할지를 결정한다.&lt;br /&gt;빌드 시간과 인덱스 품질에 영향을 주며,&lt;br /&gt;검색 성능에는 간접적으로 작용한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개발 단계에서는 낮게,&lt;br /&gt;프로덕션에서는 한 번만 높게 설정하는 경우가 많다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;efSearch&lt;/b&gt;&lt;br /&gt;검색 시 탐색하는 후보 벡터 수를 의미한다.&lt;br /&gt;값이 커질수록 더 넓게 탐색하고, Recall은 좋아지지만 응답은 느려진다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;RAG 품질이 낮다고 느껴질 때&lt;br /&gt;가장 먼저 조정해볼 수 있는 파라미터다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;M&lt;/b&gt;&lt;br /&gt;각 노드가 가질 수 있는 연결 수를 의미한다.&lt;br /&gt;그래프가 촘촘해질수록 검색 품질은 좋아지지만&lt;br /&gt;메모리 사용량이 선형적으로 증가한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;운영 환경에서는 보통&lt;br /&gt;&lt;b&gt;메모리 예산을 기준으로 상한을 먼저 정한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Recall과 Latency, 피할 수 없는 선택&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VectorDB 튜닝을 하다 보면 반드시 마주치는 현실이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;efSearch를 올리면 &amp;rarr; 정확하지만 느려진다&lt;/li&gt;
&lt;li&gt;M을 올리면 &amp;rarr; 정확하지만 메모리를 더 쓴다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 중요한 것은&lt;br /&gt;&lt;b&gt;&amp;nbsp; 최대 성능이 아니라, 서비스 요구사항에 맞는 성능&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; RAG는 연구용 시스템이 아니라 운영 대상 시스템이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 청크 크기와 VectorDB 튜닝의 관계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VectorDB 설정만 바꾼다고 모든 문제가 해결되지는 않는다.&lt;br /&gt;&lt;b&gt;청크 전략&lt;/b&gt;이 함께 맞지 않으면 효과가 제한적이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작은 청크
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색은 정밀하지만 컨텍스트가 잘게 쪼개진다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;큰 청크
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨텍스트는 풍부하지만 검색 정확도가 떨어질 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 RAG에서는&lt;br /&gt;&amp;nbsp; 256~512 토큰 + overlap 구성이 가장 안정적인 경우가 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; VectorDB 튜닝과 청크 전략은 항상 &lt;b&gt;함께&lt;/b&gt; 봐야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 프로덕션 관점에서의 튜닝 기준&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영 환경에서는 한 번의 튜닝으로 끝나지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지속적으로 확인해야 할 지표는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;p50 / p95 / p99 검색 Latency&lt;/li&gt;
&lt;li&gt;Recall@K 추정치&lt;/li&gt;
&lt;li&gt;QPS 증가 시 성능 변화&lt;/li&gt;
&lt;li&gt;메모리 사용량&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적인 설정값보다 중요한 것은 &lt;b&gt;조정 가능한 구조와 관측 가능한 지표&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;Week&amp;nbsp;2를&amp;nbsp;관통하며&amp;nbsp;정리한&amp;nbsp;결론&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Week 2를 관통하며 하나의 결론에 도달했다.&lt;br /&gt;&lt;br /&gt;Embedding,&amp;nbsp;Chunking,&amp;nbsp;Similarity,&amp;nbsp;HNSW를&amp;nbsp;각각&amp;nbsp;따로&amp;nbsp;보면&amp;nbsp;개별&amp;nbsp;기술처럼&amp;nbsp;보이지만,&amp;nbsp;&amp;nbsp;&lt;br /&gt;실제&amp;nbsp;RAG에서는&amp;nbsp;이&amp;nbsp;모든&amp;nbsp;요소가&amp;nbsp;Retriever라는&amp;nbsp;하나의&amp;nbsp;품질로&amp;nbsp;수렴한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;RAG 품질은&amp;nbsp;&amp;nbsp;&lt;br /&gt;모델보다, Embedding보다, Prompt보다&amp;nbsp;&amp;nbsp;&lt;br /&gt;Retriever 설계에서 가장 크게 갈린다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그리고&amp;nbsp;Retriever의&amp;nbsp;품질은&amp;nbsp;결국&amp;nbsp;다음&amp;nbsp;요소들로&amp;nbsp;정리된다.&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;Chunking&amp;nbsp;전략&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;Similarity&amp;nbsp;메트릭&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;ANN(HNSW)&amp;nbsp;파라미터&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;VectorDB&amp;nbsp;인덱스&amp;nbsp;설정과&amp;nbsp;운영&amp;nbsp;전략&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;즉,&amp;nbsp;RAG용&amp;nbsp;&lt;b&gt;VectorDB&amp;nbsp;튜닝&lt;/b&gt;은&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &lt;b&gt;선택 가능한 옵션이 아니라&lt;/b&gt; 처음부터 &lt;b&gt;전제로 깔고 가야 할 필수 설계 영역&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 품질이 기대에 미치지 못할 때,&lt;br /&gt;많은 경우 가장 먼저 LLM이나 임베딩 모델을 의심한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로는&lt;br /&gt;&lt;b&gt;&amp;nbsp; VectorDB 설정 하나로 결과가 극적으로 달라지는 경우&lt;/b&gt;가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; VectorDB는 단순한 저장소가 아니라,&lt;br /&gt;&amp;nbsp; RAG의 검색 품질을 결정하는 핵심 컴포넌트다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델을 바꾸기 전에,&lt;br /&gt;&amp;nbsp; VectorDB 튜닝부터 점검해보는 것이 운영 관점에서 훨씬 합리적인 선택일 수 있다.&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>PETERICA</category>
      <category>Rag</category>
      <category>VectorDB 튜닝</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1032</guid>
      <comments>https://peterica.tistory.com/1032#entry1032comment</comments>
      <pubDate>Sun, 8 Feb 2026 17:30:45 +0900</pubDate>
    </item>
    <item>
      <title>[AI] Embedding부터 VectorDB까지, Week2 학습 내용 정리</title>
      <link>https://peterica.tistory.com/1026</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1017&quot;&gt;[AI]&amp;nbsp;LLM&amp;nbsp;학습&amp;nbsp;노트&amp;nbsp;공개&amp;nbsp;-&amp;nbsp;Transformer부터&amp;nbsp;RAG까지,&amp;nbsp;그리고&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;AI&amp;nbsp;시스템을&amp;nbsp;향해&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Week 2에서는 Embedding부터 VectorDB까지,&lt;br /&gt;&amp;nbsp; RAG 시스템의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;검색 품질을 결정하는 핵심 요소들&lt;/b&gt;을 하나씩 정리해 왔다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 단순히&lt;br /&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;ldquo;임베딩을 만들고, 벡터 검색을 하면 되겠지&amp;rdquo;라고 생각했다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 실제로 파고들어 보니 전혀 아니었다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;Embedding&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;rarr; Chunking&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;rarr; Vector Similarity&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;rarr; ANN(HNSW)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;rarr; VectorDB 구조와 튜닝&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 모든 요소가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;하나의 검색 파이프라인&lt;/b&gt;으로 연결되어 있었고,&lt;br /&gt;&amp;nbsp; &amp;nbsp;어느 하나라도 잘못 설계되면 RAG 품질은 바로 무너졌다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는&lt;br /&gt;&amp;nbsp; 그동안 쪼개서 정리했던 내용을 다시 묶어,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; Week 2: Embedding &amp;amp; Vector Database를 총체적으로 어떻게 이해하게 되었는지&lt;/b&gt;&lt;br /&gt;정리해 보려고 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ Week 2의 출발점: &amp;ldquo;의미를 어떻게 저장할 것인가&amp;rdquo;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Week 2의 시작은 아주 단순한 질문이었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer가 만들어낸 &amp;lsquo;의미&amp;rsquo;를&lt;br /&gt;우리는 어디에, 어떤 형태로 저장해야 할까?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 질문에 대한 답으로 가장 먼저 정리한 글이 아래였다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica.tistory.com/1025&quot;&gt;&lt;b&gt;[AI] Embedding 기초 &amp;mdash; Transformer가 만든 의미를 저장하는 방법&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서 정리한 핵심은 이것이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;임베딩은 단순한 숫자 배열이 아니다&lt;/li&gt;
&lt;li&gt;문장, 문단, 문서의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;의미 좌표&lt;/b&gt;다&lt;/li&gt;
&lt;li&gt;VectorDB는 이 좌표를 저장하고 탐색하는 시스템이다&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;RAG에서 검색이란 &amp;ldquo;문서를 찾는 행위&amp;rdquo;가 아니라&lt;br /&gt;&lt;b&gt;&amp;nbsp; 의미 공간에서 가까운 좌표를 찾는 문제&lt;/b&gt;였다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이것은 마치 우리가 생각을 할 때에 그 흐름이 어느 주제와 가깝다고 느끼는 것을 의미 공간으로 표현한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ Chunking: VectorDB 성능은 여기서 이미 결정된다&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Embedding을 이해하고 나니,&lt;br /&gt;&amp;nbsp; 다음 질문은 자연스럽게 이어졌다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼, 무엇을 하나의 벡터로 만들 것인가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 질문이 바로 Chunking 문제다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 정리한 글이 다음이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica.tistory.com/1027&quot;&gt;&lt;b&gt;[AI] Chunking Strategy &amp;mdash; 청크 전략과 크기 최적화, RAG 품질의 출발점&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 통해 확실히 느낀 점은 하나였다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chunking은 전처리가 아니라&amp;nbsp;Retriever 설계 그 자체다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Chunk가 너무 작으면 &amp;rarr; 의미는 정확하지만 맥락이 깨지고&lt;/li&gt;
&lt;li&gt;Chunk가 너무 크면 &amp;rarr; 맥락은 좋지만 검색 정확도가 떨어진다&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;Chunking은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Recall과 Context 품질 사이의 첫 번째 트레이드오프&lt;/b&gt;였다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ Vector Similarity: &amp;ldquo;가장 중요한 수학&amp;rdquo;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Chunk를 만들고 벡터를 저장했다면, 이제 남은 질문은 이것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;가깝다&amp;rdquo;는 걸 어떻게 정의할 것인가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 다룬 글이 다음이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica.tistory.com/1029&quot;&gt;&lt;b&gt;[AI] Vector Similarity &amp;mdash; RAG에서 &amp;lsquo;가장 중요한 수학&amp;rsquo;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Cosine,&amp;nbsp;Dot&amp;nbsp;Product,&amp;nbsp;L2&amp;nbsp;Distance는&amp;nbsp;모두&amp;nbsp;&lt;b&gt;&amp;ldquo;두&amp;nbsp;벡터가&amp;nbsp;얼마나&amp;nbsp;비슷한가&amp;rdquo;를&amp;nbsp;재는&amp;nbsp;방법&lt;/b&gt;이지만,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;무엇을 기준으로 비슷하다고 판단하느냐&quot;&lt;/b&gt;가 다르다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cosine Similarity&lt;/b&gt;는 벡터의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;방향&lt;/b&gt;만 본다. 길이는 무시하고, 같은 방향을 향하면 비슷하다고 본다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 문서 길이가 다르더라도 의미만 비교하고 싶을 때 적합하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dot Product&lt;/b&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;방향과 함께 벡터의 크기까지 반영&lt;/b&gt;한다. 같은 방향이면서 크기가 클수록 점수가 커지기 때문에, 의미 유사성과 동시에 &amp;ldquo;강도&amp;rdquo;나 &amp;ldquo;중요도&amp;rdquo;까지 포함한 비교에 가깝다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;반면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;L2 Distance&lt;/b&gt;는 완전히 다른 관점이다. 두 벡터 사이의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;물리적인 거리&lt;/b&gt;를 잰다. 좌표 공간에서 얼마나 멀리 떨어져 있는지를 보는 방식이라, 값의 스케일에 매우 민감하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;직관적으로 말하면,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Cosine&lt;/b&gt;은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;ldquo;같은 방향을 보고 있나&amp;rdquo;&lt;/b&gt;,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Dot&lt;/b&gt;은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;ldquo;같은 방향 + 얼마나 세게인가&amp;rdquo;&lt;/b&gt;,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;L2&lt;/b&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;ldquo;서로 얼마나 떨어져 있나&amp;rdquo;&lt;/b&gt;를 묻는 질문이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RAG&lt;/b&gt;나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;VectorDB&lt;/b&gt;에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Cosine&lt;/b&gt;이 많이 쓰이는 이유는,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 우리가 보통&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;의미의 방향&lt;/b&gt;을 비교하고 싶지,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 문장의 길이나 벡터 크기 자체를 비교하고 싶은 경우는 드물기 때문이다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cosine&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Dot Product&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;L2 Distance&lt;/b&gt;를 정리하면서&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;한 가지 중요한 사실을 깨달았다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대부분의 임베딩 모델은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;방향 정보&lt;/b&gt;가 핵심이다&lt;/li&gt;
&lt;li&gt;RAG 검색에서는 크기보다&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;의미 방향&lt;/b&gt;이 중요하다&lt;/li&gt;
&lt;li&gt;그래서 Cosine Similarity가 사실상 표준처럼 쓰인다&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 더 중요한 결론은 이것이었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베딩이 L2 정규화되어 있다면&lt;br /&gt;Cosine, Dot Product, L2 Distance는 거의 같은 의미를 가진다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;&lt;b&gt;&amp;nbsp; 모델 학습 방식과 메트릭 선택은 분리해서 볼 수 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ ANN과 HNSW: 정확한 검색은 불가능하다&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Vector Similarity&lt;/b&gt;를 이해하고 나니&lt;br /&gt;&amp;nbsp; 또 하나의 현실적인 벽을 마주하게 된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터가 수백만 개라면,&lt;br /&gt;매번 정확한 최근접 탐색이 가능할까?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;대답은 명확하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불가능하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 등장하는 개념이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;ANN(Approximate Nearest Neighbor)&lt;/b&gt;이고,&lt;br /&gt;그중 실무에서 가장 많이 쓰이는 구조가 HNSW다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 정리한 글이 다음이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica.tistory.com/1030&quot;&gt;&lt;b&gt;[AI] HNSW &amp;mdash; ANN부터 파라미터 튜닝까지, RAG 검색 성능의 진짜 핵심&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 글을 통해 관점이 완전히 바뀌었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VectorDB 검색은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;정확한 검색이 아니다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;항상 Recall과 Latency의 트레이드오프 위에 있다&lt;/li&gt;
&lt;li&gt;ef, M 같은 파라미터는 &amp;ldquo;옵션&amp;rdquo;이 아니라&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;품질 레버&lt;/b&gt;다&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;RAG&lt;/b&gt;에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;ldquo;검색이 느리다 / 잘 못 찾는다&amp;rdquo;&lt;/b&gt;는 문제는&lt;br /&gt;&amp;nbsp; 대부분&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;HNSW 튜닝 문제&lt;/b&gt;로 귀결된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ VectorDB: 검색 엔진이 아니라 &amp;ldquo;의미 인프라&amp;rdquo;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기까지 이해하고 나서야&lt;br /&gt;&amp;nbsp; 비로소 VectorDB를 제대로 바라볼 수 있게 되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 Weaviate를 기준으로 정리한 글이 다음이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://peterica.tistory.com/1031&quot;&gt;&lt;b&gt;[AI] Weaviate Usage &amp;mdash; VectorDB를 &amp;lsquo;검색 엔진&amp;rsquo;이 아니라 &amp;lsquo;의미 저장소&amp;rsquo;로 쓰는 법&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 글을 쓰면서 확신하게 된 점은 이것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VectorDB는 데이터베이스라기보다&lt;br /&gt;의미 공간을 유지&amp;middot;탐색하는 인프라에 가깝다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;벡터&lt;/b&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;파생 데이터&lt;/b&gt;다&lt;/li&gt;
&lt;li&gt;원본 문서가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;SSOT(Source of Truth)&lt;/b&gt;다&lt;/li&gt;
&lt;li&gt;재임베딩과 재인덱싱은 언제든 가능해야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;VectorDB&lt;/b&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;RAG 파이프라인&lt;/b&gt;에서&lt;br /&gt;&lt;b&gt;&amp;nbsp; 후보 생성기(Retriever)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;역할을 맡는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 그래서, RAG용 VectorDB 튜닝이 왜 중요한가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Week 2를 통해 Embedding부터 VectorDB까지의 흐름을 정리하며 한 가지 결론에 도달했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 품질은&lt;br /&gt;&amp;nbsp; 모델, Embedding, Prompt보다&lt;br /&gt;&lt;b&gt;&amp;nbsp; Retriever 설계에서 가장 크게 갈린다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그리고 Retriever의 품질은 결국 다음 요소들로 수렴한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서를 어떻게 나누는가 (Chunking 전략)&lt;/li&gt;
&lt;li&gt;의미를 어떻게 비교하는가 (Similarity 메트릭)&lt;/li&gt;
&lt;li&gt;얼마나 정밀하게 탐색하는가 (ANN / HNSW 파라미터)&lt;/li&gt;
&lt;li&gt;이를 어떤 기준으로 운영하는가 (VectorDB 인덱스와 튜닝 전략)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, VectorDB는 단순한 저장소가 아니라&lt;br /&gt;&lt;b&gt;&amp;nbsp; RAG 검색 품질을 결정하는 핵심 설계 영역&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 그리고 RAG용 VectorDB 튜닝은 &amp;lsquo;옵션&amp;rsquo;이 아니라 필수 설계 영역&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이 결론을 바탕으로 실제 RAG 환경에서 VectorDB를 어떻게 튜닝하고 운영해야 하는지를 &lt;br /&gt;&lt;a href=&quot;https://peterica.tistory.com/1032&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI]&amp;nbsp;RAG용&amp;nbsp;VectorDB&amp;nbsp;튜닝&lt;/a&gt;에 정리하였다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1026</guid>
      <comments>https://peterica.tistory.com/1026#entry1026comment</comments>
      <pubDate>Sun, 8 Feb 2026 16:55:40 +0900</pubDate>
    </item>
    <item>
      <title>[AI] Weaviate Usage - VectorDB를 &amp;ldquo;검색 엔진&amp;rdquo;이 아니라 &amp;ldquo;의미 저장소&amp;rdquo;로 쓰는 법</title>
      <link>https://peterica.tistory.com/1031</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSNb%2FbtsDwEYjHwl%2FgfNRKiPAkerKOYJ40TLVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;1026&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1017&quot;&gt;[AI]&amp;nbsp;LLM&amp;nbsp;학습&amp;nbsp;노트&amp;nbsp;공개&amp;nbsp;-&amp;nbsp;Transformer부터&amp;nbsp;RAG까지,&amp;nbsp;그리고&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;AI&amp;nbsp;시스템을&amp;nbsp;향해&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선 글에서 Embedding, Vector Similarity, HNSW까지 정리했다면,&lt;br /&gt;이제 실제 VectorDB를 어떻게 쓰는지가 남는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 Weaviate를 기준으로,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스키마 설계&lt;/li&gt;
&lt;li&gt;데이터 삽입 흐름&lt;/li&gt;
&lt;li&gt;벡터 검색&lt;/li&gt;
&lt;li&gt;하이브리드 검색(BM25 + Vector)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은 이것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Weaviate는 단순한 벡터 저장소가 아니라,&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;ldquo;의미 기반 데이터 모델링 + 검색 엔진&amp;rdquo;&lt;/b&gt; 에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 Weaviate인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VectorDB는 많다.&lt;br /&gt;Qdrant, Milvus, Pinecone 등 선택지는 충분하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일전에 &lt;a href=&quot;https://peterica.tistory.com/1013&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI] RAG구성을 위한 FAISS란?&lt;/a&gt;에서 FAISS를 정리하기도 하였다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://peterica.tistory.com/990&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI]&amp;nbsp;IntentFlow&amp;nbsp;프로젝트&amp;nbsp;회고&amp;nbsp;및&amp;nbsp;소개&lt;/a&gt;에서 실제로 사용해 보기도 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Weaviate의 특징은 다음이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스키마 기반 데이터 모델&lt;/li&gt;
&lt;li&gt;GraphQL 중심 쿼리&lt;/li&gt;
&lt;li&gt;자동 벡터화 모듈&lt;/li&gt;
&lt;li&gt;하이브리드 검색을 네이티브로 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 RAG 관점에서는&lt;br /&gt;&amp;nbsp; BM25 + Vector를 자연스럽게 섞을 수 있다는 점이 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 키워드 검색과 의미 검색을&lt;br /&gt;&amp;nbsp; &amp;ldquo;둘 중 하나&amp;rdquo;가 아니라&lt;br /&gt;&amp;nbsp; &amp;ldquo;같이&amp;rdquo; 가져갈 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 기본 구조 이해하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Weaviate&lt;/b&gt;는 &lt;b&gt;관계형 DB처럼 Class 기반 스키마&lt;/b&gt;를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개념을 간단히 정리하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Class: 테이블&lt;/li&gt;
&lt;li&gt;Property: 컬럼&lt;/li&gt;
&lt;li&gt;Object: 로우&lt;/li&gt;
&lt;li&gt;Vectorizer: 자동 임베딩 모듈&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG용 문서 저장 시 보통 이런 구조를 쓴다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;content (텍스트)&lt;/li&gt;
&lt;li&gt;source (파일명)&lt;/li&gt;
&lt;li&gt;chunk_id (청크 번호)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Chunk 단위 객체를 저장하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 로컬 실행 (Docker)&lt;/h4&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;version: '3.4'

services:
  weaviate:
    image: semitechnologies/weaviate:1.24.1
    ports:
      - &quot;8080:8080&quot;
    environment:
      QUERY_DEFAULTS_LIMIT: 25
      AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
      PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
      DEFAULT_VECTORIZER_MODULE: 'text2vec-openai'
      ENABLE_MODULES: 'text2vec-openai,generative-openai'
      OPENAI_APIKEY: ${OPENAI_API_KEY}
      CLUSTER_HOSTNAME: 'node1'
    volumes:
      - weaviate_data:/var/lib/weaviate

volumes:
  weaviate_data:&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행:&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인:&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;curl http://localhost:8080/v1/meta&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Python 클라이언트 연결&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import weaviate

client = weaviate.Client(&quot;http://localhost:8080&quot;)
print(client.is_ready())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 스키마 정의&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG용 Document 클래스 예시는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;class_obj = {
    &quot;class&quot;: &quot;Document&quot;,
    &quot;vectorizer&quot;: &quot;text2vec-openai&quot;,
    &quot;properties&quot;: [
        {
            &quot;name&quot;: &quot;content&quot;,
            &quot;dataType&quot;: [&quot;text&quot;]
        },
        {
            &quot;name&quot;: &quot;source&quot;,
            &quot;dataType&quot;: [&quot;string&quot;]
        },
        {
            &quot;name&quot;: &quot;chunk_id&quot;,
            &quot;dataType&quot;: [&quot;int&quot;]
        }
    ]
}

client.schema.create_class(class_obj)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 핵심은:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;content 필드는 자동으로 임베딩된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;애플리케이션에서 직접 embedding을 만들지 않아도 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 데이터 삽입&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 삽입도 가능하지만, 실무에서는 반드시 batch를 쓴다.&lt;/p&gt;
&lt;pre class=&quot;ceylon&quot;&gt;&lt;code&gt;with client.batch as batch:
    batch.batch_size = 100
    for doc in documents:
        batch.add_data_object(
            data_object={
                &quot;content&quot;: doc[&quot;content&quot;],
                &quot;source&quot;: doc[&quot;source&quot;],
                &quot;chunk_id&quot;: doc[&quot;chunk_id&quot;]
            },
            class_name=&quot;Document&quot;
        )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계에서 Weaviate는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;텍스트 벡터화&lt;/li&gt;
&lt;li&gt;HNSW 인덱싱&lt;/li&gt;
&lt;li&gt;객체 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 자동으로 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 벡터 검색&lt;/h4&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;result = (
    client.query
    .get(&quot;Document&quot;, [&quot;content&quot;, &quot;source&quot;])
    .with_near_text({&quot;concepts&quot;: [&quot;RAG system architecture&quot;]})
    .with_limit(5)
    .do()
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문을 넣으면:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;쿼리를 벡터화&lt;/li&gt;
&lt;li&gt;HNSW로 근접 벡터 탐색&lt;/li&gt;
&lt;li&gt;Top-K 반환&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전형적인 Dense Retrieval 흐름이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 하이브리드 검색 (BM25 + Vector)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Weaviate의 핵심 기능.&lt;/p&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;result = (
    client.query
    .get(&quot;Document&quot;, [&quot;content&quot;, &quot;source&quot;])
    .with_hybrid(
        query=&quot;RAG pipeline&quot;,
        alpha=0.5
    )
    .with_limit(5)
    .do()
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alpha 의미:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0.0 &amp;rarr; BM25 only&lt;/li&gt;
&lt;li&gt;1.0 &amp;rarr; Vector only&lt;/li&gt;
&lt;li&gt;0.5 &amp;rarr; 균형&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 보통 0.4~0.6 사이에서 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식의 장점은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;키워드 정확도 유지&lt;/li&gt;
&lt;li&gt;의미 검색 보완&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;&amp;nbsp; &lt;b&gt;Sparse + Dense&lt;/b&gt;를 자연스럽게 결합한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 메타데이터 필터링&lt;/h4&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;.with_where({
    &quot;path&quot;: [&quot;source&quot;],
    &quot;operator&quot;: &quot;Equal&quot;,
    &quot;valueString&quot;: &quot;rag_guide.md&quot;
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG에서는 보통:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;source&lt;/li&gt;
&lt;li&gt;doc_type&lt;/li&gt;
&lt;li&gt;tenant&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 필드를 함께 필터링한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Retriever는 항상 &lt;b&gt;&amp;ldquo;의미 + 조건&amp;rdquo;&lt;/b&gt;을 동시에 고려해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 운영 관점 팁&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 중요한 포인트만 정리하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반드시 batch insert 사용&lt;/li&gt;
&lt;li&gt;HNSW ef 값 튜닝&lt;/li&gt;
&lt;li&gt;자주 쓰는 필드는 필터 인덱싱&lt;/li&gt;
&lt;li&gt;alpha는 온라인 실험으로 결정&lt;/li&gt;
&lt;li&gt;벡터는 파생 데이터로 취급 (원본 문서가 SSOT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VectorDB는 검색 엔진이 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;의미 공간 인덱스다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ RAG 파이프라인에서 Weaviate의 위치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 흐름은 항상 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Document&lt;br /&gt;&amp;nbsp; &amp;rarr; Chunk&lt;br /&gt;&amp;nbsp; &amp;rarr; Weaviate 저장&lt;br /&gt;&amp;nbsp; &amp;rarr; Hybrid Retrieval&lt;br /&gt;&amp;nbsp; &amp;rarr; Rerank&lt;br /&gt;&amp;nbsp; &amp;rarr; LLM&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Weaviate&lt;/b&gt;는 이 중 &lt;b&gt;&amp;ldquo;의미 좌표계 + 후보 생성&amp;rdquo; &lt;/b&gt;을 담당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 품질은 &lt;b&gt;Reranker&lt;/b&gt;와 &lt;b&gt;Prompt&lt;/b&gt;에서 결정되지만,&lt;br /&gt;&amp;nbsp; &lt;b&gt;Retriever&lt;/b&gt; 품질이 바닥이면 그 위는 아무 의미가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Weaviate&lt;/b&gt;를 써보면서 느낀 점은 이것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; VectorDB는 데이터베이스가 아니라 &lt;b&gt;의미 인프라&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; RAG 품질은 모델보다,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Embedding보다,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Chunking보다,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Retriever 설계에서 가장 크게 갈린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;b&gt;Weaviate&lt;/b&gt;는&lt;br /&gt;&amp;nbsp; 그 &lt;b&gt;Retriever&lt;/b&gt;를 꽤 높은 수준으로 구성할 수 있게 해준다.&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>PETERICA</category>
      <category>Rag</category>
      <category>vectordb</category>
      <category>weaviate</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1031</guid>
      <comments>https://peterica.tistory.com/1031#entry1031comment</comments>
      <pubDate>Sun, 8 Feb 2026 16:03:23 +0900</pubDate>
    </item>
    <item>
      <title>[AI] HNSW - ANN부터 파라미터 튜닝까지, RAG 검색 성능의 진짜 핵심</title>
      <link>https://peterica.tistory.com/1030</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSNb%2FbtsDwEYjHwl%2FgfNRKiPAkerKOYJ40TLVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;1026&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1017&quot;&gt;[AI]&amp;nbsp;LLM&amp;nbsp;학습&amp;nbsp;노트&amp;nbsp;공개&amp;nbsp;-&amp;nbsp;Transformer부터&amp;nbsp;RAG까지,&amp;nbsp;그리고&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;AI&amp;nbsp;시스템을&amp;nbsp;향해&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ANN&lt;/b&gt;과 &lt;b&gt;HNSW&lt;/b&gt;는 &lt;b&gt;VectorDB&lt;/b&gt;를 활용한 RAG 구현의 &amp;ldquo;심장&amp;rdquo;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Embedding은 의미를 벡터로 바꿔주고,&lt;br /&gt;&amp;nbsp; Vector Similarity는 거리를 계산해 주지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수백만 개 벡터 중에서 &lt;b&gt;실제로 무엇을 얼마나 빨리 찾을 수 있느냐&lt;/b&gt;는&lt;br /&gt;결국 &lt;b&gt;ANN 인덱스&lt;/b&gt;가 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 중심에 있는 알고리즘이 바로 &lt;b&gt;HNSW&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 다음 흐름으로 정리해 보려 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ANN이 무엇인지&lt;/li&gt;
&lt;li&gt;왜 Brute-force 검색이 불가능한지&lt;/li&gt;
&lt;li&gt;HNSW가 어떻게 문제를 해결하는지&lt;/li&gt;
&lt;li&gt;그리고 실무에서 중요한 파라미터(M, ef)를 어떻게 바라봐야 하는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ ANN이란 무엇인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ANN은 Approximate Nearest Neighbor의 약자다.&lt;br /&gt;직역하면 &amp;ldquo;근사 최근접 이웃 탐색&amp;rdquo;.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완벽한 정답 대신, 충분히 가까운 결과를 매우 빠르게 찾는 방식&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터 검색에서 정확한 최근접 이웃(Exact NN)을 찾으려면 모든 벡터와 거리를 계산해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벡터가 N개라면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간 복잡도: O(N)&lt;/li&gt;
&lt;li&gt;100만 개 &amp;rarr; 가능&lt;/li&gt;
&lt;li&gt;1억 개 &amp;rarr; 거의 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG에서는 이런 규모가 기본이다. 그래서 우리는 선택을 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 100% 정확한 검색을 포기하고,&lt;br /&gt;&amp;nbsp; 95~98% 정도의 Recall을 얻는 대신&lt;br /&gt;&amp;nbsp; 수천 배 빠른 검색을 택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이게 ANN의 철학이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 왜 HNSW가 필요할까&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VectorDB는 단순 저장소가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미 공간 탐색기다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문 벡터가 들어오면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 가까운 의미 좌표들을 찾고&lt;/li&gt;
&lt;li&gt;그 결과를 LLM에 넘긴다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 &lt;b&gt;&amp;ldquo;어떻게 빠르게 찾느냐&amp;rdquo;&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 방식은 세 가지다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Flat (Brute-force)&lt;/li&gt;
&lt;li&gt;IVF&lt;/li&gt;
&lt;li&gt;HNSW&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flat은 정확하지만 느리고,&lt;br /&gt;IVF는 빠르지만 품질 손실이 있고,&lt;br /&gt;&lt;b&gt;HNSW는 속도와 Recall의 균형이 가장 좋다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 대부분의 VectorDB가 기본 인덱스로 HNSW를 채택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ HNSW 한 줄 요약&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HNSW(Hierarchical Navigable Small World)는&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;계층적 그래프 구조를 이용해&lt;br /&gt;&amp;nbsp; &amp;nbsp;고차원 벡터 공간을 빠르게 탐색하는 ANN 알고리즘이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 아이디어는 이것이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에서는 대충 찾고&lt;/li&gt;
&lt;li&gt;아래에서 정밀하게 찾는다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지도 앱과 매우 비슷하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고속도로 &amp;rarr; 일반도로 &amp;rarr; 골목길&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ HNSW의 구조 &amp;mdash; 왜 &amp;ldquo;계층적 그래프&amp;rdquo;인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HNSW는 여러 레벨의 그래프로 구성된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상위 레벨: 노드 수 적음, 연결 길음 (대략 탐색)&lt;/li&gt;
&lt;li&gt;하위 레벨: 모든 노드 존재, 촘촘한 연결 (정밀 탐색)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 흐름은 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;최상위 레벨에서 시작&lt;/li&gt;
&lt;li&gt;greedy하게 더 가까운 노드로 이동&lt;/li&gt;
&lt;li&gt;더 이상 개선이 없으면 한 레벨 내려감&lt;/li&gt;
&lt;li&gt;최하위 레벨에서 후보를 충분히 탐색&lt;/li&gt;
&lt;li&gt;상위 K개 반환&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조 덕분에 탐색 깊이는 O(log N) 수준으로 줄어든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ HNSW의 핵심 파라미터 3가지&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HNSW 튜닝의 본질은 딱 세 개다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;M&lt;br /&gt;ef_construction&lt;br /&gt;ef_search&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 값이 Recall / Latency / Memory를 모두 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ M &amp;mdash; 그래프의 밀도&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M은 각 노드가 가질 수 있는 최대 이웃 수다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작으면: 메모리 적음, Recall 낮음&lt;/li&gt;
&lt;li&gt;크면: 메모리 큼, Recall 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직관적으로:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;M은 &amp;ldquo;길의 개수&amp;rdquo;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;길이 많을수록 목적지에 도달할 확률은 높아지지만,&lt;br /&gt;&amp;nbsp; &amp;nbsp;지도는 무거워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무 기준:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RAG 기본: 16~32&lt;/li&gt;
&lt;li&gt;프로덕션 권장: 24&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ ef_construction &amp;mdash; 인덱스 품질&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 만들 때&lt;br /&gt;&amp;nbsp; &amp;nbsp;각 벡터가 연결될 후보를 얼마나 넓게 볼지 정하는 값이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;낮으면: 빌드 빠름, 그래프 품질 낮음&lt;/li&gt;
&lt;li&gt;높으면: 빌드 느림, 그래프 품질 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 포인트:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;ef_construction은 인덱스 생성 시에만 사용된다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;즉, 한 번 제대로 만들어 두는 게 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권장 범위:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;128 ~ 200&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ ef_search &amp;mdash; 검색 품질 (런타임 조절 가능)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 시 탐색할 후보 개수다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값이 클수록:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Recall 상승&lt;/li&gt;
&lt;li&gt;Latency 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작을수록:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빠르지만 부정확&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 장점:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;ef_search는 쿼리마다 바꿀 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반 질문: ef_search=100&lt;/li&gt;
&lt;li&gt;고품질 질문: ef_search=200&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 식의 동적 튜닝이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RAG 권장 시작점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ef_search = 100&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 실무에서 추천하는 기본 세트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RAG 기준 최소 출발점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;M = 24&lt;/li&gt;
&lt;li&gt;ef_construction = 200&lt;/li&gt;
&lt;li&gt;ef_search = 100&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 시작해서:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Recall 측정&lt;/li&gt;
&lt;li&gt;느리면 ef_search 감소&lt;/li&gt;
&lt;li&gt;품질 부족하면 ef_search 증가&lt;/li&gt;
&lt;li&gt;그래도 부족하면 M 증가 (재인덱싱 필요)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 순서가 가장 현실적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 중요한 정리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HNSW는 &amp;ldquo;알고리즘&amp;rdquo;이 아니라&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;&amp;ldquo;트레이드오프 컨트롤러&amp;rdquo;&lt;/b&gt;에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 세 가지를 교환한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Recall&lt;/li&gt;
&lt;li&gt;Latency&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완벽한 값은 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 요구사항에 맞는 균형점을 찾는 게 전부다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ RAG 관점에서 다시 보기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 파이프라인은 이렇게 이어진다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Transformer&lt;br /&gt;&amp;rarr; Embedding&lt;br /&gt;&amp;rarr; Chunking&lt;br /&gt;&amp;rarr; Vector Similarity&lt;br /&gt;&amp;rarr; ANN(HNSW)&lt;br /&gt;&amp;rarr; Retriever&lt;br /&gt;&amp;rarr; Reranker&lt;br /&gt;&amp;rarr; LLM&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 HNSW는 Retriever의 실제 성능을 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무리 좋은 임베딩을 써도, HNSW가 엉성하면 결과는 바로 무너진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 ANN이 그냥 &amp;ldquo;빠른 검색 기술&amp;rdquo;이라고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 이렇게 느낀다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HNSW는 RAG의 검색 품질을 설계하는 도구다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 모델보다,&lt;br /&gt;&amp;nbsp; 프롬프트보다,&lt;br /&gt;&amp;nbsp; 심지어 임베딩보다 먼저 봐야 할 것이&lt;br /&gt;&amp;nbsp; ANN과 HNSW 파라미터다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG는 모델 문제가 아니라 시스템 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 HNSW는 그 시스템의 중심에 있다.&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>Ann</category>
      <category>HNSW</category>
      <category>PETERICA</category>
      <category>Rag</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1030</guid>
      <comments>https://peterica.tistory.com/1030#entry1030comment</comments>
      <pubDate>Sun, 8 Feb 2026 15:01:20 +0900</pubDate>
    </item>
    <item>
      <title>[AI] Vector Similarity &amp;mdash; RAG에서 &amp;ldquo;가장 중요한 수학&amp;rdquo;</title>
      <link>https://peterica.tistory.com/1029</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSNb%2FbtsDwEYjHwl%2FgfNRKiPAkerKOYJ40TLVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;1026&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1017&quot;&gt;[AI]&amp;nbsp;LLM&amp;nbsp;학습&amp;nbsp;노트&amp;nbsp;공개&amp;nbsp;-&amp;nbsp;Transformer부터&amp;nbsp;RAG까지,&amp;nbsp;그리고&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;AI&amp;nbsp;시스템을&amp;nbsp;향해&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding 글에서 이야기했던 핵심은 이것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer가 만든 의미를 벡터로 &amp;ldquo;저장&amp;rdquo;했다면,&lt;br /&gt;이제 남은 문제는 하나다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 벡터들을 어떻게 비교할 것인가.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 RAG 튜토리얼은&amp;nbsp;&lt;b&gt;&amp;ldquo;임베딩하고 VectorDB에 넣으면 된다&amp;rdquo;&lt;/b&gt;에서 끝난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로 시스템을 만들어 보면 곧 느끼게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 모델보다,&lt;br /&gt;&amp;nbsp; 임베딩보다,&lt;br /&gt;&amp;nbsp; 심지어 Chunking보다도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; Similarity Metric이 검색 품질을 크게 좌우한다는 사실을.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vector Similarity는 단순한 계산 공식이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG에서 Vector Similarity는 곧,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;의미를 어떻게 해석할 것인가에 대한 설계다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Vector Similarity란 무엇인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vector Similarity는 두 벡터가 얼마나 &amp;ldquo;가까운지&amp;rdquo;를 계산하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 더 정확히 말하면,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 문장이 의미 공간에서 얼마나 비슷한 위치에 있는지를 측정하는 방법이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은 이것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베딩 벡터 자체보다 더 중요한 것은&lt;br /&gt;&lt;b&gt;그 벡터를 비교하는 방식&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 임베딩을 써도,&lt;br /&gt;Similarity Metric이 달라지면 검색 결과가 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Vector Similarity는 검색 알고리즘이 아니라&lt;br /&gt;&lt;b&gt;의미 해석 방식&lt;/b&gt;에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 대표적인 세 가지 유사도 메트릭&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 가장 많이 쓰이는 메트릭은 세 가지다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Cosine Similarity&lt;/li&gt;
&lt;li&gt;Dot Product&lt;/li&gt;
&lt;li&gt;L2 Distance&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수식보다 직관이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Cosine Similarity &amp;mdash; 방향만 본다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cosine Similarity는 두 벡터의 &lt;b&gt;각도&lt;/b&gt;를 비교한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기는 무시하고,&lt;br /&gt;방향만 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 문장이 같은 &amp;ldquo;의미 방향&amp;rdquo;을 가리키고 있는지를 판단한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 문서 길이나 정보량의 영향을 덜 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 RAG에 가장 널리 쓰이는 이유도 여기에 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서가 길어도&lt;/li&gt;
&lt;li&gt;Chunk 크기가 조금 달라도&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미 패턴만 비슷하면 가까운 것으로 판단된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 텍스트 임베딩 모델이 Cosine 기준으로 사용되는 것도 같은 이유다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Dot Product &amp;mdash; 방향 + 크기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dot Product는 방향뿐 아니라 &lt;b&gt;벡터 크기&lt;/b&gt;까지 함께 반영한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직관적으로 보면,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미가 비슷하면서, 정보량이 많은 쪽이 더 크게 평가된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추천 시스템이나 랭킹 모델에서 자주 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 텍스트 RAG에서는 주의가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chunk가 길어질수록 값이 커질 수 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규화를 하지 않으면&lt;br /&gt;&amp;nbsp; &amp;ldquo;길이가 긴 문서가 유리해지는&amp;rdquo; 현상이 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ L2 Distance &amp;mdash; 실제 공간 거리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L2 Distance는 두 벡터 사이의 실제 유클리드 거리를 잰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌표 간의 절대 거리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클러스터링이나 이상 탐지에는 직관적이지만,&lt;br /&gt;고차원 텍스트 임베딩에서는 안정성이 떨어질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 일반적인 문서 RAG에서는 Cosine보다 덜 쓰인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 중요한 사실 &amp;mdash; 정답은 없다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vector Similarity에서 가장 중요한 사실은 이것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 메트릭이 &amp;ldquo;더 좋다&amp;rdquo;는 정답은 없다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신, 항상 다음을 함께 고려해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;임베딩 모델이 어떤 방식으로 학습됐는지&lt;/li&gt;
&lt;li&gt;벡터가 정규화되어 있는지&lt;/li&gt;
&lt;li&gt;Chunk 크기&lt;/li&gt;
&lt;li&gt;문서 길이&lt;/li&gt;
&lt;li&gt;언어 특성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L2 정규화를 한 벡터에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Cosine Similarity = Dot Product&lt;/li&gt;
&lt;li&gt;L2 Distance도 Cosine과 수학적으로 연결된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 조건에 따라 세 메트릭은 사실상 같은 의미가 되기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Similarity 선택은 공식 문제가 아니라&lt;br /&gt;&lt;b&gt;시스템 조건에 맞춘 설계 문제&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 실무에서 느낀 가장 큰 차이&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 RAG 파이프라인을 만들면서 가장 크게 느낀 점은 이것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding 모델을 바꿔도 품질 변화는 크지 않았다.&lt;br /&gt;Chunking을 바꾸면 체감이 됐다.&lt;br /&gt;Similarity를 바꾸면 결과가 즉각 달라졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 요즘은 이렇게 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 성능보다 Embedding,&lt;br /&gt;Embedding보다 Chunking,&lt;br /&gt;Chunking보다 &lt;b&gt;Similarity 설계가 더 중요하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vector Similarity는 Retriever의 심장이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retriever 품질이 곧 RAG 품질이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ㅁ VectorDB는 검색 엔진이 아니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding 글에서도 이야기했지만,&lt;br /&gt;다시 정리하면 이렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VectorDB는 검색 엔진이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;의미 공간 탐색기&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흐름은 항상 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문 &amp;rarr; 벡터화&lt;br /&gt;&amp;rarr; 거리 계산&lt;br /&gt;&amp;rarr; 가장 가까운 의미 좌표 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL처럼 조건을 필터링하는 게 아니라,&lt;br /&gt;지도에서 가장 가까운 지점을 찾는 구조다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Similarity Metric은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;정렬 옵션&amp;rdquo;이 아니라&lt;br /&gt;&lt;b&gt;지도 좌표계를 어떻게 정의하느냐의 문제&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Similarity는 RAG 전체 파이프라인의 일부다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vector Similarity는 단독으로 존재하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 이 흐름 안에 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Transformer &amp;rarr; Embedding &amp;rarr; Chunking&lt;br /&gt;&amp;nbsp; &amp;rarr; Vector Similarity &amp;rarr; Retriever&lt;br /&gt;&amp;nbsp; &amp;rarr; Reranker &amp;rarr; LLM&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Similarity는 Retriever의 중심이고, Retriever는 RAG 품질의 핵심이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Similarity를 이해하지 못하면 RAG를 이해했다고 보기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Similarity는 수학이 아니라 설계다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vector Similarity는 공식 암기 문제가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 의미를 어떻게 나누고,&lt;br /&gt;&amp;nbsp; &amp;nbsp; 어떻게 비교하고,&lt;br /&gt;&amp;nbsp; &amp;nbsp; 어떻게 연결할 것인가에 대한 설계 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 RAG는 모델에서 나오지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미를 다루는 방식에서 나온다.&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1029</guid>
      <comments>https://peterica.tistory.com/1029#entry1029comment</comments>
      <pubDate>Sun, 8 Feb 2026 01:00:23 +0900</pubDate>
    </item>
    <item>
      <title>[AI] Chunking Strategy - 청크 전략과 크기 최적화, RAG 품질의 출발점</title>
      <link>https://peterica.tistory.com/1027</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSNb%2FbtsDwEYjHwl%2FgfNRKiPAkerKOYJ40TLVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;1026&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1017&quot;&gt;[AI]&amp;nbsp;LLM&amp;nbsp;학습&amp;nbsp;노트&amp;nbsp;공개&amp;nbsp;-&amp;nbsp;Transformer부터&amp;nbsp;RAG까지,&amp;nbsp;그리고&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;AI&amp;nbsp;시스템을&amp;nbsp;향해&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding 글을 정리하면서 자연스럽게 다음 질문에 도달했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;&amp;ldquo;그래서, 우리는 무엇을 벡터로 저장하는가?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding은 의미를 벡터로 만든다.&lt;br /&gt;&amp;nbsp; 하지만 &lt;b&gt;Chunking&lt;/b&gt;은 그 이전 단계다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Chunking은 단순히 텍스트를 자르는 기술이 아니라,&lt;br /&gt;&amp;nbsp; LLM이 이해할 수 있는 &lt;b&gt;의미 단위를 설계하는 작업&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 품질을 이야기할 때 Retriever나 모델 성능을 먼저 떠올리기 쉽지만,&lt;br /&gt;&amp;nbsp; 실제로는 Chunking 단계에서 이미 상당 부분이 결정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Chunking이 RAG 품질을 좌우하는 이유&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VectorDB는 문서를 검색하지 않는다.&lt;br /&gt;&lt;b&gt;Chunk 단위의 의미 벡터&lt;/b&gt;를 검색한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Chunk는 검색의 최소 단위이고&lt;/li&gt;
&lt;li&gt;Chunk는 LLM이 다시 읽게 될 지식 조각이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG 파이프라인을 단순화하면 이렇게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Chunk &amp;rarr; Embedding &amp;rarr; Vector Similarity &amp;rarr; Retriever &amp;rarr; Prompt Context &amp;rarr; LLM&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름의 출발점이 바로 Chunking이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 나는 이렇게 정리하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; RAG 품질은 &lt;b&gt;Retriever&lt;/b&gt;가 아니라, &lt;b&gt;Chunking&lt;/b&gt;에서 이미 방향이 정해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Chunk Size Trade-off - 크기 최적화의 본질&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chunk 크기를 정할 때 항상 마주치는 딜레마다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Chunk가 너무 크면:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 벡터 안에 여러 의미가 섞이고&lt;/li&gt;
&lt;li&gt;cosine similarity가 희석되며&lt;/li&gt;
&lt;li&gt;검색 정확도가 떨어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Chunk가 너무 작으면&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 키워드는 잘 잡히지만&lt;/li&gt;
&lt;li&gt;문맥이 끊기고&lt;/li&gt;
&lt;li&gt;LLM이 전체 흐름을 복원하기 어려워진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 Chunk size는 단순한 성능 옵션이 아니라,&lt;br /&gt;&lt;b&gt;&amp;nbsp; 의미 해상도를 조절하는 문제&lt;/b&gt;에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 사람이 글을 읽을 때도 문장 하나씩이 아니라&lt;br /&gt;&amp;nbsp; 문단 단위로 이해하듯,&lt;br /&gt;&amp;nbsp; LLM에게도 적절한 의미 덩어리가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 대표적인 Chunking 전략&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 자주 사용하는 방식은 크게 세 가지다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Fixed-size Chunking&lt;/b&gt;&lt;br /&gt;N 토큰 단위로 기계적으로 자르는 방식이다.&lt;br /&gt;가장 단순하지만 의미 경계를 무시하기 때문에 가장 위험하다.&lt;br /&gt;PoC 단계에서는 빠르지만, 프로덕션에서는 한계가 명확하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Overlap Chunking&lt;/b&gt;&lt;br /&gt;이전 Chunk 일부를 다음 Chunk에 포함시켜 문맥 손실을 완화한다.&lt;br /&gt;다만 중복 Embedding 비용이 발생한다.&lt;br /&gt;Overlap은 보험이지 해결책은 아니다.&lt;/li&gt;
&lt;li&gt;구조&amp;nbsp;기반&amp;nbsp;Chunking&amp;nbsp;(문단&amp;nbsp;/&amp;nbsp;섹션)&lt;br /&gt;사람이&amp;nbsp;읽는&amp;nbsp;구조&amp;nbsp;그대로&amp;nbsp;나누는&amp;nbsp;방식이다.&lt;br /&gt;대부분의 문서에서 가장 자연스럽고 안정적이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은 이것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최적의 Chunking은 항상 콘텐츠 구조에 의존한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술 문서, 블로그 글, API 스펙, Q&amp;amp;A 데이터는&lt;br /&gt;각각 다른 Chunk 전략이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Chunking과 Embedding은 하나의 문제다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding 모델이 아무리 좋아도 Chunk가 엉망이면 RAG는 실패한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chunking과 Embedding은 항상 함께 설계해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Chunk는 의미 단위를 정의하고&lt;/li&gt;
&lt;li&gt;Embedding은 그 의미를 벡터로 고정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Chunking은 RAG 파이프라인의 첫 설계 포인트다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 모델 튜닝 전에,&lt;br /&gt;&amp;nbsp; VectorDB 전에,&lt;br /&gt;반드시 먼저 고민해야 할 영역이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 실무 기준 Chunk 설계 시작점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완벽한 정답은 없다. 항상 실측이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 경험적으로 다음 정도에서 시작하는 경우가 많다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기술 문서: 300~500 tokens + overlap 50~100&lt;/li&gt;
&lt;li&gt;블로그 / 에세이: 문단 기반&lt;/li&gt;
&lt;li&gt;API 문서: 섹션 단위&lt;/li&gt;
&lt;li&gt;Q&amp;amp;A 데이터: 질문과 답변을 하나의 Chunk로 묶기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 반드시 확인해야 할 것은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 검색 결과가 의미적으로 맞는지&lt;/li&gt;
&lt;li&gt;LLM이 Chunk를 읽고 충분한 컨텍스트를 복원하는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chunking은 설정이 아니라 실험이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Chunking은 지식 모델링이다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점점 느끼게 된 건 이것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Chunking은 텍스트 분할이 아니라,&lt;br /&gt;&amp;nbsp; 지식을 어떻게 나눌지 결정하는 작업이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람도 책을 읽을 때:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목차&lt;/li&gt;
&lt;li&gt;문단&lt;/li&gt;
&lt;li&gt;문맥&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단위로 사고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG도 결국 같은 구조를 요구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chunking은&lt;br /&gt;&lt;b&gt;&amp;ldquo;이 시스템이 지식을 어떤 형태로 기억할 것인가&amp;rdquo;&lt;/b&gt;에 대한 설계다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding에서 배운 것은:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 의미는 벡터라는 사실이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chunking에서 깨닫는 것은:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 벡터 이전에 의미 단위가 존재한다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer가 실시간 사고라면,&lt;br /&gt;Embedding은 기억이고,&lt;br /&gt;Chunking은 그 기억의 구조다.&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>Chunking Strategy</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1027</guid>
      <comments>https://peterica.tistory.com/1027#entry1027comment</comments>
      <pubDate>Fri, 6 Feb 2026 22:00:11 +0900</pubDate>
    </item>
    <item>
      <title>[AI] 온톨로지에서 Agentic GraphRAG까지 - &amp;ldquo;관계 기반 AI&amp;rdquo;가 필요한 이유</title>
      <link>https://peterica.tistory.com/1028</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSNb/btsDwEYjHwl/gfNRKiPAkerKOYJ40TLVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSNb%2FbtsDwEYjHwl%2FgfNRKiPAkerKOYJ40TLVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;1026&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1017&quot;&gt;[AI]&amp;nbsp;LLM&amp;nbsp;학습&amp;nbsp;노트&amp;nbsp;공개&amp;nbsp;-&amp;nbsp;Transformer부터&amp;nbsp;RAG까지,&amp;nbsp;그리고&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;AI&amp;nbsp;시스템을&amp;nbsp;향해&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-end=&quot;241&quot; data-start=&quot;178&quot; data-ke-size=&quot;size16&quot;&gt;요즘 RAG는 거의 기본 옵션이 되었다. 문서를 임베딩하고, 벡터 검색으로 관련 내용을 찾아 LLM에 넘긴다.&lt;/p&gt;
&lt;p data-end=&quot;252&quot; data-start=&quot;243&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그런데 이상하다.&lt;/p&gt;
&lt;p data-end=&quot;327&quot; data-start=&quot;254&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 검색은 되는데, 답은 종종 부정확하다.&lt;br /&gt;&amp;nbsp; 문장은 가져오지만, 맥락은 놓친다.&lt;br /&gt;&amp;nbsp; 관련 문서는 찾는데, &amp;ldquo;왜&amp;rdquo;라는 질문에는 약하다.&lt;/p&gt;
&lt;p data-end=&quot;352&quot; data-start=&quot;329&quot; data-ke-size=&quot;size16&quot;&gt;이번 세미나는 이 문제를 정면으로 다뤘다.&lt;/p&gt;
&lt;p data-end=&quot;367&quot; data-start=&quot;354&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;367&quot; data-start=&quot;354&quot; data-ke-size=&quot;size16&quot;&gt;핵심 메시지는 단순했다.&lt;/p&gt;
&lt;blockquote data-end=&quot;431&quot; data-start=&quot;369&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;p data-end=&quot;431&quot; data-start=&quot;371&quot; data-ke-size=&quot;size16&quot;&gt;텍스트 중심 RAG의 한계를 넘기려면,&lt;br /&gt;의미를 문장이 아니라 &amp;lsquo;개념과 관계&amp;rsquo;로 설계해야 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;452&quot; data-start=&quot;433&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;452&quot; data-start=&quot;433&quot; data-ke-size=&quot;size16&quot;&gt;그리고 그 흐름은 이렇게 정리된다.&lt;/p&gt;
&lt;blockquote data-end=&quot;510&quot; data-start=&quot;454&quot; data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Ontology &amp;rarr; Knowledge Graph &amp;rarr; GraphRAG &amp;rarr; Agentic GraphRAG&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-end=&quot;547&quot; data-start=&quot;512&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;547&quot; data-start=&quot;512&quot; data-ke-size=&quot;size16&quot;&gt;이 글은 그 전체 파이프라인을 시스템 관점에서 정리한 기록이다.&lt;/p&gt;
&lt;p data-end=&quot;547&quot; data-start=&quot;512&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;573&quot; data-start=&quot;554&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 한 장으로 보는 전체 구조&lt;/h4&gt;
&lt;p data-end=&quot;601&quot; data-start=&quot;575&quot; data-ke-size=&quot;size16&quot;&gt;강의에서 반복적으로 강조된 흐름은 다음과 같다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Ontology (설계도) &amp;rarr; Knowledge Graph (실제 데이터) &amp;rarr; GraphRAG (관계 기반 검색) &amp;rarr; Agentic GraphRAG (질문별 전략 선택)&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;861&quot; data-start=&quot;710&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;733&quot; data-start=&quot;710&quot;&gt;&lt;b&gt;온톨로지&lt;/b&gt;는 의미의 설계도다.&lt;/li&gt;
&lt;li data-end=&quot;774&quot; data-start=&quot;734&quot;&gt;&lt;b&gt;지식 그래프&lt;/b&gt;는 그 설계도 위에 실제 데이터를 얹은 구조다.&lt;/li&gt;
&lt;li data-end=&quot;808&quot; data-start=&quot;775&quot;&gt;&lt;b&gt;GraphRAG&lt;/b&gt;는 관계를 따라 정보를 찾는다.&lt;/li&gt;
&lt;li data-end=&quot;861&quot; data-start=&quot;809&quot;&gt;&lt;b&gt;Agentic GraphRAG&lt;/b&gt;는 질문을 보고 어떻게 찾을지까지 스스로 결정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;928&quot; data-start=&quot;863&quot; data-ke-size=&quot;size16&quot;&gt;중요한 건, 이 네 단계가 서로 독립된 기술이 아니라는 점이다.&lt;br /&gt;앞 단계가 부실하면, 뒤 단계는 성립하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;976&quot; data-start=&quot;935&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ Ontology &amp;mdash; 사람이 아는 것을, 시스템이 알게 만드는 방법&lt;/h4&gt;
&lt;p data-end=&quot;1000&quot; data-start=&quot;978&quot; data-ke-size=&quot;size16&quot;&gt;온톨로지는 단순한 데이터 모델이 아니다.&lt;/p&gt;
&lt;p data-end=&quot;1066&quot; data-start=&quot;1002&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 사람들 사이에서 이미 합의된 개념과 규칙을&lt;/p&gt;
&lt;p data-end=&quot;1066&quot; data-start=&quot;1002&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 컴퓨터가 이해할 수 있도록 명시적으로 구조화한 &lt;b&gt;의미 모델&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1082&quot; data-start=&quot;1068&quot; data-ke-size=&quot;size16&quot;&gt;예를 들면 이런 것들이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1137&quot; data-start=&quot;1084&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1094&quot; data-start=&quot;1084&quot;&gt;고객이 무엇인지&lt;/li&gt;
&lt;li data-end=&quot;1113&quot; data-start=&quot;1095&quot;&gt;문서가 어떤 단위로 구성되는지&lt;/li&gt;
&lt;li data-end=&quot;1137&quot; data-start=&quot;1114&quot;&gt;어떤 개념이 다른 개념의 선행 조건인지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1178&quot; data-start=&quot;1139&quot; data-ke-size=&quot;size16&quot;&gt;사람에게는 상식이지만,&lt;br /&gt;&amp;nbsp; 시스템에게는 반드시 설계가 필요한 영역이다.&lt;/p&gt;
&lt;p data-end=&quot;1202&quot; data-start=&quot;1180&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 강의에서 인상 깊었던 부분은 이것이었다.&lt;/p&gt;
&lt;p data-end=&quot;1222&quot; data-start=&quot;1204&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1222&quot; data-start=&quot;1204&quot; data-ke-size=&quot;size16&quot;&gt;온톨로지는 단순 스키마가 아니라,&lt;/p&gt;
&lt;blockquote data-end=&quot;1242&quot; data-start=&quot;1224&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;p data-end=&quot;1242&quot; data-start=&quot;1226&quot; data-ke-size=&quot;size16&quot;&gt;추론 가능한 규칙 집합&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1252&quot; data-start=&quot;1244&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;이라는 점이다.&lt;/p&gt;
&lt;p data-end=&quot;1252&quot; data-start=&quot;1244&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1311&quot; data-start=&quot;1254&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;A가 B에 속하고,&lt;br /&gt;&amp;nbsp; &amp;nbsp;B가 C에 속하면,&lt;br /&gt;&amp;nbsp; &amp;nbsp;시스템은 A가 C에 속한다고 &amp;ldquo;추론&amp;rdquo;할 수 있어야 한다.&lt;/p&gt;
&lt;p data-end=&quot;1333&quot; data-start=&quot;1313&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;이게 바로 온톨로지가 필요한 이유다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1376&quot; data-start=&quot;1340&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ Knowledge Graph &amp;mdash; 설계도가 데이터가 될 때&lt;/h4&gt;
&lt;p data-end=&quot;1423&quot; data-start=&quot;1378&quot; data-ke-size=&quot;size16&quot;&gt;온톨로지가 설계도라면,&lt;br /&gt;&amp;nbsp; 지식 그래프는 그 설계도를 실제 데이터로 채운 상태다.&lt;/p&gt;
&lt;p data-end=&quot;1452&quot; data-start=&quot;1425&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1452&quot; data-start=&quot;1425&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Entity, Relation, Property.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1482&quot; data-start=&quot;1454&quot; data-ke-size=&quot;size16&quot;&gt;이 세 가지를 중심으로 도메인을 그래프로 표현한다.&lt;/p&gt;
&lt;p data-end=&quot;1502&quot; data-start=&quot;1484&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1502&quot; data-start=&quot;1484&quot; data-ke-size=&quot;size16&quot;&gt;여기서 중요한 포인트는 이것이다.&lt;/p&gt;
&lt;p data-end=&quot;1594&quot; data-start=&quot;1504&quot; data-ke-size=&quot;size16&quot;&gt;그래프 DB(예: &lt;span&gt;&lt;span&gt;Neo4j&lt;/span&gt;&lt;/span&gt;)를 쓰는 것이 목적이 아니라,&lt;b&gt;&amp;nbsp;도메인을 구조화하는 것이 목적&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1617&quot; data-start=&quot;1596&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1617&quot; data-start=&quot;1596&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그래프는 기술이 아니라 표현 방식이다.&lt;/p&gt;
&lt;p data-end=&quot;1617&quot; data-start=&quot;1596&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;어떤 개체가 있고, 그 사이에 어떤 관계가 있으며, 그 관계가 어떤 의미를 갖는지를 드러내는 방식.&lt;/p&gt;
&lt;p data-end=&quot;1705&quot; data-start=&quot;1680&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 구조가 명확해야, 이후 단계가 가능해진다.&lt;/p&gt;
&lt;p data-end=&quot;1705&quot; data-start=&quot;1680&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1745&quot; data-start=&quot;1712&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ GraphRAG &amp;mdash; Vector 검색이 놓치는 것들&lt;/h4&gt;
&lt;p data-end=&quot;1771&quot; data-start=&quot;1747&quot; data-ke-size=&quot;size16&quot;&gt;기존 Vector RAG는 이렇게 동작한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1822&quot; data-start=&quot;1773&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1789&quot; data-start=&quot;1773&quot;&gt;문서를 청크로 나눈다&lt;/li&gt;
&lt;li data-end=&quot;1800&quot; data-start=&quot;1790&quot;&gt;임베딩한다&lt;/li&gt;
&lt;li data-end=&quot;1822&quot; data-start=&quot;1801&quot;&gt;질문과 가장 가까운 벡터를 찾는다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1851&quot; data-start=&quot;1824&quot; data-ke-size=&quot;size16&quot;&gt;문제는 이 구조가 &lt;b&gt;관계를 모른다는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1901&quot; data-start=&quot;1853&quot; data-ke-size=&quot;size16&quot;&gt;Vector RAG는 &amp;ldquo;비슷한 문장&amp;rdquo;은 찾지만,&lt;br /&gt;&amp;ldquo;연결된 의미&amp;rdquo;는 추론하지 못한다.&lt;/p&gt;
&lt;p data-end=&quot;1917&quot; data-start=&quot;1903&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1917&quot; data-start=&quot;1903&quot; data-ke-size=&quot;size16&quot;&gt;GraphRAG는 다르다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1971&quot; data-start=&quot;1919&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1933&quot; data-start=&quot;1919&quot;&gt;감독 &amp;rarr; 영화 &amp;rarr; 배우&lt;/li&gt;
&lt;li data-end=&quot;1948&quot; data-start=&quot;1934&quot;&gt;문서 &amp;rarr; 섹션 &amp;rarr; 개념&lt;/li&gt;
&lt;li data-end=&quot;1971&quot; data-start=&quot;1949&quot;&gt;컴포넌트 &amp;rarr; 라이선스 &amp;rarr; 원본 URL&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1998&quot; data-start=&quot;1973&quot; data-ke-size=&quot;size16&quot;&gt;이처럼 &lt;b&gt;관계를 따라가며&lt;/b&gt; 정보를 찾는다.&lt;/p&gt;
&lt;p data-end=&quot;2024&quot; data-start=&quot;2000&quot; data-ke-size=&quot;size16&quot;&gt;그래서 multi-hop 질문이 가능해진다.&lt;/p&gt;
&lt;p data-end=&quot;2044&quot; data-start=&quot;2026&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2044&quot; data-start=&quot;2026&quot; data-ke-size=&quot;size16&quot;&gt;정리하면 이렇게 표현할 수 있다.&lt;/p&gt;
&lt;blockquote data-end=&quot;2105&quot; data-start=&quot;2046&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;p data-end=&quot;2105&quot; data-start=&quot;2048&quot; data-ke-size=&quot;size16&quot;&gt;Vector RAG가 &amp;ldquo;가까운 문장&amp;rdquo;을 찾는다면,&lt;br /&gt;GraphRAG는 &amp;ldquo;연결된 의미&amp;rdquo;를 따라간다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;2152&quot; data-start=&quot;2112&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ Agentic GraphRAG &amp;mdash; 검색 방식까지 AI에게 맡기다&lt;/h4&gt;
&lt;p data-end=&quot;2190&quot; data-start=&quot;2154&quot; data-ke-size=&quot;size16&quot;&gt;여기서 한 단계 더 나아간 것이 Agentic GraphRAG다.&lt;/p&gt;
&lt;p data-end=&quot;2219&quot; data-start=&quot;2192&quot; data-ke-size=&quot;size16&quot;&gt;기존 GraphRAG는 파이프라인이 고정돼 있다.&lt;/p&gt;
&lt;p data-end=&quot;2247&quot; data-start=&quot;2221&quot; data-ke-size=&quot;size16&quot;&gt;하지만 Agentic GraphRAG는 다르다.&lt;/p&gt;
&lt;p data-end=&quot;2256&quot; data-start=&quot;2249&quot; data-ke-size=&quot;size16&quot;&gt;질문을 보고,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2303&quot; data-start=&quot;2258&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2270&quot; data-start=&quot;2258&quot;&gt;문서 그래프를 쓸지&lt;/li&gt;
&lt;li data-end=&quot;2284&quot; data-start=&quot;2271&quot;&gt;도메인 그래프를 쓸지&lt;/li&gt;
&lt;li data-end=&quot;2303&quot; data-start=&quot;2285&quot;&gt;Cypher를 몇 번 실행할지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2323&quot; data-start=&quot;2305&quot; data-ke-size=&quot;size16&quot;&gt;이 모든 걸 에이전트가 판단한다.&lt;/p&gt;
&lt;p data-end=&quot;2347&quot; data-start=&quot;2325&quot; data-ke-size=&quot;size16&quot;&gt;즉, AI는 이제 답만 생성하지 않는다.&lt;/p&gt;
&lt;blockquote data-end=&quot;2373&quot; data-start=&quot;2349&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;p data-end=&quot;2373&quot; data-start=&quot;2351&quot; data-ke-size=&quot;size16&quot;&gt;어떻게 찾을지도 스스로 결정한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2523&quot; data-start=&quot;2375&quot; data-ke-size=&quot;size16&quot;&gt;이를 위해 Tool Calling, Planning, Retry Loop 같은 구조가 도입되고,&lt;br /&gt;&lt;span&gt;&lt;span&gt;LangChain&lt;/span&gt;&lt;/span&gt;, &lt;span&gt;&lt;span&gt;LangGraph&lt;/span&gt;&lt;/span&gt; 같은 프레임워크가 활용된다.&lt;/p&gt;
&lt;p data-end=&quot;2577&quot; data-start=&quot;2525&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2577&quot; data-start=&quot;2525&quot; data-ke-size=&quot;size16&quot;&gt;이 단계부터 RAG는 단순 검색 시스템이 아니라,&lt;br /&gt;&lt;b&gt;동적 의사결정 파이프라인&lt;/b&gt;이 된다.&lt;/p&gt;
&lt;p data-end=&quot;2577&quot; data-start=&quot;2525&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;2577&quot; data-start=&quot;2525&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ&amp;nbsp;내가&amp;nbsp;느낀&amp;nbsp;가장&amp;nbsp;중요한&amp;nbsp;인사이트&lt;/h4&gt;
&lt;p data-end=&quot;2577&quot; data-start=&quot;2525&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2640&quot; data-start=&quot;2608&quot; data-ke-size=&quot;size16&quot;&gt;ㅇ &lt;b&gt;Graph는 코딩 문제가 아니라 도메인 문제다&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2672&quot; data-start=&quot;2642&quot; data-ke-size=&quot;size16&quot;&gt;온톨로지에서&amp;nbsp;Agentic&amp;nbsp;GraphRAG까지&amp;nbsp;&amp;mdash;&amp;nbsp;&amp;ldquo;관계&amp;nbsp;기반&amp;nbsp;AI&amp;rdquo;가&amp;nbsp;필요한&amp;nbsp;이유&lt;/p&gt;
&lt;p data-end=&quot;2672&quot; data-start=&quot;2642&quot; data-ke-size=&quot;size16&quot;&gt;그래프 품질은 코드가 아니라 도메인 이해도에서 나온다.&lt;/p&gt;
&lt;p data-end=&quot;2701&quot; data-start=&quot;2674&quot; data-ke-size=&quot;size16&quot;&gt;어떤 관계가 중요한지,&lt;br /&gt;어떤 질문이 들어올지,&lt;/p&gt;
&lt;p data-end=&quot;2732&quot; data-start=&quot;2703&quot; data-ke-size=&quot;size16&quot;&gt;이걸 설계하는 사람이 결국 시스템 정확도를 결정한다.&lt;/p&gt;
&lt;p data-end=&quot;2732&quot; data-start=&quot;2703&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2773&quot; data-start=&quot;2739&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2773&quot; data-start=&quot;2739&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ㅇ Chunking + Embedding 이후의 세계&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2807&quot; data-start=&quot;2775&quot; data-ke-size=&quot;size16&quot;&gt;Vector는 의미 좌표다.&lt;br /&gt;Graph는 의미 구조다.&lt;/p&gt;
&lt;p data-end=&quot;2830&quot; data-start=&quot;2809&quot; data-ke-size=&quot;size16&quot;&gt;둘은 대체 관계가 아니라 보완 관계다.&lt;/p&gt;
&lt;p data-end=&quot;2875&quot; data-start=&quot;2832&quot; data-ke-size=&quot;size16&quot;&gt;Embedding으로 &lt;b&gt;&amp;ldquo;가까움&amp;rdquo;&lt;/b&gt;을 만들고, Graph로 &lt;b&gt;&amp;ldquo;이유&amp;rdquo;&lt;/b&gt;를 만든다.&lt;/p&gt;
&lt;p data-end=&quot;2909&quot; data-start=&quot;2882&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2909&quot; data-start=&quot;2882&quot; data-ke-size=&quot;size16&quot;&gt;3. &lt;b&gt;Agent는 자동화가 아니라 전략화다&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2940&quot; data-start=&quot;2911&quot; data-ke-size=&quot;size16&quot;&gt;Agent는 단순히 일을 대신 해주는 존재가 아니다.&lt;/p&gt;
&lt;p data-end=&quot;2981&quot; data-start=&quot;2942&quot; data-ke-size=&quot;size16&quot;&gt;질문마다 검색 전략을 바꾸는&lt;br /&gt;&lt;b&gt;&amp;nbsp;지능형 오케스트레이터&lt;/b&gt;에 가깝다.&lt;/p&gt;
&lt;p data-end=&quot;2981&quot; data-start=&quot;2942&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;3010&quot; data-start=&quot;2988&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 이 구조가 실무에서 의미하는 것&lt;/h4&gt;
&lt;p data-end=&quot;3033&quot; data-start=&quot;3012&quot; data-ke-size=&quot;size16&quot;&gt;이 구조는 단순 챗봇 이야기가 아니다.&lt;/p&gt;
&lt;p data-end=&quot;3085&quot; data-start=&quot;3035&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 문서 검증, 정책 판단, 컴플라이언스, 기술 의사결정 등&lt;br /&gt;&amp;nbsp; 모두 같은 패턴으로 확장된다.&lt;/p&gt;
&lt;p data-end=&quot;3093&quot; data-start=&quot;3087&quot; data-ke-size=&quot;size16&quot;&gt;예를 들면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3143&quot; data-start=&quot;3095&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3113&quot; data-start=&quot;3095&quot;&gt;컴포넌트 &amp;rarr; 라이선스 &amp;rarr; 원본&lt;/li&gt;
&lt;li data-end=&quot;3128&quot; data-start=&quot;3114&quot;&gt;문서 &amp;rarr; 섹션 &amp;rarr; 개념&lt;/li&gt;
&lt;li data-end=&quot;3143&quot; data-start=&quot;3129&quot;&gt;규칙 &amp;rarr; 조건 &amp;rarr; 결과&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3165&quot; data-start=&quot;3145&quot; data-ke-size=&quot;size16&quot;&gt;이제 RAG는 검색 시스템이 아니라, &lt;b&gt;의사결정 파이프라인&lt;/b&gt;이 된다.&lt;/p&gt;
&lt;p data-end=&quot;3165&quot; data-start=&quot;3145&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;3237&quot; data-start=&quot;3197&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vector&amp;nbsp;다음은&amp;nbsp;Graph,&amp;nbsp;그&amp;nbsp;다음은&amp;nbsp;Agent&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3253&quot; data-start=&quot;3239&quot; data-ke-size=&quot;size16&quot;&gt;정리하면 이렇게 이어진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3308&quot; data-start=&quot;3255&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3274&quot; data-start=&quot;3255&quot;&gt;Ontology: 사고 구조&lt;/li&gt;
&lt;li data-end=&quot;3291&quot; data-start=&quot;3275&quot;&gt;Graph: 기억 구조&lt;/li&gt;
&lt;li data-end=&quot;3308&quot; data-start=&quot;3292&quot;&gt;Agent: 판단 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3355&quot; data-start=&quot;3310&quot; data-ke-size=&quot;size16&quot;&gt;LLM이 똑똑해지는 시대가 아니라,&lt;br /&gt;우리가 AI를 설계해야 하는 시대가 왔다.&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>Agentic GraphRAG</category>
      <category>graph</category>
      <category>PETERICA</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1028</guid>
      <comments>https://peterica.tistory.com/1028#entry1028comment</comments>
      <pubDate>Thu, 5 Feb 2026 22:53:19 +0900</pubDate>
    </item>
    <item>
      <title>[AI] Embedding 기초 &amp;mdash; Transformer가 만든 의미를 저장하는 방법</title>
      <link>https://peterica.tistory.com/1025</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeULY/btsNebTHMD3/bX97l0SKsxrXT44KfuWkC1/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeULY%2FbtsNebTHMD3%2FbX97l0SKsxrXT44KfuWkC1%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;233&quot; data-filename=&quot;블로그 로고.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://peterica.tistory.com/1017&quot;&gt;[AI]&amp;nbsp;LLM&amp;nbsp;학습&amp;nbsp;노트&amp;nbsp;공개&amp;nbsp;-&amp;nbsp;Transformer부터&amp;nbsp;RAG까지,&amp;nbsp;그리고&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;AI&amp;nbsp;시스템을&amp;nbsp;향해&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ㅁ 들어가며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer를 공부하면서 가장 인상 깊었던 점은&lt;br /&gt;&amp;nbsp; LLM이 언어를 &amp;ldquo;이해&amp;rdquo;한다기보다, 의미를 벡터로 변환해 계산한다는 사실이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Attention과 Encoder&amp;ndash;Decoder 구조를 따라가다 보니 하나의 질문으로 이어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 이 벡터는 모델 안에서만 존재하는 걸까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding은 바로 그 답이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding은 Transformer 내부에서 만들어진 의미를 모델 밖으로 꺼내는 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&amp;nbsp;추론용 의미 표현을 저장과 검색이 가능한 형태로 바꾸는 단계다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Embedding은 기억을 만드는 기술이다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encoder는 문장을 벡터 공간에서 의미 구조로 압축한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;하지만 그 출력은 일시적이다. 추론이 끝나면 사라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding은 다르다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 문장, 문서, 혹은 토큰을 고정 길이 벡터로 변환해 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 Embedding을 이렇게 이해하게 되었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;Encoder&lt;/b&gt;가 &amp;ldquo;&lt;b&gt;생각&lt;/b&gt;&amp;rdquo;이라면, &lt;br /&gt;&lt;b&gt;Embedding&lt;/b&gt;은 &amp;ldquo;&lt;b&gt;기억&lt;/b&gt;&amp;rdquo;이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람도 글을 읽고 나면 모든 문장을 그대로 외우지 않는다. 대신 요약된 인상을 남긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding도 마찬가지다.&amp;nbsp;문서 전체를 하나의 벡터로 요약해 의미 좌표 하나로 남긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 좋은 Embedding이란 무엇인가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding의 본질은 단순하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 같은 의미는 가까이,&lt;br /&gt;&amp;nbsp; 다른 의미는 멀리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 가지만 만족하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 실제 품질은&lt;br /&gt;&amp;nbsp; 모델 크기보다 다음에 더 크게 좌우된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 텍스트 단위로 나누었는지 (Chunking)&lt;/li&gt;
&lt;li&gt;어떤 유사도 기준을 쓰는지&lt;/li&gt;
&lt;li&gt;벡터 차원과 비용을 어떻게 균형 잡았는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 느낀 건,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; LLM 성능보다&lt;br /&gt;&amp;nbsp; Embedding + 검색 설계가 RAG 품질을 더 크게 좌우한다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Vector Similarity는 의미 거리다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding 벡터 자체보다 중요한 건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그 벡터를 어떻게 비교하느냐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Cosine similarity는 방향을 본다.&lt;br /&gt;&amp;nbsp; Dot product는 방향과 크기를 함께 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L2 distance는 실제 공간 거리를 잰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 수학적으로는 다르지만, 개념적으로는 모두 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;ldquo;이 두 문장이 얼마나 비슷한가?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VectorDB는 검색 엔진이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;의미 공간을 탐색하는 시스템&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문을 벡터로 바꾸고, 가장 가까운 의미 좌표들을 찾는 구조다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 임베딩 모델은 &amp;lsquo;정답&amp;rsquo;이 아니라 &amp;lsquo;선택&amp;rsquo;이다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;임베딩 모델&lt;/b&gt;을 비교해 보면 각각 장단점이 분명하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API 기반 모델은 빠르게 시작할 수 있지만 비용과 외부 의존이 생긴다.&lt;/li&gt;
&lt;li&gt;오픈소스 모델은 자유도가 높지만 인프라 운영 부담이 따른다.&lt;/li&gt;
&lt;li&gt;다국어 모델은 범용성이 좋고,&lt;/li&gt;
&lt;li&gt;영어 특화 모델은 성능이 더 좋을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 건 &amp;ldquo;최고 성능&amp;rdquo;이 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 내 시스템 조건에 맞는 선택이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프라이버시가 중요한가?&lt;/li&gt;
&lt;li&gt;GPU 인프라가 있는가?&lt;/li&gt;
&lt;li&gt;한국어 비중은 얼마나 되는가?&lt;/li&gt;
&lt;li&gt;문서 길이는 긴가 짧은가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding은 모델 문제가 아니라&lt;br /&gt;&amp;nbsp; 아키텍처 문제에 가깝다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Chunking은 기술이 아니라 의미 설계다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding을 하다 보면 곧 느끼게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델보다 Chunking 전략이 더 중요하다는 것을.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 너무 크면 의미가 희석되고,&lt;br /&gt;&amp;nbsp; 너무 작으면 문맥이 깨진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Chunk는 단순 분할이 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 의미 단위를 어떻게 정의하느냐의 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람이 문서를 읽을 때 문단 단위로 이해하듯,&lt;br /&gt;&amp;nbsp; RAG에서도 비슷한 사고가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ Transformer와 Embedding의 연결&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Week 1에서 배운 Transformer는 &lt;b&gt;실시간 의미 계산기&lt;/b&gt;였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding은 그 계산 결과를&lt;br /&gt;&amp;nbsp; 영구 저장 가능한 형태로 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;b&gt;VectorDB&lt;/b&gt;는&lt;br /&gt;&amp;nbsp; &lt;b&gt;이 벡터들을 모아 둔 의미 지도&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 이렇게 이어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;의미 생성 (Transformer)&lt;br /&gt;&amp;nbsp; &amp;rarr; 의미 고정 (Embedding)&lt;br /&gt;&amp;nbsp; &amp;rarr; 의미 저장 (VectorDB)&lt;br /&gt;&amp;nbsp; &amp;rarr; 의미 검색 (Retriever)&lt;br /&gt;&amp;nbsp; &amp;rarr; 의미 재해석 (Encoder + Decoder)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름 위에 RAG가 올라간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ㅁ 마무리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding을 이해했다는 건&amp;nbsp;벡터 차원을 외웠다는 뜻이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미를 좌표로 바꾸고,&lt;br /&gt;&amp;nbsp; 그 좌표를 다시 활용하는 구조를 이해했다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer가 사고 구조라면,&lt;br /&gt;&amp;nbsp; Embedding은 그 사고를 외부 세계에 남기는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 단계에서는&lt;br /&gt;&amp;nbsp; 이 의미 좌표들이 어떻게 &lt;b&gt;검색&lt;/b&gt;되고,&lt;br /&gt;&amp;nbsp; RAG 파이프라인 안에서 다시 LLM으로 돌아오는지를 살펴보려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본 문서들은 계속 LLM 학습 노트에 정리하고, 블로그에는 이렇게 사고 흐름 중심으로 풀어볼 예정이다.&lt;/p&gt;</description>
      <category>AI/AI이론 | 공부</category>
      <category>Embedding</category>
      <category>PETERICA</category>
      <category>vectordb</category>
      <author>기록하는 백앤드개발자</author>
      <guid isPermaLink="true">https://peterica.tistory.com/1025</guid>
      <comments>https://peterica.tistory.com/1025#entry1025comment</comments>
      <pubDate>Thu, 5 Feb 2026 02:01:41 +0900</pubDate>
    </item>
  </channel>
</rss>