<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발 블로그</title>
    <link>https://ahnella2026.tistory.com/</link>
    <description>ai엔지니어를 목표로 하고있습니다. 만나서 반가워요 ! </description>
    <language>ko</language>
    <pubDate>Wed, 15 Jul 2026 01:34:13 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>goodella</managingEditor>
    <item>
      <title>클로드 텐엑스: 10배 더 스마트한 직장인을 위한 &amp;lt;클로드로 AI 에이전트 만들기&amp;gt; 수강 후기</title>
      <link>https://ahnella2026.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 포스팅은 10x 체험단 활동의 일환으로 강의 수강권을 제공받아 작성한 후기입니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! &lt;b&gt;코드잇 10x(코드잇 텐엑스)&lt;/b&gt; 체험단으로 참여해서 클로드(Claude) 웹으로 나만의 AI 에이전트를 만들어보는 강의를 듣고 있는 체험단원입니다. 어느새 2주차 성장 기록을 남길 때가 되었네요. 이번 주에 배운 내용과 직접 실습하면서 느낀 점들을 솔직하게 정리해보려고 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이번주, 내가 배운 핵심&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주의 가장 큰 수확은 클로드의 스킬(Skill)과 &lt;b&gt;커넥터(Connector)&lt;/b&gt; 기능이었습니다. 그동안은 클로드를 그냥질문하면 답해주는 챗봇정도로만 생각했는데, 구글 드라이브 커넥터를 연결하니 클로드가 제 드라이브 안의 실제 문서를 직접 읽어와서 업무에 활용할 수 있다는 걸 알게 됐어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.실습 미션으로 customer-email-reply라는 이름의 개인 스킬을 직접 만들어봤습니다. 이 스킬은고객 문의 이메일에 답장을 작성해줘 같은 트리거가 들어오면, 자동으로 아래와 같은 흐름으로 동작하도록 설계했어요.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;고객 이메일 내용을 파악해서 문의 유형(불량/교환/환불/A/S 등)과 고객 정보를 정리&lt;/li&gt;
&lt;li&gt;구글 드라이브에 있는 주문 내역 시트를 read_file_content로 조회해서 주문번호, 제품명, 구매일, 배송 상태 확인&lt;/li&gt;
&lt;li&gt;동일 고객의 주문이 여러 건이면 전부 확인하고, 이메일에 이름이 없으면 이름으로 매칭 시도&lt;/li&gt;
&lt;li&gt;제품 정보, 환불/교환 정책, 고객 상황을 종합해 &lt;b&gt;전략이 다른 2가지 답장 초안&lt;/b&gt;을 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2457&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnujhd/dJMcacX6wBJ/485DaoK5WRyGROIRH4GRS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnujhd/dJMcacX6wBJ/485DaoK5WRyGROIRH4GRS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnujhd/dJMcacX6wBJ/485DaoK5WRyGROIRH4GRS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnujhd%2FdJMcacX6wBJ%2F485DaoK5WRyGROIRH4GRS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2457&quot; height=&quot;371&quot; data-origin-width=&quot;2457&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1753&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQxlst/dJMcadJn8L9/6r8NC7oEPn873Kls6n9wJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQxlst/dJMcadJn8L9/6r8NC7oEPn873Kls6n9wJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQxlst/dJMcadJn8L9/6r8NC7oEPn873Kls6n9wJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQxlst%2FdJMcadJn8L9%2F6r8NC7oEPn873Kls6n9wJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1753&quot; height=&quot;773&quot; data-origin-width=&quot;1753&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 미니 공기청정기 소음 문의와 스마트 텀블러 환불 요청 두 케이스로 테스트해봤는데, 클로드가 정말 담당자처럼 각 상황에 맞는 톤으로 정중한 답장 두 버전을 뽑아주는 걸 보고 신기했습니다. 단순 변심 환불 기한이 지난 경우와 하자 가능성이 있는 경우를 구분해서 답장 뉘앙스를 다르게 잡아주는 걸 보면서, 이 정도면 실무에 바로 써도 되겠다 싶었어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 외에도 여행 일정을 짜는 실습을 하면서 클로드가 제 취향을 반영한 일정표를 만들어주는 것도 과제를 통해 해봤는데, 확실히 단순 텍스트 답변을 넘어서 실제 결과물(스킬, 문서, 일정)을 만들어내는 방향으로 클로드를 다루는 법을 배운 2주였습니다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 아래는 제가 직접 만들어본 SKILL.md파일 실습 메시지 내역입니다. 팀원에게 계속 물어보는 수고를 덜기 위해 skill로 만들어봤어요.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;SKILL name: dvc-gcs description: 팀원이 디스코드(Discord)에 올린 데이터셋 공유 메시지를 분석하여 manifest.json 스펙과 DVC CLI 명령어를 자동 생성하는 스킬. 누락된 정보가 있을 경우 디스코드 답장용 멘션 메시지를 즉시 생성하고 프로세스를 중단(Early Return)한다. 반드시 이 스킬을 사용할 것: 디스코드 메시지를 붙여넣으며 &quot;데이터셋&quot;, &quot;GCS&quot;, &quot;버킷&quot;, &quot;DVC&quot;, &quot;올려뒀습니다&quot;, &quot;업로드&quot;, &quot;manifest&quot; 등의 키워드가 포함된 경우, 혹은 팀원 메시지를 검증하거나 manifest를 만들어달라는 요청.&lt;/p&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot;&gt;DVC &amp;times; GCS 데이터셋 검증 및 Manifest 생성 스킬&lt;/h1&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;디스코드에 올라온 거친(비정형) 데이터셋 공유 메시지를 파싱하여,&lt;br /&gt;정보가 완전하면 manifest.json + DVC CLI를 생성하고,&lt;br /&gt;불완전하면 즉시 디스코드 답장 템플릿을 출력하고 멈춥니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1. 엔티티 추출 (Parsing)&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;입력된 디스코드 메시지에서 아래 3가지 핵심 엔티티를 추출합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;필드 설명 유효 예시 모호/누락 예시&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;dataset_name&lt;/td&gt;
&lt;td&gt;데이터셋 식별 이름&lt;/td&gt;
&lt;td&gt;알약-v2, pill_classifier&lt;/td&gt;
&lt;td&gt;&quot;저번에 말한 거&quot;, &quot;그 데이터&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;version&lt;/td&gt;
&lt;td&gt;SemVer 형식 버전&lt;/td&gt;
&lt;td&gt;v2.0.0, v1.3.1&lt;/td&gt;
&lt;td&gt;&quot;v2&quot;, &quot;최신&quot;, &quot;업데이트&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcs_path&lt;/td&gt;
&lt;td&gt;전체 GCS URI&lt;/td&gt;
&lt;td&gt;gs://my-bucket/datasets/pill/v2/images/&lt;/td&gt;
&lt;td&gt;&quot;gcs 버킷 이미지 폴더&quot;, &quot;버킷에 있음&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파싱 규칙:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;v2 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모호&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(마이너/패치 불명확) &amp;rarr; 누락 처리&lt;/li&gt;
&lt;li&gt;v2.0.0 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;유효&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&quot;이미지 폴더&quot; 같은 경로 표현 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모호&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 누락 처리&lt;/li&gt;
&lt;li&gt;메시지에서 작성자 이름(A님: 앞부분)도 추출해 멘션에 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. 누락 검사 및 Early Return&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;추출된 엔티티 중 하나라도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;누락&amp;middot;모호&lt;/b&gt;하면 즉시 아래 템플릿을 출력하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;프로세스를 종료&lt;/b&gt;합니다.&lt;br /&gt;(manifest.json 생성으로 넘어가지 않습니다.)&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;디스코드 답장 템플릿&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;@{팀원 이름}님, DVC 버전 관리를 위해 아래 정보가 추가로 필요합니다! 확인 부탁드려요  

{누락된 항목만 기재 &amp;mdash; 예시:}
&amp;bull;   버전: SemVer 형식으로 알려주세요 (예: v2.0.0)
&amp;bull;  ️ GCS 경로: 전체 URI를 공유해 주세요 (예: gs://bucket-name/path/to/dataset/)
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;항목별 누락 메시지 문구:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dataset_name 누락/모호 &amp;rarr; &amp;bull;   데이터셋 이름: 어떤 데이터셋인지 정확한 이름을 알려주세요 (예: pill-classifier)&lt;/li&gt;
&lt;li&gt;version 누락/모호 &amp;rarr; &amp;bull;   버전: SemVer 형식으로 알려주세요 (예: v2.0.0)&lt;/li&gt;
&lt;li&gt;gcs_path 누락/모호 &amp;rarr; &amp;bull;  ️ GCS 경로: 전체 URI를 공유해 주세요 (예: gs://bucket-name/path/to/dataset/)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. manifest.json 및 DVC CLI 생성&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모든 엔티티가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;유효&lt;/b&gt;한 경우에만 아래를 출력합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3-1. manifest.json&lt;/h3&gt;
&lt;pre class=&quot;json&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;{
  &quot;dataset_name&quot;: &quot;{dataset_name}&quot;,
  &quot;version&quot;: &quot;{version}&quot;,
  &quot;gcs_path&quot;: &quot;{gcs_path}&quot;,
  &quot;created_at&quot;: &quot;{오늘 날짜 ISO 8601}&quot;,
  &quot;registered_by&quot;: &quot;{팀원 이름}&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3-2. DVC CLI 명령어 세트&lt;/h3&gt;
&lt;pre class=&quot;haskell&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;# 1. DVC로 GCS 데이터 추적 등록
dvc import-url {gcs_path} data/{dataset_name}/

# 2. 변경사항 커밋
git add data/{dataset_name}.dvc .gitignore
git commit -m &quot;feat(data): add {dataset_name} {version}&quot;

# 3. DVC 메타데이터 푸시
dvc push
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3-3. 완료 확인 메시지 (선택)&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;팀원에게 복사해서 보낼 수 있는 디스코드 메시지도 함께 제공합니다.&lt;/p&gt;
&lt;pre class=&quot;dust&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;@{팀원 이름}님, 확인했습니다 ✅
{dataset_name} {version} 데이터셋이 DVC에 등록되었습니다.
GCS 경로: {gcs_path}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;4. 엣지 케이스 처리 규칙&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;케이스 처리 방식&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&quot;v2&quot; 만 기재&lt;/td&gt;
&lt;td&gt;모호 &amp;rarr; 누락 처리, 버전 항목 피드백&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;저번에 올린 거&quot;&lt;/td&gt;
&lt;td&gt;dataset_name 모호 &amp;rarr; 누락 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;버킷에 있음&quot;&lt;/td&gt;
&lt;td&gt;gcs_path 누락 &amp;rarr; 피드백&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;gs://bucket/path&quot; (트레일링 슬래시 없음)&lt;/td&gt;
&lt;td&gt;유효로 처리, 그대로 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;작성자 이름 없음&lt;/td&gt;
&lt;td&gt;멘션 없이 @담당자님 으로 대체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;복수 데이터셋 언급&lt;/td&gt;
&lt;td&gt;각각 별도로 파싱, 누락 검사 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;지금까지 달라진 나의 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에는 AI를 그냥 질문하고 답을 받는 용도정도로 쓰고, 하나의 md파일에 모든 내용을 넣는 편이었는데, 이제는 skill 관련 파일을 쪼개서 AI에게 맥락을 알려주게 되었어요.&amp;nbsp; 또한 CLAUDE의 경우 구글 드라이브 문서와 GMAIL하고 손쉽게 연결지을 수 있어서, 업무자동화하기 더 편리하다고 느껴서 자주 사용하게 되었어요. 막연했던 &quot;AI 에이전트&quot;라는 개념이 이제는 제 손으로 직접 설계하고 테스트할 수 있는 대상으로 느껴지기 시작했어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;솔직한 아쉬움, 그리고 바라는 점&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;좋은 점도 있었지만 한 가지 아쉬운 점도 있었는데요. 저는 이 강의를 신청하기 전, 요즘 유튜브나 다른 특강에서 자주 보이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;클로드 코드(Claude Code) CLI&lt;/b&gt;를 활용해서 실제 개발 업무나 코드베이스를 자동화하는 실습을 기대하고 있었습니다. 터미널에서 클로드에게 리포지토리를 넘기고, 커밋하고, 테스트까지 돌리는 그런 &quot;개발자를 위한 AI 에이전트&quot; 강의를 상상했거든요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 실제로 들어보니 이번 커리큘럼은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;코딩을 전혀 몰라도 클로드 웹(claude.ai)에서 실습해볼 수 있는 역량&lt;/b&gt;을 키우는 데 초점이 맞춰져 있었습니다. 스킬 만들기, 커넥터 연결하기, 이메일&amp;middot;문서 자동화 같은 내용은 분명 유용하고 잘 만들어진 커리큘럼이지만, 개발자 관점에서는 인사이트를 얻는 수준이었지, 처음 기대했던 CLI 기반 개발 자동화와는 결이 조금 달랐어요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 이 강의를 수강하실 분들이시라면 비개발자, 코딩을 아예 모르시는 분들, gpt나 claude를 단순히 채팅을 통해 물어보는 수준으로만 쓰고계신 분들, ai랄 아예 모르는 지인, 가족들이라면 좋을 거 같아요. 실제로 쉽게 설명이 잘 되어있어서 저희 부모님, 동생들한테 추천하고싶더라고요.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 만약 코드잇 10x 팀에서 보고 계신다면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;비개발자용 클로드 웹 실습 강의&lt;/b&gt;와는 별도로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;클로드 코드 CLI를 활용한 개발자 대상 에이전트 강의&lt;/b&gt;도 꼭 만들어주셨으면 좋겠습니다. 실제 레포지토리를 다루고, 터미널에서 에이전트를 붙여 코드 리뷰&amp;middot;리팩터링&amp;middot;테스트 자동화까지 다루는 내용이라면 개발자 지망생이나 현직 개발자들에게 훨씬 더 실무적인 도움이 될 것 같아요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;앞으로 나의 목표&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에는 이번에 만든 SKILL을 통해 반복적으로 처리하던 문의 유형들을 자동으로 분류하는 단계까지 확장해보고 싶습니다. 그리고 개인적으로는 이번에 배운 내용들을 클로드 코드 CLI 에서는 어떻게 적용하는지 찾아보며 공부를 할 예정입니다.&amp;nbsp; 체험단 기회를 주신 코드잇측에 감사드리며&amp;nbsp; 끝까지 완주해보겠습니다. 파이팅 !!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#코드잇10x #코드잇텐엑스 #클로드 #재피어 #AI에이전트 #AI강의후기 #클로드강의후기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>10x</category>
      <category>AI강의후기</category>
      <category>AI에이전트</category>
      <category>재피어</category>
      <category>코드잇10x</category>
      <category>코드잇텐엑스</category>
      <category>클로드</category>
      <category>클로드강의후기</category>
      <author>goodella</author>
      <guid isPermaLink="true">https://ahnella2026.tistory.com/20</guid>
      <comments>https://ahnella2026.tistory.com/20#entry20comment</comments>
      <pubDate>Sun, 12 Jul 2026 21:24:05 +0900</pubDate>
    </item>
    <item>
      <title>위클리 페이퍼 #17</title>
      <link>https://ahnella2026.tistory.com/19</link>
      <description>&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size26&quot;&gt;1. 모델 서빙(Model Serving)의 본질과 필요성&lt;/h2&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;모델 서빙이란 무엇인가?&lt;/h3&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;학습이 완료된 머신러닝/딥러닝 모델을 파일 형태(e.g., .pth, .onnx, .saved_model)로 방치하지 않고, 외부 애플리케이션이 네트워크(HTTP, gRPC)를 통해 실시간 혹은 배치로 추론(Inference) 결과를 요청하고 받아갈 수 있도록 &lt;b data-index-in-node=&quot;146&quot; data-path-to-node=&quot;5&quot;&gt;API 형태로 패키징하여 운영 환경에 노출하는 과정&lt;/b&gt;을 말합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;왜 필요한가? (기존 소프트웨어와의 차이점)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;전통적인 백엔드 애플리케이션은 데이터의 연산 처리가 CPU와 메모리 바운드(Memory-bound) 성격을 띠며 예측 가능한 선형적 흐름을 갖습니다. 반면 ML 추론은 다음과 같은 독특한 제약 조건을 가집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;무거운 리소스 집약성 (Heavy Compute-bound):&lt;/b&gt; 수천만~수십억 개의 파라미터를 가진 행렬 연산은 CPU만으로 처리가 불가능하거나 극도로 느립니다. GPU 자원의 효율적 배분이 필수적입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;컴퓨팅 예측 불가능성:&lt;/b&gt; 입력 데이터(이미지 크기, 텍스트 길이)에 따라 연산 병목과 메모리 스파이크(OOM: Out Of Memory)가 빈번히 발생합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;동적 가용성 요구:&lt;/b&gt; 주기적인 모델 재학습 및 배포가 서비스 중단(Zero-downtime) 없이 이루어져야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;실제 서비스 환경에서 서빙 프레임워크의 역할&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;FastAPI나 Flask 같은 범용 웹 프레임워크로도 추론 API를 만들 수는 있습니다. 하지만 트래픽이 몰리는 프로덕션 환경에서 Triton Inference Server, TorchServe, TF Serving 같은 &lt;b data-index-in-node=&quot;125&quot; data-path-to-node=&quot;10&quot;&gt;전문 서빙 프레임워크&lt;/b&gt;를 도입하는 이유는 명확합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;동적 배치 처리 (Dynamic Batching):&lt;/b&gt; 개별적으로 들어오는 여러 클라이언트의 요청을 마이크로초 단위로 모아서 하나의 거대한 행렬(Batch)로 묶어 GPU에 전달합니다. GPU는 1개의 요청을 처리할 때와 10개의 요청을 동시에 처리할 때의 속도 차이가 크지 않으므로, 이 기능 하나만으로 &lt;b data-index-in-node=&quot;169&quot; data-path-to-node=&quot;11,0,0&quot;&gt;처리량(Throughput)이 수배 이상 향상&lt;/b&gt;됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;동시 모델 실행 (Concurrent Model Execution):&lt;/b&gt; GPU 메모리가 허용하는 한, 동일한 모델의 인스턴스를 여러 개 띄우거나(Multi-instance) 여러 종류의 모델을 동시에 로드하여 내부적으로 요청을 롸우팅 및 병렬 처리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;모델 관리 및 동적 로딩 (Model Repository Control):&lt;/b&gt; 서버를 재시작하지 않고도 새로운 버전의 모델 파일만 스토리지에 업로드하면 실시간으로 추론 엔진이 갱신(Hot-reload)됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size26&quot;&gt;2. Streamlit + FastAPI + Triton 아키텍처 설계&lt;/h2&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;프로덕션 MLOps 관점에서 세 가지 기술 스택을 결합할 때, &lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;14&quot;&gt;각 컴포넌트의 책임(Single Responsibility)을 엄격히 분리&lt;/b&gt;하는 3-Tier 아키텍처가 가장 바람직합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size23&quot;&gt;추천 아키텍처 구조&lt;/h3&gt;
&lt;div data-ved=&quot;0CAAQhtANahcKEwi3zO3FmLyVAxUAAAAAHQAAAAAQOA&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[ Client / Web Browser ]
         │ (HTTP)
         ▼
┌─────────────────────────────────┐
│       Streamlit Window          │  &amp;lt;-- Presentation Layer (UI 전용)
└─────────────────────────────────┘
         │ (REST API / HTTP)
         ▼
┌─────────────────────────────────┐
│         FastAPI Server          │  &amp;lt;-- Business Logic Layer (Gateway &amp;amp; 오케스트레이션)
└─────────────────────────────────┘
         │ (gRPC / Protocol Buffers)
         ▼
┌─────────────────────────────────┐
│     Triton Inference Server     │  &amp;lt;-- Inference Layer (Heavy Compute 전용)
└─────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;각 레이어별 역할 분담&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,0,0&quot;&gt;Streamlit (Presentation Layer):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,0,1,0,0&quot;&gt;역할:&lt;/b&gt; 사용자 인터페이스(UI) 렌더링, 파일 업로드 컴포넌트 제공, 최종 결과 시각화.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,0,1,1,0&quot;&gt;금기 사항:&lt;/b&gt; &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;18,0,1,1,0&quot;&gt;절대 Streamlit 내부에서 비즈니스 로직을 처리하거나 Triton과 직접 통신해서는 안 됩니다.&lt;/b&gt; Streamlit은 단일 세션 지향적이며, 무거운 연산이나 복잡한 에러 핸들링을 내포하기에 적합하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,1,0&quot;&gt;FastAPI (Business Logic &amp;amp; Gateway Layer):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,1,1,0,0&quot;&gt;역할:&lt;/b&gt; 인증/인가, 입력 데이터 유효성 검증(Pydantic), 요청 파싱, DB CRUD 비즈니스 로직 처리, 그리고 &lt;b data-index-in-node=&quot;67&quot; data-path-to-node=&quot;18,1,1,0,0&quot;&gt;Triton으로의 추론 위임 및 결과 가공&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,1,1,1,0&quot;&gt;통신 프로토콜:&lt;/b&gt; 외부(Streamlit)와는 HTTP JSON으로 통신하고, 내부(Triton)와는 고속 효율을 위해 &lt;b data-index-in-node=&quot;66&quot; data-path-to-node=&quot;18,1,1,1,0&quot;&gt;gRPC&lt;/b&gt;로 통신합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,2,0&quot;&gt;Triton Inference Server (Inference Layer):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,2,1,0,0&quot;&gt;역할:&lt;/b&gt; 순수 모델 추론 연산 가속화, Dynamic Batching 제어. 다른 어떤 백엔드 로직도 관여하지 않고 오직 오퍼레이션(Tensor in, Tensor out)에만 집중합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size26&quot;&gt;디자인 인텐트 (Design Intent) &amp;amp; MLOps 고려사항&lt;/h2&gt;
&lt;blockquote data-path-to-node=&quot;21&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;21,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,0&quot;&gt;엔지니어링 철학:&lt;/b&gt; 백엔드와 AI 추론 레이어의 분리는 단순히 '깔끔한 코드'를 위함이 아닙니다. 이것은 컴퓨팅 자원의 격리(Resource Isolation)를 의미합니다. CPU 집약적인 비즈니스 로직(FastAPI)과 GPU 집약적인 모델 연산(Triton)을 물리적/논리적으로 분리해야만, 급격한 트래픽 증가 시 어느 구간에서 병목이 생겼는지 모니터링할 수 있고 독립적인 스케일 아웃(Scale-out)이 가능해집니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size23&quot;&gt;1. 왜 FastAPI와 Triton 사이에 gRPC를 쓰는가?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;23&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,0,0&quot;&gt;Trade-off:&lt;/b&gt; HTTP/REST는 JSON 기반이라 가독성이 좋고 디버깅이 쉽지만, 대용량 이미지나 고차원 텐서(Tensor) 데이터를 문자열(Base64 등)로 직렬화/역직렬화하는 과정에서 엄청난 CPU 오버헤드가 발생합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,0&quot;&gt;해결책:&lt;/b&gt; Triton과는 HTTP 대신 gRPC(Protocol Buffers)를 사용합니다. 데이터가 바이너리 형태로 압축되어 네트워크 패킷 크기가 극적으로 줄어들고, HTTP/2 기반의 멀티플렉싱을 통해 네트워크 지연 시간(Latency)을 최소화할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;24&quot; data-ke-size=&quot;size23&quot;&gt;2. 전처리(Preprocessing)와 후처리(Postprocessing)는 어디서 해야 하는가?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;25&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,0,0&quot;&gt;Lazy Design (안 좋은 예시):&lt;/b&gt; 클라이언트(Streamlit) 단에서 이미지 크기를 (224, 224)로 리사이즈하고 정규화까지 마친 뒤 API 서버로 보내는 방식.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;25,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,0,1,0,0&quot;&gt;비판:&lt;/i&gt; 프론트엔드가 모델의 세부 명세(입력 셰이프, 정규화 파라미터 등)를 알게 되므로 강한 결합(Tight Coupling)이 발생합니다. 모델이 업데이트되어 입력 형태가 바뀌면 프론트엔드 코드도 배포해야 하는 재앙이 옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,1,0&quot;&gt;Best Practice:&lt;/b&gt; 전/후처리는 크게 두 가지 방법이 권장됩니다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;25,1,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,1,1,0,0&quot;&gt;FastAPI 레이어에서 처리:&lt;/b&gt; CPU 바운드 연산(이미지 디코딩, 리사이즈)을 FastAPI가 수행하고 퓨어 텐서 데이터만 Triton에 토스합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,1,1,1,0&quot;&gt;Triton Ensemble / BLS (Business Logic Scripting) 활용:&lt;/b&gt; Triton 내부에 전처리 모델(Python Backend)과 메인 추론 모델(TensorRT/Onnx Runtime)을 파이프라인으로 묶는 방식입니다. 네트워크 구간에는 순수 로우 데이터(e.g., JPEG 바이너리)만 오고 가므로 아키텍처가 가장 깔끔해지며, 대규모 서빙에서 가장 선호되는 방식입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;26&quot; data-ke-size=&quot;size23&quot;&gt;3. 동시성 관리와 서킷 브레이커 (Circuit Breaker)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;27&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;27,0,0&quot;&gt;Race Conditions 및 Bottleneck 예방:&lt;/b&gt; Triton이 수용할 수 있는 최대 큐(Queue) 크기를 넘어서는 요청이 들어오면 가용성이 무너집니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;27,1,0&quot;&gt;해결책:&lt;/b&gt; FastAPI 게이트웨이 단에 &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;27,1,0&quot;&gt;서킷 브레이커&lt;/b&gt;를 배치하거나 레디스(Redis) 기반의 메시지 큐를 두어, Triton 시스템 전체가 연쇄적으로 다운(Cascading Failure)되는 현상을 방지해야 합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>스프린트미션</category>
      <author>goodella</author>
      <guid isPermaLink="true">https://ahnella2026.tistory.com/19</guid>
      <comments>https://ahnella2026.tistory.com/19#entry19comment</comments>
      <pubDate>Mon, 6 Jul 2026 03:45:42 +0900</pubDate>
    </item>
    <item>
      <title>위클리 페이퍼 #16</title>
      <link>https://ahnella2026.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘이 마지막 위클리 페이퍼 작성일이라서 기분이 이상하네요. 마지막까지 최선을 다해보도록 하겠습니다.  &lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Streamlit을 활용한 AI 모델 통합: Load, Input, Output&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;8&quot;&gt;Streamlit은 데이터 및 AI 애플리케이션을 빠르게 프로토타이핑할 수 있는 강력한 도구입니다. 하지만 머신러닝 모델을 얹을 때는 &lt;b data-index-in-node=&quot;75&quot; data-path-to-node=&quot;8&quot;&gt;상태 관리와 메모리 최적화&lt;/b&gt;를 반드시 고려해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1782661764140&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import streamlit as st
import torch
from PIL import Image

# 1. 모델 로드 (Model Load)
@st.cache_resource
def load_model():
    # 예시: PyTorch 모델 로드
    model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
    model.eval()
    return model

model = load_model()

st.title(&quot;AI 객체 탐지 애플리케이션&quot;)

# 2. 사용자 입력 (User Input)
uploaded_file = st.file_uploader(&quot;이미지를 업로드하세요&quot;, type=[&quot;jpg&quot;, &quot;jpeg&quot;, &quot;png&quot;])

if uploaded_file is not None:
    image = Image.open(uploaded_file)
    st.image(image, caption=&quot;업로드된 이미지&quot;, use_column_width=True)
    
    # 3. 결과 출력 (Output)
    if st.button(&quot;분석 시작&quot;):
        with st.spinner('AI가 이미지를 분석 중입니다...'):
            results = model(image)
            st.image(results.render()[0], caption=&quot;탐지 결과&quot;, use_column_width=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;10,0&quot;&gt;설계 의도 (Design Intent): @st.cache_resource의 필수성&lt;/b&gt; :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Streamlit은 사용자가 버튼을 누르거나 입력을 변경할 때마다 스크립트를 위에서부터 다시 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 @st.cache_resource 데코레이터를 사용하지 않는다면, 매 인터랙션마다 수백 MB에 달하는 모델을 메모리에 다시 올리게 됩니다. 이는 극심한 메모리 누수와 처리 속도 저하를 유발합니다. 따라서 리소스를 캐싱하는 방법을 사용함으로 불필요한 I/O를 줄이고 애플리케이션의 응답성을 보장할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size26&quot;&gt;2. FastAPI 기반 AI 웹 API 서버 아키텍처&lt;/h2&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;FastAPI를 사용할 때 모든 로직을 main.py에 몰아넣는 것은 지양해야 합니다. 기능별로 계층을 분리해야 유지보수가 쉬워지고, 프론트엔드 개발자에게 일관된 에러 응답과 상태 관리를 제공할 수 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt; &amp;nbsp;fastapi-ai-backend &lt;br /&gt;&amp;nbsp;┣&amp;nbsp; &amp;nbsp;api &lt;br /&gt;&amp;nbsp;┃&amp;nbsp;┣&amp;nbsp; &amp;nbsp;v1&amp;nbsp;#&amp;nbsp;API&amp;nbsp;버전&amp;nbsp;관리 &lt;br /&gt;&amp;nbsp;┃&amp;nbsp;┃&amp;nbsp;┣&amp;nbsp; &amp;nbsp;endpoints.py&amp;nbsp;#&amp;nbsp;라우터(Controller&amp;nbsp;역할) &lt;br /&gt;&amp;nbsp;┣&amp;nbsp; &amp;nbsp;core &lt;br /&gt;&amp;nbsp;┃&amp;nbsp;┣&amp;nbsp; &amp;nbsp;config.py&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;환경&amp;nbsp;변수&amp;nbsp;및&amp;nbsp;설정&amp;nbsp;관리 &lt;br /&gt;&amp;nbsp;┃&amp;nbsp;┣&amp;nbsp; &amp;nbsp;security.py&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;인증,&amp;nbsp;CORS&amp;nbsp;설정 &lt;br /&gt;&amp;nbsp;┣&amp;nbsp; &amp;nbsp;models&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;DB&amp;nbsp;엔티티&amp;nbsp;(SQLAlchemy&amp;nbsp;등) &lt;br /&gt;&amp;nbsp;┣&amp;nbsp; &amp;nbsp;schemas&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Pydantic&amp;nbsp;모델&amp;nbsp;(입출력&amp;nbsp;검증) &lt;br /&gt;&amp;nbsp;┣&amp;nbsp; &amp;nbsp;repositories&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;DB&amp;nbsp;접근&amp;nbsp;로직&amp;nbsp;(Repository&amp;nbsp;Pattern) &lt;br /&gt;&amp;nbsp;┣&amp;nbsp; &amp;nbsp;services&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;핵심&amp;nbsp;비즈니스&amp;nbsp;및&amp;nbsp;AI&amp;nbsp;추론&amp;nbsp;호출&amp;nbsp;로직 &lt;br /&gt;&amp;nbsp;┣&amp;nbsp; &amp;nbsp;utils&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;로깅,&amp;nbsp;공통&amp;nbsp;헬퍼&amp;nbsp;함수 &lt;br /&gt;&amp;nbsp;┗&amp;nbsp; &amp;nbsp;main.py&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;FastAPI&amp;nbsp;애플리케이션&amp;nbsp;엔트리포인트&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;15,0&quot;&gt;설계 의도 (Design Intent): 계층 분리 및 Repository 패턴 도입&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;- 백엔드 설계에서 '게으른 구조'란 DB 모델을 API 응답으로 그대로 반환하여 프론트엔드에서 데이터를 파싱하게 만드는 것입니다. 이를 방지하기 위해 &lt;b data-index-in-node=&quot;134&quot; data-path-to-node=&quot;15,0&quot;&gt;Repository 패턴&lt;/b&gt;을 도입하여 데이터 접근 로직(repositories/)과 비즈니스 로직(services/)을 분리합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;- AI 모델 추론 역시 services/ 계층에서 처리하며, 라우터(api/)는 오직 HTTP 요청/응답의 형태와 상태 코드(Status Code) 관리만 책임집니다. 이 구조는 훗날 N+1 쿼리 문제를 해결하거나 데이터베이스를 교체할 때 다른 계층에 미치는 영향을 최소화합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size26&quot;&gt;3. 종합 AI 웹 서비스 아키텍처: 원격 시험 감독 시스템&lt;/h2&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;AI 원격 시험 감독 솔루션을 예시로, 대규모 트래픽을 처리할 수 있는 프로덕션 레벨의 아키텍처를 설계해 보았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1739&quot; data-origin-height=&quot;1054&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HlOKw/dJMcabEHyrv/Q7vKU4g4cs5Dk35Z2xGcs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HlOKw/dJMcabEHyrv/Q7vKU4g4cs5Dk35Z2xGcs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HlOKw/dJMcabEHyrv/Q7vKU4g4cs5Dk35Z2xGcs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHlOKw%2FdJMcabEHyrv%2FQ7vKU4g4cs5Dk35Z2xGcs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1739&quot; height=&quot;1054&quot; data-origin-width=&quot;1739&quot; data-origin-height=&quot;1054&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;  기술 스택 및 아키텍처 상세&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;AI 추론 및 전처리 파이프라인 (MediaPipe &amp;amp; YOLO)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순 객체 탐지(YOLO) 이전에, &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;7,0,1,0,0&quot;&gt;MediaPipe&lt;/b&gt;를 활용하여 수험자의 얼굴, 코, 눈 랜드마크를 인식하고 영상의 각도를 가로 모드로 강제 보정하는 전처리 단계를 거칩니다. 이를 통해 모델에 입력되는 데이터의 정규화를 보장하여 추론 정확도를 극대화했습니다.&lt;/li&gt;
&lt;li&gt;응시자가 이탈한 시간(블랙아웃)은 물리적 영상 합성 대신 &lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;7,0,1,1,0&quot;&gt;메타데이터 기반의 스킵(Skip) 로직&lt;/b&gt;으로 처리하여 GPU 자원 낭비를 차단했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;비동기 분산 큐와 자원 관리 (FastAPI + Redis + Celery)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API 요청을 처리하는 동기 작업(FastAPI)과 AI 모델을 돌리는 CPU Bound 비동기 작업(Celery)을 분리하여 Event Loop 블로킹을 방지했습니다.&lt;/li&gt;
&lt;li&gt;파이썬의 GIL(Global Interpreter Lock) 한계를 극복하기 위해 Celery 워커 내부에서 멀티프로세싱(Multi-processing)을 적용했습니다. 이때, &lt;b data-index-in-node=&quot;99&quot; data-path-to-node=&quot;7,1,1,1,0&quot;&gt;LPT (Longest Processing Time First) 스케줄링 알고리즘&lt;/b&gt;을 도입하여 파일 크기가 가장 큰 영상 청크부터 워커에 먼저 할당함으로써 병렬 처리의 병목 현상을 해결했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;스토리지 최적화 (S3 Pre-signed URL &amp;amp; 비디오 청킹)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대용량 비디오 파일이 백엔드 서버를 직접 거치지 않도록, FastAPI는 인증된 사용자에게만 &lt;b data-index-in-node=&quot;52&quot; data-path-to-node=&quot;7,2,1,0,0&quot;&gt;S3 Pre-signed URL&lt;/b&gt;을 발급합니다.&lt;/li&gt;
&lt;li&gt;클라이언트는 영상을 청크(Chunk) 단위로 분할하여 S3에 직접 업로드(Direct Upload)함으로써 백엔드 서버의 메모리 오버플로우(OOM)와 네트워크 병목을 완벽히 회피했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,3,0&quot;&gt;엔터프라이즈급 보안 전략 (AWS Secrets Manager)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,3,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스 접속 정보나 AWS 환경 변수를 코드 저장소나 인스턴스에 하드코딩하지 않고, &lt;b data-index-in-node=&quot;50&quot; data-path-to-node=&quot;7,3,1,0,0&quot;&gt;AWS Secrets Manager&lt;/b&gt;를 통해 런타임에 동적으로 주입받아 보안을 유지했습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,4,0&quot;&gt;통합 모니터링 및 로깅 (AWS CloudWatch)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,4,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분산된 FastAPI 백엔드와 다수의 Celery 워커 노드에서 발생하는 모든 로그는 &lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;7,4,1,0,0&quot;&gt;AWS CloudWatch&lt;/b&gt;로 중앙 집중화하여 수집합니다.&lt;/li&gt;
&lt;li&gt;API 에러 추적뿐만 아니라, 멀티프로세싱 환경에서 치명적인 &lt;b data-index-in-node=&quot;34&quot; data-path-to-node=&quot;7,4,1,1,0&quot;&gt;OOM(Out of Memory) 발생 여부 및 메모리 사용량 지표&lt;/b&gt;를 실시간으로 모니터링하여 인프라 안정성을 확보했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-path-to-node=&quot;8&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p style=&quot;text-align: justify;&quot; data-path-to-node=&quot;8,0&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;8,0&quot;&gt;설계 의도 (Design Intent): &lt;br /&gt;서드파티 모니터링 툴 대신 CloudWatch를 선택한 이유&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;외부 툴(Prometheus, Grafana)은 강력한 시각화 기능을 제공하지만, 별도의 인스턴스를 띄우고 지표(Metric) 수집 서버를 유지보수해야 하는 운영 부담이 발생합니다. 시스템 인프라가 AWS 위에서 동작하고 있다면, AWS Native 서비스인 CloudWatch로 로깅 생태계를 통일하는 것이 권한 관리(IAM)와 알람 연동 측면에서 훨씬 효율적이고 안전한 아키텍처 설계라고 생각했습니다.&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>스프린트미션</category>
      <author>goodella</author>
      <guid isPermaLink="true">https://ahnella2026.tistory.com/18</guid>
      <comments>https://ahnella2026.tistory.com/18#entry18comment</comments>
      <pubDate>Mon, 29 Jun 2026 01:15:28 +0900</pubDate>
    </item>
    <item>
      <title>위클리 페이퍼 #15</title>
      <link>https://ahnella2026.tistory.com/17</link>
      <description>&lt;h2 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size26&quot;&gt;1. 딥러닝 모델을 ONNX, TensorRT 포맷으로 변환하는 이유&lt;/h2&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;PyTorch나 TensorFlow 같은 프레임워크는 '학습(Training)'에 최적화된 무거운 환경입니다. 이를 그대로 프로덕션환경에 올리는 것은 비효율적입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;ONNX (Open Neural Network Exchange):&lt;/b&gt; * &lt;b data-index-in-node=&quot;39&quot; data-path-to-node=&quot;5,0,0&quot;&gt;목적:&lt;/b&gt; 프레임워크 종속성 탈피.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PyTorch에서 학습한 모델을 C++, Go, Java 등 다양한 백엔드 환경에서 쉽게 서빙할 수 있도록 표준화된 포맷으로 변환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;TensorRT:&lt;/b&gt; * &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;5,1,0&quot;&gt;목적:&lt;/b&gt; NVIDIA GPU 환경에서의 극단적인 추론(Inference) 속도 최적화.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크의 레이어를 병합(Layer Fusion)하고, 하드웨어에 맞는 정밀도로 연산을 재구성하여 레이턴시를 최소화합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-path-to-node=&quot;6&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;6,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0&quot;&gt;설계 의도 (Design Intent): 지연 시간(Latency) 최소화와 프론트엔드 UX 개선&lt;/b&gt; 백엔드에서 AI 추론에 500ms가 걸린다면, 네트워크 왕복 시간까지 더해져 사용자는 최소 1초 이상의 지연을 겪습니다. 이는 프론트엔드 개발자가 복잡한 로딩 상태나 스켈레톤 UI를 강제로 구현하게 만드는 원인이 됩니다. 모델 경량화와 최적화 포맷 변환은 단순히 서버 리소스를 아끼는 것을 넘어, 즉각적인 반응성(Responsiveness)을 보장하여 전체적인 UX와 코드 복잡도를 개선하는 핵심 아키텍처 결정입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size26&quot;&gt;2. 양자화(Quantization) 기법: PTQ vs QAT&lt;/h2&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;양자화는 모델의 가중치(Weight)와 활성화 함수(Activation)의 데이터 타입(예: FP32)을 더 작은 크기(예: INT8)로 줄여 메모리 사용량과 연산 속도를 개선하는 기법입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;PTQ (Post-Training Quantization, 학습 후 양자화):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,1,0,0&quot;&gt;개념:&lt;/b&gt; 이미 학습이 완료된 모델의 가중치를 변환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,1,1,0&quot;&gt;장단점:&lt;/b&gt; 추가적인 학습 과정이 없어 도입이 매우 빠르고 리소스가 적게 듭니다. 하지만 데이터의 분포가 극단적일 경우 정확도손실이 발생할 위험이 큽니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;QAT (Quantization-Aware Training, 양자화 인지 학습):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0,0&quot;&gt;개념:&lt;/b&gt; 모델을 학습(또는 파인튜닝)할 때부터 양자화로 인한 오차를 시뮬레이션(Fake Quantization)하여 학습시킵니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,1,0&quot;&gt;장단점:&lt;/b&gt; 양자화 이후에도 원본 모델에 가까운 높은 정확도를 유지할 수 있습니다. 하지만 학습 시간이 오래 걸리고 구현이 상대적으로 복잡합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-path-to-node=&quot;10&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;10,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0&quot;&gt;설계 의도 (Design Intent): 엔지니어링 트레이드오프&lt;/b&gt; 여기서는 **'개발 속도 vs 시스템 정확도'**의 트레이드오프가 발생합니다. 초기 PoC단계나 오차가 UX에 치명적이지 않은 도메인이라면 PTQ를 선택하여 빠르게 배포하는 것이 맞습니다. 하지만 금융, 의료 등 1%의 정확도 하락이 치명적인 비즈니스 로직이라면 기술 부채를 감수하더라도 QAT를 파이프라인에 구축해야 합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size26&quot;&gt;3. 모델 경량화 후 실제 서비스 투입 전 검증 절차&lt;/h2&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;모델이 가벼워지고 빨라졌다고 해서 끝이 아닙니다. '빠르게 틀린 답'을 내놓는 모델은 서비스에 큰 위험을 줄 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;정확도(Accuracy) 및 엣지 케이스 검증:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순히 전체 Validation Set의 평균 정확도만 보지 마세요. 양자화 과정에서 특정 클래스나 희소한 입력값(Edge cases)에 대해 모델이 붕괴하지 않았는지 클래스별 재현율(Recall)과 정밀도(Precision)를 확인해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;프로덕션 환경 부하 테스트 (Load Testing &amp;amp; p99 Latency):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1건의 요청이 빠르다고 안심하면 안 됩니다. 초당 수백 건의 동시 요청(Concurrency)이 들어올 때의 병목 현상을 확인해야 합니다. 특히 평균 속도보다 p99 레이턴시(상위 1%의 가장 느린 응답 시간)가 프론트엔드 타임아웃(Timeout) 설정 기준을 넘지 않는지 검증하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot;&gt;Shadow Testing (섀도우 배포):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 프로덕션 트래픽을 기존 무거운 모델과 경량화된 모델 양쪽으로 동시에 흘려보냅니다. 사용자에게는 기존 모델의 결과를 반환하되, 백엔드에서는 두 모델의 결과값과 응답 속도를 비동기적으로 비교하여 모니터링합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>스프린트미션</category>
      <author>goodella</author>
      <guid isPermaLink="true">https://ahnella2026.tistory.com/17</guid>
      <comments>https://ahnella2026.tistory.com/17#entry17comment</comments>
      <pubDate>Sun, 21 Jun 2026 23:50:13 +0900</pubDate>
    </item>
    <item>
      <title>위클리페이퍼 #14</title>
      <link>https://ahnella2026.tistory.com/16</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;​ &lt;/p&gt;
&lt;h1&gt;Docker 이미지, Docker Compose, Kubernetes 개념 정리&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Docker 이미지와 컨테이너의 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker를 처음 접하면 이미지와 컨테이너의 차이가 헷갈릴 수 있다. 두 개념을 간단히 설명하면, &lt;b&gt;Docker 이미지는 컨테이너를 만들기 위한 설계도이고, 컨테이너는 이미지를 바탕으로 실제 실행된 인스턴스&lt;/b&gt;이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Docker 이미지란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 이미지는 애플리케이션을 실행하는 데 필요한 파일들을 하나로 묶어놓은 패키지이다. 이미지에는 다음과 같은 내용이 포함될 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제의 기본 환경&lt;/li&gt;
&lt;li&gt;애플리케이션 실행 파일&lt;/li&gt;
&lt;li&gt;라이브러리와 패키지&lt;/li&gt;
&lt;li&gt;환경 설정&lt;/li&gt;
&lt;li&gt;애플리케이션 실행 명령어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Python으로 만든 웹 애플리케이션을 실행하려면 Python 실행 환경, 필요한 라이브러리, 소스 코드 등이 필요하다. Docker 이미지는 이러한 요소를 하나의 패키지로 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지는 일반적으로 Dockerfile을 이용해 생성한다.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;FROM python:3.12

WORKDIR /app

COPY . /app

RUN pip install -r requirements.txt

CMD [&quot;python&quot;, &quot;app.py&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 Dockerfile을 빌드하면 애플리케이션 실행에 필요한 환경이 포함된 Docker 이미지가 만들어진다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;docker build -t my-python-app .
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Docker 컨테이너란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 컨테이너는 Docker 이미지를 실제로 실행한 상태이다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;docker run my-python-app
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 실행하면 my-python-app 이미지를 기반으로 컨테이너가 생성되고, 컨테이너 내부에서 애플리케이션이 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 이미지로 여러 개의 컨테이너를 만들 수도 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Docker 이미지
   ├── 컨테이너 1
   ├── 컨테이너 2
   └── 컨테이너 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 컨테이너는 동일한 이미지로 생성되더라도 서로 독립적으로 실행된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이미지와 컨테이너의 관계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지와 컨테이너의 관계는 프로그램 설치 파일과 실행 중인 프로그램의 관계로 생각할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분Docker 이미지Docker 컨테이너&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;td&gt;컨테이너를 만들기 위한 설계도&lt;/td&gt;
&lt;td&gt;이미지를 기반으로 실행된 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;상태&lt;/td&gt;
&lt;td&gt;정적인 파일&lt;/td&gt;
&lt;td&gt;실행 가능한 프로세스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;역할&lt;/td&gt;
&lt;td&gt;실행 환경과 애플리케이션 저장&lt;/td&gt;
&lt;td&gt;실제 애플리케이션 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비유&lt;/td&gt;
&lt;td&gt;프로그램 설치 파일&lt;/td&gt;
&lt;td&gt;실행 중인 프로그램&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주요 명령어&lt;/td&gt;
&lt;td&gt;docker build, docker pull&lt;/td&gt;
&lt;td&gt;docker run, docker stop&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이미지만 가지고 있다고 해서 애플리케이션이 실행되는 것은 아니다. 이미지를 바탕으로 컨테이너를 생성하고 실행해야 실제 서비스가 동작한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Docker Compose는 어떤 상황에서 유용한가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Compose는 &lt;b&gt;여러 개의 Docker 컨테이너를 하나의 설정 파일로 정의하고 함께 실행할 수 있도록 도와주는 도구&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 애플리케이션은 컨테이너 하나만으로 실행할 수 있지만, 실제 서비스에서는 여러 컨테이너가 함께 필요한 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 웹 서비스를 구성할 때 다음과 같은 요소가 필요할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;웹 애플리케이션 컨테이너
        &amp;darr;
데이터베이스 컨테이너
        &amp;darr;
Redis 컨테이너
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 컨테이너를 docker run 명령어로 하나씩 실행하려면 포트, 네트워크, 환경변수, 볼륨 등을 매번 직접 설정해야 한다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;docker run -d --name mysql \
  -e MYSQL_ROOT_PASSWORD=1234 \
  -p 3306:3306 \
  mysql:8

docker run -d --name redis \
  -p 6379:6379 \
  redis

docker run -d --name backend \
  -p 8080:8080 \
  my-backend
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너가 많아질수록 명령어가 길어지고 관리하기 어려워진다. Docker Compose를 사용하면 이러한 설정을 compose.yaml 파일 하나에 작성할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;services:
  backend:
    build: .
    ports:
      - &quot;8080:8080&quot;
    depends_on:
      - database
      - redis

  database:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: &quot;1234&quot;
    ports:
      - &quot;3306:3306&quot;

  redis:
    image: redis
    ports:
      - &quot;6379:6379&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 파일을 작성한 후 다음 명령어를 실행하면 여러 컨테이너를 한 번에 실행할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 중인 컨테이너들을 한 번에 종료하려면 다음 명령어를 사용한다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Docker Compose가 유용한 상황&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Compose는 다음과 같은 상황에서 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, 웹 서버, 데이터베이스, 캐시 서버처럼 여러 컨테이너를 함께 실행해야 할 때 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, 개발자마다 동일한 개발 환경을 구성해야 할 때 유용하다. 프로젝트의 Compose 파일을 공유하면 팀원들이 동일한 컨테이너 구성으로 개발 환경을 실행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, 복잡한 docker run 명령어를 반복해서 입력하지 않아도 된다. 포트, 볼륨, 네트워크, 환경변수 등의 설정을 파일로 관리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷째, 로컬 개발 및 테스트 환경을 빠르게 구성하고 제거할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Dockerfile과 Docker Compose의 차이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dockerfile과 Docker Compose는 경쟁 관계가 아니라 서로 다른 역할을 담당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dockerfile은 하나의 Docker 이미지를 어떻게 만들 것인지 정의하는 파일&lt;/b&gt;이다. 반면, &lt;b&gt;Docker Compose는 여러 컨테이너를 어떤 구성으로 실행할 것인지 정의하는 파일&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분DockerfileDocker Compose&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;Docker 이미지 생성&lt;/td&gt;
&lt;td&gt;여러 컨테이너 실행 및 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주요 내용&lt;/td&gt;
&lt;td&gt;파일 복사, 패키지 설치, 실행 명령어&lt;/td&gt;
&lt;td&gt;서비스, 포트, 환경변수, 볼륨, 네트워크&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주요 명령어&lt;/td&gt;
&lt;td&gt;docker build&lt;/td&gt;
&lt;td&gt;docker compose up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관리 대상&lt;/td&gt;
&lt;td&gt;이미지&lt;/td&gt;
&lt;td&gt;컨테이너 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;대표 파일명&lt;/td&gt;
&lt;td&gt;Dockerfile&lt;/td&gt;
&lt;td&gt;compose.yaml&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 Dockerfile과 Docker Compose는 함께 사용된다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;Dockerfile
   &amp;darr;
애플리케이션 이미지 생성
   &amp;darr;
Docker Compose
   &amp;darr;
애플리케이션, DB, Redis 컨테이너 함께 실행
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Compose 파일의 build: . 설정은 현재 위치의 Dockerfile을 이용해 이미지를 생성하라는 의미이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Kubernetes의 기본 개념&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes는 여러 서버에서 실행되는 수많은 컨테이너를 자동으로 배포하고 관리하기 위한 &lt;b&gt;컨테이너 오케스트레이션 플랫폼&lt;/b&gt;이다. 줄여서 K8s라고 부르기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 오케스트레이션은 여러 컨테이너의 배포, 확장, 복구, 네트워크 연결 등을 자동으로 관리하는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker만 사용해도 컨테이너를 실행할 수 있지만, 운영 환경에서 컨테이너가 많아지면 다음과 같은 문제가 발생할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너가 종료되었을 때 누가 다시 실행할 것인가?&lt;/li&gt;
&lt;li&gt;사용자가 증가하면 컨테이너 수를 어떻게 늘릴 것인가?&lt;/li&gt;
&lt;li&gt;여러 서버 중 어느 서버에 컨테이너를 배치할 것인가?&lt;/li&gt;
&lt;li&gt;업데이트할 때 서비스를 중단하지 않고 배포할 수 있는가?&lt;/li&gt;
&lt;li&gt;여러 컨테이너에 사용자의 요청을 어떻게 분산할 것인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes는 이러한 문제를 자동으로 처리한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Kubernetes의 주요 기능&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 자동 배포&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes는 사용자가 작성한 설정에 따라 컨테이너를 여러 서버에 자동으로 배치한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 자동 복구&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 중인 컨테이너에 문제가 발생하면 해당 컨테이너를 종료하고 새로운 컨테이너를 자동으로 생성한다. 서버에 장애가 발생한 경우에도 정상 서버에서 컨테이너를 다시 실행할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 자동 확장&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 요청이나 CPU 사용량이 증가하면 컨테이너 수를 늘리고, 사용량이 줄어들면 컨테이너 수를 줄일 수 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;사용량이 적을 때
컨테이너 1개

사용량이 많을 때
컨테이너 1
컨테이너 2
컨테이너 3
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 로드 밸런싱&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 컨테이너가 실행 중일 때 사용자의 요청이 특정 컨테이너에만 집중되지 않도록 요청을 분산한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 무중단 배포&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 컨테이너를 한 번에 종료하지 않고 새로운 버전의 컨테이너를 순차적으로 실행한다. 이를 통해 서비스 중단을 최소화하면서 새로운 버전을 배포할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Kubernetes의 기본 구성요소&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes를 이해할 때 자주 등장하는 기본 개념은 다음과 같다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Cluster&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes가 관리하는 전체 서버 집합이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Node&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클러스터에 포함된 개별 서버 또는 가상머신이다. 실제 컨테이너가 실행되는 작업 공간이라고 볼 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Pod&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes에서 컨테이너를 실행하는 가장 작은 배포 단위이다. 일반적으로 하나의 Pod 안에는 하나의 주요 컨테이너가 들어간다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;Kubernetes Cluster
   ├── Node 1
   │     ├── Pod 1
   │     └── Pod 2
   │
   └── Node 2
         ├── Pod 3
         └── Pod 4
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Deployment&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod를 몇 개 실행할지, 어떤 컨테이너 이미지를 사용할지 등을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같이 설정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;웹 애플리케이션 Pod를 항상 3개 유지한다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod 하나가 비정상 종료되어 2개만 남으면 Kubernetes가 새로운 Pod를 생성하여 다시 3개를 유지한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Service&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod에 접근할 수 있는 고정된 네트워크 주소를 제공하고, 여러 Pod로 요청을 분산한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod는 삭제되고 다시 생성될 때 주소가 바뀔 수 있다. Service는 변경되는 Pod를 대신하여 안정적인 접근 지점을 제공한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Kubernetes와 Docker의 관계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker와 Kubernetes는 서로 대체하는 기술이라기보다 담당하는 범위가 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker는 애플리케이션을 이미지로 만들고 컨테이너 형태로 실행하는 데 사용된다. Kubernetes는 이렇게 만들어진 컨테이너를 여러 서버에서 배포하고 관리하는 데 사용된다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Dockerfile 작성
      &amp;darr;
Docker 이미지 생성
      &amp;darr;
컨테이너 실행 가능
      &amp;darr;
Kubernetes가 여러 컨테이너를 배포하고 관리
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할을 비교하면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분DockerKubernetes&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;주요 목적&lt;/td&gt;
&lt;td&gt;이미지 생성 및 컨테이너 실행&lt;/td&gt;
&lt;td&gt;컨테이너 배포 및 운영 자동화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관리 범위&lt;/td&gt;
&lt;td&gt;주로 개별 서버의 컨테이너&lt;/td&gt;
&lt;td&gt;여러 서버와 다수의 컨테이너&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장애 복구&lt;/td&gt;
&lt;td&gt;사용자가 직접 처리할 수 있음&lt;/td&gt;
&lt;td&gt;컨테이너를 자동으로 재생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;확장&lt;/td&gt;
&lt;td&gt;사용자가 직접 컨테이너 추가&lt;/td&gt;
&lt;td&gt;설정이나 사용량에 따라 자동 확장 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;로드 밸런싱&lt;/td&gt;
&lt;td&gt;별도 설정 필요&lt;/td&gt;
&lt;td&gt;Service 등을 통해 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;적합한 환경&lt;/td&gt;
&lt;td&gt;개발, 테스트, 소규모 서비스&lt;/td&gt;
&lt;td&gt;대규모 운영 및 분산 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 Kubernetes가 Docker 자체를 반드시 요구하는 것은 아니다. Kubernetes는 컨테이너 실행을 위해 컨테이너 런타임을 사용하며, 대표적으로 containerd나 CRI-O 등이 사용된다. 다만 Docker로 만든 이미지는 표준 컨테이너 이미지 형식을 사용하기 때문에 Kubernetes 환경에서도 사용할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Docker Compose와 Kubernetes의 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Compose와 Kubernetes 모두 여러 컨테이너를 관리할 수 있지만 사용 목적과 규모에 차이가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Compose는 주로 하나의 컴퓨터에서 여러 컨테이너를 실행하는 개발 및 테스트 환경에 적합하다. 반면 Kubernetes는 여러 서버에서 다수의 컨테이너를 안정적으로 운영해야 하는 환경에 적합하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분Docker ComposeKubernetes&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;주요 용도&lt;/td&gt;
&lt;td&gt;로컬 개발 및 테스트&lt;/td&gt;
&lt;td&gt;실제 서비스 운영&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관리 범위&lt;/td&gt;
&lt;td&gt;주로 하나의 서버&lt;/td&gt;
&lt;td&gt;여러 서버로 구성된 클러스터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;설정 난이도&lt;/td&gt;
&lt;td&gt;비교적 간단함&lt;/td&gt;
&lt;td&gt;상대적으로 복잡함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자동 복구&lt;/td&gt;
&lt;td&gt;제한적&lt;/td&gt;
&lt;td&gt;지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자동 확장&lt;/td&gt;
&lt;td&gt;기본적으로 제공하지 않음&lt;/td&gt;
&lt;td&gt;지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;무중단 배포&lt;/td&gt;
&lt;td&gt;제한적&lt;/td&gt;
&lt;td&gt;지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;적합한 규모&lt;/td&gt;
&lt;td&gt;소규모 구성&lt;/td&gt;
&lt;td&gt;중대규모 분산 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 개인 프로젝트에서 백엔드, MySQL, Redis를 함께 실행한다면 Docker Compose만으로도 충분할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 사용자가 많은 실제 서비스를 여러 서버에서 운영하고, 장애 복구와 자동 확장이 필요하다면 Kubernetes를 사용하는 것이 적합하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 이미지는 애플리케이션 실행 환경을 저장한 설계도이고, Docker 컨테이너는 이미지를 바탕으로 실제 실행된 환경이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dockerfile은 Docker 이미지를 만드는 방법을 정의하며, Docker Compose는 여러 컨테이너의 실행 구성을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes는 다수의 컨테이너를 여러 서버에 배포하고, 장애 복구, 확장, 로드 밸런싱, 무중단 배포 등을 자동으로 수행하는 플랫폼이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 관계를 정리하면 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Dockerfile
   &amp;darr;
Docker 이미지 생성
   &amp;darr;
Docker 컨테이너 실행
   &amp;darr;
Docker Compose
여러 컨테이너를 간편하게 구성

또는

Docker 이미지
   &amp;darr;
Kubernetes
여러 서버에서 컨테이너를 자동 배포&amp;middot;확장&amp;middot;복구
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 Docker는 컨테이너를 만들고 실행하기 위한 기술이고, Kubernetes는 만들어진 컨테이너를 대규모 환경에서 효율적으로 운영하기 위한 기술이라고 정리할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>스프린트미션</category>
      <author>goodella</author>
      <guid isPermaLink="true">https://ahnella2026.tistory.com/16</guid>
      <comments>https://ahnella2026.tistory.com/16#entry16comment</comments>
      <pubDate>Mon, 15 Jun 2026 04:03:42 +0900</pubDate>
    </item>
    <item>
      <title>위클리 페이퍼 #12</title>
      <link>https://ahnella2026.tistory.com/15</link>
      <description>&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Q1. LLM이 생성한 텍스트에서 할루시네이션이란 무엇이고, 왜 문제가 되나요?&lt;/b&gt;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.&amp;nbsp;LLM&amp;nbsp;할루시네이션 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;(1)&amp;nbsp;정의&lt;/b&gt; &lt;br /&gt;할루시네이션은&amp;nbsp;LLM이&amp;nbsp;사실과&amp;nbsp;다르거나&amp;nbsp;근거가&amp;nbsp;불확실한&amp;nbsp;내용을&amp;nbsp;그럴듯하게&amp;nbsp;생성하는&amp;nbsp;현상입니다.&amp;nbsp;LLM은&amp;nbsp;기본적으로&amp;nbsp;다음에&amp;nbsp;올&amp;nbsp;가능성이&amp;nbsp;높은&amp;nbsp;단어를&amp;nbsp;예측해&amp;nbsp;문장을&amp;nbsp;생성하기&amp;nbsp;때문에,&amp;nbsp;문장이&amp;nbsp;자연스럽다고&amp;nbsp;해서&amp;nbsp;그&amp;nbsp;내용이&amp;nbsp;반드시&amp;nbsp;사실이라는&amp;nbsp;뜻은&amp;nbsp;아닙니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2)&amp;nbsp;왜&amp;nbsp;발생하는가? &lt;/b&gt;&lt;br /&gt;첫째,&amp;nbsp;LLM은&amp;nbsp;기본적으로&amp;nbsp;확률&amp;nbsp;기반&amp;nbsp;생성&amp;nbsp;모델입니다.&amp;nbsp;모델은&amp;nbsp;&amp;ldquo;진실&amp;rdquo;을&amp;nbsp;직접&amp;nbsp;판단한다기보다,&amp;nbsp;학습&amp;nbsp;데이터에서&amp;nbsp;본&amp;nbsp;패턴을&amp;nbsp;바탕으로&amp;nbsp;가장&amp;nbsp;자연스러운&amp;nbsp;답변을&amp;nbsp;생성합니다. &lt;br /&gt;&lt;br /&gt;둘째,&amp;nbsp;훈련&amp;nbsp;데이터의&amp;nbsp;한계가&amp;nbsp;있습니다.&amp;nbsp;훈련&amp;nbsp;데이터가&amp;nbsp;오래되었거나,&amp;nbsp;부정확하거나,&amp;nbsp;편향되어&amp;nbsp;있으면&amp;nbsp;모델도&amp;nbsp;잘못된&amp;nbsp;내용을&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;셋째,&amp;nbsp;지식&amp;nbsp;공백이&amp;nbsp;있습니다.&amp;nbsp;모델이&amp;nbsp;모르는&amp;nbsp;질문을&amp;nbsp;받았을&amp;nbsp;때&amp;nbsp;&amp;ldquo;모른다&amp;rdquo;고&amp;nbsp;말하기보다&amp;nbsp;그럴듯한&amp;nbsp;답을&amp;nbsp;만들어내는&amp;nbsp;경우가&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;넷째,&amp;nbsp;출처와&amp;nbsp;근거를&amp;nbsp;직접&amp;nbsp;검증하지&amp;nbsp;못하는&amp;nbsp;한계가&amp;nbsp;있습니다.&amp;nbsp;특히&amp;nbsp;기본&amp;nbsp;LLM은&amp;nbsp;외부&amp;nbsp;문서를&amp;nbsp;실시간으로&amp;nbsp;확인하지&amp;nbsp;않으면&amp;nbsp;최신&amp;nbsp;사실이나&amp;nbsp;구체적&amp;nbsp;수치를&amp;nbsp;검증하기&amp;nbsp;어렵습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;(3)&amp;nbsp;왜&amp;nbsp;문제가&amp;nbsp;되는가? &lt;/b&gt;&lt;br /&gt;할루시네이션은&amp;nbsp;단순한&amp;nbsp;오류를&amp;nbsp;넘어&amp;nbsp;실제&amp;nbsp;피해로&amp;nbsp;이어질&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;의료,&amp;nbsp;법률,&amp;nbsp;금융처럼&amp;nbsp;정확성이&amp;nbsp;중요한&amp;nbsp;분야에서는&amp;nbsp;잘못된&amp;nbsp;답변이&amp;nbsp;의사결정에&amp;nbsp;영향을&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;기업&amp;nbsp;서비스에서는&amp;nbsp;고객에게&amp;nbsp;잘못된&amp;nbsp;정보를&amp;nbsp;제공해&amp;nbsp;신뢰도와&amp;nbsp;법적&amp;nbsp;책임&amp;nbsp;문제가&amp;nbsp;생길&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;교육,&amp;nbsp;언론,&amp;nbsp;공공&amp;nbsp;영역에서는&amp;nbsp;잘못된&amp;nbsp;정보가&amp;nbsp;확산되는&amp;nbsp;문제도&amp;nbsp;발생합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;(4)&amp;nbsp;실제&amp;nbsp;예시 &lt;/b&gt;&lt;br /&gt;- 질문: &lt;br /&gt;삼성전자의&amp;nbsp;2030년&amp;nbsp;매출은? &lt;br /&gt;&lt;br /&gt;- LLM의 잘못된 응답 예시: &lt;br /&gt;삼성전자는&amp;nbsp;2030년에&amp;nbsp;500조&amp;nbsp;원의&amp;nbsp;매출을&amp;nbsp;기록했다. &lt;br /&gt;&lt;br /&gt;문제는&amp;nbsp;2030년은&amp;nbsp;아직&amp;nbsp;확정된&amp;nbsp;과거&amp;nbsp;데이터가&amp;nbsp;아니므로,&amp;nbsp;이런&amp;nbsp;답변은&amp;nbsp;미래&amp;nbsp;예측을&amp;nbsp;사실처럼&amp;nbsp;말한&amp;nbsp;할루시네이션에&amp;nbsp;가깝습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;여러&amp;nbsp;LLM&amp;nbsp;서비스들은&amp;nbsp;할루시네이션을&amp;nbsp;어떻게&amp;nbsp;줄이려&amp;nbsp;하나? &lt;/b&gt;&lt;br /&gt;&lt;b&gt;(1)&amp;nbsp;RAG &lt;/b&gt;&lt;br /&gt;RAG는&amp;nbsp;Retrieval-Augmented&amp;nbsp;Generation의&amp;nbsp;약자입니다.&amp;nbsp;LLM이&amp;nbsp;자체&amp;nbsp;기억만으로&amp;nbsp;답하지&amp;nbsp;않고,&amp;nbsp;외부&amp;nbsp;문서나&amp;nbsp;데이터베이스를&amp;nbsp;검색한&amp;nbsp;뒤&amp;nbsp;그&amp;nbsp;근거를&amp;nbsp;바탕으로&amp;nbsp;답변하는&amp;nbsp;방식입니다. &lt;br /&gt;&lt;br /&gt;구조: &lt;br /&gt;질문&amp;nbsp;&amp;rarr;&amp;nbsp;관련&amp;nbsp;문서&amp;nbsp;검색&amp;nbsp;&amp;rarr;&amp;nbsp;문서&amp;nbsp;내용&amp;nbsp;참고&amp;nbsp;&amp;rarr;&amp;nbsp;LLM&amp;nbsp;답변&amp;nbsp;생성 &lt;br /&gt;&lt;br /&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1307&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/56wmU/dJMcagFknNL/GkJ5KAPdISvGFjygb6lBuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/56wmU/dJMcagFknNL/GkJ5KAPdISvGFjygb6lBuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/56wmU/dJMcagFknNL/GkJ5KAPdISvGFjygb6lBuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F56wmU%2FdJMcagFknNL%2FGkJ5KAPdISvGFjygb6lBuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1307&quot; height=&quot;778&quot; data-origin-width=&quot;1307&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;이&amp;nbsp;그림은&amp;nbsp;RAG의&amp;nbsp;기본&amp;nbsp;구조를&amp;nbsp;보여줍니다.&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;먼저 사용자가 1) Prompt + Query를 입력하면, 시스템은 그 질문을 바탕으로 2) 관련 정보를 검색합니다. 그다음 검색된 결과는 3) 관련 컨텍스트 정보로 정리되어 LLM에 전달되고, 최종적으로 4) Prompt + Query + Enhanced Context가 된 입력을 바탕으로 LLM이 5) Generated Text Response를 생성합니다. 즉, LLM이 내부 기억만으로 답하는 것이 아니라 외부 지식 소스에서 찾은 근거를 함께 활용하므로, 더 정확하고 근거 있는 응답을 만들 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2)&amp;nbsp;Grounding &lt;/b&gt;&lt;br /&gt;Grounding은&amp;nbsp;모델의&amp;nbsp;답변을&amp;nbsp;특정&amp;nbsp;문서,&amp;nbsp;검색&amp;nbsp;결과,&amp;nbsp;데이터베이스,&amp;nbsp;기업&amp;nbsp;내부&amp;nbsp;자료&amp;nbsp;등에&amp;nbsp;연결하는&amp;nbsp;방식입니다.&amp;nbsp;즉,&amp;nbsp;&amp;ldquo;모델이&amp;nbsp;그냥&amp;nbsp;말하는&amp;nbsp;것&amp;rdquo;이&amp;nbsp;아니라&amp;nbsp;&amp;ldquo;어떤&amp;nbsp;근거를&amp;nbsp;바탕으로&amp;nbsp;말하는지&amp;rdquo;를&amp;nbsp;명확히&amp;nbsp;하려는&amp;nbsp;접근입니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;기업용&amp;nbsp;챗봇은&amp;nbsp;사내&amp;nbsp;매뉴얼,&amp;nbsp;제품&amp;nbsp;문서,&amp;nbsp;FAQ를&amp;nbsp;기반으로만&amp;nbsp;답하도록&amp;nbsp;설계할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(3)&amp;nbsp;Tool&amp;nbsp;use &lt;/b&gt;&lt;br /&gt;최근&amp;nbsp;LLM&amp;nbsp;서비스들은&amp;nbsp;검색,&amp;nbsp;계산기,&amp;nbsp;코드&amp;nbsp;실행기,&amp;nbsp;데이터베이스&amp;nbsp;조회&amp;nbsp;같은&amp;nbsp;도구를&amp;nbsp;함께&amp;nbsp;사용합니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;계산&amp;nbsp;문제는&amp;nbsp;모델이&amp;nbsp;암산으로&amp;nbsp;답하지&amp;nbsp;않고&amp;nbsp;계산&amp;nbsp;도구를&amp;nbsp;사용하게&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;최신&amp;nbsp;정보가&amp;nbsp;필요한&amp;nbsp;질문은&amp;nbsp;검색&amp;nbsp;도구를&amp;nbsp;사용해&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(4)&amp;nbsp;RLHF와&amp;nbsp;안전&amp;nbsp;학습 &lt;/b&gt;&lt;br /&gt;RLHF는&amp;nbsp;Reinforcement&amp;nbsp;Learning&amp;nbsp;from&amp;nbsp;Human&amp;nbsp;Feedback의&amp;nbsp;약자입니다.&amp;nbsp;사람이&amp;nbsp;좋은&amp;nbsp;답변과&amp;nbsp;나쁜&amp;nbsp;답변을&amp;nbsp;평가하고,&amp;nbsp;그&amp;nbsp;피드백을&amp;nbsp;바탕으로&amp;nbsp;모델이&amp;nbsp;더&amp;nbsp;유용하고&amp;nbsp;안전한&amp;nbsp;답변을&amp;nbsp;하도록&amp;nbsp;학습시키는&amp;nbsp;방식입니다. &lt;br /&gt;&lt;br /&gt;다만&amp;nbsp;RLHF만으로&amp;nbsp;할루시네이션을&amp;nbsp;완전히&amp;nbsp;없앨&amp;nbsp;수는&amp;nbsp;없습니다.&amp;nbsp;그래서&amp;nbsp;RAG,&amp;nbsp;검색,&amp;nbsp;출처&amp;nbsp;인용,&amp;nbsp;검증&amp;nbsp;모델&amp;nbsp;등을&amp;nbsp;함께&amp;nbsp;사용합니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(5)&amp;nbsp;답변&amp;nbsp;검증과&amp;nbsp;출처&amp;nbsp;인용 &lt;/b&gt;&lt;br /&gt;일부&amp;nbsp;서비스는&amp;nbsp;답변&amp;nbsp;뒤에&amp;nbsp;참고&amp;nbsp;문서나&amp;nbsp;링크를&amp;nbsp;함께&amp;nbsp;제공합니다.&amp;nbsp;또는&amp;nbsp;모델이&amp;nbsp;생성한&amp;nbsp;답변을&amp;nbsp;별도의&amp;nbsp;검증&amp;nbsp;단계에서&amp;nbsp;다시&amp;nbsp;확인하는&amp;nbsp;방식도&amp;nbsp;사용합니다. &lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;출처가&amp;nbsp;표시된다고&amp;nbsp;해서&amp;nbsp;항상&amp;nbsp;완벽한&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;모델이&amp;nbsp;출처를&amp;nbsp;잘못&amp;nbsp;해석하거나,&amp;nbsp;출처와&amp;nbsp;맞지&amp;nbsp;않는&amp;nbsp;결론을&amp;nbsp;낼&amp;nbsp;수도&amp;nbsp;있기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Q2.&amp;nbsp;모델&amp;nbsp;크기를&amp;nbsp;키우는&amp;nbsp;것만으로는&amp;nbsp;성능이&amp;nbsp;일정&amp;nbsp;시점&amp;nbsp;이후&amp;nbsp;둔화되는&amp;nbsp;이유는? &lt;/b&gt;&lt;br /&gt;&lt;b&gt;1. 모델 크기와 성능은 비례하지 않음&amp;nbsp;&lt;/b&gt;&lt;br /&gt;LLM은&amp;nbsp;일반적으로&amp;nbsp;모델&amp;nbsp;크기,&amp;nbsp;데이터&amp;nbsp;양,&amp;nbsp;연산량이&amp;nbsp;증가하면&amp;nbsp;성능이&amp;nbsp;좋아지는&amp;nbsp;경향이&amp;nbsp;있습니다.&amp;nbsp;이를&amp;nbsp;scaling&amp;nbsp;law라고&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;어느&amp;nbsp;시점부터는&amp;nbsp;모델을&amp;nbsp;더&amp;nbsp;크게&amp;nbsp;만들어도&amp;nbsp;성능&amp;nbsp;향상&amp;nbsp;폭이&amp;nbsp;줄어듭니다.&amp;nbsp;즉,&amp;nbsp;비용은&amp;nbsp;크게&amp;nbsp;증가하지만&amp;nbsp;성능&amp;nbsp;개선은&amp;nbsp;점점&amp;nbsp;작아지는&amp;nbsp;수확&amp;nbsp;체감이&amp;nbsp;발생합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;주요&amp;nbsp;이유 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;(1)&amp;nbsp;고품질&amp;nbsp;데이터의&amp;nbsp;한계&lt;/b&gt; &lt;br /&gt;모델이&amp;nbsp;커질수록&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;고품질&amp;nbsp;데이터가&amp;nbsp;필요합니다.&amp;nbsp;하지만&amp;nbsp;인터넷에&amp;nbsp;있는&amp;nbsp;모든&amp;nbsp;데이터가&amp;nbsp;좋은&amp;nbsp;학습&amp;nbsp;데이터는&amp;nbsp;아닙니다.&amp;nbsp;중복,&amp;nbsp;오류,&amp;nbsp;편향,&amp;nbsp;저품질&amp;nbsp;텍스트가&amp;nbsp;많기&amp;nbsp;때문에&amp;nbsp;단순히&amp;nbsp;데이터를&amp;nbsp;많이&amp;nbsp;넣는다고&amp;nbsp;성능이&amp;nbsp;계속&amp;nbsp;좋아지지는&amp;nbsp;않습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2)&amp;nbsp;연산&amp;nbsp;비용의&amp;nbsp;급증 &lt;/b&gt;&lt;br /&gt;모델이 커지면 학습과 추론 비용이 크게 증가합니다. 더 많은 GPU, 전력, 메모리, 시간이 필요합니다. 따라서 실무에서는 성능이 조금 더 좋아지는 것보다 비용 대비 효율이 더 중요해집니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;(3)&amp;nbsp;데이터와&amp;nbsp;모델&amp;nbsp;크기의&amp;nbsp;균형&amp;nbsp;문제 &lt;/b&gt;&lt;br /&gt;Chinchilla&amp;nbsp;연구에서는&amp;nbsp;모델을&amp;nbsp;무조건&amp;nbsp;크게&amp;nbsp;만드는&amp;nbsp;것보다,&amp;nbsp;모델&amp;nbsp;크기와&amp;nbsp;학습&amp;nbsp;토큰&amp;nbsp;수의&amp;nbsp;균형이&amp;nbsp;중요하다고&amp;nbsp;설명했습니다.&amp;nbsp;즉,&amp;nbsp;큰&amp;nbsp;모델을&amp;nbsp;적은&amp;nbsp;데이터로&amp;nbsp;학습시키는&amp;nbsp;것보다,&amp;nbsp;적절한&amp;nbsp;크기의&amp;nbsp;모델을&amp;nbsp;충분한&amp;nbsp;데이터로&amp;nbsp;학습시키는&amp;nbsp;것이&amp;nbsp;더&amp;nbsp;효율적일&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(4)&amp;nbsp;특정&amp;nbsp;능력은&amp;nbsp;크기만으로&amp;nbsp;해결되지&amp;nbsp;않음 &lt;/b&gt;&lt;br /&gt;논리&amp;nbsp;추론,&amp;nbsp;최신&amp;nbsp;정보&amp;nbsp;반영,&amp;nbsp;사실&amp;nbsp;검증,&amp;nbsp;긴&amp;nbsp;문맥&amp;nbsp;유지,&amp;nbsp;도메인&amp;nbsp;전문성은&amp;nbsp;모델&amp;nbsp;크기만으로&amp;nbsp;완전히&amp;nbsp;해결되지&amp;nbsp;않습니다.&amp;nbsp;그래서&amp;nbsp;최근에는&amp;nbsp;단순히&amp;nbsp;모델을&amp;nbsp;키우는&amp;nbsp;것보다&amp;nbsp;다음&amp;nbsp;접근이&amp;nbsp;함께&amp;nbsp;사용됩니다. &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;모델&amp;nbsp;구조&amp;nbsp;개선. &lt;br /&gt;-&amp;nbsp;고품질&amp;nbsp;데이터&amp;nbsp;정제. &lt;br /&gt;-&amp;nbsp;RAG. &lt;br /&gt;-&amp;nbsp;Tool&amp;nbsp;use(검색,&amp;nbsp;계산기,&amp;nbsp;코드&amp;nbsp;실행기&amp;nbsp;같은&amp;nbsp;외부&amp;nbsp;도구를&amp;nbsp;모델이&amp;nbsp;함께&amp;nbsp;사용하는&amp;nbsp;방식). &lt;br /&gt;-&amp;nbsp;Instruction&amp;nbsp;tuning(자연어&amp;nbsp;지시를&amp;nbsp;잘&amp;nbsp;따르도록&amp;nbsp;예시&amp;nbsp;기반으로&amp;nbsp;추가&amp;nbsp;학습하는&amp;nbsp;방식). &lt;br /&gt;-&amp;nbsp;PEFT(Parameter-Efficient&amp;nbsp;Fine-Tuning,&amp;nbsp;전체&amp;nbsp;모델이&amp;nbsp;아니라&amp;nbsp;일부&amp;nbsp;파라미터만&amp;nbsp;효율적으로&amp;nbsp;미세조정하는&amp;nbsp;방법). &lt;br /&gt;-&amp;nbsp;MoE(Mixture&amp;nbsp;of&amp;nbsp;Experts,&amp;nbsp;입력에&amp;nbsp;따라&amp;nbsp;일부&amp;nbsp;전문가&amp;nbsp;네트워크만&amp;nbsp;선택적으로&amp;nbsp;활성화하는&amp;nbsp;구조). &lt;br /&gt;-&amp;nbsp;긴&amp;nbsp;컨텍스트&amp;nbsp;처리&amp;nbsp;개선. &lt;br /&gt;- 추론 시 계산량을 늘리는 test-time compute 계열 접근( AI가 단순히 패턴을 매칭하는 것을 넘어, 문제의 난이도에 따라 스스로 더 많은 연산을 수행하며 깊게 사고하게 만드는 기술)&lt;/h2&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;모델&amp;nbsp;크기는&amp;nbsp;중요하지만,&amp;nbsp;성능을&amp;nbsp;결정하는&amp;nbsp;유일한&amp;nbsp;요소는&amp;nbsp;아닙니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;LLM&amp;nbsp;성능은&amp;nbsp;모델&amp;nbsp;크기,&amp;nbsp;데이터&amp;nbsp;품질,&amp;nbsp;학습&amp;nbsp;방식,&amp;nbsp;추론&amp;nbsp;전략,&amp;nbsp;외부&amp;nbsp;도구&amp;nbsp;활용의&amp;nbsp;조합으로&amp;nbsp;결정됩니다. &lt;/span&gt;&lt;/blockquote&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;b&gt;Q3.&amp;nbsp;PEFT가&amp;nbsp;필요한&amp;nbsp;이유는&amp;nbsp;무엇이며,&amp;nbsp;어떤&amp;nbsp;상황에서&amp;nbsp;특히&amp;nbsp;효과적인가? &lt;/b&gt;&lt;br /&gt;&lt;b&gt;1.&amp;nbsp;PEFT의&amp;nbsp;정의 &lt;/b&gt;&lt;br /&gt;PEFT는&amp;nbsp;Parameter-Efficient&amp;nbsp;Fine-Tuning의&amp;nbsp;약자입니다.&amp;nbsp;대규모&amp;nbsp;모델&amp;nbsp;전체를&amp;nbsp;다시&amp;nbsp;학습하지&amp;nbsp;않고,&amp;nbsp;일부&amp;nbsp;파라미터만&amp;nbsp;조정해&amp;nbsp;특정&amp;nbsp;작업에&amp;nbsp;맞게&amp;nbsp;모델을&amp;nbsp;튜닝하는&amp;nbsp;방법입니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;왜&amp;nbsp;필요한가? &lt;/b&gt;&lt;br /&gt;LLM&amp;nbsp;전체를&amp;nbsp;fine-tuning하려면&amp;nbsp;막대한&amp;nbsp;GPU&amp;nbsp;메모리와&amp;nbsp;학습&amp;nbsp;시간이&amp;nbsp;필요합니다.&amp;nbsp;또한&amp;nbsp;태스크마다&amp;nbsp;모델&amp;nbsp;전체를&amp;nbsp;따로&amp;nbsp;저장하면&amp;nbsp;저장&amp;nbsp;비용도&amp;nbsp;커집니다.&amp;nbsp;PEFT는&amp;nbsp;이런&amp;nbsp;문제를&amp;nbsp;줄이기&amp;nbsp;위해&amp;nbsp;등장했습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&amp;nbsp;PEFT의&amp;nbsp;장점 &lt;/b&gt;&lt;br /&gt;-적은 GPU 메모리 사용. &lt;br /&gt;-빠른 학습. &lt;br /&gt;-낮은 비용.&lt;br /&gt;-여러 태스크에 쉽게 적용. &lt;br /&gt;-기존 모델의 일반 능력을 비교적 잘 유지할 수 있음. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;7B,&amp;nbsp;13B&amp;nbsp;이상의&amp;nbsp;모델을&amp;nbsp;개인이나&amp;nbsp;소규모&amp;nbsp;팀이&amp;nbsp;전체&amp;nbsp;fine-tuning하기는&amp;nbsp;어렵습니다.&amp;nbsp;하지만&amp;nbsp;LoRA나&amp;nbsp;QLoRA를&amp;nbsp;사용하면&amp;nbsp;훨씬&amp;nbsp;적은&amp;nbsp;자원으로&amp;nbsp;도메인&amp;nbsp;튜닝이&amp;nbsp;가능합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&amp;nbsp;대표&amp;nbsp;기법 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;(1)&amp;nbsp;LoRA&lt;/b&gt; &lt;br /&gt;LoRA는&amp;nbsp;기존&amp;nbsp;가중치를&amp;nbsp;직접&amp;nbsp;크게&amp;nbsp;수정하지&amp;nbsp;않고,&amp;nbsp;작은&amp;nbsp;저랭크&amp;nbsp;행렬을&amp;nbsp;추가로&amp;nbsp;학습하는&amp;nbsp;방식입니다. &lt;/h2&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;참고)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: color(srgb 0.980392 0.972549 0.960784); color: #27251e; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;행렬의 랭크(Rank):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;행렬에서 서로 독립적인 행이나 열의 최대 개수를 의미합니다.&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;저랭크(Low-rank):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;원래 행렬이 가진 차원(가로/세로 길이)에 비해, 실질적으로 정보를 담고 있는 핵심 차원(Rank)이 현저히 낮은 상태를 말합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;b&gt;(2)&amp;nbsp;QLoRA &lt;/b&gt;&lt;br /&gt;QLoRA는&amp;nbsp;모델을&amp;nbsp;4-bit로&amp;nbsp;양자화한&amp;nbsp;상태에서&amp;nbsp;LoRA&amp;nbsp;방식으로&amp;nbsp;튜닝하는&amp;nbsp;기법입니다.&amp;nbsp;메모리&amp;nbsp;사용량을&amp;nbsp;크게&amp;nbsp;줄이면서도&amp;nbsp;비교적&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;유지할&amp;nbsp;수&amp;nbsp;있어&amp;nbsp;많이&amp;nbsp;사용됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;(3)&amp;nbsp;Adapter &lt;/b&gt;&lt;br /&gt;Adapter는&amp;nbsp;모델&amp;nbsp;내부에&amp;nbsp;작은&amp;nbsp;추가&amp;nbsp;모듈을&amp;nbsp;삽입하고,&amp;nbsp;그&amp;nbsp;모듈만&amp;nbsp;학습하는&amp;nbsp;방식입니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(4)&amp;nbsp;Prompt&amp;nbsp;Tuning&amp;nbsp;/&amp;nbsp;Prefix&amp;nbsp;Tuning &lt;/b&gt;&lt;br /&gt;모델&amp;nbsp;가중치는&amp;nbsp;고정하고,&amp;nbsp;입력&amp;nbsp;앞에&amp;nbsp;붙는&amp;nbsp;학습&amp;nbsp;가능한&amp;nbsp;프롬프트나&amp;nbsp;prefix만&amp;nbsp;조정하는&amp;nbsp;방식입니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.&amp;nbsp;PEFT가&amp;nbsp;특히&amp;nbsp;효과적인&amp;nbsp;상황 &lt;/b&gt;&lt;br /&gt;PEFT는&amp;nbsp;다음&amp;nbsp;상황에서&amp;nbsp;특히&amp;nbsp;효과적입니다. &lt;br /&gt;&lt;br /&gt;-GPU 자원이 부족한 개인 연구자나 소규모 팀. &lt;br /&gt;-법률, 의료, 금융 등 특정 도메인에 맞게 모델을 조정할 때.&lt;br /&gt;-여러 고객사나 여러 태스크별 모델을 운영해야 할 때.&lt;br /&gt;-빠른 실험과 프로토타이핑이 필요할 때. &lt;br /&gt;-기존 대형 모델의 일반 능력을 유지하면서 특정 업무 능력만 보강하고 싶을 때. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;6.&amp;nbsp;예시 &lt;/b&gt;&lt;br /&gt;목표: 의료 상담과, 의료 용어에 익숙한 LLM 만들기. &lt;br /&gt;&lt;br /&gt;Full&amp;nbsp;fine-tuning을&amp;nbsp;하면&amp;nbsp;모델&amp;nbsp;전체를&amp;nbsp;다시&amp;nbsp;학습해야&amp;nbsp;하므로&amp;nbsp;비용이&amp;nbsp;큽니다.&amp;nbsp;PEFT를&amp;nbsp;사용하면&amp;nbsp;기존&amp;nbsp;LLM은&amp;nbsp;대부분&amp;nbsp;그대로&amp;nbsp;두고,&amp;nbsp;의료&amp;nbsp;상담&amp;nbsp;데이터에&amp;nbsp;맞는&amp;nbsp;작은&amp;nbsp;추가&amp;nbsp;파라미터만&amp;nbsp;학습할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;따라서&amp;nbsp;적은&amp;nbsp;비용으로&amp;nbsp;특정&amp;nbsp;도메인에&amp;nbsp;맞춘&amp;nbsp;모델을&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7.비교&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Full Fine-tuning&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PEFT&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;b&gt;학습 범위&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;전체 파라미터 (All)&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;일부 파라미터 (Small)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;b&gt;자원 소모&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;매우 큼 (GPU/시간)&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;매우 적음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;b&gt;저장 비용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;태스크마다 전체 모델 복사&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;베이스 모델 + 작은 어댑터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;b&gt;핵심 장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;최대 성능 잠재력&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;효율성, 빠른 배포, 가벼움&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>스프린트미션</category>
      <author>goodella</author>
      <guid isPermaLink="true">https://ahnella2026.tistory.com/15</guid>
      <comments>https://ahnella2026.tistory.com/15#entry15comment</comments>
      <pubDate>Mon, 27 Apr 2026 02:31:21 +0900</pubDate>
    </item>
    <item>
      <title>위클리 페이퍼 #11</title>
      <link>https://ahnella2026.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요 이번에는 위클리페이퍼 11 주제에 대해 정리해보려고 합니다 ~!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1.BERT와 GPT의 주요 차이점은 무엇인가요? 각각의 기본 구조와 작동 방식, 적합한 NLP 응용 분야를 위주로 설명해주세요.&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BERT와&amp;nbsp;GPT는&amp;nbsp;모두&amp;nbsp;Transformer&amp;nbsp;기반의&amp;nbsp;대표적인&amp;nbsp;사전학습&amp;nbsp;언어모델로,&amp;nbsp;현대&amp;nbsp;NLP&amp;nbsp;발전의&amp;nbsp;핵심적인&amp;nbsp;출발점이&amp;nbsp;되었습니다.&amp;nbsp;다만&amp;nbsp;두&amp;nbsp;모델은&amp;nbsp;구조,&amp;nbsp;학습&amp;nbsp;방식,&amp;nbsp;강점이&amp;nbsp;드러나는&amp;nbsp;응용&amp;nbsp;분야에서&amp;nbsp;뚜렷한&amp;nbsp;차이를&amp;nbsp;보입니다.BERT와 GPT는 모두 Transformer 기반 언어모델이지만, &lt;b&gt;무엇을 더 잘하게 설계됐는지&lt;/b&gt;가 다릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;194&quot; data-start=&quot;172&quot; data-section-id=&quot;1trnfpj&quot;&gt;1. BERT와 GPT의 주요 차이점&lt;/h1&gt;
&lt;p data-end=&quot;351&quot; data-start=&quot;338&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;381&quot; data-start=&quot;353&quot; data-section-id=&quot;1ldjpsf&quot; data-ke-size=&quot;size26&quot;&gt;(1)BERT: 문맥을 양쪽에서 보고 이해하는 모델&lt;/h2&gt;
&lt;p data-end=&quot;528&quot; data-start=&quot;383&quot; data-ke-size=&quot;size16&quot;&gt;BERT는 Transformer의 &lt;b&gt;Encoder-only&lt;/b&gt; 구조를 사용합니다.&lt;br /&gt;가장 큰 특징은 &lt;b&gt;양방향(bidirectional)&lt;/b&gt; 으로 문맥을 본다는 점입니다.&lt;br /&gt;즉, 어떤 단어의 의미를 파악할 때 &lt;b&gt;앞 단어와 뒤 단어를 함께&lt;/b&gt; 참고합니다.&lt;/p&gt;
&lt;p data-end=&quot;539&quot; data-start=&quot;530&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;539&quot; data-start=&quot;530&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;ldquo;나는 은행에 가서 돈을 찾았다.&amp;rdquo;라는 문장을 살펴보겠습니다.&lt;/span&gt;&amp;nbsp;BERT는 &amp;ldquo;은행&amp;rdquo;이 강가(river bank)가 아니라 &lt;b&gt;금융기관&lt;/b&gt;이라는 점을 앞뒤 문맥을 함께 보고 이해할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;743&quot; data-start=&quot;641&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;743&quot; data-start=&quot;641&quot; data-ke-size=&quot;size16&quot;&gt;BERT의 대표적인 사전학습 방식은 &lt;b&gt;MLM(Masked Language Modeling)&lt;/b&gt; 입니다.문장 속 일부 단어를 가려 놓고, 그 빈칸에 들어갈 단어를 맞히게 합니다.&lt;/p&gt;
&lt;p data-end=&quot;751&quot; data-start=&quot;745&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;751&quot; data-start=&quot;745&quot; data-ke-size=&quot;size16&quot;&gt;예를 들면, &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;ldquo;나는 오늘 [MASK]를 마셨다.&amp;rdquo; &lt;/span&gt;라는 문장을 보고, 앞뒤 문맥을 바탕으로 &amp;ldquo;커피&amp;rdquo;, &amp;ldquo;물&amp;rdquo;, &amp;ldquo;차&amp;rdquo; 같은 단어를 예측합니다. 초기 BERT에는 &lt;b&gt;NSP(Next Sentence Prediction)&lt;/b&gt; 도 함께 쓰였습니다.이것은 두 문장이 실제로 이어지는 문장인지 맞히는 방식입니다.&lt;/p&gt;
&lt;h3 data-end=&quot;939&quot; data-start=&quot;924&quot; data-section-id=&quot;1ectzf3&quot; data-ke-size=&quot;size23&quot;&gt;BERT가 잘하는 일&lt;/h3&gt;
&lt;p data-end=&quot;975&quot; data-start=&quot;940&quot; data-ke-size=&quot;size16&quot;&gt;BERT는 &lt;b&gt;텍스트를 이해하고 분류하는 작업&lt;/b&gt;에 적합합니다.&lt;/p&gt;
&lt;p data-end=&quot;979&quot; data-start=&quot;977&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1151&quot; data-start=&quot;980&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1017&quot; data-start=&quot;980&quot; data-section-id=&quot;1u353ch&quot;&gt;&lt;b&gt;감성 분석&lt;/b&gt;&lt;br /&gt;&amp;ldquo;이 영화는 정말 재미있었다&amp;rdquo; &amp;rarr; 긍정&lt;/li&gt;
&lt;li data-end=&quot;1049&quot; data-start=&quot;1018&quot; data-section-id=&quot;9khepb&quot;&gt;&lt;b&gt;문장 분류&lt;/b&gt;&lt;br /&gt;메일이 스팸인지 아닌지 분류&lt;/li&gt;
&lt;li data-end=&quot;1113&quot; data-start=&quot;1050&quot; data-section-id=&quot;121csgu&quot;&gt;&lt;b&gt;개체명 인식(NER)&lt;/b&gt;&lt;br /&gt;&amp;ldquo;이순신은 조선의 장군이다&amp;rdquo;에서 &amp;ldquo;이순신&amp;rdquo;은 인물, &amp;ldquo;조선&amp;rdquo;은 국가로 인식&lt;/li&gt;
&lt;li data-end=&quot;1151&quot; data-start=&quot;1114&quot; data-section-id=&quot;qmrbd1&quot;&gt;&lt;b&gt;질의응답(QA)&lt;/b&gt;&lt;br /&gt;지문을 읽고 그 안에서 답을 찾기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1197&quot; data-start=&quot;1153&quot; data-ke-size=&quot;size16&quot;&gt;즉, BERT는 &lt;b&gt;&amp;ldquo;이 문장이 무슨 뜻인지 잘 파악하는 모델&amp;rdquo;&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1202&quot; data-start=&quot;1199&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1232&quot; data-start=&quot;1204&quot; data-section-id=&quot;arfb38&quot; data-ke-size=&quot;size26&quot;&gt;(2)GPT: 다음 단어를 이어 쓰며 생성하는 모델&lt;/h2&gt;
&lt;p data-end=&quot;1330&quot; data-start=&quot;1234&quot; data-ke-size=&quot;size16&quot;&gt;GPT는 Transformer의 &lt;b&gt;Decoder-only&lt;/b&gt; 구조를 사용합니다.이 모델은 &lt;b&gt;왼쪽에서 오른쪽으로&lt;/b&gt; 순서대로 읽으면서 &lt;b&gt;다음 단어를 예측&lt;/b&gt;합니다.예를 들어,&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;ldquo;오늘 날씨가 좋아서&amp;rdquo; &lt;/span&gt;까지 주어지면, 그다음에 &amp;ldquo;산책을&amp;rdquo;, &amp;ldquo;밖에&amp;rdquo;, &amp;ldquo;기분이&amp;rdquo; 같은 말을 이어서 만들어냅니다.이 방식을 &lt;b&gt;자기회귀(autoregressive)&lt;/b&gt; 방식이라고 합니다. 즉, 지금까지 나온 단어들을 바탕으로 &lt;b&gt;다음 토큰 하나씩&lt;/b&gt; 생성해 나가는 구조입니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1519&quot; data-start=&quot;1505&quot; data-section-id=&quot;3x74ul&quot; data-ke-size=&quot;size23&quot;&gt;GPT가 잘하는 일&lt;/h3&gt;
&lt;p data-end=&quot;1545&quot; data-start=&quot;1520&quot; data-ke-size=&quot;size16&quot;&gt;GPT는 &lt;b&gt;텍스트 생성&lt;/b&gt; 작업에 강합니다.&lt;/p&gt;
&lt;p data-end=&quot;1549&quot; data-start=&quot;1547&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1708&quot; data-start=&quot;1550&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1579&quot; data-start=&quot;1550&quot; data-section-id=&quot;anky0b&quot;&gt;&lt;b&gt;대화형 AI&lt;/b&gt;&lt;br /&gt;질문에 자연스럽게 답변&lt;/li&gt;
&lt;li data-end=&quot;1616&quot; data-start=&quot;1580&quot; data-section-id=&quot;1l079du&quot;&gt;&lt;b&gt;글쓰기 보조&lt;/b&gt;&lt;br /&gt;이메일, 보고서, 에세이 초안 생성&lt;/li&gt;
&lt;li data-end=&quot;1641&quot; data-start=&quot;1617&quot; data-section-id=&quot;16uwyr9&quot;&gt;&lt;b&gt;요약&lt;/b&gt;&lt;br /&gt;긴 문서를 짧게 정리&lt;/li&gt;
&lt;li data-end=&quot;1666&quot; data-start=&quot;1642&quot; data-section-id=&quot;40y9iz&quot;&gt;&lt;b&gt;번역&lt;/b&gt;&lt;br /&gt;한국어 &amp;harr; 영어 변환&lt;/li&gt;
&lt;li data-end=&quot;1708&quot; data-start=&quot;1667&quot; data-section-id=&quot;12cmk0i&quot;&gt;&lt;b&gt;코드 생성&lt;/b&gt;&lt;br /&gt;&amp;ldquo;파이썬으로 정렬 코드 짜줘&amp;rdquo; 같은 요청 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1720&quot; data-start=&quot;1710&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 사용자가 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;ldquo;봄에 어울리는 짧은 광고 문구를 써줘&amp;rdquo;&lt;/span&gt;라고 하면, GPT는 맥락에 맞는 새로운 문장을 만들어냅니다.즉, GPT는&lt;b&gt;&amp;ldquo;자연스럽게 다음 말을 이어서 만들어내는 모델&amp;rdquo;&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;br /&gt;BERT와 GPT는 모두 Transformer 기반 언어모델이지만,&amp;nbsp;무엇을 더 잘하게 설계됐는지가 다릅니다.&lt;br /&gt;쉽게 말하면, 다음과 같이 정리할 수 있습니다.&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;정리하면,&amp;nbsp;BERT는&amp;nbsp;문장을&amp;nbsp;이해하는&amp;nbsp;모델,&amp;nbsp;GPT는&amp;nbsp;문장을&amp;nbsp;생성하는&amp;nbsp;모델이라고&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BERT vs GPT&lt;/p&gt;
&lt;table style=&quot;color: #27251e; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;구조&lt;/td&gt;
&lt;td&gt;Encoder-only (양방향)&lt;/td&gt;
&lt;td&gt;Decoder-only (단방향)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사전학습&lt;/td&gt;
&lt;td&gt;MLM + NSP&lt;/td&gt;
&lt;td&gt;Next Token Prediction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;강점&lt;/td&gt;
&lt;td&gt;이해/분석 (분류, QA, NER)&lt;/td&gt;
&lt;td&gt;생성 (번역, 요약, 대화)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.Hugging Face Transformers 라이브러리는 무엇이며, 어떤 기능을 제공하나요?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hugging&amp;nbsp;Face&amp;nbsp;Transformers는&amp;nbsp;BERT,&amp;nbsp;GPT,&amp;nbsp;RoBERTa,&amp;nbsp;T5,&amp;nbsp;BART&amp;nbsp;등&amp;nbsp;다양한&amp;nbsp;사전학습&amp;nbsp;모델을&amp;nbsp;쉽게&amp;nbsp;불러오고&amp;nbsp;활용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;만든&amp;nbsp;오픈소스&amp;nbsp;라이브러리입니다.&amp;nbsp;PyTorch,&amp;nbsp;TensorFlow,&amp;nbsp;JAX&amp;nbsp;등&amp;nbsp;여러&amp;nbsp;딥러닝&amp;nbsp;프레임워크와&amp;nbsp;호환되며,&amp;nbsp;연구와&amp;nbsp;실무&amp;nbsp;모두에서&amp;nbsp;널리&amp;nbsp;사용됩니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;2479&quot; data-start=&quot;2467&quot; data-section-id=&quot;1cq4s64&quot; data-ke-size=&quot;size26&quot;&gt;왜 많이 쓰일까?&lt;/h2&gt;
&lt;p data-end=&quot;2512&quot; data-start=&quot;2481&quot; data-ke-size=&quot;size16&quot;&gt;가장 큰 이유는 &lt;b&gt;사용이 매우 간단하기 때문&lt;/b&gt;입니다. 예를 들어 감성 분석을 직접 구현하려면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2581&quot; data-start=&quot;2537&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2548&quot; data-start=&quot;2537&quot; data-section-id=&quot;1ffersg&quot;&gt;토크나이저 만들기&lt;/li&gt;
&lt;li data-end=&quot;2559&quot; data-start=&quot;2549&quot; data-section-id=&quot;1p65b0k&quot;&gt;모델 구조 설계&lt;/li&gt;
&lt;li data-end=&quot;2570&quot; data-start=&quot;2560&quot; data-section-id=&quot;1ehjwx8&quot;&gt;학습 코드 작성&lt;/li&gt;
&lt;li data-end=&quot;2581&quot; data-start=&quot;2571&quot; data-section-id=&quot;1z0j8to&quot;&gt;추론 함수 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2596&quot; data-start=&quot;2583&quot; data-ke-size=&quot;size16&quot;&gt;같은 작업이 필요합니다.&lt;/p&gt;
&lt;p data-end=&quot;2654&quot; data-start=&quot;2598&quot; data-ke-size=&quot;size16&quot;&gt;하지만 Hugging Face에서는 pipeline만 써도 기본 작업을 바로 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;2658&quot; data-start=&quot;2656&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2692&quot; data-start=&quot;2659&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2666&quot; data-start=&quot;2659&quot; data-section-id=&quot;1w3czbk&quot;&gt;감성 분석&lt;/li&gt;
&lt;li data-end=&quot;2675&quot; data-start=&quot;2667&quot; data-section-id=&quot;1t6fuid&quot;&gt;텍스트 생성&lt;/li&gt;
&lt;li data-end=&quot;2680&quot; data-start=&quot;2676&quot; data-section-id=&quot;yilgox&quot;&gt;요약&lt;/li&gt;
&lt;li data-end=&quot;2685&quot; data-start=&quot;2681&quot; data-section-id=&quot;yi0te5&quot;&gt;번역&lt;/li&gt;
&lt;li data-end=&quot;2692&quot; data-start=&quot;2686&quot; data-section-id=&quot;cqbqt8&quot;&gt;질의응답&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2763&quot; data-start=&quot;2694&quot; data-ke-size=&quot;size16&quot;&gt;즉, 연구자나 개발자가 모델 구조를 하나하나 다시 짤 필요 없이 &lt;b&gt;바로 실험하고 적용할 수 있는 환경&lt;/b&gt;을 제공합니다.&lt;/p&gt;
&lt;h2 data-end=&quot;2778&quot; data-start=&quot;2770&quot; data-section-id=&quot;17o75js&quot; data-ke-size=&quot;size26&quot;&gt;(1)주요 기능&lt;/h2&gt;
&lt;h3 data-end=&quot;2795&quot; data-start=&quot;2780&quot; data-section-id=&quot;je4lkn&quot; data-ke-size=&quot;size23&quot;&gt;1) 토크나이저 제공&lt;/h3&gt;
&lt;p data-end=&quot;2900&quot; data-start=&quot;2796&quot; data-ke-size=&quot;size16&quot;&gt;모델은 문장을 바로 이해하지 못하므로, 문장을 잘게 쪼개 &lt;b&gt;토큰(token)&lt;/b&gt; 으로 바꿔야 합니다.&lt;br /&gt;Transformers 라이브러리는 모델마다 맞는 토크나이저를 함께 제공합니다.&lt;/p&gt;
&lt;p data-end=&quot;2904&quot; data-start=&quot;2902&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;blockquote data-end=&quot;2919&quot; data-start=&quot;2905&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2919&quot; data-start=&quot;2907&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;I love NLP&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2962&quot; data-start=&quot;2921&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; [&quot;I&quot;, &quot;love&quot;, &quot;NL&quot;, &quot;##P&quot;] 처럼 나뉠 수 있음&lt;/p&gt;
&lt;hr data-end=&quot;2967&quot; data-start=&quot;2964&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2988&quot; data-start=&quot;2969&quot; data-section-id=&quot;1ady6op&quot; data-ke-size=&quot;size23&quot;&gt;2) 사전학습 모델 불러오기&lt;/h3&gt;
&lt;p data-end=&quot;3027&quot; data-start=&quot;2989&quot; data-ke-size=&quot;size16&quot;&gt;이미 학습된 BERT, GPT, T5 등을 바로 로드할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3031&quot; data-start=&quot;3029&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3092&quot; data-start=&quot;3032&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3053&quot; data-start=&quot;3032&quot; data-section-id=&quot;1qh3lnb&quot;&gt;bert-base-uncased&lt;/li&gt;
&lt;li data-end=&quot;3062&quot; data-start=&quot;3054&quot; data-section-id=&quot;18kk189&quot;&gt;gpt2&lt;/li&gt;
&lt;li data-end=&quot;3079&quot; data-start=&quot;3063&quot; data-section-id=&quot;106do5p&quot;&gt;roberta-base&lt;/li&gt;
&lt;li data-end=&quot;3092&quot; data-start=&quot;3080&quot; data-section-id=&quot;priiaj&quot;&gt;t5-small&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3146&quot; data-start=&quot;3094&quot; data-ke-size=&quot;size16&quot;&gt;즉, 대규모 학습을 직접 하지 않아도&lt;br /&gt;&lt;b&gt;이미 학습된 모델을 바로 활용&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;3151&quot; data-start=&quot;3148&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3177&quot; data-start=&quot;3153&quot; data-section-id=&quot;y9hi7i&quot; data-ke-size=&quot;size23&quot;&gt;3) 파인튜닝(fine-tuning)&lt;/h3&gt;
&lt;p data-end=&quot;3230&quot; data-start=&quot;3178&quot; data-ke-size=&quot;size16&quot;&gt;사전학습된 모델을 내 데이터에 맞게 다시 조금 학습시켜&lt;br /&gt;특정 업무에 최적화할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3234&quot; data-start=&quot;3232&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3299&quot; data-start=&quot;3235&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3260&quot; data-start=&quot;3235&quot; data-section-id=&quot;1b0dmtp&quot;&gt;병원 리뷰 데이터로 감성 분석 모델 만들기&lt;/li&gt;
&lt;li data-end=&quot;3278&quot; data-start=&quot;3261&quot; data-section-id=&quot;1c8hub1&quot;&gt;법률 문서 분류 모델 만들기&lt;/li&gt;
&lt;li data-end=&quot;3299&quot; data-start=&quot;3279&quot; data-section-id=&quot;xi7krp&quot;&gt;고객 상담 문서 요약 모델 만들기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3304&quot; data-start=&quot;3301&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3325&quot; data-start=&quot;3306&quot; data-section-id=&quot;jddhvl&quot; data-ke-size=&quot;size23&quot;&gt;4) Pipeline API&lt;/h3&gt;
&lt;p data-end=&quot;3363&quot; data-start=&quot;3326&quot; data-ke-size=&quot;size16&quot;&gt;복잡한 코드 없이 한 줄 수준으로 작업을 실행할 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-end=&quot;3371&quot; data-start=&quot;3365&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3427&quot; data-start=&quot;3372&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3391&quot; data-start=&quot;3372&quot; data-section-id=&quot;sdlmxl&quot;&gt;&amp;ldquo;이 문장이 긍정인지 부정인지&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;3411&quot; data-start=&quot;3392&quot; data-section-id=&quot;19yuqca&quot;&gt;&amp;ldquo;이 기사 내용을 3줄로 요약&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;3427&quot; data-start=&quot;3412&quot; data-section-id=&quot;ynp63g&quot;&gt;&amp;ldquo;영어를 한국어로 번역&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3451&quot; data-start=&quot;3429&quot; data-ke-size=&quot;size16&quot;&gt;같은 작업을 빠르게 수행할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;3456&quot; data-start=&quot;3453&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3472&quot; data-start=&quot;3458&quot; data-section-id=&quot;rdtr4u&quot; data-ke-size=&quot;size23&quot;&gt;5) 멀티모달 확장&lt;/h3&gt;
&lt;p data-end=&quot;3549&quot; data-start=&quot;3473&quot; data-ke-size=&quot;size16&quot;&gt;원래는 NLP 중심이었지만, 이후에는 텍스트뿐 아니라&lt;br /&gt;&lt;b&gt;이미지, 음성, 멀티모달 모델&lt;/b&gt;까지 다루는 방향으로 크게 확장되었습니다.&lt;/p&gt;
&lt;p data-end=&quot;3553&quot; data-start=&quot;3551&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3592&quot; data-start=&quot;3554&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3565&quot; data-start=&quot;3554&quot; data-section-id=&quot;14iky7d&quot;&gt;이미지 설명 생성&lt;/li&gt;
&lt;li data-end=&quot;3573&quot; data-start=&quot;3566&quot; data-section-id=&quot;7i6k4w&quot;&gt;음성 인식&lt;/li&gt;
&lt;li data-end=&quot;3592&quot; data-start=&quot;3574&quot; data-section-id=&quot;1ebcski&quot;&gt;이미지+텍스트 결합 모델 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;토크나이저, 데이터셋 처리, 파인튜닝(Trainer API), 멀티모달(NLP/CV/오디오) 지원이 있으며, 2026년 4월 기준 v5.5+ 버전에서 양자화와 비동기 추론이 강화되었습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.BERT와 GPT 이후 등장한 주요 사전학습 모델에는 어떤 것들이 있으며, 특징은 무엇인가요? 구글링 등을 통해 자유롭게 리서치해서 정리해보세요.&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BERT/GPT&amp;nbsp;이후&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RoBERTa(동적 마스킹, 더 큰 데이터)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ALBERT(경량화, 파라미터 공유)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DistilBERT(지식 증류)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DeBERTa(분해 어텐션)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ELECTRA(디스크리미네이터 효율 학습)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- T5(텍스트-투-텍스트 통합)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- BART(노이즈 복원)가 등장했습니다. &lt;br /&gt;&lt;br /&gt;2026년&amp;nbsp;4월&amp;nbsp;기준으로는&amp;nbsp;GPT-5.4(컴퓨터&amp;nbsp;사용&amp;nbsp;API,&amp;nbsp;1M&amp;nbsp;컨텍스트,&amp;nbsp;범용&amp;nbsp;생성),&amp;nbsp;Claude&amp;nbsp;4.6&amp;nbsp;Opus(코딩&amp;nbsp;최강,&amp;nbsp;14.5시간&amp;nbsp;에이전트),&amp;nbsp;Gemini&amp;nbsp;3.1&amp;nbsp;Pro(추론/멀티모달&amp;nbsp;1위),&amp;nbsp;Llama&amp;nbsp;4(오픈소스&amp;nbsp;대형),&amp;nbsp;Grok&amp;nbsp;4.1(xAI&amp;nbsp;고차원&amp;nbsp;추론)이&amp;nbsp;주목받으며,&amp;nbsp;에이전트&amp;nbsp;오케스트레이션과&amp;nbsp;강화&amp;nbsp;추론이&amp;nbsp;트렌드입니다.&lt;/p&gt;</description>
      <category>스프린트미션</category>
      <author>goodella</author>
      <guid isPermaLink="true">https://ahnella2026.tistory.com/14</guid>
      <comments>https://ahnella2026.tistory.com/14#entry14comment</comments>
      <pubDate>Mon, 20 Apr 2026 09:06:51 +0900</pubDate>
    </item>
    <item>
      <title>위클리 페이퍼 #10</title>
      <link>https://ahnella2026.tistory.com/13</link>
      <description>&lt;h2 data-end=&quot;313&quot; data-start=&quot;270&quot; data-section-id=&quot;erolup&quot; data-ke-size=&quot;size26&quot;&gt;1. 텍스트 데이터를 모델에 적용하기 전에 어떤 전처리 과정을 거치나요?&lt;/h2&gt;
&lt;p data-end=&quot;470&quot; data-start=&quot;315&quot; data-ke-size=&quot;size16&quot;&gt;텍스트 데이터는 이미지처럼 바로 숫자로 입력할 수 없기 때문에, 모델이 이해할 수 있는 형태로 바꾸는 전처리 과정이 필요하다.&lt;br /&gt;전처리의 목적은 &lt;b&gt;불필요한 노이즈를 줄이고&lt;/b&gt;, &lt;b&gt;텍스트를 일정한 형식으로 정리한 뒤&lt;/b&gt;, &lt;b&gt;수치화하여 모델 입력으로 변환하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;h3 data-end=&quot;491&quot; data-start=&quot;472&quot; data-section-id=&quot;1o9ahtf&quot; data-ke-size=&quot;size23&quot;&gt;1) 정제(Cleaning)&lt;/h3&gt;
&lt;p data-end=&quot;615&quot; data-start=&quot;492&quot; data-ke-size=&quot;size16&quot;&gt;가장 먼저 수행하는 것은 텍스트 정제이다.&lt;br /&gt;예를 들어 HTML 태그, 특수문자, 이모지, 중복 공백, 불필요한 기호 등을 제거하거나 정리한다.&lt;br /&gt;또한 대소문자를 통일하고, 오탈자 교정이나 정규화 작업을 하기도 한다.&lt;/p&gt;
&lt;p data-end=&quot;620&quot; data-start=&quot;617&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;662&quot; data-start=&quot;621&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;662&quot; data-start=&quot;621&quot; data-section-id=&quot;4383ft&quot;&gt;&quot;Hello!!! NLP &quot; &amp;rarr; &quot;hello nlp&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;710&quot; data-start=&quot;664&quot; data-ke-size=&quot;size16&quot;&gt;이 단계는 데이터의 일관성을 높여 모델이 의미 없는 패턴을 학습하지 않도록 돕는다.&lt;/p&gt;
&lt;h3 data-end=&quot;736&quot; data-start=&quot;712&quot; data-section-id=&quot;2dwib1&quot; data-ke-size=&quot;size23&quot;&gt;2) 토큰화(Tokenization)&lt;/h3&gt;
&lt;p data-end=&quot;790&quot; data-start=&quot;737&quot; data-ke-size=&quot;size16&quot;&gt;정제된 문장을 단어, 형태소, 혹은 서브워드 단위로 나누는 과정이다.&lt;br /&gt;이를 토큰화라고 한다.&lt;/p&gt;
&lt;p data-end=&quot;795&quot; data-start=&quot;792&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;893&quot; data-start=&quot;796&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;893&quot; data-start=&quot;796&quot; data-section-id=&quot;jhz5me&quot;&gt;&quot;I love natural language processing&quot;&lt;br /&gt;&amp;rarr; [&quot;I&quot;, &quot;love&quot;, &quot;natural&quot;, &quot;language&quot;, &quot;processing&quot;]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;967&quot; data-start=&quot;895&quot; data-ke-size=&quot;size16&quot;&gt;한국어에서는 조사와 어미 변화가 많기 때문에 단순 띄어쓰기 기준보다 &lt;b&gt;형태소 분석 기반 토큰화&lt;/b&gt;가 더 중요하게 쓰이기도 한다.&lt;/p&gt;
&lt;h3 data-end=&quot;1000&quot; data-start=&quot;969&quot; data-section-id=&quot;1vzixb0&quot; data-ke-size=&quot;size23&quot;&gt;3) 불용어 제거(Stopword Removal)&lt;/h3&gt;
&lt;p data-end=&quot;1114&quot; data-start=&quot;1001&quot; data-ke-size=&quot;size16&quot;&gt;문장 안에는 의미 전달에 큰 기여를 하지 않는 단어들이 있다.&lt;br /&gt;예를 들어 영어의 the, is, a 같은 단어들이 대표적이다.&lt;br /&gt;이런 단어를 제거하면 핵심 정보가 더 잘 드러날 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;1191&quot; data-start=&quot;1116&quot; data-ke-size=&quot;size16&quot;&gt;다만 최근 딥러닝 모델에서는 문맥 자체가 중요하기 때문에, 무조건 제거하기보다는 &lt;b&gt;모델과 목적에 따라 선택적으로 적용&lt;/b&gt;하는 편이다.&lt;/p&gt;
&lt;h3 data-end=&quot;1220&quot; data-start=&quot;1193&quot; data-section-id=&quot;olub7m&quot; data-ke-size=&quot;size23&quot;&gt;4) 정규화 및 어간 추출 / 표제어 추출&lt;/h3&gt;
&lt;p data-end=&quot;1251&quot; data-start=&quot;1221&quot; data-ke-size=&quot;size16&quot;&gt;동일한 의미를 가지는 다양한 형태를 통일하는 과정이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1415&quot; data-start=&quot;1253&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1334&quot; data-start=&quot;1253&quot; data-section-id=&quot;qc0vfy&quot;&gt;&lt;b&gt;어간 추출(Stemming)&lt;/b&gt;: 단어의 어간만 남기는 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1334&quot; data-start=&quot;1295&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1334&quot; data-start=&quot;1295&quot; data-section-id=&quot;1xitsrs&quot;&gt;playing, played, plays &amp;rarr; play&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1415&quot; data-start=&quot;1335&quot; data-section-id=&quot;sldt7n&quot;&gt;&lt;b&gt;표제어 추출(Lemmatization)&lt;/b&gt;: 문법적 형태를 고려해 기본형으로 변환
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1415&quot; data-start=&quot;1389&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1415&quot; data-start=&quot;1389&quot; data-section-id=&quot;wovcfx&quot;&gt;am, are, is &amp;rarr; be&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1462&quot; data-start=&quot;1417&quot; data-ke-size=&quot;size16&quot;&gt;이 작업은 단어 수를 줄이고, 비슷한 의미의 표현을 하나로 묶는 데 도움이 된다.&lt;/p&gt;
&lt;h3 data-end=&quot;1489&quot; data-start=&quot;1464&quot; data-section-id=&quot;xdebgp&quot; data-ke-size=&quot;size23&quot;&gt;5) 벡터화(Vectorization)&lt;/h3&gt;
&lt;p data-end=&quot;1549&quot; data-start=&quot;1490&quot; data-ke-size=&quot;size16&quot;&gt;전처리된 텍스트를 모델이 입력할 수 있도록 숫자 벡터로 바꾸는 단계이다.&lt;br /&gt;대표적인 방법은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1675&quot; data-start=&quot;1551&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1573&quot; data-start=&quot;1551&quot; data-section-id=&quot;1v1ca6p&quot;&gt;&lt;b&gt;One-Hot Encoding&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1592&quot; data-start=&quot;1574&quot; data-section-id=&quot;5ju3rs&quot;&gt;&lt;b&gt;Bag of Words&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1605&quot; data-start=&quot;1593&quot; data-section-id=&quot;1pbrw8s&quot;&gt;&lt;b&gt;TF-IDF&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1646&quot; data-start=&quot;1606&quot; data-section-id=&quot;1k8qxdm&quot;&gt;&lt;b&gt;Word2Vec / FastText / GloVe 같은 임베딩&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1675&quot; data-start=&quot;1647&quot; data-section-id=&quot;1nuul4c&quot;&gt;최근에는 &lt;b&gt;BERT 같은 문맥 기반 임베딩&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1731&quot; data-start=&quot;1677&quot; data-ke-size=&quot;size16&quot;&gt;즉, 전처리의 최종 목표는 텍스트를 &lt;b&gt;의미를 어느 정도 보존한 숫자 표현&lt;/b&gt;으로 바꾸는 것이다.&lt;/p&gt;
&lt;h3 data-end=&quot;1759&quot; data-start=&quot;1733&quot; data-section-id=&quot;1shwcle&quot; data-ke-size=&quot;size23&quot;&gt;6) 패딩(Padding)과 길이 맞추기&lt;/h3&gt;
&lt;p data-end=&quot;1828&quot; data-start=&quot;1760&quot; data-ke-size=&quot;size16&quot;&gt;딥러닝 모델은 보통 입력 길이가 일정해야 하므로, 문장 길이가 다를 경우 짧은 문장은 패딩을 추가하고 긴 문장은 잘라낸다.&lt;/p&gt;
&lt;p data-end=&quot;1833&quot; data-start=&quot;1830&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1896&quot; data-start=&quot;1834&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1858&quot; data-start=&quot;1834&quot; data-section-id=&quot;jygi11&quot;&gt;[&quot;I&quot;, &quot;love&quot;, &quot;NLP&quot;]&lt;/li&gt;
&lt;li data-end=&quot;1896&quot; data-start=&quot;1859&quot; data-section-id=&quot;ccd4jz&quot;&gt;[&quot;Transformer&quot;, &quot;is&quot;, &quot;powerful&quot;]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1934&quot; data-start=&quot;1898&quot; data-ke-size=&quot;size16&quot;&gt;이 둘의 길이를 맞추기 위해 [PAD] 같은 토큰을 추가한다.&lt;/p&gt;
&lt;h3 data-end=&quot;1942&quot; data-start=&quot;1936&quot; data-section-id=&quot;1hrqjbz&quot; data-ke-size=&quot;size23&quot;&gt;정리&lt;/h3&gt;
&lt;p data-end=&quot;1972&quot; data-start=&quot;1943&quot; data-ke-size=&quot;size16&quot;&gt;텍스트 전처리는 보통 다음 흐름으로 이해할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2018&quot; data-start=&quot;1974&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;텍스트 정제 &amp;rarr; 토큰화 &amp;rarr; 불용어 제거/정규화 &amp;rarr; 벡터화 &amp;rarr; 길이 맞추기&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2132&quot; data-start=&quot;2020&quot; data-ke-size=&quot;size16&quot;&gt;다만 최근의 Transformer 계열 모델은 자체 토크나이저와 임베딩 구조를 가지므로, 과거보다 수작업 전처리가 줄어든 편이다.&lt;br /&gt;그럼에도 데이터 정제와 토큰화는 여전히 매우 중요한 기본 단계이다.&lt;/p&gt;
&lt;hr data-end=&quot;2137&quot; data-start=&quot;2134&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2188&quot; data-start=&quot;2139&quot; data-section-id=&quot;1k8vstl&quot; data-ke-size=&quot;size26&quot;&gt;2. FastText가 Word2Vec과 다른 점은 무엇이며, 어떤 장점이 있나요?&lt;/h2&gt;
&lt;p data-end=&quot;2301&quot; data-start=&quot;2190&quot; data-ke-size=&quot;size16&quot;&gt;FastText는 Word2Vec을 확장한 단어 임베딩 기법이다.&lt;br /&gt;둘 다 단어를 밀집 벡터(Dense Vector)로 표현한다는 점은 같지만, &lt;b&gt;단어를 바라보는 방식&lt;/b&gt;에서 중요한 차이가 있다.&lt;/p&gt;
&lt;h3 data-end=&quot;2322&quot; data-start=&quot;2303&quot; data-section-id=&quot;1f5gqg6&quot; data-ke-size=&quot;size23&quot;&gt;1) Word2Vec의 특징&lt;/h3&gt;
&lt;p data-end=&quot;2398&quot; data-start=&quot;2323&quot; data-ke-size=&quot;size16&quot;&gt;Word2Vec은 단어를 하나의 독립된 토큰으로 본다.&lt;br /&gt;즉, &quot;apple&quot;이라는 단어가 있으면 이를 하나의 단위로만 임베딩한다.&lt;/p&gt;
&lt;p data-end=&quot;2514&quot; data-start=&quot;2400&quot; data-ke-size=&quot;size16&quot;&gt;장점은 구조가 단순하고 학습이 빠르다는 점이다.&lt;br /&gt;하지만 문제가 있다.&lt;br /&gt;학습 데이터에 없던 단어(OOV, Out-Of-Vocabulary)는 벡터를 만들기 어렵고, 단어 내부 구조를 반영하지 못한다.&lt;/p&gt;
&lt;p data-end=&quot;2522&quot; data-start=&quot;2516&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2553&quot; data-start=&quot;2523&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2530&quot; data-start=&quot;2523&quot; data-section-id=&quot;168zps1&quot;&gt;run&lt;/li&gt;
&lt;li data-end=&quot;2542&quot; data-start=&quot;2531&quot; data-section-id=&quot;1ketevj&quot;&gt;running&lt;/li&gt;
&lt;li data-end=&quot;2553&quot; data-start=&quot;2543&quot; data-section-id=&quot;18rb34o&quot;&gt;runner&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2604&quot; data-start=&quot;2555&quot; data-ke-size=&quot;size16&quot;&gt;이 단어들은 형태적으로 관련이 있지만, Word2Vec은 각각을 별도의 단어로 취급한다.&lt;/p&gt;
&lt;h3 data-end=&quot;2630&quot; data-start=&quot;2606&quot; data-section-id=&quot;1odp0mp&quot; data-ke-size=&quot;size23&quot;&gt;2) FastText의 핵심 아이디어&lt;/h3&gt;
&lt;p data-end=&quot;2724&quot; data-start=&quot;2631&quot; data-ke-size=&quot;size16&quot;&gt;FastText는 단어를 &lt;b&gt;문자 n-gram의 집합&lt;/b&gt;으로 본다.&lt;br /&gt;즉, 단어 하나를 통째로만 보는 것이 아니라, 내부의 부분 문자열(subword)까지 활용한다.&lt;/p&gt;
&lt;p data-end=&quot;2773&quot; data-start=&quot;2726&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 &quot;where&quot;라는 단어를 3-gram으로 나누면 다음처럼 볼 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2814&quot; data-start=&quot;2775&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2782&quot; data-start=&quot;2775&quot; data-section-id=&quot;16a89hn&quot;&gt;&amp;lt;wh&lt;/li&gt;
&lt;li data-end=&quot;2790&quot; data-start=&quot;2783&quot; data-section-id=&quot;169861e&quot;&gt;whe&lt;/li&gt;
&lt;li data-end=&quot;2798&quot; data-start=&quot;2791&quot; data-section-id=&quot;168j2jb&quot;&gt;her&lt;/li&gt;
&lt;li data-end=&quot;2806&quot; data-start=&quot;2799&quot; data-section-id=&quot;168s0ka&quot;&gt;ere&lt;/li&gt;
&lt;li data-end=&quot;2814&quot; data-start=&quot;2807&quot; data-section-id=&quot;16904ch&quot;&gt;re&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2861&quot; data-start=&quot;2816&quot; data-ke-size=&quot;size16&quot;&gt;이런 식으로 단어 벡터를 &lt;b&gt;부분 문자열 벡터들의 합 또는 평균&lt;/b&gt;으로 구성한다.&lt;/p&gt;
&lt;h3 data-end=&quot;2882&quot; data-start=&quot;2863&quot; data-section-id=&quot;oqjrik&quot; data-ke-size=&quot;size23&quot;&gt;3) FastText의 장점&lt;/h3&gt;
&lt;h4 data-end=&quot;2902&quot; data-start=&quot;2884&quot; data-ke-size=&quot;size20&quot;&gt;(1) OOV 문제 완화&lt;/h4&gt;
&lt;p data-end=&quot;3009&quot; data-start=&quot;2903&quot; data-ke-size=&quot;size16&quot;&gt;학습 시 한 번도 보지 못한 단어라도, 그 단어를 구성하는 문자 조각들은 기존에 학습했을 가능성이 있다.&lt;br /&gt;그래서 완전히 새로운 단어에 대해서도 어느 정도 의미 있는 벡터를 만들 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;3098&quot; data-start=&quot;3011&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 &quot;playful&quot;이 학습 데이터에 없더라도&lt;br /&gt;play, ayf, yfu, ful 같은 조각을 활용해 임베딩을 추정할 수 있다.&lt;/p&gt;
&lt;h4 data-end=&quot;3117&quot; data-start=&quot;3100&quot; data-ke-size=&quot;size20&quot;&gt;(2) 형태 정보 반영&lt;/h4&gt;
&lt;p data-end=&quot;3180&quot; data-start=&quot;3118&quot; data-ke-size=&quot;size16&quot;&gt;접두사, 접미사, 어근 같은 정보가 벡터에 반영된다.&lt;br /&gt;따라서 굴절이 많거나 파생어가 많은 언어에서 유리하다.&lt;/p&gt;
&lt;p data-end=&quot;3184&quot; data-start=&quot;3182&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3238&quot; data-start=&quot;3185&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3217&quot; data-start=&quot;3185&quot; data-section-id=&quot;1hi8ays&quot;&gt;teach, teacher, teaching&lt;/li&gt;
&lt;li data-end=&quot;3238&quot; data-start=&quot;3218&quot; data-section-id=&quot;keoten&quot;&gt;happy, unhappy&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3276&quot; data-start=&quot;3240&quot; data-ke-size=&quot;size16&quot;&gt;이런 단어들의 관계를 Word2Vec보다 더 잘 반영할 수 있다.&lt;/p&gt;
&lt;h4 data-end=&quot;3296&quot; data-start=&quot;3278&quot; data-ke-size=&quot;size20&quot;&gt;(3) 희귀 단어에 강함&lt;/h4&gt;
&lt;p data-end=&quot;3404&quot; data-start=&quot;3297&quot; data-ke-size=&quot;size16&quot;&gt;등장 빈도가 낮은 단어는 Word2Vec에서 좋은 벡터를 학습하기 어렵다.&lt;br /&gt;반면 FastText는 서브워드 정보를 활용하므로 희귀 단어에 대해서도 상대적으로 안정적인 표현을 만들 수 있다.&lt;/p&gt;
&lt;h3 data-end=&quot;3415&quot; data-start=&quot;3406&quot; data-section-id=&quot;6jp6tf&quot; data-ke-size=&quot;size23&quot;&gt;4) 한계&lt;/h3&gt;
&lt;p data-end=&quot;3569&quot; data-start=&quot;3416&quot; data-ke-size=&quot;size16&quot;&gt;물론 FastText가 항상 Word2Vec보다 절대적으로 좋은 것은 아니다.&lt;br /&gt;문자 단위 정보를 활용하기 때문에 계산량이 조금 더 늘 수 있고, 문맥 자체를 깊게 반영하는 모델은 아니다.&lt;br /&gt;즉, FastText는 &lt;b&gt;형태 정보에는 강하지만 문맥 기반 표현은 아니다&lt;/b&gt;.&lt;/p&gt;
&lt;h3 data-end=&quot;3577&quot; data-start=&quot;3571&quot; data-section-id=&quot;1hrqjbz&quot; data-ke-size=&quot;size23&quot;&gt;정리&lt;/h3&gt;
&lt;p data-end=&quot;3718&quot; data-start=&quot;3578&quot; data-ke-size=&quot;size16&quot;&gt;Word2Vec은 &lt;b&gt;단어를 하나의 단위&lt;/b&gt;로 임베딩하고, FastText는 &lt;b&gt;단어 내부의 문자 조각(subword)&lt;/b&gt;까지 활용한다.&lt;br /&gt;그래서 FastText는 특히 &lt;b&gt;희귀 단어, 형태 변화가 많은 언어, OOV 문제&lt;/b&gt;에서 강점을 가진다.&lt;/p&gt;
&lt;hr data-end=&quot;3723&quot; data-start=&quot;3720&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3781&quot; data-start=&quot;3725&quot; data-section-id=&quot;lxxz7v&quot; data-ke-size=&quot;size26&quot;&gt;3. Attention 메커니즘이 Seq2Seq 모델의 어떤 문제를 해결하는 데 도움이 되나요?&lt;/h2&gt;
&lt;p data-end=&quot;3855&quot; data-start=&quot;3783&quot; data-ke-size=&quot;size16&quot;&gt;Attention은 Seq2Seq 모델의 가장 큰 약점 중 하나였던 &lt;b&gt;고정 길이 문맥 벡터의 한계&lt;/b&gt;를 해결하기 위해 등장했다.&lt;/p&gt;
&lt;h3 data-end=&quot;3878&quot; data-start=&quot;3857&quot; data-section-id=&quot;1ogh868&quot; data-ke-size=&quot;size23&quot;&gt;1) Seq2Seq의 기본 구조&lt;/h3&gt;
&lt;p data-end=&quot;3908&quot; data-start=&quot;3879&quot; data-ke-size=&quot;size16&quot;&gt;기본적인 Seq2Seq는 다음과 같은 흐름을 가진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3987&quot; data-start=&quot;3910&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3951&quot; data-start=&quot;3910&quot; data-section-id=&quot;u2ol9c&quot;&gt;&lt;b&gt;Encoder&lt;/b&gt;가 입력 문장을 읽어 하나의 고정 길이 벡터로 압축&lt;/li&gt;
&lt;li data-end=&quot;3987&quot; data-start=&quot;3952&quot; data-section-id=&quot;8gkwzy&quot;&gt;&lt;b&gt;Decoder&lt;/b&gt;가 그 벡터를 바탕으로 출력 문장을 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4068&quot; data-start=&quot;3989&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 번역 모델에서는,&lt;br /&gt;입력 문장 전체를 Encoder가 하나의 벡터로 요약하고, Decoder는 그 정보만 보고 번역 문장을 생성한다.&lt;/p&gt;
&lt;h3 data-end=&quot;4092&quot; data-start=&quot;4070&quot; data-section-id=&quot;1wu013&quot; data-ke-size=&quot;size23&quot;&gt;2) 기존 Seq2Seq의 문제점&lt;/h3&gt;
&lt;p data-end=&quot;4164&quot; data-start=&quot;4093&quot; data-ke-size=&quot;size16&quot;&gt;문장이 짧을 때는 괜찮지만, 문장이 길어질수록 문제가 생긴다.&lt;br /&gt;입력 문장의 모든 정보를 하나의 벡터에 담아야 하기 때문이다.&lt;/p&gt;
&lt;p data-end=&quot;4168&quot; data-start=&quot;4166&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4268&quot; data-start=&quot;4169&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4194&quot; data-start=&quot;4169&quot; data-section-id=&quot;14lf4wn&quot;&gt;긴 문장에서 앞부분 정보가 희석될 수 있고&lt;/li&gt;
&lt;li data-end=&quot;4222&quot; data-start=&quot;4195&quot; data-section-id=&quot;1ohd117&quot;&gt;중요한 단어가 충분히 반영되지 않을 수 있으며&lt;/li&gt;
&lt;li data-end=&quot;4268&quot; data-start=&quot;4223&quot; data-section-id=&quot;1inz7uo&quot;&gt;Decoder는 출력 시점마다 어떤 입력 부분을 참고해야 하는지 알기 어렵다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4316&quot; data-start=&quot;4270&quot; data-ke-size=&quot;size16&quot;&gt;결국 &lt;b&gt;정보 병목(information bottleneck)&lt;/b&gt; 문제가 발생한다.&lt;/p&gt;
&lt;h3 data-end=&quot;4341&quot; data-start=&quot;4318&quot; data-section-id=&quot;1hyvg02&quot; data-ke-size=&quot;size23&quot;&gt;3) Attention의 해결 방식&lt;/h3&gt;
&lt;p data-end=&quot;4489&quot; data-start=&quot;4342&quot; data-ke-size=&quot;size16&quot;&gt;Attention은 Decoder가 매 시점마다 입력 전체를 다시 참고할 수 있게 만든다.&lt;br /&gt;즉, 입력 문장을 하나의 벡터로만 압축하지 않고, Encoder의 모든 hidden state를 보관해 둔 뒤, Decoder가 현재 필요한 부분에 더 집중하도록 한다.&lt;/p&gt;
&lt;p data-end=&quot;4597&quot; data-start=&quot;4491&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 번역 중에 &quot;사과를 먹는다&quot;를 영어로 바꾸는 경우,&lt;br /&gt;eat를 생성할 때는 &quot;먹는다&quot; 쪽에,&lt;br /&gt;apple을 생성할 때는 &quot;사과&quot; 쪽에 더 높은 가중치를 둘 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;4661&quot; data-start=&quot;4599&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 &lt;b&gt;출력 단어마다 관련 있는 입력 단어에 가중치를 다르게 부여&lt;/b&gt;하는 것이 Attention의 핵심이다.&lt;/p&gt;
&lt;h3 data-end=&quot;4688&quot; data-start=&quot;4663&quot; data-section-id=&quot;vqputx&quot; data-ke-size=&quot;size23&quot;&gt;4) Attention이 해결하는 문제&lt;/h3&gt;
&lt;p data-end=&quot;4715&quot; data-start=&quot;4689&quot; data-ke-size=&quot;size16&quot;&gt;Attention은 특히 다음 문제를 완화한다.&lt;/p&gt;
&lt;h4 data-end=&quot;4740&quot; data-start=&quot;4717&quot; data-ke-size=&quot;size20&quot;&gt;(1) 고정 길이 벡터 병목 문제&lt;/h4&gt;
&lt;p data-end=&quot;4770&quot; data-start=&quot;4741&quot; data-ke-size=&quot;size16&quot;&gt;입력 전체를 하나의 벡터에 억지로 담지 않아도 된다.&lt;/p&gt;
&lt;h4 data-end=&quot;4794&quot; data-start=&quot;4772&quot; data-ke-size=&quot;size20&quot;&gt;(2) 긴 문장 처리 성능 저하&lt;/h4&gt;
&lt;p data-end=&quot;4827&quot; data-start=&quot;4795&quot; data-ke-size=&quot;size16&quot;&gt;문장이 길어져도 필요한 입력 위치를 직접 참조할 수 있다.&lt;/p&gt;
&lt;h4 data-end=&quot;4860&quot; data-start=&quot;4829&quot; data-ke-size=&quot;size20&quot;&gt;(3) 입력-출력 정렬(alignment) 문제&lt;/h4&gt;
&lt;p data-end=&quot;4898&quot; data-start=&quot;4861&quot; data-ke-size=&quot;size16&quot;&gt;출력 단어가 입력의 어느 부분과 관련되는지 더 잘 학습할 수 있다.&lt;/p&gt;
&lt;h3 data-end=&quot;4909&quot; data-start=&quot;4900&quot; data-section-id=&quot;6mwjny&quot; data-ke-size=&quot;size23&quot;&gt;5) 효과&lt;/h3&gt;
&lt;p data-end=&quot;5028&quot; data-start=&quot;4910&quot; data-ke-size=&quot;size16&quot;&gt;Attention의 도입으로 번역, 요약, 질의응답 같은 다양한 시퀀스 생성 태스크의 성능이 크게 향상되었다.&lt;br /&gt;또한 모델이 어떤 입력 부분에 주목했는지 시각화할 수 있어 해석 가능성 측면에서도 의미가 있었다.&lt;/p&gt;
&lt;h3 data-end=&quot;5036&quot; data-start=&quot;5030&quot; data-section-id=&quot;1hrqjbz&quot; data-ke-size=&quot;size23&quot;&gt;정리&lt;/h3&gt;
&lt;p data-end=&quot;5182&quot; data-start=&quot;5037&quot; data-ke-size=&quot;size16&quot;&gt;Attention은 Seq2Seq가 입력 전체를 하나의 벡터에 압축하면서 생기는 &lt;b&gt;정보 손실과 긴 문장 처리 문제&lt;/b&gt;를 해결하는 데 큰 도움을 주었다.&lt;br /&gt;즉, Decoder가 매 시점마다 입력의 중요한 부분을 선택적으로 참고할 수 있도록 만든 메커니즘이다.&lt;/p&gt;
&lt;hr data-end=&quot;5187&quot; data-start=&quot;5184&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5241&quot; data-start=&quot;5189&quot; data-section-id=&quot;12y0k2s&quot; data-ke-size=&quot;size26&quot;&gt;4. Transformer 모델은 Seq2Seq 구조와 어떤 점에서 근본적으로 다른가요?&lt;/h2&gt;
&lt;p data-end=&quot;5392&quot; data-start=&quot;5243&quot; data-ke-size=&quot;size16&quot;&gt;Transformer는 Seq2Seq와 마찬가지로 입력 시퀀스를 받아 출력 시퀀스를 생성할 수 있는 구조이지만, 내부 동작 원리는 매우 다르다.&lt;br /&gt;가장 큰 차이는 &lt;b&gt;순환 구조(RNN)에 의존하지 않고, Self-Attention을 중심으로 동작한다는 점&lt;/b&gt;이다.&lt;/p&gt;
&lt;h3 data-end=&quot;5429&quot; data-start=&quot;5394&quot; data-section-id=&quot;qufunq&quot; data-ke-size=&quot;size23&quot;&gt;1) 기존 Seq2Seq의 기반: RNN/LSTM/GRU&lt;/h3&gt;
&lt;p data-end=&quot;5502&quot; data-start=&quot;5430&quot; data-ke-size=&quot;size16&quot;&gt;전통적인 Seq2Seq는 보통 RNN, LSTM, GRU를 기반으로 구성된다.&lt;br /&gt;이 구조는 입력을 순서대로 한 단어씩 처리한다.&lt;/p&gt;
&lt;p data-end=&quot;5506&quot; data-start=&quot;5504&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5567&quot; data-start=&quot;5507&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5517&quot; data-start=&quot;5507&quot; data-section-id=&quot;1c7srfv&quot;&gt;앞 단어를 읽고&lt;/li&gt;
&lt;li data-end=&quot;5530&quot; data-start=&quot;5518&quot; data-section-id=&quot;1tulwo5&quot;&gt;그다음 단어를 읽고&lt;/li&gt;
&lt;li data-end=&quot;5567&quot; data-start=&quot;5531&quot; data-section-id=&quot;wmwzm3&quot;&gt;이전 hidden state를 다음 시점으로 넘기는 방식이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5610&quot; data-start=&quot;5569&quot; data-ke-size=&quot;size16&quot;&gt;이 방식은 순서를 자연스럽게 반영할 수 있지만, 다음과 같은 한계가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5660&quot; data-start=&quot;5612&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5624&quot; data-start=&quot;5612&quot; data-section-id=&quot;4g41vo&quot;&gt;병렬 처리가 어렵다&lt;/li&gt;
&lt;li data-end=&quot;5643&quot; data-start=&quot;5625&quot; data-section-id=&quot;1h66tgg&quot;&gt;긴 거리 의존성 학습이 어렵다&lt;/li&gt;
&lt;li data-end=&quot;5660&quot; data-start=&quot;5644&quot; data-section-id=&quot;18pwcxp&quot;&gt;학습 속도가 느릴 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;5700&quot; data-start=&quot;5662&quot; data-section-id=&quot;sh8bez&quot; data-ke-size=&quot;size23&quot;&gt;2) Transformer의 기반: Self-Attention&lt;/h3&gt;
&lt;p data-end=&quot;5818&quot; data-start=&quot;5701&quot; data-ke-size=&quot;size16&quot;&gt;Transformer는 RNN을 사용하지 않는다.&lt;br /&gt;대신 문장 전체를 한 번에 보고, 각 단어가 다른 모든 단어와 얼마나 관련 있는지를 계산한다.&lt;br /&gt;이 핵심 메커니즘이 &lt;b&gt;Self-Attention&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;5972&quot; data-start=&quot;5820&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 &quot;The animal didn't cross the street because it was tired&quot;라는 문장에서&lt;br /&gt;it이 무엇을 가리키는지 이해하려면 문장 전체를 봐야 한다.&lt;br /&gt;Transformer는 이런 관계를 문장 전체 단위에서 직접 계산한다.&lt;/p&gt;
&lt;h3 data-end=&quot;5989&quot; data-start=&quot;5974&quot; data-section-id=&quot;1ot3dgt&quot; data-ke-size=&quot;size23&quot;&gt;3) 근본적인 차이점&lt;/h3&gt;
&lt;h4 data-end=&quot;6014&quot; data-start=&quot;5991&quot; data-ke-size=&quot;size20&quot;&gt;(1) 순차 처리 vs 병렬 처리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6087&quot; data-start=&quot;6015&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6049&quot; data-start=&quot;6015&quot; data-section-id=&quot;54y3hv&quot;&gt;&lt;b&gt;Seq2Seq(RNN 기반)&lt;/b&gt;: 단어를 순서대로 처리&lt;/li&gt;
&lt;li data-end=&quot;6087&quot; data-start=&quot;6050&quot; data-section-id=&quot;uezz9k&quot;&gt;&lt;b&gt;Transformer&lt;/b&gt;: 전체 시퀀스를 한 번에 처리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;6135&quot; data-start=&quot;6089&quot; data-ke-size=&quot;size16&quot;&gt;이 차이 때문에 Transformer는 학습 속도와 효율 면에서 큰 장점을 가진다.&lt;/p&gt;
&lt;h4 data-end=&quot;6169&quot; data-start=&quot;6137&quot; data-ke-size=&quot;size20&quot;&gt;(2) 고정된 순환 상태 vs 직접적인 관계 계산&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6260&quot; data-start=&quot;6170&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6209&quot; data-start=&quot;6170&quot; data-section-id=&quot;1y6ez1j&quot;&gt;RNN 기반 모델은 이전 hidden state를 통해 정보를 전달&lt;/li&gt;
&lt;li data-end=&quot;6260&quot; data-start=&quot;6210&quot; data-section-id=&quot;1j5paql&quot;&gt;Transformer는 Self-Attention으로 모든 단어 쌍의 관계를 직접 계산&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;6293&quot; data-start=&quot;6262&quot; data-ke-size=&quot;size16&quot;&gt;즉, 멀리 떨어진 단어 관계도 더 쉽게 포착할 수 있다.&lt;/p&gt;
&lt;h4 data-end=&quot;6315&quot; data-start=&quot;6295&quot; data-ke-size=&quot;size20&quot;&gt;(3) 위치 정보 처리 방식&lt;/h4&gt;
&lt;p data-end=&quot;6441&quot; data-start=&quot;6316&quot; data-ke-size=&quot;size16&quot;&gt;RNN은 순서대로 읽기 때문에 위치 정보가 구조 자체에 내장되어 있다.&lt;br /&gt;반면 Transformer는 병렬 처리하므로 단어 순서를 별도로 알려줘야 한다.&lt;br /&gt;이를 위해 &lt;b&gt;Positional Encoding&lt;/b&gt;을 사용한다.&lt;/p&gt;
&lt;h3 data-end=&quot;6465&quot; data-start=&quot;6443&quot; data-section-id=&quot;1hvkai5&quot; data-ke-size=&quot;size23&quot;&gt;4) Transformer의 장점&lt;/h3&gt;
&lt;h4 data-end=&quot;6483&quot; data-start=&quot;6467&quot; data-ke-size=&quot;size20&quot;&gt;(1) 병렬화에 유리&lt;/h4&gt;
&lt;p data-end=&quot;6506&quot; data-start=&quot;6484&quot; data-ke-size=&quot;size16&quot;&gt;GPU를 활용한 대규모 학습에 적합하다.&lt;/p&gt;
&lt;h4 data-end=&quot;6532&quot; data-start=&quot;6508&quot; data-ke-size=&quot;size20&quot;&gt;(2) 긴 문맥 의존성 처리에 강함&lt;/h4&gt;
&lt;p data-end=&quot;6556&quot; data-start=&quot;6533&quot; data-ke-size=&quot;size16&quot;&gt;멀리 떨어진 단어 간 관계를 잘 포착한다.&lt;/p&gt;
&lt;h4 data-end=&quot;6574&quot; data-start=&quot;6558&quot; data-ke-size=&quot;size20&quot;&gt;(3) 확장성이 좋음&lt;/h4&gt;
&lt;p data-end=&quot;6618&quot; data-start=&quot;6575&quot; data-ke-size=&quot;size16&quot;&gt;대규모 데이터와 파라미터로 확장하기 쉽기 때문에 현대 LLM의 기반이 되었다.&lt;/p&gt;
&lt;h3 data-end=&quot;6651&quot; data-start=&quot;6620&quot; data-section-id=&quot;1w7duzz&quot; data-ke-size=&quot;size23&quot;&gt;5) Transformer와 Seq2Seq의 관계&lt;/h3&gt;
&lt;p data-end=&quot;6813&quot; data-start=&quot;6652&quot; data-ke-size=&quot;size16&quot;&gt;엄밀히 말하면 Transformer도 Encoder-Decoder 구조를 가질 수 있으므로 넓은 의미에서는 Seq2Seq 작업을 수행한다.&lt;br /&gt;하지만 전통적인 Seq2Seq와 비교했을 때, 핵심 차이는 &lt;b&gt;순환 기반 처리에서 Attention 기반 처리로 패러다임이 바뀌었다는 점&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;6817&quot; data-start=&quot;6815&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6889&quot; data-start=&quot;6818&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6851&quot; data-start=&quot;6818&quot; data-section-id=&quot;chl6ig&quot;&gt;전통적 Seq2Seq: &lt;b&gt;순서대로 읽고 기억을 전달&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;6889&quot; data-start=&quot;6852&quot; data-section-id=&quot;16fsvt&quot;&gt;Transformer: &lt;b&gt;전체를 한 번에 보고 관계를 계산&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;6906&quot; data-start=&quot;6891&quot; data-ke-size=&quot;size16&quot;&gt;이 차이가 가장 본질적이다.&lt;/p&gt;
&lt;h3 data-end=&quot;6914&quot; data-start=&quot;6908&quot; data-section-id=&quot;1hrqjbz&quot; data-ke-size=&quot;size23&quot;&gt;정리&lt;/h3&gt;
&lt;p data-end=&quot;7085&quot; data-start=&quot;6915&quot; data-ke-size=&quot;size16&quot;&gt;Transformer는 Seq2Seq와 같은 시퀀스 변환 문제를 다루지만,&lt;br /&gt;RNN 기반의 순차 처리 대신 &lt;b&gt;Self-Attention 기반의 병렬 처리&lt;/b&gt;를 사용한다.&lt;br /&gt;이로 인해 긴 문맥 처리, 학습 효율, 확장성에서 큰 발전을 이루었고, 오늘날의 BERT, GPT 같은 모델로 이어지게 되었다.&lt;/p&gt;
&lt;hr data-end=&quot;7090&quot; data-start=&quot;7087&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;7097&quot; data-start=&quot;7092&quot; data-section-id=&quot;20h5rq&quot;&gt;마무리&lt;/h1&gt;
&lt;p data-end=&quot;7300&quot; data-start=&quot;7099&quot; data-ke-size=&quot;size16&quot;&gt;이번 내용을 정리하면서 느낀 점은 자연어처리 모델의 발전 흐름이 꽤 분명하다는 것이다.&lt;br /&gt;초기에는 텍스트를 정제하고 단어를 벡터화하는 것이 중요했다면, 이후에는 단어 내부 구조를 반영하는 FastText가 등장했고, Seq2Seq의 한계를 보완하는 Attention이 나왔으며, 결국 Transformer가 등장하면서 현재의 대규모 언어모델 시대로 이어졌다.&lt;/p&gt;
&lt;p data-end=&quot;7396&quot; data-start=&quot;7302&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;&lt;b&gt;전처리 &amp;rarr; 임베딩 &amp;rarr; Attention &amp;rarr; Transformer&lt;/b&gt;&lt;br /&gt;이 흐름을 이해하면 현대 NLP와 LLM의 기본 구조를 훨씬 쉽게 받아들일 수 있다.&lt;/p&gt;</description>
      <category>스프린트미션</category>
      <author>goodella</author>
      <guid isPermaLink="true">https://ahnella2026.tistory.com/13</guid>
      <comments>https://ahnella2026.tistory.com/13#entry13comment</comments>
      <pubDate>Mon, 13 Apr 2026 03:51:47 +0900</pubDate>
    </item>
    <item>
      <title>위클리페이퍼 #9</title>
      <link>https://ahnella2026.tistory.com/12</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-path-to-node=&quot;1&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size26&quot;&gt;1. Semantic Segmentation vs. Classification&lt;/h2&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;이미지 분석의 가장 기초적인 두 작업은 데이터를 바라보는 **해상도(Granularity)**에서 차이가 발생합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;Image Classification (분류):&lt;/b&gt; 이미지 전체를 하나의 라벨로 정의합니다. &quot;이 사진 안에 강아지가 있는가?&quot;를 묻습니다. 공간 정보는 소실되고 특징(Feature)의 존재 여부에 집중합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;Semantic Segmentation (의미론적 분할):&lt;/b&gt; 이미지 내의 &lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;4,1,0&quot;&gt;모든 픽셀&lt;/b&gt;에 대해 클래스를 할당합니다. &quot;이 픽셀이 강아지의 일부인가, 배경인가?&quot;를 묻습니다. 객체의 위치와 경계선을 정확히 파악해야 하므로 공간 정보 보존이 필수적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-path-to-node=&quot;5&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;5,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0&quot;&gt;[Design Intent]&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5,0&quot; data-ke-size=&quot;size16&quot;&gt;Classification은 정보를 압축하여 추상화하는 것이 목적이지만, Segmentation은 압축된 정보를 다시 원래의 해상도로 복원(Up-sampling)하는 고도의 연산 설계가 필요합니다. 이는 백엔드에서 대용량 데이터를 집계(Aggregate)만 할 것인지, 다시 상세 이력으로 풀어서 제공할 것인지의 설계 차이와 맥락을 같이 합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-path-to-node=&quot;6&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size26&quot;&gt;2. Fully Convolutional Networks (FCN)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;FCN은 현대 Segmentation 모델의 조상 격으로, 기존 CNN 분류 모델의 한계를 '구조적 전환'으로 해결했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;핵심 특징:&lt;/b&gt; 기존 CNN 끝단에 붙던 &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;9,0,0&quot;&gt;Fully Connected Layer(FC Layer)를 제거&lt;/b&gt;하고, 이를 &lt;span data-index-in-node=&quot;63&quot; data-math=&quot;1 \times 1&quot;&gt;$1 \times 1$&lt;/span&gt; Convolution으로 대체했습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;차이점:&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;9,1,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0,0&quot;&gt;입력 사이즈의 자유:&lt;/b&gt; FC Layer가 없으므로 입력 이미지 크기에 제한을 받지 않습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,1,0&quot;&gt;공간 정보 유지:&lt;/b&gt; 1차원 벡터로 펼치지 않고 2차원 특징 맵(Feature Map)을 유지하므로, 픽셀 위치 정보를 끝까지 보존할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,2,0&quot;&gt;Transposed Convolution:&lt;/b&gt; 줄어든 특징 맵을 다시 키우는 과정을 통해 최종적으로 입력과 같은 크기의 Segmentation Map을 생성합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;10&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size26&quot;&gt;3. GAN (Generative Adversarial Networks)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;GAN은 두 모델이 서로 경쟁하며 성장하는 &lt;b data-index-in-node=&quot;24&quot; data-path-to-node=&quot;12&quot;&gt;게임 이론(Game Theory)&lt;/b&gt; 기반의 아키텍처입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;생성자 (Generator):&lt;/b&gt; 무작위 노이즈로부터 가짜 데이터를 생성합니다. 판별자를 속이는 것이 목표입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;판별자 (Discriminator):&lt;/b&gt; 들어온 데이터가 실제 데이터(Real)인지 생성자가 만든 가짜(Fake)인지 구분합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot;&gt;학습 원리:&lt;/b&gt; 생성자는 판별자를 속이려 하고, 판별자는 더 정교하게 가짜를 잡아내려 합니다. 이 과정에서 생성자는 실제 데이터의 분포를 학습하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;14&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size26&quot;&gt;4. Diffusion Model의 활용과 장점&lt;/h2&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;최근 생성 AI의 대세인 Diffusion 모델은 GAN과는 완전히 다른 &lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;16&quot;&gt;확률적 접근&lt;/b&gt;을 취합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;활용 방식:&lt;/b&gt; 데이터에 점진적으로 노이즈를 추가하여 완전한 노이즈 상태로 만든 뒤(&lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;17,0,0&quot;&gt;Forward Process&lt;/b&gt;), 이를 다시 역으로 계산하여 노이즈를 제거하며 데이터를 복원(&lt;b data-index-in-node=&quot;96&quot; data-path-to-node=&quot;17,0,0&quot;&gt;Reverse Process&lt;/b&gt;)하는 과정을 학습합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;주요 장점:&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;17,1,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,1,0,0&quot;&gt;학습 안정성:&lt;/b&gt; GAN은 생성자와 판별자의 균형이 깨지면 학습이 무너지는 'Mode Collapse' 문제가 빈번하지만, Diffusion은 목적 함수가 명확하여 학습이 훨씬 안정적입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,1,1,0&quot;&gt;고품질 생성:&lt;/b&gt; 데이터의 전체적인 분포를 더 세밀하게 학습하므로, GAN보다 훨씬 정교하고 다양한 결과물을 만들어냅니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>스프린트미션</category>
      <author>goodella</author>
      <guid isPermaLink="true">https://ahnella2026.tistory.com/12</guid>
      <comments>https://ahnella2026.tistory.com/12#entry12comment</comments>
      <pubDate>Mon, 16 Mar 2026 09:03:54 +0900</pubDate>
    </item>
    <item>
      <title>위클리 페이퍼 8</title>
      <link>https://ahnella2026.tistory.com/11</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-path-to-node=&quot;1&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size26&quot;&gt;1. YOLO(You Only Look Once) 모델의 주요 특징과 장점&lt;/h2&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;YOLO&lt;/b&gt;는 객체 인식(Object Detection) 분야에서 한 획을 그은 모델로, 이름처럼 이미지를 &lt;b data-index-in-node=&quot;58&quot; data-path-to-node=&quot;3&quot;&gt;단 한 번만 보고&lt;/b&gt; 그 안에 무엇이 어디에 있는지 즉시 찾아내는 방식입니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;주요 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;One-Stage Detector:&lt;/b&gt; 기존 모델들이 물체가 있을 법한 위치를 먼저 찾고(Region Proposal) 나중에 분류(Classification)를 하던 것과 달리, YOLO는 이 과정을 하나의 네트워크에서 동시에 수행합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;Grid 기반 검출:&lt;/b&gt; 이미지를 일정 크기의 그리드(Grid)로 나누고, 각 그리드 셀에서 물체의 중심점과 크기(Bounding Box), 그리고 해당 물체가 무엇일 확률을 직접 예측합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;Global Context 활용:&lt;/b&gt; 이미지 전체를 한꺼번에 학습하기 때문에 물체뿐만 아니라 주변 배경의 정보까지 함께 파악하여, 배경을 물체로 오인하는 오류가 상대적으로 적습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;주요 장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;압도적인 실시간성:&lt;/b&gt; 연산 과정이 매우 단순하고 효율적이어서 초당 프레임 수(FPS)가 매우 높습니다. 이는 자율주행이나 실시간 보안 관제 시스템에 가장 적합한 이유가 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;높은 범용성:&lt;/b&gt; 일반적인 사진 데이터뿐만 아니라 예술 작품이나 자연 경관 등 새로운 도메인의 이미지에서도 특징을 아주 잘 잡아내어 일반화 성능이 뛰어납니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;8&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size26&quot;&gt;2. mAP(mean Average Precision)의 개념과 활용&lt;/h2&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;객체 인식 모델의 성능을 단순히 '정확도'로만 평가하기에는 한계가 있습니다. 이를 보완하기 위해 &lt;b data-index-in-node=&quot;54&quot; data-path-to-node=&quot;10&quot;&gt;mAP&lt;/b&gt;라는 정교한 평가지표를 사용합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;mAP의 핵심 개념&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;Precision(정밀도) &amp;amp; Recall(재현율):&lt;/b&gt; 모델이 '정답'이라고 한 것 중 실제 정답 비율(Precision)과, 실제 정답들 중 모델이 찾아낸 비율(Recall)을 먼저 계산합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;AP(Average Precision):&lt;/b&gt; 정밀도와 재현율 사이의 관계를 나타낸 &lt;b data-index-in-node=&quot;44&quot; data-path-to-node=&quot;12,1,0&quot;&gt;PR 곡선(Precision-Recall Curve)&lt;/b&gt; 하단의 면적을 의미하며, 특정 클래스에 대한 모델의 성능을 수치화한 것입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,2,0&quot;&gt;mAP(mean AP):&lt;/b&gt; 각 클래스별로 계산된 AP 값들의 &lt;b data-index-in-node=&quot;33&quot; data-path-to-node=&quot;12,2,0&quot;&gt;산술 평균&lt;/b&gt;을 낸 최종 점수입니다. 이 수치가 높을수록 모델이 여러 사물을 골고루 잘 맞춘다는 뜻입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;객체 인식에서의 활용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;모델 간 성능 비교:&lt;/b&gt; 서로 다른 알고리즘(예: YOLO v8 vs v10)의 우열을 가릴 때 객관적인 벤치마크 지표로 활용됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;임계값(Threshold) 최적화:&lt;/b&gt; 예측한 박스가 정답과 얼마나 겹쳐야 맞춘 것으로 인정할지(IoU) 기준을 정하고, 그에 따른 mAP 변화를 분석하여 최적의 모델 설정을 찾습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,2,0&quot;&gt;학습 조기 종료 지표:&lt;/b&gt; 에폭(Epoch)이 진행됨에 따라 mAP가 더 이상 상승하지 않는 지점을 포착하여 과적합(Overfitting)을 방지하는 기준으로 삼습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;17&quot; data-ke-style=&quot;style1&quot;&gt;&lt;br /&gt;딥러닝 시스템 설계 시 가장 중요한 것은 성능(mAP)과 속도(Latency) 사이의 Trade-off&lt;br /&gt;를 이해하는 것입니다.YOLO는 약간의 정확도를 희생하더라도 실시간성을 확보하여 '현장에서 쓸 수 있는 AI'를 만드는 데 초점을 맞추었습니다. 따라서 단순히 높은 mAP 수치에만 집착하기보다, 실제 서비스가 돌아갈 하드웨어 환경과 실시간 요구사항을 고려하여 가장 적합한 모델 파라미터를 결정할 수 있는 안목이 중요합니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;</description>
      <category>스프린트미션</category>
      <author>goodella</author>
      <guid isPermaLink="true">https://ahnella2026.tistory.com/11</guid>
      <comments>https://ahnella2026.tistory.com/11#entry11comment</comments>
      <pubDate>Mon, 9 Mar 2026 01:36:36 +0900</pubDate>
    </item>
  </channel>
</rss>