<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Harfbuzz on ICE-ICE-BEAR-BLOG</title><link>https://ice-ice-bear.github.io/ko/tags/harfbuzz/</link><description>Recent content in Harfbuzz on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Wed, 06 May 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/ko/tags/harfbuzz/index.xml" rel="self" type="application/rss+xml"/><item><title>Polaris MCFG — 라이센스 안전한 폰트 메트릭 호환 생성기, 그리고 LLM 평가 루브릭 토론</title><link>https://ice-ice-bear.github.io/ko/posts/2026-05-06-polaris-mcfg-and-llm-eval-rubric/</link><pubDate>Wed, 06 May 2026 00:00:00 +0900</pubDate><guid>https://ice-ice-bear.github.io/ko/posts/2026-05-06-polaris-mcfg-and-llm-eval-rubric/</guid><description>&lt;img src="https://ice-ice-bear.github.io/" alt="Featured image of post Polaris MCFG — 라이센스 안전한 폰트 메트릭 호환 생성기, 그리고 LLM 평가 루브릭 토론" /&gt;&lt;h2 id="개요"&gt;개요
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/PolarisOffice/polaris_mcfg" target="_blank" rel="noopener"
 &gt;PolarisOffice/polaris_mcfg&lt;/a&gt;는 2026-04-26에 풀린 폴라리스오피스 제품팀의 도구로 보인다. 한컴 폰트나 사내 상용 폰트처럼 &lt;strong&gt;재배포가 제한된 폰트&lt;/strong&gt;에서 &lt;strong&gt;레이아웃 메트릭만&lt;/strong&gt; 추출해, &lt;a class="link" href="https://fonts.google.com/noto/specimen/Noto&amp;#43;Sans" target="_blank" rel="noopener"
 &gt;NotoSans&lt;/a&gt;·&lt;a class="link" href="https://github.com/orioncactus/pretendard" target="_blank" rel="noopener"
 &gt;Pretendard&lt;/a&gt; 같은 자유 라이센스 폰트의 글리프 디자인에 입혀 새 폰트를 만든다. 결과물은 &lt;strong&gt;원본 문서의 줄바꿈/페이지 분할이 그대로 유지되면서도 라이센스가 안전한 폰트&lt;/strong&gt;다. 흥미로운 점은 같은 시기에 &lt;strong&gt;LLM 평가 루브릭&lt;/strong&gt; 이야기가 함께 회자됐다는 것 — 두 토픽 모두 production-grade engineering의 단면이다.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 Source["Source font.ttf &amp;lt;br/&amp;gt; (상용/제한)"] --&gt; Extract["mcfg extract"]
 Extract --&gt; Metrics["metrics.json &amp;lt;br/&amp;gt; advance/ascender/descender"]
 Free["Free font.ttf &amp;lt;br/&amp;gt; (NotoSans/Pretendard)"] --&gt; Generate["mcfg generate"]
 Metrics --&gt; Generate
 Generate --&gt; Output["Polaris font.ttf &amp;lt;br/&amp;gt; OFL-safe"]
 Output --&gt; Validate["mcfg validate &amp;lt;br/&amp;gt; HarfBuzz 렌더링 회귀"]
 Validate --&gt; Pass["PASS &amp;lt;br/&amp;gt; advance widths 일치 &amp;lt;br/&amp;gt; 렌더링 ±0.5 percent"]&lt;/pre&gt;&lt;h2 id="풀려는-문제"&gt;풀려는 문제
&lt;/h2&gt;&lt;p&gt;기업 문서 환경에서 한컴 폰트로 작성된 .hwp/.docx를 다른 환경에서 열면 &lt;strong&gt;줄바꿈과 페이지 분할이 깨진다&lt;/strong&gt;. 글리프 모양이 다른 게 문제가 아니다 — advance width, ascender, descender, line gap 같은 &lt;strong&gt;숫자 메트릭이 다르기 때문&lt;/strong&gt;이다. polaris_mcfg는 이 문제를 정확히 한 줄로 풀었다: outline은 건드리지 않고, 숫자 메트릭만 자유 폰트에 이식한다.&lt;/p&gt;
&lt;h2 id="핵심-분리--라이센스-안전-경계"&gt;핵심 분리 — 라이센스 안전 경계
&lt;/h2&gt;&lt;p&gt;도구가 다루는 데이터는 &lt;strong&gt;숫자 메트릭만&lt;/strong&gt;이다. 글리프 outline은 추출도 복제도 하지 않는다. 따라서 생성된 폰트의 시각적 디자인은 100% 자유 폰트 쪽이고, 라이센스도 자유 폰트의 라이센스를 따른다. &lt;a class="link" href="https://openfontlicense.org/" target="_blank" rel="noopener"
 &gt;SIL Open Font License (OFL)&lt;/a&gt; 1.1 — 2007년 SIL International의 Victor Gaultney와 Nicolas Spalinger가 마지막으로 손본 이후 20년 가까이 변하지 않은, 폰트 산업의 사실상 표준 자유 라이센스다. NotoSans·Pretendard 모두 OFL.&lt;/p&gt;
&lt;h2 id="cli"&gt;CLI
&lt;/h2&gt;&lt;table&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;code&gt;mcfg extract &amp;lt;font.ttf&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;메트릭 → JSON&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mcfg compare a b&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;두 폰트(또는 JSON) 비교 (text/json/html)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mcfg generate --metrics … --design …&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;합성 폰트 생성&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mcfg validate &amp;lt;font&amp;gt; --against …&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;메트릭 만족 여부 검증&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mcfg extract NotoSansKR-Bold.ttf -o bold.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mcfg generate &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --metrics bold.json &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --design NotoSansKR-Regular.ttf &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --output PolarisBoldMetrics-Regular.ttf &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --apply global,advance &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --license-text &lt;span class="s2"&gt;&amp;#34;SIL Open Font License 1.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mcfg validate PolarisBoldMetrics-Regular.ttf &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --against NotoSansKR-Bold.ttf &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --render-default &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --render-tolerance-pct 0.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# → result: PASS (advance widths 일치, 렌더링 ±0.5% 이내)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;검증 단계에 &lt;a class="link" href="https://harfbuzz.github.io/" target="_blank" rel="noopener"
 &gt;HarfBuzz&lt;/a&gt;를 쓴다. OpenType shaping의 사실상 표준 엔진이라 — 실제 렌더링 결과를 픽셀 단위로 비교해야 메트릭 이식이 진짜 통했는지 확인할 수 있기 때문이다.&lt;/p&gt;
&lt;h2 id="마일스톤과-라이센스-책임"&gt;마일스톤과 라이센스 책임
&lt;/h2&gt;&lt;p&gt;M1 메트릭 추출기 + JSON 스키마부터 M7 패키징/문서까지 모두 완주, 84 tests 통과. 도구 코드는 MIT, 생성된 폰트는 디자인 폰트 라이센스(OFL 등)을 따른다. 다만 &lt;strong&gt;소스 폰트의 EULA가 메트릭 추출을 허용하는지 검토할 책임은 사용자 본인&lt;/strong&gt;(Requirements.md §6)이다. 도구가 라이센스 회피 자동화 머신이 아니라 정직한 분리 도구라는 점을 분명히 한다.&lt;/p&gt;
&lt;h2 id="함께-회자된-llm-평가-루브릭-토론"&gt;함께 회자된 LLM 평가 루브릭 토론
&lt;/h2&gt;&lt;p&gt;이 링크의 직전 대화가 무관해 보이지만 사실 매우 흥미로운 LLM 평가 토론이었다.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;벡터유사도나 RAGAS 지표는 채점에 적합한 방법은 아닌 것 같구요. 주관식 채점은 무조건 결국 llm 태우셔야 하고, 평가 루브릭을 먼저 작성해서 이거 기반으로 하는게 보통일 것 같습니다.&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;이 한 줄에 LLM-as-Judge 운영의 통념이 압축되어 있다. (1) &lt;a class="link" href="https://github.com/explodinggradients/ragas" target="_blank" rel="noopener"
 &gt;Vector similarity / RAGAS&lt;/a&gt;는 의미 일치를 점수화한다고 해도 채점 기준이 못 됨. (2) 주관식 채점 = LLM 호출 필수 — rule-based로 점수화 불가. (3) 평가 루브릭을 먼저 작성. LLM에게 &amp;ldquo;잘 했는지 봐줘&amp;quot;는 안 됨. &lt;strong&gt;명시적 기준표&lt;/strong&gt;가 있어야 일관성이 나온다.&lt;/p&gt;
&lt;p&gt;이 흐름은 최근 LLM eval 도구들 — &lt;a class="link" href="https://github.com/confident-ai/deepeval" target="_blank" rel="noopener"
 &gt;DeepEval&lt;/a&gt;, &lt;a class="link" href="https://github.com/evidentlyai/evidently" target="_blank" rel="noopener"
 &gt;Evidently&lt;/a&gt;, &lt;a class="link" href="https://github.com/openai/evals" target="_blank" rel="noopener"
 &gt;OpenAI Evals&lt;/a&gt; — 가 모두 가는 방향과 일치한다. &lt;strong&gt;rubric-driven judge&lt;/strong&gt;가 사실상 표준이 됐다.&lt;/p&gt;
&lt;h2 id="인사이트"&gt;인사이트
&lt;/h2&gt;&lt;p&gt;폰트 메트릭 추출기와 LLM 평가 루브릭이 같은 시기에 함께 회자된다는 점은, 이 영역이 &lt;strong&gt;&amp;ldquo;실제 제품을 만드는 사람들의 일상&amp;rdquo;&lt;/strong&gt; 임을 보여준다. 두 토픽이 표면상 무관해 보여도 본질은 같다 — 둘 다 &amp;ldquo;사람의 직관에 의존하는 영역을 명시적·검증 가능한 규칙으로 환원하는 작업&amp;quot;이다. 폰트 도구는 &amp;ldquo;메트릭이 호환되는가&amp;quot;를 HarfBuzz 렌더링 회귀로 객관화하고, LLM-as-Judge는 &amp;ldquo;답이 좋은가&amp;quot;를 루브릭으로 객관화한다. 둘 다 자동화 가능한 검증 단계를 만들어내야 production에 쓸 수 있고, 그 검증 단계가 곧 도구의 정체성이 된다. polaris_mcfg가 &lt;code&gt;validate&lt;/code&gt; 서브커맨드를 가진 것과 LLM eval 도구가 rubric을 1급 객체로 다루는 것은 완전히 같은 사고방식의 발현이다. 생산 환경에서 &amp;ldquo;그냥 잘 돌아가더라&amp;quot;는 통하지 않고, &lt;strong&gt;명시적 기준 + 자동 검증 + 회귀 추적&lt;/strong&gt;이 새 표준이라는 점에서 두 토픽은 같은 지점을 가리킨다.&lt;/p&gt;
&lt;h2 id="참고"&gt;참고
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tool repo and demo&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/PolarisOffice/polaris_mcfg" target="_blank" rel="noopener"
 &gt;PolarisOffice/polaris_mcfg&lt;/a&gt; — Metric-Compatible Font Generator (MIT, Python, ★4)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://polarisoffice.github.io/polaris_mcfg/" target="_blank" rel="noopener"
 &gt;데모 페이지&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Font ecosystem&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://harfbuzz.github.io/" target="_blank" rel="noopener"
 &gt;HarfBuzz&lt;/a&gt; — OpenType shaping 엔진&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://openfontlicense.org/" target="_blank" rel="noopener"
 &gt;SIL Open Font License&lt;/a&gt; — 폰트 산업 자유 라이센스 사실상 표준 (OFL 1.1, 2007)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.sil.org/" target="_blank" rel="noopener"
 &gt;SIL International&lt;/a&gt; — OFL 관리 단체&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://fonts.google.com/noto/specimen/Noto&amp;#43;Sans" target="_blank" rel="noopener"
 &gt;Noto Sans&lt;/a&gt; · &lt;a class="link" href="https://github.com/orioncactus/pretendard" target="_blank" rel="noopener"
 &gt;Pretendard&lt;/a&gt; — OFL 기반 자유 한글 폰트&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;LLM evaluation methodology&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/explodinggradients/ragas" target="_blank" rel="noopener"
 &gt;RAGAS&lt;/a&gt; — RAG eval 프레임워크&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/confident-ai/deepeval" target="_blank" rel="noopener"
 &gt;DeepEval&lt;/a&gt; — LLM-as-Judge + rubric 기반 eval&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/evidentlyai/evidently" target="_blank" rel="noopener"
 &gt;Evidently&lt;/a&gt; — ML/LLM 모니터링과 eval&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/openai/evals" target="_blank" rel="noopener"
 &gt;OpenAI Evals&lt;/a&gt; — OpenAI 공식 eval 프레임워크&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>