Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 회의 미세 운이 영구 분기를 만든다.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 — 가장 간단한 출발점**
Expand Down Expand Up @@ -70,6 +72,7 @@ DX 와 Next.js 통합이 Vercel 만큼 매끄럽다고는 못 하지만, OpenNex
## **한눈에 비교**

| **항목** | **GitHub Pages** | **Vercel (Hobby)** | **Netlify (Free)** | **Cloudflare Pages (Free)** |
| --- | --- | --- | --- | --- |
| **비용** | 무료 (공개 repo) | 무료 (비상업적 한정) | 무료 | 무료 |
| **상업적 이용** | ❌ 약관상 금지 | ❌ 약관상 금지 | ✅ 가능 | ✅ 가능 |
| **대역폭** | 100GB / 월 (소프트) | 100GB / 월 | 100GB / 월 | **무제한** |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@ KARLBench(Databricks, 2025) 같은 시도가 있었지만, 공개된 코퍼스
### 1) 데이터셋 구성 — 회사 한 곳을 통째로 시뮬레이션

저자들은 가상의 AI 인프라 회사 “Redwood Inference”를 설정하고, 9개 소스 타입에 걸쳐 문서를 생성한다. 분포가 흥미롭다.

| 소스 | 문서 수 | 설명 |
| --- | --- | --- |
| Slack | 275,000 | 사내 채팅 |
| Gmail | 120,000 | 이메일 스레드 |
| Linear | 35,000 | PM 티켓 |
Expand All @@ -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 | 한 문서 내 떨어진 부분 통합 |
Expand All @@ -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) 생성 파이프라인 — 일관성과 비용의 균형
Expand All @@ -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 | 사실 일부를 바꾼 거의 같은 문서 (충돌 정보 질문에 사용) |
Expand Down Expand Up @@ -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%)에 두 배 가까이 밀린다. 사내 약어, 코드네임, 티켓 형식이 공개 데이터로 학습된 임베딩 모델의 사각지대라는 가설을 강하게 뒷받침한다.

### 카테고리별 인사이트
Expand Down
25 changes: 25 additions & 0 deletions scripts/notion-publish.py
Original file line number Diff line number Diff line change
Expand Up @@ -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} |")
Expand Down