<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>폐관수련</title>
        <link>https://velog.io/</link>
        <description>LLM Safety 일짱이 되겠다.</description>
        <lastBuildDate>Thu, 09 Apr 2026 06:54:32 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>폐관수련</title>
            <url>https://velog.velcdn.com/images/beaver_zip/profile/09be0489-4a1e-49da-a28e-07bf158cdf12/image.webp</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 폐관수련. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/beaver_zip" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[되는게없을때]]></title>
            <link>https://velog.io/@beaver_zip/%EB%90%98%EB%8A%94%EA%B2%8C%EC%97%86%EC%9D%84%EB%95%8C</link>
            <guid>https://velog.io/@beaver_zip/%EB%90%98%EB%8A%94%EA%B2%8C%EC%97%86%EC%9D%84%EB%95%8C</guid>
            <pubDate>Thu, 09 Apr 2026 06:54:32 GMT</pubDate>
            <description><![CDATA[<p><a href="https://youtube.com/playlist?list=PLjcc5TacvgdaQ-gtZpTcWwRSUXUecvHI0&amp;si=Bmkn8oa41TeEXxvG">https://youtube.com/playlist?list=PLjcc5TacvgdaQ-gtZpTcWwRSUXUecvHI0&amp;si=Bmkn8oa41TeEXxvG</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Correlation, Agreement]]></title>
            <link>https://velog.io/@beaver_zip/Correlation-Agreement</link>
            <guid>https://velog.io/@beaver_zip/Correlation-Agreement</guid>
            <pubDate>Tue, 24 Mar 2026 14:54:38 GMT</pubDate>
            <description><![CDATA[<h3 id="들어가며">들어가며</h3>
<p>여러 평가자가 동일한 대상을 평가할 때, 그 결과의 신뢰성을 측정하는 지표는 크게 두 범주로 나뉜다.</p>
<ul>
<li><strong>Correlation (상관관계)</strong>: 점수가 같은 방향으로 움직이는지를 측정</li>
<li><strong>Agreement (일치도)</strong>: 점수의 절대값이 실제로 같은지를 측정</li>
</ul>
<p>혼동되는 경우가 있지만, 두 지표는 측정하는 것이 다르다.</p>
<hr>
<h2 id="correlation-상관관계">Correlation (상관관계)</h2>
<p>두 평가자의 점수가 함께 변하는 정도를 측정한다. 
절대값이 같을 필요 없이, 변화의 방향만 일치하면 된다.</p>
<h3 id="pearsons-r">Pearson&#39;s r</h3>
<p>두 변수 간 <strong>선형 관계</strong>의 강도를 측정한다. 범위는 -1 ~ +1이다.</p>
<pre><code>e.g., A: [1, 2, 3], B: [2, 4, 6]       → B = 2A, 완벽한 선형 → r = 1.0
e.g., A: [1, 2, 3], B: [2, 5, 4]       → 선형 관계 깨짐     → r &lt; 1
e.g., A: [1, 2, 3], B: [101, 102, 103] → 스케일만 다름      → r = 1.0</code></pre><p>비례 관계만 보기 때문에 스케일 차이에 둔감하다. 
두 점수 세트의 절대값이 완전히 달라도 r = 1.0이 나올 수 있다.</p>
<h3 id="spearmans-ρ">Spearman&#39;s ρ</h3>
<p>값 자체가 아닌 <strong>순위(rank)</strong> 간의 대소 관계를 측정한다.
선형일 필요 없이, &quot;하나가 크면 다른 것도 크다&quot;는 관계만 성립하면 높은 ρ를 얻는다. 범위는 -1 ~ +1이다.</p>
<pre><code>e.g., A: [1, 3, 5], B: [10, 20, 30] → 값 차이는 크지만 순서 동일 → ρ = 1.0
e.g., A: [1, 2, 3], B: [1, 3, 2]    → 2번째와 3번째 순위 역전   → ρ &lt; 1</code></pre><p>순위 기반이라 이상치(outlier)에 강건하다. 
Pearson&#39;s r이 값의 선형 비례를 요구하는 반면, Spearman&#39;s ρ는 순서만 보존되면 된다.</p>
<h3 id="kendalls-τ">Kendall&#39;s τ</h3>
<p>가능한 모든 관측값 쌍에 대해 순서의 일치/불일치를 세어 비율로 산출한다. 범위는 -1 ~ +1이다.</p>
<pre><code>e.g., A = [1, 2, 3], B = [1, 3, 2]인 경우:
  (1, 2): A에서 1 &lt; 2, B에서 1 &lt; 3 → 일치
  (1, 3): A에서 1 &lt; 3, B에서 1 &lt; 2 → 일치
  (2, 3): A에서 2 &lt; 3, B에서 3 &gt; 2 → 불일치
  → τ = (2 − 1) / 3 ≈ 0.33</code></pre><p>쌍 단위 비교이므로 Spearman&#39;s ρ보다 보수적이다. 동일 데이터에서 일반적으로 |τ| ≤ |ρ|이 성립한다.</p>
<h3 id="정리">정리</h3>
<p align="center">

<table>
<thead>
<tr>
<th>지표</th>
<th>비교 대상</th>
<th>관계 유형</th>
<th>이상치 민감도</th>
</tr>
</thead>
<tbody><tr>
<td>Pearson&#39;s r</td>
<td>값 자체</td>
<td>선형</td>
<td>높음</td>
</tr>
<tr>
<td>Spearman&#39;s ρ</td>
<td>순위</td>
<td>대소 관계 (순서 보존)</td>
<td>낮음</td>
</tr>
<tr>
<td>Kendall&#39;s τ</td>
<td>쌍의 순서</td>
<td>순위 일치율</td>
<td>낮음</td>
</tr>
</tbody></table>
</p>

<hr>
<h2 id="agreement-일치도">Agreement (일치도)</h2>
<p>여러 평가자가 동일한 대상에 대해 실제로 같은 점수를 부여하는지를 측정한다. Correlation과 달리, 점수의 절대값이 같아야 한다.</p>
<p>아래 지표들은 모두 <strong>우연에 의한 일치를 보정</strong>한다는 공통점이 있다. 이진 분류에서 두 평가자가 무작위로 응답해도 약 50%는 우연히 일치할 수 있는데, 단순 일치율(percent agreement)은 이를 구분하지 못한다. κ나 α 계열은 이 우연적 일치를 제거한다.</p>
<h3 id="cohens-κ">Cohen&#39;s κ</h3>
<p><strong>2명</strong>의 평가자가 범주형 레이블을 부여할 때의 일치도를 측정한다.</p>
<p>$$\kappa = \frac{p_o - p_e}{1 - p_e}$$</p>
<ul>
<li>$p_o$: 관찰된 일치 비율</li>
<li>$p_e$: 우연에 의해 기대되는 일치 비율</li>
<li>분자: 우연을 넘어선 실제 일치</li>
<li>분모: 우연을 넘어서 일치할 수 있는 최대 여지</li>
</ul>
<pre><code>e.g., 두 의사가 50명의 환자를 &quot;우울증 / 비우울증&quot;으로 분류한다.
  - 40명에 대해 같은 진단 → p_o = 0.80
  - p_e = 0.50인 경우 → κ = (0.80 − 0.50) / (1 − 0.50) = 0.60
  - p_e = 0.64인 경우 → κ = (0.80 − 0.64) / (1 − 0.64) ≈ 0.44
  → 같은 80% 일치율이어도, 우연의 기댓값이 높을수록 κ는 낮아진다.</code></pre><p><strong>해석 기준</strong> (Landis &amp; Koch, 1977):</p>
<p align="center">

<table>
<thead>
<tr>
<th>κ 범위</th>
<th>해석</th>
</tr>
</thead>
<tbody><tr>
<td>≤ 0</td>
<td>일치 없음 (Poor)</td>
</tr>
<tr>
<td>0.01 – 0.20</td>
<td>미미 (Slight)</td>
</tr>
<tr>
<td>0.21 – 0.40</td>
<td>보통 (Fair)</td>
</tr>
<tr>
<td>0.41 – 0.60</td>
<td>중간 (Moderate)</td>
</tr>
<tr>
<td>0.61 – 0.80</td>
<td>상당 (Substantial)</td>
</tr>
<tr>
<td>0.81 – 1.00</td>
<td>거의 완벽 (Almost Perfect)</td>
</tr>
</tbody></table>
</p>

<p>※ 이 기준은 근거 없이 제안된 것이므로 참고용으로만 사용한다.</p>
<p><strong>제한</strong>:</p>
<ul>
<li>2명의 평가자에 대해서만 정의된다.</li>
<li>순서형 데이터에서 1점 차이와 4점 차이를 동일한 불일치로 처리한다. → 이를 보완한 <strong>Weighted Cohen&#39;s κ</strong>가 있다.</li>
</ul>
<h3 id="fleiss-κ">Fleiss&#39; κ</h3>
<p>Cohen&#39;s κ의 &quot;2명 한정&quot; 제약을 해결한 지표로, <strong>3명 이상</strong>의 평가자에 대한 범주형 일치도를 측정한다.</p>
<pre><code>e.g., 14명의 정신과 의사가 30명의 환자를 5가지 진단 범주로 분류할 때,
     14명 전체의 일치도를 하나의 수치로 요약할 수 있다.</code></pre><p>이름 때문에 Cohen&#39;s κ의 다중 평가자 버전처럼 보이지만, 실제로는 <strong>Scott&#39;s π의 일반화</strong>이다.</p>
<ul>
<li>Cohen&#39;s κ: 각 평가자의 개별 레이블 분포를 고려하여 $p_e$를 계산</li>
<li>Fleiss&#39; κ: 전체 평가자의 평균 분포로 $p_e$를 추정</li>
</ul>
<h3 id="krippendorffs-α">Krippendorff&#39;s α</h3>
<p>κ 계열의 제약들을 한 번에 해결한 범용 지표이다.</p>
<p>$$\alpha = 1 - \frac{D_o}{D_e}$$</p>
<ul>
<li>$D_o$: 관찰된 불일치</li>
<li>$D_e$: 기대 불일치</li>
<li>α = 1이면 완벽한 일치, α = 0이면 우연 수준, α &lt; 0이면 체계적 불일치</li>
</ul>
<p>κ 계열이 일치(agreement) 기반인 것과 달리, α는 불일치(disagreement) 기반으로 계산한다.</p>
<p><strong>κ 계열 대비 장점</strong>:</p>
<ul>
<li>평가자 수에 제한 없음</li>
<li>결측치 처리 가능 (모든 평가자가 모든 항목을 평가하지 않아도 됨)</li>
<li>명목형, 순서형, 등간형, 비율형 등 다양한 측정 수준에 적용 가능</li>
</ul>
<p><strong>해석 기준</strong>:</p>
<p align="center">

<table>
<thead>
<tr>
<th>α 범위</th>
<th>해석</th>
</tr>
</thead>
<tbody><tr>
<td>α ≥ 0.800</td>
<td>신뢰할 수 있는 수준</td>
</tr>
<tr>
<td>0.667 ≤ α &lt; 0.800</td>
<td>잠정적 결론 가능</td>
</tr>
<tr>
<td>α &lt; 0.667</td>
<td>신뢰하기 어려움</td>
</tr>
</tbody></table>
</p>

<h3 id="정리-1">정리</h3>
<p align="center">

<table>
<thead>
<tr>
<th>지표</th>
<th>평가자 수</th>
<th>데이터 유형</th>
<th>결측치 처리</th>
<th>우연 보정</th>
</tr>
</thead>
<tbody><tr>
<td>Cohen&#39;s κ</td>
<td>2명</td>
<td>명목형 (Weighted κ로 순서형 확장)</td>
<td>✗</td>
<td>✓</td>
</tr>
<tr>
<td>Fleiss&#39; κ</td>
<td>3명 이상</td>
<td>명목형</td>
<td>✗</td>
<td>✓</td>
</tr>
<tr>
<td>Krippendorff&#39;s α</td>
<td>2명 이상</td>
<td>명목/순서/등간/비율</td>
<td>✓</td>
<td>✓</td>
</tr>
</tbody></table>
</p>

<hr>
<h2 id="correlation--agreement">Correlation != Agreement</h2>
<p>세 평가자가 동일한 3개 대상을 평가한 결과이다.</p>
<p align="center">

<table>
<thead>
<tr>
<th>대상</th>
<th>평가자 A</th>
<th>평가자 B</th>
<th>평가자 C</th>
</tr>
</thead>
<tbody><tr>
<td>#1</td>
<td>1</td>
<td>3</td>
<td>5</td>
</tr>
<tr>
<td>#2</td>
<td>2</td>
<td>4</td>
<td>6</td>
</tr>
<tr>
<td>#3</td>
<td>3</td>
<td>5</td>
<td>7</td>
</tr>
</tbody></table>
</p>

<ul>
<li>세 평가자 모두 #1 &lt; #2 &lt; #3의 순서를 매기고 있다. → <strong>Spearman ρ = 1.0</strong></li>
<li>대상 #1에 대해 A는 1점, B는 3점, C는 5점이다. → <strong>Krippendorff α는 매우 낮음</strong></li>
</ul>
<p>Correlation은 높지만 Agreement 낮은 경우로, Corrleation과 Agreement는 서로 다른 지표임을 보여준다.</p>
<hr>
<h2 id="참고-자료">참고 자료</h2>
<ul>
<li>Cohen, J. (1960). A Coefficient of Agreement for Nominal Scales. <em>Educational and Psychological Measurement</em>, 20(1), 37-46.</li>
<li>Fleiss, J. L. (1971). Measuring Nominal Scale Agreement Among Many Raters. <em>Psychological Bulletin</em>, 76(5), 378-382.</li>
<li>Landis, J. R. &amp; Koch, G. G. (1977). The Measurement of Observer Agreement for Categorical Data. <em>Biometrics</em>, 33(1), 159-174.</li>
<li>Krippendorff, K. (2004). <em>Content Analysis: An Introduction to Its Methodology</em> (2nd ed.). Sage Publications.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[CheckEval: A reliable LLM-as-a-Judge framework for evaluating text generation using checklists]]></title>
            <link>https://velog.io/@beaver_zip/CheckEval-A-reliable-LLM-as-a-Judge-framework-for-evaluating-text-generation-using-checklists</link>
            <guid>https://velog.io/@beaver_zip/CheckEval-A-reliable-LLM-as-a-Judge-framework-for-evaluating-text-generation-using-checklists</guid>
            <pubDate>Tue, 24 Mar 2026 09:56:27 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>EMNLP 2025 [<a href="https://arxiv.org/abs/2403.18771">Paper</a>] [<a href="https://github.com/yukyunglee/CheckEval">Github</a>]
Yukyung Lee, Joonghoon Kim, Jaehee Kim, Hyowon Cho, Jaewook Kang, Pilsung Kang, Najoung Kim
Boston University · SK Telecom · Seoul National University · KAIST · NAVER
27 Mar 2024</p>
</blockquote>
<h2 id="introduction">Introduction</h2>
<p>자연어 생성(NLG) 태스크의 성능을 평가하는 것은 분류나 회귀 태스크와 달리 정량화가 어렵다. 전통적으로 BLEU, ROUGE, BERTScore 같은 어휘 중복 기반 지표가 널리 사용되었지만, 이들은 인간 평가와의 상관관계(correlation)가 낮다는 한계가 있다. 또한 Human Evaluation은 gold standard로 인정받지만 시간과 비용이 크게 소모된다. 이에 최근에는 LLM을 평가자로 활용하여 텍스트 품질을 자동으로 판단하는 <strong>LLM-as-a-Judge</strong>가 대안으로 주목받고 있다.</p>
<p>대표적인 LLM-as-a-Judge 프로토콜인 <a href="https://arxiv.org/abs/2303.16634">G-Eval</a>은 LLM에 평가 기준을 입력해 Auto-CoT로 평가 절차를 생성하고, 1~5점 Likert Scale 각 점수 토큰의 확률 분포를 기반으로 가중합을 계산해 최종 점수를 산출한다.</p>
<p align="center">
  <img src="https://velog.velcdn.com/images/beaver_zip/post/764fc391-3256-4794-ad92-94e4b6575028/image.png"
       style="padding: 0;margin:0;">
</p>


<p>G-Eval은 인간 평가와 높은 상관관계를 보이며, LLM이 고비용의 Human Annotation을 대체할 수 있는 가능성을 제시했다.</p>
<p>그런데, <strong>높은 상관관계(Correlation)가 높은 신뢰도(Reliability)를 보장할까?</strong></p>
<h2 id="motivation">Motivation</h2>
<p>기존 LLM-as-a-Judge 프로토콜에는 두 가지 한계가 있다.</p>
<p>첫째, <strong>Likert Scale의 인접 점수 간 경계가 모호하다.</strong> <code>Coherence를 1~5점으로 평가하세요</code>와 같은 평가 프롬프트가 주어질 때, 3점과 4점의 기준은 모델마다 다르게 해석된다. 또한 하나의 평가 차원(e.g., <code>Fluency</code>) 안에 여러 세부 기준(e.g., <code>formatting, grammar, readability, ...</code>)이 혼재되어 있어, 평가자마다 초점을 맞추는 기준이 달라진다. 이는 낮은 Inter-Evaluator Agreement(IEA, 평가자 간 일치도)와 높은 점수 분산으로 이어진다.</p>
<p>둘째, <strong>기존 연구들은 Reliability 지표에 대한 분석이 부재하다.</strong> LLM-as-a-Judge 연구 대부분이 인간 평가와의 Correlation만을 주요 지표로 사용하는데, Correlation이 높아도 모델 간 절대 점수가 서로 다를 수 있다. IEA나 Stability 같은 신뢰도 지표에 대한 체계적 분석이 필요하다.</p>
<blockquote>
<p><strong>주의할 점은, Correlation과 Agreement는 서로 다른 개념이라는 것이다.</strong>
두 개념에 대해서는 <a href="https://velog.io/@beaver_zip/Correlation-Agreement">이 글</a>에서 자세히 다룬다.</p>
</blockquote>
<h2 id="method-checkeval">Method: CheckEval</h2>
<p>CheckEval은 평가 기준을 <strong>Fine-grained Boolean Question</strong>으로 분해하여 평가하는 프레임워크다. 3단계 파이프라인으로 구성된다.</p>
<p align="center">
  <img src="https://velog.velcdn.com/images/beaver_zip/post/20069be1-25c9-4ee9-bc1b-6ce579169f4d/image.png"
       style="padding: 0;margin:0;">
</p>


<h3 id="stage-1-평가-차원-정의">Stage 1: 평가 차원 정의</h3>
<p align="center">
  <img src="https://velog.velcdn.com/images/beaver_zip/post/2c3f149
4-5011-4008-99ea-b8f3afd56cae/image.png"
       style="padding: 0;margin:0;" width=30%>
</p>


<p>먼저 평가할 <strong>Dimension</strong>을 선정한다. 기존 벤치마크의 정의를 채택하거나 Task에 맞게 직접 정의할 수 있다. 이후 각 Dimension을 <strong>Sub-dimension</strong>으로 분해한다. </p>
<p align="center">
  <img src="https://velog.velcdn.com/images/beaver_zip/post/7a359be1-f366-445f-8b91-7c94dce5a6a3/image.png"
       style="padding: 0;margin:0;">
</p>


<p>이때 Sub-dimension 정의는 <strong>LLM이 아닌 인간이 직접</strong> 수행한다. 실험 결과, Sub-dimenssion 생성을 LLM에게 맡기면 Dimension을 혼동하는 문제가 발생했으며, 이는 벤치마크의 원래 설계 의도와 어긋나 잘못된 평가 결과를 초래할 수 있기 때문이다.</p>
<h3 id="stage-2-체크리스트-생성">Stage 2: 체크리스트 생성</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/5ef1e320-203b-4632-91cb-0cb294c3d6d8/image.png" alt=""></p>
<p><strong>① Seed Question 작성</strong></p>
<p>앞서 정의한 각 Sub-dimension별로 Yes or No로 답변할 수 있는 질문을 한 개씩 작성한다. 반드시 인간이 작성하며, &quot;Yes&quot;가 높은 품질을 의미하도록 설계한다.</p>
<blockquote>
<p>e.g., </p>
</blockquote>
<ul>
<li>Task: Summarization</li>
<li>Dimension: Consistency</li>
<li>Sub-dimension: Factual Consistency<blockquote>
<p>→ Seed Question: *&quot;요약문이 원문의 사실을 정확하게 반영하고 있나요?&quot;*</p>
</blockquote>
</li>
</ul>
<p><strong>② Question Augmentation (LLM)</strong></p>
<p>Seed Question을 두 가지 전략으로 확장한다.</p>
<ul>
<li><strong>Diversification (다양화)</strong>: 같은 Sub-dimension을 다른 관점에서 평가하는 질문을 생성한다. 평가의 <em>폭</em>을 넓히는 것이 목적이다.<ul>
<li>Seed: &quot;문장 속 단어들의 철자가 모두 정확한가?&quot; 
→ Diversification: &quot;모든 문장이 완전하며, 불완전하거나 빠진 요소가 없는가?&quot;</li>
</ul>
</li>
<li><strong>Elaboration (정교화)</strong>: Seed Question을 더 구체적으로 분해한다. 평가의 <em>깊이</em>를 높이는 것이 목적이다.<ul>
<li>Seed: &quot;문장 속 단어들의 철자가 모두 정확한가?&quot; 
→ Elaboration: &quot;고유명사(사람, 장소 등의 이름)의 철자가 올바른가?&quot;</li>
</ul>
</li>
</ul>
<p>두 전략을 순차로 적용하면 원래 Seed Question의 의도에서 멀어질 수 있으므로, <strong>독립적으로 수행</strong>한다.</p>
<p><strong>③ Question Filtering (LLM)</strong></p>
<p>3가지 기준으로 부적절한 질문을 제거한다.</p>
<ul>
<li><strong>Alignment (정합성)</strong>: &quot;Yes&quot; 응답이 높은 품질을 의미하는가?</li>
<li><strong>Dimension Consistency (차원 일관성)</strong>: 해당 질문이 의도한 차원을 실제로 측정하고 있는가?</li>
<li><strong>Redundancy Removal (중복 제거)</strong>: 의미적으로 겹치는 질문을 제거한다.</li>
</ul>
<h3 id="stage-3-체크리스트-기반-평가">Stage 3: 체크리스트 기반 평가</h3>
<p align="center">
  <img src="https://velog.velcdn.com/images/beaver_zip/post/12cca06e-1d87-4c8b-a975-320fadcb4540/image.png"
       style="padding: 0;margin:0;">
</p>

<p>LLM이 Checklist의 각 질문에 Yes or No로 응답한다. 비용 효율을 위해 Sub-dimension별로 여러 질문을 한 번에 제시한다. (파일럿 실험에서 개별로 질문을 제시했을 때와 큰 성능 차이가 없음을 확인했다.)</p>
<p><strong>최종 점수</strong>는 전체 질문 중 Yes 답변의 비율로 계산된다. 모든 질문에 동일한 가중치를 적용한다. (이와 관련해 Appendix C.2에서 다룬다.)</p>
<p>이 방식의 핵심 장점은 <strong>설명 가능성</strong>과 <strong>일관성</strong>이다. G-Eval과 같은 기존 LLM-as-a-Judge 프로토콜이 단순히 <code>Naturalness: 2</code>&quot;처럼 점수만 달랑 출력하는 것에 비해, CheckEval은 <code>&quot;반복이 없는가?: Yes&quot;, &quot;문법이 정확한가?: Yes&quot;, &quot;주제와 관련이 있는가?: No&quot;</code> 와 같이 점수의 근거를 바로 추적할 수 있다. 또한 Binary 응답으로 3점 vs 4점 같은 모호한 판단을 제거하여 모델 간 변동을 최소화한다.</p>
<h2 id="experimental-setup">Experimental Setup</h2>
<p><strong>데이터셋</strong>: SummEval (뉴스 요약), Topical-Chat (대화 응답), QAGS (사실 일관성)</p>
<p><strong>평가 모델 (12개)</strong>:</p>
<ul>
<li>Large (70~123B): Llama3.1-70B, Mistral-Large, Qwen2.5-72B</li>
<li>Medium (22~32B): Mistral-Small, Gemma2-27B, Qwen2.5-32B</li>
<li>Small (7~9B): Llama3.1-8B, Gemma2-9B, Qwen2.5-7B</li>
<li>GPT: GPT-4-Turbo, GPT-4o, GPT-4o-mini</li>
</ul>
<p><strong>비교 대상</strong>: G-Eval (CoT + Likert), SEEval (Self-Explanation + Likert), non-LLM metrics (ROUGE-L, BERTScore, BARTScore, UniEval)</p>
<p><strong>평가 지표</strong>: Correlation (Spearman ρ, Kendall τ, Pearson r), IEA (Krippendorff α, Fleiss κ), Stability (상관 분포의 평균/분산)</p>
<h2 id="results">Results</h2>
<h3 id="1-correlation-with-human-evaluation">1. Correlation with Human Evaluation</h3>
<p align="center">
  <img src="https://velog.velcdn.com/images/beaver_zip/post/42c34d1e-e410-4100-b962-38d3b4c2f6d4/image.png"
       style="padding: 0;margin:0;" width=50%>
</p>

<ul>
<li>12개 모델 중 대부분에서 CheckEval이 최고 Correlation을 달성함.</li>
<li>특히 <strong>소형 모델에서 개선 폭이 큼.</strong><ul>
<li>Llama3.1-8B: SummEval에서 ρ가 0.24(G-Eval) → 0.41(CheckEval)로 대폭 향상</li>
</ul>
</li>
<li>최고 성능은 Mistral-Large + CheckEval 조합<ul>
<li>SummEval ρ=0.55, Topical-Chat r=0.65를 기록했다.</li>
</ul>
</li>
</ul>
<h3 id="2-inter-evaluator-agreement-iea">2. Inter-Evaluator Agreement (IEA)</h3>
<p align="center">
  <img src="https://velog.velcdn.com/images/beaver_zip/post/eab19879-dc9d-4b33-a9fb-75f44d4fd439/image.png"
       style="padding: 0;margin:0;" width=50%>
</p>

<ul>
<li>G-Eval의 α=0.09, SEEval의 α=0.08은 사실상 우연 수준의 Agreement임.</li>
<li>반면 CheckEval은 α=0.48로, 평균 Agreement를 <strong>0.45 이상</strong> 향상함. </li>
<li>Large 모델 그룹에서는 α=κ=0.67<ul>
<li>이는 SummEval에서 보고한 인간 평가자 3명 간 일치도(κ≈0.7)와 거의 동등한 수준임.</li>
</ul>
</li>
<li>이는 단순히 출력 형식(binary vs Likert)의 차이에서 기인한 것이 아님을 Appendix C.3에서 검증함. <ul>
<li>G-Eval의 Likert 점수를 강제로 binary로 변환해도 IEA는 소폭만 개선됨. (0.09→0.11)</li>
<li>CheckEval (0.48)과의 격차가 여전히 압도적임.</li>
</ul>
</li>
</ul>
<h3 id="3-평가-안정성-분석-stability">3. 평가 안정성 분석 (Stability)</h3>
<p align="center">
  <img src="https://velog.velcdn.com/images/beaver_zip/post/d7885c82-5431-4256-9da4-94860726308d/image.png"
       style="padding: 0;margin:0;" width=50%>
</p>

<ul>
<li>(SummEval 데이터셋에서) CheckEval의 분산이 G-Eval 대비 약 5배 작음. (G-Eval 0.0100 vs CheckEval 0.0019) </li>
<li>즉, <strong>어떤 모델을 평가자로 선택하더라도 안정적으로 높은 상관과 낮은 분산을 유지</strong>함.</li>
<li>CheckEval은 IEA와 Stability 모두에서 G-Eval, SEEval을 상회함.<ul>
<li><strong>IEA</strong>: 동일 샘플에 대해 Evaluator Model 간 점수가 일치하는가?</li>
<li><strong>Stability</strong>: Evaluator Model을 바꿔도 인간과의 상관이 유지되는가?</li>
</ul>
</li>
</ul>
<h3 id="4-체크리스트-생성-품질-검증">4. 체크리스트 생성 품질 검증</h3>
<p align="center">
  <img src="https://velog.velcdn.com/images/beaver_zip/post/7b05bff5-626b-481d-8f81-726cbb823770/image.png"
       style="padding: 0;margin:0;" width=50%>
</p>

<ul>
<li>인간 평가자가 Augmentation과 Filtering 각 단계의 질문을 Yes/No로 직접 검증해봤음.<ul>
<li>Augmentation 단계에서 93~96%의 높은 점수를 기록함. </li>
<li>Filtering 단계(81<del>85%)에서는 Dimension당 1</del>2개 정도의 의미적 중복이 남아있다는 피드백이 있었음.</li>
</ul>
</li>
</ul>
<p align="center">
  <img src="https://velog.velcdn.com/images/beaver_zip/post/877fec43-680b-46e6-8792-5b81d9672107/image.png"
       style="padding: 0;margin:0;" width=50%>
</p>

<ul>
<li>이러한 중복을 추가로 제거해도 성능 변화가 거의 없었음. (SummEval ρ: 0.5486 → 0.5486)<ul>
<li>이는 CheckEval이 개별 질문 몇 개의 추가/제거에 민감하지 않고 robust하다는 것을 보여줌.</li>
</ul>
</li>
</ul>
<h3 id="5-checkeval-프로토콜-인간-검증">5. CheckEval 프로토콜 인간 검증</h3>
<p align="center">
  <img src="https://velog.velcdn.com/images/beaver_zip/post/f408b980-ca96-4a8d-b2e5-a6caa8e61557/image.png"
       style="padding: 0;margin:0;" width=50%>
</p>


<p>CheckEval 체크리스트를 인간이 직접 사용해도 LLM과 같은 판단을 이끌어낼 수 있는지 검증했다.</p>
<p><strong>Correlation 분석</strong></p>
<ul>
<li>3명의 인간 평가자가 동일 Checklist로 20개 요약을 평가했을 때, LLM(CheckEval) vs 인간(CheckEval) 간 ρ=0.72~0.73을 기록함.</li>
<li>인간(Likert) vs 인간(CheckEval) 간 ρ=0.69로, <strong>CheckEval 프로토콜을 사용한 LLM이 Likert Scale을 사용한 인간보다 더 높은 상관</strong>을 보임. </li>
<li>이는 평가 주체(인간 vs LLM)보다 <strong>평가 프로토콜(CheckEval vs Likert)이 더 큰 영향</strong>을 미친다는 것을 시사함.</li>
</ul>
<p><strong>Agreement 분석</strong></p>
<ul>
<li>Relevance 차원에서 100개 요약 × ~100개 질문을 평가한 결과, 인간 3명의 일치도 κ=0.53에서 LLM 3개를 추가해도 κ=0.49(-0.04)로 거의 하락하지 않았음.</li>
<li>CheckEval 프로토콜 하에서 인간 평가자를 LLM으로 대체할 수 있는 수준임을 확인함.</li>
</ul>
<h2 id="conclusion">Conclusion</h2>
<h3 id="contribution">Contribution</h3>
<ul>
<li>평가 기준을 세분화된 Yes/No 질문으로 분해하여 <strong>신뢰도(Reliability) 향상</strong></li>
<li>Large 모델에서 <strong>인간 평가자 수준의 Agreement</strong> 달성</li>
<li>평가 점수의 분산을 약 5배 감소시켜 <strong>안정성(Stability) 확보</strong></li>
<li>별도의 rationale 생성 없이도 개별 binary 질문의 응답으로 점수 근거를 추적할 수 있어 <strong>해석 가능성(Interpretability) 확보</strong></li>
</ul>
<h3 id="limitations">Limitations</h3>
<ul>
<li>Sub-dimension과 Seed Question은 사람이 직접 작성해야 하며, 새로운 Task에 적용할 때 소요되는 시간과 노력을 예측하기 어렵다.</li>
<li>Prompt 최적화, Multi-agent 토론, Meta-evaluator 훈련 등 최신 기법들과의 체계적 비교가 부재하며, 이들과 조합 가능한지 검증하지 않았다.</li>
<li>긴 텍스트에서 앞부분은 좋고 뒷부분은 나쁜 경우처럼, Yes/No 이진 판단으로는 부분적 품질 차이를 포착하기 어렵다.</li>
<li>실험이 요약과 대화 응답 생성에 집중되어 있어, 스토리 생성, 기계 번역, 장문 QA 등 다른 Task로의 일반화는 추가 검증이 필요하다.</li>
</ul>
<p>다만, 이미 essay scoring (Chu et al., 2025), creative writing evaluation (Lee et al., 2024), healthcare evaluation (Mallinar et al., 2025) 등 후속 연구에서 CheckEval이 다른 Task로 확장되고 있다는 점은 고무적이다.</p>
<hr>
<h2 id="comment">Comment</h2>
<p>여러모로 내게 의미 있는 논문이다.</p>
<p>최근 <a href="https://velog.io/@beaver_zip/Does-Liking-Yellow-Imply-Driving-a-School-Bus-Semantic-Leakage-in-Language-Models">Semantic Leakage</a> 논문의 후속 연구를 진행하면서, 내가 제안한 method의 평가 방식을 두고 고민이 많았다. Rubric 기반의 Likert Scale 평가를 시도했는데, 평가 모델 간 Agreement가 잘 나오지 않아 한동안 막혀 있었다.</p>
<p>그러던 와중에 랩실 세미나 발표 순서가 돌아왔고, 발표할 논문을 찾아 돌아다니다 DSBA 연구실 유튜브에 도달했다. 거기서 &quot;A reliable LLM-as-a-Judge framework for evaluating text generation ...&quot; 이라는 제목이 눈에 띄었고, Abstract와 Introduction을 읽어보니 나를 살려줄 논문이다 싶어 쭉 정독했다.</p>
<p>이 논문의 1저자가 네부캠 첫 멘토셨던 유경 멘토님이었다. 신이 존재하는 건지 유경님이 신인 건지 모르겠다. 논문을 성공적으로 완성하면 멘토님께 연락해서 감사 인사를 드리고 싶다.</p>
<p>세미나에서 30분 정도 발표했는데, 교수님께서 &#39;어떻게 저런 논문을 쓰는 거지&#39;라며 극찬하셨다. 개인적으로는 어떤 지적이 들어와도 방어할 수 있도록 Appendix에서 다양한 검증 실험을 수행한 점이 특히 인상적이었다.</p>
<p>아래는 세미나 후 교수님과 동료 연구자(박사 과정)분이 던진 질문들이다.</p>
<p><strong>교수님 질문</strong></p>
<ul>
<li>Human Evaluation과 LLM Evaluation의 Correlation을 산출할 때, 구체적으로 어떤 방식을 사용한 건가? (Human Evaluator가 3명인데, 점수의 평균을 낸 건지, 아니면 Group 단위의 Correlation 계산 방법을 적용한 건지)</li>
<li>Sub-dimension의 적정 개수가 존재하는가?</li>
</ul>
<p><strong>동료 연구자 질문</strong></p>
<ul>
<li>Sub-dimension과 Seed Question을 인간이 직접 설계해야 하기 때문에 확장성이 제한될 것 같다. 반드시 사람이 직접 정의해야 하는가? 그냥 많이 만들면 되는 것 아닌가?</li>
</ul>
<p>두 질문에 대한 답변은 고민해보겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PyTorch] 이진 분류(Binary Classification) - 1]]></title>
            <link>https://velog.io/@beaver_zip/PyTorch-%EC%9D%B4%EC%A7%84-%EB%B6%84%EB%A5%98Binary-Classification-1</link>
            <guid>https://velog.io/@beaver_zip/PyTorch-%EC%9D%B4%EC%A7%84-%EB%B6%84%EB%A5%98Binary-Classification-1</guid>
            <pubDate>Sun, 08 Mar 2026 09:17:47 GMT</pubDate>
            <description><![CDATA[<h2 id="1-선형-회귀-복습">1. 선형 회귀 복습</h2>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/667890f6-301b-4c96-ba91-bf5f738ef087/image.png" alt=""></p>
<hr>
<h2 id="2-이진-분류-모델">2. 이진 분류 모델</h2>
<h3 id="이진-분류란">이진 분류란?</h3>
<ul>
<li>주어진 트레이닝 데이터를 사용하여 특징 변수와 목표 변수 사이의 관계를 학습하고, 이를 바탕으로 새로운 데이터를 <strong>사전에 정의된 두 가지 범주 중 하나로 분류</strong>하는 모델을 구축하는 과정이다.</li>
<li>활용 예시:<ul>
<li>붓꽃의 종류 분류: Iris-versicolor(1) 또는 Iris-setosa(0)</li>
<li>이메일 스팸 분류: Spam(1) 또는 Ham(0)</li>
<li>금융 사기 탐지: 사기 거래(1) 또는 정상 거래(0)</li>
<li>의료 진단: 암 조직(1) 또는 정상 조직(0)</li>
</ul>
</li>
</ul>
<!-- 이미지: 강의 자료 p.13 이진 분류 과정 도식화 (Training Data → Binary Classification Model → 예측 결과) -->

<h3 id="트레이닝-데이터-구성">트레이닝 데이터 구성</h3>
<p><a href="https://www.kaggle.com/datasets/uciml/iris">Iris Species</a></p>
<ul>
<li>특징 변수: PetalLengthCm(꽃잎 길이)</li>
<li>목표 변수: Species(종류)</li>
<li>Iris-setosa와 Iris-versicolor 두 종류만 필터링하여 이진 분류 문제를 구성</li>
</ul>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/fef84568-1512-46b2-924b-d3e2866e7a70/image.png" alt=""></p>
<pre><code class="language-python">import pandas as pd

# 데이터 불러오기 (PetalLengthCm과 Species 열만 선택)
df = pd.read_csv(&quot;Iris.csv&quot;, sep=&quot;,&quot;, header=0)[[&quot;PetalLengthCm&quot;, &quot;Species&quot;]]

# Iris-setosa와 Iris-versicolor만 필터링
filtered_data = df[df[&#39;Species&#39;].isin([&#39;Iris-setosa&#39;, &#39;Iris-versicolor&#39;])]
filtered_df = filtered_data</code></pre>
<ul>
<li><code>df[&#39;Species&#39;].isin([...])</code>: Species 열의 각 값이 리스트 내 값과 일치하면 True, 아니면 False를 가지는 <strong>Boolean Series</strong>를 반환한다. 이를 인덱싱에 사용하여 해당 행만 필터링한다.</li>
</ul>
<h3 id="목표-변수를-이산형-레이블로-매핑">목표 변수를 이산형 레이블로 매핑</h3>
<p>Salary Dataset에서는 목표 변수가 연속형 값이었기 때문에 따로 변환이 필요 없었다. 하지만 Iris Dataset의 목표 변수는 텍스트 데이터이므로, 모델이 처리할 수 있도록 <strong>이산형 레이블(0, 1)로 매핑</strong>해야 한다.</p>
<pre><code class="language-python"># Iris-setosa → 0, Iris-versicolor → 1로 매핑
filtered_df.loc[:, &#39;Species&#39;] = filtered_df[&#39;Species&#39;].map({&#39;Iris-setosa&#39;: 0, &#39;Iris-versicolor&#39;: 1})</code></pre>
<h3 id="특징-변수와-목표-변수-추출">특징 변수와 목표 변수 추출</h3>
<pre><code class="language-python"># 특징 변수: 2차원 배열로 추출
x = filtered_df[[&#39;PetalLengthCm&#39;]].values

# 목표 변수: 1차원 배열로 추출 후 정수형 변환
t = filtered_df[&#39;Species&#39;].values.astype(int)</code></pre>
<ul>
<li><code>[[&#39;PetalLengthCm&#39;]]</code> (이중 대괄호): DataFrame 형태를 유지하여 2차원 배열로 추출됨.</li>
<li><code>[&#39;Species&#39;]</code> (단일 대괄호): Series 형태로 1차원 배열을 추출함.</li>
</ul>
<h3 id="데이터-분할">데이터 분할</h3>
<p>데이터를 학습용과 평가용으로 분리한다.</p>
<ul>
<li><strong>트레이닝 데이터</strong>: 모델을 학습시키는 데 사용. 가중치와 바이어스를 최적화하기 위해 사용함.</li>
<li><strong>테스트 데이터</strong>: 최종 모델의 성능을 평가하는 데 사용. 모델의 실제 성능을 확인하기 위해 사용함.</li>
<li><strong>검증 데이터</strong>: 학습 과정 중 성능을 평가하는 데 사용. 매 에폭마다 과적합을 확인하기 위해 사용함.</li>
</ul>
<pre><code class="language-python">from sklearn.model_selection import train_test_split

# 80% 학습, 20% 테스트로 분할 (random_state=42로 재현성 확보)
x_train, x_test, t_train, t_test = train_test_split(x, t, test_size=0.2, random_state=42)</code></pre>
<ul>
<li><code>random_state=42</code>에서 42는 &quot;은하수를 여행하는 히치하이커를 위한 안내서&quot;에서 유래한, 관습적으로 자주 사용되는 시드 값이다.</li>
</ul>
<h3 id="데이터-표준화">데이터 표준화</h3>
<p>이진 분류 모델 구축에서도 <strong>데이터 표준화</strong>가 필요하다. 주의할 점은 <code>fit_transform</code>은 <strong>트레이닝 데이터에만</strong> 적용하고, 테스트 데이터에는 <code>transform</code>만 사용하는 것이다.</p>
<pre><code class="language-python">from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)  # 트레이닝: 통계량 계산 + 표준화
x_test = scaler.transform(x_test)        # 테스트: 트레이닝 통계량으로 표준화만</code></pre>
<h3 id="tensor-변환">Tensor 변환</h3>
<pre><code class="language-python">x_train = torch.tensor(x_train, dtype=torch.float32)
x_test = torch.tensor(x_test, dtype=torch.float32)
t_train = torch.tensor(t_train, dtype=torch.float32).unsqueeze(1)
t_test = torch.tensor(t_test, dtype=torch.float32).unsqueeze(1)</code></pre>
<ul>
<li><code>unsqueeze(1)</code>: 목표 변수를 1차원 <code>[N]</code>에서 2차원 <code>[N, 1]</code>로 변환한다. 이유는 다음과 같다.<ul>
<li><strong>배치 처리</strong>를 위해 목표 변수의 형태가 <code>[N, 1]</code>이어야 함.</li>
<li>특징 변수가 <code>[데이터 수, 특징 수]</code>로 이미 2차원이므로, 일관된 형태를 위해 맞춰줌.</li>
<li><strong>손실 함수</strong>가 2차원 Tensor 형태를 기대하므로 호환성을 위해 변환함.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="3-dataset--dataloader-클래스">3. Dataset &amp; DataLoader 클래스</h2>
<h3 id="배치batch란">배치(Batch)란</h3>
<p><strong>배치</strong>란 머신러닝과 딥러닝에서 데이터를 처리하는 <strong>묶음 단위</strong>를 의미한다. 일반적으로 16, 32, 64개 등의 단위로 나눠서 모델에 입력한다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/b6f33767-7e2d-4f0c-ade1-b922c015db4c/image.png" alt=""></p>
<h3 id="미니-배치-경사하강법">미니 배치 경사하강법</h3>
<p>기존 경사하강법 알고리즘들의 장점과 단점을 비교하면 다음과 같다:</p>
<ul>
<li><strong>경사하강법(GD)</strong><ul>
<li>전체 데이터셋을 사용하여 가중치를 업데이트한다. </li>
<li>안정적이지만, 로컬 미니마 문제와 대규모 데이터셋에서의 계산 비용 문제가 있다.</li>
</ul>
</li>
<li><strong>확률적 경사하강법(SGD)</strong><ul>
<li>각 데이터 하나에 대해 가중치를 업데이트한다. </li>
<li>빠르고 메모리 효율적이지만, 노이즈가 많고 학습이 불안정함.</li>
</ul>
</li>
<li><strong>미니 배치 경사하강법</strong><ul>
<li>위 두 알고리즘의 장단점을 보완한 것이다. </li>
<li>데이터를 배치 단위로 묶어 확률적 경사하강법보다 <strong>노이즈를 줄여 안정적</strong>이고, 전체 데이터를 한 번에 사용하는 경사하강법보다 <strong>계산 속도가 빠르다</strong>.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/db517341-1adb-4cd5-8638-bf3813925428/image.png" alt=""></p>
<h3 id="dataset-클래스">Dataset 클래스</h3>
<p>PyTorch에서 <strong>Dataset 클래스</strong>는 데이터셋을 정의하는 기본 클래스이다. <code>Dataset</code>을 상속받아 커스텀 데이터셋을 만들며, 다음 세 가지 메서드를 구현해야 한다.</p>
<ul>
<li><code>__init__</code>: 데이터를 초기화</li>
<li><code>__len__</code>: 데이터의 크기를 반환</li>
<li><code>__getitem__</code>: 특정 인덱스의 데이터 샘플을 반환</li>
</ul>
<pre><code class="language-python">from torch.utils.data import Dataset, DataLoader

class IrisDataset(Dataset):
    def __init__(self, features, labels):
        self.features = features  # 특징 변수 저장
        self.labels = labels      # 목표 변수 저장

    def __len__(self):
        return len(self.features)  # 데이터셋 크기 반환

    def __getitem__(self, idx):
        return self.features[idx], self.labels[idx]  # 인덱스에 해당하는 (특징, 레이블) 쌍 반환</code></pre>
<h3 id="dataloader-클래스">DataLoader 클래스</h3>
<p><strong>DataLoader 클래스</strong>는 Dataset 인스턴스를 감싸서 <strong>배치 단위</strong>로 데이터를 로드하고, 데이터 셔플 등의 작업을 수행한다.</p>
<ul>
<li>모델 <strong>훈련</strong> 시에는 데이터 순서에 따른 편향을 줄이기 위해 <code>shuffle=True</code>로 데이터를 섞는다.</li>
<li>모델 <strong>평가</strong> 시에는 데이터 순서를 유지하는 것이 일반적이므로 <code>shuffle=False</code>로 설정한다.</li>
</ul>
<pre><code class="language-python"># CustomDataset 인스턴스 생성
train_dataset = IrisDataset(x_train, t_train)
test_dataset = IrisDataset(x_test, t_test)

# DataLoader 생성
batch_size = 4
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)   # 훈련용: 셔플 O
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)     # 평가용: 셔플 X</code></pre>
<hr>
<h2 id="4-이진-분류-모델-로지스틱-회귀">4. 이진 분류 모델 (로지스틱 회귀)</h2>
<h3 id="로지스틱-회귀-알고리즘">로지스틱 회귀 알고리즘</h3>
<p><strong>로지스틱 회귀</strong>란 트레이닝 데이터의 특성과 분포를 바탕으로 데이터를 잘 구분할 수 있는 <strong>최적의 결정 경계</strong>를 찾아, <strong>시그모이드 함수</strong>를 통해 이 경계를 기준으로 데이터를 이진 분류하는 알고리즘이다. 딥러닝의 기본적인 구성요소로 널리 사용된다.</p>
<ol>
<li>트레이닝 데이터 $(x, t)$에서 선형 결정 경계를 찾음
: $z = wx + b$</li>
<li>시그모이드 함수를 통해 0~1 사이의 확률값으로 변환
: $y = \text{Sigmoid}(z)$</li>
<li>임계값(0.5)을 기준으로 이진 분류
: $y \geq 0.5$이면 1, $y &lt; 0.5$이면 0</li>
</ol>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/cb2b34b6-7e23-4746-8803-e0a2e6f2543b/image.png" alt=""></p>
<h3 id="시그모이드-함수">시그모이드 함수</h3>
<p><strong>시그모이드 함수</strong>는 비선형 함수로, 입력 값을 <strong>0과 1 사이의 값</strong>으로 변환한다.</p>
<p>$$y = \text{Sigmoid}(z) = \frac{1}{1 + \exp(-z)}$$</p>
<ul>
<li>출력이 0~1 사이이므로 <strong>확률로 해석</strong> 가능하다. 
(예: 출력이 0.64면 해당 클래스일 확률이 64%)</li>
<li>$z$가 양의 큰 값이면 1에 가까워지고, 음의 큰 값이면 0에 가까워진다.</li>
</ul>
<p align=center><img src="https://velog.velcdn.com/images/beaver_zip/post/1652788d-933d-4282-8b17-b8d5a7a4fce0/image.png" width=60%></p>

<h3 id="이진-분류-모델-구현">이진 분류 모델 구현</h3>
<pre><code class="language-python">import torch.nn as nn

class BinaryClassificationModel(nn.Module):
    def __init__(self):
        super(BinaryClassificationModel, self).__init__()
        self.layer_1 = nn.Linear(1, 1)  # 입력 차원 1, 출력 차원 1인 선형 계층
        self.sigmoid = nn.Sigmoid()     # 시그모이드 활성화 함수

    def forward(self, x):
        z = self.layer_1(x)   # 선형 변환: z = wx + b
        y = self.sigmoid(z)   # 시그모이드 적용: y = sigmoid(z)
        return y

# 모델 초기화
model = BinaryClassificationModel()</code></pre>
<ul>
<li><code>nn.Linear(1, 1)</code>: 입력 차원과 출력 차원이 모두 1인 선형 계층. $z = wx + b$를 계산함.</li>
<li><code>nn.Sigmoid()</code>: 선형 계층의 출력 $z$를 0~1 사이의 이진 분류 확률 $y$로 변환함.</li>
<li><code>forward()</code>: 특징 변수 $x$를 받아 선형 계층 → 시그모이드를 순차적으로 통과시켜 최종 이진 분류 확률을 반환함.</li>
</ul>
<hr>
<h2 id="학습-정리">학습 정리</h2>
<ul>
<li><strong>이진 분류</strong>란 특징 변수와 목표 변수(두 가지 범주) 사이의 관계를 학습하여, 새로운 데이터를 두 가지 범주 중 하나로 분류하는 과정이다.</li>
<li>데이터는 <strong>트레이닝, 테스트, 검증 데이터</strong>로 분할할 수 있다.</li>
<li>PyTorch에서는 <strong>Dataset</strong>과 <strong>DataLoader</strong> 클래스를 사용하여 데이터 전처리와 배치 처리를 효율적으로 수행한다.</li>
<li><strong>로지스틱 회귀</strong>는 선형 결정 경계 + 시그모이드 함수를 결합하여 이진 분류를 수행하는 알고리즘이다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PyTorch] 선형 회귀(Linear Regression) - 2]]></title>
            <link>https://velog.io/@beaver_zip/PyTorch-%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80Linear-Regression-2</link>
            <guid>https://velog.io/@beaver_zip/PyTorch-%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80Linear-Regression-2</guid>
            <pubDate>Sat, 07 Mar 2026 13:57:20 GMT</pubDate>
            <description><![CDATA[<h2 id="경사하강법이란">경사하강법이란?</h2>
<ul>
<li><strong>경사하강법(Gradient Descent)</strong>은 머신러닝의 최적화 알고리즘 중 하나로, 손실 함수에서 모델의 <strong>가중치 $w$</strong>와 <strong>바이어스 $b$</strong>의 최적 값을 찾기 위해 사용된다.</li>
<li>쉽게 말해, 손실 함수의 &quot;경사(기울기)&quot;를 따라 내려가면서 손실이 최소가 되는 지점을 찾는 알고리즘이다.</li>
</ul>
<h3 id="작동-방식">작동 방식</h3>
<p>경사하강법의 작동 방식을 이해하기 위해 간단한 예시를 살펴본다.</p>
<p>트레이닝 데이터가 $(x_1, t_1) = (1, 0.5)$, $(x_2, t_2) = (2, 1)$, $(x_3, t_3) = (3, 1.5)$, $(x_4, t_4) = (4, 2)$로 주어졌을 때, 가중치 $w$에 따라 손실 값이 어떻게 변하는지 확인한다. (편의상 $b = 0$으로 가정)</p>
<p>$$l(w, 0) = \frac{1}{4} \sum_{i=1}^{4} [t_i - (w \cdot x_i)]^2$$</p>
<table>
<thead>
<tr>
<th>$w$</th>
<th>손실 $l(w, 0)$</th>
</tr>
</thead>
<tbody><tr>
<td>-0.5</td>
<td>7.5</td>
</tr>
<tr>
<td>0</td>
<td>1.875</td>
</tr>
<tr>
<td><strong>0.5</strong></td>
<td><strong>0</strong> (최소)</td>
</tr>
<tr>
<td>1</td>
<td>1.875</td>
</tr>
<tr>
<td>1.5</td>
<td>7.5</td>
</tr>
</tbody></table>
<p>그래프로 그리면 $w = 0.5$에서 최솟값을 가지는 U자 형태의 포물선이 된다.</p>
<p align="center"><img src="https://velog.velcdn.com/images/beaver_zip/post/a5e2504c-b723-4221-9065-d2b869690db3/image.png" width=70%></p>

<h3 id="경사기울기란">경사(기울기)란?</h3>
<p>특정 지점 $(w, l(w, b))$에서의 경사는 <strong>손실 함수를 $w$에 대해 편미분한 값</strong>이다.</p>
<p>$$\text{경사} = \frac{\partial l(w,b)}{\partial w} = \frac{l(w,b)\text{의 증가량}}{w\text{의 증가량}}$$</p>
<p align="center"><img src="https://velog.velcdn.com/images/beaver_zip/post/ee77af7b-cf13-43d1-9c92-21c67e806e54/image.png" width=80%></p>

<p>체인 룰을 적용하면:</p>
<p>$$\frac{\partial l(w,b)}{\partial w} = \frac{\partial l(w,b)}{\partial y} \cdot \frac{\partial y}{\partial w} = \frac{1}{n} \cdot (-2) \sum_{i=1}^{n}(t_i - y_i) \cdot x_i$$</p>
<ul>
<li>$y = wx$이므로 $\frac{\partial y}{\partial w} = x_i$</li>
</ul>
<p>$w = -0.5$, $b = 0$을 대입하면:</p>
<p>$$\frac{\partial l(w,b)}{\partial w}\bigg|_{w=-0.5} = \frac{1}{4} \cdot (-2)(1 + 4 + 9 + 16) = -15$$</p>
<ul>
<li>기울기가 <strong>음수</strong> → $w$를 <strong>오른쪽(양의 방향)</strong>으로 이동시켜야 손실이 줄어듦</li>
</ul>
<p>PyTorch에서는 <code>loss.backward()</code>로 자동 미분을 수행하여 기울기를 계산한다.</p>
<h3 id="가중치-업데이트">가중치 업데이트</h3>
<p>계산된 기울기를 사용하여 가중치를 업데이트하는 수식:</p>
<p>$$w^* = w - \alpha \frac{\partial l(w,b)}{\partial w}$$</p>
<ul>
<li>$\alpha$: <strong>학습률(learning rate)</strong></li>
</ul>
<p>$w = -0.5$일 때:</p>
<p>$$w^* = (-0.5) - \alpha \cdot (-15) = -0.5 + 15\alpha$$</p>
<p>기울기가 음수이므로, $w$는 양의 방향으로 이동한다. 이 과정을 반복하면 $w$가 점점 최솟값(0.5)에 가까워진다.</p>
<p align="center"><img src="https://velog.velcdn.com/images/beaver_zip/post/4aba2003-fad9-4fc4-b8ff-e4f5024f28a4/image.png" width=70%></p>



<p>바이어스 $b$도 같은 방식으로 최적값을 찾을 수 있다: $b^* = b - \alpha \frac{\partial l(w,b)}{\partial b}$</p>
<p>PyTorch에서는 <code>optimizer.step()</code>으로 가중치를 업데이트하고, 업데이트 전에는 반드시 <code>optimizer.zero_grad()</code>로 이전 기울기를 초기화해야 한다.</p>
<h3 id="학습률-learning-rate">학습률 (Learning Rate)</h3>
<ul>
<li>학습률은 가중치가 업데이트되는 <strong>크기</strong>를 결정하는 하이퍼파라미터임.</li>
<li><strong>너무 크면</strong> 최적값을 지나쳐 발산하고, <strong>너무 작으면</strong> 수렴이 매우 느려진다.</li>
<li>모델과 데이터에 따라 달라지므로, 결국 <strong>시행착오를 거쳐</strong> 최적의 값을 찾아야 함.</li>
</ul>
<p align="center"><img src="https://velog.velcdn.com/images/beaver_zip/post/ecd1fc52-76c1-430d-9f64-91873e40b949/image.png" width=70%></p>


<h3 id="경사하강법의-한계">경사하강법의 한계</h3>
<p><strong>1) 대규모 데이터셋의 계산 비용</strong></p>
<ul>
<li>전체 데이터셋을 사용하여 기울기를 계산하므로, 데이터가 많을수록 계산 비용이 매우 커진다.</li>
</ul>
<p><strong>2) 로컬 미니마(local minima) 문제</strong></p>
<ul>
<li>손실 함수가 전역 최소값(global minimum)이 아닌 <strong>지역 최소값</strong>에 머무를 수 있다.</li>
<li>전체 데이터의 기울기 평균을 사용하므로, 로컬 미니마에 갇힐 가능성이 높음.</li>
</ul>
<p align="center"><img src="https://velog.velcdn.com/images/beaver_zip/post/c0ad2bcd-9746-4a3c-a0d7-a6dd268a714d/image.png" width=70%></p>

<hr>
<h2 id="확률적-경사하강법-sgd">확률적 경사하강법 (SGD)</h2>
<h3 id="왜-필요한가">왜 필요한가?</h3>
<ul>
<li>경사하강법은 <strong>모든 데이터</strong>의 오차를 계산하여 업데이트하므로, 정확하고 안정적이지만 대규모 데이터셋에서 비효율적임.</li>
<li><strong>확률적 경사하강법(Stochastic Gradient Descent)</strong>은 <strong>각각의 데이터 포인트마다</strong> 오차를 계산하여 $w$와 $b$를 업데이트하는 방식이다.</li>
<li>각 데이터 포인트별로 기울기를 계산하므로 기울기에 <strong>노이즈</strong>가 포함되고, 이 노이즈 덕분에 <strong>로컬 미니마를 탈출</strong>하기 용이하다.</li>
</ul>
<h3 id="수식-표현">수식 표현</h3>
<p>$$w^* = w - \alpha \left( \frac{1}{n} \cdot (-2)(t_i - y_i) \cdot x_i \right)$$</p>
<p>전체 데이터 합산($\sum$)이 아니라 <strong>개별 데이터 포인트</strong> $(t_i - y_i) \cdot x_i$로 계산하는 것이 핵심이다.</p>
<p>앞선 예시에서 첫 번째 데이터 포인트 $(1, 0.5)$만 사용하면 ($\alpha = 0.01$):</p>
<p>$$w^* = (-0.5) - 0.01 \cdot \left(\frac{1}{4} \cdot (-2)(0.5 - 0.5) \cdot 1\right) = -0.5 + 0.02 = -0.48$$</p>
<p>두 번째 데이터 포인트 $(2, 1)$을 사용:</p>
<p>$$w^* = (-0.48) - 0.01 \cdot \left(\frac{1}{4} \cdot (-2)(1.96) \cdot 2\right) = -0.48 + 0.0196 = -0.4604$$</p>
<p>이런 식으로 데이터 하나하나를 순회하며 가중치를 업데이트해 나간다.</p>
<h3 id="sgd-코드">SGD 코드</h3>
<pre><code class="language-python">import torch.optim as optim

# 손실 함수 및 옵티마이저 정의
loss_function = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)</code></pre>
<ul>
<li><code>optim.SGD</code>: 확률적 경사하강법 옵티마이저</li>
<li><code>model.parameters()</code>: 모델의 학습 가능한 파라미터($w$, $b$)를 옵티마이저에 전달</li>
<li><code>lr</code>: 학습률</li>
</ul>
<p>학습 루프에서의 핵심 3줄:</p>
<pre><code class="language-python">optimizer.zero_grad()  # 이전 기울기 초기화
loss.backward()        # 역전파로 기울기 계산
optimizer.step()       # 기울기 기반 가중치 업데이트</code></pre>
<hr>
<h2 id="에폭-epoch">에폭 (Epoch)</h2>
<h3 id="에폭이란">에폭이란?</h3>
<ul>
<li><strong>에폭(epoch)</strong>이란 모델이 전체 데이터셋을 <strong>한 번 완전히 학습</strong>하는 과정을 의미한다.</li>
<li>예를 들어, 데이터셋에 30개의 데이터가 있고 에폭 수가 1이면, 모델은 30개 데이터를 한 번 학습한다.</li>
<li>동일한 데이터셋으로 <strong>여러 번 반복 학습</strong>하여 모델의 성능을 향상시킨다.</li>
<li>단, 에폭 수가 너무 많으면 <strong>과적합(overfitting)</strong>이 발생할 수 있다.<ul>
<li>과적합: 트레이닝 데이터에 너무 맞춰져서 새로운 데이터에 대한 <strong>일반화 능력이 떨어지는</strong> 현상</li>
</ul>
</li>
</ul>
<h3 id="에폭-코드">에폭 코드</h3>
<pre><code class="language-python">num_epochs = 1000  # 에폭 수 설정
loss_list = []     # 손실 값 기록용 리스트

for epoch in range(num_epochs):
    y = model(x_tensor)                # 순전파: 예측값 계산
    loss = loss_function(y, t_tensor)  # 손실 계산

    optimizer.zero_grad()   # 기울기 초기화
    loss.backward()         # 역전파
    optimizer.step()        # 가중치 업데이트

    loss_list.append(loss.item())  # 손실 값 기록

    if (epoch+1) % 100 == 0:
        print(f&#39;Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}&#39;)
        for name, param in model.named_parameters():
            print(f&#39;{name}: {param.data}&#39;)</code></pre>
<ul>
<li><code>loss.item()</code>: 텐서에서 스칼라 값을 추출</li>
<li><code>model.named_parameters()</code>: 모델의 파라미터 이름과 값을 함께 확인 (디버깅용)</li>
</ul>
<hr>
<h2 id="데이터-표준화-standardization">데이터 표준화 (Standardization)</h2>
<h3 id="손실-값이-줄어들지-않는-문제">손실 값이 줄어들지 않는 문제</h3>
<p>학습을 돌려보면 손실 값이 <strong>수천만 단위</strong>로 매우 큰 경우가 있다.</p>
<p align="center"><img src="https://velog.velcdn.com/images/beaver_zip/post/4cf79acd-4d1a-453a-aa11-c9a0268d9cf2/image.png" width=70%></p>


<p>일반적으로 손실 값이 클 때는 학습률을 낮추거나, 이상치를 확인하거나, 에폭 수를 늘려볼 수 있다. 하지만 이번 실습에서는 위 세 가지를 적용해도 손실 값이 줄어들지 않았다. 원인은 <strong>특징 변수(YearsExperience)와 목표 변수(Salary)의 스케일 차이</strong>가 너무 크기 때문이다.</p>
<h3 id="표준화란">표준화란?</h3>
<ul>
<li>특징 변수와 목표 변수의 값 차이가 클 때, 두 변수의 <strong>평균을 0, 분산을 1</strong>로 맞추는 전처리 방법이다.</li>
<li>표준화를 수행하면 데이터의 <strong>분포 형태는 동일</strong>하게 유지되지만, 값의 범위가 변환된다.</li>
</ul>
<p align="center"><img src="https://velog.velcdn.com/images/beaver_zip/post/1fd93169-94d0-4012-a494-4a4c64125e2f/image.png" width=70%></p>

<p>표준화 후 학습하면 손실 값이 약 <strong>0.043</strong>으로 크게 감소한다.</p>
<p align="center"><img src="https://velog.velcdn.com/images/beaver_zip/post/b1de487f-1e65-40a3-bcbd-60d8c3b80975/image.png" width=70%></p>


<h3 id="표준화-코드">표준화 코드</h3>
<pre><code class="language-python">from sklearn.preprocessing import StandardScaler

# 특징 변수 표준화
scaler_x = StandardScaler()
x_scaled = scaler_x.fit_transform(x.reshape(-1, 1))

# 목표 변수 표준화
scaler_t = StandardScaler()
t_scaled = scaler_t.fit_transform(t.reshape(-1, 1))</code></pre>
<ul>
<li><code>StandardScaler()</code>: 평균 0, 분산 1로 변환하는 스케일러 객체</li>
<li><code>.fit_transform()</code>: 데이터의 평균/표준편차를 계산(fit)하고 변환(transform)을 동시에 수행</li>
<li><code>.reshape(-1, 1)</code>: 1차원 배열을 2차원으로 변환 (StandardScaler는 2차원 입력을 기대)</li>
</ul>
<p>표준화된 데이터를 Tensor로 변환:</p>
<pre><code class="language-python">x_tensor = torch.tensor(x_scaled, dtype=torch.float32).view(-1, 1)
t_tensor = torch.tensor(t_scaled, dtype=torch.float32).view(-1, 1)</code></pre>
<hr>
<h2 id="전체-실습-코드">전체 실습 코드</h2>
<p>데이터 로딩 → 표준화 → 모델 정의 → 학습 → 시각화까지의 전체 흐름이다.</p>
<pre><code class="language-python">import torch
import torch.nn as nn
import torch.optim as optim
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler

# 1. 데이터 로딩
data = pd.read_csv(&quot;Salary_dataset.csv&quot;, sep=&quot;,&quot;, header=0)
x = data.iloc[:, 1].values  # YearsExperience
t = data.iloc[:, 2].values  # Salary

# 2. 데이터 표준화
scaler_x = StandardScaler()
x_scaled = scaler_x.fit_transform(x.reshape(-1, 1))

scaler_t = StandardScaler()
t_scaled = scaler_t.fit_transform(t.reshape(-1, 1))

# 3. Tensor 변환
x_tensor = torch.tensor(x_scaled, dtype=torch.float32).view(-1, 1)
t_tensor = torch.tensor(t_scaled, dtype=torch.float32).view(-1, 1)

# 4. 모델 정의
class LinearRegressionModel(nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        y = self.linear(x)
        return y

model = LinearRegressionModel()

# 5. GPU 지원
device = torch.device(&#39;cuda&#39; if torch.cuda.is_available() else &#39;cpu&#39;)
model.to(device)
x_tensor = x_tensor.to(device)
t_tensor = t_tensor.to(device)

# 6. 손실 함수 및 옵티마이저 정의
loss_function = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 7. 학습
num_epochs = 1000
loss_list = []

for epoch in range(num_epochs):
    y = model(x_tensor)
    loss = loss_function(y, t_tensor)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    loss_list.append(loss.item())

    if (epoch+1) % 100 == 0:
        print(f&#39;Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}&#39;)
        for name, param in model.named_parameters():
            print(f&#39;{name}: {param.data}&#39;)

# 8. 손실 값 시각화
plt.figure()
plt.plot(loss_list, label=&#39;Train Loss&#39;)
plt.xlabel(&#39;Epochs&#39;)
plt.ylabel(&#39;Loss&#39;)
plt.legend()
plt.grid(True)
plt.title(&#39;Loss Trend&#39;)
plt.show()</code></pre>
<hr>
<h2 id="학습-정리">학습 정리</h2>
<ul>
<li><strong>경사하강법</strong>은 손실 함수의 기울기를 따라 내려가면서 최적의 $w$, $b$를 찾는 알고리즘이다.</li>
<li><strong>확률적 경사하강법(SGD)</strong>은 각 데이터 포인트마다 기울기를 계산하므로, 대규모 데이터에서 효율적이고 로컬 미니마 탈출에 용이하다.</li>
<li><strong>에폭</strong>은 전체 데이터셋을 한 번 완전히 학습하는 과정이며, 너무 많으면 과적합이 발생할 수 있다.</li>
<li><strong>표준화</strong>는 특징 변수와 목표 변수의 스케일 차이가 클 때 평균 0, 분산 1로 맞추어 학습 안정성을 높이는 전처리 기법이다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[<피싱·스캠 예방을 위한 서비스 개발 경진대회
> 수상자 인터뷰]]></title>
            <link>https://velog.io/@beaver_zip/%ED%94%BC%EC%8B%B1%EC%8A%A4%EC%BA%A0-%EC%98%88%EB%B0%A9%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%9C%EB%B0%9C-%EA%B2%BD%EC%A7%84%EB%8C%80%ED%9A%8C-%EC%88%98%EC%83%81%EC%9E%90-%EC%9D%B8%ED%84%B0%EB%B7%B0</link>
            <guid>https://velog.io/@beaver_zip/%ED%94%BC%EC%8B%B1%EC%8A%A4%EC%BA%A0-%EC%98%88%EB%B0%A9%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%9C%EB%B0%9C-%EA%B2%BD%EC%A7%84%EB%8C%80%ED%9A%8C-%EC%88%98%EC%83%81%EC%9E%90-%EC%9D%B8%ED%84%B0%EB%B7%B0</guid>
            <pubDate>Fri, 27 Feb 2026 14:26:16 GMT</pubDate>
            <description><![CDATA[<ul>
<li><a href="https://dacon.io/competitions/official/236666/talkboard/416459?page=1&amp;dtype=recent">인터뷰</a></li>
<li><a href="https://github.com/beaver-zip/scam-or-safe">Repository</a></li>
</ul>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/8a83f1ad-899d-45ca-8370-86959d96ee81/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[26.02.03 화 - 락스타가되고싶다]]></title>
            <link>https://velog.io/@beaver_zip/26.02.03-%ED%99%94-%EB%9D%BD%EC%8A%A4%ED%83%80%EA%B0%80%EB%90%98%EA%B3%A0%EC%8B%B6%EB%8B%A4</link>
            <guid>https://velog.io/@beaver_zip/26.02.03-%ED%99%94-%EB%9D%BD%EC%8A%A4%ED%83%80%EA%B0%80%EB%90%98%EA%B3%A0%EC%8B%B6%EB%8B%A4</guid>
            <pubDate>Tue, 03 Feb 2026 08:28:36 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/beaver_zip/post/f7c7b76a-0039-4a61-9128-54d56c39b23e/image.png" alt=""></p>
<h4 id="1-베이스를-샀다">1. 베이스를 샀다.</h4>
<p>연구실 분들이 대학원 생활 할 거면 취미는 꼭 하나 만들라고 조언해주시기도 했고, 
전부터 어떤 형태로든 음악을 해보고 싶었다.
딱히 베이스를 할 생각은 없었는데, 인스타 릴스를 보고 꽂혀서 충동적으로 구매했다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/8eed40de-3595-4171-b608-fffaf1b0abcd/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/9ce9068e-0996-4454-b969-df360953fb75/image.png" alt=""></p>
<p>요즘 핫한 OpenClaw를 사용해보기 위해 맥미니 M4를 살까도 고민했는데,
장기적으로 베이스가 내 인생에 더 도움이 될 것 같아서 걍 베이스를 선택했다.</p>
<h4 id="2-네부캠-팀원들과-오랜만에-대회를-함께하고-있다">2. 네부캠 팀원들과 오랜만에 <a href="https://dacon.io/competitions/official/236666/overview/description">대회</a>를 함께하고 있다.</h4>
<p>부캠이 끝난 지 딱 1년이 지난 시점에 다시 대회를 함께 하게되어 감회가 새롭다.
밤에는 아이디어 회의를 하고, 낮에는 클로드를 혹사시키고 있다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/f7c7b76a-0039-4a61-9128-54d56c39b23e/image.png" alt=""></p>
<p>클로드야미안해<del>~</del></p>
<p>작년 이맘때 Cursor, Windsurf를 처음 써보고 신기해했던 기억이 난다.
당시에는 말귀도 잘 못 알아듣고, 디버깅이나 리팩토링 같은 복잡한 작업을 정말 못했는데, 지금은 별로 흠잡을 데가 없다. AI의 빠른 발전이 두렵기도 하고 설레기도 한다.
앤트로픽 상장하면 풀매수 해야겠다.</p>
<h4 id="3-자기-관리-잘-하는-사람이-되고-싶다">3. 자기 관리 잘 하는 사람이 되고 싶다.</h4>
<p>7시간 이상 수면, 물 2L 마시기, 비타민C 오버도즈, 간헐적 단식, 피부과 치료, 운동 등 건강한 삶을 위해 노력하고 있다.
예쁜 옷을 사도 스타일을 완성하는 것은 외모고, 내 잦은 허무감의 근원도 외모에 대한 낮은 자존감 때문이라고 생각한다. 
이제 와서 잘생겨지긴 어렵지만 깔끔하게라도 보이고 싶어서 노력하려고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Gemini3 뛰어난 거 맞나요]]></title>
            <link>https://velog.io/@beaver_zip/Gemini3-%EB%9B%B0%EC%96%B4%EB%82%9C-%EA%B1%B0-%EB%A7%9E%EB%82%98%EC%9A%94</link>
            <guid>https://velog.io/@beaver_zip/Gemini3-%EB%9B%B0%EC%96%B4%EB%82%9C-%EA%B1%B0-%EB%A7%9E%EB%82%98%EC%9A%94</guid>
            <pubDate>Sun, 07 Dec 2025 08:51:26 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/beaver_zip/post/15b58475-faea-4de2-83a9-872e22364509/image.png" alt=""></p>
<p>평소처럼 canvas 툴로 슬라이드 하나 만들어 달라고 했는데</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/bae79159-492f-48ca-a091-d80770ca22d8/image.png" alt=""></p>
<p>??
<img src="https://velog.velcdn.com/images/beaver_zip/post/bba9a143-c9c3-42ca-8557-c8f1c473f605/image.png" alt=""></p>
<p>숨막히는 핑퐁</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/fda8d9e4-8d3e-4ca1-9c74-232061be176d/image.png" alt=""></p>
<p>꼭 손가락을 들어야</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/7b5162f8-2d3d-41d8-8259-8c889bddb9fd/image.png" alt=""></p>
<p>드디어 해줬다.
<img src="https://velog.velcdn.com/images/beaver_zip/post/ea621869-2ba5-4ca5-b119-42874a049dc3/image.png" alt=""></p>
<p>디자인 진짜 못하네</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/015ae62d-0477-4f81-8f54-99a63654db9c/image.png" alt=""></p>
<p>하,,</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/0e4f2c3d-d3c2-415b-8dd7-d560ea34c207/image.png" alt="">
그 작은 뇌로 뭘 생각했을까?</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/5fbbe3b5-09b2-4b36-8358-14b91da85aa8/image.png" alt=""></p>
<p>내가 비꼬는지 궁금했나보다</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/8220684b-e858-4e11-b62c-0ba5ac57d1b8/image.png" alt=""></p>
<p>환장하겠네~</p>
<hr>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/d6cfa01f-7954-42bd-8566-c2e078d732d1/image.png" alt=""></p>
<p>찾아보니 <a href="https://www.reddit.com/r/Bard/comments/147ipqc/getting_the_im_only_a_language_model_response_a/?tl=ko">Bard 시절</a>에도 동일한 문제가 있었다.
3년 전 문제가 아직도 발생하는게 신기하고 어이없다.</p>
<p>요즘 LLM을 쓰면 쓸수록 벤치마크 성능을 곧이 곧대로 믿을 수 있는지 의심이 든다.</p>
<hr>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/348756d8-36e6-496b-8c1e-489cbcf4eb94/image.png" alt=""></p>
<p><a href="https://www.threads.com/@choi.openai/post/DR9kvdzDf2c?hl=ko">@choi.openai</a>
마크 첸씨도 그렇게 생각하시는 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[QnA]]></title>
            <link>https://velog.io/@beaver_zip/QnA</link>
            <guid>https://velog.io/@beaver_zip/QnA</guid>
            <pubDate>Tue, 02 Dec 2025 10:23:22 GMT</pubDate>
            <description><![CDATA[<h1 id="q">Q</h1>
<p>교수님, 안녕하십니까.
진로에 관한 고민이 있어 교수님의 조언을 구하고자 상담을 요청드립니다.</p>
<p>저는 전자과 전공 과목이 아닌 자연어처리에 관심을 가지고 있습니다.
애초에 전자과는 성적을 맞춰서 선택한 전공이다보니 처음부터 큰 흥미가 없었고, 지금도 그렇습니다. 흥미 자체가 없다보니 노력을 덜했고, 결과적으로 성적도 좋게 받지 못했습니다.
방황하던 중 우연히 인공지능에 관심을 가지게 됐고, 더 공부해보고 싶어서 휴학하고 7개월간 부트캠프에서 자연어처리를 공부했는데 정말 재밌었습니다.</p>
<p>지금까지도 자연어처리는 재밌습니다.
올해 여름에는 잘하는 사람과 여러 해커톤 및 공모전에 나가 상도 타봤고, 가을부터는 자대 소프트웨어학과 연구실에 학부연구생으로 들어가 처음으로 논문들을 읽어보고 있는데, 개발하는 것도 재밌고, 연구도 재미있습니다.</p>
<p>그러나 진로 설계에 있어 고민이 되는 부분이 있습니다. 바로 본 전공인 전자공학을 버려도 되는가? 입니다.
현재 제가 갈 수 있는 길은 세 갈래인 것 같습니다.
각 갈래에 대해 제가 생각하는 장단점은 다음과 같습니다.</p>
<ol>
<li>개발자(예컨대 NLP Engineer 등의 직무)</li>
</ol>
<ul>
<li>장점: 실력이 매우 뛰어난 경우 전공이 크게 중요치 않다. 현재는 제가 그정도로 뛰어나진 않지만, 전공 공부를 내려놓고 개발에 집중한다면 어지간한 경쟁 구직자들에 비해 잘할 수 있을 것이라 생각합니다.</li>
<li>단점: 이미 레드 오션이며, AI에 대체되기 가장 쉽다. 현재 LLM의 코드 작성 능력 자체는 매우 뛰어나다고 생각합니다. 체감상 아직 로직 설계 능력이 많이 부족하지만, 발전 속도를 생각하면 로직 설계도 금방 잘하게 될 것 같습니다.</li>
</ul>
<ol start="2">
<li>연구자(예컨대 NLP Researcher 등의 직무)</li>
</ol>
<ul>
<li>장점: AI에 대체되기 어렵다. 학사 취업에 비해 평균적인 처우가 높아진다.</li>
<li>단점: 마찬가지로 레드 오션이다. 매일 수백편의 새로운 논문이 쏟아지고 있습니다. 
그리고 학벌과 개인의 능력이 매우 중요하다. 아주대라는 낮은 학벌, 그리고 AI와 관련이 낮은 전자공학이라는 전공, 그리고 높지 않은 학점으로 인해 상위권 대학의 대학원에 진학하는 것부터 어려울 것 같습니다. 그리고 제가 석사를 하는 2년 혹은 석박연계를 하는 5년간 좋은 성과를 낼 수 있을거란 확실이 없고, 무엇보다 멘탈을 잘 유지할 수 있을까 걱정됩니다.</li>
</ul>
<ol start="3">
<li>전자공학+AI (예컨대 AI + 통신, 신호처리, 회로, 반도체 등)</li>
</ol>
<ul>
<li>장점: 상대적으로 대체되기 어렵고, 희소하며, 전공을 살릴 수 있다.</li>
<li>단점: 재미가 없다. 전통적인 NLP Task를 수행할 수 없다.</li>
</ul>
<p>최근 [융합캡스톤디자인1] 교수님과 상담을 하였는데, 해당 교수님께선 3번을 강력히 추천하셨습니다.
당시에는 교수님의 말씀에 설득되어 싫어도 해야겠다 생각했는데, 다시 생각해보니 당연히 전자공학과 교수님이시다보니 그렇게 말씀하신게 아닐까 하는,, 생각이 듭니다.</p>
<p>혹시 교수님께서는 제 고민에 대해 어떻게 생각하시는지, 고견을 여쭙고 싶습니다.
긴 글 읽어주셔서 정말 감사드립니다.</p>
<hr>
<h1 id="a">A</h1>
<p>저는 배경지식과 상관없이 하고 싶은 분야를 전공하는 것이 맞다고 봅니다. 극단적인 예이긴 하지만, 영문학 공부하다가 대학원에서 공학을 전공하는 사람도 있습니다. 다만 학부만 마치고 취업한다면 해당 분야의 경쟁력을 갖기는 어렵습니다. 자연어처리에 관심이 크다면 관련 대학원 진학을 강력 추천합니다.</p>
<p>한편, 자연어처리를 대학원에서 전공한다고 해서 전자공학이 버려지는 것이 아닙니다. 전자공학은 한서 학생이 가지게 된 배경지식이 되는 거에요. 
전자공학을 배경지식으로 가진 상태에서 자연어 처리 연구를 한다면, 비 전자공학 전공자가 갖지 못한 새로운 시각을 가지게 되는 강점이 있을 수도 있다고 봅니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Does Liking Yellow Imply Driving a School Bus? Semantic Leakage in Language Models]]></title>
            <link>https://velog.io/@beaver_zip/Does-Liking-Yellow-Imply-Driving-a-School-Bus-Semantic-Leakage-in-Language-Models</link>
            <guid>https://velog.io/@beaver_zip/Does-Liking-Yellow-Imply-Driving-a-School-Bus-Semantic-Leakage-in-Language-Models</guid>
            <pubDate>Tue, 18 Nov 2025 06:04:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>NAACL 2025 [<a href="https://arxiv.org/abs/2408.06518">paper</a>]
Hila Gonen, Terra Blevins, Alisa Liu, Luke Zettlemoyer, Noah A. Smith
University of Washington | Allen Institute for Artificial Intelligence
12 Aug 2024</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/7c862a89-9118-4d81-b549-330aa096aa5d/image.png" alt=""></p>
<hr>
<h3 id="introduction">Introduction</h3>
<blockquote>
<p>Complete the sentence: <strong>He likes koalas. His favorite food is</strong></p>
</blockquote>
<p>위 질문에 어떻게 답변할 수 있을까요?</p>
<p>사람들은 <code>그가 코알라를 좋아하는 것</code>과 <code>그의 최애 음식</code>은 연관이 없다는 것을 압니다.
따라서 대부분 &#39;모른다&#39;고 답변할 것 같습니다.</p>
<p>그렇다면 LLM은 위 질문에 대해 어떻게 답변할까요?
아래는 순서대로 <strong>ChatGPT 5.1, Gemini 2.5 Pro, Sonnet 4.5</strong>의 응답입니다. (2025.11.18.)</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/1db5c08a-a699-4407-9353-37cc00e6c7bf/image.png" alt=""> <img src="https://velog.velcdn.com/images/beaver_zip/post/72dd2ccb-3bc2-4693-a251-76ecafa86cb4/image.png" alt=""> <img src="https://velog.velcdn.com/images/beaver_zip/post/e79cf84c-5f33-407f-83b0-44afc8865b94/image.png" alt=""></p>
<p>ChatGPT 5.1, Gemini 2.5 Pro는 <code>eucalyptus leaves (유칼립투스 잎)</code>이라고 답변했습니다.
Sonnet 4.5 역시 <code>eucalyptus leaves</code>라고 답변하면서도, <code>농담입니다. 그가 실제로 무엇을 좋아하는지 알려주는 내용이 전혀 없습니다.</code>고 덧붙였습니다. (Claude가 확실히 안전하네요!)</p>
<p>이렇듯 LLM은 프롬프트 내의 (의미적으로 연관이 없는) 특정 단어에 꽂혀서 예상치 못한 출력을 생성하곤 합니다.
논문에서는 이러한 현상을 <strong>Semantic Leakage</strong>라고 정의합니다.</p>
<p>정확히는 다음과 같이 정의합니다.</p>
<blockquote>
<p>an <strong>undue</strong> influence of semantic features form words in the prompt on the generation
(프롬프트 내 단어의 의미적 특성이 생성에 미치는 <strong>부당한</strong> 영향)</p>
</blockquote>
<hr>
<h3 id="evaluation">Evaluation</h3>
<p>앞서 정의한 Semantic Leakage를 어떻게 정량적으로 평가할 수 있을까요?</p>
<p>저자는 평가를 위해 109개의 <strong>Test Suite</strong>를 수동으로 구축했습니다.
또한 <strong>Leak-Rate</strong>라는 평가 지표를 정의하여, 임베딩을 이용한 <strong>자동 평가</strong>와 <strong>인간 평가</strong>를 수행했습니다.
이후 <strong>다국어 및 교차 언어</strong>, <strong>개방형 생성</strong>에서도 Semantic Leakage가 발생하는지 확인해봤습니다.</p>
<p>하나씩 살펴보겠습니다.</p>
<h4 id="leak-rate">Leak-Rate</h4>
<p>Leak-Rate를 설명하기 전, <code>concept</code>, <code>control prompt</code>, <code>test prompt</code>라는 용어를 정의하겠습니다.</p>
<blockquote>
</blockquote>
<ul>
<li><strong>concept</strong>: 프롬프트 내에서 누출될 가능성이 있는 핵심 단어 
(e.g. <code>koalas</code>)</li>
<li><strong>control prompt</strong>: 불필요한 의미적 신호가 없는 기본 프롬프트
(e.g. <code>His favorite food is</code>)</li>
<li><strong>test prompt</strong>: control prompt에 의미적으로 관련 없는 concept를 추가하여 Semantic Leakage를 유도하는 프롬프트
(e.g. <code>He likes koalas. His favorite food is</code>)</li>
</ul>
<p>다음의 순서로 Leak-Rate를 구할 수 있습니다.</p>
<ol>
<li><code>control prompt</code>와 <code>test prompt</code>를 LLM에 입력하여 <code>control generation</code>과 <code>test generation</code>을 생성합니다.</li>
<li><code>concept</code>와 <code>control generation</code>, <code>test generation</code>을 임베딩하여 유사도를 계산합니다.<ul>
<li>$$\text{sim}_{\text{control}} = similarity(\text{concept}, \text{control})$$</li>
<li>$$\text{sim}_{\text{test}} = similarity(\text{concept}, \text{test})$$</li>
</ul>
</li>
<li>아래 기준에 따라 각 인스턴스마다 0 or 0.5 or 1점을 부여합니다.
 <img src="https://velog.velcdn.com/images/beaver_zip/post/8848c8fb-83f6-433e-8b1b-2469cdc170bb/image.png" alt=""></li>
<li>모든 인스턴스를 평균내어 백분율로 변환합니다.</li>
</ol>
<p>위 과정을 통해 Leak-Rate(%)가 계산됩니다.
이렇게 구한 Leak-Rate가 50%보다 높을 경우 <strong>Semantic Leakage가 발생</strong>한 것으로 판단합니다.</p>
<h4 id="test-suite">Test Suite</h4>
<p>저자는 109개의 프롬프트를 수동으로 제작했습니다.
명확한 의미론적 연관성을 지닌 범주와 개념을 고려하면서도, 짧은 모델 출력을 유도함으로써 논란의 여지가 없는 평가를 유도하도록 프롬프트를 설계했습니다.</p>
<p>프롬프트는 색상, 음식, 동물, 노래, 직업 등 다양한 카테고리를 포함합니다.
특히 <strong>관용구</strong>를 포함하여 LLM이 관용구를 문자 그대로의 의미로 해석하는지, 혹은 비유적 의미로 해석하는지 확인하고자 했습니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/41964b8d-3098-415e-bb3e-a6af726aad0f/image.png" alt=""></p>
<p>위 사진은 실제 Test Suite의 일부입니다. 
한 개의 Control Prompt에 대응하는 여러 개의 Test Prompts 쌍으로 구성돼있습니다.
실제 Test Suite는 <a href="https://gonenhila.github.io/files/semantic_leakage_prompts.txt">여기</a>에서 확인할 수 있습니다.</p>
<h4 id="experimental-setup">Experimental Setup</h4>
<h5 id="model">Model</h5>
<ul>
<li>GPT family: <code>GPT-3.5, GPT-4, GPT-4o</code></li>
<li>LLAMA family: <code>All variations in HuggingFace</code></li>
<li>총 13개 모델 사용</li>
</ul>
<h5 id="embedding-methods">Embedding Methods</h5>
<ul>
<li>BERT-Score: 영어 및 교차 언어(<code>distilbert-base-uncased</code>), 중국어 (<code>bert-base-chinese</code>), 히브리어(<code>bert-base-multilingual-cased</code>)</li>
<li>SenetenceBERT: <code>efederici/sentence-bert-base</code></li>
<li>OpenAI Embeddings: <code>text-embedding-3-large</code></li>
</ul>
<h5 id="rules">Rules</h5>
<ul>
<li>GPT 모델은 프롬프트 앞에 <code>Complete the sentence:</code> 추가</li>
<li>LLAMA 모델은 100토큰(개방형 생성은 300 토큰)으로 제한</li>
<li>각 모델에 대해 temperature=[0, 0.5, 1, 1.5], 각 프롬프트 당 10번씩 생성</li>
</ul>
<h5 id="post-process">Post Process</h5>
<ul>
<li>모델 출력에 프롬프트가 반복될 경우, 반복되는 프롬프트 제거</li>
<li>LLAMA 모델의 경우, 첫 번째 마침표 뒤의 출력을 제거 
(이유: 주요 정보 출력 후 관련 없는 문장을 출력하는 경향이 있음)</li>
</ul>
<h4 id="multilingual-and-crosslingual-setup">Multilingual and Crosslingual Setup</h4>
<p>다국어, 교차언어 프롬프트에 대해서도 Semantic Leakage가 발생하는지 확인하고자 실험을 수행합니다.</p>
<ol>
<li>Multilingual<ul>
<li>Test Suite의 프롬프트를 중국어, 히브리어로 번역</li>
<li>관용구는 직접 대응되는 표현이 없으면 대상 언어권의 의미적으로 동등한 관용구로 대체</li>
<li>이름은 대상 언어권의 의미적으로 동등한 자연스러운 이름으로 대체 (예: Rye → 小麦 (=little wheat))</li>
</ul>
</li>
<li>Crosslingual<ul>
<li>프롬프트 앞부분은 중국어 or 히브리어, 뒷부분은 원문 영어</li>
<li>프롬프트 앞부분의 이름 및 관용구는 문자 그대로 번역된 내용을 사용</li>
<li>similarity 계산 시 영어 concept 사용 (출력이 영어로 예상되므로)</li>
</ul>
</li>
</ol>
<h4 id="open-ended-generation-setup">Open-Ended Generation Setup</h4>
<p>이야기, 레시피 생성 같은 긴 출력에서도 Semantic Leakage가 발생하는지 확인하고자 실험을 수행합니다.</p>
<ol>
<li>Story task<ul>
<li><code>Tell me a short story about a child named &lt;Name&gt;.</code> ← 총 23개 이름 사용</li>
</ul>
</li>
<li>Recipe task<ul>
<li><code>I want to use my &lt;color&gt; pan, give me a recipe.</code> ← 5색(blue, green, red, white, yellow)사용</li>
</ul>
</li>
</ol>
<ul>
<li>temperature = 1, 각 샘플 당 10회 생성</li>
<li>프롬프트 중복 반복 제거, LLAMA 출력은 첫 문장만 사용</li>
<li>Recipe 실험에서는 자동지표 계산 시 <code>&lt;color&gt; pan</code> 문자열 제거 (단순 반복 영향 배제를 위해)</li>
</ul>
<hr>
<h3 id="results">Results</h3>
<p>실험 결과를 요약하자면 다음과 같습니다.</p>
<ul>
<li>모든 모델에서 상당한 Semantic Leakage가 발생했다.</li>
<li>다국어 및 교차 언어 환경에서도 영어만을 사용했을 때와 유사한 수준의 Leakage가 발생했다.</li>
<li>개방형 생성(긴 생성)에서도 상당한 Leakage가 발생했다.</li>
</ul>
<p>또한 다음과 같은 흥미로운 결과가 나타났습니다.</p>
<ul>
<li>Instruction-Tuning된 모델에서 더 많은 Leakage가 발생했다.</li>
<li>Greedy Sampling(temperature=0)일 때 가장 많은 Leakage가 발생했다.</li>
</ul>
<p>아래에서 하나씩 살펴보겠습니다.</p>
<h4 id="automatic-evaluation">Automatic Evaluation</h4>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/38577d13-fdc2-44e2-8007-2e3632254e63/image.png" alt=""></p>
<p>앞서 Leak-Rate(%)가 50%보다 높을 경우 Semantic Leakage가 발생한 것으로 판단하기로 했습니다.
자동 평가 결과, <strong>모든 모델에서 50%를 훨씬 넘는 Leakage가 발생</strong>했습니다.</p>
<ul>
<li>GPT models의 경우, GPT-4o가 GPT-3.5, GPT-4에 비해 지속적으로 높은 Leakage를 보였습니다.</li>
<li>LLAMA models의 경우, Instruction-Tuning된 모델에서 더 많은 Leakage가 발생했습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/c7c4c94f-c195-4891-9f03-25c5d7f72b91/image.png" alt=""></p>
<ul>
<li>GPT models의 경우, temperature 값과 Leakage 사이의 명확한 경향이 발견되지 않았습니다.</li>
<li>LLAMA models의 경우, Greedy Sampling(t=0)일 때 가장 많은 Leakage가 발생했습니다.</li>
</ul>
<h4 id="human-evaluation">Human Evaluation</h4>
<p>앞서 수행한 자동 평가의 타당성을 검증하기 위해, 인간 평가를 진행했습니다.</p>
<p>영어 원어민 2명을 섭외하여, 실험 목적을 비공개한 채 <code>다음 문장 A, B 중 개념 X와 더 관련이 있는 문장은?</code> 라는 질문에 <code>[A, B, Neither]</code> 중 하나를 선택하도록 지시했습니다.
이후 {A: test , B: control, Neither: neither}로 매핑해 Leak-Rate를 산출했습니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/3e6a3ef7-d644-46d5-b59a-3a04ab11366f/image.png" alt=""></p>
<p><strong>인간 평가 결과, 자동 평가와 전반적 경향이 일치</strong>했습니다.</p>
<p>특히 인간 평가자 간 상관 계수(Kendall’s τ)는 0.68로 높은 유사성을 보였고, 
인간 평가와 자동 평가 간의 상관 계수(Kendall’s τ)는 0.39로 중간 정도의 유사성을 보였습니다.</p>
<h4 id="multilingual-and-corsslingual">Multilingual and Corsslingual</h4>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/bcbd93f6-ff97-4313-a2a5-ff35617b613a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/cafef0fd-5fe6-4ba5-890a-6d36b8b5cbf3/image.png" alt=""></p>
<p>자동 평가 및 인간 평가에서, <strong>영어만을 사용했을 때와 유사한 수준</strong>의 Leak-Rate를 보였습니다.</p>
<p>다만, 저자는 다국어 실험의 결과가 영어 실험만큼 신뢰할 수 없다고 밝혔습니다.
예컨대 오른쪽 표의 SB 항목을 보면 다국어(Heb, Zh)보다 교차언어(Heb-En, Zh-En)의 점수가 더 높게 나왔음을 확인할 수 있습니다.
이는 SentenceBERT가 주로 영어 문장으로 훈련된 모델이라, &#39;영어 concept ↔ 영어 generation&#39;의 의미 유사도를 더 정확하게 계산하기 때문입니다.</p>
<h4 id="open-ended-generation">Open-Ended Generation</h4>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/25470c9f-8390-45c3-b6a8-6ce2c4c78026/image.png" alt=""></p>
<p>개방형 생성 결과, 자동 평가에서 <code>BS: 74.0, SB: 58.0, OAI: 74.0</code>의 Leak-Rate가 발생했습니다.</p>
<p>이를 통해 앞서 Test Suite로 평가한 짧은 생성 뿐에서만 아니라, 
<strong>긴 생성에서도 상당한 Semantic Leakage가 발생</strong>함을 확인할 수 있습니다.</p>
<hr>
<h3 id="conclusion">Conclusion</h3>
<h4 id="요약-및-시사점">요약 및 시사점</h4>
<ul>
<li>언어 모델은 프롬프트의 의미적 요소가 불필요하게 생성으로 누출되는 현상 <strong>Semantic Leakage</strong>를 보인다.</li>
<li>Semantic Leakage는 다양한 모델, 언어, 생성 설정에서 반복적으로 관찰된다.</li>
<li>학습된 연관성에 의해 발생하는 Semantic Leakage는 기존 편향 현상과 유사한 성격을 지닌다.
(저자는 Semantic Leakage가 사회/문화적 편향, 인지/심리적 편향 등을 포함하는 광범위한 개념이라고 주장한다.)</li>
</ul>
<h4 id="contributions">Contributions</h4>
<ul>
<li>Semantic Leakage 발견 및 정의</li>
<li>Semantic Leakage 탐지를 위한 Test Suite 구축</li>
<li>다양한 모델에서의 만연성 입증 (다국어, 교차언어, 개방형 생성)</li>
<li>finetuned/instruction-tuned model에서 더 많은 leakage가 발생함을 발견</li>
</ul>
<h4 id="limitations">Limitations</h4>
<ul>
<li>수작업 제작의 한계로 test suite가 방대하지 않다.</li>
<li>실험에 포함되지 않은 모델 혹은 언어에서는 다른 경향성이 나타날 수 있다.</li>
<li>자동 평가에 노이즈가 섞일 수 있는데, prompt가 생성 결과에 반복될 때 실제 Leakage가 아님에도 Leakage로 집계될 수 있다. 
(다만 인간 평가와 자동 평가의 결과가 대체로 일치해 결과의 신뢰성을 뒷받침한다.)</li>
</ul>
<hr>
<h3 id="outro">Outro</h3>
<p>태어나서 처음으로 처음부터 끝까지 꼼꼼히 읽은 논문입니다.</p>
<p>전부터 LLM의 사회/문화적, 인지/심리적 편향을 관심있게 생각해왔는데 Introduction에서 &#39;Semantic Leakage는 이러한 편향들을 포함하는 넓은 개념&#39;이라고 주장하길래 흥미가 생겨 끝까지 읽었습니다.</p>
<p>최근 감사하게도 KT AI Future Lab장님과 저녁 식사를 하며 여러 조언을 들을 수 있었는데, KT에서도 <a href="https://arxiv.org/abs/2509.20057">Responsible AI</a>를 관심있게 다루고 있다고 말씀해주셨습니다.</p>
<p>개인적으로 KT라는 회사에 큰 관심을 가지고 있는데, 제 관심 분야와 KT의 관심 분야가 일치해 행운이라고 생각합니다. 
언젠가 저도 KT와 같은 좋은 회사에서 일할 수 있도록 열심히 살아가야겠습니다.</p>
<br>

<p>다만 논문의 내용에 의구심이 드는 부분이 있습니다.</p>
<blockquote>
<p>Q: <code>concept</code>와 <code>test generation</code>의 연관성을 단순히 similarity 연산만으로 파악할 수 있는가?</p>
</blockquote>
<p>예컨대, 
<code>My mom likes to eat bread. She works as a</code> (concept:<code>bread</code>)에 대해 <code>baker</code>라는 test generation이 발생한다면, $$\text{sim}<em>{\text{test}} &gt; \text{sim}</em>{\text{control}}$$일 것입니다.</p>
<p>그러나 그녀의 엄마가 정말로 빵 먹기를 좋아해서 제빵사로 일할 수도 있는 일입니다.</p>
<p>이러한 예시에서 논문의 Evaluation Metric을 고도화 하는게 좋겠다는 생각이 듭니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[<K intelligence 해커톤 2025: Track 1> 수상자 인터뷰]]></title>
            <link>https://velog.io/@beaver_zip/K-intelligence-%ED%95%B4%EC%BB%A4%ED%86%A4-2025-Track-1-%EC%88%98%EC%83%81%EC%9E%90-%EC%9D%B8%ED%84%B0%EB%B7%B0</link>
            <guid>https://velog.io/@beaver_zip/K-intelligence-%ED%95%B4%EC%BB%A4%ED%86%A4-2025-Track-1-%EC%88%98%EC%83%81%EC%9E%90-%EC%9D%B8%ED%84%B0%EB%B7%B0</guid>
            <pubDate>Wed, 24 Sep 2025 10:18:57 GMT</pubDate>
            <description><![CDATA[<p><a href="https://dacon.io/competitions/official/236599/talkboard/415256">https://dacon.io/competitions/official/236599/talkboard/415256</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[25.09.10 - 여름 방학 회고]]></title>
            <link>https://velog.io/@beaver_zip/25.09.10-%EC%97%AC%EB%A6%84-%EB%B0%A9%ED%95%99-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@beaver_zip/25.09.10-%EC%97%AC%EB%A6%84-%EB%B0%A9%ED%95%99-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Tue, 09 Sep 2025 18:44:35 GMT</pubDate>
            <description><![CDATA[<p>여름방학이 끝났다.
항상 방학을 마칠 때마다 게을렀던 내 모습을 돌이키며 후회했는데, 이번 방학은 나름대로 열심히 보낸 것 같아 후회가 남지 않는다.</p>
<p>방학 동안 대회를 많이 나갔다.</p>
<ul>
<li>제4회 고용노동 공공데이터 활용 공모전 - 장려상(4위 / 50팀)</li>
<li>제9회 2025 미래에셋증권 AI Festival - 하다가 어려워서 포기</li>
<li>금융보안원 2025 금융 AI Challenge - 본선 예비후보팀 (16위 / 283팀)</li>
<li>K intelligence 해커톤 2025: Track1 AI Agent 개발 - 평가 중</li>
</ul>
<p>부스트캠프 수료 이후 오랜만에 팀을 꾸려 대회에 참가할 수 있어 기뻤다.
큰 상을 받지는 못했지만, 그래도 처음으로 시상식에 나가 상을 받을 수 있어 영광이었다.
리더보드 순위 조금 올려보려고, 모듈 하나 고쳐보려고 새벽까지 몰입할 수 있어 너무 즐겁고 행복했다.
팀원 중 한 명이 &#39;오랜만에 두근두근했다&#39;는데, 나도 그랬다.</p>
<br>

<p>대회에 참여하면서 엔지니어링 역량이 조금이나마 는 것 같아 기쁘다.
다만, 아직 엔지니어와 연구자로의 갈림길에서 완전히 마음을 정하진 못했다.</p>
<p>사실 예전부터 지금까지 나는 개발보다는 연구가 더 재밌다.
그러나 몇 가지 고민과 걱정들이 결정을 어렵게 만든다.</p>
<ol>
<li><p>사람
내가 인간적으로 되게 좋아하는 형이 있는데, 재미있고 사람도 좋은데 개발까지 잘한다. 나도 그 형 옆에서 개발하면 일하는 게 즐거울 것 같고, 어깨너머로 많이 배울 수 있다는 생각이 든다.</p>
</li>
<li><p>능력
좋은 대학원에 갈 수 있을지, 그리고 거기서 의미 있는 연구를 해낼 수 있을지 걱정이 된다.</p>
</li>
<li><p>스트레스
나는 스트레스에 취약하다. 특히 자유롭게 행동하지 못하는 상황에서 절망하는데, 형도 힘들어한 대학원 생활을 잘 버틸 수 있을지 걱정된다.</p>
</li>
<li><p>미래
석사 과정을 마친 2년 뒤에도 일자리가 있을지 모르겠다.</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/9b6569d2-5fab-46fc-877f-4cd9a47bceb3/image.png" alt=""></p>
<p>하 씨 전직 뭐하지</p>
<br>

<p>요즘에는 길을 걸어가면서도 &#39;AI에 대체되지 않는 직업이 뭘까?&#39; 하는 생각을 하게 된다.
개발자로의 길이 두려운 것도 이 때문이다.</p>
<p>최근 <code>gemini-cli</code>와 같은 Agent를 이용해 개발하는데, 보통 아래와 같이 진행된다.</p>
<pre><code>나: 전체적인 로직 설계 및 사용할 기술 스택 지정
Agent: 뚝딱뚝딱 (꽤 잘 만들어줌)

나: 생성된 코드 검토 후 디테일 수정 지시
Agent: 딱뚝딱딱,, (슬슬 오류가 발생함)

나: 이러한 오류가 발생하니 원인을 찾아봐
Agent: 뜌땨?</code></pre><p>아직은 요상한 실수를 할 때가 많다. 그래서 중간에 내가 개입해서 의견을 제시하거나 오류를 직접 찾아 해결해 줘야 한다.</p>
<p>그런데 얼마 뒤에는 이런 개입이 전혀 필요 없을 수 있겠다는 생각이 든다.
그게 3년이 될지, 1년이 될지, 다음 달이 될지 모르겠다.</p>
<br>
대체되지 않는 직업이 뭘까?
당장 생각나는 것은 태권도 관장이나 교회 목사, 래퍼 등이다.

<p>내 생각이지만 아무도 AI에게 자식의 인성 교육을 맡기고 싶지 않을 것이고, 아무도 AI의 설교에 눈물 흘리며 헌금하지 않을 것이며, 아무도 AI의 랩에 감흥을 느끼지 않을 것이다.</p>
<p>사실 나는 락스타가 되고 싶다. 사람들을 미치게 만드는 
락스타를 감히 AI가 대체하겠는가?
하지만 내겐 락스타가 될 노래나 기타 실력도 없고, 외모도 매력도 안되니까 그냥 주제껏 건실하게 살아야겠다.</p>
<br>

<p>엊그제 학교에서 Google Campus Outreach 행사가 열렸다. 구글 부사장과 3명의 한국인 구글러들이 진로에 도움이 되는 이야기를 해주셨다. 
세 분 중 한 분은 고등학교 선배셨고, 한 분은 나랑 동갑이셔서 더 존경스러웠다.</p>
<p>특히 세 분 모두 &#39;Follow your heart&#39;라는 조언을 해주셨다. 되든 안 되든 좋아하는 걸 하라는 뜻이다.</p>
<p>행사 종료 후 한 분에게 가서 
&#39;저는 자연어 처리를 좋아하고 연구를 해보고 싶긴 하지만, 앞서 언급한 고민이 있고, 연구를 잘할 자신이 없습니다. 이럴 바에는 재미는 없어도 유망하고 남들이 잘 안 하는 걸 파는 게 좋을까요?&#39;라는 질문을 드렸다.</p>
<p>그 분께서는 좋아하는 거 하다가 실패하면 1배 손해인데, 별로 재미도 없는 거 하다가 실패하면 2배 손해니까 그냥 좋아하는 거 하라고 말씀하셨다. 
맞는 말이다.</p>
<br>

<p>앞으로 어떻게 해야할까
졸업 안하고 엔지니어로 취직해서 그대로 쭉 회사에 다닐까
다양한 경험이 중요하니 졸업을 미루고 우선 교환학생을 갔다온 뒤 생각해볼까
아님 걍 졸업 빨리하고 대학원에 갈까</p>
<p>잘몰겟음 ㅋㅋ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[나노 바나나 프롬프트 해킹]]></title>
            <link>https://velog.io/@beaver_zip/%EB%82%98%EB%85%B8-%EB%B0%94%EB%82%98%EB%82%98-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%ED%95%B4%ED%82%B9</link>
            <guid>https://velog.io/@beaver_zip/%EB%82%98%EB%85%B8-%EB%B0%94%EB%82%98%EB%82%98-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%ED%95%B4%ED%82%B9</guid>
            <pubDate>Sat, 30 Aug 2025 19:09:11 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/beaver_zip/post/a7c0476b-1a4e-4124-a136-6c48656d17b4/image.png" alt=""></p>
<p>Gemini가 가이드라인을 운운하며 생성을 거부할 경우 어떻게 해야 할까?</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/b2bdba06-8ae0-4429-94e7-8219811dd839/image.png" alt=""></p>
<p>밀어붙이면 된다.</p>
<p><a href="https://www.fmkorea.com/best/8851676676">출처</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Decoding Strategies in Large Language Models]]></title>
            <link>https://velog.io/@beaver_zip/Decoding-Strategies-in-Large-Language-Models</link>
            <guid>https://velog.io/@beaver_zip/Decoding-Strategies-in-Large-Language-Models</guid>
            <pubDate>Wed, 06 Aug 2025 11:05:59 GMT</pubDate>
            <description><![CDATA[<h4 id="들어가며">들어가며</h4>
<p>이 글은 2024-10-29에 작성된 <a href="https://huggingface.co/blog/mlabonne/decoding-strategies">Decoding Strategies in Large Language Models</a> (by Maxime Labonne)을 읽고 번역 및 요약한 글입니다.</p>
<p>이 글은 다음의 내용을 다룹니다.</p>
<ul>
<li>디코딩 전략(greedy, beam search, top-k sampling, nucleus sampling)의 동작 방식</li>
<li>주요 파라미터(temperature, num_beams, top_k, top_p) 조정 방법</li>
</ul>
<p>이 글에 사용된 코드는 <a href="https://colab.research.google.com/drive/19CJlOS5lI29g-B3dziNn93Enez1yiHk2?usp=sharing">Google Colab</a>에서 확인할 수 있습니다.</p>
<hr>
<h3 id="배경">배경</h3>
<p>대규모 언어 모델(LLM)이 텍스트를 생성할 때, 사람들은 흔히 모델이 직접 단어를 &quot;생각&quot;해서 문장을 만든다고 오해합니다. 하지만 실제 과정은 훨씬 더 수학적입니다. 모델은 입력된 텍스트 시퀀스를 바탕으로, 어휘집(vocabulary)에 있는 모든 가능한 다음 토큰에 대해 점수, 즉 <strong>로짓(logit)</strong>을 계산합니다. 이 로짓 값은 소프트맥스(softmax) 함수를 통해 확률 분포로 변환됩니다.</p>
<p>예를 들어, GPT-2 모델에 <code>I have a dream</code>이라는 프롬프트를 입력하면, 모델은 다음에 올 토큰의 확률을 계산합니다. 가장 가능성 있는 토큰은 <code>that</code>일 수도 있고, 다른 토큰일 수도 있습니다. 원문 블로그의 예시에서는 다음 토큰으로 <code>of</code>가 올 확률, 즉 $P(\text{of} | \text{&quot;I have a dream&quot;}) = 17%$ 라고 설명합니다.</p>
<p>이렇게 생성된 확률 분포로부터 실제로 다음 토큰 하나를 &#39;선택&#39;하는 방법이 바로 <strong>디코딩 전략(Decoding Strategy)</strong>입니다. 어떤 전략을 선택하느냐에 따라 생성되는 텍스트의 품질, 창의성, 일관성이 크게 달라집니다. 모델은 한 번에 한 토큰씩 텍스트를 생성하며, 이전에 생성된 토큰을 다시 입력의 일부로 사용하는 <strong>자동 회귀(auto-regressive)</strong> 방식을 따릅니다.</p>
<p>이제부터 주요 디코딩 전략들을 하나씩 살펴보겠습니다.</p>
<h3 id="1-greedy-search-탐욕-검색">1. Greedy Search (탐욕 검색)</h3>
<p><strong>Greedy Search</strong>는 가장 직관적이고 간단한 디코딩 전략입니다. 각 단계(timestep)에서 가장 높은 확률을 가진 토큰을 선택하고, 다음 단계로 넘어갑니다. 이 과정을 원하는 길이의 시퀀스가 생성될 때까지 반복합니다.</p>
<h4 id="동작-방식">동작 방식</h4>
<ol>
<li><code>I have a dream</code> 입력에 대해 모델이 계산한 확률 분포에서 가장 확률이 높은 토큰을 선택합니다. (예: <code>of</code>)</li>
<li>새로운 시퀀스 <code>I have a dream of</code>를 모델의 다음 입력으로 사용합니다.</li>
<li>다시 가장 확률이 높은 다음 토큰을 선택합니다. (예: <code>being</code>)</li>
<li>이 과정을 반복하여 최종적으로 <code>I have a dream of being a doctor.</code>와 같은 문장을 생성할 수 있습니다.</li>
</ol>
<h4 id="장점">장점</h4>
<ul>
<li><strong>속도와 효율성</strong>: 계산적으로 매우 간단하여 가장 빠르게 결과를 생성할 수 있습니다.</li>
<li><strong>결정론적(Deterministic)</strong>: 동일한 입력에 대해서는 항상 동일한 출력을 보장합니다.</li>
</ul>
<h4 id="단점">단점</h4>
<ul>
<li><strong>근시안적 접근</strong>: 각 단계에서는 최적의 선택이지만, 전체적으로는 최적의 시퀀스를 놓칠 수 있습니다. 예를 들어, <code>being</code> ($P=9.68%$)과 <code>doctor</code> ($P=2.86%$)의 확률이 상대적으로 낮았음에도 불구하고, 첫 단계에서 <code>of</code>를 선택했기 때문에 이 경로에 갇히게 됩니다. 더 높은 전체 확률을 가진 다른 시퀀스가 존재할 수 있지만 Greedy Search는 이를 고려하지 않습니다.</li>
<li><strong>반복적인 결과</strong>: 고품질의 자연스러운 텍스트를 생성하는 데 실패하는 경우가 많으며, 특정 구문이 반복되는 현상이 발생하기 쉽습니다.</li>
</ul>
<p>이러한 명백한 단점 때문에 Greedy Search는 실제 애플리케이션에서는 거의 사용되지 않지만, 다른 고급 전략들을 이해하기 위한 좋은 출발점입니다.</p>
<h3 id="2-beam-search-빔-검색">2. Beam Search (빔 검색)</h3>
<p><strong>Beam Search</strong>는 Greedy Search의 근시안적인 단점을 보완하는 전략입니다. 각 단계에서 단 하나의 최선이 아닌, <strong><code>num_beams</code></strong>라는 파라미터로 지정된 개수만큼의 가장 가능성 있는 시퀀스(가설)를 유지하고 확장해 나갑니다.</p>
<h4 id="동작-방식-1">동작 방식</h4>
<p><code>num_beams=2</code>라고 가정해 보겠습니다.</p>
<ol>
<li>첫 번째 단계에서 가장 확률이 높은 2개의 토큰(예: <code>of</code>, <code>that</code>)을 선택하여 두 개의 독립적인 가설(<code>I have a dream of</code>, <code>I have a dream that</code>)을 생성합니다.</li>
<li>두 번째 단계에서는, 이 두 가설 각각에 대해 다음에 올 모든 토큰의 확률을 계산합니다. 그러면 수많은 가능한 두 토큰 시퀀스가 생성됩니다.</li>
<li>모든 가능한 시퀀스들의 <strong>누적 점수(일반적으로 로그 확률의 합)</strong>를 계산하고, 가장 높은 점수를 가진 상위 <code>num_beams</code>(2개)의 시퀀스만 유지하고 나머지는 폐기합니다.</li>
<li>이 과정을 목표 길이에 도달할 때까지 반복한 후, 최종적으로 가장 높은 누적 점수를 가진 시퀀스를 결과로 반환합니다.</li>
</ol>
<p>원문의 예시에서는 Beam Search를 적용했을 때 <code>I have a dream...</code> 이라는 더 일관성 있는 (혹은 안전한) 결과가 생성되었습니다.</p>
<h4 id="장점-1">장점</h4>
<ul>
<li><strong>더 높은 품질</strong>: Greedy Search보다 훨씬 더 전체적인 맥락에서 높은 확률을 갖는 시퀀스를 탐색하므로, 더 일관되고 품질 좋은 문장을 생성합니다.</li>
<li><strong>특정 과제에 유리</strong>: 번역이나 요약처럼 정답의 범위가 비교적 명확하고 높은 정확도가 요구되는 작업에서 뛰어난 성능을 보입니다.</li>
</ul>
<h4 id="단점-1">단점</h4>
<ul>
<li><strong>계산 비용</strong>: <code>num_beams</code>의 크기에 비례하여 계산량과 메모리 사용량이 증가합니다.</li>
<li><strong>창의성 및 다양성 부족</strong>: 여전히 가장 가능성 있는 결과에 집중하기 때문에, 인간처럼 창의적이거나 예상치 못한 텍스트를 생성하기는 어렵습니다.</li>
<li><strong>반복 문제</strong>: Greedy Search보다는 덜하지만, 여전히 일반적인 문구나 단어를 반복하는 경향이 있습니다. 이를 완화하기 위해 n-gram penalty와 같은 추가 기법이 필요합니다.</li>
</ul>
<h3 id="3-sampling-샘플링">3. Sampling (샘플링)</h3>
<p>Greedy Search와 Beam Search는 확률이 가장 높은 결과를 따라가는 <strong>결정론적</strong> 방법입니다. 하지만 인간의 언어는 항상 예측 가능하지 않으며, 때로는 덜 예상되는 단어가 문장을 더 풍부하게 만듭니다. 이러한 <strong>무작위성(stochasticity)</strong>과 창의성을 모델에 주입하기 위해 <strong>Sampling</strong> 기법이 사용됩니다.</p>
<p>가장 기본적인 샘플링은 모델이 출력한 확률 분포에 따라 다음 토큰을 무작위로 선택하는 것입니다. 하지만 확률이 매우 낮은 부적절한 단어까지 선택될 위험이 있어, 이를 제어하기 위한 여러 전략이 등장했습니다.</p>
<h3 id="4-temperature-온도">4. Temperature (온도)</h3>
<p>Sampling의 무작위성을 조절하는 핵심 파라미터가 바로 <strong>Temperature</strong>입니다. Temperature는 소프트맥스 함수가 적용되기 전의 로짓 값에 적용되어 확률 분포를 변형시킵니다.</p>
<p>로짓 벡터 $L = (l_1, l_2, ..., l_V)$에 대해, Temperature $T$가 적용된 새로운 확률 $p_i$는 다음과 같이 계산됩니다.
$$p_i = \frac{\exp(l_i / T)}{\sum_{j} \exp(l_j / T)}$$</p>
<ul>
<li><strong>$T &lt; 1$ (예: 0.7)</strong>: 로짓 값의 차이가 증폭되어 확률 분포가 더 뾰족해집니다(sharper). 모델은 확률이 높은 토큰을 선택할 가능성이 더 커져, 더 안정적이고 예측 가능한 텍스트를 생성합니다. Greedy Search와 유사해집니다.</li>
<li><strong>$T = 1$</strong>: 원래 모델의 확률 분포를 그대로 사용합니다.</li>
<li><strong>$T &gt; 1$ (예: 1.5)</strong>: 로짓 값의 차이가 줄어들어 확률 분포가 더 평평해집니다(flatter). 확률이 낮은 토큰도 선택될 가능성이 생겨, 더 다양하고 창의적이며 예상치 못한 텍스트가 생성됩니다. 하지만 너무 높으면 문맥과 무관한 단어가 등장할 수 있습니다.</li>
</ul>
<h3 id="5-top-k-sampling">5. Top-K Sampling</h3>
<p><strong>Top-K Sampling</strong>은 샘플링의 품질을 높이기 위한 간단하면서도 효과적인 방법입니다. 전체 어휘집에서 샘플링하는 대신, <strong>가장 확률이 높은 상위 K개의 토큰</strong>으로 후보를 제한하고, 그 안에서만 확률에 비례하여 샘플링을 진행합니다.</p>
<h4 id="동작-방식-2">동작 방식</h4>
<ol>
<li><code>top_k=50</code>으로 설정하면, 모델이 예측한 모든 토큰 중 가장 확률이 높은 50개를 추립니다.</li>
<li>이 50개의 토큰에 대해서만 확률 분포를 재정규화(re-normalize)합니다.</li>
<li>재정규화된 분포에 따라 다음 토큰을 샘플링합니다.</li>
</ol>
<p>원문의 예시에서는 Top-K 샘플링을 통해 <code>I have a dream job and I want to</code>와 같이 더 자연스러운 문장이 생성되었습니다.</p>
<h4 id="장점-2">장점</h4>
<ul>
<li><strong>품질과 다양성의 균형</strong>: 확률이 매우 낮은 엉뚱한 토큰이 선택되는 것을 방지하여 문장의 일관성을 유지하면서도, 적절한 수준의 창의성을 부여합니다.</li>
</ul>
<h4 id="단점-2">단점</h4>
<ul>
<li><strong>고정된 K의 한계</strong>: 확률 분포의 형태에 따라 유연하게 대처하지 못합니다. 예를 들어, 모델이 다음에 올 단어를 매우 확신하는 경우(분포가 뾰족함) K가 50이면 불필요하게 많은 후보를 고려하게 되고, 반대로 여러 가능성이 있는 경우(분포가 평평함) K가 너무 작으면 좋은 후보를 놓칠 수 있습니다.</li>
</ul>
<h3 id="6-nucleus-sampling-top-p-sampling">6. Nucleus Sampling (Top-P Sampling)</h3>
<p><strong>Nucleus Sampling</strong> (또는 <strong>Top-P Sampling</strong>)은 Top-K의 한계를 극복하기 위해 제안된 더욱 정교한 전략입니다. 후보 토큰의 개수(K)를 고정하는 대신, 후보들의 <strong>누적 확률 합(P)</strong>을 기준으로 동적으로 후보 집합의 크기를 조절합니다.</p>
<h4 id="동작-방식-3">동작 방식</h4>
<ol>
<li><code>top_p=0.9</code>로 설정하면, 확률이 높은 순서대로 토큰을 정렬합니다.</li>
<li>누적 확률이 0.9를 초과하는 지점까지의 토큰들로 후보 집합(nucleus)을 구성합니다.</li>
<li>이 후보 집합 내에서만 확률을 재정규화하여 샘플링을 수행합니다.</li>
</ol>
<p>이 방식의 핵심은 확률 분포의 모양에 따라 후보 집합의 크기가 달라진다는 점입니다.</p>
<ul>
<li><strong>분포가 뾰족할 때 (모델의 확신이 높을 때)</strong>: 소수의 토큰만으로도 누적 확률 $P$에 도달하므로 후보 집합이 작아집니다.</li>
<li><strong>분포가 평평할 때 (모델의 확신이 낮을 때)</strong>: 더 많은 토큰이 있어야 누적 확률 $P$에 도달하므로 후보 집합이 커집니다.</li>
</ul>
<p>원문의 예시에서는 Nucleus Sampling을 통해 <code>I have a dream. I&#39;m going to</code>라는, 의미적으로 더 발전된 문장이 생성되었습니다. 이 전략은 유연성 덕분에 현재 많은 LLM에서 기본적으로 사용될 만큼 높은 성능을 보여줍니다.</p>
<h3 id="결론-및-요약">결론 및 요약</h3>
<table>
<thead>
<tr>
<th align="left">전략</th>
<th align="left">동작 방식</th>
<th align="left">장점</th>
<th align="left">단점</th>
<th align="left">주요 파라미터</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>Greedy Search</strong></td>
<td align="left">각 단계에서 가장 확률이 높은 토큰($P_{max}$)을 선택</td>
<td align="left">빠르고 간단함</td>
<td align="left">근시안적, 반복적, 품질 저하</td>
<td align="left">-</td>
</tr>
<tr>
<td align="left"><strong>Beam Search</strong></td>
<td align="left"><code>num_beams</code>개의 가장 가능성 있는 시퀀스를 유지하며 탐색</td>
<td align="left">Greedy Search보다 고품질, 정확성</td>
<td align="left">계산 비용 높음, 창의성 부족</td>
<td align="left"><code>num_beams</code></td>
</tr>
<tr>
<td align="left"><strong>Top-K Sampling</strong></td>
<td align="left">확률 상위 K개의 토큰 중에서 샘플링</td>
<td align="left">품질과 다양성의 균형</td>
<td align="left">확률 분포 변화에 둔감</td>
<td align="left"><code>top_k</code>, <code>temperature</code></td>
</tr>
<tr>
<td align="left"><strong>Nucleus Sampling</strong></td>
<td align="left">누적 확률 P를 넘는 최소한의 토큰 집합(Nucleus)에서 샘플링</td>
<td align="left">확률 분포에 따라 동적으로 후보 조절, 고품질 및 다양성</td>
<td align="left">Top-K보다 약간 복잡</td>
<td align="left"><code>top_p</code>, <code>temperature</code></td>
</tr>
</tbody></table>
<p>최적의 디코딩 전략은 해결하려는 과제에 따라 달라집니다.</p>
<ul>
<li><strong>정확성과 사실 기반 응답이 중요할 때 (번역, 요약, 질의응답)</strong>: <code>num_beams</code>를 적절히 설정한 <strong>Beam Search</strong>나, <code>temperature</code>를 낮춘 샘플링 방식이 유용할 수 있습니다.</li>
<li><strong>창의성과 다양성이 중요할 때 (스토리 생성, 창의적 글쓰기, 챗봇 대화)</strong>: <code>temperature</code>를 약간 높이고 <strong>Nucleus Sampling (Top-P)</strong>을 사용하는 것이 가장 일반적이고 효과적인 조합입니다.</li>
</ul>
<p>이러한 디코딩 전략과 파라미터들의 작동 원리를 이해하고 조절함으로써, 
우리는 LLM이 생성하는 결과물의 방향성과 품질을 효과적으로 제어할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[03 프롬프트 엔지니어링]]></title>
            <link>https://velog.io/@beaver_zip/03-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81</link>
            <guid>https://velog.io/@beaver_zip/03-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81</guid>
            <pubDate>Sun, 27 Jul 2025 06:20:27 GMT</pubDate>
            <description><![CDATA[<h4 id="들어가며">들어가며</h4>
<p><a href="https://product.kyobobook.co.kr/detail/S000216696499">랭체인과 랭그래프로 구현하는 RAG·AI 에이전트 실전 입문</a>과 <a href="https://www.promptingguide.ai">Prompt Engineering Guide</a> 을 읽고 요약한 글입니다.</p>
<hr>
<h2 id="프롬프트-엔지니어링이란">프롬프트 엔지니어링이란?</h2>
<p>LLM으로부터 원하는 출력을 얻기 위해 입력하는 프롬프트를 설계하거나 최적화하는 것</p>
<h4 id="프롬프트-엔지니어링-vs-파인튜닝">프롬프트 엔지니어링 vs 파인튜닝</h4>
<ul>
<li><strong>프롬프트 엔지니어링</strong>은 모델의 가중치를 변경하지 않고 입력(프롬프트)을 조정하여 출력을 제어하는 반면, <strong>파인튜닝</strong>은 특정 데이터셋으로 모델을 추가 학습시켜 모델의 가중치 자체를 미세 조정하는 과정입니다. 파인튜닝은 더 많은 비용과 데이터가 필요하지만 특정 작업에 고도로 전문화된 모델을 만들 수 있습니다.<h4 id="프롬프트의-구성-요소">프롬프트의 구성 요소</h4>
</li>
<li><strong>지시(Instruction)</strong>: 모델이 수행해야 할 작업에 대한 구체적인 설명</li>
<li><strong>맥락(Context)</strong>: 모델이 더 나은 응답을 생성하는 데 도움이 되는 배경 정보 또는 추가 정보</li>
<li><strong>입력 데이터(Input Data)</strong>: 모델이 처리해야 할 정보 또는 질문</li>
<li><strong>출력 지시어(Output Indicator)</strong>: 생성할 출력의 유형이나 형식을 지정</li>
</ul>
<hr>
<h2 id="프롬프트-엔지니어링-기법">프롬프트 엔지니어링 기법</h2>
<h3 id="zero-shot">Zero-shot</h3>
<ul>
<li>예제나 데이터를 모델에게 미리 학습시키지 않고, 모델의 사전 학습 지식만을 활용해 새로운 작업을 수행하는 방법</li>
<li>모델이 특정 도메인이나 작업에 대해 특별히 훈련되지 않았을 때 사용되며, 다양한 작업에 모델의 일반화 능력을 테스트하는 데 유용함.<h4 id="프롬프트-예시">프롬프트 예시</h4>
<pre><code>주어진 텍스트를 긍정, 부정, 중립 중 하나로 분류하세요.
텍스트: 휴가는 괜찮을 것 같아요.
감정:</code></pre><h4 id="출력-예시">출력 예시</h4>
<pre><code>중립</code></pre><h3 id="few-shot">Few-shot</h3>
</li>
<li>모델이 더 나은 성능을 내도록 프롬프트에 몇 가지 시연(demonstration) 또는 예시를 포함하는 기법.</li>
<li>예시를 통해 모델은 작업의 맥락, 형식, 요구사항을 학습하여 더 복잡하고 새로운 작업에 빠르게 적응할 수 있음.<h4 id="프롬프트-예시-1">프롬프트 예시</h4>
<pre><code>Task: Correct the grammar of the following sentences.
</code></pre></li>
</ul>
<p>Example 1:
Incorrect: She go to the store.
Correct: She goes to the store.</p>
<p>Example 2:
Incorrect: They is happy.
Correct: They are happy.</p>
<p>Now, correct the following sentence:
Incorrect: We was playing soccer.
Correct:</p>
<pre><code>#### 출력 예시</code></pre><p>We were playing soccer.</p>
<pre><code>### Self-Consistency
- 하나의 프롬프트에 대해 여러 개의 다양한 추론 경로를 생성하게 한 후, 그중 가장 일관된(가장 많이 나온) 답변을 최종 결과로 선택하는 기법.
- 단순한 탐욕적 디코딩(greedy decoding)을 대체하여, 산술이나 상식 추론 문제의 성능을 향상시킴.
#### 프롬프트 예시</code></pre><p>Q: 제가 6살 때 제 여동생은 제 나이의 절반이었습니다. 지금 저는 70살입니다. 제 여동생은 몇 살일까요?
A:</p>
<pre><code>#### 출력 예시</code></pre><p><em>생성 1:</em> 제가 6살 때 여동생은 제 나이의 절반이었으므로 3살이었습니다. 지금 제가 70살이니, 여동생은 70 - 3 = 67살입니다. 답은 67입니다.</p>
<p><em>생성 2:</em> 화자가 6살일 때 그의 여동생은 그의 나이의 절반인 3살이었습니다. 이제 화자가 70살이므로, 그의 여동생은 70 - 3 = 67세가 될 것입니다. 답은 67입니다.</p>
<p><em>생성 3:</em> 제가 6살 때 여동생은 제 나이의 절반이었으므로 3살이었습니다. 지금 저는 70살이니, 여동생은 70/2 = 35살입니다. 답은 35입니다.</p>
<p>-&gt; 최종 답변: 여러 추론 과정 중 다수를 차지한 67이 최종 답변으로 선택됩니다[14].</p>
<pre><code>### Generate Knowledge Prompting
- 모델에게 먼저 과업과 관련된 유용한 지식을 생성하도록 요청한 다음, 이 지식을 활용하여 원래의 질문에 답하게 하는 2단계 기법.
- 복잡한 질문에 대해 모델이 더 깊이 있는 맥락을 이해하고 정확한 답변을 생성하도록 유도함.
#### 프롬프트 예시</code></pre><h1 id="1단계-지식-생성">1단계: 지식 생성</h1>
<p>Question: 뉴욕에서 런던으로 가는 항공편이 취소된 경우 재예약 옵션은 무엇인가요?
Knowledge: 뉴욕에서 출발하는 승객에 대한 현재 영국 여행 제한 사항과 뉴욕에서 런던으로 가는 다음 항공편의 이용 가능 여부를 확인하세요.</p>
<h1 id="2단계-지식-통합-및-답변-생성">2단계: 지식 통합 및 답변 생성</h1>
<p>Knowledge: &quot;현재 영국 여행 제한으로 인해 일부 항공편만 운항이 허용됩니다. 뉴욕에서 런던으로 가는 다음 이용 가능한 항공편은 [날짜]입니다.&quot;
User Query: 항공편이 취소된 승객을 위한 재예약 옵션은 무엇인가요?</p>
<pre><code>#### 출력 예시</code></pre><p>현재 영국 여행 제한으로 인해 항공편 운항이 제한적입니다. 이용 가능한 다음 항공편은 [날짜]이며, 해당 항공편으로 재예약하시거나 전액 환불을 받으실 수 있습니다. 자세한 사항은 항공사 고객 서비스 센터로 문의해 주시기 바랍니다.</p>
<pre><code>### Prompt Chaining
- 복잡한 작업을 여러 개의 논리적인 하위 작업으로 분해하고, 각 단계를 순차적으로 처리하는 기법.
- 한 프롬프트의 출력이 다음 프롬프트의 입력으로 사용되어, 전체적인 작업의 신뢰성과 투명성을 높임.
#### 프롬프트 예시</code></pre><h1 id="프롬프트-1-고객-리뷰에서-핵심-제품과-감정-추출">프롬프트 1: 고객 리뷰에서 핵심 제품과 감정 추출</h1>
<p>고객 리뷰: &quot;새로 산 XYZ 스마트폰 카메라는 정말 놀랍지만, 배터리가 너무 빨리 닳아서 실망스러워요.&quot;
이 리뷰에서 언급된 제품 기능과 각각에 대한 긍정/부정 감정을 추출해줘.</p>
<h1 id="프롬프트-2-추출된-정보를-바탕으로-요약문-생성">프롬프트 2: 추출된 정보를 바탕으로 요약문 생성</h1>
<p>(프롬프트 1의 출력) 제품 기능: 카메라(긍정), 배터리(부정)
위 정보를 바탕으로 고객 피드백을 한 문장으로 요약해줘.</p>
<pre><code>#### 출력 예시</code></pre><p>XYZ 스마트폰은 카메라 성능에 대해서는 긍정적인 평가를 받았지만, 배터리 수명에 대해서는 부정적인 피드백이 있습니다.</p>
<pre><code>### Tree of Thoughts
- &#39;사고의 연쇄(CoT)&#39;를 일반화하여, 문제 해결 과정에서 단일 경로가 아닌 여러 추론 경로를 트리 형태로 탐색하는 기법.
- 모델은 각 단계에서 여러 가능한 &#39;생각(thoughts)&#39;을 생성하고 평가하여 최적의 해결책을 찾아 나감.
#### 프롬프트 예시</code></pre><p>문제: 숫자 4, 9, 10, 13을 사용하여 정확히 24를 만드는 수식을 찾아라. 각 숫자는 한 번씩만 사용해야 한다.
생각 생성: 이 문제를 해결하기 위한 첫 단계로 가능한 연산들을 떠올려보자.</p>
<ul>
<li>10 - 4 = 6. 남은 숫자 9, 13. 6, 9, 13으로 24를 만들 수 있을까?</li>
<li>13 - 9 = 4. 남은 숫자 4, 10. 4, 4, 10으로 24를 만들 수 있을까?</li>
<li>...<pre><code>#### 출력 예시</code></pre>(10 - 4) * (13 - 9) = 6 * 4 = 24. 답은 (10-4)*(13-9)입니다.
```<h3 id="retrieval-augmented-generation-rag">Retrieval Augmented Generation (RAG)</h3>
</li>
<li>LLM의 학습 데이터 외부의 신뢰할 수 있는 지식 베이스(예: 데이터베이스, 문서)에서 관련 정보를 검색(Retrieve)하고, 이 정보를 프롬프트에 추가하여 답변을 생성(Generate)하는 기법.</li>
<li>모델이 최신 정보나 특정 도메인 지식을 참조하여 더 정확하고 신뢰성 있는 답변을 생성하게 함.<h4 id="프롬프트-예시-2">프롬프트 예시</h4>
<pre><code># 1단계: 정보 검색
사용자 질문: &quot;연차 휴가가 얼마나 남았나요?&quot;
시스템: (인사 데이터베이스에서 &#39;홍길동&#39;의 연차 정책 문서와 과거 휴가 기록을 검색)
</code></pre></li>
</ul>
<h1 id="2단계-프롬프트-증강-및-답변-생성">2단계: 프롬프트 증강 및 답변 생성</h1>
<p>증강된 프롬프트:</p>
<ul>
<li>검색된 정보: &quot;홍길동의 연간 연차는 15일이며, 올해 5일을 사용했습니다.&quot;</li>
<li>사용자 질문: &quot;연차 휴가가 얼마나 남았나요?&quot;
LLM, 위 정보를 바탕으로 질문에 답하세요.<pre><code>#### 출력 예시</code></pre>귀하의 연차 휴가는 총 15일 중 5일을 사용하셨으며, 현재 10일이 남아있습니다.
```<h3 id="automatic-reasoning-and-tool-use-art">Automatic Reasoning and Tool-use (ART)</h3>
</li>
<li>새로운 작업에 대해 LLM이 스스로 추론 단계를 나누고, 각 단계에 필요한 외부 도구(예: 검색 엔진, 코드 실행기)를 자동으로 선택하고 사용하는 프레임워크.</li>
<li>작업 라이브러리에서 유사한 작업 예시를 참조하여 few-shot 방식으로 문제 분해 및 도구 사용법을 학습함.<h4 id="프롬프트-예시-3">프롬프트 예시</h4>
<pre><code>질문: 에펠탑이 있는 나라의 현재 대통령은 누구이며, 그 나라 인구의 제곱근은 얼마인가?
</code></pre></li>
</ul>
<h1 id="art-시스템의-자동-생성-계획">ART 시스템의 자동 생성 계획:</h1>
<ol>
<li>&quot;에펠탑이 있는 나라&quot;가 어디인지 검색 도구를 사용해 찾아라.</li>
<li>1번 결과로 나온 나라의 &quot;현재 대통령&quot;이 누구인지 검색 도구를 사용해 찾아라.</li>
<li>1번 결과로 나온 나라의 &quot;현재 인구&quot;를 검색 도구를 사용해 찾아라.</li>
<li>3번 결과로 나온 인구 수에 대해 &quot;제곱근&quot;을 계산기 도구를 사용해 계산하라.</li>
<li>2번과 4번의 결과를 조합하여 최종 답변을 생성하라.<pre><code>#### 출력 예시</code></pre>에펠탑이 있는 나라인 프랑스의 현재 대통령은 에마뉘엘 마크롱이며, 프랑스 인구(약 6,500만 명)의 제곱근은 약 8062입니다.
```<h3 id="automatic-prompt-engineer-ape">Automatic Prompt Engineer (APE)</h3>
</li>
</ol>
<ul>
<li>효과적인 프롬프트를 사람이 직접 설계하는 대신, LLM을 사용하여 주어진 작업에 대한 최적의 프롬프트를 자동으로 생성하고 선택하는 기법.</li>
<li>초기 지침을 바탕으로 다양한 후보 프롬프트를 생성하고, 점수를 매겨 가장 성능이 좋은 프롬프트를 최종적으로 채택함.<h4 id="프롬프트-예시-4">프롬프트 예시</h4>
<pre><code># 초기 목표
주어진 문장의 감정을 분석하는 프롬프트를 만들어라.
</code></pre></li>
</ul>
<h1 id="ape가-생성한-후보-프롬프트들">APE가 생성한 후보 프롬프트들</h1>
<ol>
<li>이 문장은 긍정적인가, 부정적인가, 중립적인가?</li>
<li>다음 텍스트의 감정 톤을 평가하라.</li>
<li>주어진 텍스트를 [긍정, 부정, 중립] 중 하나로 분류하세요.
...</li>
</ol>
<h1 id="ape의-선택">APE의 선택</h1>
<p>(내부 평가 후) 3번 프롬프트가 가장 명확하고 높은 성능을 보이므로 최종 프롬프트로 선택.</p>
<pre><code>#### 출력 예시</code></pre><p>&quot;주어진 텍스트를 [긍정, 부정, 중립] 중 하나로 분류하세요.&quot;</p>
<pre><code>### Active-Prompt
- 어떤 예시가 모델에게 가장 유용한지(가장 불확실한지)를 식별하여 해당 예시에 대해서만 사람의 주석(annotation)을 요청하는 기법.
- 이렇게 수집된 소수의 중요한 예시들을 활용하여 few-shot 프롬프트를 구성함으로써, 최소한의 비용으로 모델 성능을 극대화함.
#### 프롬프트 예시</code></pre><h1 id="1단계-불확실한-질문-식별">1단계: 불확실한 질문 식별</h1>
<p>모델에게 여러 질문을 제시하고, 어떤 질문이 가장 답변하기 어려운지(불확실성이 높은지) 스스로 평가하게 함.</p>
<h1 id="2단계-주석-요청-및-프롬프트-구성">2단계: 주석 요청 및 프롬프트 구성</h1>
<p>가장 불확실하다고 판단된 질문에 대해 사람에게 정답을 요청하고, 이 (질문, 정답) 쌍을 few-shot 예시로 프롬프트에 추가함.</p>
<pre><code>#### 출력 예시</code></pre><p>(Active-Prompt로 구성된 예시가 포함된 프롬프트를 통해 더 정확하고 일관된 답변을 생성)</p>
<pre><code>### Directional Stimulus Prompting
- 모델이 원하는 결과물을 생성하도록 유도하기 위해, 프롬프트에 특정 키워드, 힌트, 단서와 같은 &#39;방향성 자극&#39;을 포함시키는 기법.
- 결과물의 주제, 스타일, 포함될 내용 등을 명시적으로 지정하여 모델의 창의성을 특정 방향으로 이끌어 줌.
#### 프롬프트 예시</code></pre><p>미래 도시의 외로운 탐정에 대한 짧은 이야기를 써줘. 이야기에 &#39;네온&#39;, &#39;비&#39;, &#39;사이보그&#39;, &#39;음모&#39;라는 단어를 반드시 포함해줘.</p>
<pre><code>#### 출력 예시</code></pre><p>자정의 비가 거리를 적시자, 도시의 네온 불빛이 젖은 아스팔트 위에서 번져나갔다. 탐정 잭은 낡은 트렌치코트 깃을 올렸다. 이번 사건은 단순한 실종이 아니었다. 거대 기업의 음모가 숨 쉬고 있었고, 그 중심에는 기억을 잃은 사이보그 증인이 있었다.</p>
<pre><code>### Program-Aided Language Models (PAL)
- 자연어(LLM)와 프로그래밍 언어(Python 등)를 함께 사용하여 문제를 해결하는 기법.
- LLM이 문제 해결을 위한 논리적 단계를 자연어로 생각하고, 실제 계산이나 실행은 코드로 작성하여 인터프리터를 통해 수행함.
#### 프롬프트 예시</code></pre><p>문제: 카페에서 5달러짜리 커피 3잔과 3달러짜리 베이글 2개를 샀다. 총 얼마를 내야 하는가? 파이썬 코드로 풀어줘.</p>
<h1 id="llm의-생각과-코드-생성">LLM의 생각과 코드 생성</h1>
<h1 id="커피-가격을-계산한다">커피 가격을 계산한다.</h1>
<p>coffee_price = 5 * 3</p>
<h1 id="베이글-가격을-계산한다">베이글 가격을 계산한다.</h1>
<p>bagel_price = 3 * 2</p>
<h1 id="총액을-계산한다">총액을 계산한다.</h1>
<p>total_price = coffee_price + bagel_price</p>
<pre><code>#### 출력 예시</code></pre><p>def solution():
    coffee_price = 5 * 3
    bagel_price = 3 * 2
    total_price = coffee_price + bagel_price
    return total_price</p>
<h1 id="실행-결과-21">실행 결과: 21</h1>
<pre><code>### ReAct
- 추론(Reason)과 행동(Act)을 번갈아 수행하며 상호작용적으로 작업을 해결하는 프레임워크.
- 모델은 현재 상태를 기반으로 &#39;생각(Thought)&#39;을 통해 다음 행동 계획을 세우고, 외부 도구(API, 검색 등)를 사용하는 &#39;행동(Action)&#39;을 실행하며, 그 &#39;관찰(Observation)&#39; 결과를 바탕으로 다시 생각함.
#### 프롬프트 예시</code></pre><p>질문: &#39;백년의 고독&#39;을 쓴 작가가 태어난 나라의 가장 높은 산은 무엇인가?</p>
<p>Thought 1: 먼저 &#39;백년의 고독&#39;의 작가를 찾아야 한다.
Action 1: Search(&quot;author of One Hundred Years of Solitude&quot;)
Observation 1: 가브리엘 가르시아 마르케스</p>
<p>Thought 2: 가브리엘 가르시아 마르케스가 태어난 나라를 찾아야 한다.
Action 2: Search(&quot;where was Gabriel Garcia Marquez born&quot;)
Observation 2: 콜롬비아</p>
<p>Thought 3: 이제 콜롬비아에서 가장 높은 산을 찾아야 한다.
Action 3: Search(&quot;highest mountain in Colombia&quot;)
Observation 3: 피코 크리스토발 콜론</p>
<p>Thought 4: 답을 찾았으니 종합하여 답변한다.</p>
<pre><code>#### 출력 예시</code></pre><p>&#39;백년의 고독&#39;의 작가 가브리엘 가르시아 마르케스가 태어난 나라인 콜롬비아에서 가장 높은 산은 피코 크리스토발 콜론입니다.</p>
<pre><code>### Reflexion
- 잘못된 답변을 생성했을 때, 실패 경험으로부터 스스로 배우고 수정하는 에이전트 프레임워크.
- 시도(Trial)가 실패하면, &#39;성찰(Reflexion)&#39; 모델이 실패 원인을 분석하고 다음 시도를 위한 구체적인 피드백을 생성하여 에이전트의 기억에 추가함.
#### 프롬프트 예시</code></pre><h1 id="작업">작업</h1>
<p>주어진 파이썬 함수에서 버그를 찾아 수정하라.</p>
<h1 id="1차-시도-실패">1차 시도 (실패)</h1>
<p>(코드를 잘못 수정하여 테스트 케이스 통과 실패)</p>
<h1 id="성찰-과정">성찰 과정</h1>
<p>&quot;코드를 분석해보니, 인덱스 범위를 잘못 계산하여 &#39;list index out of range&#39; 오류가 발생했다. 반복문의 범위를 n-1이 아닌 n으로 수정해야 한다.&quot;</p>
<h1 id="2차-시도">2차 시도</h1>
<p>(성찰 내용을 바탕으로 코드를 성공적으로 수정)</p>
<pre><code>#### 출력 예시</code></pre><p>(버그가 수정된 최종 코드)</p>
<pre><code>### Multimodal CoT
- 텍스트뿐만 아니라 이미지, 오디오 등 여러 양식(modality)의 정보를 통합하여 단계적인 추론(CoT)을 수행하는 기법.
- 시각적 정보와 텍스트 지시를 함께 이해하고 연관 지어 복잡한 질문에 답할 수 있음.
#### 프롬프트 예시</code></pre><p>(이미지로 레스토랑 메뉴판이 주어짐)
질문: 치즈버거와 콜라를 하나씩 주문하면 총 얼마인가요?</p>
<h1 id="추론-과정">추론 과정</h1>
<ol>
<li>이미지에서 &#39;치즈버거&#39; 항목을 찾는다. 가격은 8달러이다.</li>
<li>이미지에서 &#39;콜라&#39; 항목을 찾는다. 가격은 2달러이다.</li>
<li>두 가격을 더한다. 8 + 2 = 10.<pre><code>#### 출력 예시</code></pre>총 10달러입니다.
```<h3 id="graph-prompting">Graph Prompting</h3>
</li>
</ol>
<ul>
<li>노드, 엣지 등으로 구성된 그래프 구조의 데이터를 LLM이 이해하고 처리할 수 있도록 프롬프트 형식으로 변환하는 기법.</li>
<li>그래프의 토폴로지(연결 구조)나 속성을 텍스트로 설명하여, 노드 분류, 링크 예측 등 그래프 관련 과업을 수행하게 함.<h4 id="프롬프트-예시-5">프롬프트 예시</h4>
```
그래프 정보:</li>
<li>노드: Alice, Bob, Charlie</li>
<li>엣지: (Alice, Bob), (Bob, Charlie)
이 소셜 네트워크에서 누가 가장 많은 친구를 가지고 있는가?</li>
</ul>
<h1 id="추론-과정-1">추론 과정</h1>
<p>Alice는 Bob과 연결되어 있다 (친구 1명).
Bob은 Alice와 Charlie와 연결되어 있다 (친구 2명).
Charlie는 Bob과 연결되어 있다 (친구 1명).
따라서 Bob이 가장 많은 친구를 가지고 있다.</p>
<pre><code>#### 출력 예시</code></pre><p>Bob</p>
<p>```</p>
<hr>
<h3 id="출처">출처</h3>
<ul>
<li><a href="https://www.promptingguide.ai/techniques">https://www.promptingguide.ai/techniques</a></li>
<li><a href="https://www.promptingguide.ai/kr/techniques/">https://www.promptingguide.ai/kr/techniques/</a></li>
<li><a href="https://digitalbourgeois.tistory.com/143">https://digitalbourgeois.tistory.com/143</a></li>
<li><a href="https://wikidocs.net/231230">https://wikidocs.net/231230</a></li>
<li><a href="https://blog.kakaocloud.com/162">https://blog.kakaocloud.com/162</a></li>
<li><a href="https://aws.amazon.com/what-is/retrieval-augmented-generation/">https://aws.amazon.com/what-is/retrieval-augmented-generation/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[02 OpenAI Chat API 기초]]></title>
            <link>https://velog.io/@beaver_zip/02-OpenAI-Chat-API-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@beaver_zip/02-OpenAI-Chat-API-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Fri, 25 Jul 2025 23:35:38 GMT</pubDate>
            <description><![CDATA[<h4 id="들어가며">들어가며</h4>
<p><a href="https://product.kyobobook.co.kr/detail/S000216696499">랭체인과 랭그래프로 구현하는 RAG·AI 에이전트 실전 입문</a>을 읽고 요약한 글입니다.
2장에서는 다음의 개념을 주로 다룹니다.</p>
<ul>
<li><p><a href="https://platform.openai.com/docs/models">OpenAI의 Chat 모델</a></p>
</li>
<li><p><a href="https://platform.openai.com/docs/api-reference/chat">Chat Completions API</a></p>
<ul>
<li>개념</li>
<li>주요 Parameter</li>
<li><a href="https://platform.openai.com/docs/guides/function-calling">Function calling</a></li>
</ul>
</li>
<li><p><a href="https://platform.openai.com/tokenizer">Token, Tokenizer</a></p>
</li>
</ul>
<hr>
<h3 id="openai의-chat-모델">OpenAI의 Chat 모델</h3>
<p align="center"><img src="https://velog.velcdn.com/images/beaver_zip/post/9ef72647-90d8-411a-92d0-d0c2645f918c/image.png" width="60%"></p>

<ul>
<li><code>GPT-4o</code>, <code>GPT-4o-mini</code> 등의 명칭은 실제로는 <strong>모델 패밀리</strong>를 가리킨다.</li>
<li>API 사용 시 모델 패밀리(예: <code>gpt-4o</code>) 혹은 정확한 모델 스냅숏(예: <code>gpt-4o-2024-08-06</code>)을 지정할 수 있다.</li>
<li>모델 패밀리마다 최대 입력 토큰 수, 최대 출력 토큰 수, 요금 정책이 다르다.</li>
</ul>
<h3 id="chat-completions-api">Chat Completions API</h3>
<h4 id="개념">개념</h4>
<p>ChatGPT UI를 사용할 때와 마찬가지로, &#39;입력 텍스트를 제공해 응답 텍스트를 얻는&#39; 방식으로 동작한다.</p>
<p>다음은 Chat Completions API로의 요청 예시이다.</p>
<pre><code class="language-py">{
  model=&quot;gpt-4o-mini&quot;,
  messages=[
    {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;You are a helpful assistant.&quot;},
    {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;안녕하세요! 저는 이한서라고 합니다.&quot;},
    {&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: &quot;안녕하세요, 이한서님! 만나서 반갑습니다. 오늘은 어떤 이야기를 나눠볼까요?&quot;},
    {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;제 이름을 기억하세요?&quot;}
  ]
}</code></pre>
<ul>
<li>Chat Completions API의 요청 파라미터에는 최소한 <code>model</code>, <code>messages</code>가 포함된다.</li>
<li>Chat Completions API 자체는 State를 저장하지 않아, 과거 대화 이력을 고려해 응답할 수 없다. 따라서 대화 이력을 고려해 응답하고 싶다면 <code>messages</code>에 과거의 모든 대화를 포함해야 한다.</li>
</ul>
<h4 id="호출-및-응답-예시">호출 및 응답 예시</h4>
<pre><code class="language-py"># 호출 예시
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model=&quot;gpt-4o-mini&quot;,
    messages=[
    {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;You are a helpful assistant.&quot;},
    {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;안녕하세요! 저는 이한서라고 합니다.&quot;},
    {&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: &quot;안녕하세요, 이한서님! 만나서 반갑습니다. 오늘은 어떤 이야기를 나눠볼까요?&quot;},
    {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;제 이름을 기억하세요?&quot;}
  ]
)

print(response.to_json(indent=2))</code></pre>
<pre><code class="language-py"># 응답 예시
{
  &quot;id&quot;: &quot;chatcmpl-BxGXp8zdZyJxkI4CgOBEtfQwb6m4o&quot;,
  &quot;choices&quot;: [
    {
      &quot;finish_reason&quot;: &quot;stop&quot;,
      &quot;index&quot;: 0,
      &quot;logprobs&quot;: null,
      &quot;message&quot;: {
        &quot;content&quot;: &quot;네, 이한서님! 당신의 이름을 기억하고 있습니다. 어떤 도움이 필요하신가요?&quot;,
        &quot;refusal&quot;: null,
        &quot;role&quot;: &quot;assistant&quot;,
        &quot;annotations&quot;: []
      }
    }
  ],
  &quot;created&quot;: 1753464649,
  &quot;model&quot;: &quot;gpt-4o-mini-2024-07-18&quot;,
  &quot;object&quot;: &quot;chat.completion&quot;,
  &quot;service_tier&quot;: &quot;default&quot;,
  &quot;system_fingerprint&quot;: &quot;fp_197a02a720&quot;,
  &quot;usage&quot;: {
    &quot;completion_tokens&quot;: 23,
    &quot;prompt_tokens&quot;: 66,
    &quot;total_tokens&quot;: 89,
    &quot;completion_tokens_details&quot;: {
      &quot;accepted_prediction_tokens&quot;: 0,
      &quot;audio_tokens&quot;: 0,
      &quot;reasoning_tokens&quot;: 0,
      &quot;rejected_prediction_tokens&quot;: 0
    },
    &quot;prompt_tokens_details&quot;: {
      &quot;audio_tokens&quot;: 0,
      &quot;cached_tokens&quot;: 0
    }
  }
}</code></pre>
<h4 id="주요-parameter">주요 Parameter</h4>
<table>
<thead>
<tr>
<th>파라미터명</th>
<th>개요</th>
<th>기본값</th>
</tr>
</thead>
<tbody><tr>
<td><code>temperature</code></td>
<td>0~2 사이의 값으로, 클수록 출력이 무작위해지고, 작을수록 결정적이고 예측 가능해짐.</td>
<td>1</td>
</tr>
<tr>
<td><code>n</code></td>
<td>한 번의 요청에 대해 생성할 답변 수 (예시: 3으로 설정하면 3개의 서로 다른 응답을 받을 수 있음.)</td>
<td>1</td>
</tr>
<tr>
<td><code>stop</code></td>
<td>답변 생성을 중단할 문자열(또는 문자열 배열). 이 문자열이 등장하면 해당 지점에서 생성이 멈춤. (예시: <code>stop=[&quot;\n\n&quot;, &quot;###&quot;]</code>)</td>
<td>null (중단 없음)</td>
</tr>
<tr>
<td><code>max_tokens</code></td>
<td>생성할 최대 토큰 수(답변의 길이 제한). 이 값을 넘어가면 답변 생성이 중단됨. 입력 토큰을 포함하지 않으며, 답변 자체의 길이만 제한함.</td>
<td>max_model_tokens</td>
</tr>
<tr>
<td><code>log_probs</code></td>
<td>답변의 각 토큰에 대한 로그 확률을 반환할지 여부.</td>
<td>false</td>
</tr>
<tr>
<td>더 많은 파라미터는 <a href="https://platform.openai.com/docs/api-reference/chat/create">문서</a>를 참고하자.</td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h4 id="function-calling">Function calling</h4>
<ul>
<li>개발자가 미리 정의해 둔 외부 함수나 코드를 호출하고 그 결과를 바탕으로 더 정확하고 유용한 답변을 생성하게 하는 기능이다.</li>
<li>사용 가능한 함수를 LLM에게 알려주고, LLM에게 &#39;함수를 사용하고 싶다&#39;는 판단을 하게 하는 기능이다. 
(LLM이 함수를 실행하는 것이 아니라, LLM은 &#39;함수를 사용하고 싶다&#39;는 응답만 반환한다.)</li>
<li>아래는 질문(<code>서울 날씨는 어때?</code>)에 대해 적절한 함수(<code>get_weather</code>)를 반환하는 예제이다.</li>
</ul>
<p align="center"><img src="https://velog.velcdn.com/images/beaver_zip/post/ffcf6ef4-d7ab-4b1d-8f3e-4b4b880ab42d/image.png" width=60%></p>


<pre><code class="language-py">import openai
import json

# get_weather: 입력한 지역의 날씨를 알려주는 (예시용 더미) 함수 정의
def get_weather(location, unit=&quot;celsius&quot;):
    if &quot;seoul&quot; in location.lower():
        return json.dumps({&quot;location&quot;: &quot;Seoul&quot;, &quot;temperature&quot;: &quot;26&quot;, &quot;unit&quot;: unit})
    return json.dumps({&quot;location&quot;: location, &quot;temperature&quot;: &quot;unknown&quot;})

client = openai.OpenAI() # OpenAI Client 초기화


def run_conversation():
    messages = [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;서울의 현재 날씨는?&quot;}]
    # function calling에 사용할 함수 목록 정의
    tools = [
        {
            &quot;type&quot;: &quot;function&quot;,
            &quot;function&quot;: {
                &quot;name&quot;: &quot;get_weather&quot;,
                &quot;description&quot;: &quot;Get the current weather in a location&quot;,
                &quot;parameters&quot;: {
                    &quot;type&quot;: &quot;object&quot;,
                    &quot;properties&quot;: {
                        &quot;location&quot;: {&quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;도시 이름 (예: Seoul)&quot;},
                        &quot;unit&quot;: {&quot;type&quot;: &quot;string&quot;, &quot;enum&quot;: [&quot;celsius&quot;, &quot;fahrenheit&quot;]},
                    },
                    &quot;required&quot;: [&quot;location&quot;]
                },
            },
        }
    ]

    # Chat Completions API 호출
    response = client.chat.completions.create(
        model=&quot;gpt-4o&quot;,
        messages=messages,
        tools=tools,
        tool_choice=&quot;auto&quot; # 모델이 지정된 함수를 사용해야 한다고 판단하면 함수명과 인수를 반환
    )

    response_message = response.choices[0].message
    tool_calls = response_message.tool_calls

    if tool_calls:  # 모델이 함수 호출 요청
        messages.append(response_message)
        for tool_call in tool_calls:
            function_args = json.loads(tool_call.function.arguments)
            function_response = get_weather(
                location=function_args.get(&quot;location&quot;),
                unit=function_args.get(&quot;unit&quot;, &quot;celsius&quot;),
            )
            messages.append({  # 함수 실행 결과 메시지 추가
                &quot;tool_call_id&quot;: tool_call.id,
                &quot;role&quot;: &quot;tool&quot;,
                &quot;name&quot;: &quot;get_weather&quot;,
                &quot;content&quot;: function_response,
            })

        # 함수 실행 결과 반영 반복 요청
        second_response = client.chat.completions.create(
            model=&quot;gpt-4o&quot;,
            messages=messages,
        )
        return second_response.choices[0].message.content

# 실행 예시
final_answer = run_conversation()
print(final_answer) # 출력: 서울의 현재 날씨는 섭씨 26도입니다.</code></pre>
<h4 id="json-모드">JSON 모드</h4>
<p>JSON 형태의 출력을 얻기 위해선 Chat Completions API의 &#39;JSON 모드&#39;를 사용할 수 있다. 
이를 위해선</p>
<ol>
<li>프롬프트에 &#39;JSON&#39;이라는 문자열을 포함시키고</li>
<li><code>response_format</code> 파라미터에 <code>{&quot;type&quot;: &quot;json_object&quot;}</code>를 지정한다.</li>
</ol>
<pre><code class="language-py"># JSON 모드 호출 예시
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model=&quot;gpt-4o-mini&quot;,
    messages=[
        {
            &quot;role&quot;: &quot;system&quot;,
            &quot;content&quot;: &#39;인물 목록을 다음 JSON 형식으로 출력해주세요.\n{&quot;people&quot;: [&quot;aaa&quot;, &quot;bbb&quot;]}&#39;,
        },
        {
            &quot;role&quot;: &quot;user&quot;,
            &quot;content&quot;: &quot;제가 좋아하는 노래는 정승환의 &#39;비가 온다&#39;, 브리즈의 &#39;뭐라할까!&#39; 입니다. 으하하~&quot;,
        },
    ],
    response_format={&quot;type&quot;: &quot;json_object&quot;},
)

print(response.choices[0].message.content)</code></pre>
<p>출력 결과는 다음과 같다.</p>
<p align="center"><img src="https://velog.velcdn.com/images/beaver_zip/post/9baf0c40-85ee-4579-9ed4-6e9e9232abaa/image.png" width=60%></p>


<h4 id="요금">요금</h4>
<ul>
<li>모델별 요금은 <a href="https://platform.openai.com/docs/models">docs/models</a>에서 확인할 수 있다.</li>
<li>실제로 발생한 요금은 <a href="https://platform.openai.com/usage">usage</a>에서 확인할 수 있다.</li>
</ul>
<h4 id="cf-batch-api">cf. Batch API</h4>
<ul>
<li>GPT-4o나 GPT-4o-mini를 이용하기 위해 Chat Completions API 대신 <a href="https://platform.openai.com/docs/guides/batch">Batch API</a>를 사용할 수도 있다.</li>
<li>Batch API는 비동기적으로 출력이 생성된다.</li>
<li>즉시 응답을 얻을 수 없는 대신, Chat Completions API의 절반 가격으로 이용할 수 있다.</li>
</ul>
<h3 id="token-tokenizer">Token, Tokenizer</h3>
<p>LLM은 텍스트를 &#39;토큰&#39;이라는 단위로 분할해 처리하며, 분할 기준은 토크나이저마다 다르다. 
예시) tiktoken: <code>ChatGPT</code> -&gt; <code>Chat</code>, <code>GPT</code></p>
<h4 id="토큰-수-확인">토큰 수 확인</h4>
<p>OpenAI 플랫폼의 <a href="https://platform.openai.com/tokenizer">Tokenzier</a> 또는 Python 패키지 <a href="https://github.com/openai/tiktoken">tiktoken</a>을 사용해 토큰 수를 확인할 수 있다.</p>
<h4 id="한국어의-토큰-수에-대해">한국어의 토큰 수에 대해</h4>
<ul>
<li>같은 의미의 텍스트라도 영어를 사용했을 때에 비해 한국어를 사용했을 때 더 많은 토큰을 사용하는 경향이 있다.</li>
<li>따라서 토큰 수를 줄일 목적으로는 한국어보다 영어를 사용하는 것이 바람직하다.</li>
<li>예시: 한국어와 영어의 토큰 수 비교 (<code>gpt-4o</code>)<pre><code>&quot;LLM을 사용해 멋진 것을 만들기는 쉽지만, 프로덕션에서 사용할 수 있는 것을 만들기는 매우 어렵다.&quot; -&gt; 28 tokens
&quot;It&#39;s easy to make something cool with LLMs, but very hard to make something production-ready with them.&quot; -&gt; 23 tokens</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[01 LLM 애플리케이션 개발 기초]]></title>
            <link>https://velog.io/@beaver_zip/01-LLM-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EA%B0%9C%EB%B0%9C-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@beaver_zip/01-LLM-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EA%B0%9C%EB%B0%9C-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Fri, 25 Jul 2025 14:59:39 GMT</pubDate>
            <description><![CDATA[<h4 id="들어가며">들어가며</h4>
<p><a href="https://product.kyobobook.co.kr/detail/S000216696499">랭체인과 랭그래프로 구현하는 RAG·AI 에이전트 실전 입문</a>을 읽고 요약한 글입니다.</p>
<hr>
<h3 id="생성형-ai의-활용">생성형 AI의 활용</h3>
<p>OpenAI, Google, Anthropic 등 주요 기술 기업들이 LLM 서비스를 API로 제공하기 시작하면서, 기업 내 업무 효율화 및 LLM 통합이 활발히 진행중이다. </p>
<p>현재 주요 활용 사례는 다음과 같다.</p>
<h4 id="1-rag">1. RAG</h4>
<p>기업 내 문서를 벡터 DB에 저장하고, 자연어 질문에 대해 적절한 답변을 생성한다.
예시) 사내 기술 문서, 과거 프로젝트 보고서를 검색 후 답변에 사용</p>
<h4 id="2-외부-소스-통합형-qa-서비스-데스크톱-리서치">2. 외부 소스 통합형 Q&amp;A 서비스 (데스크톱 리서치)</h4>
<p>인터넷 상의 외부 소스에서 답변을 생성하여 신뢰성 높은 답변을 얻을 수 있다.
예시) Perplexity에서는 웹, 학술 논문, SEC filings를 외부 소스로  선택할 수 있다.</p>
<h4 id="3-메타데이터-활용-분석-text-to-sql">3. 메타데이터 활용 분석 (Text-to-SQL)</h4>
<p>SQL 문법 등의 전문 지식이 없어도, 자연어를 활용해 기업 내 메타데이터를 분석하는 SQL 쿼리를 생성한다.</p>
<h4 id="4-고객-지원-강화">4. 고객 지원 강화</h4>
<p>LLM을 활용한 고급 챗봇이 24시간 고객 문의에 대응하고, 인간 상담원이 처리하기 어려운 질문을 적절히 답변할 수 있으며, 비용 절감 및 상담원 보호 등의 효과가 있다.
예시) <a href="https://www.moel.go.kr/news/notice/noticeView.do?bbs_seq=20250700646">&#39;제4회 고용노동 공공데이터 활용 공모전&#39;에서는 어르신들의 구직을 돕는 AI 전화 서비스 &#39;Veteran&#39;이 장려상을 수상했다.</a></p>
<h4 id="5-콘텐츠-생성-자동화">5. 콘텐츠 생성 자동화</h4>
<p>마케팅 부서에서는 LLM을 활용해 블로그 글, SNS 게시물, 제품 설명문이나 썸네일 이미지 등의 콘텐츠를 자동 생성 후 인간의 검토 및 편집을 거쳐 게시하는 워크플로우를 확립해 업무 효율을 향상시키고 있다.
예시) <a href="https://www.digitaltoday.co.kr/news/articleView.html?idxno=558971">KT에서는 지니 TV 오리지널 콘텐츠로부터 AI를 이용해 자동으로 숏폼 영상을 추출한다고 한다.</a></p>
<h4 id="6-코드-생성과-최적화">6. 코드 생성과 최적화</h4>
<p>자연어 설명으로부터 코드를 생성하거나 최적화하는 개발자용 LLM 도구들이 발전하며 생산성이 크게 향상되고 있다.
예시) Cursor, Copilot, Gemini-cli, Claude code</p>
<h3 id="copilot-vs-ai-agent">Copilot vs AI Agent</h3>
<p>Copilot형 LLM 애플리케이션을 업무에 효율적으로 활용하기 위해선 고려할 사항이 많다:</p>
<ol>
<li>출력 품질, 비용 효율, 생성 속도 등을 고려해 모델을 선택해야 한다.</li>
<li>효과적인 프롬프트를 작성해야 한다.</li>
<li>Context로 전달되는 데이터를 조정해야 한다.</li>
</ol>
<p>즉, LLM의 능력은 상당히 높지만, 사용자의 활용 능력에 따라 성능의 차이가 발생한다.</p>
<p>반면 AI Agent는 주어진 환경을 인식하고 복잡한 목표에 대해 자율적으로 작동한다.
즉, Copilot형 애플리케이션처럼 인간의 지시에 의해 작동하고 환경 정보나 제약, 기억을 매번 인간으로부터 제공받는 대신 자율적으로 Task를 수행하여 사용자의 수고를 크게 줄여준다.</p>
<br>

<p>아직까지는 환각 현상에 대한 인간의 검토 필요성이나 사용자와의 기억을 관리하는 기능이 부족한 탓에 Copilot형 AI로서 사용자의 지시에 의존하는 비중이 높다.</p>
<p>하지만 정말로 인간에게 도움이 되는 AI 시스템을 만들기 위해선 인간의 개입(Human-in-the-Loop)을 최대한 줄이고, 더 많은 고도의 일을 자율적인 AI만으로 수행할 수 있어야 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Agents]]></title>
            <link>https://velog.io/@beaver_zip/Agents</link>
            <guid>https://velog.io/@beaver_zip/Agents</guid>
            <pubDate>Thu, 17 Jul 2025 05:03:55 GMT</pubDate>
            <description><![CDATA[<h4 id="들어가며">들어가며</h4>
<p>이 포스팅은 2025년 2월 Google이 발표한 whitepaper <a href="https://www.kaggle.com/whitepaper-agents">Agents</a>(by Julia Wiesinger, Patrick Marlow and Vladimir Vuskovic)를 요약한 글입니다.</p>
<hr>
<h2 id="table-of-contents">Table of Contents</h2>
<ol>
<li>Introduction</li>
<li>What is an agent?</li>
<li>Cognitive architectures: How agents operate</li>
<li>Tools: Our keys to the outside world</li>
<li>Enhancing model performance with targeted learning</li>
<li>Agent quick start with LangChain</li>
<li>Production applications with Vertex AI agents</li>
<li>Summary</li>
</ol>
<hr>
<h2 id="introduction">Introduction</h2>
<p>인간은 복잡한 패턴 인식 작업에 뛰어나지만, 결론에 도달하기 전에 책, Google Search, 계산기와 같은 도구를 사용하여 사전 지식을 보완한다. Generative AI 모델도 인간처럼 도구를 사용하도록 훈련될 수 있다. </p>
<p>예를 들어, 모델은 데이터베이스 검색 도구를 활용하여 고객의 구매 이력과 같은 특정 정보에 접근하고, 맞춤형 쇼핑 추천을 생성할 수 있다. 또는 사용자 쿼리에 기반하여 다양한 API 호출을 통해 동료에게 이메일을 보내거나 금융 거래를 완료할 수 있다.</p>
<p>이러한 추론, 논리, 외부 정보 접근의 조합이 Generative AI 모델에 연결되면 <strong>Agent</strong>라는 개념이 등장한다. </p>
<p>Agent는 단독 Generative AI 모델의 능력을 넘어서는 프로그램이다.</p>
<h2 id="what-is-an-agent">What is an agent?</h2>
<h3 id="agent의-정의">Agent의 정의</h3>
<p>Generative AI agent는 <strong>세계를 관찰하고, 보유한 도구를 사용하여 목표 달성을 시도하는 애플리케이션</strong>으로 정의된다.</p>
<p>Agent의 핵심 특성은 다음과 같다:</p>
<ul>
<li><strong>자율성(Autonomous)</strong>: 적절한 목표나 목적이 제공되면 인간 개입 없이 독립적으로 작동한다.</li>
<li><strong>능동성(Proactive)</strong>: 인간의 명시적 지시가 없어도 최종 목표 달성을 위해 다음에 해야 할 일을 추론한다.</li>
</ul>
<h3 id="agent의-3가지-핵심-구성요소">Agent의 3가지 핵심 구성요소</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/eb9207c9-25e0-41e7-bac2-b9fb612bb822/image.png" alt=""></p>
<h4 id="1-the-model">1. The Model</h4>
<p>Agent의 중앙 의사결정자 역할을 하는 언어 모델(LM)으로, 
다음과 같은 특징을 가진다:</p>
<ul>
<li>한 개 혹은 여러 개의 소형/대형 LM이 사용될 수 있음.</li>
<li>ReAct, Chain-of-Thought, Tree-of-Thoughts와 같은 지시 기반 추론 및 논리 프레임워크를 수행할 수 있음.</li>
<li>범용, multimodal, fine-tuned 모델 모두 가능함.</li>
</ul>
<h4 id="2-the-tools">2. The Tools</h4>
<p>기본 모델은 인상적인 텍스트 및 이미지 생성 능력을 갖지만 외부 세계와 상호작용할 수 없는 한계를 가지는데, 이는 Tools로 극복할 수 있다.</p>
<ul>
<li>Agent와 외부 데이터/서비스 간의 간격을 연결</li>
<li>GET, POST, PATCH, DELETE와 같은 일반적인 웹 API 메소드와 정렬</li>
<li>RAG(Retrieval Augmented Generation)와 같은 특수 시스템 지원</li>
</ul>
<h4 id="3-the-orchestration-layer">3. The Orchestration Layer</h4>
<p>Agent가 정보를 받아들이고, 내부 추론을 수행하며, 그 추론을 사용하여 다음 행동이나 결정을 알리는 순환 프로세스를 설명한다.</p>
<ul>
<li>목표 달성이나 중단 지점에 도달할 때까지 계속되는 루프</li>
<li>단순한 계산과 결정 규칙부터 체인 논리, 추가 머신러닝 알고리즘, 확률적 추론 기법까지 다양한 복잡도</li>
</ul>
<h3 id="agents-vs-models-비교">Agents vs. Models 비교</h3>
<table>
<thead>
<tr>
<th>Models</th>
<th>Agents</th>
</tr>
</thead>
<tbody><tr>
<td>훈련 데이터에서 사용 가능한 것으로 제한된 지식</td>
<td>Tools를 통해 외부 시스템과 연결하여 확장된 지식</td>
</tr>
<tr>
<td>사용자 쿼리 기반 단일 추론/예측</td>
<td>관리된 세션 히스토리로 다중 턴 추론/예측</td>
</tr>
<tr>
<td>네이티브 tool 구현 없음</td>
<td>Tools가 agent 아키텍처에 기본적으로 구현됨</td>
</tr>
<tr>
<td>네이티브 논리 레이어 구현 없음</td>
<td>CoT, ReAct 또는 LangChain과 같은 추론 프레임워크를 사용하는 네이티브 cognitive architecture</td>
</tr>
</tbody></table>
<h2 id="cognitive-architectures-how-agents-operate">Cognitive Architectures: How Agents Operate</h2>
<h3 id="요리사-비유로-이해하는-agent-작동-방식">요리사 비유로 이해하는 Agent 작동 방식</h3>
<p>바쁜 주방의 요리사를 상상해보자. 요리사의 목표는 레스토랑 고객을 위한 맛있는 요리를 만드는 것이며, 이는 계획, 실행, 조정의 순환을 포함한다:</p>
<ol>
<li><strong>정보 수집</strong>: 고객의 주문과 식료품 저장실 및 냉장고의 재료 확인</li>
<li><strong>내부 추론</strong>: 수집한 정보를 바탕으로 만들 수 있는 요리와 맛 프로필 결정</li>
<li><strong>행동 수행</strong>: 야채 썰기, 향신료 혼합, 고기 굽기</li>
</ol>
<p>이 정보 수집, 계획, 실행, 조정의 순환이 요리사가 목표 달성을 위해 사용하는 독특한 cognitive architecture를 설명한다.</p>
<h3 id="주요-추론-프레임워크">주요 추론 프레임워크</h3>
<h4 id="react">ReAct</h4>
<p>언어 모델이 사용자 쿼리에 대해 추론(Reason)하고 행동(Act)하는 사고 과정 전략을 제공하는 프롬프트 엔지니어링 프레임워크이다. ReAct 프롬프팅은 여러 SOTA 기준선을 능가하고 LLM의 인간 상호운용성과 신뢰성을 향상시킨다.</p>
<h4 id="chain-of-thought-cot">Chain-of-Thought (CoT)</h4>
<p>중간 단계를 통해 추론 능력을 가능하게 하는 프롬프트 엔지니어링 프레임워크이다. self-consistency, active-prompt, multimodal CoT를 포함한 다양한 하위 기법이 있다.</p>
<h4 id="tree-of-thoughts-tot">Tree-of-Thoughts (ToT)</h4>
<p>탐색이나 전략적 선견 작업에 적합한 프롬프트 엔지니어링 프레임워크이다. chain-of-thought 프롬프팅을 일반화하고 모델이 언어 모델을 사용한 일반적인 문제 해결을 위한 중간 단계 역할을 하는 다양한 사고 체인을 탐색할 수 있게 한다.</p>
<h3 id="react-framework-실행-예시">ReAct Framework 실행 예시</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/45718dba-8714-49de-a874-f096e92af853/image.png" alt=""></p>
<ol>
<li>사용자가 agent에 쿼리 전송</li>
<li>Agent가 ReAct 시퀀스 시작</li>
<li>Agent가 모델에 프롬프트를 제공하여 다음 ReAct 단계 중 하나와 해당 출력 생성:<ul>
<li><strong>Question</strong>: 사용자 쿼리의 입력 질문</li>
<li><strong>Thought</strong>: 다음에 무엇을 해야 할지에 대한 모델의 생각</li>
<li><strong>Action</strong>: 다음에 취할 행동에 대한 모델의 결정 (tool 선택 발생)</li>
<li><strong>Action input</strong>: tool에 제공할 입력에 대한 모델의 결정</li>
<li><strong>Observation</strong>: action/action input 시퀀스의 결과</li>
<li><strong>Final answer</strong>: 원래 사용자 쿼리에 대한 모델의 최종 답변</li>
</ul>
</li>
<li>ReAct 루프가 종료되고 최종 답변이 사용자에게 반환</li>
</ol>
<h2 id="tools-our-keys-to-the-outside-world">Tools: Our Keys to the Outside World</h2>
<p>언어 모델은 정보 처리에 뛰어나지만, 실제 세계를 직접 인식하고 영향을 미칠 수 있는 능력이 부족하다. Tools는 이러한 격차를 해소하여 agent가 외부 데이터 및 서비스와 상호작용하고 기본 모델만으로는 불가능한 더 넓은 범위의 작업을 수행할 수 있게 한다.</p>
<p>Google 모델이 상호작용할 수 있는 세 가지 주요 tool 유형은 다음과 같다:</p>
<h3 id="1-extensions">1. Extensions</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/07afd731-2441-43c0-b736-88c18897c79b/image.png" alt=""></p>
<p>Extensions는 API와 agent 사이의 간격을 표준화된 방식으로 연결한다. Extension이 하는 일:</p>
<ol>
<li>예제를 사용하여 agent에게 API 엔드포인트 사용법 교육</li>
<li>API 엔드포인트를 성공적으로 호출하는 데 필요한 인수나 매개변수 교육</li>
</ol>
<p><strong>Extensions의 주요 강점</strong>: built-in example types를 통해 agent가 작업에 가장 적합한 Extension을 동적으로 선택할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/d21bcc59-4f4f-4cd1-9461-e9eb359f06d7/image.png" alt=""></p>
<h4 id="sample-extensions">Sample Extensions</h4>
<p>Google은 즉시 사용 가능한 몇 가지 extension을 제공한다:</p>
<ul>
<li>Code Interpreter extension: 자연어 설명에서 Python 코드를 생성하고 실행</li>
<li>Google Flights extension</li>
<li>Google Maps extension</li>
<li>Weather extension</li>
</ul>
<h3 id="2-functions">2. Functions</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/e9aee25f-aa80-4a74-8abd-65f10d055516/image.png" alt=""></p>
<p>Functions는 소프트웨어 엔지니어링의 함수 개념과 유사하다. Extensions와의 주요 차이점:</p>
<ol>
<li>모델은 Function과 그 인수를 출력하지만 실제 API 호출은 하지 않음</li>
<li>Functions는 클라이언트 측에서 실행되고, Extensions는 agent 측에서 실행</li>
</ol>
<p><strong>Functions 사용 사례</strong>:</p>
<ul>
<li>API 호출이 agent 아키텍처 흐름 외부의 다른 애플리케이션 스택 레이어에서 이루어져야 할 때</li>
<li>agent가 API를 직접 호출하지 못하게 하는 보안 또는 인증 제한이 있을 때</li>
<li>실시간으로 API 호출을 하지 못하게 하는 타이밍 또는 작업 순서 제약이 있을 때</li>
<li>API가 인터넷에 노출되지 않거나 agent 인프라에서 액세스할 수 없을 때</li>
</ul>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/b70b3306-abc9-4c0a-9b09-914aad4e6392/image.png" alt=""></p>
<h3 id="3-data-stores">3. Data Stores</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/763f5379-7ab8-4763-8e05-f2597c23f392/image.png" alt=""></p>
<p>Data Stores는 언어 모델을 지속적으로 새로운 책을 획득하는 도서관이 아닌 정적인 도서관으로 비유할 수 있다. Data Stores는 이러한 한계를 해결하여 더 동적이고 최신 정보에 대한 액세스를 제공한다.</p>
<p><strong>Data Stores가 지원하는 형식</strong>:</p>
<ul>
<li>웹사이트 콘텐츠</li>
<li>구조화된 데이터: PDF, Word Docs, CSV, 스프레드시트 등</li>
<li>비구조화된 데이터: HTML, PDF, TXT 등</li>
</ul>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/c75e6520-acc6-44f8-ad18-a605e233c4d3/image.png" alt=""></p>
<h4 id="rag-기반-애플리케이션에서의-프로세스">RAG 기반 애플리케이션에서의 프로세스</h4>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/5b50e3c5-a0b0-44e5-9d9c-12b3b4bbcefc/image.png" alt=""></p>
<ol>
<li>사용자 쿼리가 임베딩 모델로 전송되어 쿼리에 대한 임베딩 생성</li>
<li>쿼리 임베딩이 SCaNN과 같은 매칭 알고리즘을 사용하여 벡터 데이터베이스 내용과 매칭</li>
<li>매칭된 콘텐츠가 텍스트 형식으로 벡터 데이터베이스에서 검색되어 agent로 전송</li>
<li>Agent가 사용자 쿼리와 검색된 콘텐츠를 모두 수신한 후 응답이나 행동 수립</li>
<li>최종 응답이 사용자에게 전송</li>
</ol>
<h3 id="tools-비교표">Tools 비교표</h3>
<table>
<thead>
<tr>
<th>Extensions</th>
<th>Function Calling</th>
<th>Data Stores</th>
</tr>
</thead>
<tbody><tr>
<td>Agent 측 실행</td>
<td>클라이언트 측 실행</td>
<td>Agent 측 실행</td>
</tr>
<tr>
<td>개발자가 agent가 API 엔드포인트와의 상호작용을 제어하기를 원할 때</td>
<td>보안이나 인증 제한으로 agent가 API를 직접 호출할 수 없을 때</td>
<td>RAG 구현을 원할 때</td>
</tr>
<tr>
<td>네이티브 사전 구축 Extensions 활용 시 유용</td>
<td>타이밍 제약이나 작업 순서 제약이 있을 때</td>
<td>웹사이트 콘텐츠, 구조화된/비구조화된 데이터 처리</td>
</tr>
<tr>
<td>다중 홉 계획 및 API 호출</td>
<td>인터넷에 노출되지 않은 API</td>
<td>관계형/비관계형 데이터베이스</td>
</tr>
</tbody></table>
<h2 id="enhancing-model-performance-with-targeted-learning">Enhancing Model Performance with Targeted Learning</h2>
<p>모델을 효과적으로 사용하는 데 있어 중요한 측면은 출력 생성 시 올바른 도구를 선택하는 능력이다. 이는 기본 요리 기술과 특정 요리 마스터하기의 차이와 같다.</p>
<h3 id="세-가지-학습-접근법">세 가지 학습 접근법</h3>
<h4 id="1-in-context-learning">1. In-context Learning</h4>
<p>일반화된 모델에 추론 시점에 프롬프트, 도구 및 few-shot 예제를 제공하여 특정 작업에 대해 &#39;즉석에서&#39; 학습할 수 있게 한다. ReAct 프레임워크가 자연어에서 이 접근법의 예이다.</p>
<h4 id="2-retrieval-based-in-context-learning">2. Retrieval-based In-context Learning</h4>
<p>외부 메모리에서 가장 관련성 높은 정보, 도구 및 관련 예제를 검색하여 모델 프롬프트를 동적으로 채운다. Vertex AI extensions의 &#39;Example Store&#39;나 이전에 언급된 data stores RAG 기반 아키텍처가 이에 해당한다.</p>
<h4 id="3-fine-tuning-based-learning">3. Fine-tuning Based Learning</h4>
<p>추론 전에 특정 예제의 더 큰 데이터셋을 사용하여 모델을 훈련시킨다. 이는 모델이 사용자 쿼리를 받기 전에 특정 도구를 언제 어떻게 적용할지 이해하는 데 도움이 된다.</p>
<h3 id="요리사-비유로-이해하는-학습-접근법">요리사 비유로 이해하는 학습 접근법</h3>
<ul>
<li><strong>In-context learning</strong>: 요리사가 고객으로부터 특정 레시피, 몇 가지 주요 재료, 몇 가지 예시 요리를 받고 &#39;즉석에서&#39; 요리를 만드는 것</li>
<li><strong>Retrieval-based in-context learning</strong>: 요리사가 잘 갖춰진 식료품 저장실(외부 데이터 저장소)에서 재료와 요리책을 동적으로 선택할 수 있는 것</li>
<li><strong>Fine-tuning based learning</strong>: 요리사를 학교로 보내 새로운 요리나 요리 세트를 배우게 하는 것</li>
</ul>
<h2 id="agent-quick-start-with-langchain">Agent Quick Start with LangChain</h2>
<p>LangChain과 LangGraph 라이브러리를 사용한 실제 agent 구현 예제이다. 이러한 오픈 소스 라이브러리를 통해 사용자는 논리, 추론 및 도구 호출의 시퀀스를 &quot;체인&quot;하여 맞춤형 agent를 구축할 수 있다.</p>
<p>예제에서는 다음의 과정을 다룬다.</p>
<ul>
<li>gemini-2.0-flash-001 모델 사용</li>
<li>SerpAPI (Google Search용)와 Google Places API 도구 사용</li>
<li>사용자의 다단계 쿼리에 답변</li>
</ul>
<p>이는 Model, Orchestration, Tools가 모두 함께 작동하여 특정 목표를 달성하는 기본적인 구성요소를 보여준다. (자세한 내용은 생략하겠다.)</p>
<h2 id="production-applications-with-vertex-ai-agents">Production Applications with Vertex AI Agents</h2>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/d0177ff4-55e2-4dea-90fa-e80e5e1921b4/image.png" alt=""></p>
<p>프로덕션 급 애플리케이션을 구축하려면 사용자 인터페이스, 평가 프레임워크, 지속적인 개선 메커니즘과 같은 추가 도구와 agent를 통합해야 한다.</p>
<h3 id="vertex-ai-platform의-주요-기능">Vertex AI Platform의 주요 기능</h3>
<p>Google의 Vertex AI 플랫폼은 완전 관리형 환경을 제공하여 이 프로세스를 단순화한다:</p>
<h4 id="자연어-인터페이스-개발자가-agent의-중요한-요소를-빠르게-정의">자연어 인터페이스: 개발자가 agent의 중요한 요소를 빠르게 정의</h4>
<ul>
<li>목표 (goals)</li>
<li>작업 지침 (task instructions)</li>
<li>도구 (tools)</li>
<li>작업 위임을 위한 하위 agent (sub-agents)</li>
<li>예제 (examples)</li>
</ul>
<h4 id="개발-도구-세트">개발 도구 세트:</h4>
<ul>
<li>테스트</li>
<li>평가</li>
<li>agent 성능 측정</li>
<li>디버깅</li>
<li>전반적인 품질 개선</li>
</ul>
<p>이를 통해 개발자는 인프라, 배포 및 유지 관리의 복잡성을 플랫폼이 관리하는 동안 agent 구축 및 개선에 집중할 수 있다.</p>
<h2 id="summary">Summary</h2>
<h3 id="1-agent의-확장된-능력">1. Agent의 확장된 능력</h3>
<p>Agent는 도구를 활용하여 언어 모델의 능력을 확장한다:</p>
<ul>
<li>실시간 정보 액세스</li>
<li>실제 행동 제안</li>
<li>복잡한 작업의 자율적 계획 및 실행</li>
</ul>
<h3 id="2-orchestration-layer의-중요성">2. Orchestration Layer의 중요성</h3>
<p>Agent 작동의 핵심은 orchestration layer이며, 이는 다음을 구조화하는 cognitive architecture이다:</p>
<ul>
<li>추론 (reasoning)</li>
<li>계획 (planning)</li>
<li>의사결정 (decision-making)</li>
<li>행동 안내 (guiding actions)</li>
</ul>
<h3 id="3-tools의-역할">3. Tools의 역할</h3>
<p>Extensions, Functions, Data Stores와 같은 도구는 agent가 외부 세계와 상호작용할 수 있는 key 역할을 한다:</p>
<ul>
<li><strong>Extensions</strong>: agent와 외부 API 간의 브리지</li>
<li><strong>Functions</strong>: 개발자에게 더 세밀한 제어 제공</li>
<li><strong>Data Stores</strong>: 구조화된/비구조화된 데이터에 대한 액세스</li>
</ul>
<h3 id="미래-전망">미래 전망</h3>
<p>Agent의 미래는 흥미진진한 발전을 약속한다:</p>
<ul>
<li>도구가 더욱 정교해지고 추론 능력이 향상됨에 따라 agent는 점점 더 복잡한 문제를 해결할 수 있게 될 것이다</li>
<li>&#39;Agent chaining&#39;의 전략적 접근법이 계속해서 추진력을 얻을 것이다</li>
<li>특정 도메인이나 작업에서 뛰어난 전문 agent를 결합함으로써 다양한 산업과 문제 영역에서 탁월한 결과를 제공할 수 있는 &#39;mixture of agent experts&#39; 접근법을 만들 수 있다</li>
</ul>
<p>복잡한 agent 아키텍처 구축에는 반복적인 접근이 필요하다는 점을 기억하는 것이 중요하다. 실험과 개선이 특정 비즈니스 사례와 조직 요구 사항에 대한 솔루션을 찾는 열쇠이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[동기부여]]></title>
            <link>https://velog.io/@beaver_zip/%ED%9E%98%EB%93%A4%EB%95%8C</link>
            <guid>https://velog.io/@beaver_zip/%ED%9E%98%EB%93%A4%EB%95%8C</guid>
            <pubDate>Thu, 12 Jun 2025 02:48:19 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.youtube.com/watch?v=lXKDu6cdXLI">https://www.youtube.com/watch?v=lXKDu6cdXLI</a>
<a href="https://www.youtube.com/watch?v=MGvcZARvEJI">https://www.youtube.com/watch?v=MGvcZARvEJI</a>
<a href="https://humoruniv.com/pds1208652">https://humoruniv.com/pds1208652</a>
<a href="https://humoruniv.com/pds1224565">https://humoruniv.com/pds1224565</a>
<a href="https://humoruniv.com/pds1223454">https://humoruniv.com/pds1223454</a></p>
<p><a href="https://youtube.com/playlist?list=PLjcc5TacvgdaQ-gtZpTcWwRSUXUecvHI0&amp;si=7uHaaPpyOSumxcJb">https://youtube.com/playlist?list=PLjcc5TacvgdaQ-gtZpTcWwRSUXUecvHI0&amp;si=7uHaaPpyOSumxcJb</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[25.04.01 - ai]]></title>
            <link>https://velog.io/@beaver_zip/25.04.01-ai</link>
            <guid>https://velog.io/@beaver_zip/25.04.01-ai</guid>
            <pubDate>Tue, 01 Apr 2025 16:51:11 GMT</pubDate>
            <description><![CDATA[<p>3달 만에 글을 적는다.</p>
<p>최종 프로젝트는 어찌저찌 잘 마쳤다.
주제 선정이나 기술 활용의 측면에서 완전히 만족스럽진 않았지만,
팀원들과 한 달 동안 (배포를 제외한) 제품 개발의 전 과정을 경험해 봤다는 점에서 귀중한 시간이었다고 생각한다.</p>
<p>2월 12일에 부스트캠프를 수료했다.
반년이 넘는 시간동안 아침부터 밤까지 팀원들과 많은 이야기를 나누며 함께 공부했는데, 그 시간이 사라지니 마음이 허전했다.
아직도 좀 공허하다.</p>
<p>전부터 부스트캠프 수료 후에 인턴을 하고 싶었는데, 쉽지 않았다.
1월엔 행안부 청년인턴, 당근 윈터테크 인턴을 지원했으나 떨어졌고, 이에 아직 준비가 덜 됐다고 생각해서 더 이상 인턴에 지원하지 않았다.</p>
<p>3월에는 복학을 했다.
6전공이라 조금 빡셌지만, 평점 회복을 위해 이번 학기에는 꼭 좋은 성적을 받고 싶어 열심히 공부했다.
특별한 일이 없으면 하루에 6~10시간 정도 도서관에서 공부한 것 같다.</p>
<p>그런데 오늘은 같이 실험하는 친구와 이야기를 나누다가 내 정체성에 대해 다시 생각해 보았다.
나는 AI 개발자가 되고 싶다.
ML/DL 엔지니어든, 데이터 사이언티스트는, 데이터 엔지니어든..
어떤 형태가 됐건 AI 관련된 일을 하고 싶다. AI가 재밌기 때문이다.</p>
<p>3월처럼 전공에만 심취해 지내면 나는 아무 경쟁력이 없는 사람이 될 것이다.
나보다 전자공학을 더 잘하는 전자공학도들은 우리 학교에도 수두룩하고, 무엇보다 나는 전자공학보다 인공지능을 하며 살고 싶기 때문이다.
지금처럼 바쁘다고 AI 공부를 멀리하다 보면 나는 아무도 필요로 하지 않는 사람이 될 것이다.</p>
<br>

<p>내일부터는 바쁘더라도 다시 NLP, CV와 CS 지식을 매일 공부하고 기록해야겠다.
6월 말에는 기초가 튼튼한 사람이 되어있길 소망한다.</p>
<p><a href="https://www.youtube.com/watch?v=fnaIv9SV3nA">https://www.youtube.com/watch?v=fnaIv9SV3nA</a></p>
]]></description>
        </item>
    </channel>
</rss>