<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩스뮤</title>
    <link>https://codingsmu.tistory.com/</link>
    <description>NLP Engineer</description>
    <language>ko</language>
    <pubDate>Fri, 3 Jul 2026 20:01:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>계속지나가기</managingEditor>
    <image>
      <title>코딩스뮤</title>
      <url>https://tistory1.daumcdn.net/tistory/3515523/attach/30d15c1e5ac74eeca43ba2f2ae79035f</url>
      <link>https://codingsmu.tistory.com</link>
    </image>
    <item>
      <title>[Claude code] 클로드 코드 사용량 모니터링 claude-monitor</title>
      <link>https://codingsmu.tistory.com/189</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이전 글에서는 cluade를 설치 및 기본적인 사용 방법에 대해 알아봤다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codingsmu.tistory.com/185&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codingsmu.tistory.com/185&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1778820372002&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Claude code] 설치 및 사용법 Vscode, Terminal&quot; data-og-description=&quot;드디어 회사 정책이 바뀌어서 claude code를 개발 서버에서 사용할 수 있게 되었다.(지금까지 계속 chatgpt에 무지성 코드 복사 붙여넣기 했던거는 안 비밀...) 돈을 지원해주진 않지만 그래도 허용해&quot; data-og-host=&quot;codingsmu.tistory.com&quot; data-og-source-url=&quot;https://codingsmu.tistory.com/185&quot; data-og-url=&quot;https://codingsmu.tistory.com/185&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b1Mc72/dJMb9aKJ9lG/tLBNfCwisDQbdQPQebd33K/img.png?width=800&amp;amp;height=320&amp;amp;face=0_0_800_320,https://scrap.kakaocdn.net/dn/rifEJ/dJMb9gxqvwX/RbKLcnGYgHsF6ipzljNKd1/img.png?width=800&amp;amp;height=320&amp;amp;face=0_0_800_320,https://scrap.kakaocdn.net/dn/bCNRMw/dJMb83kx3Lx/KGKfCihRsRkQOgdP2DYcBk/img.png?width=1686&amp;amp;height=962&amp;amp;face=0_0_1686_962&quot;&gt;&lt;a href=&quot;https://codingsmu.tistory.com/185&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codingsmu.tistory.com/185&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b1Mc72/dJMb9aKJ9lG/tLBNfCwisDQbdQPQebd33K/img.png?width=800&amp;amp;height=320&amp;amp;face=0_0_800_320,https://scrap.kakaocdn.net/dn/rifEJ/dJMb9gxqvwX/RbKLcnGYgHsF6ipzljNKd1/img.png?width=800&amp;amp;height=320&amp;amp;face=0_0_800_320,https://scrap.kakaocdn.net/dn/bCNRMw/dJMb83kx3Lx/KGKfCihRsRkQOgdP2DYcBk/img.png?width=1686&amp;amp;height=962&amp;amp;face=0_0_1686_962');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Claude code] 설치 및 사용법 Vscode, Terminal&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;드디어 회사 정책이 바뀌어서 claude code를 개발 서버에서 사용할 수 있게 되었다.(지금까지 계속 chatgpt에 무지성 코드 복사 붙여넣기 했던거는 안 비밀...) 돈을 지원해주진 않지만 그래도 허용해&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codingsmu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 글에서는 claude code 사용량을 편하게 모니터링 할 수 있는 claude-monitor에 대해 소개하고자한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;claude 토큰 사용량을 모니터링 하고 싶다면, claude-monitor 강추&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;claude 공식 web에서도 사용량을 트래킹할 수 있지만 꽤나 번거롭다. claude-monitor를 이용한다면, 터미널에서 실시간 사용량을 확인할 수 있다. (gpu/cpu 사용량 모니터링 도구인 htop과 비슷한 느낌이다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저&amp;nbsp; claude-monitor를 사용하기 위해서는 패키지 설치부터 해야한다. pip로 설치 후 claude-monitor를 입력하면, 실시간 claude code토큰 사용량, 비용 등을 모니터링 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778819841421&quot; class=&quot;crmsh&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;pip install claude-monitor
claude-monitor&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 Pro플랜이고, 시간을 한국 타임으로 보고 싶다면 아래 커맨드를 입력하면 된다&lt;/p&gt;
&lt;pre id=&quot;code_1778819841422&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;claude-monitor --plan pro --timezone Asia/Seoul&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l8vyc/dJMcahjIXk2/BTbRzQbmBfgktkn4ylNwrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l8vyc/dJMcahjIXk2/BTbRzQbmBfgktkn4ylNwrk/img.png&quot; data-alt=&quot;claude-monitor 화면 UI&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l8vyc/dJMcahjIXk2/BTbRzQbmBfgktkn4ylNwrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl8vyc%2FdJMcahjIXk2%2FBTbRzQbmBfgktkn4ylNwrk%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;700&quot; height=&quot;318&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;claude-monitor 화면 UI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 상태창이 의미하는 바는 아래와 같다:&lt;/p&gt;
&lt;table id=&quot;3612b400-ac99-80aa-b0c2-ca3ac6dd74f5&quot; style=&quot;border-collapse: collapse; width: 100%; height: 264px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;3612b400-ac99-80db-8e42-d66600416a74&quot; style=&quot;height: 18px;&quot;&gt;
&lt;td id=&quot;q&amp;#96;eB&quot; style=&quot;width: 21.7442%; height: 18px;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;ZQQw&quot; style=&quot;width: 78.2558%; height: 18px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;3612b400-ac99-80bb-a48e-c21314cf7baf&quot; style=&quot;height: 37px;&quot;&gt;
&lt;td id=&quot;q&amp;#96;eB&quot; style=&quot;width: 21.7442%; height: 37px;&quot;&gt;&lt;b&gt;  Cost Usage&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;ZQQw&quot; style=&quot;width: 78.2558%; height: 37px;&quot;&gt;&lt;b&gt;비용 사용량으로&lt;/b&gt; 현재까지 사용한 금액과 설정된 예산 한도에 해당 &lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;(Time Reset후 초기화 됨)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(이미지상에서는 총 $18.00 중 $0.14(0.8%)를 사용했음을 보여줌)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;3612b400-ac99-80e6-9a33-df42010ebd79&quot; style=&quot;height: 37px;&quot;&gt;
&lt;td id=&quot;q&amp;#96;eB&quot; style=&quot;width: 21.7442%; height: 37px;&quot;&gt;&lt;b&gt;  Token Usage&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;ZQQw&quot; style=&quot;width: 78.2558%; height: 37px;&quot;&gt;&lt;b&gt;토큰 사용량으로&amp;nbsp;&lt;/b&gt;현재 기간 내에 사용된 토큰 수에 해당 &lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;(Time Reset후 초기화 됨)&lt;span&gt;&amp;nbsp;&lt;br /&gt;100%가 넘어도 동작은 하나, 속도가 굉장히 느려짐 (300~400% 까지 사용하면 time reset 전까지 사용 제한이 걸림)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;(19,000 토큰 중 2,818개(14.8%)를 소비한 상태임)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;3612b400-ac99-80f2-b998-d2ab813deb0e&quot; style=&quot;height: 20px;&quot;&gt;
&lt;td id=&quot;q&amp;#96;eB&quot; style=&quot;width: 21.7442%; height: 20px;&quot;&gt;&lt;b&gt;  Messages Usage&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;ZQQw&quot; style=&quot;width: 78.2558%; height: 20px;&quot;&gt;&lt;b&gt;메시지 횟수로&amp;nbsp;&lt;/b&gt;Claude와 주고받은 메시지 수에 해당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;3612b400-ac99-8086-bede-e68b4ec2e35c&quot; style=&quot;height: 37px;&quot;&gt;
&lt;td id=&quot;q&amp;#96;eB&quot; style=&quot;width: 21.7442%; height: 37px;&quot;&gt;&lt;b&gt;⏱️ Time to Reset&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;ZQQw&quot; style=&quot;width: 78.2558%; height: 37px;&quot;&gt;&lt;b&gt;초기화까지 남은 시간으로&amp;nbsp;&lt;/b&gt;사용량 제한(위의 지표)이 리셋되기까지 남은 시간임.&lt;br /&gt;&lt;br /&gt;(Pro-Plan의 경우 4h 1m~5h 리밋임)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;3612b400-ac99-80f3-add8-c812d99af13c&quot; style=&quot;height: 20px;&quot;&gt;
&lt;td id=&quot;q&amp;#96;eB&quot; style=&quot;width: 21.7442%; height: 20px;&quot;&gt;&lt;b&gt;  Model Distribution&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;ZQQw&quot; style=&quot;width: 78.2558%; height: 20px;&quot;&gt;&lt;b&gt;모델 분포로&amp;nbsp;&lt;/b&gt;사용 중인 Claude 모델의 종류와 비중을 나타냄&lt;br /&gt;&lt;br /&gt;(/model을 입력하면 호출 모델을 변경할 수 있다. 기본은 Sonnet)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;3612b400-ac99-800a-9355-c7c936446567&quot; style=&quot;height: 38px;&quot;&gt;
&lt;td id=&quot;q&amp;#96;eB&quot; style=&quot;width: 21.7442%; height: 38px;&quot;&gt;&lt;b&gt;  Burn Rate&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;ZQQw&quot; style=&quot;width: 78.2558%; height: 38px;&quot;&gt;&lt;b&gt;소모 속도로&amp;nbsp;&lt;/b&gt;분당 토큰 소모량(tokens/min)입니다. 현재 분당 47.0개의 토큰을 쓰고 있으며, 옆의 달팽이( ) 아이콘은 소모 속도가 매우 낮음을 의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;3612b400-ac99-809c-bc6c-c204dd970ef7&quot; style=&quot;height: 20px;&quot;&gt;
&lt;td id=&quot;q&amp;#96;eB&quot; style=&quot;width: 21.7442%; height: 20px;&quot;&gt;&lt;b&gt;  Cost Rate&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;ZQQw&quot; style=&quot;width: 78.2558%; height: 20px;&quot;&gt;&lt;b&gt;비용 발생 속도로&amp;nbsp;&lt;/b&gt;분당 발생하는 비용($/min)임. 현재 분당 약 $0.0027의 비용이 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;3612b400-ac99-8018-af33-c9a7af39d250&quot; style=&quot;height: 37px;&quot;&gt;
&lt;td id=&quot;q&amp;#96;eB&quot; style=&quot;width: 21.7442%; height: 37px;&quot;&gt;&lt;b&gt;  Predictions&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;ZQQw&quot; style=&quot;width: 78.2558%; height: 37px;&quot;&gt;&lt;b&gt;예측값으로&amp;nbsp;&lt;/b&gt;현재의 소모 속도를 유지할 경우, **Tokens will run out(토큰 소진 시간)**은 오전 5시 6분으로 예상되며, **Limit resets at(한도 리셋 시간)**은 오후 6시 정각임을 알려줍니다.&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;이 외에 추가 옵션과 자세한 내용이 궁금하다면 다음 github를 참고:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1778821662859&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - Maciek-roboblog/Claude-Code-Usage-Monitor: Real-time Claude Code usage monitor with predictions and warnings&quot; data-og-description=&quot;Real-time Claude Code usage monitor with predictions and warnings - Maciek-roboblog/Claude-Code-Usage-Monitor&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor&quot; data-og-url=&quot;https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cuyUuW/dJMb8T94E1G/FaxBLpcURS8K17JrYTf68K/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_127_1061_222,https://scrap.kakaocdn.net/dn/f22TB/dJMb8VNAB2v/IbgUKyLn0iFSPLVd4lPSdK/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_127_1061_222,https://scrap.kakaocdn.net/dn/WY6m9/dJMb8WeENWa/ekJCHQuAcohknm396lQrZ0/img.png?width=1624&amp;amp;height=714&amp;amp;face=0_0_1624_714&quot;&gt;&lt;a href=&quot;https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cuyUuW/dJMb8T94E1G/FaxBLpcURS8K17JrYTf68K/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_127_1061_222,https://scrap.kakaocdn.net/dn/f22TB/dJMb8VNAB2v/IbgUKyLn0iFSPLVd4lPSdK/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_127_1061_222,https://scrap.kakaocdn.net/dn/WY6m9/dJMb8WeENWa/ekJCHQuAcohknm396lQrZ0/img.png?width=1624&amp;amp;height=714&amp;amp;face=0_0_1624_714');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - Maciek-roboblog/Claude-Code-Usage-Monitor: Real-time Claude Code usage monitor with predictions and warnings&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Real-time Claude Code usage monitor with predictions and warnings - Maciek-roboblog/Claude-Code-Usage-Monitor&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>바이브 코딩/클로드 코드</category>
      <author>계속지나가기</author>
      <guid isPermaLink="true">https://codingsmu.tistory.com/189</guid>
      <comments>https://codingsmu.tistory.com/189#entry189comment</comments>
      <pubDate>Fri, 15 May 2026 13:34:43 +0900</pubDate>
    </item>
    <item>
      <title>[머신러닝 시스템 설계] 3 유튜브 동영상 검색</title>
      <link>https://codingsmu.tistory.com/188</link>
      <description>&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;본 게시글은 알렉스 쉬, 알리 아미니안(최종일 옮김)의 &quot;가상면접 사례로 배우는 머신러닝 시스템 설계 기초&quot;를 읽고 정리한 내용에, 개인적인 이해를 추가한 글입니다.&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Overview&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;end-to-end 관점에서 문제를 어떻게 정의하고 풀어가는지&lt;/b&gt;가 중요합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 그 중 하나인 &lt;b&gt;유튜브 동영상 검색 시스템&lt;/b&gt;을 예시로,&lt;br /&gt;텍스트 쿼리를 기반으로 관련 동영상을 찾는 ML 시스템 설계 관점에서 정리해보겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ 요구사항 명확화&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;문제: 사용자 검색어에 따라, 관련 있는 유튜브 영상을 추천하시오.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA4BTb/dJMcagZy9bR/upODkNdqUqZGeaAP3BLPXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA4BTb/dJMcagZy9bR/upODkNdqUqZGeaAP3BLPXk/img.png&quot; data-alt=&quot;쇼미더머니 + 랩신두 키워드로 검색하면 -&amp;amp;gt; 쇼미 12에 출연한 라프산두의 하이라이트가 나온다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA4BTb/dJMcagZy9bR/upODkNdqUqZGeaAP3BLPXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA4BTb%2FdJMcagZy9bR%2FupODkNdqUqZGeaAP3BLPXk%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;700&quot; height=&quot;744&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;872&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;쇼미더머니 + 랩신두 키워드로 검색하면 -&amp;gt; 쇼미 12에 출연한 라프산두의 하이라이트가 나온다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;392&quot; data-end=&quot;468&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;392&quot; data-end=&quot;468&quot;&gt;사용자의 텍스트 쿼리를 입력으로 받아, 관련있는 유튜브 동영상을 반환하는 검색 시스템을 만들어야 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;470&quot; data-end=&quot;499&quot;&gt;즉, 아래와 같은 시스템을 설계하는 것이 목표입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;501&quot; data-end=&quot;548&quot;&gt;
&lt;li data-start=&quot;501&quot; data-end=&quot;519&quot;&gt;입력: 텍스트 쿼리&lt;/li&gt;
&lt;li data-start=&quot;520&quot; data-end=&quot;548&quot;&gt;출력: 관련 동영상 리스트(ranking된 결과)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;고려해야 할 포인트들&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래의 목표를 고려하여 &lt;b&gt;사용자과 관심있어 할 유용한 동영상 검색 시스템을 설계&lt;/b&gt;하는 것이 최종 목표입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 130px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;비즈니스 목표&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;관련있는 동영상을 제공하여 조회수를 높이는 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;시스템 기능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;텍스트 쿼리 기반으로 관련 동영상을 검색하는 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;데이터&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span&gt;모델 학습을 위한 천만 개의 &amp;lt;동영상, 텍스트 쿼리&amp;gt; 쌍으로 구성된 데이터 셋이 있음.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;제약 조건&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span&gt;영어만 지원, 개인화 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;시스템 규모&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;대규모 사용자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;성능 요구사항&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span&gt;정확도 vs latency trade-off 고려&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ ML 문제로 구조화&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;비즈니스 문제를 ML 문제로 재정의해봅시다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;ML 목표로 재정의: 텍스트 쿼리와 동영상 간의 관련도를 기반으로 ranking 하는 문제&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;시스템 입출력 정의:&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 경우, I/O는 다음 처럼 생각할 수 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Input: 텍스트 쿼리 &amp;rarr; Output: 관련도 순으로 정렬된 동영상 리스트&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 시스템은 단순 classification이 아니라, 관련도가 높은 동영상을 출력하는 &lt;b&gt;Ranking 문제 (Information Retrieval) &lt;/b&gt;입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;적합한 ML 접근 방식 선택:&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;2114&quot; data-origin-height=&quot;1212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfRRof/dJMcaaE6fxB/yt5reuDYvqFHyXODjHWQrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfRRof/dJMcaaE6fxB/yt5reuDYvqFHyXODjHWQrK/img.png&quot; data-alt=&quot;개략적인 검색 시스템의 개요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfRRof/dJMcaaE6fxB/yt5reuDYvqFHyXODjHWQrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfRRof%2FdJMcaaE6fxB%2Fyt5reuDYvqFHyXODjHWQrK%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;600&quot; height=&quot;344&quot; data-origin-width=&quot;2114&quot; data-origin-height=&quot;1212&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;개략적인 검색 시스템의 개요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1352&quot; data-start=&quot;1322&quot; data-ke-size=&quot;size23&quot;&gt;1. 시각 검색 (Visual Search)&lt;/h3&gt;
&lt;p data-end=&quot;1387&quot; data-start=&quot;1354&quot; data-ke-size=&quot;size16&quot;&gt;먼저, 텍스트 쿼리와 동영상의 &lt;b&gt;시각적 콘텐츠 간 유사성에 따라 동영상의 순위&lt;/b&gt;를 매기는 &lt;b&gt;시각 검색&lt;/b&gt;이 필요합니다.&lt;/p&gt;
&lt;p data-end=&quot;1387&quot; data-start=&quot;1354&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1387&quot; data-start=&quot;1354&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로 표현 학습(Represantation Learning)을 사용하여 시각적 콘텐츠를 처리하며, 이를 동영상 검색하는데 사용합니다.&lt;/p&gt;
&lt;p data-end=&quot;1387&quot; data-start=&quot;1354&quot; data-ke-size=&quot;size16&quot;&gt;이 때, 텍스트와 동영상은 각각의 개별 인코더를 사용해 인코딩을 해야 하며, 둘 간의 유사도 점수는 개별 인코더를 통과해서 나온 값인 동영상, 텍스트 임베딩 값의 dot product를 사용하여 계산합니다. 이 값은 유사도 값이 되며, 이를 기준으로 동영상의 순위를 매깁니다.&lt;/p&gt;
&lt;p data-end=&quot;1387&quot; data-start=&quot;1354&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1387&quot; data-start=&quot;1354&quot; data-ke-size=&quot;size23&quot;&gt;2. 텍스트 검색 (Text-based Search)&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1354&quot; data-end=&quot;1387&quot; data-ke-size=&quot;size16&quot;&gt;다음으로, 텍스트 쿼리가 들어오면 텍스트 검색어와 가장 유사한 제목/설명/태그 등을 가진 동영상을 검색할 수 있도록 합니다. 이 때는 따로 모델을 사용하지 않고 아래와 같이 구축된 DB 테이블에서 검색하는 방식을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 86.0465%; height: 139px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 17.4862%; height: 20px;&quot;&gt;동영상 ID&lt;/td&gt;
&lt;td style=&quot;width: 51.4334%; height: 20px;&quot;&gt;TITLE&lt;/td&gt;
&lt;td style=&quot;width: 29.4631%; height: 20px;&quot;&gt;TAG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 17.4862%; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 51.4334%; height: 20px;&quot;&gt;우리 집 강아지 실내에서 놀기&lt;/td&gt;
&lt;td style=&quot;width: 29.4631%; height: 20px;&quot;&gt;개, 실내, 놀이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 17.4862%; height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 51.4334%; height: 19px;&quot;&gt;중학교 수영 대회&lt;/td&gt;
&lt;td style=&quot;width: 29.4631%; height: 19px;&quot;&gt;수영장, 어린이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 17.4862%; height: 20px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 51.4334%; height: 20px;&quot;&gt;일본에 있을 때 촬영한 영상 보기&lt;/td&gt;
&lt;td style=&quot;width: 29.4631%; height: 20px;&quot;&gt;여행, 일본, 브이로그&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 17.4862%; height: 20px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 51.4334%; height: 20px;&quot;&gt;스포츠카 속도 비교&lt;/td&gt;
&lt;td style=&quot;width: 29.4631%; height: 20px;&quot;&gt;자동차, 경주, 속도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 17.4862%; height: 20px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 51.4334%; height: 20px;&quot;&gt;내 원격 작업 설정&lt;/td&gt;
&lt;td style=&quot;width: 29.4631%; height: 20px;&quot;&gt;컴퓨터, 마우스, 대화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 17.4862%; height: 20px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 51.4334%; height: 20px;&quot;&gt;어젯밤 우리 집에서 개들이 파티를 즐긴 방법&lt;/td&gt;
&lt;td style=&quot;width: 29.4631%; height: 20px;&quot;&gt;고양이, 개, 가족&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1354&quot; data-end=&quot;1387&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1354&quot; data-end=&quot;1387&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1354&quot; data-end=&quot;1387&quot; data-ke-size=&quot;size16&quot;&gt;텍스트 기반 검색 구성요소를 생성하는 &lt;b&gt;대표적인 기법으로 Elastic Search에 Inverted Index&lt;/b&gt;가 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1354&quot; data-end=&quot;1387&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1354&quot; data-end=&quot;1387&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로 아는 &lt;b&gt;인덱스(Forwad Index)&lt;/b&gt;는 &quot;doc ID-내용&quot;을 매핑하여, 특정 'term'이 있는 문서를 찾고 싶다면, 문서 전체를 linear search(O(n)) 하며 특정 'term'이 있는지 찾아야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1354&quot; data-end=&quot;1387&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1354&quot; data-end=&quot;1387&quot; data-ke-size=&quot;size16&quot;&gt;반대로&lt;b&gt; 역 인덱스(Inverted Index)&lt;/b&gt;는 &quot;특정 단어-[doc ID List]&quot;를 매핑하여, 특정 'term'이 있는 문서를 찾고 싶다면 term을 키값으로, 문서 ID를 바로 찾을 수 있기 때문에 (O(1)) 훨씬 빠른 속도로 원하는 결과값을 찾을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1354&quot; data-end=&quot;1387&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1354&quot; data-end=&quot;1387&quot; data-ke-size=&quot;size16&quot;&gt;추가적인 내용은 다음 자료를 참고하시면 좋습니다: &lt;a href=&quot;https://esbook.kimjmin.net/06-text-analysis/6.1-indexing-data&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://esbook.kimjmin.net/06-text-analysis/6.1-indexing-data&lt;/a&gt;&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ 데이터 준비&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;&lt;span&gt;ML 모델 성능을 결정짓는 가장 중요한 단계 중 하나입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MQqf2/dJMcacip3AP/HChMJjR9wLsb4p1DxD29kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MQqf2/dJMcacip3AP/HChMJjR9wLsb4p1DxD29kK/img.png&quot; data-alt=&quot;데이터 준비 프로세스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MQqf2/dJMcacip3AP/HChMJjR9wLsb4p1DxD29kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMQqf2%2FdJMcacip3AP%2FHChMJjR9wLsb4p1DxD29kK%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;700&quot; height=&quot;140&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 준비 프로세스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;&lt;span&gt;데이터 준비 단계는 크게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;(1) 데이터 엔지니어링, (2) 피처 엔지니어링&lt;/b&gt;으로 나눌 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;(1) 데이터 엔지니어링&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;&lt;span&gt;데이터를 수집하고, 저장하고, 검색하고, 처리하는 전체 파이프라인을 설계하는 단계입니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이 문제에서는 이미 다음과 같은 데이터가 존재한다고 가정하기 때문에, 수집 및 정제 과정은 별도로 다루지 않겠습니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;389&quot; data-start=&quot;303&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;324&quot; data-start=&quot;303&quot;&gt;동영상 데이터 (raw video)&lt;/li&gt;
&lt;li data-end=&quot;333&quot; data-start=&quot;325&quot;&gt;텍스트 쿼리&lt;/li&gt;
&lt;li data-end=&quot;358&quot; data-start=&quot;334&quot;&gt;동영상 메타데이터 (제목, 설명, 태그)&lt;/li&gt;
&lt;li data-end=&quot;389&quot; data-start=&quot;359&quot;&gt;&amp;lt;동영상, 텍스트 쿼리&amp;gt; 매칭 데이터 (학습용)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;(2) 피처 엔지니어링&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;모델 학습을 위해서는 text, video 같은 비정형 데이터를 &lt;b&gt;수치 벡터 형태로 변환하는 과정이 필수적입니다.&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Text 데이터 처리&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;텍스트 데이터 전처리를 위한 workflow는 다음과 같습니다. raw text에 해당하는 값은 소문자 변환, 불필요한 공백 제거, 어간 추출 등의 정규화 과정은 거치고, 토큰화를 진행한 후, lookup table, hashing trick 방법등을 통해 ID로 변환하는 과정을 거쳐 숫자 벡터 값을 얻을 수 있습니다.&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;text &amp;rarr;&lt;b&gt; [정규화 &amp;rarr; 토큰화 &amp;rarr; ID 변환]&lt;/b&gt; &amp;rarr; 숫자 벡터&lt;/li&gt;
&lt;li&gt;ex: text = &quot;A person is walking in Montreal&quot;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정규화: &quot;a person walk in montreal&quot;&lt;/li&gt;
&lt;li&gt;토큰화: [&quot;a&quot;, &quot;person&quot;, &quot;walk&quot;, &quot;in&quot;, &quot;montreal&quot;]&lt;/li&gt;
&lt;li&gt;ID 변환: [33, 28, 4, 16, 99]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot; data-start=&quot;2096&quot; data-end=&quot;2120&quot;&gt;&lt;b&gt;&lt;br /&gt;2. Video 데이터 처리 &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;동영상 전처리를 위한 workflow는 다음과 같습니다.&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;video &amp;rarr;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[프레임 디코딩 &amp;rarr; 샘플 프레임 &amp;rarr; 크기 조정&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&amp;rarr; 스케일리, 정규화와 색상 모드 보정&amp;nbsp;&lt;/b&gt;]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 프레임 단위의 .npy&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1970&quot; data-origin-height=&quot;1328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY00gN/dJMcaf7qHJr/dvDIhy6wn2w4rpNdxN4xTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY00gN/dJMcaf7qHJr/dvDIhy6wn2w4rpNdxN4xTK/img.png&quot; data-alt=&quot;동영상 전처리 워크플로우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY00gN/dJMcaf7qHJr/dvDIhy6wn2w4rpNdxN4xTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY00gN%2FdJMcaf7qHJr%2FdvDIhy6wn2w4rpNdxN4xTK%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;600&quot; height=&quot;404&quot; data-origin-width=&quot;1970&quot; data-origin-height=&quot;1328&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;동영상 전처리 워크플로우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot; data-start=&quot;2183&quot; data-end=&quot;2189&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 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;4️⃣ 모델 개발&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;text, video 데이터를 모두 처리해야 되기 때문에, 개별 인코더를 사용해 각각을 임베딩(embedding)으로 변환하는 과정이 필요합니다. 즉, 텍스트와 동영상을 동일한 벡터 공간으로 매핑한 뒤, 두 벡터 간의 유사도를 계산하여 검색을 수행하는 구조를 사용합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;b&gt;(1) 텍스트 인코더&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트 인코더는 입력된 쿼리를 벡터 형태로 변환하는 역할을 하며, 크게 &lt;b&gt;통계적 방법&lt;/b&gt;과 &lt;b&gt;머신러닝 기반 방법&lt;/b&gt;으로 나눌 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;통계적&lt;span&gt;&amp;nbsp;방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;BoW(Bag of Words)&lt;/b&gt;는 문장 내 각 단어의 등장 빈도를 기반으로 벡터를 생성하는 방식으로, 구현이 간단하고 직관적이라는 장점이 있습니다. 하지만 단어의 순서를 고려하지 않기 때문에 문맥을 이해하지 못하고, 벡터가 희소(sparse)해지는 문제가 있습니다. 예를 들어, &amp;ldquo;watch TV after work&amp;rdquo;와 &amp;ldquo;work after watch TV&amp;rdquo;는 의미가 다르지만 동일한 BoW 표현을 갖게 됩니다. 자세한 내용은 다음 게시글에서 확인할 수 있습니다: &lt;a href=&quot;https://codingsmu.tistory.com/98&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codingsmu.tistory.com/98&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1777209754605&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[NLP] 단어 표현 방법 : Bag-of-Word Model(Bow)&quot; data-og-description=&quot;Bag-of-Word(BoW) Model 기계학습 알고리즘(MLA)을 자연어 처리 테스크에 사용할 때, 입력값인 텍스트는 그 자체로는 사용할 수 없다. 이산적인(discrete)한 텍스트 즉, 문자열을 연속적인(continuous) 모델이 &quot; data-og-host=&quot;codingsmu.tistory.com&quot; data-og-source-url=&quot;https://codingsmu.tistory.com/98&quot; data-og-url=&quot;https://codingsmu.tistory.com/98&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HHTox/dJMb9kmfxBX/NSzSpgR2FFs4SWBy0k3DPk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cTn9Kg/dJMb9frIghm/PMyE5rQimUKbacLYDLV29K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://codingsmu.tistory.com/98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codingsmu.tistory.com/98&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HHTox/dJMb9kmfxBX/NSzSpgR2FFs4SWBy0k3DPk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cTn9Kg/dJMb9frIghm/PMyE5rQimUKbacLYDLV29K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[NLP] 단어 표현 방법 : Bag-of-Word Model(Bow)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Bag-of-Word(BoW) Model 기계학습 알고리즘(MLA)을 자연어 처리 테스크에 사용할 때, 입력값인 텍스트는 그 자체로는 사용할 수 없다. 이산적인(discrete)한 텍스트 즉, 문자열을 연속적인(continuous) 모델이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codingsmu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;TF-IDF&lt;/b&gt;는 이러한 BoW의 단점을 일부 보완하기 위해 등장한 방법으로, 단어의 빈도뿐만 아니라 해당 단어가 전체 문서에서 얼마나 중요한지를 반영합니다. 자주 등장하지만 의미가 약한 단어(예: the, a 등 관사)의 가중치는 낮추고, 특정 문서에서만 자주 등장하는 단어의 가중치는 높이는 방식입니다. 하지만 이 역시 단어의 순서를 고려하지 못하기 때문에 문맥을 이해하는 데 한계가 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;머신러닝 기반 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이러한 한계를 극복하기 위해 실제 서비스에서는 머신러닝 기반 방법이 주로 사용됩니다.&lt;span&gt; 주로 모델을 사용하여 문장을 단어 임베딩으로 변환하고, 두 임베딩 사이의 거리로 유사도를 계산하는 방법을 사용합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Word2Vec&lt;/b&gt;은 단어 주변의 문맥 정보를 활용하여 의미적으로 유사한 단어들을 가까운 벡터 공간에 위치시킵니다. Word2Vec은 주변 단어로 중심 단어를 예측하는 CBOW 방식과, 중심 단어로 주변 단어를 예측하는 Skip-gram 방식으로 학습됩니다. 자세한 내용은 다음 게시글에서 확인할 수 있습니다: &lt;a href=&quot;https://codingsmu.tistory.com/100&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codingsmu.tistory.com/100&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1777209912606&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[NLP] 워드투벡터(Word2Vec)&quot; data-og-description=&quot;Word2Vec Model Word2Vec는 단어 간 유사도를 반영할 수 있도록 단어의 의미를 벡터화할 수 있는 방법이다. Word2Vec의 주요 아이디어는 &amp;quot;비슷한 분포를 가진 단어라면 비슷한 의미를 가질 것&amp;quot;이다 즉, 자&quot; data-og-host=&quot;codingsmu.tistory.com&quot; data-og-source-url=&quot;https://codingsmu.tistory.com/100&quot; data-og-url=&quot;https://codingsmu.tistory.com/100&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dzw5hy/dJMb85WWama/pf8hNEyOxe4qZPvkSfclK1/img.png?width=800&amp;amp;height=481&amp;amp;face=0_0_800_481,https://scrap.kakaocdn.net/dn/Dl4J6/dJMb81GZ9hC/U6uZ5p5Di7fUV4cswMJqB1/img.png?width=800&amp;amp;height=481&amp;amp;face=0_0_800_481,https://scrap.kakaocdn.net/dn/deV7D3/dJMb9jgz6r1/KicPflqrAkT3UJ5H2Xt161/img.png?width=1823&amp;amp;height=1270&amp;amp;face=0_0_1823_1270&quot;&gt;&lt;a href=&quot;https://codingsmu.tistory.com/100&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codingsmu.tistory.com/100&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dzw5hy/dJMb85WWama/pf8hNEyOxe4qZPvkSfclK1/img.png?width=800&amp;amp;height=481&amp;amp;face=0_0_800_481,https://scrap.kakaocdn.net/dn/Dl4J6/dJMb81GZ9hC/U6uZ5p5Di7fUV4cswMJqB1/img.png?width=800&amp;amp;height=481&amp;amp;face=0_0_800_481,https://scrap.kakaocdn.net/dn/deV7D3/dJMb9jgz6r1/KicPflqrAkT3UJ5H2Xt161/img.png?width=1823&amp;amp;height=1270&amp;amp;face=0_0_1823_1270');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[NLP] 워드투벡터(Word2Vec)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Word2Vec Model Word2Vec는 단어 간 유사도를 반영할 수 있도록 단어의 의미를 벡터화할 수 있는 방법이다. Word2Vec의 주요 아이디어는 &quot;비슷한 분포를 가진 단어라면 비슷한 의미를 가질 것&quot;이다 즉, 자&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codingsmu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Transformer 기반의 모델을 활용&lt;/b&gt;하는 것이 최근 가장 널리 사용되는 방법입니다. 이 방식은 문장 전체의 문맥을 고려하여 단어 임베딩을 생성할 수 있기 때문에, 기존 방법들보다 훨씬 풍부한 의미 정보를 담을 수 있습니다. 특히 검색 시스템에서는 쿼리의 의미를 정확히 이해하는 것이 중요하기 때문에, 이러한 문맥 기반 임베딩 방식이 필수적으로 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(2) 동영상 인코더&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동영상 인코더는 영상 데이터를 벡터로 변환하는 역할을 합니다. 텍스트와 달리 동영상은 시간 축을 포함한 고차원 데이터이기 때문에 처리 방식이 더 복잡합니다. 동영상 인코딩 방식은 크게 &lt;b&gt;동영상 전체를 처리하는 방법&lt;/b&gt;과 &lt;b&gt;프레임 단위로 처리하는 방법&lt;/b&gt;으로 나눌 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;동영상 수준 모델:&lt;/b&gt; 동영상 전체를 입력으로 사용하는 방식은 시간적 흐름까지 반영할 수 있다는 장점이 있지만, 계산 비용이 매우 크다는 단점이 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프레임 수준 모델: &lt;/b&gt;반면, 프레임 단위 방식은 동영상을 여러 프레임으로 나눈 뒤 각 프레임을 독립적으로 처리하는 방식입니다. 일반적으로 일정 간격으로 프레임을 샘플링한 뒤, 각 프레임을 CNN이나 ViT(Vision Transformer) 모델에 입력하여 임베딩을 생성합니다. 이후 이 프레임 임베딩들을 평균(mean pooling)이나 최대값(max pooling) 등의 방식으로 집계하여 하나의 동영상 임베딩으로 변환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 가지 방식 모두 계산 효율성이 높고 구현이 비교적 간단하지만, 시간적 정보(동작의 흐름)를 충분히 반영하지 못한다는 한계가 있습니다. 따라서 액션 인식과 같이 시간 정보가 중요한 경우에는 3D CNN이나 Transformer 기반의 시계열 모델을 추가로 사용하는 방법도 고려할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(3) 모델 학습&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트 인코더와 동영상 인코더를 학습하기 위해서는 두 임베딩 공간을 잘 정렬시키는 것이 중요합니다. 이를 위해 일반적으로&amp;nbsp;&lt;b&gt;Contrastive Learning&lt;/b&gt; 방식이 사용됩니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTj80f/dJMcaiwjMyT/xGbYKrGfHodMQsi2qkaBG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTj80f/dJMcaiwjMyT/xGbYKrGfHodMQsi2qkaBG1/img.png&quot; data-alt=&quot;{text, video} 데이터 셋의 모델 학습 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTj80f/dJMcaiwjMyT/xGbYKrGfHodMQsi2qkaBG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTj80f%2FdJMcaiwjMyT%2FxGbYKrGfHodMQsi2qkaBG1%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;700&quot; height=&quot;237&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;{text, video} 데이터 셋의 모델 학습 방법&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 아이디어는 간단합니다. 정답 쌍은(positive pair)은 임베딩 공간에서 가깝게 만들고, 관련 없는 쌍(negative pair) 은 멀어지도록 학습하는 것입니다. 이러한 방식으로 학습하면, 모델은 자연스럽게 텍스트와 동영상 간의 의미적 관계를 학습하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;5️⃣ 평가&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모델&amp;nbsp;성능&amp;nbsp;평가는&amp;nbsp;크게&amp;nbsp;&lt;b&gt;(1)&amp;nbsp;오프라인&amp;nbsp;평가,&amp;nbsp;(2)&amp;nbsp;온라인&amp;nbsp;평가&lt;/b&gt;로&amp;nbsp;나눌&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;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(1)&amp;nbsp;오프라인&amp;nbsp;평가&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오프라인 평가는 수집된 데이터셋을 기반으로, 모델의 성능을 사전에 측정하는 단계입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;특히 이 문제는 단순히 맞고 틀림을 판단하는 classification이 아니라, &lt;b&gt;결과의 &amp;ldquo;순서&amp;rdquo;가 중요한 ranking 문제&lt;/b&gt;이기 때문에 이에 맞는 지표를 사용하는 것이 중요합니다. 대표적인 평가 지표는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;353&quot; data-start=&quot;268&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;312&quot; data-start=&quot;268&quot;&gt;&lt;b&gt;Precision&lt;/b&gt;: 모델이 예측한 결과 중 실제로 관련 있는 비율&lt;/li&gt;
&lt;li data-end=&quot;353&quot; data-start=&quot;313&quot;&gt;&lt;b&gt;Recall&lt;/b&gt;: 실제 관련 있는 동영상 중 모델이 맞춘 비율&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;453&quot; data-start=&quot;355&quot; data-ke-size=&quot;size16&quot;&gt;Precision과 Recall은 기본적인 지표이지만, 검색 시스템에서는 순서를 반영하지 못한다는 한계가 있습니다. 따라서 ranking 문제에서는 추가적인 지표가 필요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;787&quot; data-start=&quot;455&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;627&quot; data-start=&quot;455&quot;&gt;&lt;b&gt;MRR (Mean Reciprocal Rank)&lt;/b&gt;:&lt;br /&gt;첫 번째 정답이 얼마나 상위에 위치하는지를 평가하는 지표입니다.&lt;br /&gt;예를 들어, 정답이 1번째에 있으면 1, 3번째에 있으면 1/3의 값을 가지게 됩니다.&lt;br /&gt;즉, &lt;b&gt;사용자가 원하는 결과가 얼마나 빠르게 등장하는지&lt;/b&gt;를 측정합니다.&lt;/li&gt;
&lt;li data-end=&quot;787&quot; data-start=&quot;629&quot;&gt;&lt;b&gt;mAP (Mean Average Precision)&lt;/b&gt;:&lt;br /&gt;여러 개의 정답이 존재할 때, 전체 ranking 품질을 종합적으로 평가하는 지표입니다.&lt;br /&gt;다양한 threshold에서 precision을 계산하고 평균을 내어, 모델의 전반적인 성능을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(2)&amp;nbsp;온라인&amp;nbsp;평가&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;오프라인 지표가 높다고 해서 실제 서비스에서도 좋은 성능을 보장하는 것은 아닙니다. &lt;/span&gt;따라서 실제 사용자 환경에서의 성능을 측정하는 &lt;b&gt;온라인 평가&lt;/b&gt;가 반드시 필요합니다. 온라인 평가는 주로 A/B 테스트를 통해 이루어지며, 실제 사용자 행동 데이터를 기반으로 시스템의 효과를 판단합니다. 대표적인 지표는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1336&quot; data-start=&quot;1069&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1168&quot; data-start=&quot;1069&quot;&gt;&lt;b&gt;CTR (Click Through Rate)&lt;/b&gt;:&lt;br /&gt;검색 결과로 노출된 동영상 중 실제로 클릭된 비율 &amp;rarr; 사용자가 결과를 얼마나 매력적으로 느끼는지 판단 가능&lt;/li&gt;
&lt;li data-end=&quot;1249&quot; data-start=&quot;1170&quot;&gt;&lt;b&gt;Watch Time (시청 시간)&lt;/b&gt;:&lt;br /&gt;사용자가 동영상을 얼마나 오래 시청했는지 &amp;rarr; 단순 클릭이 아닌 실제 만족도를 반영&lt;/li&gt;
&lt;li data-end=&quot;1336&quot; data-start=&quot;1251&quot;&gt;&lt;b&gt;Completion Rate (시청 완료율)&lt;/b&gt;:&lt;br /&gt;사용자가 영상을 끝까지 시청했는지 여부 &amp;rarr; 콘텐츠의 품질 및 추천의 적합성을 평가&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>인공지능(AI)/머신러닝(ML)</category>
      <author>계속지나가기</author>
      <guid isPermaLink="true">https://codingsmu.tistory.com/188</guid>
      <comments>https://codingsmu.tistory.com/188#entry188comment</comments>
      <pubDate>Sat, 25 Apr 2026 15:17:00 +0900</pubDate>
    </item>
    <item>
      <title>[머신러닝 시스템 설계] 2 구글 스트리트 뷰 블러링 시스템</title>
      <link>https://codingsmu.tistory.com/187</link>
      <description>&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;본 게시글은 알렉스 쉬, 알리 아미니안(최종일 옮김)의 &quot;가상면접 사례로 배우는 머신러닝 시스템 설계 기초&quot;를 읽고 정리한 내용에, 개인적인 이해를 추가한 글입니다.&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Overview&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;end-to-end 관점에서 문제를 어떻게 정의하고 풀어가는지&lt;/b&gt;가 중요합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 그 중 하나인&lt;span&gt; &lt;/span&gt;&lt;b&gt;구글 스트리트 뷰 블러링 시스템&lt;/b&gt;을 예시로, 개인정보 보호를 위한 ML 시스템 설계 과정을 단계별로 정리해보겠습니다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ 요구사항 명확화&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;문제: 구글 스트리브 뷰에서 개인정보 보호를 위한 블러링 시스템을 설계하시오.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2706&quot; data-origin-height=&quot;1760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kLahn/dJMcaibY4Yb/BAKcNpHuKPCXujaquSJfc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kLahn/dJMcaibY4Yb/BAKcNpHuKPCXujaquSJfc1/img.png&quot; data-alt=&quot;구글 스트리트 뷰 예시 (TMI: 생각보다 한국 구글맵은 blur 처리가 잘 안되고 있다..)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kLahn/dJMcaibY4Yb/BAKcNpHuKPCXujaquSJfc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkLahn%2FdJMcaibY4Yb%2FBAKcNpHuKPCXujaquSJfc1%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;700&quot; height=&quot;455&quot; data-origin-width=&quot;2706&quot; data-origin-height=&quot;1760&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구글 스트리트 뷰 예시 (TMI: 생각보다 한국 구글맵은 blur 처리가 잘 안되고 있다..)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;468&quot; data-start=&quot;392&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;468&quot; data-start=&quot;392&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;468&quot; data-start=&quot;392&quot; data-ke-size=&quot;size16&quot;&gt;스트리트 뷰에서는 거리 이미지가 그대로 노출되기 때문에, &lt;b&gt;사람 얼굴이나 차량 번호판과 같은 개인 정보&lt;/b&gt;는 반드시 가려야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;499&quot; data-start=&quot;470&quot; data-ke-size=&quot;size16&quot;&gt;즉, 아래와 같은 시스템을 설계하는 것이 목표입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;548&quot; data-start=&quot;501&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;519&quot; data-start=&quot;501&quot;&gt;입력: 스트리트 뷰 이미지&lt;/li&gt;
&lt;li data-end=&quot;548&quot; data-start=&quot;520&quot;&gt;출력: 얼굴 / 번호판이 블러 처리된 이미지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;고려해야 할 포인트들&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 아래의 목표를 고려하여 사용자의 개인정보를 보호할 수 있는 블러링 시스템을 설계하는 것이 최종 목표입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 130px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;비즈니스 목표&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;사용자의 개인정보 보호 (privacy preservation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;시스템 기능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span&gt;- 이미지 내 객체(얼굴, 번호판) 탐지&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 해당 영역에 대해 자동 블러링 처리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;데이터&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span&gt;- 약 100만 개의 라벨링 데이터 (얼굴, 번호판 bounding box 포함)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 데이터 편향(인종, 성별 등) 은 고려하지 않는다고 가정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;제약 조건&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span&gt;- 실시간 처리 필요 없음 (오프라인 처리 가능)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 정확도가 latency보다 중요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;시스템 규모&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;글로벌 사용자 대상 (대규모 이미지 처리 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;성능 요구사항&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span&gt;- 민감 정보는 놓치지 않는 높은 recall&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 과도한 블러링 방지를 위한 precision도 중요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ ML 문제로 구조화&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;비즈니스 문제를 ML 문제로 재정의해봅시다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;ML 목표로 재정의: 이미지에서 관심있는 객체를 정확하게 감지하는 것&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;시스템 입출력 정의:&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 경우, I/O는 다음 처럼 생각할 수 있습니다: Input: 이미지, Output: 객체 감지 결과 (bounding box + object class)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;시스템은&amp;nbsp;단순&amp;nbsp;classification이&amp;nbsp;아니라,&amp;nbsp;&quot;어디에&amp;nbsp;무엇이&amp;nbsp;있는지&quot;를&amp;nbsp;찾는&amp;nbsp;객체&amp;nbsp;감지(Object&amp;nbsp;Detection)&amp;nbsp;문제입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;적합한 ML 접근 방식 선택:&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 감지 문제는 일반적으로 두 가지 단계로 구성됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1361&quot; data-start=&quot;1281&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1328&quot; data-start=&quot;1281&quot;&gt;&lt;b&gt;Step 1: 객체 위치 예측 (Bounding Box)&lt;/b&gt; &amp;rarr; 회귀 문제&lt;/li&gt;
&lt;li data-end=&quot;1361&quot; data-start=&quot;1329&quot;&gt;&lt;b&gt;Step 2: 객체 종류 분류&lt;/b&gt; &amp;rarr; 분류 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;모델 구조 선택:&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 감지 모델은 크게 &lt;b&gt;1단계/2단계 네트워크&lt;/b&gt;&amp;nbsp;두 가지로 나뉩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2단계 네트워크:&lt;/b&gt; 두 개의 개별 모델을 사용하는 네트워크로, 속도는 더 느리지만 bounding box 감지 후, 객체 클래스를 할당하므로 정확도가 더 높습니다.&lt;/p&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단계) Region Proposal Network (RPN)로, 후보 영역을 생성하는 단계와 (2단계) 제안된 각 영역을 처리하여 객체 클래스로 분류하는 classification 단계로 구분됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 사용하는 2단계 network로는 R-CNN, Fast R-CNN, Faster-RCNN이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1단계 네트워크:&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;위의 두 단계를 개별 모델이 아닌, 한 모델로 통합한 버전으로 좀 더 최근 방식입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;영역 제안을 명시적으로 감지하지 않아도, 바운딩 박그와 객체 클래스를 동시에 생성할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;일반적으로 사용되는 1단계 network로는 YOLO, SSD등이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제에서는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1682&quot; data-end=&quot;1718&quot;&gt;
&lt;li data-start=&quot;1682&quot; data-end=&quot;1699&quot;&gt;실시간성이 중요하지 않고&lt;/li&gt;
&lt;li data-start=&quot;1700&quot; data-end=&quot;1718&quot;&gt;개인정보 보호가 핵심이므로&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1720&quot; data-end=&quot;1777&quot;&gt; &lt;span&gt; 이 문제에서는 &lt;/span&gt;실시간성이 중요하지 않고, 개인정보 보호가 핵심이므로 &lt;span&gt;&lt;/span&gt;&lt;b&gt;느리지만 더 정확한 2-stage 방식 (Faster R-CNN 등)을 선택&lt;/b&gt;하는 것이 합리적입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ 데이터 준비&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;&lt;span&gt;ML 모델 성능을 결정짓는 가장 중요한 단계 중 하나입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MQqf2/dJMcacip3AP/HChMJjR9wLsb4p1DxD29kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MQqf2/dJMcacip3AP/HChMJjR9wLsb4p1DxD29kK/img.png&quot; data-alt=&quot;데이터 준비 프로세스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MQqf2/dJMcacip3AP/HChMJjR9wLsb4p1DxD29kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMQqf2%2FdJMcacip3AP%2FHChMJjR9wLsb4p1DxD29kK%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;700&quot; height=&quot;140&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 준비 프로세스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;&lt;span&gt;데이터 준비 단계는 크게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;(1) 데이터 엔지니어링, (2) 피처 엔지니어링&lt;/b&gt;으로 나눌 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;(1) 데이터 엔지니어링&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;데이터를 수집하고, 저장하고, 검색하고, 처리하는 전체 파이프라인을 설계하는 단계입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;이 시스템에서 사용할 수 있는 데이터 소스는 다음과 같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;- 스트리트 뷰 이미지&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- bounding box 라벨 (얼굴, 번호판)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;- &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;메타데이터 (위치, 시간 등)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;(2) 피처 엔지니어링&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;이 시스템에서는 입력이 이미지이기 때문에, 이미지 전처리가 필수적으로 수행되어야 합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;대표적인 전처리 과정은 다음과 같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;- resizing&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- scaling&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- z-score normalization&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 이미지 색상 모드 통일 (RGB 등)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;이미지 전처리 관련해서 좀 더 상세한 내용이 궁금하다면 아래 글을 참고하면 좋습니다 :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;- [패턴인식] 영상 처리(1) : 디지털 영상, 히스토그램:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://codingsmu.tistory.com/102&quot;&gt;https://codingsmu.tistory.com/102&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;- [패턴인식] 영상 처리(2) : 이진영상, 영상 처리의 세가지 기본 연산:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://codingsmu.tistory.com/103&quot;&gt;https://codingsmu.tistory.com/103&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;figure id=&quot;og_1776599281557&quot; contenteditable=&quot;false&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bXn2Jo/dJMb9cBJbvZ/IGt0PoAc5JoeSKQ499uVDk/img.png?width=800&amp;amp;height=324&amp;amp;face=0_0_800_324,https://scrap.kakaocdn.net/dn/jKPjz/dJMb9fZwpeG/1ZMRssDVP6BAaueJPU4Er1/img.png?width=800&amp;amp;height=324&amp;amp;face=0_0_800_324,https://scrap.kakaocdn.net/dn/WAtBW/dJMb82eN55E/pbnqyeAFkM5sg0WzTTckNK/img.png?width=1671&amp;amp;height=868&amp;amp;face=0_0_1671_868&quot; data-og-url=&quot;https://codingsmu.tistory.com/103&quot; data-og-source-url=&quot;https://codingsmu.tistory.com/103&quot; data-og-host=&quot;codingsmu.tistory.com&quot; data-og-description=&quot;Digital Image Processing목차0. Preview1. 디지털 영상이란?2. 히스토그램3. 이진 영상4. 영상 처리의 세가지 기본 연산5. 다해상도6. 모폴로지7. 컬러&amp;nbsp;&amp;nbsp;은 이전 게시글을 참고해주세요https://codingsmu.tistory.co&quot; data-og-title=&quot;[패턴인식] 영상 처리(2) : 이진영상, 영상 처리의 세가지 기본 연산&quot; data-og-type=&quot;article&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://codingsmu.tistory.com/103&quot; data-source-url=&quot;https://codingsmu.tistory.com/103&quot;&gt;
&lt;div style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bXn2Jo/dJMb9cBJbvZ/IGt0PoAc5JoeSKQ499uVDk/img.png?width=800&amp;amp;height=324&amp;amp;face=0_0_800_324,https://scrap.kakaocdn.net/dn/jKPjz/dJMb9fZwpeG/1ZMRssDVP6BAaueJPU4Er1/img.png?width=800&amp;amp;height=324&amp;amp;face=0_0_800_324,https://scrap.kakaocdn.net/dn/WAtBW/dJMb82eN55E/pbnqyeAFkM5sg0WzTTckNK/img.png?width=1671&amp;amp;height=868&amp;amp;face=0_0_1671_868');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;[패턴인식] 영상 처리(2) : 이진영상, 영상 처리의 세가지 기본 연산&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;Digital Image Processing목차0. Preview1. 디지털 영상이란?2. 히스토그램3. 이진 영상4. 영상 처리의 세가지 기본 연산5. 다해상도6. 모폴로지7. 컬러&amp;nbsp;&amp;nbsp;은 이전 게시글을 참고해주세요https://codingsmu.tistory.co&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;codingsmu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2094&quot; data-start=&quot;2064&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-end=&quot;2120&quot; data-start=&quot;2096&quot; data-ke-size=&quot;size16&quot;&gt;추가로, 수집한 데이터 수에 따라 다음의 &lt;b&gt;(opt.) 데이터 증강 기법&lt;/b&gt;을 사용할 수도 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2181&quot; data-start=&quot;2122&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2137&quot; data-start=&quot;2122&quot;&gt;random crop&lt;/li&gt;
&lt;li data-end=&quot;2168&quot; data-start=&quot;2138&quot;&gt;brightness / saturation 변화&lt;/li&gt;
&lt;li data-end=&quot;2181&quot; data-start=&quot;2169&quot;&gt;noise 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2189&quot; data-start=&quot;2183&quot; data-ke-size=&quot;size16&quot;&gt;단, 회전 혹은 뒤집는 경우 바운딩 박스의 ground truth 값도 함께 변환되어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&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;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;4️⃣ 모델 개발&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 개발 단계에서는&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(1) 모델 선택, (2) 학습 방식 (w/ loss function)&lt;/b&gt;을 결정합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(1) 모델 선택&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-end=&quot;2394&quot; data-start=&quot;2374&quot; data-ke-size=&quot;size16&quot;&gt;2단계 네트워크를 선택해야 됩니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;1228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/99ZZ6/dJMcai32s8G/V329gUR60syTDk9ho3j7DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/99ZZ6/dJMcai32s8G/V329gUR60syTDk9ho3j7DK/img.png&quot; data-alt=&quot;2단계 객체 감지 네트워크&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/99ZZ6/dJMcai32s8G/V329gUR60syTDk9ho3j7DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F99ZZ6%2FdJMcai32s8G%2FV329gUR60syTDk9ho3j7DK%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;400&quot; height=&quot;495&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;1228&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2단계 객체 감지 네트워크&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;convolutional layers&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;input image를 처리하고 feature map을 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Region proposal network (RPN)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체를 포함할 수 있는 후보 영역을 제안&lt;/li&gt;
&lt;li&gt;NN을 아키텍처로 사용하고, feature map을 입력으로 받아 이미지의 후보 영역을 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;classifier&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 후보 영역의 객체 클래스를 결정함.&lt;/li&gt;
&lt;li&gt;input으로 feature map과 제안된 후보 영역을 입력으로 받아 각 영역에 객체 클래스를 할당함.&lt;/li&gt;
&lt;li&gt;일반적으로 NN 기반&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2)&amp;nbsp;모델&amp;nbsp;학습&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2509&quot; data-start=&quot;2495&quot; data-ke-size=&quot;size16&quot;&gt;훈련시 일반적으로 다음 세 단계를 포함합니다: forward propagation, backward propagation, loss function&lt;/p&gt;
&lt;p data-end=&quot;2509&quot; data-start=&quot;2495&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2509&quot; data-start=&quot;2495&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;첫 번째 네트워크인, 객체 감지 모델의 loss function은&lt;/b&gt; 예측된 객체의 bounding box가 ground truth와 얼마나 일치하는지로 계산합니다. 이 때, regression loss로 MSE와 같은 표준 회귀 손실 함수를 사용하게 됩니다.  &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;b&gt;L_reg&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dK9Q9Y/dJMcai32teg/Lr5zRZuKjqMtZz5ePFIk40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dK9Q9Y/dJMcai32teg/Lr5zRZuKjqMtZz5ePFIk40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dK9Q9Y/dJMcai32teg/Lr5zRZuKjqMtZz5ePFIk40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdK9Q9Y%2FdJMcai32teg%2FLr5zRZuKjqMtZz5ePFIk40%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;400&quot; height=&quot;63&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;두 번째 네트워크인, 객체 분류 모델의 loss function은&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; 앞 단계에서 감지된 bounding box에 객체 클래스를 예측해야 합니다&lt;/span&gt;. 이 때, classification loss로 cross entropy와 같은 표준 분류 손실 함수를 사용하게 됩니다.  &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;L_cls&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최종 Loss Function&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2634&quot; data-start=&quot;2603&quot; data-ke-size=&quot;size16&quot;&gt;모델의 전반적인 성능을 측정하기 위해, 최종 loss function으로는 균형 매게변수 lambda로 가중치를 부여한 분류 손실과 회귀 손실의 결합값을 사용합니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mnGdA/dJMcacQljeW/AvkoCceCDIhmiQbF99W0CK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mnGdA/dJMcacQljeW/AvkoCceCDIhmiQbF99W0CK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mnGdA/dJMcacQljeW/AvkoCceCDIhmiQbF99W0CK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmnGdA%2FdJMcacQljeW%2FAvkoCceCDIhmiQbF99W0CK%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;150&quot; height=&quot;47&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-end=&quot;2634&quot; data-start=&quot;2603&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;5️⃣ 평가&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;모델&amp;nbsp;성능&amp;nbsp;평가는&amp;nbsp;크게&amp;nbsp;&lt;b&gt;(1)&amp;nbsp;오프라인&amp;nbsp;평가,&amp;nbsp;(2)&amp;nbsp;온라인&amp;nbsp;평가&lt;/b&gt;로&amp;nbsp;나눌&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;두 평가 메트릭을 살펴보기 전에, 객체 감지 평가 관련한 핵심 개념인 IoU에 대해 먼저 알아보고자 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Intersection over Union (IoU)&lt;/b&gt;는 예측 박스와 GT 박스의 겹침 정도를 나타내는 값으로 1에 가까울 수록 예측값이 GT와 완전히 일치함을 말합니다. 1은 드물게 나타나는 값으로 보통은, threshold 값을 정해, 해당값을 기준으로 넘는 값에 대해서는 정답, 이하 값은 오탐으로 분류하게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pPmRg/dJMcad2JIIQ/qtba0BPvme25p0A0bEffR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pPmRg/dJMcad2JIIQ/qtba0BPvme25p0A0bEffR1/img.png&quot; data-alt=&quot;IOU 공식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pPmRg/dJMcad2JIIQ/qtba0BPvme25p0A0bEffR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpPmRg%2FdJMcad2JIIQ%2Fqtba0BPvme25p0A0bEffR1%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;400&quot; height=&quot;280&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IOU 공식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(1)&amp;nbsp;오프라인&amp;nbsp;평가&lt;/b&gt;&lt;br /&gt;객체 감지에서는 단순 accuracy보다 다음 지표를 사용합니다.&lt;/p&gt;
&lt;h4 data-end=&quot;3198&quot; data-start=&quot;3173&quot; data-ke-size=&quot;size20&quot;&gt;Precision / Recall&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3251&quot; data-start=&quot;3200&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3225&quot; data-start=&quot;3200&quot;&gt;Precision: 예측 중 정답 비율&lt;/li&gt;
&lt;li data-end=&quot;3251&quot; data-start=&quot;3226&quot;&gt;Recall: 실제 정답 중 맞춘 비율&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3305&quot; data-start=&quot;3253&quot; data-ke-size=&quot;size16&quot;&gt;이 문제에서는 개인정보가 유출되는 것이 더 문제가된는 상황이므로, 특히 &lt;b&gt;Recall이 중요합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;3305&quot; data-start=&quot;3253&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3305&quot; data-start=&quot;3253&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;ML의 기본 평가 매트릭 관련해서는&amp;nbsp; 아래 글을 참고하면 좋습니다 :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;- [ML] 모델 성능을 측정하는 네가지 지표: &lt;a href=&quot;https://codingsmu.tistory.com/88&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codingsmu.tistory.com/88&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776601961722&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[ML] 모델 성능을 측정하는 네가지 지표&quot; data-og-description=&quot;기계학습(ML : Mahine Learning) 모델의 성능을 측정하는 통계적 지표로는 다음과 같이 네 가지 종류가 존재한다 인식 성능 측정 Accuracy: 정확도 혼동 행렬(Confusion Matrix)을 이용한 방식 (또는 오차행렬&quot; data-og-host=&quot;codingsmu.tistory.com&quot; data-og-source-url=&quot;https://codingsmu.tistory.com/88&quot; data-og-url=&quot;https://codingsmu.tistory.com/88&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Avl94/dJMb81fUyQG/b9vBScer8yuzSyF0mWtlyK/img.png?width=800&amp;amp;height=610&amp;amp;face=0_0_800_610,https://scrap.kakaocdn.net/dn/dzuLPp/dJMb88e2Bip/IYbKI23KVk3A4s0rU8udA0/img.png?width=800&amp;amp;height=610&amp;amp;face=0_0_800_610,https://scrap.kakaocdn.net/dn/Hl0gh/dJMb81GZeOz/06lVEhYczmT6slRVh1jRGK/img.png?width=1750&amp;amp;height=1335&amp;amp;face=0_0_1750_1335&quot;&gt;&lt;a href=&quot;https://codingsmu.tistory.com/88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codingsmu.tistory.com/88&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Avl94/dJMb81fUyQG/b9vBScer8yuzSyF0mWtlyK/img.png?width=800&amp;amp;height=610&amp;amp;face=0_0_800_610,https://scrap.kakaocdn.net/dn/dzuLPp/dJMb88e2Bip/IYbKI23KVk3A4s0rU8udA0/img.png?width=800&amp;amp;height=610&amp;amp;face=0_0_800_610,https://scrap.kakaocdn.net/dn/Hl0gh/dJMb81GZeOz/06lVEhYczmT6slRVh1jRGK/img.png?width=1750&amp;amp;height=1335&amp;amp;face=0_0_1750_1335');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[ML] 모델 성능을 측정하는 네가지 지표&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;기계학습(ML : Mahine Learning) 모델의 성능을 측정하는 통계적 지표로는 다음과 같이 네 가지 종류가 존재한다 인식 성능 측정 Accuracy: 정확도 혼동 행렬(Confusion Matrix)을 이용한 방식 (또는 오차행렬&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codingsmu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3305&quot; data-start=&quot;3253&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;3339&quot; data-start=&quot;3312&quot; data-ke-size=&quot;size20&quot;&gt;Average Precision (AP)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3377&quot; data-start=&quot;3341&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3377&quot; data-start=&quot;3341&quot;&gt;다양한 IoU threshold에서 precision 평균입니다. P(r)은 임계값 'r'에서의 정밀도를 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BQGsn/dJMcajaPsTB/edxjh04twtT60BXbbApsh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BQGsn/dJMcajaPsTB/edxjh04twtT60BXbbApsh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BQGsn/dJMcajaPsTB/edxjh04twtT60BXbbApsh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBQGsn%2FdJMcajaPsTB%2Fedxjh04twtT60BXbbApsh0%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;200&quot; height=&quot;76&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-end=&quot;3417&quot; data-start=&quot;3384&quot; data-ke-size=&quot;size20&quot;&gt;Mean Average Precision (mAP)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3437&quot; data-start=&quot;3419&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3437&quot; data-start=&quot;3419&quot;&gt;모든 클래스(AP)의 평균이며 모델의 전반적인 성능을 보여줄 수 있습니다. C는 모델이 감지하는 객체 클래스의 총 수 입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCVEBH/dJMcajoj9JD/aI1W2V62LYdbo0uQEp91P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCVEBH/dJMcajoj9JD/aI1W2V62LYdbo0uQEp91P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCVEBH/dJMcajoj9JD/aI1W2V62LYdbo0uQEp91P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCVEBH%2FdJMcajoj9JD%2FaI1W2V62LYdbo0uQEp91P0%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;250&quot; height=&quot;101&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2)&amp;nbsp;온라인&amp;nbsp;평가&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;실제 서비스에서는 다음을 확인해야 합니다. &amp;ldquo;이 시스템이 정말 개인정보를 잘 보호하고 있는가?&amp;rdquo;&lt;/p&gt;
&lt;p data-end=&quot;3546&quot; data-start=&quot;3538&quot; data-ke-size=&quot;size16&quot;&gt;대표적인 지표:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3603&quot; data-start=&quot;3548&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3560&quot; data-start=&quot;3548&quot;&gt;사용자 신고 수&lt;/li&gt;
&lt;li data-end=&quot;3584&quot; data-start=&quot;3561&quot;&gt;개인정보 노출 관련 이슈 발생 빈도&lt;/li&gt;
&lt;li data-end=&quot;3603&quot; data-start=&quot;3585&quot;&gt;블러링 오류 (미탐 / 과탐)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>인공지능(AI)/머신러닝(ML)</category>
      <author>계속지나가기</author>
      <guid isPermaLink="true">https://codingsmu.tistory.com/187</guid>
      <comments>https://codingsmu.tistory.com/187#entry187comment</comments>
      <pubDate>Sun, 19 Apr 2026 20:49:45 +0900</pubDate>
    </item>
    <item>
      <title>[머신러닝 시스템 설계] 1 시각 검색 시스템</title>
      <link>https://codingsmu.tistory.com/186</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;본 게시글은 알렉스 쉬, 알리 아미니안(최종일 옮김)의 &quot;가상면접 사례로 배우는 머신러닝 시스템 설계 기초&quot;를 읽고 정리한 내용에, 개인적인 이해를 추가한 글입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Overview&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝 시스템 설계 문제에서는 단순히 모델을 만드는 것이 아니라, &lt;b&gt;end-to-end 관점에서 문제를 어떻게 정의하고 풀어가는지&lt;/b&gt;가 중요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 그 중 하나인 &lt;b&gt;시각 검색 시스템 (visual search)&lt;/b&gt; 을 기준으로, 전체 설계 과정을 정리해보았습니다.&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;1️⃣ 요구사항 명확화&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제: 핀터레스트와 유사한 시각적 검색 시스템을 설계하시오&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;954&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf2yUD/dJMcaiiCCbL/kRJvdrv1OyHHpOw7xHdbx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf2yUD/dJMcaiiCCbL/kRJvdrv1OyHHpOw7xHdbx0/img.png&quot; data-alt=&quot;왼쪽 상단 이미지: 쿼리 이미지, 오른쪽은 유사한 이미지 결과들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf2yUD/dJMcaiiCCbL/kRJvdrv1OyHHpOw7xHdbx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf2yUD%2FdJMcaiiCCbL%2FkRJvdrv1OyHHpOw7xHdbx0%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;600&quot; height=&quot;488&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;954&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;왼쪽 상단 이미지: 쿼리 이미지, 오른쪽은 유사한 이미지 결과들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 기본 과정은 다음과 같다고 고려합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력: 이미지&lt;/li&gt;
&lt;li&gt;출력: 유사 이미지 리스트 (ranking 포함)&lt;/li&gt;
&lt;li&gt;개인화: 고려하지 않음&lt;/li&gt;
&lt;li&gt;텍스트/동영상 쿼리: 제외&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;고려해야 할 포인트들&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 아래의 목표를 고려하여 빠르고 정확하게 유사한 이미지를 찾아주는 시스템을 만드는것이 최종 목표입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 130px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;비즈니스 목표&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;검색 시스템이 얼마나 잘 동작하는지 판단 (CTR, 사용자 수, 체류 시간 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;시스템 기능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;사용자 선호도 수집 (좋아요/싫어요 등) &amp;rarr; 학습 데이터 라벨로 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;데이터&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;이미지 기반 (동영상/텍스트 제외), 기본적으로 픽셀 정보 사용 (확장 시 메타데이터 고려)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;제약 조건&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;컴퓨팅 자원, 클라우드 vs 온디바이스, 모델 자동 개선 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;시스템 규모&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;사용자 수 및 트래픽 규모&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;성능 요구사항&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;목표 정확도 및 검색 속도 (대규모 이미지 DB: 100B~200B)&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;h2 data-ke-size=&quot;size26&quot;&gt;2️⃣ ML 문제로 구조화&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비즈니스 문제를 ML 문제로 재정의해봅시다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ML 목표로 재정의: 쿼리 이미지와 시각적으로 유사한 이미지를 정확하게 찾는다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우, I/O는 다음 처럼 생각할 수 있습니다: Input: 이미지 (pixel) , Output: 유사 이미지 리스트 (ranking)&lt;/p&gt;
&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;단순 분류 문제가 아니라, ranking 문제로 보는 것이 자연스럽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 ML이 답이 될 수 있으나, 여기서는 표현 학습(representation learning) 접근방식으로 문제를 풀려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&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;표현 학습을 사용해 이미지 순위를 매기는 방법으로는, (1),(2)가 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 임베딩 공간의 거리를 측정해 쿼리 이미지와, 다른 이미간의 유사도 점수를 계산해 이미지 순위를 매김.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 유사성 정의, 모델 훈련 방법, 유사한 이미지를 가깝게 하는 방법 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;처음 이 문제를 봤을 때, 개인적으로 떠올랐던 방법은 크게 두 가지 입니다: (1) from scratch, (2)기존 임베딩 모델을 활용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;(1) 처음부터 학습하고 싶다면, contrastive learning을 떠올릴 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;- simCLR, MoCo 등 다양한 self-supervised 방식&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;- 그 중, simCLR 관련해서는 이전에 정리한 게시글이 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codingsmu.tistory.com/163&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codingsmu.tistory.com/163&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775826781577&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;simCLR을 통해 Contrastive Learning 이해하기&quot; data-og-description=&quot;해당 게시글은 Ekin Tiu님의 Understanding Contrastive Learning글을 참고하여 번역 및 요약한 글입니다. What is Contrastive Learning? Contrastive learning is a machine learning technique used to learn the general features of a dataset w&quot; data-og-host=&quot;codingsmu.tistory.com&quot; data-og-source-url=&quot;https://codingsmu.tistory.com/163&quot; data-og-url=&quot;https://codingsmu.tistory.com/163&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cu1MfT/dJMb9lMcAJR/pkV9LJ4Yp2nPB1RAv2vQHk/img.png?width=800&amp;amp;height=212&amp;amp;face=626_72_724_180,https://scrap.kakaocdn.net/dn/bnsqPr/dJMb8T90y7F/Yh30KRjNhNMkFjjD34euW1/img.png?width=800&amp;amp;height=212&amp;amp;face=626_72_724_180,https://scrap.kakaocdn.net/dn/dqTBoI/dJMb8TCaHUq/GKx7LImrSrUgDarVRwTD81/img.png?width=3187&amp;amp;height=848&amp;amp;face=2534_293_2857_646&quot;&gt;&lt;a href=&quot;https://codingsmu.tistory.com/163&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codingsmu.tistory.com/163&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cu1MfT/dJMb9lMcAJR/pkV9LJ4Yp2nPB1RAv2vQHk/img.png?width=800&amp;amp;height=212&amp;amp;face=626_72_724_180,https://scrap.kakaocdn.net/dn/bnsqPr/dJMb8T90y7F/Yh30KRjNhNMkFjjD34euW1/img.png?width=800&amp;amp;height=212&amp;amp;face=626_72_724_180,https://scrap.kakaocdn.net/dn/dqTBoI/dJMb8TCaHUq/GKx7LImrSrUgDarVRwTD81/img.png?width=3187&amp;amp;height=848&amp;amp;face=2534_293_2857_646');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;simCLR을 통해 Contrastive Learning 이해하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 게시글은 Ekin Tiu님의 Understanding Contrastive Learning글을 참고하여 번역 및 요약한 글입니다. What is Contrastive Learning? Contrastive learning is a machine learning technique used to learn the general features of a dataset w&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codingsmu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;(2) 기존에 잘 학습된 임베딩 모델을 활용할 수도 있습니다. hugginface에서 다운로드 수가 높은 임베딩 모델을 참고하세요&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3️⃣ 데이터 준비&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;&lt;span&gt;ML 모델 성능을 결정짓는 가장 중요한 단계 중 하나입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MQqf2/dJMcacip3AP/HChMJjR9wLsb4p1DxD29kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MQqf2/dJMcacip3AP/HChMJjR9wLsb4p1DxD29kK/img.png&quot; data-alt=&quot;데이터 준비 프로세스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MQqf2/dJMcacip3AP/HChMJjR9wLsb4p1DxD29kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMQqf2%2FdJMcacip3AP%2FHChMJjR9wLsb4p1DxD29kK%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;700&quot; height=&quot;140&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 준비 프로세스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;&lt;span&gt;데이터 준비 단계는 크게 &lt;b&gt;(1) 데이터 엔지니어링, (2) 피처 엔지니어링&lt;/b&gt;으로 나눌 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;(1) 데이터 엔지니어링&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;데이터를 수집하고, 저장하고, 검색하고, 처리하는 전체 파이프라인을 설계하는 단계입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;이 시스템에서 사용할 수 있는 데이터 소스는 다음과 같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;- 이미지 데이터&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 사용자 데이터&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 사용자 &amp;harr; 이미지 상호작용 데이터&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;각 데이터를 조금 더 구체적으로 보면:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;- 이미지: 픽셀 정보 외에도, 소유자, 업로드 시간, 태그 등의 메타데이터를 포함할 수 있음&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 사용자: 나이, 성별 등 기본적인 프로필 정보&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 상호작용: 사용자별 노출 수, 클릭 수, 좋아요/싫어요 등&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;특히, 상호작용 데이터는 이후 모델 학습 시 중요한 supervision signal로 활용될 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;(2) 피처 엔지니어링&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;수집된 데이터 중에서 모델 입력으로 사용할 피처를 정의하고, 전처리하는 단계입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;이 시스템에서는 입력이 이미지이기 때문에, 이미지 전처리가 필수적으로 수행되어야 합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;대표적인 전처리 과정은 다음과 같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;- resizing&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- scaling&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- z-score normalization&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 이미지 색상 모드 통일 (RGB 등)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;이미지 전처리 관련해서 좀 더 상세한 내용이 궁금하다면 아래 글을 참고하면 좋습니다 :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;- [패턴인식] 영상 처리(1) : 디지털 영상, 히스토그램: &lt;a style=&quot;color: #7e98b1;&quot; title=&quot;- [패턴인식] 영상 처리(1) : 디지털 영상, 히스토그램&quot; href=&quot;https://codingsmu.tistory.com/102&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codingsmu.tistory.com/102&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;- [패턴인식] 영상 처리(2) : 이진영상, 영상 처리의 세가지 기본 연산: &lt;a style=&quot;color: #7e98b1;&quot; href=&quot;https://codingsmu.tistory.com/103&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codingsmu.tistory.com/103&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;figure id=&quot;og_1775827533987&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[패턴인식] 영상 처리(2) : 이진영상, 영상 처리의 세가지 기본 연산&quot; data-og-description=&quot;Digital Image Processing목차0. Preview1. 디지털 영상이란?2. 히스토그램3. 이진 영상4. 영상 처리의 세가지 기본 연산5. 다해상도6. 모폴로지7. 컬러&amp;nbsp;&amp;nbsp;은 이전 게시글을 참고해주세요https://codingsmu.tistory.co&quot; data-og-host=&quot;codingsmu.tistory.com&quot; data-og-source-url=&quot;https://codingsmu.tistory.com/103&quot; data-og-url=&quot;https://codingsmu.tistory.com/103&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bXn2Jo/dJMb9cBJbvZ/IGt0PoAc5JoeSKQ499uVDk/img.png?width=800&amp;amp;height=324&amp;amp;face=0_0_800_324,https://scrap.kakaocdn.net/dn/jKPjz/dJMb9fZwpeG/1ZMRssDVP6BAaueJPU4Er1/img.png?width=800&amp;amp;height=324&amp;amp;face=0_0_800_324,https://scrap.kakaocdn.net/dn/WAtBW/dJMb82eN55E/pbnqyeAFkM5sg0WzTTckNK/img.png?width=1671&amp;amp;height=868&amp;amp;face=0_0_1671_868&quot;&gt;&lt;a href=&quot;https://codingsmu.tistory.com/103&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codingsmu.tistory.com/103&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bXn2Jo/dJMb9cBJbvZ/IGt0PoAc5JoeSKQ499uVDk/img.png?width=800&amp;amp;height=324&amp;amp;face=0_0_800_324,https://scrap.kakaocdn.net/dn/jKPjz/dJMb9fZwpeG/1ZMRssDVP6BAaueJPU4Er1/img.png?width=800&amp;amp;height=324&amp;amp;face=0_0_800_324,https://scrap.kakaocdn.net/dn/WAtBW/dJMb82eN55E/pbnqyeAFkM5sg0WzTTckNK/img.png?width=1671&amp;amp;height=868&amp;amp;face=0_0_1671_868');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[패턴인식] 영상 처리(2) : 이진영상, 영상 처리의 세가지 기본 연산&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Digital Image Processing목차0. Preview1. 디지털 영상이란?2. 히스토그램3. 이진 영상4. 영상 처리의 세가지 기본 연산5. 다해상도6. 모폴로지7. 컬러&amp;nbsp;&amp;nbsp;은 이전 게시글을 참고해주세요https://codingsmu.tistory.co&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codingsmu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4️⃣&amp;nbsp;모델&amp;nbsp;개발&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 개발 단계에서는&lt;b&gt; (1) 모델 선택, (2) 학습 방식, (3) loss function&lt;/b&gt;을 결정합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(1)&amp;nbsp;모델&amp;nbsp;선택&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;기본적으로&amp;nbsp;이미지&amp;nbsp;데이터를&amp;nbsp;다루기&amp;nbsp;때문에,&amp;nbsp;Neural&amp;nbsp;Network&amp;nbsp;기반&amp;nbsp;모델을&amp;nbsp;사용합니다.&lt;br /&gt;&lt;br /&gt;대표적으로는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;구조가&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;CNN&amp;nbsp;기반:&amp;nbsp;ResNet&amp;nbsp;등&lt;br /&gt;-&amp;nbsp;Transformer&amp;nbsp;기반:&amp;nbsp;ViT&amp;nbsp;(Vision&amp;nbsp;Transformer)&lt;br /&gt;&lt;br /&gt;최근에는 transformer 기반 모델이 많이 사용되는 추세이지만,&amp;nbsp; &amp;nbsp;여전히&amp;nbsp;CNN&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;훈련&amp;nbsp;(Contrastive&amp;nbsp;Learning)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;이 문제에서는 유사한 이미지를 가깝게, 다른 이미지를 멀게 학습해야 하므로&amp;nbsp;&amp;nbsp;contrastive&amp;nbsp;learning&amp;nbsp;방식이&amp;nbsp;적합합니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cknhCJ/dJMcaiJELgj/nib1G1C21OeY4RnNBQQDnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cknhCJ/dJMcaiJELgj/nib1G1C21OeY4RnNBQQDnK/img.png&quot; data-alt=&quot;훈련 데이터 포인트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cknhCJ/dJMcaiJELgj/nib1G1C21OeY4RnNBQQDnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcknhCJ%2FdJMcaiJELgj%2Fnib1G1C21OeY4RnNBQQDnK%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;600&quot; height=&quot;154&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;훈련 데이터 포인트&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;학습&amp;nbsp;데이터는&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;구성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Query 이미지 (q)&lt;br /&gt;Positive 이미지 (1개)&lt;br /&gt;Negative 이미지 (n-1개)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;여기서, Positive 데이터를 어떻게 구성할지가 중요한 포인트입니다.&lt;br /&gt;&lt;br /&gt;대표적인&amp;nbsp;방법은&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;br /&gt;&lt;br /&gt;1)&amp;nbsp;사람&amp;nbsp;라벨링&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;가장&amp;nbsp;정확하지만&amp;nbsp;비용이&amp;nbsp;큼&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;2)&amp;nbsp;사용자&amp;nbsp;상호작용&amp;nbsp;기반&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;클릭,&amp;nbsp;좋아요&amp;nbsp;등을&amp;nbsp;활용&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;확장성은&amp;nbsp;좋지만&amp;nbsp;noise가&amp;nbsp;존재&amp;nbsp;&amp;rarr;&amp;nbsp;필터링&amp;nbsp;필요&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;3)&amp;nbsp;데이터&amp;nbsp;증강&amp;nbsp;(self-supervised)&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;crop,&amp;nbsp;rotation,&amp;nbsp;color&amp;nbsp;변환&amp;nbsp;등&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;simCLR,&amp;nbsp;MoCo&amp;nbsp;등의&amp;nbsp;방식&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;중,&amp;nbsp;초기&amp;nbsp;cold-start&amp;nbsp;상황에서는&amp;nbsp;simCLR&amp;nbsp;기반&amp;nbsp;augmentation을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;&amp;nbsp;&lt;br /&gt;이후에는&amp;nbsp;실제&amp;nbsp;사용자&amp;nbsp;데이터를&amp;nbsp;활용하는&amp;nbsp;방향으로&amp;nbsp;발전시킬&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;단,&amp;nbsp;augmentation&amp;nbsp;기반&amp;nbsp;데이터는&amp;nbsp;실제&amp;nbsp;semantic&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;(3)&amp;nbsp;Loss&amp;nbsp;Function&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;목표는 다음과 같습니다: 유사한 이미지는 임베딩 공간에서 가깝게, 다른 이미지는 멀어지도록 학습하는 것&lt;br /&gt;&lt;br /&gt;이를&amp;nbsp;위해&amp;nbsp;일반적으로&amp;nbsp;다음&amp;nbsp;과정을&amp;nbsp;거칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;1.&amp;nbsp;임베딩&amp;nbsp;간&amp;nbsp;유사도&amp;nbsp;계산&amp;nbsp;&amp;nbsp;&lt;br /&gt;2.&amp;nbsp;softmax를&amp;nbsp;통해&amp;nbsp;확률로&amp;nbsp;변환&amp;nbsp;&amp;nbsp;&lt;br /&gt;3. cross entropy로 loss 계산&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;복잡한 수식보다도, 아래 그래프를 보면 이해가 빠릅니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tvaSY/dJMcaf0t0Mo/3KsvsjeQyQoL7KWUh5CHS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tvaSY/dJMcaf0t0Mo/3KsvsjeQyQoL7KWUh5CHS1/img.png&quot; data-alt=&quot;(좌) softmax , (우) cross entropy function&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tvaSY/dJMcaf0t0Mo/3KsvsjeQyQoL7KWUh5CHS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtvaSY%2FdJMcaf0t0Mo%2F3KsvsjeQyQoL7KWUh5CHS1%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;700&quot; height=&quot;288&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(좌) softmax , (우) cross entropy function&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;softmax는 0~1로 값을 정규화 해주는 작업으로, cross entropy는 loss 값을 계산해준다고 생각하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;예로, 레이블이 3개 (긍정, 중립, 주정)인 모델이 있다고 합니다. 예측1,2의 결과는 softmax를 거쳐 합이 1인 값으로 나온다고 했을 때, loss 값은 다음처럼 계산될 수 있습니다. 모델은 loss가 최소화되는 방향으로 학습됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;- (예시1) GT=긍정일 때, 모델의 예측값&amp;rarr; [긍정, 중립, 부정] &amp;rarr; [0.6, 0.1, 0.3] &amp;rarr; -log(0.6) = 0.51 (loss 값. 낮음)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;- (예시2) GT=중립일 때, 모델의 예측값&amp;rarr; [긍정, 중립, 부정] &amp;rarr; [0.6, 0.1, 0.3] &amp;rarr; -log(0.1) = 2.3 (loss 값. 높음)&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5️⃣ 평가&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;모델&amp;nbsp;성능&amp;nbsp;평가는&amp;nbsp;크게&amp;nbsp;&lt;b&gt;(1)&amp;nbsp;오프라인&amp;nbsp;평가,&amp;nbsp;(2)&amp;nbsp;온라인&amp;nbsp;평가&lt;/b&gt;로&amp;nbsp;나눌&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(1)&amp;nbsp;오프라인&amp;nbsp;평가&lt;/b&gt;&lt;br /&gt;대표적으로 다음과 같은 지표를 사용합니다.&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;MRR&lt;br /&gt;-&amp;nbsp;Recall@K&lt;br /&gt;-&amp;nbsp;Precision@K&lt;br /&gt;-&amp;nbsp;mAP&amp;nbsp;(mean&amp;nbsp;Average&amp;nbsp;Precision)&lt;br /&gt;-&amp;nbsp;nDCG&amp;nbsp;(normalized&amp;nbsp;Discounted&amp;nbsp;Cumulative&amp;nbsp;Gain)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색/추천 시스템에서는 단순 accuracy보다 ranking metric이 중요합니다. 따라서 MRR, mAP, nDCG 메트릭을 주로 평가 지표로 사용됩니다.&lt;br /&gt;&lt;br /&gt;각 지표를 다음의 예시로 계산해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;후보&amp;nbsp;이미지:&amp;nbsp;[a,&amp;nbsp;b,&amp;nbsp;c,&amp;nbsp;d,&amp;nbsp;e]&amp;nbsp;&amp;nbsp;&lt;br /&gt;GT&amp;nbsp;유사도:&amp;nbsp;[5,&amp;nbsp;4,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;2]&amp;nbsp;(threshold&amp;nbsp;&amp;ge;&amp;nbsp;3&amp;nbsp;&amp;rarr;&amp;nbsp;a,&amp;nbsp;b가&amp;nbsp;정답)&lt;br /&gt;예측값이 정답일 때 ✅, 예측값이 오답일 때⏺️&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;MRR (Mean Reciprocal Rank) : &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;a(혹은 b)를 첫번째 시도에 예측했을 때 &amp;rarr; 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ✅⏺️⏺️⏺️⏺️&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ✅⏺️⏺️✅⏺️&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;a(혹은 b)를 세 번째 시도에 예측했을 때 &amp;rarr; 1/3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ⏺️⏺️✅⏺️⏺️&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- ⏺️⏺️✅✅⏺️&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Recall@K: &lt;/b&gt;정답을 얼마나 많이 찾았는지를 평가합니다.&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;recall@1:&amp;nbsp;[a]&amp;nbsp;&amp;rarr;&amp;nbsp;1/2&amp;nbsp;=&amp;nbsp;0.5&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;recall@2:&amp;nbsp;[a,&amp;nbsp;b]&amp;nbsp;&amp;rarr;&amp;nbsp;2/2&amp;nbsp;=&amp;nbsp;1&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;단, 정답 개수가 많은 경우 값이 낮아지는 경향이 있어 검색&amp;nbsp;시스템에서는&amp;nbsp;한계가&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Precision@K: &lt;/b&gt;예측한 결과 중 정답 비율을 측정합니다.&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;precision@5:&amp;nbsp;2/5&amp;nbsp;=&amp;nbsp;0.4&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;순서 정보가 반영되지 않기 때문에 ranking&amp;nbsp;품질을&amp;nbsp;평가하기에는&amp;nbsp;부족한&amp;nbsp;지표입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mAP&amp;nbsp;(Mean&amp;nbsp;Average&amp;nbsp;Precision)&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;이진 관련성 (relevant / non-relevant) 기준으로 평가하는 지표입니다.&lt;br /&gt;정답이 등장할 때마다 precision을 계산하고 평균을 냅니다.&lt;br /&gt;&lt;br /&gt;즉, 정답이 등장하는 위치가 앞쪽일수록 점수가 높으며, binary relevance 기준에서는 잘 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계산 시 먼저 AP를 구합니다. 즉, 정답이 등장할 때마다 precision을 계산해서 평균냄.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: k개의 항목에서 precision@k의 평균을 구함 (AP) &amp;rarr; (4개 AP의 합)/4=0.37 &amp;rarr; mAP&lt;/p&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: ⏺️⏺️✅&amp;rarr; 1/3 &amp;rarr; AP &amp;rarr; (1/3)/1 = 0.33&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예측 2: ✅, ✅⏺️⏺️✅ &amp;rarr; 1, 2/4 &amp;rarr; (1+2/4)/2=0.75&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예측 3:⏺️⏺️✅, ⏺️⏺️✅✅&amp;nbsp; &amp;rarr; 1/3, 2/4 &amp;rarr; (1/3+2/4)/2=0.41&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예측 4: ⏺️⏺️⏺️⏺️⏺️ &amp;rarr; 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;nDCG&amp;nbsp;(Normalized&amp;nbsp;Discounted&amp;nbsp;Cumulative&amp;nbsp;Gain)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;연속적인&amp;nbsp;relevance&amp;nbsp;score&amp;nbsp;(예:&amp;nbsp;0~5)를&amp;nbsp;반영하는&amp;nbsp;지표입니다.&lt;br /&gt;이상적인 순위와 비교하여, 현재 결과가 얼마나 좋은지 평가합니다.&lt;br /&gt;&lt;br /&gt;예시로 다음 상황을 가정해봅시다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;GT: [5, 4, 1, 0, 2]&amp;nbsp;&amp;nbsp;&lt;br /&gt;예측: [d, a, c, b, e]&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;먼저, DCG를 계산합니다. (실제 예측 값 기반)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wyupm/dJMcaarnmKA/9lSp55Mqkii7NDKcknBLYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wyupm/dJMcaarnmKA/9lSp55Mqkii7NDKcknBLYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wyupm/dJMcaarnmKA/9lSp55Mqkii7NDKcknBLYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwyupm%2FdJMcaarnmKA%2F9lSp55Mqkii7NDKcknBLYK%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;400&quot; height=&quot;46&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 IDCG를 계산합니다. (이상적인 순서)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uBzZq/dJMcagE8Vry/ExT1OKOchIkPOqfJy6Ikp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uBzZq/dJMcagE8Vry/ExT1OKOchIkPOqfJy6Ikp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uBzZq/dJMcagE8Vry/ExT1OKOchIkPOqfJy6Ikp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuBzZq%2FdJMcagE8Vry%2FExT1OKOchIkPOqfJy6Ikp1%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;400&quot; height=&quot;82&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;82&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;이를 DCG/IDCG로 하면, 실제 예측값이 얼마나 이상적인 순서에 가까운지를 계산할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2)&amp;nbsp;온라인&amp;nbsp;평가&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;모델을 실제 서비스에 배포한 이후에는,&amp;nbsp; &amp;nbsp;비즈니스&amp;nbsp;지표&amp;nbsp;기반으로&amp;nbsp;성능을&amp;nbsp;평가합니다.&lt;br /&gt;&lt;br /&gt;확인해야 할 포인트는 다음과 같습니다. : &amp;ldquo;이 모델이 실제로 사용자 경험을 개선했는가?&amp;rdquo;&lt;br /&gt;&lt;br /&gt;대표적인 지표로는 클릭률 (CTR), 체류 시간 (dwell time), 재방문율 등이 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>인공지능(AI)/머신러닝(ML)</category>
      <author>계속지나가기</author>
      <guid isPermaLink="true">https://codingsmu.tistory.com/186</guid>
      <comments>https://codingsmu.tistory.com/186#entry186comment</comments>
      <pubDate>Fri, 10 Apr 2026 22:13:20 +0900</pubDate>
    </item>
    <item>
      <title>[Claude code] 설치 및 사용법 Vscode, Terminal</title>
      <link>https://codingsmu.tistory.com/185</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;드디어 회사 정책이 바뀌어서 claude code를 개발 서버에서 사용할 수 있게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(지금까지 계속 chatgpt에 무지성 코드 복사 붙여넣기 했던거는 안 비밀...)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;돈을 지원해주진 않지만 그래도 허용해준 것만으로도 감지덕지하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련해서 처음 세팅하면서 헤맸던 부분들 위주로 정리해봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 게시글은 vscode에서 처음 claude code를 세팅하고 사용해보는 사람들을 위한 글이다. 이미 세팅을 완료해서, 몇 번의 사용 경험이 있다면 이 글은 패스해도 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. vscode에 claude code를 사용하려면 최소 pro는 구독&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 수수료 포함해서 매달 22달러, 매년은 220달러다. 맛보기용으로 22$ 매월 결제로 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가입만 하면, 연동은 쉽다. vscode를 열어 extension에서 설치 후, terminal을 열어서 claude를 입력하면 아주 귀여운 창이 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyf6p9/dJMcacCHoIa/ndBmK8GOfoJ0tNyl22T0Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyf6p9/dJMcacCHoIa/ndBmK8GOfoJ0tNyl22T0Nk/img.png&quot; data-alt=&quot;Pro 플랜 구독료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyf6p9/dJMcacCHoIa/ndBmK8GOfoJ0tNyl22T0Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdyf6p9%2FdJMcacCHoIa%2FndBmK8GOfoJ0tNyl22T0Nk%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;600&quot; height=&quot;241&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Pro 플랜 구독료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;(Opt.) 가끔 무료 크레딧을 준다 (20$~)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 본인은 5일 차이로 놓쳤지만, 비정기적으로 무료 크레딧을 뿌리니 잘 모니터링 하도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이전 무료 크레딧 이벤트 참고:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://neonomadj.com/%ED%81%B4%EB%A1%9C%EB%93%9Cclaude-%EC%9C%A0%EB%A3%8C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A3%BC%EB%AA%A9-%EB%AC%B4%EB%A3%8C-%ED%81%AC%EB%A0%88%EB%94%A720200-%EC%8B%A0%EC%B2%AD-%EB%B0%A9%EB%B2%95/&quot;&gt;https://neonomadj.com/%ED%81%B4%EB%A1%9C%EB%93%9Cclaude-%EC%9C%A0%EB%A3%8C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A3%BC%EB%AA%A9-%EB%AC%B4%EB%A3%8C-%ED%81%AC%EB%A0%88%EB%94%A720200-%EC%8B%A0%EC%B2%AD-%EB%B0%A9%EB%B2%95/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1778819885911&quot; contenteditable=&quot;false&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/u0tSE/dJMb8SpIPqP/Bpq4rmmKjCfRZgIsonlbc0/img.png?width=1091&amp;amp;height=454&amp;amp;face=0_0_1091_454,https://scrap.kakaocdn.net/dn/bUOfCi/dJMb8XR6xje/7YqZVvbWkSUp7ZJ3hQOKJk/img.png?width=1091&amp;amp;height=454&amp;amp;face=0_0_1091_454,https://scrap.kakaocdn.net/dn/daRawa/dJMb8Rj2MXW/cXq34ktPjAQjVcKCt1wRc1/img.png?width=1091&amp;amp;height=454&amp;amp;face=0_0_1091_454&quot; data-og-url=&quot;https://neonomadj.com/%ed%81%b4%eb%a1%9c%eb%93%9cclaude-%ec%9c%a0%eb%a3%8c-%ec%82%ac%ec%9a%a9%ec%9e%90-%ec%a3%bc%eb%aa%a9-%eb%ac%b4%eb%a3%8c-%ed%81%ac%eb%a0%88%eb%94%a720200-%ec%8b%a0%ec%b2%ad-%eb%b0%a9%eb%b2%95/&quot; data-og-source-url=&quot;https://neonomadj.com/%ED%81%B4%EB%A1%9C%EB%93%9Cclaude-%EC%9C%A0%EB%A3%8C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A3%BC%EB%AA%A9-%EB%AC%B4%EB%A3%8C-%ED%81%AC%EB%A0%88%EB%94%A720200-%EC%8B%A0%EC%B2%AD-%EB%B0%A9%EB%B2%95/&quot; data-og-host=&quot;neonomadj.com&quot; data-og-description=&quot;최근 앤스로픽(Anthropic)에서 Claude 사용자를 위한 파격적인 프로모션을 발표했습니다. 새로운 '사용량 번들(Usage bundles)' 출시를 기념하여, 현재 구독 중인 플랜 가격에 상응하는 일회성 추가 사용&quot; data-og-title=&quot;클로드(Claude) 유료 사용자 주목! 무료 크레딧($20~$200) 신청 방법 및 주의사항 &amp;ndash; 4월 17일까지 | Neon&quot; data-og-type=&quot;article&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://neonomadj.com/%ED%81%B4%EB%A1%9C%EB%93%9Cclaude-%EC%9C%A0%EB%A3%8C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A3%BC%EB%AA%A9-%EB%AC%B4%EB%A3%8C-%ED%81%AC%EB%A0%88%EB%94%A720200-%EC%8B%A0%EC%B2%AD-%EB%B0%A9%EB%B2%95/&quot; data-source-url=&quot;https://neonomadj.com/%ED%81%B4%EB%A1%9C%EB%93%9Cclaude-%EC%9C%A0%EB%A3%8C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A3%BC%EB%AA%A9-%EB%AC%B4%EB%A3%8C-%ED%81%AC%EB%A0%88%EB%94%A720200-%EC%8B%A0%EC%B2%AD-%EB%B0%A9%EB%B2%95/&quot;&gt;
&lt;div style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/u0tSE/dJMb8SpIPqP/Bpq4rmmKjCfRZgIsonlbc0/img.png?width=1091&amp;amp;height=454&amp;amp;face=0_0_1091_454,https://scrap.kakaocdn.net/dn/bUOfCi/dJMb8XR6xje/7YqZVvbWkSUp7ZJ3hQOKJk/img.png?width=1091&amp;amp;height=454&amp;amp;face=0_0_1091_454,https://scrap.kakaocdn.net/dn/daRawa/dJMb8Rj2MXW/cXq34ktPjAQjVcKCt1wRc1/img.png?width=1091&amp;amp;height=454&amp;amp;face=0_0_1091_454');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;클로드(Claude) 유료 사용자 주목! 무료 크레딧($20~$200) 신청 방법 및 주의사항 &amp;ndash; 4월 17일까지 | Neon&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;최근 앤스로픽(Anthropic)에서 Claude 사용자를 위한 파격적인 프로모션을 발표했습니다. 새로운 '사용량 번들(Usage bundles)' 출시를 기념하여, 현재 구독 중인 플랜 가격에 상응하는 일회성 추가 사용&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;neonomadj.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 초기 설정 in Terminal&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;유료 결제를 완료 했다면, &lt;i&gt;claude&lt;/i&gt;를 설치하자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 방법은 mac os에 home brew가 설치되어 있다는 가정으로 설명하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #666666;&quot;&gt;(만약 homwbrew가 아직 없다면 설치부터 하자 (참고: &lt;a style=&quot;color: #666666;&quot; href=&quot;https://brew.sh/&quot;&gt;https://brew.sh/&lt;/a&gt;). claude code 외에 mac에서 개발하려면 필수템 중 하나다)&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;설치는 여러 루트로 할 수 있지만, 가장 간편한 cli에서 설치 방법을 추천한다.&lt;/p&gt;
&lt;pre id=&quot;code_1778819427152&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install -g @&amp;zwnj;anthropic-ai/claude-code&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;만약 npm이 없다면 다음 명령어로 설치가 가능하다: brew install node&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이제 &lt;i&gt;claude&lt;/i&gt;를 터미널 명령어로 입력하면, 다음 화면으로 시작할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMrHMk/dJMcai3UxRN/s0VBI6p5gJfMnwEBEDRJD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMrHMk/dJMcai3UxRN/s0VBI6p5gJfMnwEBEDRJD1/img.png&quot; data-alt=&quot;초기 UI 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMrHMk/dJMcai3UxRN/s0VBI6p5gJfMnwEBEDRJD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMrHMk%2FdJMcai3UxRN%2Fs0VBI6p5gJfMnwEBEDRJD1%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;700&quot; height=&quot;127&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;초기 UI 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 처음 시작하면 내가 지금 있는 위치(&lt;i&gt;pwd&lt;/i&gt;)가 어딘지 헷갈리는데, &lt;i&gt;claude&lt;/i&gt; 명령어를 검색하기 직전 위치에서 열린다고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;즉, claude로 수정/생성하고자 하는 폴더 위치에서 cluade를 키면 된다!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;작업하고자 하는 폴더에&lt;i&gt; /init&lt;/i&gt; 을 하면, 프로젝트를 설명해주는 마크다운 파일을 만들 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1996&quot; data-origin-height=&quot;906&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ougFM/dJMcabDMEfV/FfaBE4PTiJuzExXGBc1ANK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ougFM/dJMcabDMEfV/FfaBE4PTiJuzExXGBc1ANK/img.png&quot; data-alt=&quot;/init 명령어가 완수되면 CLAUDE.md 파일이 root 경로에 생긴다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ougFM/dJMcabDMEfV/FfaBE4PTiJuzExXGBc1ANK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FougFM%2FdJMcabDMEfV%2FFfaBE4PTiJuzExXGBc1ANK%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;700&quot; height=&quot;318&quot; data-origin-width=&quot;1996&quot; data-origin-height=&quot;906&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;/init 명령어가 완수되면 CLAUDE.md 파일이 root 경로에 생긴다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 원하는 프로젝트로 이동 후, &lt;b&gt;첫 작업 시작전에 &lt;i&gt;/init&lt;/i&gt; 명령어로 해당 프로젝트를 설명해주는 .md 파일을 먼저 만들어보자.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이후에 작업할 때, claude 가 이 .md 파일을 참고해서 작업을 더 수월하게 진행 할 수 있다. 단, AI가 작성한 초안 개념이기 때문에, .md 파일을 열어 환각 현상은 없는지, 추가에야할 정보는 없는지 반드시 확인하도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;(주의할점 1)&lt;/b&gt; 코드 베이스로 .md 파일을 만들어주기때문에 빈 폴더면 작업이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;(주의할점 2)&lt;/b&gt; 폴더명을 잘 지어야 하는데, 비슷한 폴더명이 있으면 자꾸 참고해도 되냐고 묻는다. 다 돈이기 때문에 중요한 폴더만 참고할 수 있도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;(opt.) 호출 모델을 변경할 수 있다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6cU90/dJMcabRHGOH/P3pngJbLRQvDt5NoKexMj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6cU90/dJMcabRHGOH/P3pngJbLRQvDt5NoKexMj1/img.png&quot; data-alt=&quot;default는 sonnet4.6 (effort: high) 모델이다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6cU90/dJMcabRHGOH/P3pngJbLRQvDt5NoKexMj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6cU90%2FdJMcabRHGOH%2FP3pngJbLRQvDt5NoKexMj1%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;700&quot; height=&quot;175&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;default는 sonnet4.6 (effort: high) 모델이다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;i&gt; /model&lt;/i&gt;을 입력하면 대화하는 모델을 바꿀 수 있다. 모델 성능은 Opus &amp;gt; Sonnet &amp;gt; Haiku 순이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이것저것 해보니까 어지간히 복잡한 Task 아니면 기본값인 Sonnet이 제일 무난하다. Opus는 성능은 좋으나 토큰수를 두배로 잡아먹기 때문에, 몇 번 대화를 안해도 사용량을 초과하는 경우가 많아 정말 가끔만 사용하게 된다. Haiku는 응답 속도가 빨라 간단한 태스크에서 사용하기 무난하다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. Claude에게 일 시키기 (코드 생성, 데이터 분석 등)&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이제 가장 기본으로 준비해야될 일은 끝났으니, 일을 시켜보도록 하자.&amp;nbsp; 관련해서는 다음 블로그를 참고했다. 자주 사용하는 명령어는 기억해두도록 하자: &lt;a href=&quot;https://javaexpert.tistory.com/1322&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Claude&amp;nbsp;Code&amp;nbsp;완전&amp;nbsp;가이드:&amp;nbsp;터미널에서&amp;nbsp;AI와&amp;nbsp;함께&amp;nbsp;개발하기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시키려는 일(instruction)을 &lt;i&gt;--prompt&lt;/i&gt; 인자에 넣어서 넘겨주면 된다. 기존 파일을 수정하거나, 새 파일을 생성하는 경우 모두 &lt;i&gt;--file&lt;/i&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;인자에 입력하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;1️⃣ 코드 생성:&lt;/b&gt; claude-code generate --file {file_name} --prompt {instruction}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 신규 생성 및 수정하고 싶은 파일 이름을 {file_name}에, 지시사항을 {instruction}에 넣으면 작동한다.&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2️⃣&lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;데이터 분석:&lt;/b&gt; {instruction}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- 데이터 분석을 하고 싶을 때는, 대상 파일의 경로, 이름 등을 주고 chatgpt한테 질문하듯이 자연어로 검색하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- 필요하다면 코드를 짜고, 그 코드를 돌려서 나온 결과를 cmd 창에 바로 띄어준다. 만약 코드에 실수가 있다면, 자기 스스로 수정해서 다시 생성한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- 아래는 특정 .jsonl 파일을 열어서 tool_type을 카운트 해달라고 시킨 결과이다. 한 번의 python code 실패 후 스스로 수정 후 결과값을 출력하는 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1686&quot; data-origin-height=&quot;962&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5izFH/dJMcahDYaUr/iNEBqHyeObKvGiqZfSNUXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5izFH/dJMcahDYaUr/iNEBqHyeObKvGiqZfSNUXK/img.png&quot; data-alt=&quot;출력 결과가 꽤나 이쁘게 나오는걸 확인할 수 있다. 요청하지도 않은 결과 분석까지 마지막에 해준다 (code_exec is far the most...)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5izFH/dJMcahDYaUr/iNEBqHyeObKvGiqZfSNUXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5izFH%2FdJMcahDYaUr%2FiNEBqHyeObKvGiqZfSNUXK%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;700&quot; height=&quot;399&quot; data-origin-width=&quot;1686&quot; data-origin-height=&quot;962&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 결과가 꽤나 이쁘게 나오는걸 확인할 수 있다. 요청하지도 않은 결과 분석까지 마지막에 해준다 (code_exec is far the most...)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;(opt.) 실험. 과연 복잡한 작업을 한번에 잘 수행할 수 있는가?&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- chatgpt 사용 시에는 최소 5단계는 나눠서 prompt를 입력한 작업을, claude에 한번에 넣어보았다. 과연 잘 할까?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;html에 데이터(약 30개 url)를 수집 -&amp;gt; 정제 (html2txt) -&amp;gt; 카데고리 분류&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;까지 하는 작업을 한 입력에 다 넣어봤다. 아래처럼 Prompt도 굉장히 길다. 작업이 헛되지 않게 한글로 1차 작성 후, chatgpt를 이용해서 정제 및 영어로 번역을 부탁했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- token usage가 0%에서, 이 작업 한번에 310%로 초과해버렸다. 토큰을 다 사용하면 중간에 작업이 중단되는게 아닌가 걱정했지만, 다행이도 cost usage만 넘지 않으면 중간에 끊기진 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nb1nB/dJMcaflUjCb/MXHPrJsaeMI8U6plVw32d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nb1nB/dJMcaflUjCb/MXHPrJsaeMI8U6plVw32d1/img.png&quot; data-alt=&quot;한 번의 작업으로 한달 비용 중 10% 소모. 10~15분정도 걸렸다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nb1nB/dJMcaflUjCb/MXHPrJsaeMI8U6plVw32d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnb1nB%2FdJMcaflUjCb%2FMXHPrJsaeMI8U6plVw32d1%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;700&quot; height=&quot;426&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;한 번의 작업으로 한달 비용 중 10% 소모. 10~15분정도 걸렸다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 최종 결과를 보면, 지시한대로 step-by-step으로 작업을 잘 수행한 것을 확인할 수 있다. web-fetch, html수집, 정제, 분류까지 한번에 수행해주다니 claude 최고...&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 한가지 아쉬운건, 코드로 짜달라고 할 껄 그랬다. 권한때문에 y를 중간중간에 눌러야되는게 많고, 재현해볼 코드가 없으니 다음에 같은 작업 수행 시 또 token을 사용해야 된다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;왠만하면 재현할 수 있는 파이썬 코드를 작성해달라고 프롬프트에 넣을 것.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1998&quot; data-origin-height=&quot;2234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfNDaX/dJMcaiJEsVW/DFFeSPMUMurnf4KZm9xeh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfNDaX/dJMcaiJEsVW/DFFeSPMUMurnf4KZm9xeh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfNDaX/dJMcaiJEsVW/DFFeSPMUMurnf4KZm9xeh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfNDaX%2FdJMcaiJEsVW%2FDFFeSPMUMurnf4KZm9xeh1%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;750&quot; height=&quot;839&quot; data-origin-width=&quot;1998&quot; data-origin-height=&quot;2234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 사용 프롬프트 참고&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[1차. 작성 한글 prompt]&lt;/p&gt;
&lt;div style=&quot;background-color: #fafafa; color: #333333;&quot; data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;./office_document'&amp;nbsp;폴더에&amp;nbsp;docx,&amp;nbsp;pdf,&amp;nbsp;xlsx,&amp;nbsp;ppt&amp;nbsp;관련&amp;nbsp;document를&amp;nbsp;구축해야&amp;nbsp;돼.&amp;nbsp;아래&amp;nbsp;방법대로&amp;nbsp;이&amp;nbsp;document를&amp;nbsp;구축하려고&amp;nbsp;해.&lt;br /&gt;&lt;br /&gt;먼저&amp;nbsp;'./office_document/reference.txt'는&amp;nbsp;네&amp;nbsp;가지&amp;nbsp;타입과&amp;nbsp;관련이&amp;nbsp;있는&amp;nbsp;python-library&amp;nbsp;버전들을&amp;nbsp;적어두었어.&amp;nbsp;이&amp;nbsp;파일을&amp;nbsp;읽고,&amp;nbsp;각&amp;nbsp;라이브러리와&amp;nbsp;명시된&amp;nbsp;버전에&amp;nbsp;맞게&amp;nbsp;최종적으로&amp;nbsp;네&amp;nbsp;가지&amp;nbsp;타입에&amp;nbsp;대한&amp;nbsp;document를&amp;nbsp;각각&amp;nbsp;생성하려&amp;nbsp;고&amp;nbsp;해.&lt;br /&gt;&lt;br /&gt;아래는&amp;nbsp;네가지&amp;nbsp;오피스&amp;nbsp;타입&amp;nbsp;중,&amp;nbsp;pdf&amp;nbsp;관련된&amp;nbsp;document&amp;nbsp;(&quot;./office_document/pdf.txt&quot;)를&amp;nbsp;구축하는&amp;nbsp;방법이야.&amp;nbsp;아래&amp;nbsp;순서대로&amp;nbsp;나머지&amp;nbsp;오피스타입도&amp;nbsp;document를&amp;nbsp;구축하면&amp;nbsp;돼.&lt;br /&gt;&lt;br /&gt;가장&amp;nbsp;먼저,&amp;nbsp;'./office_document/reference.txt'에서&amp;nbsp;네&amp;nbsp;가지&amp;nbsp;오피스&amp;nbsp;타입과&amp;nbsp;관련된&amp;nbsp;라이브러리를&amp;nbsp;분류할&amp;nbsp;것.&amp;nbsp;결과&amp;nbsp;파일은&amp;nbsp;'./office_document/reference_office_type.json'으로&amp;nbsp;저장.&amp;nbsp;예시&amp;nbsp;({&quot;pdf&quot;:[&quot;fpdf2&amp;nbsp;2.8.3&quot;,&amp;nbsp;&quot;reportlab&amp;nbsp;3.6.12&quot;,&amp;nbsp;...])&lt;br /&gt;&lt;br /&gt;pdf&amp;nbsp;관련된&amp;nbsp;document&amp;nbsp;(&quot;./office_document/pdf.txt&quot;)를&amp;nbsp;구축하는&amp;nbsp;방법&lt;br /&gt;1.&amp;nbsp;pdf와&amp;nbsp;관련된&amp;nbsp;library로&amp;nbsp;분류된&amp;nbsp;(예:fpdf2&amp;nbsp;2.8.3)&amp;nbsp;파이썬&amp;nbsp;라이브러리의&amp;nbsp;문서를&amp;nbsp;찾을&amp;nbsp;것.&amp;nbsp;&quot;&lt;a href=&quot;https://pypi.org/project/&quot;&gt;https://pypi.org/project/&lt;/a&gt;&quot;&amp;nbsp;웹사이트에서&amp;nbsp;&quot;fpdf2&quot;와&amp;nbsp;명시된&amp;nbsp;버전인&amp;nbsp;&quot;2.8.3&quot;&amp;nbsp;페이지를&amp;nbsp;검색&lt;br /&gt;2.&amp;nbsp;&quot;&lt;a href=&quot;https://pypi.org/project/fpdf2/2.8.3/&quot;&gt;https://pypi.org/project/fpdf2/2.8.3/&lt;/a&gt;&quot;&amp;nbsp;페이지를&amp;nbsp;찾았다면,&amp;nbsp;해당&amp;nbsp;페이지의&amp;nbsp;html&amp;nbsp;정보를&amp;nbsp;읽어오고,&amp;nbsp;&quot;./office_document/raw_data/{office_type}_{library}_v{ver}.html&quot;로&amp;nbsp;저장.&amp;nbsp;여기서는&amp;nbsp;&quot;./office_document/raw_data/pdf_fdpf2_v2_8_3.html&quot;로&amp;nbsp;저장하면&amp;nbsp;됨.&lt;br /&gt;3.&amp;nbsp;document의&amp;nbsp;구축&amp;nbsp;목적은,&amp;nbsp;오피스&amp;nbsp;관련&amp;nbsp;오픈데이터셋을&amp;nbsp;자동으로&amp;nbsp;생성하기&amp;nbsp;위함임.&amp;nbsp;해당&amp;nbsp;document를&amp;nbsp;참고해서&amp;nbsp;Llm이&amp;nbsp;적절한&amp;nbsp;nl2code&amp;nbsp;데이터로&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;document를&amp;nbsp;해당&amp;nbsp;라이브러리&amp;nbsp;명세&amp;nbsp;형식으로&amp;nbsp;수정.&amp;nbsp;단&amp;nbsp;버전&amp;nbsp;정보는&amp;nbsp;반드시&amp;nbsp;유지되어야&amp;nbsp;하며,&amp;nbsp;html에&amp;nbsp;없는&amp;nbsp;정보는&amp;nbsp;추가하지&amp;nbsp;말것.&amp;nbsp;해당&amp;nbsp;파일은&amp;nbsp;&quot;./office_document/html2txt/{office_library}_{library}_v{ver}.txt&quot;로&amp;nbsp;저장할&amp;nbsp;것.&lt;br /&gt;4.&amp;nbsp;최종적으로,&amp;nbsp;'./office_document/reference_office_type.json'에&amp;nbsp;저장된&amp;nbsp;타입을&amp;nbsp;참고해서&amp;nbsp;&amp;nbsp;&quot;./office_document/html2txt/&quot;&amp;nbsp;수집된&amp;nbsp;파이썬&amp;nbsp;라이브러리에&amp;nbsp;대한&amp;nbsp;명세를&amp;nbsp;&quot;./office_document/{office_type}.txt&quot;로&amp;nbsp;분류해&amp;nbsp;네&amp;nbsp;개의&amp;nbsp;파일로&amp;nbsp;생성할&amp;nbsp;것.&amp;nbsp;즉,&amp;nbsp;&quot;./office_document/pdf.txt&quot;는&amp;nbsp;pdf와&amp;nbsp;관련된&amp;nbsp;라이브러리에&amp;nbsp;해당하는&amp;nbsp;&quot;fpdf2&amp;nbsp;2.8.3&quot;,&amp;nbsp;&quot;reportlab&amp;nbsp;3.6.12&quot;에&amp;nbsp;대한&amp;nbsp;내용이&amp;nbsp;들어가&amp;nbsp;있어야&amp;nbsp;함.&amp;nbsp;단,&amp;nbsp;네&amp;nbsp;가지&amp;nbsp;타입에&amp;nbsp;해당하지&amp;nbsp;않을&amp;nbsp;경우&amp;nbsp;&quot;./office_document/others.txt&quot;로&amp;nbsp;저장할&amp;nbsp;것.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&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;[2차. chatgpt 정제 및 영어 번역]&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;div style=&quot;background-color: #fafafa; color: #333333;&quot; data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;You&amp;nbsp;are&amp;nbsp;tasked&amp;nbsp;with&amp;nbsp;upgrading&amp;nbsp;the&amp;nbsp;open&amp;nbsp;dataset&amp;nbsp;generation&amp;nbsp;pipeline&amp;nbsp;from&amp;nbsp;version&amp;nbsp;2.5&amp;nbsp;to&amp;nbsp;version&amp;nbsp;3.&lt;br /&gt;&lt;br /&gt;##&amp;nbsp;Background&lt;br /&gt;-&amp;nbsp;The&amp;nbsp;current&amp;nbsp;pipeline&amp;nbsp;(v2.5)&amp;nbsp;is&amp;nbsp;located&amp;nbsp;at:&amp;nbsp;`./v2_5_gen_process_code`&lt;br /&gt;-&amp;nbsp;It&amp;nbsp;includes&amp;nbsp;`1_generate_loop_n.py`,&amp;nbsp;which&amp;nbsp;currently&amp;nbsp;supports&amp;nbsp;only&amp;nbsp;`pdf`&amp;nbsp;and&amp;nbsp;`docx`.&lt;br /&gt;-&amp;nbsp;The&amp;nbsp;goal&amp;nbsp;is&amp;nbsp;to&amp;nbsp;upgrade&amp;nbsp;this&amp;nbsp;pipeline&amp;nbsp;to&amp;nbsp;version&amp;nbsp;3&amp;nbsp;so&amp;nbsp;that&amp;nbsp;it&amp;nbsp;supports&amp;nbsp;four&amp;nbsp;office&amp;nbsp;document&amp;nbsp;types:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;pdf&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;docx&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;xlsx&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;ppt&lt;br /&gt;&lt;br /&gt;##&amp;nbsp;High-Level&amp;nbsp;Goal&lt;br /&gt;&lt;br /&gt;Before&amp;nbsp;modifying&amp;nbsp;the&amp;nbsp;generation&amp;nbsp;code,&amp;nbsp;you&amp;nbsp;must&amp;nbsp;first&amp;nbsp;build&amp;nbsp;structured&amp;nbsp;documentation&amp;nbsp;for&amp;nbsp;each&amp;nbsp;office&amp;nbsp;type&amp;nbsp;under&amp;nbsp;`./office_document`.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;##&amp;nbsp;Step&amp;nbsp;1:&amp;nbsp;Parse&amp;nbsp;Reference&amp;nbsp;File&lt;br /&gt;&lt;br /&gt;Input:&lt;br /&gt;-&amp;nbsp;`./office_document/reference.txt`&lt;br /&gt;&lt;br /&gt;Task:&lt;br /&gt;-&amp;nbsp;Read&amp;nbsp;the&amp;nbsp;file&amp;nbsp;and&amp;nbsp;classify&amp;nbsp;all&amp;nbsp;listed&amp;nbsp;Python&amp;nbsp;libraries&amp;nbsp;(with&amp;nbsp;versions)&amp;nbsp;into&amp;nbsp;office&amp;nbsp;types:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;pdf&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;docx&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;xlsx&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;ppt&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;others&amp;nbsp;(if&amp;nbsp;not&amp;nbsp;applicable)&lt;br /&gt;&lt;br /&gt;Output:&lt;br /&gt;-&amp;nbsp;Save&amp;nbsp;the&amp;nbsp;classification&amp;nbsp;result&amp;nbsp;as:&lt;br /&gt;&amp;nbsp;&amp;nbsp;`./office_document/reference_office_type.json`&lt;br /&gt;&lt;br /&gt;Format&amp;nbsp;example:&lt;br /&gt;{&lt;br /&gt;&quot;pdf&quot;:&amp;nbsp;[&quot;fpdf2&amp;nbsp;2.8.3&quot;,&amp;nbsp;&quot;reportlab&amp;nbsp;3.6.12&quot;],&lt;br /&gt;&quot;docx&quot;:&amp;nbsp;[...],&lt;br /&gt;&quot;xlsx&quot;:&amp;nbsp;[...],&lt;br /&gt;&quot;ppt&quot;:&amp;nbsp;[...],&lt;br /&gt;&quot;others&quot;:&amp;nbsp;[...]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;##&amp;nbsp;Step&amp;nbsp;2:&amp;nbsp;Collect&amp;nbsp;Raw&amp;nbsp;HTML&amp;nbsp;from&amp;nbsp;PyPI&lt;br /&gt;&lt;br /&gt;For&amp;nbsp;each&amp;nbsp;library&amp;nbsp;in&amp;nbsp;each&amp;nbsp;office&amp;nbsp;type:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;Construct&amp;nbsp;the&amp;nbsp;PyPI&amp;nbsp;URL:&amp;nbsp;&lt;a href=&quot;https://pypi.org/project/&quot;&gt;https://pypi.org/project/&lt;/a&gt;{library_name}/{version}/&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;Fetch&amp;nbsp;the&amp;nbsp;HTML&amp;nbsp;content&amp;nbsp;of&amp;nbsp;the&amp;nbsp;page.&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;Save&amp;nbsp;the&amp;nbsp;raw&amp;nbsp;HTML&amp;nbsp;file&amp;nbsp;to:&amp;nbsp;./office_document/raw_data/{office_type}_{library}_v{version}.html&lt;br /&gt;&lt;br /&gt;Naming&amp;nbsp;rules:&lt;br /&gt;-&amp;nbsp;Replace&amp;nbsp;dots&amp;nbsp;in&amp;nbsp;version&amp;nbsp;with&amp;nbsp;underscores&amp;nbsp;(e.g.,&amp;nbsp;2.8.3&amp;nbsp;&amp;rarr;&amp;nbsp;v2_8_3)&lt;br /&gt;-&amp;nbsp;Example:pdf_fpdf2_v2_8_3.html&lt;br /&gt;&lt;br /&gt;Constraints:&lt;br /&gt;-&amp;nbsp;Do&amp;nbsp;NOT&amp;nbsp;modify&amp;nbsp;the&amp;nbsp;HTML&amp;nbsp;content&lt;br /&gt;-&amp;nbsp;If&amp;nbsp;the&amp;nbsp;page&amp;nbsp;does&amp;nbsp;not&amp;nbsp;exist,&amp;nbsp;skip&amp;nbsp;and&amp;nbsp;log&amp;nbsp;the&amp;nbsp;failure&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;##&amp;nbsp;Step&amp;nbsp;3:&amp;nbsp;Convert&amp;nbsp;HTML&amp;nbsp;to&amp;nbsp;Structured&amp;nbsp;Text&amp;nbsp;Specification&lt;br /&gt;&lt;br /&gt;Goal:&lt;br /&gt;Transform&amp;nbsp;each&amp;nbsp;HTML&amp;nbsp;document&amp;nbsp;into&amp;nbsp;a&amp;nbsp;clean,&amp;nbsp;structured&amp;nbsp;specification&amp;nbsp;that&amp;nbsp;can&amp;nbsp;be&amp;nbsp;used&amp;nbsp;for&amp;nbsp;NL2Code&amp;nbsp;dataset&amp;nbsp;generation.&lt;br /&gt;&lt;br /&gt;For&amp;nbsp;each&amp;nbsp;HTML&amp;nbsp;file:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;Extract&amp;nbsp;relevant&amp;nbsp;documentation&amp;nbsp;content.&lt;br /&gt;2.&amp;nbsp;Convert&amp;nbsp;it&amp;nbsp;into&amp;nbsp;a&amp;nbsp;structured&amp;nbsp;text&amp;nbsp;format&amp;nbsp;describing:&lt;br /&gt;&amp;nbsp;-&amp;nbsp;library&amp;nbsp;purpose&lt;br /&gt;&amp;nbsp;-&amp;nbsp;key&amp;nbsp;classes/functions&lt;br /&gt;&amp;nbsp;-&amp;nbsp;usage&amp;nbsp;patterns&lt;br /&gt;&lt;br /&gt;Output:&lt;br /&gt;-&amp;nbsp;Save&amp;nbsp;to:./office_document/html2txt/{office_type}_{library}_v{version}.txt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Constraints:&lt;br /&gt;-&amp;nbsp;MUST&amp;nbsp;preserve&amp;nbsp;the&amp;nbsp;exact&amp;nbsp;library&amp;nbsp;version&lt;br /&gt;-&amp;nbsp;MUST&amp;nbsp;NOT&amp;nbsp;add&amp;nbsp;information&amp;nbsp;that&amp;nbsp;is&amp;nbsp;not&amp;nbsp;present&amp;nbsp;in&amp;nbsp;the&amp;nbsp;HTML&lt;br /&gt;-&amp;nbsp;MUST&amp;nbsp;NOT&amp;nbsp;hallucinate&amp;nbsp;or&amp;nbsp;infer&amp;nbsp;missing&amp;nbsp;details&lt;br /&gt;-&amp;nbsp;Keep&amp;nbsp;the&amp;nbsp;format&amp;nbsp;consistent&amp;nbsp;across&amp;nbsp;all&amp;nbsp;libraries&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;##&amp;nbsp;Step&amp;nbsp;4:&amp;nbsp;Aggregate&amp;nbsp;by&amp;nbsp;Office&amp;nbsp;Type&lt;br /&gt;&lt;br /&gt;Using:&lt;br /&gt;-&amp;nbsp;`reference_office_type.json`&lt;br /&gt;-&amp;nbsp;files&amp;nbsp;in&amp;nbsp;`./office_document/html2txt/`&lt;br /&gt;&lt;br /&gt;Task:&lt;br /&gt;-&amp;nbsp;Merge&amp;nbsp;library&amp;nbsp;specifications&amp;nbsp;into&amp;nbsp;one&amp;nbsp;file&amp;nbsp;per&amp;nbsp;office&amp;nbsp;type:&lt;br /&gt;&lt;br /&gt;Output&amp;nbsp;files:&lt;br /&gt;./office_document/pdf.txt&lt;br /&gt;./office_document/docx.txt&lt;br /&gt;./office_document/xlsx.txt&lt;br /&gt;./office_document/ppt.txt&lt;br /&gt;./office_document/others.txt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Requirements:&lt;br /&gt;-&amp;nbsp;Each&amp;nbsp;file&amp;nbsp;must&amp;nbsp;contain&amp;nbsp;all&amp;nbsp;corresponding&amp;nbsp;library&amp;nbsp;specifications&lt;br /&gt;-&amp;nbsp;Maintain&amp;nbsp;clear&amp;nbsp;separation&amp;nbsp;between&amp;nbsp;libraries&lt;br /&gt;-&amp;nbsp;Preserve&amp;nbsp;version&amp;nbsp;information&amp;nbsp;for&amp;nbsp;every&amp;nbsp;library&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;##&amp;nbsp;Final&amp;nbsp;Notes&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;Follow&amp;nbsp;the&amp;nbsp;exact&amp;nbsp;directory&amp;nbsp;and&amp;nbsp;naming&amp;nbsp;conventions&lt;br /&gt;-&amp;nbsp;Do&amp;nbsp;not&amp;nbsp;skip&amp;nbsp;steps&lt;br /&gt;-&amp;nbsp;Ensure&amp;nbsp;all&amp;nbsp;outputs&amp;nbsp;are&amp;nbsp;reproducible&amp;nbsp;and&amp;nbsp;consistent&lt;br /&gt;-&amp;nbsp;Log&amp;nbsp;any&amp;nbsp;failures&amp;nbsp;or&amp;nbsp;missing&amp;nbsp;data&amp;nbsp;clearly&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>바이브 코딩/클로드 코드</category>
      <author>계속지나가기</author>
      <guid isPermaLink="true">https://codingsmu.tistory.com/185</guid>
      <comments>https://codingsmu.tistory.com/185#entry185comment</comments>
      <pubDate>Fri, 10 Apr 2026 21:48:39 +0900</pubDate>
    </item>
    <item>
      <title>간단 소개</title>
      <link>https://codingsmu.tistory.com/80</link>
      <description>&lt;p style=&quot;text-align: center;&quot; 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;1013&quot; data-origin-height=&quot;1351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hru21/btsL1sQLgtV/DqCKmwNq2fvbHSNfxkplZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hru21/btsL1sQLgtV/DqCKmwNq2fvbHSNfxkplZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hru21/btsL1sQLgtV/DqCKmwNq2fvbHSNfxkplZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHru21%2FbtsL1sQLgtV%2FDqCKmwNq2fvbHSNfxkplZ1%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;400&quot; height=&quot;533&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;1351&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자연어처리 엔지니어로 밥벌어 먹고 있는 사람입니다.&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아직 주니어 개발자라 부족함이 많습니다. &lt;/b&gt;&lt;b&gt;게시글에 궁금한 내용이 있거나, &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;잘못된 정보라고 생각하시는 부분이 있다면 언제든지 댓글로 알려주세요&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;블로그 관련 문의는 다음 이메일로 받고 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;als398@naver.com&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;*해당 티스토리는 2020년도부터 &lt;b&gt;코딩스뮤&lt;/b&gt;라는 이름으로&amp;nbsp; CS 관련 기술 블로그로 운영되고 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;2차 전직을 AI로 해서, 최근에는 AI 특히, NLP 관련 내용을 다루고 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <author>계속지나가기</author>
      <guid isPermaLink="true">https://codingsmu.tistory.com/80</guid>
      <comments>https://codingsmu.tistory.com/80#entry80comment</comments>
      <pubDate>Sat, 8 Feb 2025 16:41:43 +0900</pubDate>
    </item>
    <item>
      <title>[주간 LLM] LLM (1) - 딥시크(DeepSeek) 모델</title>
      <link>https://codingsmu.tistory.com/182</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2574&quot; data-origin-height=&quot;908&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bubweZ/btsMbwx1wiy/PLByjThpHOyWLjt1Yzg2Tk/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bubweZ/btsMbwx1wiy/PLByjThpHOyWLjt1Yzg2Tk/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bubweZ/btsMbwx1wiy/PLByjThpHOyWLjt1Yzg2Tk/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbubweZ%2FbtsMbwx1wiy%2FPLByjThpHOyWLjt1Yzg2Tk%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2574&quot; height=&quot;908&quot; data-origin-width=&quot;2574&quot; data-origin-height=&quot;908&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;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;주간 LLM 은 매주 LLM 관련 최신 연구, 논문을 다루는 시리즈 입니다.&lt;br /&gt;2025.02 - 1주차는 최근 주목받고 있는 오픈소스 LLM인 딥시크(DeepSeek)에 대해 다룹니다.&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot; data-pm-slice=&quot;1 3 []&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot; data-pm-slice=&quot;1 3 []&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot; data-pm-slice=&quot;1 3 []&quot;&gt;Overview&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 중국의 AI 스타트업인 DeepSeek가 개발한 오픈소스 LLM이 세계적으로 주목받고 있습니다. 사실, DeepSeek에서 처음 공개한 모델은 23년 11월에 공개된 코딩 특화 모델 DeepSeek Coder이지만,   DeepSeek의 이름이 주목받기 시작한 것은 작년 말인, &lt;b&gt;약 670B의 거대 언어모델인 DeepSeek-V3을 80억원에 불가한 획기적인 비용으로 개발&lt;/b&gt;했다는 사실이 알려지면서 입니다. 또한, 바로 저번달인 25년 1월에 DeepSeek-R1모델이 공개되면서 수천억원의 비용을 들여 모델을 개발한 OpenAI와도 비교되고 있는 상황입니다. 하지만, DeepSeek의 저비용-고성능 모델 개발이 가능했던 이유를 아래의 사진처럼 보는 시각도 있긴 합니다.&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;812&quot; data-origin-height=&quot;948&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l2PsB/btsMbG2giNv/m2obt3dSN1e2zuqZkKLKv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l2PsB/btsMbG2giNv/m2obt3dSN1e2zuqZkKLKv0/img.png&quot; data-alt=&quot;(출처: @Thread)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l2PsB/btsMbG2giNv/m2obt3dSN1e2zuqZkKLKv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2PsB%2FbtsMbG2giNv%2Fm2obt3dSN1e2zuqZkKLKv0%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;400&quot; height=&quot;467&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;948&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(출처: @Thread)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 글에서는 DeepSeek에서 공개한 모델의 히스토리와, 모델의 학습 기법, 최근 추론형으로 나온 DeepSeek-R1 모델을 직접 돌려보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;*deepseek의 전반적인 이론보다는, 실제로 현업에서 deepseek를 학습/추론으로 사용하고 싶은 분께 더 적합한 내용을 다루고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. DeepSeek 모델을 돌리기 위한 하드웨어 스펙&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 현업에서 DeepSeek를 사용하려고 한다면, 개인 혹은 회사 자원으로 DeepSeek를 돌릴 수 있을까가 가장 궁금할 것 입니다. 아래 huggingface에서 오피셜 모델들을 제공하고 있으며, 크게 Full Model과 Qunatization Model로 나누어집니다. 각각의 모델을 돌리기위한 최소 GPU 사양을 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://huggingface.co/deepseek-ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/deepseek-ai&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739146077777&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;deepseek-ai (DeepSeek)&quot; data-og-description=&quot;Running on Zero&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/deepseek-ai&quot; data-og-url=&quot;https://huggingface.co/deepseek-ai&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bl18NM/hyYfQwHZcQ/M7rWYuqnHHLdqaXk0vR8W0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/ble56F/hyYfZ1uhvC/YbZ9JqyjOaUSQLNjvuoC3K/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/deepseek-ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/deepseek-ai&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bl18NM/hyYfQwHZcQ/M7rWYuqnHHLdqaXk0vR8W0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/ble56F/hyYfZ1uhvC/YbZ9JqyjOaUSQLNjvuoC3K/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;deepseek-ai (DeepSeek)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Running on Zero&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;*아래 스펙은 가장 최신에 나온 DeepSeek-R1을 기준으로 작성되었습니다. 이전모델(ex. DeepSeek-V3)의 경우 다음 링크를 참고하시길 바랍니다(&lt;a href=&quot;https://apxml.com/posts/system-requirements-deepseek-models&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://apxml.com/posts/system-requirements-deepseek-models&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.1. Full Model&lt;/h4&gt;
&lt;div data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;table&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;div data-testid=&quot;table-alignment-container&quot;&gt;
&lt;div data-number-column=&quot;false&quot; data-layout=&quot;align-start&quot; data-testid=&quot;table-container&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-number-column=&quot;false&quot; data-layout=&quot;align-start&quot; data-testid=&quot;table-container&quot;&gt;
&lt;table style=&quot;background-color: #ffffff; color: #000000; text-align: start; border-collapse: collapse; width: 100%; height: 162px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;&lt;b&gt;Model&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;&lt;b&gt;Parameter&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;&lt;b&gt;VRAM &lt;br /&gt;Requirement&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px; text-align: center;&quot;&gt;&lt;b&gt;Recommended GPU&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;DeepSeek-R1-Zero&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;671B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;~1,543 GB&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;Multi-GPU setup (NVIDIA A100 80GB x16)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #fafafa; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;DeepSeek-R1&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;671B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;~1,543 GB&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;Multi-GPU setup (NVIDIA A100 80GB x16)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;DeepSeek-R1-Distill-Qwen-1.5B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;1.5B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;~3.9 GB&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;NVIDIA RTX 3060 12GB or higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #fafafa; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;DeepSeek-R1-Distill-Qwen-7B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;7B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;~18 GB&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;NVIDIA RTX 4090 24GB or higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;DeepSeek-R1-Distill-Llama-8B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;8B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;~21 GB&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;NVIDIA RTX 4090 24GB or higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #fafafa; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;DeepSeek-R1-Distill-Qwen-14B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;14B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;~36 GB&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;Multi-GPU setup (NVIDIA RTX 4090 x2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;DeepSeek-R1-Distill-Qwen-32B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;32B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;~82 GB&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;Multi-GPU setup (NVIDIA RTX 4090 x4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #fafafa; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;DeepSeek-R1-Distill-Llama-70B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;70B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;~181 GB&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;Multi-GPU setup (NVIDIA A100 80GB x3)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모델 별 학습 파라미터와 요구되는 최소 GPU 사양을 위 표에서 구체적으로 확인할 수 있습니다.&lt;b&gt; 원본 모델의 경우 멀티 GPU 세팅으로 무려 A100 80GB가 16개가 필요&lt;/b&gt;합니다. 개인으로는 택도 없고, 회사에서도 서버가 넉넉하지 않는 이상 돌리기 힘든 사양입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 공식에서는 R1 모델로 생성된 합성 데이터로 파인튜닝된 모델인 Qwen, Llama 를 이용한 'DeepSeek-R1-Distill' 모델도 함께 제공하고 있습니다. 1~8B 모델의 경우는 개인이 돌리기에도 부담스럽지 않은 요구사항을 보입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;추가로, VRAM Requirement는 GPU가 데이터를 저장하고 불러올 수 있는 VRAM의 최소용량을 얘기합니다. nvidia-smi 명령어를 터미널에 입력하시면 쉽게 확인할 수 있는데, 예시로 제 서버에 해당 명령어를 치면 다음과 같은 테이블이 나옵니다. 이때, 81920MiB -&amp;gt; 80GB의 VRAM 용량으로 최대&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;DeepSeek-R1-Distill-Qwen-32B 정도까지 올릴 수 있는 걸 확인할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;table&quot; data-prosemirror-content-type=&quot;node&quot;&gt;
&lt;div data-testid=&quot;table-alignment-container&quot;&gt;
&lt;div data-testid=&quot;table-container&quot; data-layout=&quot;align-start&quot; data-number-column=&quot;false&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1.2. Quantized Models&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #000000; text-align: start; border-collapse: collapse; width: 100%; height: 180px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 36px; width: 30.2326%;&quot;&gt;&lt;b&gt;Model&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 36px; width: 12.4418%;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;Parameter&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 36px; width: 15.5814%;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;VRAM &lt;br /&gt;Requirement&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 36px; width: 41.6279%;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;Recommended GPU&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; width: 30.2326%;&quot;&gt;DeepSeek-R1-Zero&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 12.4418%;&quot;&gt;671B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 15.5814%;&quot;&gt;~436 GB&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 41.6279%;&quot;&gt;Multi-GPU setup (NVIDIA A100 80GB x6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #fafafa; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; width: 30.2326%;&quot;&gt;DeepSeek-R1&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 12.4418%;&quot;&gt;671B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 15.5814%;&quot;&gt;~436 GB&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 41.6279%;&quot;&gt;Multi-GPU setup (NVIDIA A100 80GB x6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; width: 30.2326%;&quot;&gt;DeepSeek-R1-Distill-Qwen-1.5B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 12.4418%;&quot;&gt;1.5B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 15.5814%;&quot;&gt;~1 GB&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 41.6279%;&quot;&gt;NVIDIA RTX 3050 8GB or higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #fafafa; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; width: 30.2326%;&quot;&gt;DeepSeek-R1-Distill-Qwen-7B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 12.4418%;&quot;&gt;7B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 15.5814%;&quot;&gt;~4.5 GB&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 41.6279%;&quot;&gt;NVIDIA RTX 3060 12GB or higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; width: 30.2326%;&quot;&gt;DeepSeek-R1-Distill-Llama-8B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 12.4418%;&quot;&gt;8B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 15.5814%;&quot;&gt;~5 GB&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 41.6279%;&quot;&gt;NVIDIA RTX 3060 12GB or higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #fafafa; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; width: 30.2326%;&quot;&gt;DeepSeek-R1-Distill-Qwen-14B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 12.4418%;&quot;&gt;14B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 15.5814%;&quot;&gt;~9 GB&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 41.6279%;&quot;&gt;NVIDIA RTX 4080 16GB or higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; width: 30.2326%;&quot;&gt;DeepSeek-R1-Distill-Qwen-32B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 12.4418%;&quot;&gt;32B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 15.5814%;&quot;&gt;~21GB&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 41.6279%;&quot;&gt;NVIDIA RTX 4090 24GB or higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #fafafa; height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px; width: 30.2326%;&quot;&gt;DeepSeek-R1-Distill-Llama-70B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 12.4418%;&quot;&gt;70B&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 15.5814%;&quot;&gt;~46 GB&lt;/td&gt;
&lt;td style=&quot;height: 18px; width: 41.6279%;&quot;&gt;Multi-GPU setup (NVIDIA RTX 4090 24GB x2)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Full Model이 너무 부담스럽다면 다음의 경량화 모델 옵션도 고려해볼 수 있습니다. 위 표의 모델은 모두 원본 모델을 4-bit로 Quantization한 모델로, Distillation 모델의 경우 개인 컴 GPU로도 많이 사용하는 RTX3050, 3060 스펙에서도 돌아간다고 합니다. R1, R1-Zero 모델도 A100 80GB 6장으로 돌릴 수 있다고 합니다. Quntization 모델의 경우 전반적으로 요구되는 VRAM 용량이 대략 1/3로 줄어든다고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. DeepSeek 모델 별 학습 기법, 특징&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음으로, DeepSeek에서 공개한 모델들의 학습 기법 및 특징을 살펴보겠습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-layout=&quot;custom&quot;&gt;
&lt;div data-testid=&quot;table-alignment-container&quot;&gt;
&lt;div data-testid=&quot;table-container&quot; data-layout=&quot;align-start&quot; data-number-column=&quot;false&quot;&gt;
&lt;p data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;paragraph&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 279px;&quot; border=&quot;1&quot; data-table-width=&quot;851&quot; data-table-local-id=&quot;98b8798e-0ca6-4e8a-8480-7c2fced3b4c9&quot; data-autosize=&quot;false&quot; data-layout=&quot;align-start&quot; data-number-column=&quot;false&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 17.3255%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;모델&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.55818%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;발표일&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.0466%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;사이즈&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.9301%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;비교 모델&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.0233%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableRow&quot; data-prosemirror-content-type=&quot;node&quot;&gt;
&lt;td style=&quot;width: 17.3255%; height: 40px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;231&quot;&gt;
&lt;div data-prosemirror-mark-name=&quot;alignment&quot; data-prosemirror-content-type=&quot;mark&quot; data-align=&quot;center&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;DeepSeek Coder&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 7.55818%; height: 40px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;129&quot;&gt;
&lt;div data-prosemirror-mark-name=&quot;alignment&quot; data-prosemirror-content-type=&quot;mark&quot; data-align=&quot;center&quot;&gt;&lt;span&gt;23.11&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 11.0466%; height: 40px;&quot;&gt;&lt;span&gt;1B~33B&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.9301%; height: 40px;&quot;&gt;&lt;span&gt;CodeLlama, GPT-3.5, 4 &lt;br /&gt;(Code Task Only)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.0233%; height: 40px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;491&quot;&gt;&lt;span&gt;코딩 특화 모델. &lt;br /&gt;(학습시 87% 코드, 13% 자연어 구성)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableRow&quot; data-prosemirror-content-type=&quot;node&quot;&gt;
&lt;td style=&quot;width: 17.3255%; height: 36px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;231&quot;&gt;
&lt;div data-prosemirror-mark-name=&quot;alignment&quot; data-prosemirror-content-type=&quot;mark&quot; data-align=&quot;center&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;DeepSeek Math&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 7.55818%; height: 36px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;129&quot;&gt;
&lt;div data-prosemirror-mark-name=&quot;alignment&quot; data-prosemirror-content-type=&quot;mark&quot; data-align=&quot;center&quot;&gt;&lt;span&gt;24.02&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 11.0466%; height: 36px;&quot;&gt;&lt;span&gt;7B&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.9301%; height: 36px;&quot;&gt;&lt;span&gt;GPT-4, Gemini, Qwen&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;Math Task Only)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.0233%; height: 36px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;491&quot;&gt;&lt;span&gt;수학 문제 특화 모델&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3255%;&quot;&gt;
&lt;div data-prosemirror-mark-name=&quot;alignment&quot; data-prosemirror-content-type=&quot;mark&quot; data-align=&quot;center&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;DeepSeek-VL, VL2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 7.55818%;&quot;&gt;
&lt;div data-prosemirror-mark-name=&quot;alignment&quot; data-prosemirror-content-type=&quot;mark&quot; data-align=&quot;center&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;24.03&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 11.0466%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;1.3B~&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;7B&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.9301%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;GPT-4V, Qwen-VL&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.0233%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;Vision-Language 모델로,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;다양한 multi-modal task 수행이 가능&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableRow&quot; data-prosemirror-content-type=&quot;node&quot;&gt;
&lt;td style=&quot;width: 17.3255%; height: 43px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;231&quot;&gt;
&lt;div data-prosemirror-mark-name=&quot;alignment&quot; data-prosemirror-content-type=&quot;mark&quot; data-align=&quot;center&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;DeepSeek-V2&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 7.55818%; height: 43px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;129&quot;&gt;
&lt;div data-prosemirror-mark-name=&quot;alignment&quot; data-prosemirror-content-type=&quot;mark&quot; data-align=&quot;center&quot;&gt;&lt;span&gt;24.05&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 11.0466%; height: 43px;&quot;&gt;&lt;span&gt;236B&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.9301%; height: 43px;&quot;&gt;&lt;span&gt;Llama3, Qwen1.5&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.0233%; height: 43px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;491&quot;&gt;&lt;span&gt;본격적으로 100B이상의 LLM 모델 등장 시기.&lt;br /&gt;비용 절감과 성능 향상에 초점을 둠 (GPT-4 대비 1/10 비용)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableRow&quot; data-prosemirror-content-type=&quot;node&quot;&gt;
&lt;td style=&quot;width: 17.3255%; height: 60px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;231&quot;&gt;
&lt;div data-prosemirror-mark-name=&quot;alignment&quot; data-prosemirror-content-type=&quot;mark&quot; data-align=&quot;center&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;DeepSeek-V3&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 7.55818%; height: 60px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;129&quot;&gt;
&lt;div data-prosemirror-mark-name=&quot;alignment&quot; data-prosemirror-content-type=&quot;mark&quot; data-align=&quot;center&quot;&gt;&lt;span&gt;24.12&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 11.0466%; height: 60px;&quot;&gt;&lt;span&gt;671B (37B)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.9301%; height: 60px;&quot;&gt;&lt;span&gt;&amp;nbsp;Qwen2.5-72B, &lt;br /&gt;Lllama 3.1-405B&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.0233%; height: 60px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;491&quot;&gt;&lt;span&gt;총 파라미터는 671B이나, &lt;br /&gt;활성화되는 파라미터는 37B (MoE 아키텍처 도입)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableRow&quot; data-prosemirror-content-type=&quot;node&quot;&gt;
&lt;td style=&quot;width: 17.3255%; height: 60px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;231&quot;&gt;
&lt;div data-prosemirror-mark-name=&quot;alignment&quot; data-prosemirror-content-type=&quot;mark&quot; data-align=&quot;center&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;DeepSeek-R1&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 7.55818%; height: 60px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;129&quot;&gt;
&lt;div data-prosemirror-mark-name=&quot;alignment&quot; data-prosemirror-content-type=&quot;mark&quot; data-align=&quot;center&quot;&gt;&lt;span&gt;25.01&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 11.0466%; height: 60px;&quot;&gt;&lt;span&gt; &lt;span&gt;671B &lt;span&gt;(37B)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.9301%; height: 60px;&quot;&gt;&lt;span&gt;openai-o1, o1-mini&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.0233%; height: 60px;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;491&quot;&gt;&lt;span&gt;Deepseek-V3 모델 기반으로, &lt;br /&gt;두가지 강화학습 기법을 적용한 모델(R1, R1-Zero) 공개&lt;br /&gt;무료 추론이 가능한 어플 공개로, &lt;br /&gt;Chatgpt를 제치고 북미 앱 다운로드 1위 달성&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-expanded=&quot;false&quot; data-title=&quot;1) DeepSeekMoE / DeepSeekMLA&quot; data-node-type=&quot;expand&quot; data-testid=&quot;expand-container-expand-expand-title-1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-expanded=&quot;false&quot; data-title=&quot;1) DeepSeekMoE / DeepSeekMLA&quot; data-node-type=&quot;expand&quot; data-testid=&quot;expand-container-expand-expand-title-1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-expanded=&quot;false&quot; data-title=&quot;1) DeepSeekMoE / DeepSeekMLA&quot; data-node-type=&quot;expand&quot; data-testid=&quot;expand-container-expand-expand-title-1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-expanded=&quot;false&quot; data-title=&quot;1) DeepSeekMoE / DeepSeekMLA&quot; data-node-type=&quot;expand&quot; data-testid=&quot;expand-container-expand-expand-title-1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-testid=&quot;tooltip--container&quot;&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2.11 코딩, 수학 모델: &lt;span style=&quot;color: #006dd7;&quot;&gt;DeepSeek-Coder, Math&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;nbsp;DeepSeek 모델의 처음 시작은 코딩과 수학 문제 해결에 초점이 맞춰진 모델입니다. &lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;DeepSeek Coder 모델의 경우&lt;/span&gt; 약 86개의 다양한 프로그래밍 언어를 지원&lt;/b&gt;합니다.&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;b&gt;DeepSeek Math&lt;/b&gt;에서는&lt;b&gt; 7B 모델로, 용도에 따라 Base, Instruct, RL 버전을 함께 제공하며 다양한 카테고리의 수학 문제 해결을 제공&lt;/b&gt;합니다. 해당 모델에서는 영어와 중국어만을 지원하며 공개된 벤치마크에 의하면, &lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;코딩 문제와 수학 문제 해결 태스크에 한해서&lt;/span&gt; GPT-3.5와 GPT-4 사이의 성능&lt;/b&gt;을 보입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;2.2. Vision-Language 모델&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;nbsp;등장: &lt;span style=&quot;color: #8a3db6;&quot;&gt;DeepSeek-VL, VL2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;b&gt;&amp;nbsp;DeepSeek VL의 경우 Vision-Language 모델&lt;/b&gt;로 기존에 공개된 모델과 달리&lt;b&gt; 다양한 Multi-Modal Task 수행이 가능&lt;/b&gt;해졌습니다. VL의 경우 1.3B, 7B 사이즈의 모델을, VL2의 경우 기존 VL1을 업그레이드한 버전으로, 1B, 2.8B, 4.5B 세 가지 모델로 구성되어 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-renderer-start-pos=&quot;1094&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;2.3. 저비용-고성능 모델:&lt;span style=&quot;color: #ee2323;&quot;&gt; DeepSeek-V2, V3, R1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-renderer-start-pos=&quot;1094&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;b&gt;DeepSeek-V2&lt;/b&gt;는 &lt;b&gt;236B 모델로 &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;b&gt;본격적으로 DeepSeek가 거대 언어모델 경쟁에 뛰어들게 된 것을 알린 모델&lt;/b&gt;입니다. 236B의 Base모델과 함께 16B의 Lite, V2-Chat (RL) 버전 모델을 함께 공개했습니다. &lt;b&gt;V3는 V2 대비 추론 속도가 약 3배 빨라졌으며,&lt;/b&gt; gpt-4o와 유사한 성능을 보이나 &lt;u&gt;2048개의 H800(H100의 저가형 모델)을 이용해 671B의 거대 언어 모델을 학습했다고 공개하면서 큰 파장을 일으킨 모델&lt;/u&gt;입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-renderer-start-pos=&quot;1094&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-renderer-start-pos=&quot;1094&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;nbsp;가장 최근에 공개된 &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;강화학습 기반의 추론 모델인&lt;/span&gt; &lt;b&gt;DeepSeek-R1 모델의 경우, R1, R1-Zero, 자체적으로 파인튜닝한 Distillation 모델(llama, Qwen)을 공개&lt;/b&gt;했습니다. R1 모델 시리즈의 경우, 이전 모델인 V3 기반으로 671B 파라미터를 가진 MoE(Mixture of Experts) 구조를 가집니다. 여기서 MoE 구조란, 각 분야에 특화된 sub-network를 의마하는 전문가의 조합을 통해 입력 데이터를 처리하는 기술로 언어 모델의 고속 추론을 위해 사용되는 기법 중 하나입니다. &lt;b&gt;먼저 R1-Zero의 경우&lt;/b&gt; V2모델에 SFT(Supervised Fine-Tuning) 없이 &lt;b&gt;직접 강화학습을 적용한 모델로 추론 성능은 크게 향상되나 낮은 가독성, 반복 문장 생성, 언어 혼용 등 한계점&lt;/b&gt;이 발생합니다. &lt;b&gt;R1&lt;/b&gt;은 이러한 문제점을 극복하기 위해 고안된 Training Recipe로 학습된 모델이며, &lt;b&gt;적은 양의 cold-start data(초기 데이터)를 활용&lt;/b&gt;합니다. 이 방법을 통해&amp;nbsp;&lt;b&gt;초기 학습 단계의 불안정성을 감소시키며 가독성을 향상&lt;/b&gt;시킨다고 합니다.&amp;nbsp;R1 모델은 다양한 태스크에서 o1-mini를 뛰어넘고, o1과 유사한 성능을 보입니다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;또한 기존에는 영어, 중국어만을 지원했으나 한국어 등 다른 언어에 대한 지식도 어느정도 보유합니다. 추가로, R1 모델에서 학습된 지식을 작은 모델(Qwen, Llama)에 증류하여 추론 능력을 기존 모델 대비 크게 향상시킨 Distillation 모델도 함께 공개했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot; data-renderer-start-pos=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;*분량이 길어질 것 같아, 다음 주간 LLM 편에서 딥시크(DeepSeek) 모델의 실습 파트를 다루도록 하겠습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot;&gt;References&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-node-block=&quot;true&quot;&gt;
&lt;li data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-node-block=&quot;true&quot;&gt;GPU system Requirements for Running DeepSeek-R1: &lt;a href=&quot;https://apxml.com/posts/gpu-requirements-deepseek-r1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://apxml.com/posts/gpu-requirements-deepseek-r1&lt;/a&gt;&lt;/li&gt;
&lt;li data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-node-block=&quot;true&quot;&gt;huggingface(official model): &lt;a href=&quot;https://huggingface.co/deepseek-ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/deepseek-ai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능(AI)/LLMs</category>
      <author>계속지나가기</author>
      <guid isPermaLink="true">https://codingsmu.tistory.com/182</guid>
      <comments>https://codingsmu.tistory.com/182#entry182comment</comments>
      <pubDate>Fri, 7 Feb 2025 15:40:55 +0900</pubDate>
    </item>
    <item>
      <title>[주간 LLM] LLM Evaluation (2) LLM-as-a-Judge</title>
      <link>https://codingsmu.tistory.com/181</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2574&quot; data-origin-height=&quot;908&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qAiGd/btsLUmbj5uR/HykIWPcb7UkFczkqknY2Ak/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qAiGd/btsLUmbj5uR/HykIWPcb7UkFczkqknY2Ak/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qAiGd/btsLUmbj5uR/HykIWPcb7UkFczkqknY2Ak/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqAiGd%2FbtsLUmbj5uR%2FHykIWPcb7UkFczkqknY2Ak%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2574&quot; height=&quot;908&quot; data-origin-width=&quot;2574&quot; data-origin-height=&quot;908&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;주간 LLM 은 매주 LLM 관련 최신 연구, 논문을 다루는 시리즈 입니다.&lt;br /&gt;2025.01 - 4주차는 LLM을 활용하여 LLM 성능을 평가 할 수 있는 model-based evaluation 기법에 대해 다룹니다.&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot; data-pm-slice=&quot;1 3 []&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Overview&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 점점 더 다양한 영역에서 높은 성능을 내고 있는 LLM을 평가하는 것은 굉장히 어려운 과제 중 하나입니다. 이를 위해 다양한 벤치마크, 휴먼 평가를 수행하고 있으나, 모델의 광범위한 능력(broad capabilities)을 기존의 방법만으로 평가하기는 적합하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해, 역으로 LLM의 능력을 활용하여 LLM을 평가하는 방법론들이 최근 많이 연구되고 있습니다. 이 중&amp;nbsp; NeurIPS 2023에 소개된 &quot;Judging LLM-as-a-Judge&amp;nbsp; with MT-Bench and Chatbot Arena&quot; 논문을 소개하고자 합니다. 줄여서, LLM-as-a-Judge로 많이들 알고계신 해당 논문은 2025년 1월 현재 2319회의 인용수를 보이며 후속 논문들도 많이 발표된 연구입니다.&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;Abstract&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는, strong LLM을 judge로 사용하여 opend-ended questions에 대해 평가하는 방법을 연구하였으며 &lt;b&gt;LLM judge의 사용과 한계(position, verbodity, self-enhancement)및 제한된 추론 능력을 검토하고, 이를 완화하기 위한 해결책을 제안했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실험을 통해&lt;b&gt; GPT-4를 이용한 LLM Judge 모델&lt;/b&gt;이 &lt;b&gt;인간 선호도와 80% 이상의 높은 일치도&lt;/b&gt;를 보이며 LLM을 Judge로 사용하는 것이 인간 선호도를 추정하는 확장 가능(scalable)하고 설명 가능한 방법임을 보였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 본 논문에서는, LLM judge와 인간 선호도의 일치(agreement)를 확인하기 위해 다음의 벤치마크도 함께 소개합니다.&lt;/p&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. &lt;b&gt;MT-bench&lt;/b&gt;(multi-turn question set)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lvqf5/btsL12qf7p9/aYR9BbvOv8XjSpHqXQpKGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lvqf5/btsL12qf7p9/aYR9BbvOv8XjSpHqXQpKGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lvqf5/btsL12qf7p9/aYR9BbvOv8XjSpHqXQpKGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flvqf5%2FbtsL12qf7p9%2FaYR9BbvOv8XjSpHqXQpKGk%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;600&quot; height=&quot;207&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 총 8개의 카테고리(수학, 글쓰기 등)에서 multi-turn 질문을 통해 LLM의 대화 능력을 평가할 수 있는 벤치마크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터: &lt;a href=&quot;https://huggingface.co/datasets/lmsys/mt_bench_human_judgments&quot;&gt;https://huggingface.co/datasets/lmsys/mt_bench_human_judgments&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;Chatbot Arena&lt;/b&gt;(crowdsourced battle platform)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; 두 개의 LLM(chatbot)과 대화하며 실제 사용자가 개인 선호도에 따라 더 나은 답변을 고른 데이터 (크라우드 소싱 방식으로 수집)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터:&amp;nbsp;&lt;a href=&quot;https://huggingface.co/datasets/lmsys/chatbot_arena_conversations&quot;&gt;https://huggingface.co/datasets/lmsys/chatbot_arena_conversations&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Types of LLM-as-a-Judge&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Llm-as-a-judge(이하 llm-judge) 에는 평가하고자 하는 답변 유형에 따라 다음과 같이 나눌 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. pairwise comparison&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LLM judge에 입력으로 하나의 질문과 두 개의 정답을 주고, 어느 답변이 나은지 (무승부 포함) 판별하게 함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2dx5n/btsL0nQj1tb/aySQoASsaKOel2arFNg1w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2dx5n/btsL0nQj1tb/aySQoASsaKOel2arFNg1w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2dx5n/btsL0nQj1tb/aySQoASsaKOel2arFNg1w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2dx5n%2FbtsL0nQj1tb%2FaySQoASsaKOel2arFNg1w0%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;600&quot; height=&quot;369&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. single answer grading&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하나의 답변에 대해 직접 점수(1~10)를 매기도록 함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGXGdM/btsL1kZhsqu/RnE3hCYaE7cAo5x1rxTOLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGXGdM/btsL1kZhsqu/RnE3hCYaE7cAo5x1rxTOLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGXGdM/btsL1kZhsqu/RnE3hCYaE7cAo5x1rxTOLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGXGdM%2FbtsL1kZhsqu%2FRnE3hCYaE7cAo5x1rxTOLk%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;600&quot; height=&quot;244&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;439&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-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. reference-guided grading&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 채점 시, reference를 함께 제공하는 경우. 특정 경우(수학 문제, 계산 과정 참고)에서는 reference를 제공하는 것이 적절한 채점을 하는데 도움을 줄 수 있음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kOnLn/btsL1haSr9J/mmk3X4kjutunr0QjGjpznK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kOnLn/btsL1haSr9J/mmk3X4kjutunr0QjGjpznK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kOnLn/btsL1haSr9J/mmk3X4kjutunr0QjGjpznK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkOnLn%2FbtsL1haSr9J%2Fmmk3X4kjutunr0QjGjpznK%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;600&quot; height=&quot;423&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Advantages &amp;amp; Limitations of LLM-as-a-Judge&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Advantages&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM Judge는 확장성(scalability)과 설명가능성(expainability)이라는 두 가지 주요 이점을 제공합니다.&amp;nbsp;또한, 평가시 사람의 개입이 필요하지 않아 빠른 평가가 가능하며, 평가 시 점수뿐만 아니라 설명도 제공해주기 때문에 결과물을 해석할 수 있다는 장점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Limitations &lt;/b&gt;&amp;rarr; &lt;u&gt;Adressing Limitations&lt;/u&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Position Bias&lt;/b&gt; &amp;rarr; &lt;u&gt;Swapping Positions&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM Judge는 특정 위치에 있는 답변을 선호하는 경향이 있습니다. 실제로, 유사한 답변 여러개를 순서대로 나열하고 가장 적절한 답변을 고르라고 할 때, 대부분의 LLM이 첫번째 위치를 선호합니다. (유사한 답변들이 입력으로 들어왔으므로, 순서에 편향되게 결과가 나타나면 안됨) &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;u&gt;이는, 답변의 위치 변경을 통해 해결할 수 있습니다. 예로, 두 개의 답변을 위치를 바꾸어가며 2번 질문하였을 때, llm-judge가 똑같은 선호도를 보이는지 확인하면 됩니다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Verbosity Bias&lt;/b&gt; &amp;rarr; &lt;u&gt;few-shot judge, Fine-tuning a judge model&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM Judge는 더 정확하고, high-quality의 짧은 답변보다 더 길고, 장황한 답변을 선호하는 경향이 있습니다.&amp;nbsp; 실제로,&amp;nbsp;답변1과 답변1을 열번 반복한 문장을 입력으로 넣었을 때, 동일한 문장이 반복되는 더 긴 답변을 선호하는 경향을 보입니다. &amp;rarr;&lt;u&gt;이는,&lt;span&gt;&amp;nbsp; few-shot으로 올바를 예시를 judge-message로 함께 넣어주거나, high-quality의 짧은 답변을 선호하도록 judge model을 fine-tuning하여 사용하는 것으로 해결할 수 있습니다.&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Self-enhancement Bias&lt;/b&gt; &amp;rarr; &lt;u&gt;few-shot judge, Fine-tuning a judge model&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM Judge는 자신이 생성한 응답을 더 선호하는 경향이 있습니다. 실제로, GPT-4를 llm-judge로 사용하고, 다른 모델이 생성한 답변과 함께 GPT-4의 답변을 입력으로 주었을 때, 10%정도 본인이 생성한 답변을 더 선호하는 경향을 보였습니다. (실제 답변 퀄리티는 확인해봐야 함) &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;rarr;&lt;u&gt;이는, 마찬가지로 few-shot 및 judge model을 fine-tuning 하여 사용하는 것으로 개선할 수 있습니다.&amp;nbsp;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Limited capability in grading math and reasoning questions&lt;/b&gt;&lt;u&gt; &amp;rarr; few-shot judge, cot &amp;amp; reference-guided judge, Fine-tuning a judge model&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로, 기존 LLM이 다른 태스크보다 특히 추론 문제와 수학 문제에 약하기 때문에, 마찬가지로 llm-judge 시에도 해당 도메인에 약하다는 점입니다. 특히, LLM이 문제를 개별적으로 풀었을 때는 정답을 맞출 수 있어도, 제공된 답변에 의해 잘못된 판단을 내릴 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr;&lt;u&gt;이는,&amp;nbsp; few-shot 및 fine-tunining judge model 외에도, 기존 LLM의 수학 &amp;amp; 추론 능력을 향상시키키 위해 사용했던 CoT(chain-of-thought) 기법을 사용해 단계별 평가 방식, 혹은 수학 공식등을 함께 입력으로 주는 reference-guided judge 방식으로 개선할 수 있습니다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&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;Practice (by FastChat)&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 &quot;Judging LLM-as-a-Judge&amp;nbsp; with MT-Bench and Chatbot Arena&quot; 논문에서 소개한 LLM-judge의 등장 배경과, 사용 방법, 장단점에 대해 알아봤습니다. 이제&amp;nbsp; 실습을 통해 실제로 어떤 과정으로 LLM을 활용하여 llm이 생성한 답변들을 평가할 수 있는지 간단한 실습을 통해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 코드는 다음의 깃 레포를 참고하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/lm-sys/FastChat/tree/main/fastchat/llm_judge&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/lm-sys/FastChat/tree/main/fastchat/llm_judge&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737894863651&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;FastChat/fastchat/llm_judge at main &amp;middot; lm-sys/FastChat&quot; data-og-description=&quot;An open platform for training, serving, and evaluating large language models. Release repo for Vicuna and Chatbot Arena. - lm-sys/FastChat&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/lm-sys/FastChat/tree/main/fastchat/llm_judge&quot; data-og-url=&quot;https://github.com/lm-sys/FastChat/tree/main/fastchat/llm_judge&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nIeP5/hyX4vhcTUH/yjB3uOcWhYWxZKJ95atkuk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cJBeQG/hyX4uJibUY/hr0V8k1k5ZFEANJpQlDpsk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/b1xNy7/hyX7WKXKAF/EN1tSKj87HuKnIaQYESV6k/img.png?width=1600&amp;amp;height=1200&amp;amp;face=0_0_1600_1200&quot;&gt;&lt;a href=&quot;https://github.com/lm-sys/FastChat/tree/main/fastchat/llm_judge&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/lm-sys/FastChat/tree/main/fastchat/llm_judge&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nIeP5/hyX4vhcTUH/yjB3uOcWhYWxZKJ95atkuk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cJBeQG/hyX4uJibUY/hr0V8k1k5ZFEANJpQlDpsk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/b1xNy7/hyX7WKXKAF/EN1tSKj87HuKnIaQYESV6k/img.png?width=1600&amp;amp;height=1200&amp;amp;face=0_0_1600_1200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;FastChat/fastchat/llm_judge at main &amp;middot; lm-sys/FastChat&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An open platform for training, serving, and evaluating large language models. Release repo for Vicuna and Chatbot Arena. - lm-sys/FastChat&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 환경설정 및 평가 셋 다운로드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 평가를 위한 환경설정과 평가 셋을 다운로드해줘야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1737895071311&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone https://github.com/lm-sys/FastChat.git
cd FastChat/
pip install -e &quot;.[model_worker,llm_judge]&quot;

cd fastchat/llm_judge
python download_mt_bench_pregenerated.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. LLM 모델 답변 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로, 원하는 모델의 답변을 생성해주면 됩니다. 위에서, mt-bench를 평가셋으로 다운받아주었으므로, mt-bench의 Question을 입력으로 넣어주고, LLM의 답변을 얻게 됩니다. llama-3.2 1B 모델의 답변을 한번 얻어보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1737895129048&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# python gen_model_answer.py --model-path [MODEL-PATH] --model-id [MODEL-ID]
python gen_model_answer.py --model-path meta-llama/Llama-3.2-1B --model-id llama3.2-1b&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;span style=&quot;background-color: #dddddd;&quot;&gt;./data/mt_bench/model_answer/[MODEL-ID].jsonl&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. LLM-Judge 모델 답변 평가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로, 생성된 모델을 LLM-judge로 평가해주면 됩니다. 여기서 설정할 주요 옵션은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) LLM-judge 모델로 어떤 모델을 사용할지?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본값으로 gpt-4가 설정되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다른 모델을 사용하고 싶다면, &lt;span style=&quot;background-color: #dddddd;&quot;&gt;--judge-model [JUDGE-MODEL]&lt;/span&gt; 옵션을 추가해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Judge message는 어떻게 할지?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본옵션으로 &quot;pairwise-baseline&quot;, &quot;pairwise-all&quot;, &quot;single&quot; 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- custom-message를 사용하고 싶다면, 아래 경로에 custom-prompt를 추가해주면 됩니다.&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;./data/judge_prompts.jsonl&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737895515145&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export OPENAI_API_KEY=XXXXXX  # set the OpenAI API key
python gen_judgment.py --model-list [LIST-OF-MODEL-ID] --parallel [num-concurrent-api-call]&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;Judge 결과는 다음의 경로에 저장됩니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;./data/mt_bench/model_judgement/[JUDGE-MODEL]_[JUDGE-TYPE].jsonl&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(** 논문에서 소개한 MT-bench나 chatbot arena를 평가하고 싶다면, 위에 코드를 사용하는 것이 좋습니다. 하지만,&amp;nbsp; 개별 모델의 개별 벤치마크를 llm-judge로 평가하고 싶다면, &lt;span style=&quot;text-align: start;&quot;&gt;사실상, 1. answer-generate, 2. judge 하는 두 코드만 생성하면 되는 것이라, &lt;/span&gt;&amp;nbsp;커스텀 코드를 스크래치부터 짜는 것도 추천합니다. )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;References&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- paper: &lt;a href=&quot;https://arxiv.org/pdf/2306.05685&quot;&gt;https://arxiv.org/pdf/2306.05685&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- code: &lt;a href=&quot;https://github.com/lm-sys/FastChat/tree/main/fastchat/llm_judge&quot;&gt;https://github.com/lm-sys/FastChat/tree/main/fastchat/llm_judge&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능(AI)/LLMs</category>
      <author>계속지나가기</author>
      <guid isPermaLink="true">https://codingsmu.tistory.com/181</guid>
      <comments>https://codingsmu.tistory.com/181#entry181comment</comments>
      <pubDate>Mon, 20 Jan 2025 19:30:02 +0900</pubDate>
    </item>
    <item>
      <title>[주간 LLM] LLM Evaluation (1) - Ifeval</title>
      <link>https://codingsmu.tistory.com/180</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2574&quot; data-origin-height=&quot;908&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFJ7ZV/btsLKIsKMAt/EtR0WKsmZWEnxzgcKm7Xjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFJ7ZV/btsLKIsKMAt/EtR0WKsmZWEnxzgcKm7Xjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFJ7ZV/btsLKIsKMAt/EtR0WKsmZWEnxzgcKm7Xjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFJ7ZV%2FbtsLKIsKMAt%2FEtR0WKsmZWEnxzgcKm7Xjk%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;2574&quot; height=&quot;908&quot; data-origin-width=&quot;2574&quot; data-origin-height=&quot;908&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;blockquote data-ke-style=&quot;style2&quot;&gt;주간 LLM 은 매주 LLM 관련 최신 연구, 논문을 다루는 시리즈 입니다.&lt;br /&gt;2025.01 - 3주차는 LLM의 instruction-following 능력을 평가할 수 있는 ifeval benchmark에 대해 다룹니다.&lt;/blockquote&gt;
&lt;h2 data-pm-slice=&quot;1 3 []&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-pm-slice=&quot;1 3 []&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-pm-slice=&quot;1 3 []&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size26&quot;&gt;Overview&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;23년 11월에 Google과 Yale Univ에서 공개한 벤치마크 데이터 셋으로, &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;LLM의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;지시사항 준수 능력&lt;/b&gt;을 평가하기 위해 설계된 벤치마크로 검증 가능한 지시사항(verifiable instructions)을 포함합니다. 비교적 이전에 나온 논문이지만 LLM의 Instrcution 성능이 최근 더 중요해지면서 가장 유명한 LLM leaderboard 중 하나인, open llm leaderboard v2(24.10)에 추가된 벤치마크 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 25개의 지시문 카테고리로, 여러 카테고리를 조합해 다양한 지시문을 생성할 수 있습니다. 총 541개의 데이터 셋이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- No capital letters are allowed(대문자 금지), You are not allowed to use any commas in your response. (콤마 금지)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 프롬프트는 하나 이상의 구체적인 지시사항을 제공하며, 모델 응답이 이를 얼마나 정확히 수행하는지 평가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size26&quot;&gt;Dataset Detail &amp;amp; Eval metric&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Dataset Detail&lt;/b&gt;&lt;/h3&gt;
&lt;div data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;table&quot; data-prosemirror-content-type=&quot;node&quot;&gt;
&lt;div data-testid=&quot;table-alignment-container&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;table-container&quot; data-layout=&quot;align-start&quot; data-number-column=&quot;false&quot;&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-table-width=&quot;888&quot; data-table-local-id=&quot;7c0522b3-4387-4a78-bee4-a6aa5b00e952&quot; data-autosize=&quot;false&quot; data-layout=&quot;align-start&quot; data-number-column=&quot;false&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.97674%;&quot;&gt;&lt;span&gt;key&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.0232%;&quot;&gt;&lt;span&gt;prompt&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.8837%;&quot;&gt;&lt;span&gt;instruction_id_list&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableRow&quot; data-prosemirror-content-type=&quot;node&quot;&gt;
&lt;td style=&quot;width: 6.97674%;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;58&quot;&gt;&lt;span&gt;1000&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.0232%;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;545&quot;&gt;&lt;span&gt;I am planning a trip to Japan, and I would like thee to write an itinerary for my journey in a Shakespearean style. &lt;b&gt;You are not allowed to use any commas in your response.&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.8837%;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;283&quot;&gt;&lt;span&gt;[ &quot;punctuation:no_comma&quot; ]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableRow&quot; data-prosemirror-content-type=&quot;node&quot;&gt;
&lt;td style=&quot;width: 6.97674%;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;58&quot;&gt;&lt;span&gt;1258&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.0232%;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;545&quot;&gt;I&amp;nbsp;have&amp;nbsp;a&amp;nbsp;dime.&amp;nbsp;What&amp;nbsp;can&amp;nbsp;I&amp;nbsp;do&amp;nbsp;with&amp;nbsp;this&amp;nbsp;dime?&amp;nbsp;Give&amp;nbsp;me&amp;nbsp;advice&amp;nbsp;in&amp;nbsp;the&amp;nbsp;style&amp;nbsp;of&amp;nbsp;a&amp;nbsp;President&amp;nbsp;of&amp;nbsp;the&amp;nbsp;United&amp;nbsp;States&amp;nbsp;and&amp;nbsp;&lt;b&gt;make&amp;nbsp;sure&amp;nbsp;it&amp;nbsp;has&amp;nbsp;at&amp;nbsp;least&amp;nbsp;600&amp;nbsp;words.&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.8837%;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;283&quot;&gt;[&amp;nbsp;&quot;length_constraints:number_words&quot;&amp;nbsp;]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableRow&quot; data-prosemirror-content-type=&quot;node&quot;&gt;
&lt;td style=&quot;width: 6.97674%;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;58&quot;&gt;&lt;span&gt;1132&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.0232%;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;545&quot;&gt;&lt;span&gt;Write the lyrics to a hit song by the rock band 'The Gifted and The Not Gifted'. To make it rocky, &lt;b&gt;the response should be in all capital letters. The word &quot;rock&quot; should not appear in your response.&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.8837%;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;tableCell&quot; data-prosemirror-content-type=&quot;node&quot; data-colwidth=&quot;283&quot;&gt;&lt;span&gt;[ &quot;change_case:english_capital&quot;, &quot;keywords:forbidden_words&quot; ]&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 셋은 key, prompt, instruction_id_list, kwargs로 구성되어 있습니다. 상단 표에는 앞에 세 개의 컬럼만 가지고 왔습니다. 전체 데이터 셋을 확인하고 싶다면 아래 링크로 들어가시면 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://huggingface.co/datasets/google/IFEval&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/datasets/google/IFEval&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736729552463&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;google/IFEval &amp;middot; Datasets at Hugging Face&quot; data-og-description=&quot;[ { &amp;quot;num_highlights&amp;quot;: null, &amp;quot;relation&amp;quot;: null, &amp;quot;num_words&amp;quot;: null, &amp;quot;num_placeholders&amp;quot;: null, &amp;quot;prompt_to_repeat&amp;quot;: null, &amp;quot;num_bullets&amp;quot;: null, &amp;quot;section_spliter&amp;quot;: null, &amp;quot;num_sections&amp;quot;: null, &amp;quot;capital_relation&amp;quot;: null, &amp;quot;capital_frequency&amp;quot;: null, &amp;quot;keywords&amp;quot;: null, &quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/datasets/google/IFEval&quot; data-og-url=&quot;https://huggingface.co/datasets/google/IFEval&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pJAKV/hyX0l5MFTP/JzzAfX3vQ5YbGHB1s732F0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/dCsJmV/hyX0xrvz5Z/Tb8jQiobJJTFsQKWCEFWh0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/datasets/google/IFEval&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/datasets/google/IFEval&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pJAKV/hyX0l5MFTP/JzzAfX3vQ5YbGHB1s732F0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/dCsJmV/hyX0xrvz5Z/Tb8jQiobJJTFsQKWCEFWh0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;google/IFEval &amp;middot; Datasets at Hugging Face&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[ { &quot;num_highlights&quot;: null, &quot;relation&quot;: null, &quot;num_words&quot;: null, &quot;num_placeholders&quot;: null, &quot;prompt_to_repeat&quot;: null, &quot;num_bullets&quot;: null, &quot;section_spliter&quot;: null, &quot;num_sections&quot;: null, &quot;capital_relation&quot;: null, &quot;capital_frequency&quot;: null, &quot;keywords&quot;: null,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prompt에는 다양한 시나리오(계획짜기, 조언, 가사 작성)와 함께 &lt;b&gt;볼드체&lt;/b&gt;에 해당하는&lt;b&gt; 다양한 지시문&lt;/b&gt;이 포함되어 있습니다. instruction_id_list에서는 각 지시문의 분류와 개수를 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Evaluation Metric&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문에서는 다음과 같이 총 prompt-level과 instruction-level로 평가 매트릭 나누어&amp;nbsp; 소개합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Prompt-level&lt;/b&gt; &lt;/span&gt;(strict acc/loose acc): The percentage of prompts that &lt;u&gt;all verifiable instructions&lt;/u&gt; in each prompt are followed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;Inst-level&lt;/b&gt; &lt;/span&gt;(strict acc/loose acc): &lt;u&gt;The percentage of verifiable instructions&lt;/u&gt; that are followed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;개별 지시문으로&lt;/u&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;위의 설명을 해석해보자면, prompt-level은 지시문을 모두 따랐는지를, inst-level은 개별 지시문을 따랐는지를 확인하는 매트릭으로 설명이 되나, 이는 직관적으로 이해하기 어렵습니다. 이해를 위해 평가 코드를 살펴보면 다음과 같이 각각의 평가 매트릭을 정의하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1736734865518&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def process_results(doc, results):
    # (..중략..)

    return {
        &quot;prompt_level_strict_acc&quot;: out_strict.follow_all_instructions,
        &quot;inst_level_strict_acc&quot;: out_strict.follow_instruction_list,
        &quot;prompt_level_loose_acc&quot;: out_loose.follow_all_instructions,
        &quot;inst_level_loose_acc&quot;: out_loose.follow_instruction_list,
    }&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;prompt-level의 경우 follow_all_instructions을, inst-level의 경우 follow_instruction_list을 가집니다. 이 두개의 차이는 다음 코드에서 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736735032480&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def test_instruction_following_strict(inp,response,):
    &quot;&quot;&quot;Tests response to see if instructions are followed.&quot;&quot;&quot;
    instruction_list = inp.instruction_id_list
    is_following_list = []
    
    # (..중략..)
    
    for index, instruction_id in enumerate(instruction_list):
    
        # (..중략..)
        
        if response.strip() and instruction.check_following(response):
            is_following_list.append(True)
        else:
            is_following_list.append(False)
            
     return OutputExample(
        instruction_id_list=inp.instruction_id_list,
        prompt=inp.prompt,
        response=response,
        follow_all_instructions=all(is_following_list),
        follow_instruction_list=is_following_list,
    )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;코드에서 확인할 수 있듯이, prompt-level의 경우, is_following_list에 저장된 값이 모두 True여야 1을, inst-level은 list를 전달받아 개별 지시문을 확인하는 것을 알 수 있습니다. 전체 코드는 아래 링크를 참고하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/tasks/ifeval/utils.py#L121&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/tasks/ifeval/utils.py&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이해를 위해 앞서 소개한 데이터 셋 중 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;key: 1132&lt;/span&gt;를 예시로 들자면, &lt;span style=&quot;color: #8a3db6;&quot;&gt;prompt-level의 경우 주어진 두 개의 지시문인&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt; [ &quot;change_case:english_capital&quot;, &quot;keywords:forbidden_words&quot; ]&lt;/span&gt;을 모두 지켜야 1점&lt;/span&gt;을, &lt;span style=&quot;color: #009a87;&quot;&gt;inst-level의 경우 개별 지시문의 수행여부를 보기 때문에 모두 지켰을 경우 1점, 하나만 지켰을 경우 0.5점, 모두 지키지 못했을 때 0점&lt;/span&gt;을 주게 됩니다. &lt;span style=&quot;background-color: #dddddd;&quot;&gt;key 1000, 1258&lt;/span&gt;은 지시문이 한 개 이므로 prompt-level과 inst-level이 동일하게 점수를 부여합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 설명드린 내용은 prompt-level, inst-level의 strict acc에 대한 설명입니다. 그러면 &lt;span style=&quot;color: #006dd7;&quot;&gt;loose acc&lt;/span&gt;는 어떻게 계산될까요? 논문에서는 다음의 방식으로 loose acc를 정의하고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/COM6U/btsLKLiDRoL/hdG4TDRrOmIXQJaurrEhh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/COM6U/btsLKLiDRoL/hdG4TDRrOmIXQJaurrEhh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/COM6U/btsLKLiDRoL/hdG4TDRrOmIXQJaurrEhh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCOM6U%2FbtsLKLiDRoL%2FhdG4TDRrOmIXQJaurrEhh1%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;600&quot; height=&quot;22&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;66&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;LLM의 원본 응답을 resp라고 할 때, &lt;span style=&quot;color: #006dd7;&quot;&gt;transform함수를 사용해 응답을 t 번 변형하여, 그 중 한 번이라도 지시문을 만족할 경우 점수를 주는 방식&lt;/span&gt;입니다. 변형 방식은 응답에서 흔히 사용되는 마크다운 태크(*,**) 제거, 서두/결론 제거 등이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로, Ifeval을 벤치마크로 사용하여 LLM을 평가할 경우 총 네개의 매트릭이 나오게 됩니다. prompt-level 보다는 inst-level이, strict-acc보다는 loose-acc가 더 높은 점수가 나오게 됩니다. Openleaderboard-v2에서는, strict-acc의 평균값(prompt, inst-level)을 최종 점수로 사용하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&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; data-prosemirror-content-type=&quot;node&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-node-block=&quot;true&quot;&gt;Practice (by lm-eval-harness)&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 ifeval의 데이터 셋 구성과 평가 매트릭을 살펴봤습니다. 마지막으로, 모델의 ifeval 성능을 실제로 어떻게 확인할 수 있는지 간단한 실습을 해보겠습니다. 물론, 논문대로 스크래치부터 구현할 수도 있지만, 다양한 모델과 데이터 셋 별로 매번 짜기는 번거로운 부분이 있습니다. 그래서 이러한 평가를 자동화해주는 툴로 가장 많이 활용되는 lm-eval-harness에서 ifeval을 돌려보겠습니다. (이후의 평가 관련 실습에도 해당 툴을 계속 이용할 예정입니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 lm-eval-harness를 github를 통해 필요한 라이브러리를 설치해줍니다. 자세한 코드, README가 궁금하시면 아래 링크를 참고하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737361534486&quot; class=&quot;vim&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;pip install git+https://github.com/EleutherAI/lm-evaluation-harness.git&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;a href=&quot;https://github.com/EleutherAI/lm-evaluation-harness&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/EleutherAI/lm-evaluation-harness&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 정상적으로 되었다면, 아래의 명령어로 원하는 모델의 ifeval 성능을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1737361287384&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lm_eval --model hf\
    --model_args pretrained={MODEL_NAME} \
    --tasks ifeval \
    --batch_size {BS} \
    --output_path {OUTPUT-PATH-FOR-RESULT} \
    --log_samples&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;평가하고 싶은 모델 이름에 {MODEL_NAME}을, 각자 환경에 맞는 batch size를 {BS}에 (몇으로 돌리실지 모르신다면, auto로 돌리시면 됩니다, 대신 시간이 오래걸립니다), 마지막의 output_path와 log_sampled은 자세한 평가 결과가 json 파일로 따로 저장될 수 있게하는 코드로 추후 디버깅에 유용합니다(추천 argument). 이 외에 argument는 아래 링크를 참고해서 사용을 원하면 추가해주시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/EleutherAI/lm-evaluation-harness/blob/main/docs/interface.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/EleutherAI/lm-evaluation-harness/blob/main/docs/interface.md&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평가가 끝나면, 다음과 같이 log에 점수가 나오게 됩니다. 위에서 소개한 총 네개의 매트릭의 결과가 출력되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1bQ8/btsLUmWKUMs/BT4whVrUrEey7TNCrRZiVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1bQ8/btsLUmWKUMs/BT4whVrUrEey7TNCrRZiVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1bQ8/btsLUmWKUMs/BT4whVrUrEey7TNCrRZiVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1bQ8%2FbtsLUmWKUMs%2FBT4whVrUrEey7TNCrRZiVK%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;600&quot; height=&quot;103&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;heading&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-size=&quot;size23&quot;&gt;References&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;bulletList&quot; data-prosemirror-content-type=&quot;node&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;paper: &lt;span data-prosemirror-node-inline=&quot;true&quot; data-prosemirror-node-name=&quot;inlineCard&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://arxiv.org/abs/2311.07911&quot;&gt;https://arxiv.org/abs/2311.07911&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-prosemirror-node-block=&quot;true&quot; data-prosemirror-node-name=&quot;listItem&quot; data-prosemirror-content-type=&quot;node&quot;&gt;dataset: &lt;span data-prosemirror-node-inline=&quot;true&quot; data-prosemirror-node-name=&quot;inlineCard&quot; data-prosemirror-content-type=&quot;node&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://huggingface.co/datasets/google/IFEval&quot;&gt;https://huggingface.co/datasets/google/IFEval&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능(AI)/LLMs</category>
      <author>계속지나가기</author>
      <guid isPermaLink="true">https://codingsmu.tistory.com/180</guid>
      <comments>https://codingsmu.tistory.com/180#entry180comment</comments>
      <pubDate>Mon, 13 Jan 2025 19:00:17 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 12865번: 평범한 배낭 - 파이썬(Python)</title>
      <link>https://codingsmu.tistory.com/177</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/12865&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/12865&lt;/a&gt;&lt;/p&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;해당 문제의 주어진 입력과 목표를 먼저 살펴봅시다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;1. 문제 입력 &amp;amp; 목표&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 문제의 주어진 입력과 목표를 먼저 살펴봅시다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 입력&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;N: 물품의 수 (1 &amp;le; N &amp;le; 100)&lt;br /&gt;K: 버틸 수 있는 최대 무게 (1 &amp;le; K &amp;le; 100,000)&lt;br /&gt;w,v : 물건의 무게, 물건의 가치 (1 &amp;le; W &amp;le; 100,000 / 0 &amp;le; V &amp;le; 1,000)&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 목표&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;배낭이 버틸 수 있는 최대 무게인 K가 넘지 않는 선에서, 담을 수 있는 물건의 최대 가치를 구해라&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;2. 접근 방식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 첫 번째 예제를 시각화하면 다음과 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJyz1/btsHVK1euTZ/XqhUER74QvK4sm8kHqkU91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJyz1/btsHVK1euTZ/XqhUER74QvK4sm8kHqkU91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJyz1/btsHVK1euTZ/XqhUER74QvK4sm8kHqkU91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJyz1%2FbtsHVK1euTZ%2FXqhUER74QvK4sm8kHqkU91%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;500&quot; height=&quot;154&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;154&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;편의상 물건의 인덱스를 1부터 시작한다고 할 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽의 배열은 i번째 물건의 무게(w), 가치(v)이며, 오른쪽은 최대 배낭이 버틸 수 있는 무게인 7kg입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 다음과 같이, &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;최대 i번째 물건&lt;/b&gt;&lt;/span&gt;, &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;j무게&lt;/b&gt;&lt;/span&gt;까지 담을 수 있을 때의 최대 가치를 이차원 배열(arr)을 통해 표현해봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 첫 번째 물건만 담을 수 있다고 할 때 다음과 같이 값을 저장할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb7tmG/btsHUxPWAlt/NgApyKvQlLup40V2pwT3dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb7tmG/btsHUxPWAlt/NgApyKvQlLup40V2pwT3dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb7tmG/btsHUxPWAlt/NgApyKvQlLup40V2pwT3dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb7tmG%2FbtsHUxPWAlt%2FNgApyKvQlLup40V2pwT3dk%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;700&quot; height=&quot;130&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;234&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;첫 번째 물건의 무게는 6kg로, arr[1][0]~arr[1][5] 는 물건을 담을 수 없어 최대가치가 0, arr[1][6]~arr[1][7] 부터는 물건을 담을 수 있으므로 첫 번째 물건의 가치인 13이 저장됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로, 최대 두 번째 물건을 담을 수 있다고 했을 때는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;arr[2][0]~arr[2][3] 까지는 0, arr[2][4] 부터는 두 번째 물건을 담을 수 있으므로&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;두 &lt;/span&gt;번째 물건의 가치인 8이 저장됩니다.&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHUT1N/btsHUAMoKm4/5qIiCbdYq3g5BGVZpKZvl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHUT1N/btsHUAMoKm4/5qIiCbdYq3g5BGVZpKZvl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHUT1N/btsHUAMoKm4/5qIiCbdYq3g5BGVZpKZvl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHUT1N%2FbtsHUAMoKm4%2F5qIiCbdYq3g5BGVZpKZvl0%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;700&quot; height=&quot;131&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;236&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;최대 6kg까지 배낭에 담을 수 있을 때는, 첫 번째 물건과 두 번째 물건 중 하나만을 선택해 담을 수 있으므로 &lt;b&gt;두 물건의 가치를 비교해서 더 큰 가치를 가진 물건을 넣어주면 됩니다&lt;/b&gt;. 첫 번째 물건의 가치가 13으로 더 크므로, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;arr[2][6]~arr[2][7]는 13을 저장해줍니다.&lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HeNb5/btsHUzG1MJ5/IZLXgyki4KTZPjYaykDhg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HeNb5/btsHUzG1MJ5/IZLXgyki4KTZPjYaykDhg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HeNb5/btsHUzG1MJ5/IZLXgyki4KTZPjYaykDhg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHeNb5%2FbtsHUzG1MJ5%2FIZLXgyki4KTZPjYaykDhg0%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;700&quot; height=&quot;131&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;235&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvrfFM/btsHWb5tLDh/mNh4ZLnkgFJY2983OlqoA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvrfFM/btsHWb5tLDh/mNh4ZLnkgFJY2983OlqoA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvrfFM/btsHWb5tLDh/mNh4ZLnkgFJY2983OlqoA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvrfFM%2FbtsHWb5tLDh%2FmNh4ZLnkgFJY2983OlqoA0%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;700&quot; height=&quot;130&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만, 최대 7kg까지 담을 수 있을 때&amp;nbsp;최대 가치는&lt;/b&gt; 첫 번째 물건을 하나만 담는 것이 아닌, &lt;b&gt;두 번째 물건과 세 번째 물건을 함께 담았을 때&lt;/b&gt; 입니다. 이는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;현재 담을 수 있는 최대 무게인 7에서 세 번째 물건의 무게인 3을 뺐을 때의 최대가치&lt;/b&gt;&lt;/span&gt;와 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;세 번째 물건의 가치&lt;/span&gt;&lt;/b&gt;를 더한 값으로 구할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N92KO/btsHVWtWPX2/grNCPgSrDWGDOB15PlV1O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N92KO/btsHVWtWPX2/grNCPgSrDWGDOB15PlV1O0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N92KO/btsHVWtWPX2/grNCPgSrDWGDOB15PlV1O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN92KO%2FbtsHVWtWPX2%2FgrNCPgSrDWGDOB15PlV1O0%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;700&quot; height=&quot;131&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;237&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9NKRZ/btsHUqiYvvJ/QJeIb5iukB3w7kWpokqn20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9NKRZ/btsHUqiYvvJ/QJeIb5iukB3w7kWpokqn20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9NKRZ/btsHUqiYvvJ/QJeIb5iukB3w7kWpokqn20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9NKRZ%2FbtsHUqiYvvJ%2FQJeIb5iukB3w7kWpokqn20%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;700&quot; height=&quot;129&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;231&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;문제의 정답은 최대 네 번째 물건을 담을 수 있고 최대 7kg 무게까지 담을 수 있을 때의 최대 가치가 저장된 arr[4][7] 에 해당됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1) 2차원 DP로 풀어보기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 전개한 내용을 2차원 DP로 풀어보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dp[i][j]에 저장되는 값&lt;/b&gt;은 &lt;b&gt;최대 i번째 물건을 사용하여 최대 j무게까지 담을 수 있을 때의 최대 가치&lt;/b&gt;입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1718017345178&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wv = [(0,0)]
for i in range(1, N+1):
    w, v = map(int, input().split())
    wv.append((w,v))

dp = [[0]*(K+1) for _ in range(N+1)]

for i in range(1, N+1):
    w, v = wv[i]
    for k in range(1, K+1):
        if k &amp;gt;= w: # 현재 무게가, k 보다 작거나 같을 때
            dp[i][k] = max(dp[i-1][k], dp[i][k-1], dp[i-1][k-w] + v)
        else: # 현재 무게가, k 보다 클 때
            dp[i][k] = max(dp[i-1][k], dp[i][k-1])

print(dp[N][K])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2) 1차원 DP로 풀어보기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드보다 더 적은 메모리, 시간을 사용하고 싶다면 1차원 DP로도 풀이가 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;매 반복마다 tmp = dp.copy()를 해두어 이전 물건들 값의 최대가치를 참고할 수 있게 코드를 수정해줍니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718017358489&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;N, K = map(int, input().split())
wv = []
for _ in range(N):
    w, v = map(int, input().split())
    wv.append((w, v))

dp = [0] * (K+1)
ans = 0
for w, v in wv:
    tmp = dp.copy()
    for k in range(K+1):
        if dp[k] and k + w &amp;lt;= K and dp[k+w] &amp;lt; tmp[k] + v:
            dp[k+w] = tmp[k] + v
    if w &amp;lt;= K:
        dp[w] = max(dp[w], v)

print(max(dp))&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/백준 문제풀이</category>
      <author>계속지나가기</author>
      <guid isPermaLink="true">https://codingsmu.tistory.com/177</guid>
      <comments>https://codingsmu.tistory.com/177#entry177comment</comments>
      <pubDate>Mon, 10 Jun 2024 20:02:46 +0900</pubDate>
    </item>
  </channel>
</rss>