<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>pengine 님의 블로그</title>
    <link>https://pengine.tistory.com/</link>
    <description>인공지능학과 학부생의 블로그</description>
    <language>ko</language>
    <pubDate>Mon, 15 Jun 2026 03:48:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>pengine</managingEditor>
    <image>
      <title>pengine 님의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/8097892/attach/8cbc9cb75ac24756852a7fc270d621ce</url>
      <link>https://pengine.tistory.com</link>
    </image>
    <item>
      <title>[2026 동계 모각코] 모각코 회고</title>
      <link>https://pengine.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 모각코 활동에서의 목표는&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 인공지능 기초 다지기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 인공지능 활용 익히기&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;이를 바탕으로 이번 2026 동계 모각코 회고를 작성해보려고 한다.&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;b&gt;1. 인공지능 기초 다지기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 활동을 통해 특히 2회차의 Transformer의 Attention 구조에 대해 자세히 탐구하며 인공지능 기초에 대한 이해가 높아졌다고 말할 수 있을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 LG Aimers의 강의를 수강하며 Fine Tuning에 대한 기초 개념도 자세히 알아갈 수 있었으며, 모델 경량화같은 평소에 크게 관심을 가지지 않았던 인공지능의 기초 분야에 대해 알아갈 수 있었던 것 같다.&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;b&gt;2. 인공지능 활용 익히기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 현재 진행형이라고 말할 수 있을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 LG Aimers라는 대회를 EXAONE 모델 경량화라는 주제로 출전하고 있는데, 이를 통해 이것저것 모델을 만져보며 인공지능 활용 능력을 키울 수 있다는 기대를 품고 있다.&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;이번 모각코 활동을 LG Aimers 대회의 부가적인 정리 노트로서 신청한 감이 없지않아 있는데&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;</description>
      <category>모각코</category>
      <category>모각코</category>
      <category>모각코 회고</category>
      <author>pengine</author>
      <guid isPermaLink="true">https://pengine.tistory.com/16</guid>
      <comments>https://pengine.tistory.com/16#entry16comment</comments>
      <pubDate>Wed, 18 Feb 2026 16:20:18 +0900</pubDate>
    </item>
    <item>
      <title>[2026 동계 모각코] 6회차 활동 결과 - EXAONE Quantization</title>
      <link>https://pengine.tistory.com/15</link>
      <description>&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;활동 목표: LG Aimers&lt;span&gt;&amp;nbsp;&lt;/span&gt;강의&lt;span&gt; 4&lt;/span&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 계획에 따르면, 현재 열리고 있는 LG Aimers라는 대회의 준비 과정인 강의를 수강한 후 정리하는 것이었지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벌써 대회가 시작되고 많은 시간이 지나버렸다...!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 대회의 기반 모델인 EXAONE 4.0 1.2B 모델을 하나하나 파헤쳐보기 위한 EXAONE 4.0 논문 리뷰를 진행하려고 했다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 대회의 주제인 EXAONE 모델 경량화를 위해 EXAONE 모델의 레이어 구조를 뜯어보고 다양한 양자화 기법들에 대한 이야기를 하겠다.&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;b&gt;2. EXAONE 4.0 1.2B&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EXAONE 모델은 Sliding window를 사용하는 Hybrid Attention 구조이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EXAONE 모델은 거대한 32B 모델과 on-device로 사용하기 위해 작은 1.2B모델이 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 대회에서 사용하는 1.2B모델은 Global Attention만 사용하기 때문에 이에 대해서 자세히 알 필요는 없다고 언급되었다.&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;b&gt;2.1. Hybrid Attention&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 모든 문장을 보는 Global Attention은 연산량이 O(n&amp;sup2;)이기 때문에 문장이 길어질수록 비효율적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 보완하기 위해 일부는 Global Attention을 취하되, 일부는 Local Attention으로 전체 문장이 아닌 주변 문맥만 확인하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EXAONE 모델은 이 Local Attention을 Sliding Window Attention으로 사용했는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sliding Window Attention은 기존의 컴퓨터 공학에서 많이 사용되는 Sliding Window를 떠올리면 이해하기 쉬울 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;query가 이동하면서 자신 주변 단어만 확인하는 Attention 기법이다.&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;840&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dw3dsK/dJMcajgQJ2i/LBsloEQDaJmSFY9KQeQiS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dw3dsK/dJMcajgQJ2i/LBsloEQDaJmSFY9KQeQiS0/img.png&quot; data-alt=&quot;출처: EXAONE 4.0: Unified Large Language Models Integrating Non-reasoning and Reasoning Modes&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dw3dsK/dJMcajgQJ2i/LBsloEQDaJmSFY9KQeQiS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdw3dsK%2FdJMcajgQJ2i%2FLBsloEQDaJmSFY9KQeQiS0%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;840&quot; height=&quot;501&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: EXAONE 4.0: Unified Large Language Models Integrating Non-reasoning and Reasoning Modes&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;b&gt;2.2. QK-Reorder-LN&lt;/b&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;이 구조는 쉽게 설명하면 기존의 Attentiojn 과정 사이에 Layer Normalization, 즉 Reorder 를 진행하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이 Normalization은 RMSNorm을 사용했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfLTU1/dJMcaiPMkHJ/ECkRsp6M7CpXPL2ZcC5wk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfLTU1/dJMcaiPMkHJ/ECkRsp6M7CpXPL2ZcC5wk1/img.png&quot; data-alt=&quot;출처: EXAONE 4.0: Unified Large Language Models Integrating Non-reasoning and Reasoning Modes&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfLTU1/dJMcaiPMkHJ/ECkRsp6M7CpXPL2ZcC5wk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfLTU1%2FdJMcaiPMkHJ%2FECkRsp6M7CpXPL2ZcC5wk1%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;905&quot; height=&quot;557&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: EXAONE 4.0: Unified Large Language Models Integrating Non-reasoning and Reasoning Modes&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;이러한 구조를 사용하는 이유는, 기존의 Transformer 구조에서 어떤 문제가 있는지 알아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 Transformer의 구조(2회차 transformer paper 참고)는 Post-LN 구조로 Attention block을 통과한 후 Norm을 진행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 Post LN 구조를 더욱 안정성 있도록 만든 것이 Pre-LN 구조이다. Norm을 더욱 앞당겨 기울기를 더욱 완만하게 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Pre-LN 구조는 레이어가 깊어지게 되면 residual connection로 인해 층이 깊어질수록 분산이 커지게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리하여 LN을 Reorder한 것이 QK-Reorder-LN 구조인 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi81yM/dJMcajgQKpt/GzaUDYuq9gxEkldcmdljVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi81yM/dJMcajgQKpt/GzaUDYuq9gxEkldcmdljVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi81yM/dJMcajgQKpt/GzaUDYuq9gxEkldcmdljVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi81yM%2FdJMcajgQKpt%2FGzaUDYuq9gxEkldcmdljVK%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;895&quot; height=&quot;753&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;753&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;b&gt;2.3. Model configuration&lt;/b&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbFolD/dJMcacWmy2l/NTiZ7fI8MBKhntAt3mI43k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbFolD/dJMcacWmy2l/NTiZ7fI8MBKhntAt3mI43k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbFolD/dJMcacWmy2l/NTiZ7fI8MBKhntAt3mI43k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbFolD%2FdJMcacWmy2l%2FNTiZ7fI8MBKhntAt3mI43k%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;1195&quot; height=&quot;641&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;641&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Mixed precision&lt;/b&gt;&lt;/h3&gt;
&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;이를 분석한 이유는 이번 해커톤에서 소개한 양자화 기법이 Mixed precision이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mixed precision이란 모델의 각 레이어마다 다른 정도의 양자화를 진행하는 것이다.&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;이 방향성으로 EXAONE에 대해 더욱 깊게 파헤쳐보며 대회를 진행해 나가도록 하겠다!&lt;/p&gt;</description>
      <category>모각코</category>
      <category>EXAONE</category>
      <category>Hybrid Attention</category>
      <category>QK-Reorder-LN</category>
      <author>pengine</author>
      <guid isPermaLink="true">https://pengine.tistory.com/15</guid>
      <comments>https://pengine.tistory.com/15#entry15comment</comments>
      <pubDate>Wed, 18 Feb 2026 04:36:26 +0900</pubDate>
    </item>
    <item>
      <title>[2026 동계 모각코] 5회차 활동 결과 - LLM Agent</title>
      <link>https://pengine.tistory.com/14</link>
      <description>&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;활동 목표: LG Aimers&lt;span&gt;&amp;nbsp;&lt;/span&gt;강의 3차 정리&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 활동에서는 LLM Agent에 대한 내용을 다룰 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent 기능을 여러 ide(VS Code, Intellij, Cursor, Antigravity..) 에서 사용해본 사람들은 많이 있을 것이다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. LLM Agent&lt;/b&gt;&lt;/h3&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 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;text를 통해 환경과 상호작용하는 Augmented LLM, plan 단계와 tool을 호출하는 단계를 진행할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Augmented LLM이란 기존 LLM에 tool과 memory가 합쳐진 형태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 말하는 tool은 지난 시간에 소개한 RAG와 같이 downstream task를 더욱 잘 할 수 있는 외부 함수를 호출하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 여기에서 말하는 memory는 LLM과 multi-turn으로 대화를 주고받을 때, 대화를 주고 받을 때마다 LLM이 직접 학습하며 파라미터가 업데이트되는 것이 아니므로 지난 대화 기록을 저장하는 것이 필요하다. 이러한 맥락에서의 memory라고 이해하면 된다.&lt;/p&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 Agent로 돌아가서 Augmented LLM과 tool을 호출하는 것이 무엇인지는 알겠고&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;ide에서 Agent기능을 사용하는 것을 예시로 들자면, 로컬 환경에서 코드를 받는 것, 사용할 수 있는 tool을 호출하여 오늘의 날씨 정보를 받는 것 등 영향을 끼칠 수 있는 넓어진 환경을 뜻한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 가장 흥미로웠던 plan 단계란, 우리가 직접 &quot;어떤 tool을 호출해라&quot; 라고 입력하지 않는 것처럼 LLM이 통제 센터 역할로 어떤 tool을 사용해야겠다! 하는 것이 plan 단계이다.&lt;/p&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 Agent의 기능을 plan, tool, memory 3가지로 나누어서 자세히 설명해보도록 하겠다.&lt;/p&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;b&gt;2.1. Memory&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거꾸로 설명하는 것이 이해에 더욱 도움이 될 것 같아서 Memory부터 설명하도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Memory는 두 가지 종류로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Short-term memory 와 Long-term memory가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 GPT, Gemini와 같은 LLM과 대화를 할 때, 세션이라는 단위를 통해 기록을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대화의 주제를 하나의 summary로 좌측에 기록을 남겨두는데, 이 것이 하나의 세션이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 하나의 세션 내에서 LLM이 이전 대화 기록을 참고하여 답변을 생성하는데, 이것이 Short-term memory이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 기록은 보통 다음과 같은 구조를 이어가면서 하나의 context window에 기록된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;|im_start|&amp;gt;user&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나 오늘 16시간동안 데이터셋 다운받은게 다 날라갔어 ㅠㅠ&amp;lt;|im_end|&amp;gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;|im_start|&amp;gt;assistant&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;lt;|im_end|&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;|im_start|&amp;gt;user&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굿 지피티.&amp;lt;|im_end|&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;|im_start|&amp;gt;assistant&lt;/p&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 window에 저장하며 기록을 참고하기에는 텍스트가 너무 길어져 무리가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다른 세션의 정보를 기록하는 Long-term memory를 사용하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Long-term memory는 중요한 정보, 개인적인 정보와 지난 세션 내용의 요약을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장하는 방식에서 특별한 점이 있는데, vector DataBase를 사용한다는 점이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;embedding에서 배운 내용과 같이, 이러한 정보들을 vector 형식으로 저장하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후에 사용자가 텍스트를 입력하면 입력 텍스트에 대한 vector와 유사도가 높은 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;최근 Gemini를 사용할 때 종종 나타나는 현상이 있는데&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;XX님은 최근 ~~를 진행하고 계시니 이와 관련된 정보를 소개해 드릴까요? 와 같이 내가 하고있는 것을 너무 잘 안다...좀 기분나쁘다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Long-term 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;&lt;b&gt;2.2. Tool&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 그냥 자연스럽게 tool을 '호출' 한다고 헀는데&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에게 &quot;2더하기 3을 계산해줘&quot; 라고 질문을 한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 직접 계산할 수도 있곘지만, 정답이 정해진 산수 문제에서 여러 다음 문장의 확률을 통해 sampling으로 도출하는 LLM에게는 5라는 답변 말고 다른 답변을 내는 확률이 존재한다면, 할루시네이션(Hallucination)을 생성해내는 경우도 있을 것이다.&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은 calculator(&quot;2 + 3&quot;) 과 같이 함수를 호출하게 되며 이런 함수를 외부에서 실행하여 값으로 전달하는 것을 tool calling이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 tool 을 호출하는 일은 계속 언급되었던 special token을 통해 일어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tool calling에 대한 더욱 자세한 정보는 따로 찾아보길 바란다.&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;b&gt;2.3. Plan&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 tool calling 과정을 거치려면 어떤 tool을 사용할지 결정하는 것이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 LLM에게 &quot;2 더하기 3을 계산해줘&quot; 라고 하면 LLM이 아, calculator 함수를 호출해야겠구나! 하고 추론하는 과정이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 추론 과정을 거친 이후에 어떤 tool을 사용하겠다는 special token이 생성된 후 tool calling을 진행하는 것이다.&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;먼저 사용자에게 task를 받은 LLM은 그 task를 작은 일의 단위로 쪼갠다. 이를 task decomposition이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 쪼개진 task에 대해서 해야 하는 일을 찾기 위해 LLM은 추론을 진행한다. 이미 메모리에 있는 내용이라면 하지 않아도 되는 일이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 어떤 일을 해야 하는지에 대한 추론을 진행한 뒤, 상황에 대한 해석만 하는 것이 아니라 이후 해야 할 Action을 정하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 추론(Reasoning)과 Action을 같이 하는 기법을 ReAct라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reasoning, Action, Observation을 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reasoning과 Action이 끝나면 결과에 대한 Observation을 진행하여 다음 Action을 정하는 순환 구조를 띈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 과정 속에서 스스로 자기점검을 진행하는 method를 사용할 수 있다. 이를 Reflection이라고 한다.&lt;/p&gt;
&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;tool calling, ReAct, Reflection에 대한 정보에 대해 더욱 궁금하다면 따로 찾아보길 바란다.&lt;/p&gt;</description>
      <category>모각코</category>
      <category>Agent</category>
      <author>pengine</author>
      <guid isPermaLink="true">https://pengine.tistory.com/14</guid>
      <comments>https://pengine.tistory.com/14#entry14comment</comments>
      <pubDate>Fri, 30 Jan 2026 08:17:02 +0900</pubDate>
    </item>
    <item>
      <title>[2026 동계 모각코] 4회차 활동 결과 - Decoding, RAG</title>
      <link>https://pengine.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;활동 목표: LG Aimers 강의 2차 정리&lt;/p&gt;
&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 시간에는 LLM의 Decoding, RAG에 대한 소개 형식으로 글을 쓰도록 하겠다.&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;b&gt;2. Decoding&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Decoding에 대해 설명하기 위해 다시 Transformer를 떠올리기 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer 아키텍쳐 마지막 부분에서, Unembedding 과정을 거쳐서 softmax로 확률분포를 도출하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Decoding은 그러한 확률분포를 통해 다음 토큰에 대한 결과를 어떻게 도출할 것인가를 결정하는 알고리즘이다.&lt;/p&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;b&gt;2.1. Greedy Decoding&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서대로 다음 단어를 예측하기 때문에, 트리 형식을 떠올릴 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsfMf1/dJMcaiozgoT/J64XGTamg1UTxi1NqHblX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsfMf1/dJMcaiozgoT/J64XGTamg1UTxi1NqHblX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsfMf1/dJMcaiozgoT/J64XGTamg1UTxi1NqHblX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsfMf1%2FdJMcaiozgoT%2FJ64XGTamg1UTxi1NqHblX0%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;812&quot; height=&quot;654&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같이 당장 다음 시점에, 높은 확률을 따라가는 것이 Greedy Decoding이다.&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;The nice woman...&quot;은 0.5 * 0.4 이지만, &quot;The dog has...&quot;는 0.4 * 0.9 이다.&lt;/p&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;b&gt;2.2. Beam Search&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최적해를 선택할 수 있도록, 확률이 높은 n개의 분기를 설정하여 다음 계산에도 포함시키는 것이 Beam Search 알고리즘이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예시에서는 The 다음 nice의 확률이 가장 높기에 Greedy Decoding에서는 nice 이후 woman, house, guy 만 계산하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Beam Search에서는 dog의 분기를 남겨두어, and, runs, has까지 계산하는 것이다.&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;b&gt;2.3. Sampling&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어디서 많이 들어봤을 수도 있는 Decoding 방식이다. 현재 LLM이 이 방식을 채택하고 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sampling은 확률에 기반하여 다음 단어를 뽑는 방식이다. 랜덤으로 뽑는다고 이해하면 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난번, Temperature에 대해 설명할 때 Decoding 방식이 Sampling이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Temperature를 통해 확률 분포를 증폭, 균등하게 만들어서 무작위성을 높이고 낮출 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 Sampling 방식에서는 확률이 낮은 것도 결과로 나올 수 있다는 양날의 검과 같은 장단점이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이를 보완하기 위해 Top-k, Top-p를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확률이 높은 k개의 후보에서만 Sampling&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누적 확률 합이 p 보다 낮은 후보에서만 Sampling&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;여기까지 대중적으로 알려진 Decoding 방식이고, 추가로 더욱 심화된 Decoding 알고리즘에 대해서는 언급만 짧게 하려고 한다.&lt;/p&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;b&gt;2.4. 심화 Decoding 알고리즘&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Diverse Beam Search - Beam Serach에서 중복 정보를 선택하는 문제로 인해 확률이 낮더라도 다양하게 선택할 수 있도록 만드는 것. Group을 지정해 타 Group과 유사한 정보를 피하도록 함.&lt;/li&gt;
&lt;li&gt;Contrastive Decoding - 큰 모델과 작은 모델을 사용하여 큰 모델이 예측하는 상위 범주 내에서 작은 모델의 확률분포와의 차이를 Sampling하여 뻔한 정보, 실수 등을 최소화함.&lt;/li&gt;
&lt;li&gt;Speculative Decoding - 작은 모델이 큰 모델 대신 추론하여 큰 모델과 동일한 추론 결과를 도출하게 만드는 알고리즘. (Cost 절감)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. RAG(Retrieval Augmented Generation, 검색 증강 생성)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM을 많이 사용해 보았으면 할루시네이션(Hallucination)에 대해 들어보고, 경험해보았을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM이 정확하지 않은 답변을 마치 정확한 것처럼 답변하는 현상인데, 이는 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;RAG는 이러한 문제에 착안하여, 신뢰성 있는 외부 Source에서 정보를 통해 답변을 생성하는 기법이다.&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;이러한 RAG에서 문제가 생길 수 있는 부분이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 굉장히 많은 정보를 가져와 context를 초과할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. input query의 품질이 좋지 않아 답변의 품질이 좋지 않을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Noise가 들어왔을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 보완하기 위해 REPLUG, HyD, RetRobust 와 같은 연구를 소개하였는데, 이에 대한 정보는 따로 찾아보길 바란다.&lt;/p&gt;
&lt;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>decoding</category>
      <category>rag</category>
      <category>모각코</category>
      <author>pengine</author>
      <guid isPermaLink="true">https://pengine.tistory.com/13</guid>
      <comments>https://pengine.tistory.com/13#entry13comment</comments>
      <pubDate>Sat, 24 Jan 2026 00:29:45 +0900</pubDate>
    </item>
    <item>
      <title>[2025 동계 모각코] 3회차 활동 결과 - Fine tuning과 Domain Adaptation</title>
      <link>https://pengine.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;활동 목표: LG Aimers 강의 1차 정리&lt;/p&gt;
&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;&lt;b&gt;1. 개요&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 활동부터 LG Aimers의 대회에 출전하게 되면서 수강할 수 있는 강의를 보며 학습할 예정이다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Fine tuning 기초&lt;/b&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;Fine tuning에 대해 들어가기 전, 인공지능 모델에 대한 개념 용어부터 짚고 가도록 하겠다.&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.1. Base Model, Instruct Model, Quantized Model&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Base Model 이란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대규모 데이터셋으로 pre-train 한 모델이다.&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;Instruct Model 이란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Base Model 을 Instruct data로 fine tuning 한 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 fine tuning에 대한 설명을 하지 않았지만 어느 정도 감으로 이해하길 바란다?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 instruct란 첫 시간에 설명한 special token으로 볼 수 있다.&lt;/p&gt;
&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;문장에서 다음 토큰을 예측하는 단계까지 학습이 되었다면 이는 Base Model이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 이 모델에게 &quot;오늘 점심 메뉴를 추천해줘&quot; 라는 프롬프트를 넣는다면 모델의 답변은 이 문장 다음에 올 확률이 높은 토큰인 &quot;오늘은 한식이 먹고 싶어&quot; 와 같은 사용자 입장에서 얼렁뚱땅한 메시지를 보낼 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 speicial token을 통해 system, user, assistant와 같은 역할을 부여해 주는데, &amp;lt;|im_start&amp;gt; system \n answer user questions &amp;lt;|im_end&amp;gt; 을 통해 위와 같은 질문을 했을 떄 &quot;오늘은 불고기 어때요?&quot; 와 같은 답변을 생성할 수 있도록 만들어 주는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Quantized Model은 양자화를 진행한 모델이다.&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;이렇게 무거운 모델의 파라미터가 float 32로 저장되어 있다면 이를 int 8 과 같이 줄여 모델 자체를 경량화하는 것을 양자화라고 한다.&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.2. Fine tuning&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fine tuning이란 모델의 파라미터를 미세 조정하는 것이다. (학습된 모델의 가중치를 미세하게 변환시키는 것)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Base Model에서 이미 많은 지식을 습득하였을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fine tuning은 그 지식을 기반으로 하여 원하는 방향(특정 도메인)으로 미세 조정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언어 모델의 경우 다음 토큰을 예측하는 Base Model 을 통해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람과 대화하는 방법을 fine tuning&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감정을 분석하는 방법을 fine tuning&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 생성하는 방법을 fine tuning 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인공지능 분야에서는 trade off가 빈번하게 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;fine tuning을 할 때의 주의점 또한&amp;nbsp;&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;harr; 모델의 기존 능력 감소 trade off(catastrophic forgetting)&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;와 같은 trade off 관계가 성립한다.&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2.3. Fine tuning 분류&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&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;Fine tuning의 목적에 대한 용어를 소개하도록 하겠다.&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;Continuous Pretraining - Base Model에서 특정 도메인에 맞도록 추가적으로 학습시키는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Instruction tuning - 지시사항의 템플릿(special token)을 학습(ex., system, user, assistant..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Alignment - 모델이 더욱 사용자 친화적인 방향으로 학습되는 것 (강화 학습 기반)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Alignment는 Alignment 알고리즘, 멀티모달 임베딩에서의 Alignment와는 다른 개념이다.&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;SFT(Supervised Fine Tuning)은 정답 데이터를 통해 학습하는 Fine Tuning 기법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 1차원적 정답을 정의하기에 무리가 있는 경우가 많아 Alignment를 통해 정답의 방향을 가르친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 Alignmnet의 예시로 RLHF, DPO 등이 있다. 이에 대해서는 다음 시간에 설명하도록 하겠다.&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.4. PEFT(Parameter Efficient Fine Tuning), LoRA&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PEFT는 단어에서도 볼 수 있듯이 모델을 최적화하는 방향이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PEFT에서는 기존 fine tuning과 같이 전체 파라미터를 미세하게 조정하는 것이 아닌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 Base Model의 일부(최소한의) 파라미터(Adapter)를 조절하여 기존 모델의 성능을 무너뜨리지 않고 fine tuning을 진행한다.&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;전체 파라미터를 fine tuning 하게 될 경우,&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;이 전체 파라미터를 fine tuning(fully fine tuning)하게 될 경우 매우 오래 걸리고 고성능의 컴퓨팅 자원이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 예시로 LoRA(Low Rank Adaptation)을 소개하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LoRA에 대해 가볍게 설명하자면 저랭크 가중치 행렬 A, B 를 통해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 가중치에 A@B를 더해주는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저랭크 행렬 A, B를 fine tuning하는 것이므로 매우 가볍다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 기존 파라미터를 freeze하므로(기존 가중치 변화 X) 큰 성능 저하가 일어나지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LoRA가 최신 기술이라고 알고 있는데, 논문 등을 통해 더 자세한 정보를 찾아보길 바란다.&lt;/p&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;b&gt;3. DA(Domain Adaptation)&lt;/b&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인공지능에는 여러 분야가 있다. 그 중 Domain Adaptation도 그 중 하나다.&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;이러한 다른 도메인에서 같은 감정이라는 것을 적응시키는 것이 Domain Adaptation이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 Domain Adaptation은 fine tuning과 깊은 연관성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fine tuning 또한 서로 다른 도메인에서 모델에게 알려주는 방법이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fine tuning을 공부하며 DA에 관심을 가지고 추가적으로 찾아보는 것이 매우 좋은 학습 방향이 될 것 같다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(저도 아직 DA 잘 몰라요)&amp;nbsp;&lt;/p&gt;</description>
      <category>모각코</category>
      <category>fine tuning</category>
      <category>모각코</category>
      <author>pengine</author>
      <guid isPermaLink="true">https://pengine.tistory.com/12</guid>
      <comments>https://pengine.tistory.com/12#entry12comment</comments>
      <pubDate>Mon, 12 Jan 2026 15:49:49 +0900</pubDate>
    </item>
    <item>
      <title>[2026 동계 모각코] 2회차 활동 결과 - Transformer 제대로 이해하기</title>
      <link>https://pengine.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;활동 목표: 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;활동 결과:&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;b&gt;1. 개요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 transformer에 대해 배경, 개념 등을 설명하기보다는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;transformer의 구조를 보면서 각각 어떤 process를 거치는지 파헤쳐 보도록 하겠다.&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;b&gt;2. transformer 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;transformer 하면 바로 떠오르는 이미지는 &quot;Attention Is All You Need&quot; 라는 매우 유명한 논문의 아키텍쳐이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;805&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bodrQo/dJMcahb01GG/3EzQuX0rJONKM1UEqk4vM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bodrQo/dJMcahb01GG/3EzQuX0rJONKM1UEqk4vM1/img.png&quot; data-alt=&quot;transformer architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bodrQo/dJMcahb01GG/3EzQuX0rJONKM1UEqk4vM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbodrQo%2FdJMcahb01GG%2F3EzQuX0rJONKM1UEqk4vM1%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;613&quot; height=&quot;805&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;805&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;transformer architecture&lt;/figcaption&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.1. Embedding과 Positional Encoding&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding이란 무엇인가?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk4y8j/dJMcahpzWlP/lsamsBzUfOlwuXRTYiOydK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk4y8j/dJMcahpzWlP/lsamsBzUfOlwuXRTYiOydK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk4y8j/dJMcahpzWlP/lsamsBzUfOlwuXRTYiOydK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk4y8j%2FdJMcahpzWlP%2FlsamsBzUfOlwuXRTYiOydK%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;578&quot; height=&quot;315&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;315&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;&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;따라서 벡터의 내적을 진행한 뒤 크기로 나누면 코사인 값이 나오게 되는데, 각도가 작을수록 이 값이 1에 가깝고 반대 방향일 경우 값이 -1이 나온다. 이를 코사인 유사도라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Positional Encoding이란 단어의 위치 정보를 알려주는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단어마다 인덱스를 부여하는 방식을 떠올릴 수 있는데 이 방법은 학습했던 값보다 인덱스가 커지면 모델의 일반화 성능에 문제가 생긴다. 그래서 이를 0과 1 사이로 정규화한다면 각 인덱스 값의 차이가 input의 크기에 따라 달라져 문제가 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 positional embedding은 다음과 같은 방식으로 문제를 해결한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lc3oa/dJMcabJFps2/GTZkok1NvUkMHbwzBnlHok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lc3oa/dJMcabJFps2/GTZkok1NvUkMHbwzBnlHok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lc3oa/dJMcabJFps2/GTZkok1NvUkMHbwzBnlHok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flc3oa%2FdJMcabJFps2%2FGTZkok1NvUkMHbwzBnlHok%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;429&quot; height=&quot;98&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 유지하며 인덱스 값의 차이를 phase를 도입하며 일정하게 유지시키는 방식을 사용한다.&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;b&gt;2.2. 인코더&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 인코더의 multi-head-attention으로 들어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 이해하기 이전에 attention에 대한 이해가 선행적으로 필요하다.&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.2.1. Scaled Dot-Product Attention&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;331&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AZGXF/dJMcad1IrQv/rTMFHbJJ8mosvAkHf2rjcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AZGXF/dJMcad1IrQv/rTMFHbJJ8mosvAkHf2rjcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AZGXF/dJMcad1IrQv/rTMFHbJJ8mosvAkHf2rjcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAZGXF%2FdJMcad1IrQv%2FrTMFHbJJ8mosvAkHf2rjcK%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;331&quot; height=&quot;419&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q, K, V는 입력 문장에 대한 단어 벡터로 이들의 유사도를 통해 어떤 단어에 집중할지를 결정한다.&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;Q, K, V는 모든 입력 문장에 대한 정보이며, Q가 의미하는 바는 t 시점 단어의 정보이고 K는 전체 시점 단어의 정보, V는 전체 시점 단어의 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Q와 K를 내적해 t시점에 유사한 단어의 의미를 찾아 V와 내적을 통해 가중치의 합을 구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 attention 매커니즘에 scaling과 masking을 추가한 것이 Scaled Dot-Product Attention 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서의 masking은 의미가 없는 토큰(padding)을 masking하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후 나올 Masked Multi-Head Attention에서의 masking과 헷갈릴 수 있기에 부연설명하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scaleing은 아래 root(d_k)로, softmax로 들어가기 전의 값을 조절해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kZWQp/dJMcagKYdc8/WgdZPTfKt2aGkziji8Af8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kZWQp/dJMcagKYdc8/WgdZPTfKt2aGkziji8Af8K/img.png&quot; data-alt=&quot;Scaled Dot-Product Attention&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kZWQp/dJMcagKYdc8/WgdZPTfKt2aGkziji8Af8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkZWQp%2FdJMcagKYdc8%2FWgdZPTfKt2aGkziji8Af8K%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;791&quot; height=&quot;272&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Scaled Dot-Product Attention&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2.2.2.&amp;nbsp;Multi-Head Attention&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multi - Head Attention은 위에서 진행한 Scaled Dot-Product Attention 과정을 여러 개의 head로 나누어 독립적으로 진행하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 개의 head로 나누어 Scaled Dot-Product Attention을 진행하면 더욱 풍부한 정보를 획득할 수 있다.&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;2.2.3 Add &amp;amp; Norm &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Add 는 residual connection 을 의미한다. 이는 입력과 출력을 더해주는 것으로 성능 저하를 막아준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Norm 은 이 더해진 값을 다시 정규화해 다음 입력으로 넘겨준다.&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.2.4. Feed Forward&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Feed Forward 는 차원을 늘려 활성화 함수를 거치고 다시 차원을 내려서 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 정보의 손실을 막기 위해 차원을 늘리고 낮추는 과정을 진행하는 것으로 이해하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 다시 Add &amp;amp; Norm 을 거쳐 인코더에서 나오게 된다.&lt;/p&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;b&gt;2.3. 디코더&lt;/b&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;Outputs(shifted right)는 shifted right를 통해 output의 이전 단어를 보고 다음 단어를 예측한다.&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.3.1. Masked Multi-Head Attention&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Masked Multi-Head Attention은 Multi-Head Attention에 t 시점 이후는 정보를 지워(mask) 현재 시점 이후를 모르는 상태로 학습을 진행하는 것이다.&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;b&gt;2.3.2. Cross Attention&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아키텍쳐에 Cross Attention이라는 단어가 없는데요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분이 Cross Attention이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ltUsw/dJMcafZzWtA/PWQO5wSNr9U7GYKbfZi6c1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ltUsw/dJMcafZzWtA/PWQO5wSNr9U7GYKbfZi6c1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ltUsw/dJMcafZzWtA/PWQO5wSNr9U7GYKbfZi6c1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FltUsw%2FdJMcafZzWtA%2FPWQO5wSNr9U7GYKbfZi6c1%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;471&quot; height=&quot;156&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;156&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;Corss Attention은 인코더에서 나온 Q, K, V와 디코더에서 계산 중인 Q, K, V를 연결해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cross Attention에서의 Attention 연산은 인코더의 K, V값을 가져와 디코더의 Q를 사용해 계산한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리하여 인코더에서(전체 문장, 이전 단어에서)의 K, V를 가져와 mask한 디코더의 Q와 Attention을 진행하는 것이다.&lt;/p&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;b&gt;2.4. Linear, Softmax&lt;/b&gt;&lt;/h4&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.4.1. Linear Layer&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linear는 디코더에서 나온 output vector를 Logit vector로 변환시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서의 Logit vector는 output vector를 단어들에 대한 확률값으로 변환한 vector이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이 과정을 unembedding이라고도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unembedding matrix와의 행렬곱을 통해 vocab의 단어들과의 유사도를 구하는 것이다.&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.4.2. Softmax와 temperature&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 유사도를 softmax를 거쳐 확률값으로 변환해 가장 높은 확률을 출력&amp;hellip;하는 것이 아니라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;temperature에 따라 temperature가 낮을수록 높은 확률을 더 높게, 낮은 확률을 더 낮게 만들고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;temperature가 높을수록 높은 확률을 낮게, 낮은 확률은 상대적으로 높아지게 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;temperature이라는 하이퍼파라미터를 통해 생성의 무작위성을 정할 수 있는 것이다.&lt;/p&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;/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;transformer를 인공지능에 대한 지식이 없는 사람도 알 수 있는 글을 써보고 싶었는데 이번 글은 엉망진창이다&amp;hellip;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후 여러 개의 글로 transformer를 정리해서 올려보도록 하겠다.&lt;/p&gt;</description>
      <category>모각코</category>
      <category>transformer</category>
      <category>모각코</category>
      <author>pengine</author>
      <guid isPermaLink="true">https://pengine.tistory.com/11</guid>
      <comments>https://pengine.tistory.com/11#entry11comment</comments>
      <pubDate>Wed, 7 Jan 2026 02:56:42 +0900</pubDate>
    </item>
    <item>
      <title>[2026 동계 모각코] 1회차 활동 결과 - 인공지능 코드 실습하기</title>
      <link>https://pengine.tistory.com/10</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;활동 목표: 인공지능 코드 실습하기(Qwen from Huggingface)&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;활동 결과:&lt;/b&gt;&lt;/h3&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;b&gt;1. 개요&lt;/b&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;위 활동의 진짜 목표는 &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;b&gt;2. 모델 분석하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 사용할 모델은 Qwen3-0.6B 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 하나하나 뜯어보자!&lt;/p&gt;
&lt;pre class=&quot;capnproto&quot;&gt;&lt;code&gt;from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = &quot;Qwen/Qwen3-0.6B&quot;&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;b&gt;2.1. load the tokenizer and the model&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=&quot;auto&quot;,
    device_map=&quot;auto&quot;
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 이 코드에서 볼 내용은 Auto Class이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Auto Class는 특정 모델의 아키텍쳐, 체크포인트(모델 가중치), 규칙 등의 파일을 동일한 코드로 불러올 수 있도록 해 주는 것이다.위 코드에서는 AutoTokenizer, AutoModelForCausalLM이 사용된다. 이 두 가지에 대해 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AutoTokenizer &amp;rarr; text to token 에 필요한 것들을을 자동으로 로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 AutoTokenizer가 로드하는 것들:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tokenizer_config.json&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 토큰 설정 값(규격, 특수 토큰 등) &amp;lt;- 2.2에서 추가 설명&lt;/li&gt;
&lt;li&gt;vocab.json&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;# 단어와 숫자가 매핑되어있는 vocab 로드&lt;/li&gt;
&lt;li&gt;merges.txt&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;# 글자 결합 규칙(BPE 라는 알고리즘을 이용하여 lowest를 l o w e s t로 쪼갠 뒤 low est로 분리함) 로드&lt;/li&gt;
&lt;li&gt;tokenizer.json&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 단어를 쪼개고 합친 뒤, vocab에서 합쳐진 단어를 찾아 숫자로 토큰화시키는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tokenizer_config.json 은 다음과 같은 형를 띈다.&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;694&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tG29b/dJMcagKWevI/jGmEd3Nqhk1tRYKiCrop4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tG29b/dJMcagKWevI/jGmEd3Nqhk1tRYKiCrop4K/img.png&quot; data-alt=&quot;Qwen의 tokenizer_config.json&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tG29b/dJMcagKWevI/jGmEd3Nqhk1tRYKiCrop4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtG29b%2FdJMcagKWevI%2FjGmEd3Nqhk1tRYKiCrop4K%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;694&quot; height=&quot;829&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Qwen의 tokenizer_config.json&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;그 다음으로 AutoModelForCasualLM이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AutoModelForCasualLM &amp;rarr; 모델 로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 AutoModelForCasualLM이 로드하는 것들:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;model.safetensors&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;generation_config.json&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 모델의 가중치 로드(from_pretrained())&lt;/p&gt;
&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;AutoClass를 통해 간편하게 모델에 맞는 파일을 한 번에 로드할 수 있게 되었다!&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.2. prepare the model input&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767271484420&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;prompt = &quot;Give me a short introduction to large language model.&quot;
messages = [
    {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
    enable_thinking=True
)
model_inputs = tokenizer([text], return_tensors=&quot;pt&quot;).to(model.device)&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;위 코드에서 살펴볼 내용은 apply_chat_template()이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 그 위부터 보자면, 프롬프트를 role, content로 정의된 딕셔너리에 content로 넣는다. 그런 messages를 apply_chat_template로 넘겨준다.&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;apply_chat_template는 위에서 보낸 프롬프트를 가공하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하이퍼파라미터를 통해 토큰화, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;special token 여부, 이 모델의 경우에는 추론 과정 여부를 결정하였다.&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;그리고 이 텍스트를 토큰화시켜 모델이 처리하는 메모리와 같은 위치에 올려준다(.to(model.device))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 실행시킨 뒤 text를 출력시켜보면 다음과 같이 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767271870529&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(text)

-&amp;gt;&amp;gt;
&amp;lt;|im_start|&amp;gt;user \n Give me a short introduction to large language model.&amp;lt;|im_end|&amp;gt; \n &amp;lt;|im_start|&amp;gt;assistant&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;lt;|im_start|&amp;gt;와 같은 형식이 special token이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;special token이란 간단히 말해서 모델에게 신호를 전달해주는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 여기서부터 문장의 시작이다. 여기까지가 문장의 끝이다. 여기서부터 모델의 답변이다. 와 같은 신호를 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 토큰들은 앞에서 나온 tokenizer_config.json의 규칙에 따라 사용되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력된 text결과를 보면 또 익숙한 모습이 보이는데 바로 시작 토큰 바로 뒤에 있는 user이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 설정한 role: user가 여기에 나온다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 프롬프트가 끝난 뒤에 모델이 답변을 하는 위치에는 새로운 시작 토큰과 assistant라는 것이 보인다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기의 assistant가 바로 모델의 role이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;role은 여기에 없는 하나가 더 있는데 바로 system이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;user가 모델에 요청하는 프롬프트, assistent가 모델의 답변을 의미하면 system은 모델의 인격 설정과 같은 역할을 한다.&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.3 conduct text completion&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1767274371069&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=32768
)
output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()&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;앞의 text를 토큰화시킨 model_inputs을 통해 답변을 생성한다.&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;2.4. parsing thinking content&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767274686247&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try:
    # rindex finding 151668 (&amp;lt;/think&amp;gt;)
    index = len(output_ids) - output_ids[::-1].index(151668)
except ValueError:
    index = 0

thinking_content = tokenizer.decode(output_ids[:index], skip_special_tokens=True).strip(&quot;\n&quot;)
content = tokenizer.decode(output_ids[index:], skip_special_tokens=True).strip(&quot;\n&quot;)

print(&quot;thinking content:&quot;, thinking_content)
print(&quot;content:&quot;, 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추론 special token의 토큰화된 번호를 찾아 디코딩해 모델이 답변을 생성할 때 어떤 과정을 거쳤는지 자연어로 출력해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 프롬프트를 다음과 같이 변경한 뒤 추론 과정을 보면 매우 흥미롭다.&lt;/p&gt;
&lt;div style=&quot;background-color: #282a2c; color: #d4d4d4;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;prompt = &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Wgat is 5 + 12 * 25?.&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767275032857&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;thinking content: &amp;lt;think&amp;gt;
Okay, let's see. The question is 5 plus 12 times 25. Hmm, so I need to figure out the order of operations here. Wait, right, in math, when there's multiplication and addition, you usually do the multiplication first, right? So the order of operations is parentheses, exponents, multiplication and division, and then addition and subtraction. But in this case, there are no parentheses or exponents, so I guess I just need to do the multiplication first.

So the problem is 5 + 12 * 25. According to PEMDAS, multiplication comes before addition. So I should first calculate 12 multiplied by 25. Let me do that. 12 times 25... Well, 10 times 25 is 250, and 2 times 25 is 50, so adding those together gives 300. So 12 * 25 equals 300. Then I need to add 5 to that result. So 300 plus 5 is 305. 

Wait, let me double-check. Maybe I made a mistake with the multiplication. 12 times 25. Another way to think about it is 12 times 20 is 240, and 12 times 5 is 60, so adding them together gives 240 + 60 = 300. Yep, that's the same. Then adding 5 gives 305. 

Is there any chance I misread the problem? Let me check again. The original problem is 5 + 12 * 25. Yes, that's correct. So no parentheses or anything else. So the answer should be 305. I think that's right. I don't see any other steps here. Maybe if there were division or something else, but here it's straightforward. So I'm confident the answer is 305.
&amp;lt;/think&amp;gt;
content: 5 + 12 * 25  
First, perform the multiplication:  
12 * 25 = 300  

Then perform the addition:  
300 + 5 = 305  

**Answer:** 305&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;p data-ke-size=&quot;size16&quot;&gt;이 Qwen3-0.6B 모델은 추론 과정을 특화하여 매우 흥미로웠다.&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;참고자료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://huggingface.co/Qwen/Qwen3-0.6B&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/Qwen/Qwen3-0.6B&lt;/a&gt;&lt;/p&gt;</description>
      <category>모각코</category>
      <category>qwen3</category>
      <category>모각코</category>
      <author>pengine</author>
      <guid isPermaLink="true">https://pengine.tistory.com/10</guid>
      <comments>https://pengine.tistory.com/10#entry10comment</comments>
      <pubDate>Thu, 1 Jan 2026 22:48:29 +0900</pubDate>
    </item>
    <item>
      <title>[2026 동계 모각코] 모각코 활동 계획</title>
      <link>https://pengine.tistory.com/9</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목표&lt;/b&gt;&lt;/h2&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;transformer 제대로 배우기&lt;/li&gt;
&lt;li&gt;LG Aimers 강의 수강하기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;회차별 목표&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인공지능 코드 실습하기(Qwen from Huggingface)&lt;/li&gt;
&lt;li&gt;transformer 제대로 이해하기&lt;/li&gt;
&lt;li&gt;LG Aimers 강의 1차 정리&lt;/li&gt;
&lt;li&gt;LG Aimers 강의 2차 정리&lt;/li&gt;
&lt;li&gt;LG Aimers 강의 3차 정리&lt;/li&gt;
&lt;li&gt;LG Aimers 강의 마지막 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 LG Aimers라는 대회를 나가게 되었다!&lt;br /&gt;1월 2일부터 온라인 강의를 수강하고 2월부터 오프라인 해커톤에 나가게 될 예정이다.&lt;br /&gt;이제 인공지능학과 2학년이 되기에 인공지능에 관한 지식을 쌓기에 좋은 기회라고 생각한다!&lt;/p&gt;</description>
      <category>모각코</category>
      <category>모각코</category>
      <author>pengine</author>
      <guid isPermaLink="true">https://pengine.tistory.com/9</guid>
      <comments>https://pengine.tistory.com/9#entry9comment</comments>
      <pubDate>Thu, 1 Jan 2026 16:23:20 +0900</pubDate>
    </item>
    <item>
      <title>[2025 하계 모각코] 모각코 회고</title>
      <link>https://pengine.tistory.com/8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;C언어와 CS 기초를 배우기 위해 이번 모각코 활동에 참여하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 6회차를 회고하며 느낀 것들을 작성해보려고 한다.&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;1. C언어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C언어 관련해서는 아직 부족한 점이 너무 많은 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습 시간이 그렇게 많지 않다는 점도 있고 실제로 코드를 작성해본 것도 많지 않기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 C언어를 배우기 위해 스탭별로 메모리 관리, 포인터 등 여러 CS 개념을 학습하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C 언어를 통해 CS 기초를 배운다는 취지는 매우 성공적인 것 같다.&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. CS 기초&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 CS 기초에 대해 거의 문외한이라고 해도 될 정도로 모르고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고등학교때 단지 인공지능에 관심이 있고 코딩도 어느정도 배운 것 뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩도 C를 배울 생각은 안해서 CS 기초에 대해 접할 기회도 별로 없었고 관심도 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 이번에 C를 통해 CS 기초를 배우면서 시야가 점점 넓어지는 것을 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 메모리 관리에 대해서는 python에서도 메모리를 관리하여 쓸 수 있다는 것을 알게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 CS기초에 대한 중요성을 깨닫게 되어 앞으로도 CS 지식을 통해 전공을 더욱 깊이 배워나가야겠다고 생각했다.&lt;/p&gt;
&lt;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;대학교에 오고 여러 활동을 하면서 CS기초에 대해 배워야겠다는 생각을 많이 했다.&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;</description>
      <category>모각코</category>
      <author>pengine</author>
      <guid isPermaLink="true">https://pengine.tistory.com/8</guid>
      <comments>https://pengine.tistory.com/8#entry8comment</comments>
      <pubDate>Sun, 17 Aug 2025 22:26:53 +0900</pubDate>
    </item>
    <item>
      <title>[2025 하계 모각코] 6회차 활동 결과 - 운영체제와 운영체제의 구조</title>
      <link>https://pengine.tistory.com/7</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;활동 목표: 운영체제 학습&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;활동 결과:&lt;/b&gt;&lt;/h3&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;b&gt;1. 운영체제&lt;/b&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;size18&quot;&gt;&lt;b&gt;1.1. 운영체제란&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제(Operating System)는 컴퓨터 시스템의 핵심적인 소프트웨어로 컴퓨터의 하드웨어를 관리해주는 역할을 한다.&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;1.2. 운영체제의 종류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제의 종류로는 시장에 따라 임베디드, 서버, 모바일, 데스크탑 으로 나뉘어져 있으며 Windows, Linux, Unix를 보편적으로 사용한다.&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;1280&quot; data-origin-height=&quot;919&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vkNXE/btsPB13meP6/4u60eLJNm18LzakROfCFS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vkNXE/btsPB13meP6/4u60eLJNm18LzakROfCFS0/img.png&quot; data-alt=&quot;출처: https://btcd.tistory.com/100&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vkNXE/btsPB13meP6/4u60eLJNm18LzakROfCFS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvkNXE%2FbtsPB13meP6%2F4u60eLJNm18LzakROfCFS0%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;919&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;919&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://btcd.tistory.com/100&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;Unix는 C언어 기반으로 Windows를 제외한 거의 모든 운영체제를 포괄하고 있다. 대표적으로 macOS, Linux가 있다.&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;Windows는 편의성으로 인해 가장 높은 점유율을 가지고 있다. 그러나 Unix계열이 아니기에 개발용으로 쓰기 힘들다. 이를 위해 WSL(Windows Subsystem for Linux)라는 시스템을 사용해 윈도우 내부에서 리눅스 우분투 등을 사용할 수 있게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux는 모바일 운영체제인 안드로이드, iOS가 Linux 커널 기반으로 만들어져있다.&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;size18&quot;&gt;&lt;b&gt;1.3. 커널(kernel)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1.4. 운영체제의 구조&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;330&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PhfuZ/btsPEPnef2p/XBQOl1NrEctrAic0OIQBgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PhfuZ/btsPEPnef2p/XBQOl1NrEctrAic0OIQBgK/img.png&quot; data-alt=&quot;출처: https://rlaehddnd0422.tistory.com/152&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PhfuZ/btsPEPnef2p/XBQOl1NrEctrAic0OIQBgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPhfuZ%2FbtsPEPnef2p%2FXBQOl1NrEctrAic0OIQBgK%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;330&quot; height=&quot;301&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://rlaehddnd0422.tistory.com/152&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제의 구조는 인터페이스, System Call, 커널, 드라이버로 구성되어 있다.&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;1.4.1. 인터페이스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GUI 혹은 CUI(CLI)로 되어 있다. 이를 통해 사용자가 운영체제와 상호작용할 수 있다.&lt;/p&gt;
&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.4.2. System Call&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;운영체제에서는 시스템 자원에 무분별하게 접근하는 것을 막기 위해 커널 모드와 사용자 모드(User-mode)를 구분하는데,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제한이 있는 사용자 모드에서 System Call 을 호출하여 하드웨어에 직접 접근할 수 있는 커널 모드로 전환하여 커널이 요청을 받아 처리하고 다시 사용자 모드로 전환된다.&lt;/p&gt;
&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.4.3. 커널&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;1.4.4. 드라이버&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드라이버는 하드웨어를 제어하고 운영체제와 상호작용할 수 있도록 하는 소프트웨어이다.&lt;/p&gt;</description>
      <category>모각코</category>
      <author>pengine</author>
      <guid isPermaLink="true">https://pengine.tistory.com/7</guid>
      <comments>https://pengine.tistory.com/7#entry7comment</comments>
      <pubDate>Thu, 31 Jul 2025 20:21:17 +0900</pubDate>
    </item>
  </channel>
</rss>