<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Let's be Developers</title>
    <link>https://changsroad.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 30 Jun 2026 08:28:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>창빵맨</managingEditor>
    <image>
      <title>Let's be Developers</title>
      <url>https://tistory1.daumcdn.net/tistory/4934831/attach/436b0d67edc84a198780215fb6e76752</url>
      <link>https://changsroad.tistory.com</link>
    </image>
    <item>
      <title>ClaudeCode 로컬 모델 사용법</title>
      <link>https://changsroad.tistory.com/595</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 내 개발작업의 90%를 ClaudeCode가 하고 정말 다양한 걸 시도해볼 수가 있어서&amp;nbsp;새벽에도 계속 작업을 하다 보니 Hourly limit은 안 걸리는데 Weekly Limit이 거의 간당간당해서 매주 살 떨린다.&lt;br /&gt;그래서 간단한 서브 작업들은 로컬 LLM을 이용해 보고자 가이드를 작성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 로컬에 Qwen3 Coder Next 모델을 vLLM을 이용하여 서빙한 뒤 Claude Code에 연결해서 사용해 볼 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ollama 등은 claude code에서 바로 사용할 수 있게 세팅해 주는 옵션 등이 있는데 vLLM은 뭐 따로 할 건 없고, 그냥 claude code를 실행할 때 몇 가지 설정만 수동으로 바꿔주면 된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Qwen3 Coder Next&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MoE(Mixture of Experts) 구조로 총 80B 파라미터 중 활성 파라미터는 3B &amp;mdash; 10~20배 큰 모델급 성능을 낸다고 한다&lt;/li&gt;
&lt;li&gt;512개 전문가 중 10개만 활성화하는 구조 (Gated Attention + Gated DeltaNet + MoE 하이브리드)&lt;/li&gt;
&lt;li&gt;최대 262K 토큰 컨텍스트 지원&lt;/li&gt;
&lt;li&gt;Non-thinking 모드만 지원 (thinking 블록 생성 안 함)&lt;/li&gt;
&lt;li&gt;도구 호출(tool calling) 특화 설계, Apache 2.0 라이선스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트 용도로 만든 모델답게, 장시간 추론이나 복잡한 도구 호출, 실행 오류 복구 같은 agentic 작업에 초점을 맞췄다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeKjaj/dJMcahXMPmL/hByhBlA3KHk38q14VNF6Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeKjaj/dJMcahXMPmL/hByhBlA3KHk38q14VNF6Wk/img.png&quot; data-origin-width=&quot;4420&quot; data-origin-height=&quot;2373&quot; data-is-animation=&quot;false&quot; style=&quot;width: 44.4802%; margin-right: 10px;&quot; data-widthpercent=&quot;45&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeKjaj/dJMcahXMPmL/hByhBlA3KHk38q14VNF6Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeeKjaj%2FdJMcahXMPmL%2FhByhBlA3KHk38q14VNF6Wk%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;4420&quot; height=&quot;2373&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYMTNz/dJMcahpXlxl/MLdGGn8OJh4ytdio3OsiMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYMTNz/dJMcahpXlxl/MLdGGn8OJh4ytdio3OsiMk/img.png&quot; data-origin-width=&quot;4862&quot; data-origin-height=&quot;2136&quot; data-is-animation=&quot;false&quot; style=&quot;width: 54.357%;&quot; data-widthpercent=&quot;55&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYMTNz/dJMcahpXlxl/MLdGGn8OJh4ytdio3OsiMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYMTNz%2FdJMcahpXlxl%2FMLdGGn8OJh4ytdio3OsiMk%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;4862&quot; height=&quot;2136&quot;/&gt;&lt;/span&gt;&lt;/div&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;게다가 Unsloth에서 다양한 크기의 양자화버전을 만들어줬느데, 아래에서 보다시피 양자화를 했음에도 성능이 매우 좋은 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Qwen/Qwen3-Coder-Next가 원래 150GB 정도의 vram을 요구하는데, 아래 차트를 보면 3비트 양자화의 경우 기존대비 약 100GB 정도의 Vram을 덜 쓰면서 유사한 성능을 낼 수 있다고 한다;;;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;unsloth는 아래버전들에 대한 gguf 양자화 버전이랑 unsloth/Qwen3-Coder-Next-FP8-Dynamic이라는 버전도 출시했으니 다양하게 직접 사용해 보면 좋을 것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;922&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bno7Ds/dJMcafZWX7A/pASKY6K6ekfQJpYmKIyvmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bno7Ds/dJMcafZWX7A/pASKY6K6ekfQJpYmKIyvmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bno7Ds/dJMcafZWX7A/pASKY6K6ekfQJpYmKIyvmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbno7Ds%2FdJMcafZWX7A%2FpASKY6K6ekfQJpYmKIyvmK%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;622&quot; height=&quot;373&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;922&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;figure id=&quot;og_1771990490828&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;Qwen3-Coder - a unsloth Collection&quot; data-og-description=&quot;The Qwen3-Coder models deliver SOTA advancements in agentic coding and code tasks. Includes Qwen3-Coder-Next.&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/collections/unsloth/qwen3-coder&quot; data-og-url=&quot;https://huggingface.co/collections/unsloth/qwen3-coder&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b5Ve7r/dJMb85vLXPf/LZ6ITzDDdknxp4idlHzJGk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/55FHK/dJMb82Mz8y4/rkKjZhESfpLNgzWHoOA1qk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/collections/unsloth/qwen3-coder&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/collections/unsloth/qwen3-coder&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b5Ve7r/dJMb85vLXPf/LZ6ITzDDdknxp4idlHzJGk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/55FHK/dJMb82Mz8y4/rkKjZhESfpLNgzWHoOA1qk/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;Qwen3-Coder - a unsloth Collection&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Qwen3-Coder models deliver SOTA advancements in agentic coding and code tasks. Includes Qwen3-Coder-Next.&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;모델에 대한 설명은 여기까지 하고 이제 실제로 ClaudeCode에 연결을 해보자&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;vLLM 서빙&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 당연하게도 Ollama 혹은 vLLM을 이용하여 로컬에 모델을 띄워놔야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Requirements&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GPU: FP8 양자화 기준 약 46GB VRAM 필요 (Qwen3-Coder-Next 기준)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vllm &amp;gt;= 0.15.0&lt;/code&gt; (Qwen3-Coder-Next 지원 버전)&lt;/li&gt;
&lt;li&gt;Python 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Installation&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;uv venv
source .venv/bin/activate
uv pip install -U vllm --torch-backend auto&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;vLLM 서버 시작&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 단일 GPU 환경이라 작은 모델 기준으로 설명하겠지만, 기본 구조는 동일하다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;vllm serve Qwen/Qwen3-Coder-Next \
  --port 8000 \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_coder&lt;/code&gt;&lt;/pre&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;code&gt;--enable-auto-tool-choice&lt;/code&gt;: 도구 호출 자동 감지 활성화&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--tool-call-parser qwen3_coder&lt;/code&gt;: Qwen3 Coder 전용 파서 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 뜨면 &lt;code&gt;http://localhost:8000&lt;/code&gt;으로 OpenAI 호환 API가 열린다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Claude Code 연결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 떴으면 이제 Claude Code가 Anthropic 대신 로컬 서버를 바라보도록 설정해야 한다. 방법은 단순하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;환경변수 설정&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;export ANTHROPIC_BASE_URL=&quot;http://localhost:8000&quot;
export ANTHROPIC_API_KEY=&quot;sk-no-key-required&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;는 인증용인데, 로컬 서버니까 뭘 넣어도 상관없다. 그냥 빈 값이 아닌 아무 문자열이면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영구적으로 적용하려면 &lt;code&gt;~/.zshrc&lt;/code&gt; 또는 &lt;code&gt;~/.bashrc&lt;/code&gt;에 추가하면 된다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# ~/.zshrc
export ANTHROPIC_BASE_URL=&quot;http://localhost:8000&quot;
export ANTHROPIC_API_KEY=&quot;sk-no-key-required&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모델 지정해서 실행&lt;/h3&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;claude --model Qwen/Qwen3-Coder-Next&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 이름은 vLLM에 서빙한 모델 ID와 일치해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연결 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정이 제대로 됐는지 간단하게 테스트해 볼 수 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;curl http://localhost:8000/v1/models&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서빙 중인 모델 목록이 나오면 서버는 정상이다. 이후 &lt;code&gt;claude&lt;/code&gt; 커맨드를 실행했을 때 응답이 오면 연결 성공이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시나 위 방법으로 적용했는데도, 계속 ClaudeCode에서 연결하라는 창만 뜬다면 아래 방법을 시도해 보면 된다. 차이점은 모델 기본값들을 방금 서빙한 모델들로 전부 설정해 주는 것이다.&lt;br /&gt;(나는 ClaudeCode 구독을 안 한 상태에서 시도해서 이 방법으로 하니 성공했다)&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ANTHROPIC_BASE_URL=http://localhost:8000 \
ANTHROPIC_API_KEY=dummy \
ANTHROPIC_AUTH_TOKEN=dummy \
ANTHROPIC_DEFAULT_OPUS_MODEL=my-model \
ANTHROPIC_DEFAULT_SONNET_MODEL=my-model \
ANTHROPIC_DEFAULT_HAIKU_MODEL=my-model \
claude&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제 사용 경험&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 처음에는 &quot;제대로 될까?&quot; 반신반의했다. Claude Code는 tool calling을 정말 많이 쓰는 도구인데, 오픈소스 모델이 이걸 얼마나 잘 따라올지 확신이 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 말하면, &lt;b&gt;생각보다 잘 된다&lt;/b&gt;. 파일 편집, 터미널 명령 실행, 코드 검색 같은 기본적인 작업은 무리 없이 처리한다.&lt;br /&gt;Anthropic Claude와 비교했을 때 복잡한 추론이나 긴 컨텍스트 처리에서는 차이가 느껴지긴 한다. 하지만 일상적인 코딩 작업, 예를 들어 함수 수정하거나 버그 찾거나 리팩토링하는 수준에서는 충분히 쓸 만하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;References&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.vllm.ai/en/latest/serving/integrations/claude_code/&quot;&gt;vLLM - Claude Code Integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://unsloth.ai/docs/models/qwen3-coder-next&quot;&gt;Unsloth - Qwen3-Coder-Next&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://unsloth.ai/docs/basics/claude-code&quot;&gt;Unsloth - Claude Code with Local Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.vllm.ai/projects/recipes/en/latest/Qwen/Qwen3-Coder-480B-A35B.html&quot;&gt;vLLM Recipes - Qwen3-Coder-480B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/Qwen/Qwen3-Coder-Next&quot;&gt;Qwen3-Coder-Next - Hugging Face&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/QwenLM/Qwen3-Coder&quot;&gt;Qwen3-Coder GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>알쓸신잡</category>
      <category>Qwen3-Coder</category>
      <category>Qwen3-Coder-Next</category>
      <category>unsloth</category>
      <author>창빵맨</author>
      <guid isPermaLink="true">https://changsroad.tistory.com/595</guid>
      <comments>https://changsroad.tistory.com/595#entry595comment</comments>
      <pubDate>Wed, 25 Feb 2026 12:37:04 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu 워크스페이스에서 앱이 다른 화면으로 이동하는 문제</title>
      <link>https://changsroad.tistory.com/594</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wx90R/dJMcaca5fP5/vFDoZXKRIwl6C9uAs3BM8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wx90R/dJMcaca5fP5/vFDoZXKRIwl6C9uAs3BM8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wx90R/dJMcaca5fP5/vFDoZXKRIwl6C9uAs3BM8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwx90R%2FdJMcaca5fP5%2FvFDoZXKRIwl6C9uAs3BM8k%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;940&quot; height=&quot;291&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu 가상 데스크톱(워크스페이스)을 여러 개 사용할 때, 어떤 앱들은 각 워크스페이스마다 독립적으로 열 수 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 앱들은 새 워크스페이스에서 실행하면 현재 워크스페이스에 새 창이 뜨지 않고 &lt;b&gt;기존에 그 앱이 열려있는 워크스페이스로 포커스가 이동해 버리는&lt;/b&gt; 현상이 발생했다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱마다 동작 방식이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;매번 독립 실행되는 앱&lt;/b&gt; (터미널 등)은 실행할 때마다 완전히 새로운 프로세스를 생성한다. 그래서 어느 워크스페이스에서 열든 그 자리에 독립적으로 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Single Instance Application&lt;/b&gt;은 이미 실행 중인 인스턴스가 있으면 새 프로세스를 띄우지 않고, 기존 프로세스에 &quot;창 하나 더 열어줘&quot;라는 신호(D-Bus, 소켓 등)를 보낸다. 그러면 기존 인스턴스가 있는 워크스페이스에서 창이 열리게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Electron 기반 앱(Termius, Slack, Discord, VSCode 등)이나 일부 GTK 앱들이 이 방식을 사용하는 경우가 많다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱마다 방법이 다르고, 아예 막혀있는 경우도 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;code&gt;--new-window&lt;/code&gt; 플래그 (가장 범용적)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Electron 앱과 Chromium 계열 브라우저 대부분에서 동작한다.&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;/path/to/app --new-window&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;/opt/Termius/termius-app --new-window
google-chrome --new-window
code --new-window&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;code&gt;--no-single-instance&lt;/code&gt; 플래그&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 앱에서 싱글 인스턴스 제한 자체를 비활성화할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;/path/to/app --no-single-instance&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 앱 자체 실행 경로 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;which&lt;/code&gt; 또는 &lt;code&gt;find&lt;/code&gt;로 실제 바이너리 경로를 먼저 확인한다. PATH에 등록 안 된 앱은 전체 경로로 실행해야 한다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;which 앱이름
find /opt /usr/bin /usr/local/bin ~/.local -name &quot;*앱이름*&quot; 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 &lt;code&gt;.desktop&lt;/code&gt; 파일의 &lt;code&gt;Exec=&lt;/code&gt; 라인에서 실제 경로를 확인:&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;cat /usr/share/applications/앱이름.desktop&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;앱 아이콘(런처)에 영구 적용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 터미널에서 플래그를 붙여 실행하기 번거로우면 &lt;code&gt;.desktop&lt;/code&gt; 파일을 수정한다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;sudo nano /usr/share/applications/앱이름.desktop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 안의 &lt;code&gt;Exec=&lt;/code&gt; 라인을 찾아 플래그 추가:&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;# 변경 전
Exec=/opt/앱/실행파일

# 변경 후(-&amp;gt; Exec=/opt/Termius/termius-app --new-window)
Exec=/opt/앱/실행파일 --new-window&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장: &lt;code&gt;Ctrl+O&lt;/code&gt; &amp;rarr; &lt;code&gt;Enter&lt;/code&gt; &amp;rarr; &lt;code&gt;Ctrl+X&lt;/code&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 전체에 적용되는 &lt;code&gt;/usr/share/applications/&lt;/code&gt; 대신 사용자 전용으로 적용하려면 &lt;code&gt;~/.local/share/applications/&lt;/code&gt;에 복사해서 수정하면 된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;안 되는 경우&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 방법이 모두 안 된다면, 앱이 싱글 인스턴스를 강하게 고정해놓은 것이다. 이 경우 대안:&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;GNOME 설정으로 창 고정&lt;/b&gt;: 창 타이틀바 우클릭 &amp;rarr; &quot;항상 이 워크스페이스에&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Auto Move Windows&lt;/b&gt; (GNOME Extension): 앱 실행 시 항상 지정한 워크스페이스로 자동 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 앱별 정리&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;앱&lt;/th&gt;
&lt;th&gt;동작 방식&lt;/th&gt;
&lt;th&gt;해결 플래그&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Termius&lt;/td&gt;
&lt;td&gt;Single Instance (Electron)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--new-window&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Chrome&lt;/td&gt;
&lt;td&gt;Single Instance&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--new-window&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VSCode&lt;/td&gt;
&lt;td&gt;Single Instance (Electron)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--new-window&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;td&gt;Single Instance (Electron)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--new-window&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discord&lt;/td&gt;
&lt;td&gt;Single Instance (Electron)&lt;/td&gt;
&lt;td&gt;보통 안 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gnome-terminal&lt;/td&gt;
&lt;td&gt;독립 실행&lt;/td&gt;
&lt;td&gt;불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>리눅스</category>
      <category>Ubuntu 워크스페이스 프로그램</category>
      <author>창빵맨</author>
      <guid isPermaLink="true">https://changsroad.tistory.com/594</guid>
      <comments>https://changsroad.tistory.com/594#entry594comment</comments>
      <pubDate>Mon, 23 Feb 2026 10:39:06 +0900</pubDate>
    </item>
    <item>
      <title>BOJ Mate 개발기</title>
      <link>https://changsroad.tistory.com/593</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;얼마전부터 친구랑 코테 공부를 시작해서 백준 온라인 저지(BOJ)를 열심히 풀고 있는데,&lt;br /&gt;매번 똑같은 작업을 반복하다 보니까 슬슬 귀찮아졌다.&lt;br /&gt;게다가 맥북 화면도 작은데 문제 보고 , 파일 만들고, 템플릿 복붙하고, 테스트 케이스 복사해서 입력 파일 만들고... 이런 걸 자동화 할 방법이 없을까 고민하던 차에, 직접 VS Code 익스텐션을 만들어버렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 탄생한 게 바로 &lt;b&gt;BOJ Mate&lt;/b&gt;다. ClaudeCode를 이용하여 개발했고 VS Code Marketplace에 정식 등록까지 완료하였다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Intro&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BOJ Mate는 &lt;b&gt;백준 문제 풀이를 위한 올인원 VS Code 익스텐션&lt;/b&gt;이다.&lt;br /&gt;문제 검색부터 코드 실행, 테스트, 제출, 심지어 AI 힌트까지 전부 VS Code 안에서 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 단순히 &quot;문제 번호 입력하면 파일 자동 생성되면 좋겠다&quot; 정도로 시작했는데,&lt;br /&gt;점점 욕심이 생기면서 기능이 추가되다 보니 꽤 쓸만한 도구가 나왔다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Features&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  문제 관리가 자동화된다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기본이 되는 기능이다. 문제 번호만 입력하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;백준에서 자동으로 문제 정보를 가져온다 (난이도, 태그까지!)&lt;/li&gt;
&lt;li&gt;문제별로 폴더/파일을 자동 생성한다&lt;/li&gt;
&lt;li&gt;언어별 템플릿을 자동으로 적용한다&lt;/li&gt;
&lt;li&gt;예제 입출력을 자동으로 저장한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 이상 문제 사이트 들어가서 예제 복붙할 필요가 없다는 거다. 이것만 해도 시간이 꽤 절약된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚡ 테스트 실행이 한 번에&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 짜고 나서 테스트하는 것도 정말 귀찮은 작업 중 하나다. 터미널 열고, 입력 파일 만들고, 리다이렉션으로 실행하고... 이제 그런 거 안 해도 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Ctrl+Shift+T&lt;/code&gt; 한 번이면 저장된 테스트 케이스로 자동 검증&lt;/li&gt;
&lt;li&gt;여러 테스트 케이스를 한 번에 돌릴 수 있다&lt;/li&gt;
&lt;li&gt;통과/실패가 한눈에 보인다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 써보니까 이게 진짜 편하더라. 코딩하고 바로바로 테스트할 수 있으니까 디버깅 속도가 훨씬 빨라졌다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  코드 제출도 VS Code 안에서&lt;/h3&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;코드 제출을 VS Code에서 바로&lt;/li&gt;
&lt;li&gt;GitHub 푸시도 커스텀 커밋 메시지 템플릿으로 한 번에&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백준 사이트 들어가서 로그인하고, 파일 찾아서 복붙하는 과정이 사라진다. 코딩에만 집중할 수 있다는 게 이 익스텐션의 가장 큰 장점인 것 같다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  AI 힌트 - 막힐 때 도움받기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 좀 실험적으로 추가한 기능인데, 생각보다 유용하더라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;알고리즘 분류&lt;/b&gt;: &quot;이 문제 어떤 알고리즘으로 풀어야 하지?&quot; 싶을 때 힌트를 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단계별 힌트&lt;/b&gt;: 바로 답을 보는 게 아니라 단계별로 풀이 방향을 안내받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전체 풀이&lt;/b&gt;: 정말 모르겠으면 완전한 풀이와 코드도 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI, Anthropic, Google, Ollama까지 다양한 AI 프로바이더를 지원한다.&lt;br /&gt;로컬 모델(Ollama)도 쓸 수 있어서 API 비용 걱정 없이 사용할 수도 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⏱️ 통계와 타이머&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 풀이 시간을 측정하고 싶은 사람들을 위해 타이머 기능도 넣었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제별 풀이 시간 자동 측정&lt;/li&gt;
&lt;li&gt;난이도별 통계&lt;/li&gt;
&lt;li&gt;최근 풀이 기록&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에 어떤 유형의 문제가 약한지 파악하는 데 도움이 된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;어떤 언어를 지원하나?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백준에서 많이 쓰는 언어들은 대부분 지원한다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;언어&lt;/th&gt;
&lt;th&gt;지원 버전&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;C++&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;C++17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Python&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Python 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Java&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Java 11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;JavaScript&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Rust&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Rust 2021&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 언어마다 기본 템플릿을 제공하고, 물론 커스터마이징도 가능하다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Installation&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 VS Code Marketplace에 정식 등록되어서 설치가 진짜 쉬워졌다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 1: VS Code Marketplace에서 설치&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;VS Code에서 Extensions (Ctrl+Shift+X) 열기&lt;/li&gt;
&lt;li&gt;&quot;BOJ Mate&quot; 검색&lt;/li&gt;
&lt;li&gt;Install 클릭&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=BaeChangHyun.boj-mate&quot;&gt;VS Code Marketplace 페이지&lt;/a&gt;에서 바로 설치 가능하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 2: VSIX 파일로 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Bae-ChangHyun/BOJ-Mate/releases&quot;&gt;GitHub Releases&lt;/a&gt;에서 &lt;code&gt;.vsix&lt;/code&gt; 파일을 다운받아서 설치할 수도 있다:&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;code --install-extension boj-mate-0.0.1.vsix&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용법은?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치하고 나면 기본 설정만 해주면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;익스텐션 아이콘을 클릭하면 나오는 버튼을 통해서 설정을 진행해도 되고, 혹은 설정에서 해도ㅗ딘다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;bojmate.username&quot;: &quot;your_boj_username&quot;,
  &quot;bojmate.language&quot;: &quot;py&quot;,
  &quot;bojmate.workspacePath&quot;: &quot;/path/to/problems&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 기능을 쓰고 싶으면 API 키도 설정해주면 된다:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;bojmate.ai.enabled&quot;: true,
  &quot;bojmate.ai.baseUrl&quot;: &quot;https://api.openai.com/v1&quot;,
  &quot;bojmate.ai.apiKey&quot;: &quot;your_api_key&quot;,
  &quot;bojmate.ai.hintLevel&quot;: &quot;algorithm&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 사용법은 정말 간단하다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사이드바에서 문제 번호 입력&lt;/li&gt;
&lt;li&gt;&quot;생성&quot; 버튼 클릭&lt;/li&gt;
&lt;li&gt;언어 선택&lt;/li&gt;
&lt;li&gt;코딩 시작&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+Shift+T&lt;/code&gt;로 테스트&lt;/li&gt;
&lt;li&gt;제출!&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로젝트 배경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트는 &lt;a href=&quot;https://github.com/dltkdgns00/BOJ-extension&quot;&gt;BOJ-extension&lt;/a&gt;이라는 익스텐션에서 영감을 받아 시작했다. 기존 익스텐션을 쓰다가 &quot;이런 기능도 있으면 좋겠는데&quot; 싶은 게 생겨서 직접 만들어보기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 단순히 기능 추가 정도로 생각했는데, 점점 욕심이 생기면서 아예 &lt;b&gt;완전히 새로운 아키텍처로 재작성&lt;/b&gt;하게 되었다. AI 힌트/피드백, 풀이 타이머, 통계, 코드 제출 기능 등이 추가되면서 꽤 다른 방향으로 진화했다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주의사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나 중요한 점은, 이 익스텐션이 &lt;b&gt;개인 학습 목적&lt;/b&gt;으로 만들어졌다는 거다. 백준 온라인 저지의 공식 제품이 아니고, 웹 스크래핑을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백준은 이용 규칙에서 웹 스크래핑을 금지하고 있는데, 과도한 트래픽을 방지하기 위해 &lt;b&gt;24시간 캐싱&lt;/b&gt;을 적용했다. 그리고 백준 측에서 공식 API를 제공하면 바로 전환할 계획이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 저작권은 해당 문제를 만든 사람에게 있으니, 문제 본문을 외부에 재배포하지 않도록 주의해야 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오픈소스로&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BOJ Mate는 &lt;b&gt;MIT 라이선스&lt;/b&gt;로 공개되어 있다. 코드는 GitHub에서 확인할 수 있고, 이슈나 PR도 언제든 환영한다!&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/Bae-ChangHyun/BOJ-Mate&quot;&gt;https://github.com/Bae-ChangHyun/BOJ-Mate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1771562847547&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 - Bae-ChangHyun/BOJ-Mate&quot; data-og-description=&quot;Contribute to Bae-ChangHyun/BOJ-Mate development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Bae-ChangHyun/BOJ-Mate&quot; data-og-url=&quot;https://github.com/Bae-ChangHyun/BOJ-Mate&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bUWB11/dJMb8RjYynN/KrKAQ60rXZfwdKksrXpTL1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cpOfju/dJMb8WeweCw/0n5U6yzjUDHT5Vq3kkmZ3k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/Bae-ChangHyun/BOJ-Mate&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Bae-ChangHyun/BOJ-Mate&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bUWB11/dJMb8RjYynN/KrKAQ60rXZfwdKksrXpTL1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cpOfju/dJMb8WeweCw/0n5U6yzjUDHT5Vq3kkmZ3k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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 - Bae-ChangHyun/BOJ-Mate&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to Bae-ChangHyun/BOJ-Mate development by creating an account on GitHub.&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;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;VS Code Marketplace&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=BaeChangHyun.boj-mate&quot;&gt;https://marketplace.visualstudio.com/items?itemName=BaeChangHyun.boj-mate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1771562850267&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;BOJ Mate - Visual Studio Marketplace&quot; data-og-description=&quot;Extension for Visual Studio Code - 백준 온라인 저지 문제 풀이를 위한 올인원 VS Code 익스텐션 - 문제 검색, 코드 실행, AI 힌트/피드백, 풀이 타이머, 통계, 코드 제출&quot; data-og-host=&quot;marketplace.visualstudio.com&quot; data-og-source-url=&quot;https://marketplace.visualstudio.com/items?itemName=BaeChangHyun.boj-mate&quot; data-og-url=&quot;https://marketplace.visualstudio.com/items?itemName=BaeChangHyun.boj-mate&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yTeOd/dJMb9b3OGtJ/HriJB5KWboeKhkK9R8uUKk/img.png?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128&quot;&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=BaeChangHyun.boj-mate&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://marketplace.visualstudio.com/items?itemName=BaeChangHyun.boj-mate&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yTeOd/dJMb9b3OGtJ/HriJB5KWboeKhkK9R8uUKk/img.png?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128');&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;BOJ Mate - Visual Studio Marketplace&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Extension for Visual Studio Code - 백준 온라인 저지 문제 풀이를 위한 올인원 VS Code 익스텐션 - 문제 검색, 코드 실행, AI 힌트/피드백, 풀이 타이머, 통계, 코드 제출&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;marketplace.visualstudio.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;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘 공부할 때 반복적인 작업 때문에 짜증났던 경험이 있다면, BOJ Mate 한번 써보길 추천한다. 문제 풀이에만 집중할 수 있게 도와주는 게 이 익스텐션의 목표다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로도 계속 개선해나갈 예정이니, 사용하다가 불편한 점이나 추가되면 좋을 기능이 있으면 &lt;a href=&quot;https://github.com/Bae-ChangHyun/BOJ-Mate/issues&quot;&gt;GitHub Issues&lt;/a&gt;에 알려주면 좋겠다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백준 문제 풀이, 이제 좀 더 편하게 해보자!&lt;/p&gt;</description>
      <category>알쓸신잡</category>
      <category>BOJ extension</category>
      <category>백준</category>
      <category>백준 vscode</category>
      <author>창빵맨</author>
      <guid isPermaLink="true">https://changsroad.tistory.com/593</guid>
      <comments>https://changsroad.tistory.com/593#entry593comment</comments>
      <pubDate>Fri, 20 Feb 2026 13:48:19 +0900</pubDate>
    </item>
    <item>
      <title>Cloudflare R2 가입 &amp;amp; 설정 가이드</title>
      <link>https://changsroad.tistory.com/592</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 쓰레드 자동화를 계획하던 도중, 쓰레드 글에 API를 이용하여 미디어(이미지, 동영상)을 첨부하기 위해서는 공개 접근 가능한 URL이 있어야 한다는 걸 알았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 스토리지를 알아보던 도중 Cloudflare R2가 10GB까지 무료라고 하길래 이참에 써보기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 Egress(데이터전송)이 무료라서 나중에 옮기기도 쉬울 것 같았다.&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;1599&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eHHq57/dJMcacWgTJe/lyz7nyucPNJhHrnwsRCb40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eHHq57/dJMcacWgTJe/lyz7nyucPNJhHrnwsRCb40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eHHq57/dJMcacWgTJe/lyz7nyucPNJhHrnwsRCb40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeHHq57%2FdJMcacWgTJe%2Flyz7nyucPNJhHrnwsRCb40%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;1599&quot; height=&quot;553&quot; data-origin-width=&quot;1599&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Step 1: Cloudflare 계정 가입&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dash.cloudflare.com/sign-up&quot;&gt;dash.cloudflare.com/sign-up&lt;/a&gt; 접속&lt;/li&gt;
&lt;li&gt;이메일 + 비밀번호로 가입 (무료)&lt;/li&gt;
&lt;li&gt;이메일 인증 완료&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[!tip] 신용카드 등록이 필요할 수 있지만, 무료 범위 내에서는 과금되지 않습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Step 2: R2 버킷 생성&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;대시보드 왼쪽 메뉴에서 &lt;b&gt;R2 Object Storage&lt;/b&gt; 클릭&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Create bucket&lt;/b&gt; 클릭&lt;/li&gt;
&lt;li&gt;버킷 이름 입력 (예: &lt;code&gt;thread-media&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;위치는 &lt;b&gt;APAC&lt;/b&gt; 선택 (한국 가까운 리전)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Create bucket&lt;/b&gt; 완료&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3251&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTiKeW/dJMcaiWtk9j/yYF8YTsBccYHsx56QaUG5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTiKeW/dJMcaiWtk9j/yYF8YTsBccYHsx56QaUG5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTiKeW/dJMcaiWtk9j/yYF8YTsBccYHsx56QaUG5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTiKeW%2FdJMcaiWtk9j%2FyYF8YTsBccYHsx56QaUG5K%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;3251&quot; height=&quot;743&quot; data-origin-width=&quot;3251&quot; data-origin-height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1421&quot; data-origin-height=&quot;1372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHpbvm/dJMcagqQwYk/ucZwkdQdiQ7CZgZ3eGrkU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHpbvm/dJMcagqQwYk/ucZwkdQdiQ7CZgZ3eGrkU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHpbvm/dJMcagqQwYk/ucZwkdQdiQ7CZgZ3eGrkU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHpbvm%2FdJMcagqQwYk%2FucZwkdQdiQ7CZgZ3eGrkU1%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;1421&quot; height=&quot;1372&quot; data-origin-width=&quot;1421&quot; data-origin-height=&quot;1372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Step 3: 퍼블릭 액세스 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Threads API가 파일을 가져가려면 공개 URL이 필요합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;생성된 버킷 &amp;rarr; &lt;b&gt;Settings&lt;/b&gt; 탭&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Public Development URL&lt;/b&gt; 활성화&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pub-xxxxx.r2.dev&lt;/code&gt; 형태의 공개 도메인이 생성됨&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 업로드한 파일은 &lt;code&gt;https://pub-xxxxx.r2.dev/파일명&lt;/code&gt;으로 접근 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2403&quot; data-origin-height=&quot;1183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cC62b6/dJMcafyJs7r/dMpCsZ3UrgOGVFJW3hpvl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cC62b6/dJMcafyJs7r/dMpCsZ3UrgOGVFJW3hpvl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cC62b6/dJMcafyJs7r/dMpCsZ3UrgOGVFJW3hpvl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcC62b6%2FdJMcafyJs7r%2FdMpCsZ3UrgOGVFJW3hpvl1%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;2403&quot; height=&quot;1183&quot; data-origin-width=&quot;2403&quot; data-origin-height=&quot;1183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Step 4: API 토큰 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python에서 업로드하려면 API 키가 필요합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;R2 Overview 페이지 &amp;rarr; 우측 하단 &lt;b&gt;Account Details&lt;/b&gt;의 &lt;b&gt;Manage&lt;/b&gt; 클릭&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Create Account API token&lt;/b&gt; 클릭&lt;/li&gt;
&lt;li&gt;설정:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Permission: &lt;b&gt;Object Read &amp;amp; Write&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Specify bucket: &lt;code&gt;thread-media&lt;/code&gt; (생성한 버킷)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Create API Token&lt;/b&gt; 클릭&lt;/li&gt;
&lt;li&gt;표시되는 값 즉시 복사 (다시 볼 수 없음):
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Access Key ID&lt;/code&gt; &amp;rarr; &lt;code&gt;R2_ACCESS_KEY_ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Secret Access Key&lt;/code&gt; &amp;rarr; &lt;code&gt;R2_SECRET_ACCESS_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Endpoint&lt;/code&gt; &amp;rarr; 버킷 상세 페이지에서 확인 (&lt;code&gt;https://&amp;lt;ACCOUNT_ID&amp;gt;.r2.cloudflarestorage.com&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[!warning] API 토큰은 생성 직후에만 확인 가능합니다. 반드시 즉시 복사해 두세요.&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FShnz/dJMcabwiCFX/ExkgwC2cvru5Axj1iNeXuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FShnz/dJMcabwiCFX/ExkgwC2cvru5Axj1iNeXuK/img.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;406&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;24.43&quot; style=&quot;width: 24.1488%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FShnz/dJMcabwiCFX/ExkgwC2cvru5Axj1iNeXuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFShnz%2FdJMcabwiCFX%2FExkgwC2cvru5Axj1iNeXuK%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;658&quot; height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LjY3i/dJMcaivoIe2/1kWsOlvb1nRTRlZhDV2RK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LjY3i/dJMcaivoIe2/1kWsOlvb1nRTRlZhDV2RK0/img.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;399&quot; data-is-animation=&quot;false&quot; style=&quot;width: 74.6884%;&quot; data-widthpercent=&quot;75.57&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LjY3i/dJMcaivoIe2/1kWsOlvb1nRTRlZhDV2RK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLjY3i%2FdJMcaivoIe2%2F1kWsOlvb1nRTRlZhDV2RK0%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;2000&quot; height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Step 5: &lt;code&gt;.env&lt;/code&gt;에 추가&lt;/h2&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;R2_ACCESS_KEY_ID=your_access_key
R2_SECRET_ACCESS_KEY=your_secret_key
R2_ENDPOINT=https://&amp;lt;ACCOUNT_ID&amp;gt;.r2.cloudflarestorage.com
R2_BUCKET_NAME=thread-media
R2_PUBLIC_URL=https://pub-xxxxx.r2.dev&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Step 6: Python으로 업로드 테스트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 설치:&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;uv add boto3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업로드 코드:&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import boto3

s3 = boto3.client('s3',
    endpoint_url='https://&amp;lt;ACCOUNT_ID&amp;gt;.r2.cloudflarestorage.com',
    aws_access_key_id='your_access_key',
    aws_secret_access_key='your_secret_key',
)

# 업로드
s3.upload_file('video.mp4', 'thread-media', 'media/video.mp4')

# 공개 URL
print('https://pub-xxxxx.r2.dev/media/video.mp4')&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알쓸신잡</category>
      <author>창빵맨</author>
      <guid isPermaLink="true">https://changsroad.tistory.com/592</guid>
      <comments>https://changsroad.tistory.com/592#entry592comment</comments>
      <pubDate>Thu, 5 Feb 2026 14:34:38 +0900</pubDate>
    </item>
    <item>
      <title>Claudian-옵시디언에서 Claude Code 사용하기</title>
      <link>https://changsroad.tistory.com/591</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 Claude Code를 결제해줘서 최근 유용하게 사용 중이다.&lt;br /&gt;그러다 보니 예전부터 미뤄왔던 옵시디언 정리를 하고 싶다는 생각이 들었다. 개발 내용 문서화도 하고, 개인 정리도 하고 싶었는데 문제가 하나 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code와 옵시디언을 연동해주는 플러그인이 없더라.&lt;br /&gt;그래서 어쩔 수 없이 옵시디언의 bash 플러그인을 이용해서 별도로 창을 띄워서 사용했었다. 솔직히 좀 불편했다. 설정도 귀찮고, 매번 창을 따로 열어야 하고...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러던 중에 우연히 발견한 게 바로 &lt;b&gt;Claudian&lt;/b&gt;이다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Claudian&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claudian은 옵시디언 플러그인인데, Claude Code를 옵시디언 안에서 바로 사용할 수 있게 해준다. 쉽게 말해서 옵시디언 Vault가 Claude의 작업 디렉토리가 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 봤을 때 &quot;오, 이거다!&quot; 싶었다. bash 플러그인으로 별도 창 띄우는 것보다 훨씬 간편하고 설정도 편해 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 써보니까 꽤 괜찮은 기능들이 많다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Features&lt;/h2&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;: Vault 안의 모든 파일을 읽고 쓸 수 있다. 에이전트처럼 알아서 동작한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이미지 분석&lt;/b&gt;: 드래그 앤 드롭이나 붙여넣기로 이미지를 넣으면 분석해준다. Vision API를 쓰는 것 같다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인라인 편집&lt;/b&gt;: 노트 안에서 직접 텍스트를 수정할 수 있다. 단어 단위로 diff를 미리 보여줘서 뭐가 바뀌는지 확인 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 컨텍스트&lt;/b&gt;: 현재 열려있는 노트를 자동으로 컨텍스트로 넣어준다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@ 멘션&lt;/b&gt;: &lt;code&gt;@&lt;/code&gt; 문법으로 특정 파일만 선택적으로 포함시킬 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;태그 기반 제외&lt;/b&gt;: 민감한 노트는 태그로 제외시킬 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에디터 선택 영역&lt;/b&gt;: 특정 부분만 하이라이트해서 컨텍스트로 쓸 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외부 디렉토리 접근&lt;/b&gt;: Vault 밖의 파일도 접근 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커스텀 인스트럭션&lt;/b&gt;: &lt;code&gt;#&lt;/code&gt;으로 시작하면 시스템 프롬프트를 커스터마이즈할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;슬래시 커맨드&lt;/b&gt;: &lt;code&gt;/command&lt;/code&gt; 형태로 재사용 가능한 명령어를 만들 수 있다. 인자도 넣을 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스킬 모듈&lt;/b&gt;: Claude Code의 스킬 아키텍처랑 호환된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MCP 서버 연결&lt;/b&gt;: Model Context Protocol 서버에 연결 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모델 선택&lt;/b&gt;: Haiku, Sonnet, Opus 중에서 선택할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Plan 모드&lt;/b&gt;: 실행하기 전에 솔루션을 먼저 탐색해본다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한건 직접 사용해보면서 습득하는게 빠른것 같다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Installation&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 방법은 세 가지가 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Release에서 직접 다운로드(추천)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub Release에서 파일 세 개(&lt;code&gt;main.js&lt;/code&gt;, &lt;code&gt;manifest.json&lt;/code&gt;, &lt;code&gt;styles.css&lt;/code&gt;)를 받아서 &lt;code&gt;.obsidian/plugins/claudian/&lt;/code&gt; 폴더에 넣고 설정에서 활성화하면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. BRAT 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BRAT 플러그인을 설치하고 레포지토리 URL을 추가하면 자동으로 설치되고 업데이트도 관리해준다. 이게 제일 편한 것 같다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 소스에서 빌드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자라면 직접 클론해서 빌드할 수도 있다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;# 플러그인 폴더로 클론
git clone https://github.com/YishenTu/claudian .obsidian/plugins/claudian
cd .obsidian/plugins/claudian

# 빌드
npm install
npm run build&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Settings&lt;/h2&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;태그 기반 필터링&lt;/li&gt;
&lt;li&gt;미디어 폴더 지정&lt;/li&gt;
&lt;li&gt;커스텀 시스템 프롬프트&lt;/li&gt;
&lt;li&gt;자동 스크롤 토글&lt;/li&gt;
&lt;li&gt;대화 제목 자동 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모드&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;YOLO&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;자동으로 모든 작업 승인 (위험할 수 있음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Safe&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;매번 승인 필요 (권장)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Plan&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;실행 전에 계획 먼저 검토&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외에도:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bash 커맨드 블랙리스트 (정규식 지원)&lt;/li&gt;
&lt;li&gt;Export 경로 제한 (기본: Desktop, Downloads)&lt;/li&gt;
&lt;li&gt;사용자 Claude 설정 통합&lt;/li&gt;
&lt;li&gt;커스텀 MCP 서버 설정&lt;/li&gt;
&lt;li&gt;Claude Code 플러그인 관리&lt;/li&gt;
&lt;li&gt;환경 변수 구성&lt;/li&gt;
&lt;li&gt;CLI 경로 지정&lt;/li&gt;
&lt;/ul&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;Claude의 파일 접근은 Vault로 제한된다 (symlink 검증 포함)&lt;/li&gt;
&lt;li&gt;외부 쓰기는 설정한 export 경로로만 가능하다&lt;/li&gt;
&lt;li&gt;모든 설정과 상호작용은 &lt;code&gt;vault/.claude/&lt;/code&gt;에 로컬 저장된다&lt;/li&gt;
&lt;li&gt;세션 데이터는 &lt;code&gt;~/.claude/projects/&lt;/code&gt;에 저장된다&lt;/li&gt;
&lt;li&gt;입력, 첨부 파일, 툴 출력은 API 제공자(기본 Anthropic)로 전송된다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Requirements&lt;/h2&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;Claude Code CLI 설치 (네이티브 설치 추천)&lt;/li&gt;
&lt;li&gt;Obsidian 1.8.9 이상&lt;/li&gt;
&lt;li&gt;데스크톱 환경 (macOS, Linux, Windows)&lt;/li&gt;
&lt;li&gt;Claude 구독 또는 Anthropic API 접근 권한&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Summary&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵시디언 쓰면서 Claude Code도 쓰고 있다면 Claudian은 거의 필수 플러그인이라고 할 수 있다. 설치도 간단하고, 설정도 직관적이고, 기능도 강력하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 문서화 작업이나 개인 노트 정리할 때 AI 도움을 받고 싶다면 정말 추천한다. BRAT으로 설치하면 업데이트 관리도 자동으로 되니까 한번 써보길 바란다!&lt;/p&gt;
&lt;figure id=&quot;og_1770192172024&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 - YishenTu/claudian: An Obsidian plugin that embeds Claude Code as an AI collaborator in your vault&quot; data-og-description=&quot;An Obsidian plugin that embeds Claude Code as an AI collaborator in your vault - YishenTu/claudian&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/YishenTu/claudian&quot; data-og-url=&quot;https://github.com/YishenTu/claudian&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EWfnr/dJMb9iICscn/7kYRm8dkXQBe4jwslYr2jk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/ZFKP0/dJMb9ee9gbg/jARzKoxSL5uSmKjAmdU1GK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/YishenTu/claudian&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/YishenTu/claudian&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EWfnr/dJMb9iICscn/7kYRm8dkXQBe4jwslYr2jk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/ZFKP0/dJMb9ee9gbg/jARzKoxSL5uSmKjAmdU1GK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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 - YishenTu/claudian: An Obsidian plugin that embeds Claude Code as an AI collaborator in your vault&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An Obsidian plugin that embeds Claude Code as an AI collaborator in your vault - YishenTu/claudian&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;</description>
      <category>알쓸신잡</category>
      <category>claude code</category>
      <category>claude code obsidian</category>
      <category>옵시디언 claude code</category>
      <author>창빵맨</author>
      <guid isPermaLink="true">https://changsroad.tistory.com/591</guid>
      <comments>https://changsroad.tistory.com/591#entry591comment</comments>
      <pubDate>Wed, 4 Feb 2026 17:04:46 +0900</pubDate>
    </item>
    <item>
      <title>Daggr - HuggingFace의 새로운 AI 워크플로우 도구</title>
      <link>https://changsroad.tistory.com/590</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 최근 HuggingFace에서 공개한 Daggr라는 도구에 대해서 알아보려 한다. 2026년 1월 29일에 공개된 따끈따끈한 신상인데, AI 파이프라인 구축할 때 겪는 여러 문제들을 해결할 수 있는 도구라고 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Daggr가 뭐냐면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해, &lt;b&gt;여러 AI 모델이나 처리 단계를 연결해서 복잡한 워크플로우를 만드는 Python 라이브러리&lt;/b&gt;다.&lt;br /&gt;Gradio 팀에서 만들었는데, Gradio 앱, ML 모델, 커스텀 함수를 블록처럼&lt;br /&gt;조립할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, &quot;이미지 생성 &amp;rarr; 배경 제거 &amp;rarr; 3D 에셋 변환&quot;이라는 10단계 파이프라인이 있다고 치자.&lt;br /&gt;기존 방식으로는 중간에 뭔가 잘못되면 전체를 다시 돌려야 했는데, Daggr는 각 단계를 독립적으로 재실행하고 결과를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 처음에 &quot;또 하나의 GUI 도구겠지&quot; 싶었는데, 막상 보니 접근이 좀 달랐다.&lt;br /&gt;&lt;b&gt;코드로 정의하면 자동으로 비주얼 캔버스가 생성&lt;/b&gt;되는 식이다.&lt;br /&gt;즉 코드 기반의 버전 관리도 되면서, 디버깅은 GUI로 편하게 할 수 있다는 것이다.&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;1920&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRiPjO/dJMcadgyLAC/cJgDDKbOHknc9JdCh3Ei00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRiPjO/dJMcadgyLAC/cJgDDKbOHknc9JdCh3Ei00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRiPjO/dJMcadgyLAC/cJgDDKbOHknc9JdCh3Ei00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRiPjO%2FdJMcadgyLAC%2FcJgDDKbOHknc9JdCh3Ei00%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;1920&quot; height=&quot;732&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Background&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 애플리케이션 개발할 때 겪는 문제가 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기존 방식의 문제점&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;API 체이닝이 복잡하다&lt;/b&gt;&lt;br /&gt;여러 모델을 연결할 때 관리가 어렵다. 어떤 모델이 어떤 입력을 받고 출력을 내는지 추적하기 힘들다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디버깅이 비효율적이다&lt;/b&gt;&lt;br /&gt;10단계 파이프라인에서 7번째 단계가 잘못됐는데, 전체를 다시 실행해야 한다니... 시간과 비용 낭비가 심하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중간 결과를 보기 어렵다&lt;/b&gt;&lt;br /&gt;각 단계의 출력이 어떤지 확인하려면 별도로 코드를 짜거나 로그를 뒤져야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;선택지가 극단적이다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GUI 에디터: 시각적이지만 버전 관리 안 됨&lt;/li&gt;
&lt;li&gt;무거운 오케스트레이션 플랫폼: 기능은 많은데 학습 곡선 가파름&lt;/li&gt;
&lt;li&gt;순수 스크립트: 버전 관리는 되는데 디버깅 지옥&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Daggr의 해결책&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;문제&lt;/th&gt;
&lt;th&gt;Daggr의 접근&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API 체이닝 복잡성&lt;/td&gt;
&lt;td&gt;노드 기반 연결로 시각화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;디버깅 비효율&lt;/td&gt;
&lt;td&gt;각 노드별 독립 재실행 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중간 결과 추적&lt;/td&gt;
&lt;td&gt;모든 노드 출력 자동 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;버전 관리 vs GUI&lt;/td&gt;
&lt;td&gt;코드 우선 + 자동 비주얼 캔버스&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해, &lt;b&gt;&quot;Python 코드로 정의하면 알아서 GUI가 생기고, 각 단계별로 실행/검사할 수 있다&quot;&lt;/b&gt;는 것이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 기능들&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 코드 기반 + 자동 시각화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Daggr의 가장 큰 특징은 이거다.&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 코드로 정의
image_gen = GradioNode(...)
bg_remover = GradioNode(...)
graph = Graph(nodes=[image_gen, bg_remover])
graph.launch()  # 자동으로 비주얼 캔버스 생성&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;이렇게 하면 자동으로 각 노드가 시각화되고, 연결 관계가 그려진다. Git으로 코드 관리도 되고, 디버깅은 GUI로 할 수 있다니 꽤 괜찮은 아이디어다.&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;2050&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tu3cG/dJMcabJQNRs/2jYsYyKvkvyBZDkuwRVxc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tu3cG/dJMcabJQNRs/2jYsYyKvkvyBZDkuwRVxc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tu3cG/dJMcabJQNRs/2jYsYyKvkvyBZDkuwRVxc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftu3cG%2FdJMcabJQNRs%2F2jYsYyKvkvyBZDkuwRVxc0%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;2050&quot; height=&quot;564&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 노드별 재실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10단계 파이프라인에서 7번째 단계만 문제면? 그 단계만 다시 돌리면 된다. 이전 단계들의 결과는 캐시되어 있어서 시간 낭비가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 &lt;b&gt;&quot;백업 노드&quot;&lt;/b&gt;라는 게 있어서, 특정 모델이나 Space를 다른 걸로 교체해서 다시 실행할 수도 있다고 한다. A 모델로 했는데 결과가 별로면, B 모델로 바꿔서 해당 단계만 재실행하는 식이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Gradio 통합&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gradio 팀이 만들었으니 당연한데, &lt;b&gt;Gradio Space를 그냥 갖다 쓸 수 있다&lt;/b&gt;. 어댑터나 래퍼 없이 Space 이름만 입력하면 끝이다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;node = GradioNode(
    &quot;hf-applications/Z-Image-Turbo&quot;,
    api_name=&quot;/generate_image&quot;,
    inputs={&quot;prompt&quot;: gr.Textbox(...)},
    outputs={&quot;image&quot;: gr.Image(...)},
)&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;공개 Space든 비공개 Space든 참조 가능하고, 심지어 &lt;code&gt;run_locally=True&lt;/code&gt; 옵션을 주면 Space를 로컬로 복제해서 격리된 가상환경에서 실행한다. 로컬 실행 실패하면 자동으로 원격 API로 폴백된다고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 상태 지속성 (State Persistence)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Daggr는 워크플로우 상태를 자동으로 저장한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력값&lt;/li&gt;
&lt;li&gt;캐시된 결과&lt;/li&gt;
&lt;li&gt;캔버스 위치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 작업하다가 브라우저 끄고 다시 켜도 이어서 할 수 있다는 얘기다. &quot;Sheets&quot;라는 기능도 있어서 동일한 앱 내에서 여러 워크스페이스를 유지할 수 있다고 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;지원하는 노드 타입&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Daggr는 3가지 타입의 노드를 지원한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ GradioNode - Gradio Space 또는 로컬 앱&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 원격 Space 호출
image_gen = GradioNode(
    &quot;hf-applications/Z-Image-Turbo&quot;,
    api_name=&quot;/generate_image&quot;,
    inputs={
        &quot;prompt&quot;: gr.Textbox(label=&quot;Prompt&quot;, value=&quot;A cheetah...&quot;, lines=3),
        &quot;height&quot;: 1024,
        &quot;width&quot;: 1024,
        &quot;seed&quot;: random.random,
    },
    outputs={
        &quot;image&quot;: gr.Image(label=&quot;Generated Image&quot;),
    },
)

# 로컬 실행
bg_remover = GradioNode(
    &quot;hf-applications/background-removal&quot;,
    api_name=&quot;/image&quot;,
    run_locally=True,  # Space를 로컬에 복제해서 실행
    inputs={&quot;image&quot;: gr.Image(label=&quot;Input&quot;)},
    outputs={&quot;final_image&quot;: gr.Image(label=&quot;Output&quot;)},
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;run_locally=True&lt;/code&gt;를 쓰면 Space가 자동으로 복제되고, 격리된 가상환경에서 앱이 실행된다. 실패하면 알아서 원격으로 전환된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ FnNode - 커스텀 Python 함수&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;def downscale_image(image, scale: float = 0.25):
    pil_img = Image.open(image)
    w, h = pil_img.size
    new_w = int(w * scale)
    new_h = int(h * scale)
    resized = pil_img.resize((new_w, new_h), resample=Image.LANCZOS)
    return resized

downscaler = FnNode(
    downscale_image,
    name=&quot;Downscale image&quot;,
    inputs={
        &quot;image&quot;: previous_node.output,  # 이전 노드 연결
        &quot;scale&quot;: gr.Slider(minimum=0.25, maximum=0.75, value=0.25),
    },
    outputs={
        &quot;image&quot;: gr.Image(label=&quot;Downscaled Image&quot;),
    },
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 Python 함수를 노드로 만들 수 있다. 데이터 전처리나 간단한 변환 작업에 유용하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ InferenceNode - HuggingFace Inference Providers&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;flux_enhancer = InferenceNode(
    model=&quot;black-forest-labs/FLUX.2-klein-4B:fal-ai&quot;,  # model:provider 형식
    inputs={
        &quot;image&quot;: downscaler.image,  # 이전 노드 출력 연결
        &quot;prompt&quot;: gr.Textbox(label=&quot;Prompt&quot;, value=&quot;Transform this into 3D&quot;),
    },
    outputs={
        &quot;image&quot;: gr.Image(label=&quot;Enhanced Image&quot;),
    },
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HuggingFace Inference API를 바로 호출할 수 있다. &lt;code&gt;model:provider&lt;/code&gt; 형식으로 지정하면 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 및 실행&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install daggr
# 또는
uv pip install daggr&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python 3.10 이상이 필요하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배포&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로컬 공유 링크:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;graph.launch(share=True)  # 공개 URL 생성&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HuggingFace Spaces 배포:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;requirements.txt&lt;/code&gt;에 &lt;code&gt;daggr&lt;/code&gt; 추가&lt;/li&gt;
&lt;li&gt;Gradio SDK로 Space 생성&lt;/li&gt;
&lt;li&gt;코드 푸시&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ &lt;b&gt;주의&lt;/b&gt;: &lt;code&gt;InferenceNode&lt;/code&gt; 사용 시 HuggingFace 세밀한 액세스 토큰(fine-grained token)으로 &quot;Inference Providers 호출&quot; 권한만 부여하는 게 안전하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;현재 상태 및 주의사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Daggr는 &lt;b&gt;베타 버전&lt;/b&gt;이다. 즉 API가 변경될 수 있다는 얘기다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의할 점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;워크플로우 상태는 로컬에 저장되는데, 업데이트 중 데이터 손실 가능성이 있다고 한다.&lt;/li&gt;
&lt;li&gt;아직 초기 단계라 버그나 예상치 못한 동작이 있을 수 있다.&lt;/li&gt;
&lt;li&gt;피드백은 &lt;a href=&quot;https://github.com/gradio-app/daggr/issues&quot;&gt;GitHub Issues&lt;/a&gt;로 보내면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제 Space:&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1769993081452&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;Daggr Image To 3d - a Hugging Face Space by merve&quot; data-og-description=&quot;This app transforms your uploaded images into professional 3D-ready assets. First, it removes the background from your image, then enhances it with AI to create a clean 3D render. Finally, it gener...&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/spaces/merve/daggr-image-to-3d&quot; data-og-url=&quot;https://huggingface.co/spaces/merve/daggr-image-to-3d&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e1Azs/dJMb8SXsSiV/QJwq7oVh8pvMpnMVqFdxzK/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/do1RlI/dJMb9bvXmH1/P2jd2hgJWyoURYG8rv0S41/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/spaces/merve/daggr-image-to-3d&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/spaces/merve/daggr-image-to-3d&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e1Azs/dJMb8SXsSiV/QJwq7oVh8pvMpnMVqFdxzK/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/do1RlI/dJMb9bvXmH1/P2jd2hgJWyoURYG8rv0S41/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;Daggr Image To 3d - a Hugging Face Space by merve&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This app transforms your uploaded images into professional 3D-ready assets. First, it removes the background from your image, then enhances it with AI to create a clean 3D render. Finally, it gener...&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;여기 들어가서 실제로 어떻게 동작하는지 확인해 볼 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;: 디버깅 효율성 대폭 향상&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Gradio 통합&lt;/b&gt;: Space를 그냥 갖다 쓸 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상태 지속성&lt;/b&gt;: 작업 이어하기 가능&lt;/li&gt;
&lt;/ul&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 자료:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/blog/daggr&quot;&gt;HuggingFace 공식 블로그: Introducing Daggr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/gradio-app/daggr&quot;&gt;Daggr GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/spaces/merve/daggr-image-to-3d&quot;&gt;예제 Space: daggr-image-to-3d&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>알쓸신잡</category>
      <category>daggr</category>
      <category>huggingface</category>
      <author>창빵맨</author>
      <guid isPermaLink="true">https://changsroad.tistory.com/590</guid>
      <comments>https://changsroad.tistory.com/590#entry590comment</comments>
      <pubDate>Mon, 2 Feb 2026 09:45:21 +0900</pubDate>
    </item>
    <item>
      <title>Microsoft VibeVoice-ASR</title>
      <link>https://changsroad.tistory.com/589</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 음성 인식 기술이 정말 빠르게 발전하고 있다는 걸 체감하는 요즘인데, 마이크로소프트가 또 하나 재미있는 걸 오픈소스로 공개했다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 &lt;b&gt;VibeVoice-ASR&lt;/b&gt;이라는 음성-텍스트 변환 모델이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 이 VibeVoice-ASR이 뭔지, 왜 주목할 만한지 정리해보려 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VibeVoice-ASR&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VibeVoice-ASR은 마이크로소프트가 2026년 1월 21일에 오픈소스로 공개한 &lt;b&gt;자동 음성 인식(ASR)&lt;/b&gt; 모델이다. 쉽게 말해 음성 파일을 텍스트로 변환해 주는 AI인데, 기존 모델들과는 좀 다른 특징이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 눈에 띄는 건 &lt;b&gt;60분짜리 음성을 통째로 한번에 처리&lt;/b&gt;할 수 있다는 점이다. 보통 ASR 모델들은 긴 음성을 짧게 잘라서 처리하는데, 이 녀석은 한 시간짜리를 그냥 한방에 받아서 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VibeVoice-ASR은 단순히 음성을 텍스트로 변환하는 것뿐만 아니라 , 세 가지 정보를 한꺼번에 제공한다.&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;Who (누가)&lt;/b&gt;: 화자 식별 - 누가 말했는지 구분&lt;/li&gt;
&lt;li&gt;&lt;b&gt;When (언제)&lt;/b&gt;: 타임스탬프 - 몇 분 몇 초에 말했는지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;What (무엇을)&lt;/b&gt;: 실제 발화 내용 텍스트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 회의 녹음 파일을 넣으면 &quot;A씨가 3분 20초에 '이 프로젝트는 내일까지 완료해야 합니다'라고 말했다&quot; 이런 식으로 구조화된 결과를 받을 수 있다는 것이다.&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;1529&quot; data-origin-height=&quot;825&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wUEYZ/dJMcai3coH6/vP5x0Bk1F4K2Itc8H6rELk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wUEYZ/dJMcai3coH6/vP5x0Bk1F4K2Itc8H6rELk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wUEYZ/dJMcai3coH6/vP5x0Bk1F4K2Itc8H6rELk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwUEYZ%2FdJMcai3coH6%2FvP5x0Bk1F4K2Itc8H6rELk%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;762&quot; height=&quot;411&quot; data-origin-width=&quot;1529&quot; data-origin-height=&quot;825&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Features&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 60-minute Single-Pass Processing&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 나오는 ASR 모델들을 보면, 짧게 짧게 끊어서 전사하는 경우가 많이 보였다.&lt;br /&gt;나도 사실 어차피 음성을 텍스트로변환하기만 하면 되니까, 정확하기만 한다면 뭐 짧게 여려 번하던 길게 한 번에 하던 상관없다고 생각했다.&lt;br /&gt;그러나 짧게짧게 변환하면 아래와 같은 문제가 발생한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;화자 추적 일관성 문제&lt;/b&gt;: 앞 구간에서 &quot;화자 1&quot;로 인식됐던 사람이 뒷 구간에서 &quot;화자 3&quot;으로 바뀌는 일이 발생&lt;/li&gt;
&lt;li&gt;&lt;b&gt;맥락 손실&lt;/b&gt;: 대화 흐름이 끊겨서 문맥 이해가 어려움&lt;/li&gt;
&lt;li&gt;&lt;b&gt;처리 파이프라인 복잡도&lt;/b&gt;: ASR &amp;rarr; 화자 분리 &amp;rarr; 타임스탬프를 각각 돌려야 함&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 VibeVOice-ASR은 &lt;b&gt;64K 토큰 길이&lt;/b&gt;로 최대 60분을 한번에 받는다. 그래서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 시간 내내 같은 사람을 일관되게 추적 가능&lt;/li&gt;
&lt;li&gt;전체 대화의 맥락을 유지하면서 인식&lt;/li&gt;
&lt;li&gt;ASR + 화자분리 + 타임스탬프를 &lt;b&gt;하나의 모델&lt;/b&gt;에서 동시에 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해 &quot;전체 그림을 보면서 처리한다&quot;는 것이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-1. Customized Hotwords:&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 실무적으로 진짜 유용할 것 같은데, &lt;b&gt;도메인 특화 단어&lt;/b&gt;를 미리 알려줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기업 회의: 프로젝트 이름, 임직원 이름&lt;/li&gt;
&lt;li&gt;의료: 질병명, 약물명&lt;/li&gt;
&lt;li&gt;법률: 전문 용어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 걸 &quot;핫워드&quot;로 등록하면 인식 정확도가 크게 올라간다고 한다. 일반 모델은 &quot;갤럭시폴드&quot;를 &quot;갤럭시 폴트&quot;로 잘못 인식할 수 있지만, 핫워드로 등록하면 정확하게 인식하는 식이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2-2. Multilingual &amp;amp; Code-Switching Support&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다국어를 지원하는데, 여기서 재미있는 건 &lt;b&gt;언어 설정을 따로 안 해도 된다&lt;/b&gt;는 것이다. 자동으로 감지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 신기한 건 &lt;b&gt;코드 스위칭(Code-Switching)&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 좋았던 것은 한국어를 지원하는 모델이라는 것이다 ㅜㅜ 감사합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 모델 스펙&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;파라미터 수&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;9B (90억개)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;데이터 타입&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;BF16 (Bfloat16)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;포맷&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Safetensors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;라이선스&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;프레임워크&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Transformers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MIT 라이선스라는 게 포인트다. 상업적으로도 자유롭게 사용 가능하다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문도 공개되어 있다: &lt;a href=&quot;https://arxiv.org/pdf/2601.18184&quot;&gt;arXiv:2601.18184&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 성능&lt;/h2&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;b&gt;DER (Diarization Error Rate)&lt;/b&gt;: 화자 분리 오류율&lt;/li&gt;
&lt;li&gt;&lt;b&gt;cpWER (Character Piece Word Error Rate)&lt;/b&gt;: 단어 인식 오류율&lt;/li&gt;
&lt;li&gt;&lt;b&gt;tcpWER (Time-aware cpWER)&lt;/b&gt;: 시간 정보 고려한 오류율&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확한 수치 논문과 HuggingFace 페이지에 그래프로 나와있는데, gemini2.5 pro, gemini 3.0 pro와 비교하여 우수한 성능을 보였다&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VibeVoice-ASR을 정리하면:&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;60분 통째로 한방에 처리&lt;/b&gt; (ASR + 화자분리 + 타임스탬프 통합)&lt;/li&gt;
&lt;li&gt;✅ &lt;b&gt;커스텀 핫워드&lt;/b&gt;로 도메인 특화 가능&lt;/li&gt;
&lt;li&gt;✅ &lt;b&gt;50개 언어 + 코드 스위칭&lt;/b&gt; 지원&lt;/li&gt;
&lt;li&gt;✅ &lt;b&gt;MIT 라이선스&lt;/b&gt;로 상업적 사용 가능&lt;/li&gt;
&lt;li&gt;⚠️ 실시간보다는 &lt;b&gt;배치 처리&lt;/b&gt;에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 회의 녹음 자동 정리용으로 진짜 유용할 것 같다. 특히 화자별로 발화 내용이 구분되는 건 엄청 편리할 듯하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 9B 모델이라 로컬에서 돌리려면 GPU가 필요하니, 간단한 테스트는 데모 페이지에서 해보고, 본격적으로 쓸 거면 클라우드 GPU 환경을 고려하는 게 좋겠다.&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;또한 Microsoft에서 작성한 파인튜닝 가이드도 존재하며, vllm으로 서빙도 가능해서 실무등에서 바로 활용해 볼 수 있을 것 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가이드:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://github.com/microsoft/VibeVoice/blob/main/finetuning-asr/README.md&quot;&gt;Finetuning README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;문서:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://github.com/microsoft/VibeVoice/blob/main/docs/vibevoice-vllm-asr.md&quot;&gt;vLLM-VibeVoice-ASR&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1769992285094&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;Gradio&quot; data-og-description=&quot;Click to try out the app!&quot; data-og-host=&quot;dfd7cdd77aee79cc37.gradio.live&quot; data-og-source-url=&quot;https://aka.ms/vibevoice-asr&quot; data-og-url=&quot;https://dfd7cdd77aee79cc37.gradio.live/%7Burl%7D&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c5O5Vp/dJMb9fZqmFL/IT4DCqUnzRb2JLRopKs3k0/img.jpg?width=2473&amp;amp;height=1280&amp;amp;face=0_0_2473_1280&quot;&gt;&lt;a href=&quot;https://aka.ms/vibevoice-asr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aka.ms/vibevoice-asr&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c5O5Vp/dJMb9fZqmFL/IT4DCqUnzRb2JLRopKs3k0/img.jpg?width=2473&amp;amp;height=1280&amp;amp;face=0_0_2473_1280');&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;Gradio&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Click to try out the app!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dfd7cdd77aee79cc37.gradio.live&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/microsoft/VibeVoice-ASR&quot;&gt;VibeVoice-ASR on HuggingFace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/VibeVoice&quot;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/pdf/2601.18184&quot;&gt;Technical Paper (arXiv)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aka.ms/vibevoice-asr&quot;&gt;Official Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/VibeVoice/blob/main/finetuning-asr/README.md&quot;&gt;Finetuning Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>알쓸신잡</category>
      <category>asr 모델</category>
      <category>microsoft vibevoice</category>
      <category>vibevoice-asr</category>
      <category>한국어 asr</category>
      <category>한국어 stt</category>
      <author>창빵맨</author>
      <guid isPermaLink="true">https://changsroad.tistory.com/589</guid>
      <comments>https://changsroad.tistory.com/589#entry589comment</comments>
      <pubDate>Mon, 2 Feb 2026 09:32:36 +0900</pubDate>
    </item>
    <item>
      <title>PaddleOCR-VL-1.5-초경량 OCR의 새로운 강자</title>
      <link>https://changsroad.tistory.com/588</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;약 2-3개월 전부터 vlm을 이용한 OCR 모델들이 우르르 쏟아졌다. 그중에 Qwen 같은 대형 모델들도 있고 OCR에만 특화된 nanonet, dots.cor 등 소형 모델들도 다수 등장했다.&lt;br /&gt;문서 파싱쪽 업무를 담당하면서 일주일에 10개씩 모델을 올렸다 내렸다 하고 있었는데 테스트 결과 정리하기도 이전에 새로운 모델이 또 출시됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이전 버전인 &lt;a href=&quot;https://huggingface.co/PaddlePaddle/PaddleOCR-VL&quot;&gt;PaddleOCR-VL&lt;/a&gt;도 동일하게 0.9B에다가 벤치마크가 좋았어서 써봤었다.&lt;br /&gt;성능은 기대만큼 괜찮았지만 아주 아주 약간의 아쉽지만 치명적인 부분들이 있었는데, 그런데 어제 마침 새로운 버전이 나왔다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불과 0.9B 파라미터&lt;b&gt;로 Gemini 3 Pro 같은 거대 모델들을 제치고 OCR 벤치마크 1위를 차지한 **PaddleOCR-VL-1.5&lt;/b&gt;가 그 주인공이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;PaddleOCR-VL-1.5&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이두가 2026년 1월 29일에 공개한 &lt;b&gt;초경량 비전-언어 모델(VLM)&lt;/b&gt;이다.&lt;br /&gt;문서 인식(OCR)에 특화되어 있으면서도 크기는 겨우 0.9B 파라미터로 매우 대단하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 구성 요소&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;컴포넌트&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;비주얼 인코더&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;NaViT 스타일의 동적 해상도 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;언어 모델&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;ERNIE-4.5-0.3B (바이두의 경량 LLM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;라이선스&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Apache 2.0 (상업적 사용 가능!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;텐서 타입&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;BF16 (효율적 연산)&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;기본 베이스 모델은 ERNIE-4.5-0.3B이고, 여기에 NaViT 방식의 Vision Encoder을 붙여서 이미지 인식 능력을 극대화했다. 쉽게 말해서 &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;4016&quot; data-origin-height=&quot;2504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSwV6h/dJMcad1S2wF/k4PcXyotTobOL05SKMg2B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSwV6h/dJMcad1S2wF/k4PcXyotTobOL05SKMg2B0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSwV6h/dJMcad1S2wF/k4PcXyotTobOL05SKMg2B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSwV6h%2FdJMcad1S2wF%2Fk4PcXyotTobOL05SKMg2B0%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;4016&quot; height=&quot;2504&quot; data-origin-width=&quot;4016&quot; data-origin-height=&quot;2504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;놀라운 성능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 모델의 진짜 충격적인 부분은 성능이다. OmniDocBench v1.5라는 벤치마크에서 &lt;b&gt;94.5%의 정확도&lt;/b&gt;를 달성했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ypl48/dJMcafFsoRw/fhzOSedc1Kf3vV1Gikfw61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ypl48/dJMcafFsoRw/fhzOSedc1Kf3vV1Gikfw61/img.png&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2268&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.5822%; margin-right: 10px;&quot; data-widthpercent=&quot;51.18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ypl48/dJMcafFsoRw/fhzOSedc1Kf3vV1Gikfw61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fypl48%2FdJMcafFsoRw%2FfhzOSedc1Kf3vV1Gikfw61%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;3840&quot; height=&quot;2268&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJfG7Z/dJMcafFsoRB/2U49d5HWH6hZkoT0D4UovK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJfG7Z/dJMcafFsoRB/2U49d5HWH6hZkoT0D4UovK/img.png&quot; data-origin-width=&quot;1570&quot; data-origin-height=&quot;972&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.255%;&quot; data-widthpercent=&quot;48.82&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJfG7Z/dJMcafFsoRB/2U49d5HWH6hZkoT0D4UovK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJfG7Z%2FdJMcafFsoRB%2F2U49d5HWH6hZkoT0D4UovK%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;1570&quot; height=&quot;972&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벤치마크를 보면 알겠지만 대형 모형들을 포함하여 최신 모델들을 모두 뛰어넘은 성능을 보여주고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 요즘 벤치마크는 사실 믿기 어렵다는 게 사실이다. 데이터를 잘 만들고 오버피팅하면 되니까. 진짜 중요한 건 &lt;b&gt;실제 환경에서 얼마나 잘 작동하느냐&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PaddleOCR-VL-1.5는 &quot;Real5-OmniDocBench&quot;라는 실전 환경 테스트에서도 SOTA를 달성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Real5-OmniDocBench는 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;OmniDocBench v1.5 데이터셋을 기반으로 구축된, 실제 시나리오에 최적화된 새로운 벤치마크이다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Real5 데이터셋은 다음 5가지 까다로운 시나리오를 테스트한다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시나리오&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;난이도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;  &lt;b&gt;스캔&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;스캔 아티팩트, 노이즈 포함 문서&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;  &lt;b&gt;기울어짐&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;비뚤어진 각도로 찍힌 사진&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;  &lt;b&gt;화면 촬영&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;모니터 화면을 카메라로 찍은 이미지 (반사 포함)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;  &lt;b&gt;조명&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;부분 조명, 그림자가 있는 문서&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;  &lt;b&gt;휘어짐&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;구겨진 종이, 곡면 변형&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1566&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m9bWP/dJMcagdiKUB/cnjfKhWj3HpHUUYx9ieIh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m9bWP/dJMcagdiKUB/cnjfKhWj3HpHUUYx9ieIh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m9bWP/dJMcagdiKUB/cnjfKhWj3HpHUUYx9ieIh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm9bWP%2FdJMcagdiKUB%2FcnjfKhWj3HpHUUYx9ieIh0%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;1566&quot; height=&quot;714&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;714&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;휘어진 종이나 화면 촬영&lt;/b&gt; 같은 건 정말 어려운 케이스다.&lt;br /&gt;일반 OCR로는 제대로 인식이 안 되는 경우가 많은데, PaddleOCR-VL-1.5는 이런 상황에서도 강력하게 작동한다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 이 부분이 가장 마음에 든다. 실험실 데이터가 아니라 &lt;b&gt;진짜 현실에서 마주칠 법한 상황&lt;/b&gt;을 잘 처리한다는 거니까.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 LLM, VLM들의 추세에 맞게 vllm을 통한 서빙도 바로 지원한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# vLLM 서버 시작 (Docker)
docker run \
    --rm \
    --gpus all \
    --network host \
    ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest-nvidia-gpu \
    paddleocr genai_server --model_name PaddleOCR-VL-1.5-0.9B --host 0.0.0.0 --port 8080 --backend vllm

# CLI로 호출
paddleocr doc_parser \
    -i image.png \
    --vl_rec_backend vllm-server \
    --vl_rec_server_url http://127.0.0.1:8080/v1&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;단일 NVIDIA A100에서 배치 처리(512 문서)가 가능하다고 하니, 프로덕션 환경에서도 충분히 쓸만할 것 같다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리: OCR의 새로운 기준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PaddleOCR-VL-1.5를 한 문장으로 정리하면 이렇다:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;0.9B 파라미터로 Gemini를 이긴, 실전에 강한 문서 파싱의 최강자&quot;&lt;/b&gt;&lt;/p&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;AI 업계가 &quot;더 크고 더 강한&quot; 모델 경쟁에 집중할 때, 바이두는 반대로 &lt;b&gt;&quot;더 작고 더 효율적인&quot;&lt;/b&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;✅ OmniDocBench v1.5에서 94.5% SOTA 달성&lt;/li&gt;
&lt;li&gt;✅ Real5 벤치마크에서 실전 성능 입증&lt;/li&gt;
&lt;li&gt;✅ Apache 2.0 라이선스로 상업적 활용 가능&lt;/li&gt;
&lt;li&gt;✅ 109개 언어 지원으로 글로벌 확장성 확보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 문서 처리 자동화가 필요하다면 PaddleOCR-VL-1.5를 한번 고려해 보길 바란다. 특히 리소스가 제한된 환경이나, 빠른 추론 속도가 중요한 프로덕션 시나리오라면 거의 최선의 선택일 것 같다.&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;figure id=&quot;og_1769991138933&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;PaddleOCR-VL-1.5 Online Demo - a Hugging Face Space by PaddlePaddle&quot; data-og-description=&quot;PaddleOCR-VL-1.5_Online_Demo&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/spaces/PaddlePaddle/PaddleOCR-VL-1.5_Online_Demo&quot; data-og-url=&quot;https://huggingface.co/spaces/PaddlePaddle/PaddleOCR-VL-1.5_Online_Demo&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/chK329/dJMb8U8OGGx/YSLkv7n5VtifXpnh2wuyJK/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/bKZbyq/dJMb8SpCYWC/4Wyf7srrkkdeRT5UP8WZYK/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/spaces/PaddlePaddle/PaddleOCR-VL-1.5_Online_Demo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/spaces/PaddlePaddle/PaddleOCR-VL-1.5_Online_Demo&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/chK329/dJMb8U8OGGx/YSLkv7n5VtifXpnh2wuyJK/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/bKZbyq/dJMb8SpCYWC/4Wyf7srrkkdeRT5UP8WZYK/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;PaddleOCR-VL-1.5 Online Demo - a Hugging Face Space by PaddlePaddle&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;PaddleOCR-VL-1.5_Online_Demo&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;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;HuggingFace 모델 페이지&lt;/b&gt;: &lt;a href=&quot;https://huggingface.co/PaddlePaddle/PaddleOCR-VL-1.5&quot;&gt;https://huggingface.co/PaddlePaddle/PaddleOCR-VL-1.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;공식 문서&lt;/b&gt;: &lt;a href=&quot;https://www.paddleocr.ai/latest/en/version3.x/pipeline_usage/PaddleOCR-VL.html&quot;&gt;https://www.paddleocr.ai/latest/en/version3.x/pipeline_usage/PaddleOCR-VL.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub 저장소&lt;/b&gt;: &lt;a href=&quot;https://github.com/PaddlePaddle/PaddleOCR&quot;&gt;https://github.com/PaddlePaddle/PaddleOCR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;arXiv 논문&lt;/b&gt;: &lt;a href=&quot;https://arxiv.org/abs/2601.21957&quot;&gt;https://arxiv.org/abs/2601.21957&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;온라인 데모&lt;/b&gt;:&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Sources:&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;a href=&quot;https://huggingface.co/PaddlePaddle/PaddleOCR-VL-1.5&quot;&gt;HuggingFace - PaddleOCR-VL-1.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.paddleocr.ai/latest/en/version3.x/pipeline_usage/PaddleOCR-VL.html&quot;&gt;PaddleOCR Official Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>알쓸신잡</category>
      <category>paddle</category>
      <category>PaddleOCR-VL-1.5</category>
      <category>vlm ocr</category>
      <category>문서 파싱</category>
      <author>창빵맨</author>
      <guid isPermaLink="true">https://changsroad.tistory.com/588</guid>
      <comments>https://changsroad.tistory.com/588#entry588comment</comments>
      <pubDate>Mon, 2 Feb 2026 09:11:19 +0900</pubDate>
    </item>
    <item>
      <title>Qwen3-ASR  오픈소스 음성 인식의 새로운 강자</title>
      <link>https://changsroad.tistory.com/587</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 어제 알리바바 클라우드의 Qwen 팀에서 공개한 &lt;b&gt;Qwen3-ASR&lt;/b&gt;에 대해서 알아보려 한다.&lt;br /&gt;2026년 1월 29일에 출시된 따끈따끈한 모델인데, 음성 인식(ASR) 분야에서 꽤 혁신적인 접근을 보여주고 있어서 정리해 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Qwen3-ASR&lt;/b&gt;은 알리바바 클라우드의 Qwen 팀이 만든 오픈소스 자동 음성 인식(ASR) 모델이다.&lt;br /&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;a href=&quot;https://huggingface.co/Qwen/Qwen3-ASR-0.6B&quot;&gt;&lt;b&gt;Qwen3-ASR-0.6B&lt;/b&gt;&lt;/a&gt;: 가벼운 버전, 속도가 미친 듯이 빠름&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/Qwen/Qwen3-ASR-1.7B&quot;&gt;&lt;b&gt;Qwen3-ASR-1.7B&lt;/b&gt;&lt;/a&gt;: 성능 위주 버전, 오픈소스 중 최고 수준&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 더해 &lt;a href=&quot;https://huggingface.co/Qwen/Qwen3-ForcedAligner-0.6B&quot;&gt;&lt;b&gt;Qwen3-ForcedAligner-0.6B&lt;/b&gt;&lt;/a&gt;라는 보조 모델도 있는데, 이건 음성과 텍스트를 정밀하게 정렬해서 단어 단위로 타임스탬프를 붙여주는 역할을 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNvMD7/dJMcahwu8sk/QjMnNlbh2L0ayXM12IINFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNvMD7/dJMcahwu8sk/QjMnNlbh2L0ayXM12IINFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNvMD7/dJMcahwu8sk/QjMnNlbh2L0ayXM12IINFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNvMD7%2FdJMcahwu8sk%2FQjMnNlbh2L0ayXM12IINFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;714&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Feature&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. All-in-one&lt;/h3&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;1118&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNMudu/dJMb99SLaxM/5II1b4pveosNHTxLoL8AWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNMudu/dJMb99SLaxM/5II1b4pveosNHTxLoL8AWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNMudu/dJMb99SLaxM/5II1b4pveosNHTxLoL8AWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNMudu%2FdJMb99SLaxM%2F5II1b4pveosNHTxLoL8AWK%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;709&quot; height=&quot;393&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 한국어 ASR 모델이 많이 없는데, 한국어가 된다는 것에 매우 감사했고, 엄청나게 다양한 언어들을 지원할 뿐만 아니라 &lt;b&gt;자동언어 식별&lt;/b&gt; 기능이 내장되어 있어서, 어떤 언어인지 미리 알려주지 않아도 알아서 판단한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Excellent and Fast&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벤치마크 결과를 보면 확실히 알 수 있다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;데이터셋&lt;/th&gt;
&lt;th&gt;Whisper-large-v3&lt;/th&gt;
&lt;th&gt;Qwen3-ASR-0.6B&lt;/th&gt;
&lt;th&gt;Qwen3-ASR-1.7B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Librispeech (clean)&lt;/td&gt;
&lt;td&gt;1.51&lt;/td&gt;
&lt;td&gt;2.11&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1.63&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GigaSpeech&lt;/td&gt;
&lt;td&gt;9.76&lt;/td&gt;
&lt;td&gt;8.88&lt;/td&gt;
&lt;td&gt;&lt;b&gt;8.45&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WenetSpeech (net)&lt;/td&gt;
&lt;td&gt;9.86&lt;/td&gt;
&lt;td&gt;5.97&lt;/td&gt;
&lt;td&gt;&lt;b&gt;4.97&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;언어 식별 정확도 (평균)&lt;/td&gt;
&lt;td&gt;94.1%&lt;/td&gt;
&lt;td&gt;96.8%&lt;/td&gt;
&lt;td&gt;&lt;b&gt;97.9%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 WenetSpeech에서 Whisper의 절반 수준인 4.97을 기록한 건 꽤 인상적이었다. OpenAI의 Whisper-large-v3가 음성 인식의 강자로 여겨졌는데, 드디어 제대로 된 경쟁자가 나온 셈이다.(자세한 벤치마크는 HF에 나와있다)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 스트리밍과 배치 처리 둘 다 된다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 ASR 모델은 스트리밍용이랑 오프라인용을 따로 만드는 경우가 많은데, Qwen3-ASR은 &lt;b&gt;단일 모델&lt;/b&gt;로 두 가지를 다 지원한다. 실시간 음성 인식이 필요할 때도, 이미 녹음된 파일을 처리할 때도 같은 모델을 쓸 수 있다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게다가 &lt;b&gt;5분 이상의 긴 오디오&lt;/b&gt;도 문제없이 처리한다고 한다. 팟캐스트나 강의 같은 긴 콘텐츠에도 바로 적용 가능하겠다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Novel and strong forced alignment Solution&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Qwen3-ForcedAligner-0.6B&lt;/b&gt;를 함께 쓰면 단어/문자 수준의 타임스탬프를 얻을 수 있다. 이게 왜 중요하냐면, 자막 생성이나 음성 분석 같은 작업에 필수적이기 때문이다. 강제 정렬(Forced Alignment) 성능도 기존 모델들을 압도한다:&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;b&gt;33.1ms&lt;/b&gt; (기존 NFA는 109.8ms)&lt;/li&gt;
&lt;li&gt;영어: &lt;b&gt;37.5ms&lt;/b&gt; (기존 WhisperX는 92.1ms)&lt;/li&gt;
&lt;li&gt;평균: &lt;b&gt;42.9ms&lt;/b&gt; (기존은 129.8~161.1ms)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평균 오차가 42.9ms라는 건, 거의 눈 깜빡할 새도 없는 수준의 정확도다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;How to use&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치부터 실행까지 생각보다 간단했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 설치&lt;/h3&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;conda create -n qwen3-asr python=3.12 -y
conda activate qwen3-asr
# 기본 설치
pip install -U qwen-asr

# vLLM 백엔드 포함 (더 빠름, 권장)
pip install -U qwen-asr[vllm]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 vLLM 버전으로 설치했는데, 속도가 확실히 체감될 정도로 빨랐다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 기본 사용법 (Transformers 백엔드)&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import torch
from qwen_asr import Qwen3ASRModel

# 모델 로드
model = Qwen3ASRModel.from_pretrained(
    &quot;Qwen/Qwen3-ASR-1.7B&quot;,
    dtype=torch.bfloat16,
    device_map=&quot;cuda:0&quot;,
    max_inference_batch_size=32,
    max_new_tokens=256,
)

# 음성 인식 실행
results = model.transcribe(
    audio=&quot;https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-ASR-Repo/asr_en.wav&quot;,
    language=None,  # 자동 언어 식별
)

print(results[0].language)  # 언어 출력
print(results[0].text)      # 인식된 텍스트&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;language=None&lt;/code&gt;으로 설정하면 자동으로 언어를 감지해 준다. 이게 진짜 편한 게, 여러 언어가 섞인 데이터를 처리할 때 일일이 지정 안 해줘도 된다는 것이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-1. vLLM으로 더 빠르게&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import torch
from qwen_asr import Qwen3ASRModel

if __name__ == '__main__':
    model = Qwen3ASRModel.LLM(
        model=&quot;Qwen/Qwen3-ASR-1.7B&quot;,
        gpu_memory_utilization=0.7,
        max_inference_batch_size=128,
        max_new_tokens=4096,
    )

    results = model.transcribe(
        audio=[
            &quot;https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-ASR-Repo/asr_zh.wav&quot;,
            &quot;https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-ASR-Repo/asr_en.wav&quot;,
        ],
        language=[&quot;Chinese&quot;, &quot;English&quot;],
    )

    for r in results:
        print(r.language, r.text)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vLLM 백엔드는 배치 처리에 최적화되어 있어서, 여러 파일을 한꺼번에 처리할 때 훨씬 효율적이다. 공식 문서에 따르면 0.6B 모델의 경우 동시성 128일 때 &lt;b&gt;2000배 처리량&lt;/b&gt;을 보여준다고 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-2. 타임스탬프 포함 인식&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;results = model.transcribe(
    audio=[&quot;audio1.wav&quot;, &quot;audio2.wav&quot;],
    language=[&quot;Chinese&quot;, &quot;English&quot;],
    return_time_stamps=True,
    forced_aligner=&quot;Qwen/Qwen3-ForcedAligner-0.6B&quot;,
)

for r in results:
    print(r.language, r.text, r.time_stamps[0])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;return_time_stamps=True&lt;/code&gt;만 추가하면 각 단어가 언제 시작하고 끝나는지 정확한 시간 정보를 얻을 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. OpenAI API compatible server&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vLLM으로 서버를 띄우면 OpenAI API 형식으로 호출할 수 있다. 이미 OpenAI SDK를 쓰고 있다면 엔드포인트만 바꾸면 된다는 것이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-1 vllm 서빙&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;vllm serve Qwen/Qwen3-ASR-1.7B&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-2.Python request&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from openai import OpenAI

client = OpenAI(
    base_url=&quot;http://localhost:8000/v1&quot;,
    api_key=&quot;EMPTY&quot;
)

response = client.chat.completions.create(
    model=&quot;Qwen/Qwen3-ASR-1.7B&quot;,
    messages=[{
        &quot;role&quot;: &quot;user&quot;,
        &quot;content&quot;: [{
            &quot;type&quot;: &quot;audio_url&quot;,
            &quot;audio_url&quot;: {&quot;url&quot;: &quot;https://...asr_en.wav&quot;}
        }]
    }],
)

print(response.choices[0].message.content)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-3. cuRL request&lt;/h4&gt;
&lt;pre class=&quot;scilab&quot;&gt;&lt;code&gt;curl http://localhost:8000/v1/chat/completions \
    -H &quot;Content-Type: application/json&quot; \
    -d '{
        &quot;messages&quot;: [{
            &quot;role&quot;: &quot;user&quot;,
            &quot;content&quot;: [{
                &quot;type&quot;: &quot;audio_url&quot;,
                &quot;audio_url&quot;: {&quot;url&quot;: &quot;https://...asr_en.wav&quot;}
            }]
        }]
    }'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 기존 시스템에 통합하기가 훨씬 쉬워진다. OpenAI의 Whisper API를 쓰고 있었다면 거의 그대로 교체 가능한 수준이다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Qwen3-ForcedAligner&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Forced Alignment는 음성과 텍스트를 정밀하게 맞추는 기술이다. 쉽게 말해, &quot;이 단어는 정확히 몇 초부터 몇 초까지 말했다&quot;는 정보를 자동으로 찾아내는 것이다.&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;b&gt;자막 싱크&lt;/b&gt;: 영상과 자막의 타이밍을 정확하게 맞춤&lt;/li&gt;
&lt;li&gt;&lt;b&gt;음성 분석&lt;/b&gt;: 특정 단어가 언제 나왔는지 추적&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언어 학습&lt;/b&gt;: 발음 교정 시 단어별 발음 시간 측정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통적인 도구로는 Montreal Forced Aligner(MFA)가 유명한데, 설정이 복잡하고 언어별로 따로 모델을 관리해야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WhisperX 같은 최신 ASR 기반 방법도 나왔지만, 정확도가 기대만큼은 아니었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Qwen3-ForcedAligner는 &lt;b&gt;NAR(Non-Autoregressive)&lt;/b&gt; 방식을 쓴다. 기존의 순차적 방식과 달리 한 번에 모든 타임스탬프를 예측해서 속도가 빠르고, 11개 언어를 단일 모델로 처리한다.(이것도 11개 언어 중에 한국어가 포함되어 있어서 너무 기쁘다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 비교를 보면 차이가 명확하다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;언어&lt;/th&gt;
&lt;th&gt;WhisperX&lt;/th&gt;
&lt;th&gt;NFA&lt;/th&gt;
&lt;th&gt;Qwen3-ForcedAligner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;중국어&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;109.8ms&lt;/td&gt;
&lt;td&gt;&lt;b&gt;33.1ms&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;영어&lt;/td&gt;
&lt;td&gt;92.1ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;b&gt;37.5ms&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;평균&lt;/td&gt;
&lt;td&gt;161.1ms&lt;/td&gt;
&lt;td&gt;129.8ms&lt;/td&gt;
&lt;td&gt;&lt;b&gt;42.9ms&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3배 이상 정확하다는 것이다. 실제로 써보면 자막이 거의 완벽하게 동기화되는 걸 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASR 없이 Forced Aligner만 쓸 수도 있다:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import torch
from qwen_asr import Qwen3ForcedAligner

model = Qwen3ForcedAligner.from_pretrained(
    &quot;Qwen/Qwen3-ForcedAligner-0.6B&quot;,
    dtype=torch.bfloat16,
    device_map=&quot;cuda:0&quot;,
)

results = model.align(
    audio=&quot;audio.wav&quot;,
    text=&quot;甚至出现交易几乎停滞的情况。&quot;,
    language=&quot;Chinese&quot;,
)

# 각 단어의 시작-종료 시간 출력
for word in results[0]:
    print(word.text, word.start_time, word.end_time)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 텍스트를 알고 있을 때(예: 대본이 있는 영상) 정확한 타이밍만 필요하면 이렇게 쓸 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker를 선호한다면 공식 이미지를 쓸 수 있다:&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;LOCAL_WORKDIR=/path/to/workspace
docker run --gpus all --name qwen3-asr \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -p 8000:80 \
    --mount type=bind,source=$LOCAL_WORKDIR,target=/data/shared/Qwen3-ASR \
    --shm-size=4gb \
    -it qwenllm/qwen3-asr:latest&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;--gpus all&lt;/code&gt;은 GPU를 쓰기 위한 옵션이고, &lt;code&gt;--shm-size=4gb&lt;/code&gt;는 공유 메모리를 충분히 확보하기 위한 것이다. 배치 처리를 할 때 메모리가 부족하면 에러가 날 수 있어서 이 부분은 꼭 설정해 주는 게 좋다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 HuggingFace를 하루에 몇백 번씩 들락날락거리면서 추세를 보아하니 한 두세 달 전까지는 VLM기반의 OCR 모델들이 열풍이었고(아직도 계속해서 출시되고 있는데 이제 경량화에 들어간 모습),&lt;br /&gt;얼마 전부터는 ASR, TTS 등의 task를 가진 모델들이 치열하게 경쟁 중인 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Qwen3-ASR-1.7B는 오픈소스 음성 인식 분야에서 꽤 의미 있는 발전이라고 생각한다. Whisper가 나왔을 때도 놀라웠는데, 이번에는 더 빠르고 정확한 모델이 Apache 2.0 라이선스로 나왔다는 게 반갑다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 핵심은 이 3가지다!!&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;다국어 지원&lt;/b&gt;: 30개 언어 + 22개 방언을 단일 모델로 처리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상용급 성능&lt;/b&gt;: Whisper와 경쟁 가능한 수준의 정확도&lt;/li&gt;
&lt;li&gt;&lt;b&gt;타임스탬프&lt;/b&gt;: Forced Aligner로 단어 단위 정밀 정렬&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에 시간 나면 실제 프로젝트에 적용해 보고 후속 편을 써볼 예정이다. 궁금한 점이나 더 자세한 내용은 공식 Github이나 HuggingFace 모델 카드를 참고하길 바란다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 방금 전 Technical Report도 공개되었으니 더욱 자세&amp;nbsp;한 정보는 확인해 보길 바란다.&lt;/p&gt;
&lt;figure id=&quot;og_1769757371299&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;Paper page - Qwen3-ASR Technical Report&quot; data-og-description=&quot;Join the discussion on this paper page&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/papers/2601.21337&quot; data-og-url=&quot;https://huggingface.co/papers/2601.21337&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GqSqc/dJMb9lL6r8U/rV6KissIuaiKOnd7g9vjyk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/hxZwF/dJMb9eTKuxd/frsOwYAkkfj4YKleOL3dEk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/cdtwlW/dJMb9kl7G0E/b05K5LaqVi6t69LGnILUg1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://huggingface.co/papers/2601.21337&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/papers/2601.21337&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GqSqc/dJMb9lL6r8U/rV6KissIuaiKOnd7g9vjyk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/hxZwF/dJMb9eTKuxd/frsOwYAkkfj4YKleOL3dEk/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/cdtwlW/dJMb9kl7G0E/b05K5LaqVi6t69LGnILUg1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&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;Paper page - Qwen3-ASR Technical Report&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Join the discussion on this paper page&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/Qwen/Qwen3-ASR-1.7B&quot;&gt;Qwen3-ASR-1.7B HuggingFace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/Qwen/Qwen3-ForcedAligner-0.6B&quot;&gt;Qwen3-ForcedAligner-0.6B HuggingFace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/QwenLM/Qwen3-ASR&quot;&gt;Qwen3-ASR Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sider.ai/blog/ai-tools/qwen3-asr-flash-review-real-time-accuracy-meets-speed-for-2025&quot;&gt;Qwen3 ASR Review: Real-Time Accuracy Meets Speed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://research.nvidia.com/labs/conv-ai/blogs/2023/2023-08-forced-alignment/&quot;&gt;How does forced alignment work? - NVIDIA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/MontrealCorpusTools/Montreal-Forced-Aligner&quot;&gt;Montreal Forced Aligner&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>qwen3</category>
      <category>qwen3 asr</category>
      <category>qwen3-asr</category>
      <category>한국어 asr</category>
      <author>창빵맨</author>
      <guid isPermaLink="true">https://changsroad.tistory.com/587</guid>
      <comments>https://changsroad.tistory.com/587#entry587comment</comments>
      <pubDate>Fri, 30 Jan 2026 16:17:25 +0900</pubDate>
    </item>
    <item>
      <title>STAX - 구글이 내놓은 LLM 평가 플랫폼</title>
      <link>https://changsroad.tistory.com/586</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbVJcT/dJMcahDcDHh/lxuvfWkw6EM5fKOfEBLZN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbVJcT/dJMcahDcDHh/lxuvfWkw6EM5fKOfEBLZN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbVJcT/dJMcahDcDHh/lxuvfWkw6EM5fKOfEBLZN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbVJcT%2FdJMcahDcDHh%2FlxuvfWkw6EM5fKOfEBLZN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;910&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 최근 구글에서 공개한 STAX라는 LLM 평가 플랫폼에 대해 알아보려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;LLM을 프로덕션에 적용하려는 개발자라면 모델 평가가 얼마나 골치 아픈 문제인지 알 것이다.&lt;br /&gt;나도 처음에는 &quot;그냥 써보고 괜찮으면 되는 거 아냐?&quot;라고 생각했는데, 막상 실제 서비스에 적용하려니 &quot;이게 정말 잘 작동하는 건가?&quot;라는 의문도 들고 하루에도 몇십 개씩 모델이 나오기 때문에 평가가 필수적이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글은 이런 문제를 &quot;Vibe Testing(감각적 판단)&quot;이라고 부르며, STAX를 통해 이를 해결하겠다고 나섰다. 과연 어떤 플랫폼인지 한번 파헤쳐보자!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;STAX가 뭐길래?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STAX는 구글이 만든 LLM 평가 전문 플랫폼이다. 공식 슬로건이 꽤 인상적인데, &lt;b&gt;&quot;Stop chasing generic benchmarks. Start building for your users&quot;&lt;/b&gt;라고 한다. 번역하자면 &quot;일반적인 벤치마크 쫓아다니지 말고, 너네 유저를 위한 평가를 해라&quot;는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해, MMLU나 HumanEval 같은 일반 벤치마크는 모델의 전반적인 성능은 알려주지만, &lt;b&gt;내 서비스에 필요한 특정 능력&lt;/b&gt;(예: 의료 안전성, 법률 준수 등)은 측정하기 어렵다는 것이다. STAX는 바로 이 지점을 공략한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STAX의 핵심은 딱 3가지다!!&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;빠른 평가, 빠른 배포&lt;/b&gt;: 수동 테스트를 자동화된 평가로 대체해서 개발 속도를 높인다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의미 있는 측정&lt;/b&gt;: 일반 벤치마크가 아니라 &lt;b&gt;내 제품, 내 유저에 맞춘 맞춤형 메트릭&lt;/b&gt;으로 평가&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 기반 의사결정&lt;/b&gt;: 감으로 하는 게 아니라 &lt;b&gt;정확한 수치와 성능 지표&lt;/b&gt;로 출시 준비 상태를 파악&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기존 LLM 평가의 문제점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 LLM을 평가하려면 어떻게 했을까? 크게 3가지 방법이 있었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &quot;Vibe Testing&quot; (감각적 판단)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말 그대로 &quot;이거 좋은 것 같은데?&quot; 하는 느낌으로 판단하는 것이다. 나도 처음에는 이렇게 했는데, 문제는 &lt;b&gt;재현성이 없다&lt;/b&gt;는 거다. 오늘은 좋아 보이는데 내일 보면 별로고, 사람마다 판단이 다르다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Generic Benchmarks (일반 벤치마크)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MMLU, HumanEval 같은 리더보드 벤치마크는 분명 유용하다. 하지만 이건 &lt;b&gt;모델의 전반적인 능력&lt;/b&gt;을 측정할 뿐이다. 내가 만드는 의료 챗봇이 정말 안전한지, 법률 상담 봇이 규정을 준수하는지는 알 수 없다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Human Raters (사람 평가자)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람이 직접 평가하는 게 가장 정확하긴 한데, 문제는 &lt;b&gt;느리고, 비싸고, 일관성 유지가 어렵다&lt;/b&gt;는 것이다. 평가자마다 기준이 다를 수 있고, 대량 평가는 사실상 불가능하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;LLM은 왜 기존 테스트가 안 통할까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 소프트웨어는 단위 테스트(Unit Test)가 잘 먹힌다. 같은 입력에 같은 출력이 나오니까. 그런데 &lt;b&gt;LLM은 비결정적(Non-deterministic)&lt;/b&gt;이다. 같은 질문을 해도 매번 다른 답이 나올 수 있다. 그래서 기존 테스트 방식이 먹히질 않는다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;STAX가 제공하는 솔루션&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STAX는 이런 문제들을 어떻게 해결할까? 크게 3단계 플라이휠(Flywheel)로 작동한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Experiment (실험)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델, 프롬프트, AI 오케스트레이션을 빠르게 비교한다. 여러 모델을 한 번에 테스트해 보고 어떤 게 더 나은지 비교할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STAX는 현재 다양한 모델 프로바이더를 지원한다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OpenAI (GPT 시리즈)&lt;/li&gt;
&lt;li&gt;Anthropic (Claude)&lt;/li&gt;
&lt;li&gt;Mistral&lt;/li&gt;
&lt;li&gt;Grok&lt;/li&gt;
&lt;li&gt;DeepSeek&lt;/li&gt;
&lt;li&gt;Google (Gemini)&lt;/li&gt;
&lt;li&gt;Custom 엔드포인트도 가능!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Evaluate (평가)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기가 핵심이다!! STAX는 3가지 타입의 평가자(Evaluator)를 제공한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(1) Heuristic/Code-based (규칙 기반)&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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응답 길이가 100자 이하인가?&lt;/li&gt;
&lt;li&gt;특정 키워드가 포함되어 있는가?&lt;/li&gt;
&lt;li&gt;JSON 형식이 올바른가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객관적이고 명확한 기준이 있을 때 유용하지만, 창의성이나 톤 같은 주관적 요소는 측정하기 어렵다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(2) LLM-as-a-Judge (자동 평가)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 진짜 혁신적인 부분이다! 강력한 LLM(예: Gemini)이 다른 모델의 출력을 &quot;채점&quot;하는 방식이다.&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;&quot;이 답변이 친절한가?&quot;&lt;/li&gt;
&lt;li&gt;&quot;사실에 부합하는가?&quot;&lt;/li&gt;
&lt;li&gt;&quot;적절한 톤으로 작성되었는가?&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STAX는 미리 만들어진 평가자를 제공하면서도, &lt;b&gt;커스텀 평가 기준을 만들 수 있게&lt;/b&gt; 해 준다. 구글에 따르면 요즘 LLM 자동 평가자는 사람 수준에 근접했다고 한다. 빠르고, 확장 가능하고, 비용도 저렴하다!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(3) Human Raters (사람 평가)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 평가가 아무리 좋아도, 사람의 검증은 여전히 중요하다. STAX는 사람 평가자를 플랫폼에 통합해서 &lt;b&gt;calibration(보정)&lt;/b&gt;과 &lt;b&gt;validation(검증)&lt;/b&gt;에 활용할 수 있게 했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Analyze (분석)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평가 결과를 시각적으로 추적하고 집계해 준다. &quot;시간에 따른 성능 변화&quot;를 볼 수 있어서, 모델이나 프롬프트를 업데이트했을 때 실제로 개선되었는지 명확히 알 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터셋 관리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STAX는 평가를 위한 데이터셋 관리 기능도 제공한다. 크게 3가지 방법으로 데이터셋을 만들 수 있다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;기존 데이터 업로드&lt;/b&gt;: 이미 가지고 있는 프로덕션 데이터를 가져올 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;직접 생성&lt;/b&gt;: 플랫폼 내에서 새로 만들기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LLM으로 합성 데이터 생성&lt;/b&gt;: 모델을 활용해서 synthetic dataset을 자동 생성!&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람 평가와 자동 평가를 조합해서 벤치마크를 구축할 수 있다는 점도 매력적이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 프라이버시는?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 사람들이 궁금해할 부분인데, 구글은 명확히 밝혔다:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Google will neither own user data (including prompts, custom datasets, or evaluators) nor use it to train its language models.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 내가 STAX에 올린 데이터를 구글이 가져가지도 않고, 모델 학습에 쓰지도 않는다는 것이다. 안심하고 써도 될 것 같다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가격은?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 &lt;b&gt;베타 기간 동안은 무료&lt;/b&gt;다! 다만 구글은 베타 이후 가격 정책을 도입할 수 있다고 밝혔다. 지금이 써볼 기회인 셈이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근 방법은 간단하다. &lt;code&gt;stax.withgoogle.com&lt;/code&gt;에 구글 계정으로 로그인하면 된다. Discord 커뮤니티 지원과 상세 문서도 제공한다고 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STAX의 진짜 가치를 이해하려면 기존 방식과 비교해봐야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기존 방식의 한계&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방식&lt;/th&gt;
&lt;th&gt;장점&lt;/th&gt;
&lt;th&gt;단점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Vibe Testing&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;빠르고 간단&lt;/td&gt;
&lt;td&gt;주관적, 재현 불가, 데이터 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Generic Benchmarks&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;객관적, 비교 용이&lt;/td&gt;
&lt;td&gt;도메인 특화 요구사항 측정 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Human Raters&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;가장 정확&lt;/td&gt;
&lt;td&gt;느림, 비쌈, 일관성 유지 어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;STAX의 차별점&lt;/h3&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;: Fluency, Factuality, Safety 등 &lt;b&gt;내 서비스에 필요한 기준&lt;/b&gt;으로 평가&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동화 + 사람&lt;/b&gt;: LLM-as-a-Judge로 확장 가능하면서도 사람 검증 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티 메트릭, 멀티 데이터셋&lt;/b&gt;: 한 번에 여러 측면을 평가해서 &lt;b&gt;종합적인 성능&lt;/b&gt; 파악&lt;/li&gt;
&lt;li&gt;&lt;b&gt;반복 가능한 파이프라인&lt;/b&gt;: &quot;감&quot;이 아니라 &lt;b&gt;구조화된, 엔지니어링 된 평가&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해, ad-hoc(임시방편)에서 &lt;b&gt;시스템적인 평가&lt;/b&gt;로 전환하는 거다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 써볼 만한가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 말해서, 아직 베타 단계라 실제 프로덕션에서 얼마나 효율적인지는 더 지켜봐야 할 것 같다. 다만 구글 DeepMind와 Google Labs의 평가 전문성을 녹여냈다는 점에서 기대는 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 다음과 같은 상황이라면 써볼 만하다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;도메인 특화 LLM 서비스&lt;/b&gt;를 만들고 있다면 (의료, 법률, 금융 등)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;여러 모델/프롬프트를 비교&lt;/b&gt;해야 하는 상황&lt;/li&gt;
&lt;li&gt;&lt;b&gt;평가 기준을 명확히&lt;/b&gt; 정의하고 싶다면&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시간에 따른 성능 변화&lt;/b&gt;를 추적하고 싶다면&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로, 단순히 &quot;한 번 써보고 괜찮으면 되는&quot; 정도의 간단한 프로젝트라면 오버킬일 수도 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리하며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STAX는 LLM 평가의 패러다임을 바꾸려는 구글의 야심작이다. &quot;Vibe Testing&quot;에서 벗어나 &lt;b&gt;데이터 기반의 체계적인 평가&lt;/b&gt;를 가능하게 해 준다는 점에서 의미가 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 베타라서 무료로 써볼 수 있으니, LLM 프로젝트를 진행 중이라면 한번 테스트해 보는 걸 추천한다. 나도 조만간 실제 프로젝트에 적용해 보고, 경험을 공유해 볼 생각이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에는 STAX를 실제로 써본 후기와 구체적인 사용법에 대해서 작성해 볼 예정이다!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://stax.withgoogle.com/landing/index.html&quot;&gt;STAX 공식 사이트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/stax/overview&quot;&gt;Google for Developers - STAX Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.googleblog.com/streamline-llm-evaluation-with-stax/&quot;&gt;Google Developers Blog - Streamline LLM Evaluation with Stax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.pytorch.kr/t/stax-google-llm/7609&quot;&gt;PyTorch Korea - STAX 소개&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.infoq.com/news/2025/09/google-stax-ai-evaluation/&quot;&gt;InfoQ - Google Stax Aims to Make AI Model Evaluation Accessible&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://evolutionaihub.com/google-stax-llm-evaluations-launch/&quot;&gt;EvolutionAI Hub - Google Launches Stax To End LLM 'Vibe Testing'&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/stax/best-practices&quot;&gt;Google Developers - Evaluation Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tech-now.io/en/blogs/google-ai-stax-smarterevaluation-platform-for-large-language-models&quot;&gt;Tech-Now - Google AI Stax: Smarter Evaluation for LLM Performance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>알쓸신잡</category>
      <category>STAX</category>
      <author>창빵맨</author>
      <guid isPermaLink="true">https://changsroad.tistory.com/586</guid>
      <comments>https://changsroad.tistory.com/586#entry586comment</comments>
      <pubDate>Mon, 26 Jan 2026 15:36:46 +0900</pubDate>
    </item>
  </channel>
</rss>