diff --git "a/blog/2026-04-05-openspace-ai-\341\204\213\341\205\246\341\204\213\341\205\265\341\204\214\341\205\245\341\206\253\341\204\220\341\205\263\341\204\200\341\205\241-\341\204\211\341\205\263\341\204\211\341\205\263\341\204\205\341\205\251-\341\204\222\341\205\241\341\206\250\341\204\211\341\205\263\341\206\270\341\204\222\341\205\241\341\204\200\341\205\251-\341\204\214\341\205\265\341\206\253\341\204\222\341\205\252\341\204\222\341\205\241\341\204\202\341\205\263\341\206\253-\341\204\214\341\205\241\341\204\213\341\205\262\341\206\257-\341\204\211\341\205\263\341\204\217\341\205\265\341\206\257-\341\204\214\341\205\265\341\206\253\341\204\222\341\205\252-\341\204\221\341\205\263\341\204\205\341\205\246\341\204\213\341\205\265\341\206\267\341\204\213.md" "b/blog/2026-04-05-openspace-ai-\341\204\213\341\205\246\341\204\213\341\205\265\341\204\214\341\205\245\341\206\253\341\204\220\341\205\263\341\204\200\341\205\241-\341\204\211\341\205\263\341\204\211\341\205\263\341\204\205\341\205\251-\341\204\222\341\205\241\341\206\250\341\204\211\341\205\263\341\206\270\341\204\222\341\205\241\341\204\200\341\205\251-\341\204\214\341\205\265\341\206\253\341\204\222\341\205\252\341\204\222\341\205\241\341\204\202\341\205\263\341\206\253-\341\204\214\341\205\241\341\204\213\341\205\262\341\206\257-\341\204\211\341\205\263\341\204\217\341\205\265\341\206\257-\341\204\214\341\205\265\341\206\253\341\204\222\341\205\252-\341\204\221\341\205\263\341\204\205\341\205\246\341\204\213\341\205\265\341\206\267\341\204\213.md" index 3bdb73a..9689231 100644 --- "a/blog/2026-04-05-openspace-ai-\341\204\213\341\205\246\341\204\213\341\205\265\341\204\214\341\205\245\341\206\253\341\204\220\341\205\263\341\204\200\341\205\241-\341\204\211\341\205\263\341\204\211\341\205\263\341\204\205\341\205\251-\341\204\222\341\205\241\341\206\250\341\204\211\341\205\263\341\206\270\341\204\222\341\205\241\341\204\200\341\205\251-\341\204\214\341\205\265\341\206\253\341\204\222\341\205\252\341\204\222\341\205\241\341\204\202\341\205\263\341\206\253-\341\204\214\341\205\241\341\204\213\341\205\262\341\206\257-\341\204\211\341\205\263\341\204\217\341\205\265\341\206\257-\341\204\214\341\205\265\341\206\253\341\204\222\341\205\252-\341\204\221\341\205\263\341\204\205\341\205\246\341\204\213\341\205\265\341\206\267\341\204\213.md" +++ "b/blog/2026-04-05-openspace-ai-\341\204\213\341\205\246\341\204\213\341\205\265\341\204\214\341\205\245\341\206\253\341\204\220\341\205\263\341\204\200\341\205\241-\341\204\211\341\205\263\341\204\211\341\205\263\341\204\205\341\205\251-\341\204\222\341\205\241\341\206\250\341\204\211\341\205\263\341\206\270\341\204\222\341\205\241\341\204\200\341\205\251-\341\204\214\341\205\265\341\206\253\341\204\222\341\205\252\341\204\222\341\205\241\341\204\202\341\205\263\341\206\253-\341\204\214\341\205\241\341\204\213\341\205\262\341\206\257-\341\204\211\341\205\263\341\204\217\341\205\265\341\206\257-\341\204\214\341\205\265\341\206\253\341\204\222\341\205\252-\341\204\221\341\205\263\341\204\205\341\205\246\341\204\213\341\205\265\341\206\267\341\204\213.md" @@ -41,13 +41,16 @@ source_url: "https://discuss.pytorch.kr/t/openspace-ai-feat-hkuds/9476" ## **벤치마크: GDPVal 결과** GDPVal 은 6 개 산업군(문서·컴플라이언스·미디어·엔지니어링·스프레드시트·전략 분석) 에서 50 개 전문 작업을 수행하는 벤치마크. + | **카테고리** | **Phase 1** | **Phase 2** | **개선** | +| --- | --- | --- | --- | | 컴플라이언스 & 양식 | 51% | 70% | +18.5p | | 엔지니어링 | 70% | 78% | +8.7p | | 스프레드시트 | 63% | 70% | +7.3p | | 미디어 제작 | 53% | 58% | +5.8p | | 문서 & 서신 | 71% | 74% | +3.3p | | 전략 분석 | 88% | 89% | +1.0p | + **컴플라이언스 영역의 +18.5 포인트 점프** 가 인상적. 정형화된 규칙을 따라야 하는 도메인일수록 스킬 진화의 가치가 크다는 신호로 읽을 수 있다. Phase 1 에서 진화된 스킬 165 개 중 다수가 도메인 지식이 아니라 도구 신뢰성·오류 복구였다는 점은, 에이전트의 실제 병목이 "환경에서 살아남는 것" 이라는 실증. ## **도입 경로 — MCP / 독립형 / CLI** diff --git "a/blog/2026-04-16-prompt-dump-llm\341\204\213\341\205\264-\341\204\206\341\205\246\341\204\220\341\205\241\341\204\213\341\205\265\341\206\253\341\204\214\341\205\265-\341\204\207\341\205\246\341\206\253\341\204\216\341\205\265\341\204\206\341\205\241\341\204\217\341\205\263-\341\204\221\341\205\247\341\206\274\341\204\200\341\205\241\341\204\205\341\205\263\341\206\257-\341\204\213\341\205\261\341\204\222\341\205\241\341\206\253-\341\204\211\341\205\256\341\204\206\341\205\241\341\206\253\341\204\203\341\205\242-\341\204\200\341\205\262\341\204\206\341\205\251\341\204\213\341\205\264-ai-npc-\341\204\214\341\205\241\341\204\213\341\205\262\341\206\257.md" "b/blog/2026-04-16-prompt-dump-llm\341\204\213\341\205\264-\341\204\206\341\205\246\341\204\220\341\205\241\341\204\213\341\205\265\341\206\253\341\204\214\341\205\265-\341\204\207\341\205\246\341\206\253\341\204\216\341\205\265\341\204\206\341\205\241\341\204\217\341\205\263-\341\204\221\341\205\247\341\206\274\341\204\200\341\205\241\341\204\205\341\205\263\341\206\257-\341\204\213\341\205\261\341\204\222\341\205\241\341\206\253-\341\204\211\341\205\256\341\204\206\341\205\241\341\206\253\341\204\203\341\205\242-\341\204\200\341\205\262\341\204\206\341\205\251\341\204\213\341\205\264-ai-npc-\341\204\214\341\205\241\341\204\213\341\205\262\341\206\257.md" index 1ba6d25..d58e539 100644 --- "a/blog/2026-04-16-prompt-dump-llm\341\204\213\341\205\264-\341\204\206\341\205\246\341\204\220\341\205\241\341\204\213\341\205\265\341\206\253\341\204\214\341\205\265-\341\204\207\341\205\246\341\206\253\341\204\216\341\205\265\341\204\206\341\205\241\341\204\217\341\205\263-\341\204\221\341\205\247\341\206\274\341\204\200\341\205\241\341\204\205\341\205\263\341\206\257-\341\204\213\341\205\261\341\204\222\341\205\241\341\206\253-\341\204\211\341\205\256\341\204\206\341\205\241\341\206\253\341\204\203\341\205\242-\341\204\200\341\205\262\341\204\206\341\205\251\341\204\213\341\205\264-ai-npc-\341\204\214\341\205\241\341\204\213\341\205\262\341\206\257.md" +++ "b/blog/2026-04-16-prompt-dump-llm\341\204\213\341\205\264-\341\204\206\341\205\246\341\204\220\341\205\241\341\204\213\341\205\265\341\206\253\341\204\214\341\205\265-\341\204\207\341\205\246\341\206\253\341\204\216\341\205\265\341\204\206\341\205\241\341\204\217\341\205\263-\341\204\221\341\205\247\341\206\274\341\204\200\341\205\241\341\204\205\341\205\263\341\206\257-\341\204\213\341\205\261\341\204\222\341\205\241\341\206\253-\341\204\211\341\205\256\341\204\206\341\205\241\341\206\253\341\204\203\341\205\242-\341\204\200\341\205\262\341\204\206\341\205\251\341\204\213\341\205\264-ai-npc-\341\204\214\341\205\241\341\204\213\341\205\262\341\206\257.md" @@ -36,22 +36,28 @@ NPC 는 10 가지 성격(혁명적·혼돈·초월적·창의적·과학자·순 1. 근거 없으면 매매 자동 취소 이건 RAG 의 "근거 검증" 메커니즘을 매매 의사결정 루프에 박아넣은 형태로 볼 수 있다. 학습은 3 계층 메모리로 분리된다. + | **계층** | **TTL** | **승급 조건** | **역할** | +| --- | --- | --- | --- | | 단기 | 1 시간 | 매 거래 자동 기록 | 즉각 피드백 | | 중기 | 7 일 | 중요도 ≥0.5 또는 동일 패턴 2 회 | 종목 단위 패턴 인식 | | 장기 | 영구 | 3 연승 또는 −10% 이상 손실 | 핵심 전략 / 블랙리스트 | + 거래 사이클은 10 분 주기로 돌고, 1 시간마다 진화 사이클(메모리 승급, 폐기, 파산 NPC 세대교체) 이 작동한다. 19 개의 백그라운드 스케줄러가 모두 다른 주기(45 초 ~ 12 시간) 로 협주한다. ## **6 가지 발견 — 특히 "메타인지의 한계"** 원문이 정리한 6 가지 발견 중 핵심: + | **#** | **발견** | **메커니즘** | +| --- | --- | --- | | 1 | 버블의 자연 형성 | 지식 전파 + 군집 행동 | | 2 | 비가역적 분기 | 초기 3 회 거래의 무작위성이 영구적 부의 격차로 | | **3** | **메타인지의 한계** | **환각은 차단하나 군집은 방치** | | 4 | 계층의 공고화 | 정보 비대칭 (프리미엄 데이터 접근권) | | 5 | 사기와 규제의 공진화 | 감시 강화 → 기만행위도 정교화 | | 6 | 비판의 수익화 | 타인 비판 수용 능력이 생존·수익 결정 | + 발견 #3 의 메커니즘이 가장 무겁다. 개별 NPC 단위에서는 메타인지 파이프라인이 환각을 거의 완벽히 차단한다 — 거짓 뉴스 기반 진입은 일어나지 않는다. 그러나 커뮤니티 전체가 특정 자산에 열광하기 시작하면, 그 군집 자체가 새로운 "신호" 로 해석되어 후행 NPC 들이 합리적 근거 없이 동참한다. **개별 노드의 합리성 극대화가 전체 시스템의 합리성을 보장하지 않는다**는 것을 대규모로 보여준 실험. 비교 사례 한 줄: 동일 성향(scientist) · 동일 자본의 NPC-0042 와 NPC-0043 이 첫 3 회 거래만 W-W-L vs L-L-L 로 다른 결과를 받자, 100 시간 후 한쪽은 Top 30 으로 누적 자본 23,400 GPU, 다른 쪽은 영구 제거. 초기 3 회의 미세 운이 영구 분기를 만든다. diff --git "a/blog/2026-04-30-\341\204\207\341\205\263\341\206\257\341\204\205\341\205\251\341\204\200\341\205\263-\341\204\221\341\205\263\341\204\205\341\205\251\341\204\220\341\205\251\341\204\220\341\205\241\341\204\213\341\205\265\341\206\270-\341\204\213\341\205\245\341\204\203\341\205\265\341\204\213\341\205\246-\341\204\207\341\205\242\341\204\221\341\205\251\341\204\222\341\205\241\341\204\214\341\205\265.md" "b/blog/2026-04-30-\341\204\207\341\205\263\341\206\257\341\204\205\341\205\251\341\204\200\341\205\263-\341\204\221\341\205\263\341\204\205\341\205\251\341\204\220\341\205\251\341\204\220\341\205\241\341\204\213\341\205\265\341\206\270-\341\204\213\341\205\245\341\204\203\341\205\265\341\204\213\341\205\246-\341\204\207\341\205\242\341\204\221\341\205\251\341\204\222\341\205\241\341\204\214\341\205\265.md" index f645f79..4dfde9d 100644 --- "a/blog/2026-04-30-\341\204\207\341\205\263\341\206\257\341\204\205\341\205\251\341\204\200\341\205\263-\341\204\221\341\205\263\341\204\205\341\205\251\341\204\220\341\205\251\341\204\220\341\205\241\341\204\213\341\205\265\341\206\270-\341\204\213\341\205\245\341\204\203\341\205\265\341\204\213\341\205\246-\341\204\207\341\205\242\341\204\221\341\205\251\341\204\222\341\205\241\341\204\214\341\205\265.md" +++ "b/blog/2026-04-30-\341\204\207\341\205\263\341\206\257\341\204\205\341\205\251\341\204\200\341\205\263-\341\204\221\341\205\263\341\204\205\341\205\251\341\204\220\341\205\251\341\204\220\341\205\241\341\204\213\341\205\265\341\206\270-\341\204\213\341\205\245\341\204\203\341\205\265\341\204\213\341\205\246-\341\204\207\341\205\242\341\204\221\341\205\251\341\204\222\341\205\241\341\204\214\341\205\265.md" @@ -20,11 +20,13 @@ source_url: "http://fly.io/" ## **급한 사람을 위한 한 줄 요약** | **상황** | **추천** | +| --- | --- | | 정적 블로그 / 포트폴리오 (Jekyll, Hugo 등) | **GitHub Pages** 또는 **Cloudflare Pages** | | Next.js / React 기반 프로토타입 | **Vercel** | | 폼 · 인증 등 부가기능이 필요한 정적 사이트 | **Netlify** | | 트래픽이 튈 가능성이 있는 사이트 | **Cloudflare Pages** (대역폭 무제한) | | 백엔드 + DB 까지 필요한 풀스택 프로토타입 | **Render**, **Railway**, [**Fly.io**](http://fly.io/) | + 이 표가 답이라면 여기서 닫고 가셔도 된다. 더 궁금하시다면 이제 하나씩 풀어본다. ## **GitHub Pages — 가장 간단한 출발점** @@ -70,6 +72,7 @@ DX 와 Next.js 통합이 Vercel 만큼 매끄럽다고는 못 하지만, OpenNex ## **한눈에 비교** | **항목** | **GitHub Pages** | **Vercel (Hobby)** | **Netlify (Free)** | **Cloudflare Pages (Free)** | +| --- | --- | --- | --- | --- | | **비용** | 무료 (공개 repo) | 무료 (비상업적 한정) | 무료 | 무료 | | **상업적 이용** | ❌ 약관상 금지 | ❌ 약관상 금지 | ✅ 가능 | ✅ 가능 | | **대역폭** | 100GB / 월 (소프트) | 100GB / 월 | 100GB / 월 | **무제한** | diff --git "a/blog/2026-05-11-enterpriserag-bench-\341\204\211\341\205\241\341\204\202\341\205\242-\341\204\214\341\205\265\341\204\211\341\205\265\341\206\250-rag-\341\204\207\341\205\246\341\206\253\341\204\216\341\205\265\341\204\206\341\205\241\341\204\217\341\205\263.md" "b/blog/2026-05-11-enterpriserag-bench-\341\204\211\341\205\241\341\204\202\341\205\242-\341\204\214\341\205\265\341\204\211\341\205\265\341\206\250-rag-\341\204\207\341\205\246\341\206\253\341\204\216\341\205\265\341\204\206\341\205\241\341\204\217\341\205\263.md" index 4254184..0e3e0b8 100644 --- "a/blog/2026-05-11-enterpriserag-bench-\341\204\211\341\205\241\341\204\202\341\205\242-\341\204\214\341\205\265\341\204\211\341\205\265\341\206\250-rag-\341\204\207\341\205\246\341\206\253\341\204\216\341\205\265\341\204\206\341\205\241\341\204\217\341\205\263.md" +++ "b/blog/2026-05-11-enterpriserag-bench-\341\204\211\341\205\241\341\204\202\341\205\242-\341\204\214\341\205\265\341\204\211\341\205\265\341\206\250-rag-\341\204\207\341\205\246\341\206\253\341\204\216\341\205\265\341\204\206\341\205\241\341\204\217\341\205\263.md" @@ -43,7 +43,9 @@ KARLBench(Databricks, 2025) 같은 시도가 있었지만, 공개된 코퍼스 ### 1) 데이터셋 구성 — 회사 한 곳을 통째로 시뮬레이션 저자들은 가상의 AI 인프라 회사 “Redwood Inference”를 설정하고, 9개 소스 타입에 걸쳐 문서를 생성한다. 분포가 흥미롭다. + | 소스 | 문서 수 | 설명 | +| --- | --- | --- | | Slack | 275,000 | 사내 채팅 | | Gmail | 120,000 | 이메일 스레드 | | Linear | 35,000 | PM 티켓 | @@ -53,11 +55,13 @@ KARLBench(Databricks, 2025) 같은 시도가 있었지만, 공개된 코퍼스 | GitHub | 8,000 | PR과 리뷰 코멘트 | | Jira | 6,000 | 지원 티켓 | | Confluence | 5,000 | 위키, 런북 | + Slack과 Gmail이 Confluence보다 50배 많다는 점이 핵심이다. 정돈된 위키 한 페이지당 비공식 채팅이 수십 건 존재하는 **현실의 비대칭성**을 그대로 옮겼다. ### 2) 질문 카테고리 — 실패 모드별로 설계 | # | 카테고리 | 개수 | 무엇을 시험하는가 | +| --- | --- | --- | --- | | 1 | Basic | 175 | 키워드 겹침 있는 단순 검색 | | 2 | Semantic | 125 | 키워드 안 겹치는 우회 표현 | | 3 | Intra-Doc Reasoning | 40 | 한 문서 내 떨어진 부분 통합 | @@ -68,6 +72,7 @@ Slack과 Gmail이 Confluence보다 50배 많다는 점이 핵심이다. 정돈 | 8 | Miscellaneous | 20 | 잘못된 위치의 비공식 문서 | | 9 | High Level | 10 | 코퍼스 전반 종합 | | 10 | **Info Not Found** | 20 | 답이 **없음**을 인식 | + 10번 카테고리(Info Not Found)가 특히 영리하다. 환각을 정면으로 잡는다. ### 3) 생성 파이프라인 — 일관성과 비용의 균형 @@ -78,7 +83,9 @@ Slack과 Gmail이 Confluence보다 50배 많다는 점이 핵심이다. 정돈 - **High-volume 생성** — 토픽 트리로 디렉토리를 잘게 쪼갠 뒤, leaf 토픽 안에서만 생성. 좁은 컨텍스트 + 토픽 분기로 비용 절감. 논문이 솔직하게 인정하는 부분: 토픽 scaffolding 없이 “회사 개요만 주고 100개 만들어”라고 시키면 **40% 이상이 거의 동일한 문서가 된다(model drift)**. LLM이 자기가 좋아하는 주제로 수렴하는 현상. 이후 **노이즈 단계**에서 4종의 인공 어수선함을 추가한다: + | 노이즈 | 메커니즘 | +| --- | --- | | Random shuffle | 같은 소스 타입 내에서 무작위 재배치 (5%) | | LLM-based shuffle | LLM이 그럴듯하게 잘못된 위치로 재배치 (3%) | | Near-duplicates | 사실 일부를 바꾼 거의 같은 문서 (충돌 정보 질문에 사용) | @@ -110,11 +117,14 @@ Slack과 Gmail이 Confluence보다 50배 많다는 점이 핵심이다. 정돈 - **Vector search** (`text-embedding-3-large`, 3072 차원, Qdrant) - **Bash Agent** (grep, find, head 등 셸 도구로 코퍼스를 탐색하는 에이전트, 질문당 최대 10분) 답변 생성은 모두 GPT-5.4 (Medium Reasoning). + | Metric | BM25 | Vector | Bash Agent | +| --- | --- | --- | --- | | Correctness (%) | **68.8** | 51.4 | 60.6 | | Completeness (%) | 56.0 | 42.9 | **61.1** | | Document Recall (%) | **68.4** | 46.0 | 55.8 | | Invalid Extra Docs | 9.0 | 9.3 | **2.0** | + **Vector search가 Semantic 카테고리에서조차 BM25에 진다** — 의미 기반 검색이 우위를 가져야 할 영역에서 정답률 32.8%, recall 24.8%로 BM25(44.8% / 43.2%)에 두 배 가까이 밀린다. 사내 약어, 코드네임, 티켓 형식이 공개 데이터로 학습된 임베딩 모델의 사각지대라는 가설을 강하게 뒷받침한다. ### 카테고리별 인사이트 diff --git a/scripts/notion-publish.py b/scripts/notion-publish.py index 326a34f..04b24a4 100644 --- a/scripts/notion-publish.py +++ b/scripts/notion-publish.py @@ -344,7 +344,32 @@ def _blocks_to_md(blocks: list, lines: list, links: list, images: list, depth: i links.append(url) lines.append(f"[{url}]({url})") + elif btype == "table": + rows = block.get("_children", []) + width = block["table"].get("table_width", 0) + md_rows = [] + for r in rows: + if r.get("type") != "table_row": + continue + cells = r["table_row"]["cells"] + # 셀 안의 파이프는 이스케이프해 열이 깨지지 않게 한다 + texts = [ + (_rich_text_to_md(c, links) if c else "").replace("|", "\\|").strip() + for c in cells + ] + if not width: + width = len(texts) + md_rows.append("| " + " | ".join(texts) + " |") + if md_rows: + # 첫 행(헤더) 다음에 구분선 행을 삽입해야 마크다운이 표로 인식한다 + separator = "| " + " | ".join(["---"] * width) + " |" + md_rows.insert(1, separator) + lines.append("\n" + "\n".join(md_rows) + "\n") + # 자식(table_row)은 위에서 직접 처리했으므로 일반 재귀를 건너뛴다 + continue + elif btype == "table_row": + # 정상 흐름에서는 table 핸들러가 처리. 단독으로 들어오면 그대로 출력. cells = block["table_row"]["cells"] row = " | ".join(_rich_text_to_md(c, links) if c else "" for c in cells) lines.append(f"| {row} |")