<?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>AI Safety 일짱이 되겠다.</description>
        <lastBuildDate>Fri, 10 Jul 2026 11:06:58 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/895ae7bd-3693-4873-a952-058339b8b080/image.jpg</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[ICML 2026 후기]]></title>
            <link>https://velog.io/@beaver_zip/ICML-2026-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@beaver_zip/ICML-2026-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Fri, 10 Jul 2026 11:06:58 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/beaver_zip/post/71e39076-1336-4b27-bd07-3f76f3fec3a1/image.png" alt=""></p>
<p>태어나서 처음으로 학회에 다녀왔다.
작년 9월부터 학부연구생으로 있는 연구실에서 감사하게도 비용을 지원해주셨다.</p>
<p>처음에는 정식 석사과정생도 아닌데 연구실 예산으로 학회에 가는 게 죄송스러워서 가지 않겠다고 말씀드렸다. 하지만 (우리 랩실의 기둥인) 박사과정 누나가 학부생 때 학회에 가면 정말 좋은 경험이 될 거라고 조언해주어서 다시 솔직하게 가고 싶다고 말씀드렸다.</p>
<p>나는 우리 연구실 사람들이 너무 좋다. 다들 졸업하지 않으셨으면 좋겠다. 
그러면 나도  연구실에 뼈를 묻을텐데...</p>
<hr>
<h3 id="목표한-것">목표한 것</h3>
<ul>
<li>동기 부여</li>
<li>네트워킹; 특히 외국인(연구원/현직자분들)과 대화해보기</li>
<li>진로 고민 해결</li>
</ul>
<h3 id="얻은-것">얻은 것</h3>
<h4 id="1-동기부여">1. 동기부여</h4>
<img src="https://velog.velcdn.com/images/beaver_zip/post/8ae7bbc7-8bf4-4d81-bfc8-4b77f699b123/image.PNG" width=50%>


<p>엄청 됐다. 
여러 똑똑한 사람들을 만나고, 수 많은 재밌는 논문을 읽을 수 있었다.
다음 학회에는 꼭 1저자로 가고 싶다. 
당장 EACL과 COLING이 가까우니 해당 학회에 제출하는 것을 목표로 열심히 달려보겠다.</p>
<h4 id="2-네트워킹">2. 네트워킹</h4>
<img src="https://velog.velcdn.com/images/beaver_zip/post/8329417c-9233-424f-9761-513f150346f7/image.png" width=90%>

<p>스폰서 부스에서 외국인 현직자 분들과 해당 회사의 목표 및 관심사, 기업 문화, 채용 등에 대한 설명을 듣고, 내 연구 분야에 대한 이야기를 주고 받았다.
Resume를 제출하고 귀여운 굿즈들도 받았다.</p>
<img src="https://velog.velcdn.com/images/beaver_zip/post/e1a99cca-63a1-40da-b040-7fe85e69b795/image.jpeg" width=60%>

<p>포스터 세션에서는 저자들에게 해당 연구에 대한 설명을 듣고, 연구에 대해 궁금한 점들을 물어보았다. 
다만 언어의 벽에 부딪혀 마지막 날에는 거의 한국인 저자들만 찾아 다녔다. 
특히 내 연구와 비슷한 연구를 한 저자들과 많은 대화를 나눴고, 추후 연구에 대한 조언을 구하고자 Linkedin 연락처를 받았다.</p>
<h4 id="3-진로-고민-해결">3. 진로 고민 해결</h4>
<p>스폰서 부스에서 네이버와 LG AI연구원 현직자분들과 긴 대화를 나누었다.
평소 국내 AI 업계에 대해 궁금했던 점들을 여쭤보고, AI Safety와 Evaluation에 관한 내 생각도 말씀드리며 즐겁게 대화했다.</p>
<p>특히 네이버 현직자분과는 30분이 넘게 이야기를 나누었다. 학벌에 대한 고민부터 연구 방향과 커리어 설계까지 여러 구체적인 질문을 드렸고, 현직자분께서 매우 진솔하게 답변해주셨다. 앞으로의 진로와 인생을 설계하는 데 큰 도움이 되었다.</p>
<p>아무리 생각해도 너무 감사해서 학회가 끝난 뒤 링크드인으로 감사 인사를 드렸다.</p>
<h4 id="4-연구실-동료들과-더-돈독해짐">4. 연구실 동료들과 더 돈독해짐</h4>
<img src="https://velog.velcdn.com/images/beaver_zip/post/e96b3470-f650-4fec-83f4-deea15c07a67/image.png" width=80%>

<p>사실 연구실에서 길게 대화할 일이 없어 쪼금 어색한 분들도 있었는데, 
같이 맛있는 거 먹으면서 많이 친해졌다 ㅎ_ㅎ</p>
<h3 id="느낀-것">느낀 것</h3>
<ul>
<li>확실히 나는 LLM을 좋아한다. 석사에 진학해서 연구를 해야겠다는 확신을 얻었다.</li>
<li>최소한 학회 한 달 전부터 관심 있는 논문을 Appendix까지 꼼꼼히 읽어둬야겠다. 저자를 만나서 해당 연구에 대해 궁금했던 점, 그리고 내 연구에 대한 조언을 받으면 훨씬 유익한 시간이 될 것 같다.</li>
<li>확실히 중국 대학의 논문이 압도적으로 많고, 그 다음으로 영미권 대학/회사들의 논문이 많았던 것 같다. 국내 기관 중에서는 KAIST와 연세대학교가 대다수였던 것 같다.</li>
<li>논문도 논문 나름인 것 같다. Task마다 다르겠지만, 어떤 논문들은 포스터의 2/3가 수식으로 도배되어 말을 걸어볼 엄두도 안났는데, 어떤 논문들은 직관적이고 이해하기 쉬웠다. 다만 문제 정의와 실험 설계가 매우 엄밀했고, 다양한 질문에도 유창하게 답변하는 것을 보고 본인의 연구를 정말 잘 이해하고 있다는 느낌을 받았다.</li>
<li>생각보다 비슷한 아이디어, 비슷한 방법론을 적용한 논문들이 굉장히 많았다. 다른 논문들과 겹칠까봐 두려워할 필요가 없겠다.</li>
<li>영어를 잘해야겠다. 하고 싶은 말도 많고 듣고 싶은 말도 많았는데 말이 통하지 않아 너무 답답하고 아쉬웠다.</li>
<li>해외 석박사/취업 기회가 생각보다 많은 것 같다. 졸업 후 꼭 해외에 나가서 일해보고 싶다.</li>
<li>포스터를 만들 때는 꼭 눈에 띄는 디자인으로 만들어야겠다.</li>
<li>다음 학회에는 꼭 1저자로 참석하고 싶다.</li>
</ul>
<img src="https://velog.velcdn.com/images/beaver_zip/post/9b4c7415-efa7-488f-ab34-0abd59fc62be/image.png" width=70%>

<p>너무 재밌고 행복했다<del>~</del></p>
<hr>
<img src="https://velog.velcdn.com/images/beaver_zip/post/c90be756-b067-40c5-b544-82a1f4e8a34b/image.jpeg" width=80%>

<p>학회 기간 동안 비가 많이 왔다.</p>
<p>학회 중간에 속상한 일이 있었다. 
이전부터 KT 채용연계형 대학원에 꼭 지원하고 싶었는데, 어학 시험 일정과 이번 공고 일정이 맞지 않다는 사실을 알았다.</p>
<p>변명을 조금 하자면, 지난 2023·2024·2025학년도 봄학기 공고가 모두 8월 1~2주까지 진행됐기에 이번 2026학년도 공고도 비슷할 거라고 생각했다. 
토익 시험 역시 기말고사가 끝난 뒤 응시할 수 있는 가장 빠른 시험을 신청한 것이었다.
물론 미리미리 준비했으면 좋았겠지만, 학기 중에는 도저히 엄두가 나지 않았다.</p>
<p>당시 너무 허탈해서 거의 한 시간을 아무것도 안하고 앉아있었는데, 네이버 현직자분과 대화한 뒤 마음이 많이 나아졌다.</p>
<p>또한 고맙게도 종원이가 코엑스까지 찾아와서 위로해주었다.    귀여운 자식 ^_^
종원이도 나도 내 주변 사람들도 전부 잘 됐으면 좋겠다.</p>
<p>지금은 내가 KT를 짝사랑하지만, 내가 좋은 논문들을 내면 KT가 나를 보고 싶어할 것이다.
그러면 난 KT 대신 다른 회사에 가겠다. 
메롱 ㅎ.ㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[방학을 어떻게 보낼까?]]></title>
            <link>https://velog.io/@beaver_zip/%EB%B0%A9%ED%95%99%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%B3%B4%EB%82%BC%EA%B9%8C</link>
            <guid>https://velog.io/@beaver_zip/%EB%B0%A9%ED%95%99%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%B3%B4%EB%82%BC%EA%B9%8C</guid>
            <pubDate>Tue, 30 Jun 2026 10:17:02 GMT</pubDate>
            <description><![CDATA[<h3 id="1-연구">1. 연구</h3>
<h4 id="1-semantic-leakage-연구">1) Semantic Leakage 연구</h4>
<ul>
<li>가능한 7월 중 문제 정의를 마치고, 8월까지 유의미한 실험 결과를 내보겠다.</li>
</ul>
<h4 id="2-공부">2) 공부</h4>
<ul>
<li>LLM의 사고 과정을 이해하기</li>
<li>LLM의 문제 행동이 왜 발생하는지 탐구하기</li>
</ul>
<h3 id="2-개발">2. 개발</h3>
<h4 id="오픈소스-기여">오픈소스 기여</h4>
<ul>
<li>용준이형의 <a href="https://github.com/Kimyongari/harness-factory">harness-factory</a> 프로젝트에 참여하게 됐다.</li>
<li>하네스 평가 파이프라인을 구축해보려고 한다.</li>
</ul>
<h4 id="대회-참여">대회 참여</h4>
<ul>
<li><a href="https://miraeassetfesta.com/">미래에셋 AI Festival</a>에 참여하려고 한다.</li>
</ul>
<h3 id="3-진로">3. 진로</h3>
<ul>
<li>LG전자, KT 채용연계형 대학원 준비</li>
<li>타대 연구실 컨택 준비 (+DAAD 유학 준비)</li>
<li>토익</li>
<li>코딩테스트 (프로그래머스 Lv 2, 3 전부 풀기)</li>
<li><code>&lt;개발자를 위한 필수 수학&gt;</code> 정리</li>
</ul>
<h3 id="4-자기개발">4. 자기개발</h3>
<ul>
<li>헬스</li>
<li>요리</li>
<li>피아노, 베이스 연습</li>
</ul>
<hr>
<h3 id="읽을-논문">읽을 논문</h3>
<h4 id="a-llm-해석가능성-개요와-기본-배경">A. LLM 해석가능성 개요와 기본 배경</h4>
<ol>
<li><a href="https://arxiv.org/abs/2303.18223">A Survey of Large Language Models</a></li>
<li><a href="https://arxiv.org/abs/2309.01029">Explainability for Large Language Models: A Survey</a></li>
<li><a href="https://arxiv.org/abs/2401.12874">From Understanding to Utilization: A Survey on Explainability for Large Language Models</a></li>
<li><a href="https://arxiv.org/abs/2402.10688">Towards Uncovering How Large Language Model Works: An Explainability Perspective</a></li>
<li><a href="https://arxiv.org/abs/2002.12327">A Primer in BERTology: What we know about how BERT works</a></li>
<li><a href="https://arxiv.org/abs/1706.03762">Attention is All You Need</a></li>
<li><a href="https://arxiv.org/abs/2005.14165">Language Models are Few-Shot Learners</a></li>
<li><a href="https://arxiv.org/abs/2206.07682">Emergent Abilities of Large Language Models</a></li>
</ol>
<h4 id="b-probing-attention-logit-lens">B. Probing, Attention, Logit Lens</h4>
<ol start="9">
<li><a href="https://arxiv.org/abs/1906.04341">What Does BERT Look At? An Analysis of BERT&#39;s Attention</a></li>
<li><a href="https://arxiv.org/abs/1905.05950">BERT Rediscovers the Classical NLP Pipeline</a></li>
<li><a href="https://arxiv.org/abs/1906.02715">Visualizing and Measuring the Geometry of BERT</a></li>
<li><a href="https://nlp.stanford.edu/pubs/hewitt2019structural.pdf">A Structural Probe for Finding Syntax in Word Representations</a></li>
<li><a href="https://arxiv.org/abs/1905.10650">Are Sixteen Heads Really Better than One?</a></li>
<li><a href="https://arxiv.org/abs/1902.10186">Attention is not Explanation</a></li>
<li><a href="https://arxiv.org/abs/1908.04626">Attention is not not Explanation</a></li>
<li><a href="https://arxiv.org/abs/1909.01380">The Bottom-up Evolution of Representations in the Transformer</a></li>
<li><a href="https://arxiv.org/abs/2303.08112">Eliciting Latent Predictions from Transformers with the Tuned Lens</a></li>
<li><a href="https://transformer-circuits.pub/2021/framework/index.html">A Mathematical Framework for Transformer Circuits</a></li>
<li><a href="https://arxiv.org/abs/2512.01222">Unsupervised decoding of encoded reasoning using language model interpretability</a></li>
</ol>
<h4 id="c-mechanistic-interpretability와-circuit-분석">C. Mechanistic Interpretability와 Circuit 분석</h4>
<ol start="20">
<li><a href="https://arxiv.org/abs/2211.00593">Interpretability in the Wild: a Circuit for Indirect Object Identification in GPT-2 small</a></li>
<li><a href="https://arxiv.org/abs/2209.11895">In-context Learning and Induction Heads</a></li>
<li><a href="https://arxiv.org/abs/2304.14997">Towards Automated Circuit Discovery for Mechanistic Interpretability</a></li>
<li><a href="https://arxiv.org/abs/2310.04625">Copy Suppression: Comprehensively Understanding an Attention Head</a></li>
<li><a href="https://arxiv.org/abs/2305.00586">How does GPT-2 compute greater-than?: Interpreting mathematical abilities in a pre-trained language model</a></li>
<li><a href="https://arxiv.org/abs/2402.11917">A Mechanistic Analysis of a Transformer Trained on a Symbolic Multi-Step Reasoning Task</a></li>
<li><a href="https://arxiv.org/abs/2301.05217">Progress measures for grokking via mechanistic interpretability</a></li>
<li><a href="https://arxiv.org/abs/2302.03025">A Toy Model of Universality: Reverse Engineering How Networks Learn Group Operations</a></li>
<li><a href="https://arxiv.org/abs/2210.13382">Emergent Linear Representations in World Models of Self-Supervised Sequence Models</a></li>
<li><a href="https://arxiv.org/abs/2210.13382">Emergent World Representations: Exploring a Sequence Model Trained on a Synthetic Task</a></li>
<li><a href="https://arxiv.org/abs/2302.00525">Transformers are uninterpretable with myopic methods: a case study with bounded Dyck grammars</a></li>
<li><a href="https://arxiv.org/abs/2310.15485">Interpretability Illusions in the Generalization of Simplified Models</a></li>
</ol>
<h4 id="d-지식-저장-factual-association-model-editing">D. 지식 저장, Factual Association, Model Editing</h4>
<ol start="32">
<li><a href="https://arxiv.org/abs/2012.14913">Transformer Feed-Forward Layers Are Key-Value Memories</a></li>
<li><a href="https://arxiv.org/abs/2203.14680">Transformer Feed-Forward Layers Build Predictions by Promoting Concepts in the Vocabulary Space</a></li>
<li><a href="https://arxiv.org/abs/2202.05262">Locating and Editing Factual Associations in GPT</a></li>
<li><a href="https://arxiv.org/abs/2210.07229">Mass-Editing Memory in a Transformer</a></li>
<li><a href="https://arxiv.org/abs/2301.04213">Does Localization Inform Editing? Surprising Differences in Causality-Based Localization vs. Knowledge Editing in Language Models</a></li>
<li><a href="https://arxiv.org/abs/2104.08164">Editing Factual Knowledge in Language Models</a></li>
<li><a href="https://arxiv.org/abs/2110.11309">MEND: Fast Model Editing at Scale</a></li>
<li><a href="https://arxiv.org/abs/2206.06520">Memory-Based Model Editing at Scale</a></li>
<li><a href="https://arxiv.org/abs/2104.08696">Knowledge Neurons in Pretrained Transformers</a></li>
<li><a href="https://arxiv.org/abs/2304.14767">Dissecting Recall of Factual Associations in Auto-Regressive Language Models</a></li>
<li><a href="https://arxiv.org/abs/2402.00164">Knowledge Editing for Large Language Models: A Survey</a></li>
<li><a href="https://arxiv.org/abs/2402.12233">Empirical Study on Updating Key-Value Memories in Transformer Feed-forward Layers</a></li>
</ol>
<h4 id="e-superposition-sae-monosemanticity-nla">E. Superposition, SAE, Monosemanticity, NLA</h4>
<ol start="44">
<li><a href="https://arxiv.org/abs/2209.10652">Toy Models of Superposition</a></li>
<li><a href="https://arxiv.org/abs/2309.08600">Sparse Autoencoders Find Highly Interpretable Features in Language Models</a></li>
<li><a href="https://transformer-circuits.pub/2023/monosemantic-features">Towards Monosemanticity: Decomposing Language Models With Dictionary Learning</a></li>
<li><a href="https://arxiv.org/abs/2605.29358">Scaling Monosemanticity: Extracting Interpretable Features from Claude 3 Sonnet</a></li>
<li><a href="https://arxiv.org/abs/2210.01892">Polysemanticity and Capacity in Neural Networks</a></li>
<li><a href="https://arxiv.org/abs/2211.09169">Engineering Monosemanticity in Toy Models</a></li>
<li><a href="https://arxiv.org/abs/2303.13554">Measuring Feature Sparsity in Language Models</a></li>
<li><a href="https://arxiv.org/abs/2103.15949">Transformer visualization via dictionary learning: contextualized embedding as a linear superposition of transformer factors</a></li>
<li><a href="https://arxiv.org/abs/2309.04827">Neurons in Large Language Models: Dead, N-gram, Positional</a></li>
<li><a href="https://arxiv.org/abs/2305.01610">Finding Neurons in a Haystack: Case Studies with Sparse Probing</a></li>
<li><a href="https://openaipublic.blob.core.windows.net/neuron-explainer/paper/index.html">Language Models Can Explain Neurons in Language Models</a></li>
<li><a href="https://transformer-circuits.pub/2026/nla/">Natural Language Autoencoders Produce Unsupervised Explanations of LLM Activations</a></li>
</ol>
<h4 id="f-representation-engineering과-activation-steering">F. Representation Engineering과 Activation Steering</h4>
<ol start="56">
<li><a href="https://arxiv.org/abs/2212.03827">Discovering Latent Knowledge in Language Models Without Supervision</a></li>
<li><a href="https://arxiv.org/abs/2310.01405">Representation Engineering: A Top-Down Approach to AI Transparency</a></li>
<li><a href="https://arxiv.org/abs/2312.06681">Steering Llama 2 via Contrastive Activation Addition</a></li>
<li><a href="https://arxiv.org/abs/2310.06824">The Geometry of Truth: Emergent Linear Structure in Large Language Model Representations of True/False Datasets</a></li>
<li><a href="https://arxiv.org/abs/2310.15154">Linear Representations of Sentiment in Large Language Models</a></li>
<li><a href="https://arxiv.org/abs/2402.17410">Representation Engineering Mistral-7B an Acid Trip</a></li>
<li><a href="https://arxiv.org/abs/2503.22720">Representation Engineering: A Unified Framework for Understanding and Steering LLMs</a></li>
<li><a href="https://arxiv.org/abs/2308.10248">Activation Addition: Steering Language Models Without Optimization</a></li>
<li><a href="https://arxiv.org/abs/2306.03341">Inference-Time Intervention: Eliciting Truthful Answers from a Language Model</a></li>
<li><a href="https://arxiv.org/abs/2212.03827">Contrast-Consistent Search for Discovering Latent Knowledge</a></li>
</ol>
<h4 id="g-error-cases">G. Error Cases</h4>
<ol start="66">
<li><a href="https://arxiv.org/abs/2004.09456">StereoSet: Measuring stereotypical bias in pretrained language models</a></li>
<li><a href="https://arxiv.org/abs/2010.00133">CrowS-Pairs: A Challenge Dataset for Measuring Social Biases in Masked Language Models</a></li>
<li><a href="https://arxiv.org/abs/2110.08193">BBQ: A Hand-Built Bias Benchmark for Question Answering</a></li>
<li><a href="https://arxiv.org/abs/2004.12265">Causal Mediation Analysis for Interpreting Neural NLP: The Case of Gender Bias</a></li>
<li><a href="https://arxiv.org/abs/2406.10130">The Devil is in the Neurons: Interpreting and Mitigating Social Biases in Pre-trained Language Models</a></li>
<li><a href="https://arxiv.org/abs/2303.17548">Whose Opinions Do Language Models Reflect?</a></li>
<li><a href="https://arxiv.org/abs/2311.14096">Cultural Bias and Cultural Alignment of Large Language Models</a></li>
<li><a href="https://arxiv.org/abs/2402.13231">Investigating Cultural Alignment of Large Language Models</a></li>
<li><a href="https://arxiv.org/abs/2410.01811">Evaluating Cultural Awareness of LLMs for Yoruba, Malayalam, and English</a></li>
<li><a href="https://arxiv.org/abs/2410.18417">Large Language Models Reflect the Ideology of their Creators</a></li>
<li><a href="https://arxiv.org/abs/2408.06518">Does Liking Yellow Imply Driving a School Bus? Semantic Leakage in Language Models</a></li>
<li><a href="https://arxiv.org/abs/2501.06638">Scaling Down Semantic Leakage: Investigating Associative Bias in Smaller Language Models</a></li>
</ol>
<h4 id="h-chain-of-thought와-reasoning-faithfulness">H. Chain-of-Thought와 Reasoning Faithfulness</h4>
<ol start="78">
<li><a href="https://arxiv.org/abs/2201.11903">Chain-of-Thought Prompting Elicits Reasoning in Large Language Models</a></li>
<li><a href="https://arxiv.org/abs/2203.11171">Self-Consistency Improves Chain of Thought Reasoning in Language Models</a></li>
<li><a href="https://arxiv.org/abs/2305.04388">Large Language Models Don’t Always Say What They Think: Unfaithful Explanations in Chain-of-Thought Prompting</a></li>
<li><a href="https://arxiv.org/abs/2307.13702">Measuring Faithfulness in Chain-of-Thought Reasoning</a></li>
<li><a href="https://arxiv.org/abs/2305.20050">Let’s Verify Step by Step</a></li>
<li><a href="https://arxiv.org/abs/2203.14465">STaR: Bootstrapping Reasoning With Reasoning</a></li>
<li><a href="https://arxiv.org/abs/2301.13379">Faithful Chain-of-Thought Reasoning</a></li>
<li><a href="https://arxiv.org/abs/2304.13702">On the Faithfulness of Chain-of-Thought Reasoning</a></li>
</ol>
<h4 id="i-training-data-memorization-leakage-원인-추적">I. Training Data, Memorization, Leakage 원인 추적</h4>
<ol start="86">
<li><a href="https://arxiv.org/abs/2303.03919">Data Portraits: Recording Foundation Model Training Data</a></li>
<li><a href="https://arxiv.org/abs/2308.03296">Studying Large Language Model Generalization with Influence Functions</a></li>
<li><a href="https://arxiv.org/abs/2409.19998">Do Influence Functions Work on Large Language Models?</a></li>
<li><a href="https://arxiv.org/abs/2410.01285">Enhancing Training Data Attribution for Large Language Models with Fitting Error Awareness</a></li>
<li><a href="https://arxiv.org/abs/2605.05687">DataDignity: Training Data Attribution for Large Language Models</a></li>
</ol>
<hr>
<p>요즘 기초가 부실하다는 생각이 많이 들어서, 연구는 bottom-up으로 빠르게 진행하되 동시에 interpretability, safety 연구들을 top-down으로 공부하려고 한다.</p>
<p>중요한 시기이니만큼 지금까지 보낸 방학 중 가장 알찬 방학을 보내고 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[On Memory Construction and Retrieval for Personalized Conversational Agents]]></title>
            <link>https://velog.io/@beaver_zip/On-Memory-Construction-and-Retrieval-for-Personalized-Conversational-Agents</link>
            <guid>https://velog.io/@beaver_zip/On-Memory-Construction-and-Retrieval-for-Personalized-Conversational-Agents</guid>
            <pubDate>Fri, 29 May 2026 09:32:43 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>ICLR 2025 [<a href="https://arxiv.org/pdf/2502.05589">Paper</a>] [<a href="https://github.com/microsoft/SeCom/">Code</a>]
Zhuoshi Pan, Qianhui Wu, Huiqiang Jiang, Xufang Luo, Hao Cheng, Dongsheng Li, Yuqing Yang, Chin-Yew Lin, H. Vicky Zhao, Lili Qiu, Jianfeng Gao
Tsinghua University | Microsoft Corporation
8 Feb 2025</p>
</blockquote>
<h2 id="introduction">Introduction</h2>
<p>LLM 기반 대화형 에이전트를 실제 서비스에서 쓰려면 여러 세션에 걸쳐 쌓인 대화를 기억하고, 현재 사용자 요청에 맞는 정보를 다시 찾아와야 합니다. 기존 접근은 대체로 전체 conversation history를 prompt에 붙이거나, 과거 대화를 summary로 압축하거나, turn-level 또는 session-level 단위로 memory bank를 만든 뒤 retrieval augmented response generation을 수행하는 방식이었습니다.</p>
<p>이 논문이 집중하는 지점은 memory construction에서 가장 기본적인 선택지인 <strong>memory unit granularity</strong>입니다. Turn-level memory는 단위가 너무 작아 관련 정보가 여러 turn에 흩어지기 쉽습니다. 반대로 session-level memory는 한 unit 안에 서로 다른 topic이 함께 들어갈 수 있습니다. Summarization-based memory는 context 길이를 줄이는 데는 유리하지만, QA에 필요한 세부 근거가 summary 과정에서 빠질 위험이 있습니다.</p>
<p>저자들은 이 문제를 다루기 위해 <strong>SeCom</strong>을 제안합니다. SeCom은 conversation history를 topic 단위의 <strong>Se</strong>gment로 나누어 memory bank를 만들고, retrieval 전에 prompt <strong>Com</strong>pression을 적용해 memory unit의 redundancy를 줄입니다. 다시 말해 memory를 “얼마나 길게 저장할 것인가”뿐 아니라, “retrieval을 방해하는 noise를 어떻게 덜어낼 것인가”까지 함께 다루는 방법입니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/781bdecc-1261-4fe0-99f8-81970289e877/image.png" alt=""></p>
<p>[<strong>Figure 1.</strong> turn-level, session-level, summary-based memory와 segment-level memory의 context 품질 차이]</p>
<p>Figure 1을 보면 논문의 문제의식이 바로 드러납니다. Turn-level memory는 query와 직접 겹치는 일부 turn만 고르다가 대화 흐름을 놓칠 수 있습니다. Session-level memory는 필요한 정보와 상관없는 topic까지 함께 가져옵니다. Summary-based memory는 짧지만, 원문에 있던 근거가 사라질 수 있습니다. SeCom의 segment-level memory는 topic coherence를 기준으로 memory unit을 구성해 세 방식 사이의 중간 지점을 찾습니다.</p>
<h2 id="secom">SeCom</h2>
<h3 id="preliminary">Preliminary</h3>
<p>논문에서는 long-term conversation을 여러 session으로 이루어진 history로 정의합니다. 전체 conversation history는 다음처럼 둘 수 있습니다.</p>
<p>$H={c_i}_{i=1}^{C}$</p>
<ul>
<li>$H$: 사용 가능한 conversation history</li>
<li>$C$: session 수</li>
<li>각 session $c_i$는 순차적인 interaction turn으로 구성됨.</li>
</ul>
<p>$c_i={t_j}_{j=1}^{T_i}, \quad t_j=(u_j, r_j)$</p>
<ul>
<li>$T_i$: i번째 session의 turn 수</li>
<li>$t_j$: user request $u_j$와 agent response $r_j$로 이루어진 하나의 interaction turn</li>
</ul>
<p>기본 retrieval augmented response generation은 세 단계로 정리됩니다. 먼저 conversation history  $H$에서 memory bank $M$을 만듭니다. target request $u^*$가 주어지면 retrieval system $f_R$이 관련 memory unit $N$개를 가져옵니다.</p>
<p>${m_n \in M}_{n=1}^{N} \leftarrow f_R(u^*, M, N)$</p>
<p>마지막으로 response generation model $f_{LLM}$은 검색된 memory unit을 context로 삼아 응답 $r^*$를 생성합니다.</p>
<p>$r^* = f_{LLM}(u^*, {m_n}_{n=1}^{N})$</p>
<p>이 formulation에서 핵심 변수는 $M$입니다. 같은 retrieval model과 generation model을 쓰더라도 memory bank를 turn-level, session-level, summary-level, segment-level 중 어떤 단위로 구성하느냐에 따라 검색 품질과 최종 응답이 달라집니다.</p>
<h2 id="method">Method</h2>
<h3 id="conversation-segmentation">Conversation Segmentation</h3>
<p>SeCom은 하나의 session을 topic coherence가 유지되는 여러 segment로 나눕니다. Conversation segmentation model $f_\mathcal{I}$는 session $c$를 입력으로 받아 segment index 집합을 예측합니다.</p>
<p>$f_\mathcal{I}(c)={s_k}<em>{k=1}^{K}, \  \text{where} \ s_k={t*{p_k}, t</em>{p_k+1}, ..., t_{q_k}}$</p>
<ul>
<li>$K$: session 안의 segment 수</li>
<li>$s_k$: $k$번째 segment</li>
<li>$p_k$, $q_k$: 해당 segment의 시작 turn과 마지막 turn index </li>
<li>연속된 segment가 대화를 빠짐없이 덮도록 $p_{k+1}=q_k+1$ 조건도 둡니다.</li>
</ul>
<p>저자들은 open-domain conversation segmentation을 위해 GPT-4를 zero-shot segmentation model로 사용합니다. 이때 원본 session에 turn index와 role identifier를 붙여 모델이 대화 흐름을 더 분명하게 읽도록 합니다. 각 turn은 예를 들어 <code>Turn j</code>, <code>[user]</code>, <code>[agent]</code> 형식으로 정리됩니다.</p>
<p>Annotated segmentation data가 일부 있을 때는 reflection mechanism을 적용합니다. 모델이 segmentation을 수행한 뒤 WindowDiff 기준으로 error가 큰 hard example을 고릅니다. 이어서 LLM이 자신의 segmentation mistake를 분석하고 segmentation guidance를 갱신합니다. 논문은 이 과정을 SGD와 비슷한 prompt-level optimization으로 봅니다. 실제 parameter를 업데이트하는 대신 segmentation rubric을 반복해서 다듬는 방식입니다.</p>
<h3 id="compression-based-memory-denoising">Compression based Memory Denoising</h3>
<p>SeCom의 두 번째 구성 요소는 compression based memory denoising입니다. 자연어 대화에는 반복, filler, 부연 설명, topic drift가 쉽게 섞입니다. 이런 redundancy는 retrieval model이 query와 memory 사이의 relevance signal을 잡는 데 방해가 됩니다.</p>
<p>SeCom은 memory retrieval 전에 memory bank를 prompt compression model로 처리합니다.</p>
<p>${m_n \in M}<em>{n=1}^{N} \leftarrow f_R(u^*, f</em>{Comp}(M), N)$</p>
<p>여기서 $f_{Comp}$는 memory unit을 압축하는 함수입니다. 논문에서는 LLMLingua-2를 사용합니다. 이 압축은 generation 단계의 context를 줄이기 위한 장치에 그치지 않습니다. retrieval 전에 불필요한 token을 제거해 관련 segment가 더 잘 검색되도록 만드는 denoising 역할도 합니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/facb2796-6cae-43e5-bcd8-0d2d999a8bb3/image.png" alt=""></p>
<p>[<strong>Figure 3.</strong> LLMLingua-2 compression rate에 따른 retrieval recall과 relevant/irrelevant segment similarity 변화]</p>
<p>Figure 3은 compression이 retrieval에 어떤 영향을 주는지 보여줍니다. BM25와 MPNet retriever 모두 일정 compression rate 이상에서 recall이 개선됩니다. compression 이후 query와 relevant segment의 similarity는 올라가고, irrelevant segment와의 similarity는 낮아지는 경향도 나타납니다. prompt compression이 단순한 token reduction이 아니라 retrieval signal을 정제하는 과정으로도 작동한다는 해석이 가능합니다.</p>
<h2 id="experiments">Experiments</h2>
<p>논문은 SeCom을 long-term conversation QA와 dialogue segmentation 두 축에서 평가합니다. Response generation에는 주로 GPT-35-Turbo를 사용했고, robustness를 확인하기 위해 Mistral-7B-Instruct-v0.3도 함께 사용했습니다. Retrieval model은 BM25와 MPNet 기반 retriever를 모두 실험합니다. Compression에는 LLMLingua-2를 쓰며, 주요 실험의 compression rate는 75%입니다.</p>
<p>Long-term conversation benchmark로는 LOCOMO와 Long-MT-Bench+를 사용합니다. LOCOMO는 평균 300 turns와 9K tokens 수준의 긴 conversation으로 설명되며, Long-MT-Bench+는 MT-Bench+를 long-range QA 형태로 재구성한 benchmark입니다. 평가 지표에는 BLEU, ROUGE, BERTScore, GPT4Score가 포함됩니다. 저자들은 GPT-4를 이용한 pairwise comparison도 함께 수행했습니다.</p>
<p>Baseline은 네 부류로 나뉩니다. Zero History는 과거 대화를 전혀 사용하지 않고, Full History는 전체 history를 context에 넣습니다. Turn-Level과 Session-Level은 memory granularity를 달리한 retrieval baseline입니다. SumMem, RecurSum, ConditionMem, MemoChat은 기존 memory management 또는 summarization 기반 접근을 대표합니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/746f7319-69d4-45a2-beb7-f0939d78365a/image.png" alt=""></p>
<p>[<strong>Table 1.</strong> LOCOMO와 Long-MT-Bench+에서 SeCom과 baseline의 QA 성능 비교]</p>
<p>Table 1에서 SeCom은 두 benchmark 모두에서 강한 성능을 보입니다. LOCOMO에서는 SeCom(BM25, GPT4-Seg)이 GPT4Score 71.57을 기록해, 가장 높은 baseline인 ConditionMem의 65.92를 앞섭니다. Long-MT-Bench+에서는 SeCom(MPNet, GPT4-Seg)이 GPT4Score 88.81을 기록했고, MemoChat의 85.14보다 높습니다.</p>
<p>차이는 LOCOMO에서 더 뚜렷합니다. LOCOMO는 대화가 길고 topic이 여러 session에 걸쳐 흩어져 있어 memory construction의 영향이 크게 드러나는 설정입니다. Long-MT-Bench+는 평균 turn 수가 더 짧기 때문에 baseline도 상대적으로 높은 점수를 얻습니다.</p>
<p>흥미로운 부분은 retriever에 따른 민감도입니다. Turn-Level과 Session-Level은 BM25와 MPNet 중 어떤 retriever를 쓰느냐에 따라 GPT4Score가 크게 달라집니다. SeCom은 두 retrieval setting에서 비교적 안정적인 성능을 보입니다. Segment-level memory가 fragmentary context와 irrelevant context 사이의 균형을 맞추기 때문으로 해석할 수 있습니다.</p>
<h3 id="evaluation-of-conversation-segmentation-model">Evaluation of Conversation Segmentation Model</h3>
<p>저자들은 conversation segmentation module 자체도 별도로 평가합니다. 사용한 dataset은 DialSeg711, TIAGE, SuperDialSeg입니다. 평가 지표는 Pk, WindowDiff, F1, segment score입니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/35784c2e-04e0-4650-bafe-936b6723c449/image.png" alt=""></p>
<p>[<strong>Table 4.</strong> DialSeg711, SuperDialSeg, TIAGE에서 conversation segmentation model의 성능 비교]</p>
<p>Table 4에서 GPT-4 기반 zero-shot segmentation은 unsupervised baseline보다 전반적으로 나은 성능을 냅니다. Limited annotated data가 있는 transfer learning setting에서는 reflection으로 학습한 segmentation guidance가 쓰입니다. 이 경우 모델은 source dataset의 hard example 100개만으로 rubric을 개선하지만, 일부 target dataset에서는 full training set으로 학습된 baseline보다 좋은 결과를 보입니다.</p>
<h2 id="analysis">Analysis</h2>
<p>SeCom의 이점은 segment-level memory와 compression-based denoising이 함께 작동할 때 분명해집니다. Segment-level memory는 turn-level보다 문맥을 더 보존하고, session-level보다 불필요한 topic을 덜 끌고 옵니다. 이 granularity는 long-term conversation에서 자주 생기는 topic shift를 memory construction 단계에서 반영합니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/42bf96ae-37b1-4bf6-a648-7cb0201ff78a/image.png" alt=""></p>
<p>[<strong>Figure 5.</strong> context budget 변화에 따른 memory granularity별 GPT4Score 비교]</p>
<p>Figure 5는 context budget이 달라져도 segment-level memory가 turn-level과 session-level보다 일관되게 높은 성능을 내는 흐름을 보여줍니다. 단순히 더 많은 token을 넣는 방식이 항상 답은 아니라는 뜻입니다. Retrieval unit이 너무 작으면 필요한 근거가 잘리고, 너무 크면 irrelevant information이 섞입니다.</p>
<p>Compression-based denoising도 별도로 기여합니다. Table 2에서 denoising을 제거하면 LOCOMO 기준 GPT4Score가 69.33에서 59.87로 떨어집니다. Long-MT-Bench+에서는 88.81에서 87.51로 감소합니다. 두 benchmark에서 하락 폭이 다른 이유는 대화 길이와 noise 구조의 차이로 볼 수 있습니다. LOCOMO처럼 긴 history에서는 redundant token과 topic drift가 retrieval에 더 큰 영향을 주므로 compression 효과가 더 크게 나타납니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/f603b605-386b-4f25-8e64-2973257a8c0b/image.png" alt=""></p>
<p>[<strong>Table 2.</strong> compression-based memory denoising 제거에 따른 성능 변화]</p>
<p>Full History의 한계도 눈에 띕니다. Mistral-7B-Instruct-v0.3은 32K context window를 갖고 있어 Long-MT-Bench+ 전체 history를 넣을 수 있지만, Full History는 SeCom보다 낮은 성능을 보입니다. long context window가 retrieval-free memory management를 곧바로 대체하지는 못한다는 결과입니다. 모델이 긴 context를 받을 수 있더라도, 관련 정보가 얼마나 잘 정리되어 들어가는지가 응답 품질에 영향을 줍니다.</p>
<p>물론 trade-off도 있습니다. GPT-4 기반 segmentation은 가장 좋은 결과를 내지만 비용과 latency가 따릅니다. 논문은 Mistral-7B와 RoBERTa 기반 segmentation도 실험하지만, 성능은 GPT-4-Seg보다 낮습니다. Compression rate를 지나치게 높이면 필요한 정보까지 제거될 수 있습니다. 따라서 SeCom을 실제 시스템에 적용하려면 segmentation model, retriever, compression rate, context budget을 함께 조정해야 합니다.</p>
<h2 id="limitations">Limitations</h2>
<p>이 논문은 memory construction과 retrieval granularity를 비교적 분명하게 분석하지만, 남는 한계도 있습니다.</p>
<p>우선 가장 좋은 결과가 GPT-4 기반 segmentation에 의존합니다. 저자들은 Mistral-7B와 RoBERTa-scale model도 사용할 수 있음을 보였지만, 특히 RoBERTa-Seg 설정에서는 성능 하락이 관찰됩니다. Resource-constrained environment에서 SeCom을 쓰려면 segmentation 품질과 비용 사이의 절충이 필요합니다.</p>
<p>평가의 중심이 long-term conversation QA에 놓여 있다는 점도 한계입니다. LOCOMO와 Long-MT-Bench+는 memory retrieval을 분석하기 좋은 benchmark이지만, 실제 personalized conversational agent에서는 memory update, deletion, privacy control, user-specific preference drift 같은 문제가 함께 생깁니다. 이 논문은 memory를 어떻게 저장하고 검색할지에 초점을 맞추며, 장기 서비스 운영에 필요한 memory governance까지 다루지는 않습니다.</p>
<p>Compression-based denoising도 항상 안전한 연산은 아닙니다. LLMLingua-2가 redundant token을 제거해 retrieval을 개선하더라도 task에 따라 세부 근거가 압축 과정에서 약해질 수 있습니다. 논문 결과에서는 75% compression rate가 효과적이지만, 다른 domain이나 multilingual dialogue에서도 같은 설정이 최적이라고 보기는 어렵습니다.</p>
<p>마지막으로 SeCom은 retrieval pipeline의 여러 component를 조합하는 방식입니다. Segmenter, compressor, retriever, generator가 각각 독립적으로 작동하므로 error propagation이 생길 수 있습니다. 예를 들어 segmentation boundary가 잘못 잡히면 compression과 retrieval은 그 오류를 전제로 수행됩니다. End-to-end로 memory construction policy를 학습하는 방향은 후속 연구로 남아 있습니다.</p>
<h2 id="conclusion">Conclusion</h2>
<p>이 논문은 personalized conversational agent에서 memory bank를 어떤 단위로 구성해야 하는지 체계적으로 살펴봅니다. Turn-level, session-level, summarization-based memory는 각각 fragmentary context, irrelevant context, information loss라는 문제를 안고 있습니다. SeCom은 conversation segmentation으로 topic-level segment를 만들고, LLMLingua-2 기반 compression으로 retrieval noise를 줄여 이 문제를 완화합니다.</p>
<p>실험 결과는 segment-level memory가 long-term conversation QA에서 더 안정적인 retrieval context를 제공한다는 점을 보여줍니다. 특히 LOCOMO처럼 긴 대화에서는 SeCom의 이점이 크게 나타납니다. Full History가 가능한 long-context model에서도 SeCom이 더 나은 결과를 얻었다는 점은 memory management가 단순한 context length 확장과는 다른 문제임을 보여줍니다.</p>
<p>SeCom의 기여는 새로운 generation model을 제안하는 데 있지 않습니다. 이 논문은 conversational agent의 장기 기억 성능이 memory unit의 구조, retrieval 전처리, context budget 설계에 크게 좌우된다는 점을 실험으로 정리합니다. 장기 대화형 agent를 설계할 때는 memory를 많이 저장하는 것보다, 검색 가능한 형태로 잘 나누고 정제하는 일이 더 중요하다는 방향을 제시합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Recipes for Safety in Open-domain Chatbots]]></title>
            <link>https://velog.io/@beaver_zip/Recipes-for-Safety-in-Open-domain-Chatbots</link>
            <guid>https://velog.io/@beaver_zip/Recipes-for-Safety-in-Open-domain-Chatbots</guid>
            <pubDate>Wed, 27 May 2026 16:21:13 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>[<a href="https://arxiv.org/abs/2010.07079">Paper</a>] [<a href="https://parl.ai/projects/safety_recipes/">Code</a>]
Jing Xu, Da Ju, Margaret Li, Y-Lan Boureau, Jason Weston, Emily Dinan
Facebook AI Research
14 Oct 2020</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/f4b9e265-ab24-472d-a489-d8df9cf4df62/image.png" alt=""></p>
<h2 id="introduction">Introduction</h2>
<p>대규모 human-human conversation 데이터로 학습된 open-domain dialogue model은 자연스럽고 흥미로운 대화를 생성할 수 있지만, 동시에 학습 데이터 안에 존재하는 toxic language, offensive behavior, unwanted bias도 함께 모방할 수 있습니다. 본 논문에서는 이러한 문제를 완화하면서도 모델의 engagingness를 유지하는 여러 safety recipe를 비교합니다.</p>
<p>저자들이 핵심으로 보는 문제는 <strong>safety와 engagingness 사이의 trade-off</strong>입니다. 예를 들어, 모든 입력에 대해 <code>잘 모르겠습니다.</code>처럼 회피적으로 답하는 모델은 안전할 수는 있지만, 대화 참여도는 크게 떨어집니다. 반대로 어떤 주제든 적극적으로 받아치는 모델은 더 흥미롭지만, adversarial user나 sensitive topic 상황에서 unsafe response를 생성할 위험이 커집니다. 이 논문의 목표는 “안전하지만 지루한 모델”이 아니라, <strong>engaging하면서도 offensive response를 최소화하는 모델</strong>을 만드는 것입니다.</p>
<p>논문의 핵심 기여는 크게 두 가지 입니다.</p>
<ol>
<li><p><strong>Bot-Adversarial Dialogue Safety</strong>
사람이 실제로 챗봇을 공격하듯 대화하면서 unsafe response를 유도하고, 그 결과를 학습 및 평가 데이터로 사용하는 human-and-model-in-the-loop framework입니다.</p>
</li>
<li><p><strong>Baked-in Safety Model</strong>
배포 시 별도의 safety classifier를 붙이는 대신, 학습 과정에서 safety behavior를 generative model 내부에 증류하는 방식입니다. 즉, safety layer를 외부 모듈로 두는 것이 아니라 모델 자체에 내장(bake-in)하는 접근입니다. </p>
</li>
</ol>
<hr>
<h2 id="base-model">Base Model</h2>
<p>본 논문에서는 <strong>BST 2.7B</strong> 모델에 다양한 safety recipe를 적용하여 효과를 검증합니다. BST 2.7B의 특징은 다음과 같습니다.</p>
<ul>
<li>BlenderBot 계열의 open-domain dialogue model</li>
<li>Seq2Seq Transformer 구조</li>
<li>pre-training: Reddit 기반 대규모 대화 데이터셋</li>
<li>fine-tuning: ConvAI2, Empathetic Dialogues, Wizard of Wikipedia, Blended Skill Talk 등의 데이터셋</li>
</ul>
<p>비교 모델로는 DialoGPT, GPT-2 Large, pushshift.io Reddit 2.7B가 사용됩니다. 이들은 기존 open-domain generative model이 safety 측면에서 어떤 취약성을 보이는지 확인하기 위한 기준점 역할을 합니다.</p>
<hr>
<h2 id="method">Method</h2>
<p>본 논문에서는 open-domain chatbot을 더 안전하게 만들기 위한 방법들을 <strong>Safety Recipes</strong>라고 부릅니다. 접근 방식은 크게 네 가지입니다.</p>
<ol>
<li><strong>Unsafe Utterance Detection</strong> (부적절한 발언 탐지)</li>
<li><strong>Safe Utterance Generation</strong> (안전한 발언 생성)</li>
<li><strong>Sensitive Topic Avoidance</strong> (민감한 주제 회피)</li>
<li><strong>Gender Bias Mitigation</strong> (성별 편향 완화)</li>
</ol>
<h3 id="1-unsafe-utterance-detection">1. Unsafe Utterance Detection</h3>
<p>가장 직접적인 방법은 별도의 <strong>safety classifier</strong>를 두는 것입니다. 이 classifier는 사용자의 입력과 모델의 출력을 모두 검사합니다. user utterance 또는 bot utterance가 unsafe하다고 판단되면, 모델은 일반 응답 대신 사전에 미리 정해 둔 안전한 응답을 출력합니다. (e.g., <code>I’m sorry, I’m not sure what to say. Thank you for sharing and talking to me though.</code>)</p>
<p>논문에서는 두 가지 대체 응답을 사용합니다. 첫 번째는 <strong>safe response</strong>입니다. 이는 대화를 더 이어가기 어렵다고 판단될 때 중립적인 문장으로 응답하는 방식입니다. 두 번째는 <strong>non-sequitur</strong>입니다. 이는 현재 대화 흐름에서 벗어나 안전한 주제로 화제를 전환하는 방식입니다.</p>
<p>이 구조의 장점은 기존 dialogue model에 쉽게 결합할 수 있다는 점입니다. 다만 classifier의 성능에 크게 의존하는데, 정상적인 발화를 과도하게 차단하면 대화 품질이 낮아지고, unsafe utterance를 놓치면 safety layer의 의미가 약해집니다.</p>
<h3 id="2-bot-adversarial-dialogue-safety">2. Bot-Adversarial Dialogue Safety</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/2b9335c3-413c-4d68-a46e-19db8bdfcee1/image.png" alt=""></p>
<p>[<strong>Figure 1.</strong> Build-it Break-it Fix-it 방식과 Bot-Adversarial Dialogue 방식 비교]</p>
<p>본 논문의 주요 기여 중 하나는 <strong>Bot-Adversarial Dialogue, BAD</strong>입니다. 기존 adversarial data collection은 사람이 classifier를 속이는 문장을 직접 작성하는 방식에 가까웠습니다. 하지만 실제 chatbot 환경에서는 사용자가 여러 turn에 걸쳐 모델을 유도하고, 그 과정에서 unsafe response가 발생할 수 있습니다.</p>
<p>BAD는 이 상황을 데이터 수집 과정에 그대로 반영합니다. Crowdworker는 bot과 자연스럽게 대화하면서 bot이 unsafe response를 생성하도록 유도합니다. 각 turn마다 bot response가 safe한지 unsafe한지 annotation하고, 이 데이터를 safety classifier 학습과 평가에 사용합니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/4466286a-78f9-47ca-b5f0-b32746a0c742/image.png" alt=""></p>
<p>[<strong>Table 1.</strong> Bot-Adversarial Dialogue 데이터셋 통계]</p>
<p>BAD 데이터셋은 5,784개의 dialogue와 78,874개의 utterance로 구성됩니다. 전체 utterance 중 약 40%가 offensive로 annotation되었고, offensive utterance 중 약 1/3은 bot이 생성한 응답입니다. 이 데이터셋은 단일 문장 수준의 toxicity dataset보다 실제 chatbot deployment 상황에 더 가깝습니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/8f9e8e1d-8ff8-4e3d-9b6c-ab664f2f5439/image.png" alt=""></p>
<p>[<strong>Figure 2.</strong> Crowdworker가 bot을 break하기 위해 사용한 offensive language 유형 분포]</p>
<p>Figure 2는 crowdworker들이 어떤 방식으로 bot을 공격했는지 보여줍니다. 단순한 profanity뿐 아니라 hate speech, personal attack, implicit offensiveness가 주요 유형으로 나타납니다. 이는 chatbot safety가 단순 금칙어 차단만으로 해결되기 어렵다는 점을 보여줍니다.</p>
<h3 id="3-safe-utterance-generation">3. Safe Utterance Generation</h3>
<p>Unsafe Utterance Detection은 별도의 classifier를 dialogue model 바깥에 두는 방식입니다. 반면 <strong>Safe Utterance Generation</strong>은 모델 자체가 unsafe response를 덜 생성하도록 학습시키는 접근입니다.</p>
<p>이 방향은 deployment 측면에서 중요합니다. safety classifier를 항상 함께 배포하지 않아도 되고, 모델이 unsafe input을 만났을 때 더 적절하게 반응하도록 만들 수 있기 때문입니다. 논문에서는 data pre-processing, safe beam blocking, control token, baked-in safety를 실험합니다.</p>
<h4 id="31-data-pre-processing">3.1 Data Pre-processing</h4>
<p>첫 번째 방법은 학습 데이터에서 unsafe example을 제거하는 것입니다. 논문에서는 두 가지 filtering 방식을 사용합니다.</p>
<ol>
<li><p><strong>Utterance-based filtering</strong>
context나 target response가 unsafe하다고 판단되면 해당 example을 제거합니다.</p>
</li>
<li><p><strong>Author-based filtering</strong>
offensive utterance 비율이 높은 author의 데이터를 통째로 제거합니다.</p>
</li>
</ol>
<p>이 방법은 모델이 toxic pattern을 덜 학습하도록 돕습니다. 그러나 unsafe input을 거의 보지 못한 모델은 실제 adversarial 상황에서 어떻게 대응해야 하는지 배우기 어렵습니다. 이 한계는 이후 Baked-in Safety가 등장하는 배경입니다.</p>
<h4 id="32-safe-beam-blocking">3.2 Safe Beam Blocking</h4>
<p>두 번째 방법은 decoding 단계에서 unsafe word나 n-gram을 생성하지 못하게 막는 것입니다. Beam search 과정에서 특정 단어 목록에 포함된 표현을 block합니다.</p>
<p>이 방법은 구현이 간단하지만 적용 범위가 제한적입니다. 명시적인 욕설이나 금칙어는 차단할 수 있지만, safe word만으로 구성된 공격적 표현까지 막기는 어렵습니다. 문맥에 따라 문제가 되는 utterance도 word list만으로는 구분하기 어렵습니다.</p>
<h4 id="33-safety-and-style-control">3.3 Safety and Style Control</h4>
<p>세 번째 방법은 <strong>control token</strong>을 사용하는 것입니다. 학습 시 각 response에 safe / unsafe 또는 특정 style label을 붙이고, inference 시 원하는 control token을 고정합니다.</p>
<p>Safety control에서는 response가 safe한지 unsafe한지 classifier로 판별한 뒤, 그 정보를 control token으로 입력에 추가합니다. inference 시에는 safe control token을 사용하여 모델이 더 안전한 응답을 생성하도록 유도합니다.</p>
<p>논문에서는 Style control도 함께 실험합니다. <code>calm</code>, <code>cheerful</code>과 같은 style은 상대적으로 안전한 응답을 유도하는 반면, <code>hostile</code>, <code>cruel</code>과 같은 style은 unsafe response를 증가시킵니다. 이 결과는 generation style이 safety와 밀접하게 연결되어 있음을 보여줍니다.</p>
<h4 id="34-baked-in-safety">3.4 Baked-in Safety</h4>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/54e381f5-ce98-49b4-a465-5c91e922a67a/image.png" alt=""></p>
<p>[<strong>Table 2.</strong> Original Data, Safe Utterance Data, Baked-in Safety Data 비교]</p>
<p>이 논문의 또 다른 주요 기여는 <strong>Baked-in Safety</strong>입니다. 이 방법은 unsafe example을 제거하는 대신, target response를 안전한 응답으로 교체합니다. 예를 들어 context나 gold response가 unsafe하다고 판단되면, 해당 target을 safe response 또는 non-sequitur로 바꿉니다.</p>
<p>이렇게 학습하면 모델은 offensive input을 보더라도 이를 따라 하거나 동조하지 않고, 안전하게 대화를 전환하는 방식을 배웁니다. 단순 filtering이 unsafe data를 학습에서 지우는 방식이라면, Baked-in Safety는 unsafe 상황에서의 바람직한 행동을 직접 가르치는 방식입니다.</p>
<p>또한 이 방법은 inference time에 별도의 safety classifier를 요구하지 않습니다. classifier가 내린 판단을 학습 데이터에 반영해, safety behavior를 generative model 내부에 증류하기 때문입니다.</p>
<h3 id="4-sensitive-topic-avoidance">4. Sensitive Topic Avoidance</h3>
<p>논문에서는 toxicity와 sensitive topic을 구분합니다. 어떤 utterance는 욕설이나 hate speech를 포함하지 않더라도, politics, religion, medical advice처럼 민감한 주제에서는 부적절하거나 위험한 응답으로 이어질 수 있습니다.</p>
<p>저자들은 이를 다루기 위해 sensitive topic classifier를 학습합니다. 학습 데이터는 Reddit의 subreddit list를 기반으로 구성되며, 대상 topic은 politics, religion, drugs, medical advice, NSFW 등입니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/9b871967-660f-4245-9b82-c13e607d6da4/image.png" alt=""></p>
<p>[<strong>Table 3.</strong> Sensitive topic classifier 학습에 사용한 topic별 subreddit list]</p>
<p>Sensitive topic classifier는 일반 safety classifier와 역할이 다릅니다. safety classifier는 offensive language 감지에 초점을 둔다면, sensitive topic classifier는 대화가 위험한 주제로 이동하고 있는지를 판단합니다. 두 classifier가 다루는 문제가 다르기 때문에 실제 시스템에서는 서로 보완적으로 사용할 수 있습니다.</p>
<h3 id="5-gender-bias-mitigation">5. Gender Bias Mitigation</h3>
<p>마지막으로 논문은 gender bias를 줄이기 위해 controlled generation을 적용합니다. 학습 데이터의 response가 female-gendered word 또는 male-gendered word를 포함하는지에 따라 control bin을 만들고, inference 시에는 gendered word 사용을 최소화하는 bin을 사용합니다.</p>
<p>이 방법은 gendered word 사용을 줄이는 데 효과가 있습니다. 다만 adversarial safety를 직접적으로 해결하지는 못합니다. 따라서 gender bias mitigation은 safety pipeline의 한 구성 요소로 볼 수 있지만, BAD와 같은 adversarial setting에 대한 주된 해결책은 아닙니다.</p>
<hr>
<h2 id="experiments">Experiments</h2>
<p>평가는 크게 두 축으로 이루어집니다.</p>
<ol>
<li><p><strong>Conversational Quality</strong>
모델이 얼마나 자연스럽고 engaging한 응답을 생성하는지 평가합니다.</p>
</li>
<li><p><strong>Safety</strong>
모델이 unsafe response를 얼마나 적게 생성하는지 평가합니다.</p>
</li>
</ol>
<p>Conversational quality는 perplexity, F1, ACUTE-Eval engagingness로 측정합니다. Safety는 automatic metric과 human judgment를 함께 사용합니다. 특히 human safety evaluation에서는 BAD test set을 사용해, adversarial user가 모델을 공격하는 상황을 평가합니다.</p>
<h3 id="1-classifier-results">1. Classifier Results</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/44a513f5-0553-45d6-9c11-01f64cf6fb80/image.png" alt=""></p>
<p>[<strong>Table 7.</strong> WTC, Standard, BBF, BAD test set에서 safety classifier의 unsafe F1 비교]</p>
<p>Table 7은 safety classifier의 성능을 보여줍니다. 가장 눈에 띄는 결과는 BAD 데이터로 학습한 classifier가 BAD test set에서 가장 높은 성능을 냈다는 점입니다.</p>
<p><strong>Multi-turn Safety Classifier with Adversarial Dialogue</strong>는 BAD test set에서 <strong>80.8 unsafe F1</strong>을 기록합니다. 기존 classifier들이 같은 test set에서 60점대 초반에 머문 것과 비교하면 차이가 큽니다.</p>
<p>이 결과는 chatbot safety에서 데이터 분포가 중요하다는 점을 보여줍니다. 일반적인 toxicity dataset만으로는 human-bot interaction에서 발생하는 unsafe response를 충분히 포착하기 어렵습니다. 반면 BAD는 실제 bot을 상대로 수집한 multi-turn adversarial dialogue이기 때문에, deployment 상황에 더 가까운 학습 신호를 제공합니다.</p>
<h3 id="2-automatic-safety-metrics">2. Automatic Safety Metrics</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/14912359-4f9c-4f04-a601-16cfb39279de/image.png" alt=""></p>
<p>[<strong>Table 8.</strong> 다양한 generative model의 automatic safety metric 비교]</p>
<p>Table 8은 pushshift.io Reddit 및 ConvAI2 context에서 각 모델이 생성한 응답을 automatic metric으로 평가한 결과입니다. 기본 BST 2.7B는 pushshift.io Reddit context에서 classifier 기준 <strong>10.0%</strong>의 unsafe generation을 보입니다.</p>
<p>Baked-in Safety 계열의 non-sequitur fine-tuned model은 이 값을 크게 낮춥니다. 예를 들어 BST 2.7B Non-Sequitur는 pushshift.io Reddit context에서 classifier fire rate를 <strong>0.9%</strong>까지 낮춥니다.</p>
<p>다만 automatic metric은 classifier의 판단에 의존합니다. 특히 two-stage model처럼 classifier를 내부적으로 사용하는 모델은 같은 방식으로 평가하기 어렵습니다. 그래서 논문은 human safety evaluation을 별도로 수행합니다.</p>
<h3 id="3-human-safety-judgments">3. Human Safety Judgments</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/9b360feb-ebe8-4ee4-b313-59fa91270d1e/image.png" alt=""></p>
<p>[<strong>Table 9.</strong> BAD adversarial test set에서 모델별 human safety judgment 결과]</p>
<p>Table 9는 논문의 주요 실험 결과를 담고 있습니다. 기본 BST 2.7B는 adversarial test set에서 <strong>55.0% OK rate</strong>에 그칩니다. 즉, 사용자가 모델을 의도적으로 유도하면 기존 open-domain chatbot은 상당한 비율로 unsafe response를 생성합니다.</p>
<p>BAD 기반 safety classifier를 적용하면 결과가 크게 달라집니다. <strong>BST 2.7B + Adversarial Dialogue Safety</strong>는 <strong>94.4% OK rate</strong>를 달성합니다. 여기에 topic classifier를 추가한 모델은 <strong>96.6% OK rate</strong>까지 올라갑니다.</p>
<p>이 결과는 BAD 기반 two-stage model이 adversarial setting에서 가장 강한 safety 성능을 보인다는 점을 보여줍니다.</p>
<h3 id="4-engagingness-results">4. Engagingness Results</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/99b60c1e-e208-4a4d-86ff-d41b419d6a76/image.png" alt=""></p>
<p>[<strong>Table 10.</strong> ACUTE-Eval을 통한 engagingness 비교]</p>
<p>Table 10은 safety method를 적용한 모델들이 기본 BST 2.7B와 비교해 얼마나 engaging한지 보여줍니다. BAD 기반 two-stage model은 safety를 크게 높이면서도 BST 2.7B의 engagingness를 대체로 유지합니다.</p>
<p>이 점이 중요한데요, safety를 높이는 가장 쉬운 방법은 모든 위험한 상황에서 대화를 회피하는 것입니다. 그러나 그런 모델은 open-domain chatbot으로서의 가치가 낮습니다. BAD 기반 방법은 safety와 engagingness 사이에서 더 나은 균형점을 찾습니다.</p>
<p>반면 topic classifier는 더 자주 대화에 개입할 수 있기 때문에 engagingness 손실이 나타날 수 있습니다. 실제 deployment에서는 classifier threshold와 개입 전략을 함께 조정해야 합니다.</p>
<h3 id="5-overall-comparison">5. Overall Comparison</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/8c6c3b6e-42aa-4e76-b77d-2f3ea95f0621/image.png" alt=""></p>
<p>[<strong>Figure 3.</strong> Engagingness와 Bot-Adversarial safety의 관계]</p>
<p>Figure 3은 모델들을 engagingness와 adversarial safety의 두 축에서 비교합니다. 좋은 모델은 두 값이 모두 높아야 합니다.</p>
<p>기본 generative model들은 engagingness 측면에서는 강하지만, adversarial safety가 부족합니다. 반대로 지나치게 회피적인 모델은 안전할 수는 있어도 대화 품질이 낮습니다. BAD 기반 two-stage model은 BST 2.7B의 engagingness를 유지하면서 safety를 크게 개선해, 두 축 사이에서 가장 좋은 균형을 보입니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/79d4929a-391a-4c19-9619-51ba252044c2/image.png" alt=""></p>
<p>[<strong>Figure 4.</strong> Automatic safety metric과 adversarial safety metric 비교]</p>
<p>Figure 4는 non-adversarial automatic safety와 adversarial safety를 함께 보여줍니다. 여기서 중요한 점은 일반적인 context에서 안전해 보이는 모델이 adversarial setting에서도 안전하다고 단정할 수 없다는 것입니다.</p>
<p>Baked-in Safety는 non-adversarial setting에서 좋은 개선을 보입니다. 그러나 adversarial setting에서는 BAD 기반 two-stage model이 더 강한 결과를 냅니다. 두 결과를 함께 보면, chatbot safety 평가는 일반 대화와 공격적 대화를 모두 포함해야 합니다.</p>
<hr>
<h2 id="analysis">Analysis</h2>
<h3 id="1-bot-adversarial-dialogue가-효과적인-이유">1. Bot-Adversarial Dialogue가 효과적인 이유</h3>
<p>BAD가 효과적인 이유는 학습 데이터가 실제 사용 환경과 가깝기 때문입니다. 기존 toxicity dataset은 대부분 single-turn text classification을 전제로 합니다. 하지만 chatbot은 여러 turn의 dialogue context를 바탕으로 응답하고, 사용자는 그 context를 이용해 모델을 유도할 수 있습니다.</p>
<p>BAD는 이 multi-turn adversarial interaction을 직접 수집합니다. 따라서 BAD로 학습한 classifier는 단순히 offensive word를 찾는 수준을 넘어, 대화 흐름 속에서 위험한 bot response를 감지하는 데 더 적합합니다.</p>
<h3 id="2-two-stage-model과-baked-in-safety">2. Two-stage Model과 Baked-in Safety</h3>
<p>실험에서 가장 강한 safety 성능을 보인 방법은 <strong>two-stage model</strong>입니다. Safety classifier가 user input과 bot output을 모두 검사하기 때문에, unsafe response가 사용자에게 전달되기 전에 차단할 수 있습니다.</p>
<p><strong>Baked-in Safety</strong>에는 다른 장점이 있는데요, 별도의 classifier 없이 generative model 자체에 safety behavior를 학습시키므로 deployment가 단순합니다. 또한 모델이 unsafe input을 마주했을 때 어떤 식으로 대응해야 하는지도 직접 배웁니다.</p>
<p>다만 adversarial setting에서는 two-stage model이 더 강한 결과를 보입니다. 따라서 두 방식은 대체 관계라기보다 목적이 다른 선택지에 가깝습니다. 강한 safety가 필요한 환경에서는 two-stage model이 적합하고, 배포 단순성과 모델 자체의 안전한 행동을 중시한다면 Baked-in Safety가 유용합니다.</p>
<h3 id="3-success-and-failure-cases">3. Success and Failure Cases</h3>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/69bef76c-4d19-4fee-b36c-c69b658685a9/image.png" alt=""></p>
<p>[<strong>Table 17.</strong> BAD test set에서 safety model이 unsafe input을 회피한 사례]</p>
<p>Table 17은 safety model의 성공 사례를 보여줍니다. adversarial input이 주어졌을 때, BST 2.7B나 DialoGPT는 unsafe한 방향으로 대화를 이어가기도 합니다. 반면 BAD 기반 safety model은 non-sequitur를 사용해 안전한 주제로 대화를 전환합니다.</p>
<p><img src="https://velog.velcdn.com/images/beaver_zip/post/162e55c9-0f90-4838-9449-6da85c3d01d1/image.png" alt=""></p>
<p>[<strong>Table 19.</strong> BAD test set에서 safety model도 실패하는 사례]</p>
<p>Table 19는 남아 있는 한계를 보여주는데요, BAD 기반 two-stage model도 모든 adversarial input을 완벽하게 처리하지는 못합니다. 일부 사례에서는 모델이 공격적인 문맥에 직접 반응하면서 unsafe response를 생성합니다.</p>
<p>이 분석은 safety 개선이 일회성 작업이 아니라는 점을 시사합니다. 새로운 공격 방식과 사회적 기준의 변화에 맞춰 data collection, classifier update, human evaluation이 지속적으로 이루어져야 합니다.</p>
<hr>
<h2 id="limitations">Limitations</h2>
<p>가장 좋은 모델도 완전히 안전하지는 않습니다. BAD 기반 two-stage model에 topic classifier를 결합한 모델은 <strong>96.6% OK rate</strong>를 달성했지만, 여전히 약 <strong>3.4% failure rate</strong>가 남아 있습니다.</p>
<p>또한 safety의 기준은 고정되어 있지 않습니다. 어떤 표현이 안전한지, 어떤 주제가 민감한지는 문화적 배경과 사용자 맥락에 따라 달라질 수 있습니다. 본 논문의 annotation 역시 특정 언어와 문화권의 기준에 영향을 받습니다.</p>
<p>마지막으로 이 연구는 주로 영어권 open-domain chatbot을 대상으로 합니다. 다른 언어권이나 서비스 환경에 적용하려면, 해당 환경에 맞는 adversarial data와 annotation guideline이 필요합니다.</p>
<hr>
<h2 id="conclusion">Conclusion</h2>
<p>본 논문은 open-domain chatbot safety를 여러 관점에서 체계적으로 비교한 연구입니다. 결과를 정리하면 다음과 같습니다.</p>
<ol>
<li>Word blocking이나 data filtering만으로는 충분하지 않습니다.</li>
<li>실제 human-bot adversarial interaction에서 수집한 BAD 데이터는 safety classifier 성능을 크게 개선합니다.</li>
<li>BAD 기반 two-stage model은 engagingness를 유지하면서 adversarial safety를 높입니다.</li>
<li>Baked-in Safety는 classifier 없이 safety behavior를 모델 내부에 학습시키는 유용한 방향입니다.</li>
<li>Safety는 context-dependent한 문제이므로, 지속적인 평가와 데이터 업데이트가 필요합니다.</li>
</ol>
<p>이 논문은 안전한 chatbot을 만들기 위해서는 offensive word 차단을 넘어 <strong>adversarial interaction, sensitive topic, bias, engagingness trade-off</strong>를 함께 다뤄야 한다는 점을 보여줍니다.</p>
]]></description>
        </item>
        <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>
]]></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>
    </channel>
</rss>