- **OKF(Open Knowledge Format)**๋ LLM-wiki ํจํด์ ์ด์ ๊ฐ๋ฅํ(portable) ํ์์ผ๋ก ํ์คํํ ๊ฐ๋ฐฉํ ๋ช ์ธ(open specification)
- ๋ฉํ๋ฐ์ดํฐยท์ปจํ ์คํธยท์ ์ ๋ ์ง์์ ํํํ๋ ๋ฒค๋ ์ค๋ฆฝ(vendor-neutral)ยท์์ด์ ํธ/์ฌ๋ ์นํ์ ํ์ค
- YAML frontmatter๋ฅผ ๊ฐ์ง markdown ํ์ผ๋ค์ ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ
- ๋๊ฐ ์ฐ๋์ง(producer)์ ๋๊ฐ ์ฝ๋์ง(consumer)๋ฅผ ๋ถ๋ฆฌํ ๊ตํ ํฌ๋งท(lingua franca)
์ฝ๊ฒ ์ดํดํ๊ธฐ
๋์๋ฆฌ ์ด์ ์ ๋ณด๋ฅผ ๋ ์ฌ๋ ค ๋ณด์. ์ ๋ฐฐ๋ค์ด ๊ฐ์ ์นดํกยท๊ตฌ๊ธ๋ฅ์คยท๋จธ๋ฆฟ์์ ์ ๋ณด๋ฅผ ํฉ์ด ๋์ผ๋ฉด, ์๋ก ๋ค์ด์จ ํ๋ฐฐ(๋๋ ์ AI ๋น์)๋ ๋งค๋ฒ โ๊ทธ๊ฑด ๋๊ตฌํํ ๋ฌผ์ด๋ด์ผ ํด?โ๋ฅผ ๋ฐ๋ณตํ๊ฒ ๋๋ค.
OKF๋ โ๋ชจ๋ ์ ๋ณด๋ฅผ ๋๊ฐ์ ์์์ ๋ฉ๋ชจ ์นด๋(๋งจ ์์ ์ ๋ชฉยทํ๊ทธ ๋ผ๋ฒจ + ๋ณธ๋ฌธ์ ๋งํฌ๋ค์ด)๋ก, ํ ํด๋์ ๋ชจ์๋์โ๋ ์ฝ์์ด๋ค. ์นด๋ ์์์ด ํต์ผ๋ผ ์์ผ๋ โ ๋๊ฐ ์ผ๋ ์๊ด์์ด โ ์ฌ๋๋ ์ฝ๊ณ AI ๋น์๋ ๋ฒ์ญ ์์ด ๊ทธ๋๋ก ์ฝ๋๋ค. ์๋ฆฌ๋ก ์น๋ฉด ์ธ์์ ๋ชจ๋ ๋ ์ํผ๋ฅผ ๋๊ฐ์ ์นด๋ ์์(์ ๋ชฉ / ์ฌ๋ฃ / ์์)์ผ๋ก ์จ๋ ๋ ์ํผ ๋ฐ์ค ์ ๊ฐ๋ค. ์ฌ๋๋ ๋ณด๊ณ , ์๋ฆฌ ๋ก๋ด๋ ๋ณธ๋ค.
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- ์กฐ์ง์ ์ง์์ด ๋ฉํ๋ฐ์ดํฐ ์นดํ๋ก๊ทธยท์ํคยท์ฝ๋ ์ฃผ์ยทโ๋ช๋ช ์๋์ด ์์ง๋์ด์ ๋จธ๋ฆฟ์โ์ ํฉ์ด์ ธ ์๋ ํํธํ(fragmentation)
- ๋ชจ๋ ์์ด์ ํธ ๋น๋๊ฐ ๋์ผํ context-assembly ๋ฌธ์ ๋ฅผ ๋งค๋ฒ ์ฒ์๋ถํฐ ํธ๋ ์ค๋ณต ๋น์ฉ
- ์ง์์ด ๊ทธ๊ฒ์ ๋ง๋ surface(๋๊ตฌ/ํ๋ซํผ)์ ๋ฌถ์ด๋ ๋ฒค๋ lock-in
AS-IS โ ํํธํ๋ ์ง์, ์์ด์ ํธ๋ง๋ค ์ฌ์กฐ๋ฆฝ
flowchart LR MC[Metadata Catalog] --> A1[Agent A] WK[Wiki / Drive] --> A1 CC[Code comments] --> A1 SE[Senior eng's head] --> A1 MC --> A2[Agent B] WK --> A2 CC --> A2 SE --> A2 A1 -. ๊ฐ์ context ์กฐ๋ฆฝ ์ฌ๊ตฌํ .-> X((์ค๋ณต)) A2 -. ๊ฐ์ context ์กฐ๋ฆฝ ์ฌ๊ตฌํ .-> X
TO-BE โ ๊ณต์ OKF ๋ฒ๋ค์ ๋๊ตฌ๋ ์๋น
flowchart LR P[Producer<br/>์ฌ๋ or ์์ด์ ํธ] -->|writes| OKF[(OKF bundle<br/>markdown + YAML)] OKF --> A1[Agent A] OKF --> A2[Agent B] OKF --> H[Human reader]
OKF ์ค๊ณ ์์น 3๊ฐ์ง
1. Minimally Opinionated (์ต์ํ์ ๊ท์ฝ)
๋ชจ๋ concept์ ๋จ ํ๋, type ํ๋๋ง ์๊ตฌํ๋ค. ๋๋จธ์ง๋ ์ ๋ถ producer์ ์์ ์ ๋งก๊ธด๋ค.
2. Producer/Consumer Independence (์์ฐ์ยท์๋น์ ๋ถ๋ฆฌ)
์ง์์ ์ฐ๋ ์ฃผ์ฒด์ ์ฝ๋ ์ฃผ์ฒด๋ฅผ ๊น๋ํ๊ฒ ๋ถ๋ฆฌํ๋ค. ์ฌ๋์ด ์์ผ๋ก ์์ฑํ bundle์ AI ์์ด์ ํธ๊ฐ ๊ทธ๋๋ก ์๋นํ ์ ์๋ค.
3. Format, not Platform (ํ๋ซํผ์ด ์๋ ํฌ๋งท)
ํน์ ํด๋ผ์ฐ๋ยทDBยท๋ชจ๋ธ ์ ๊ณต์ยท์์ด์ ํธ ํ๋ ์์ํฌ์ ๋ฌถ์ด์ง ์๋๋ค. ์ฝ๊ณ ยท์ฐ๊ณ ยท์๋นํ๋ ๋ฐ ๋ ์ ๊ณ์ ์ด๋ SDK๊ฐ ์ ๋ ํ์ํ์ง ์๋ค.
OKF์ 3๊ฐ์ง ํต์ฌ ์์ฑ
- Just markdown โ ์ด๋ค ์๋ํฐ์์๋ ์ฝํ๊ณ , GitHub์์ ๋ ๋๋ง๋๋ฉฐ, ์ด๋ค ๊ฒ์ ๋๊ตฌ๋ก๋ ์ธ๋ฑ์ฑ๋จ
- Just files โ tarball๋ก ๋ฐฐํฌ, ๋ชจ๋ git repo์ ํธ์คํ , ๋ชจ๋ ํ์ผ์์คํ ์ ๋ง์ดํธ ๊ฐ๋ฅ (๋ฒ๋ค ํจํค์งยท๊ตฌ์กฐยท๋ณํฉ ๊ท์น์ OKF Bundle (๋ฒ๋ค๋ง))
- Just YAML frontmatter โ
type,title,description,resource,tags,timestamp๊ฐ์ ์ง์ ๊ฐ๋ฅํ ๊ตฌ์กฐํ ํ๋
OKF ๋๋ ํฐ๋ฆฌ & ๋ฌธ์ ํฌ๋งท ์์
sales/
โโโ index.md
โโโ datasets/
โ โโโ index.md
โ โโโ orders_db.md
โโโ tables/
โ โโโ index.md
โ โโโ orders.md
โ โโโ customers.md
โโโ metrics/
โโโ index.md
โโโ weekly_active_users.md
---
type: BigQuery Table
title: Orders
description: One row per completed customer order.
resource: https://console.cloud.google.com/bigquery?p=acme&d=sales&t=orders
tags: [sales, revenue]
timestamp: 2026-05-28T14:30:00Z
---
# Schema
| Column | Type | Description |
|--------|------|-------------|
| `order_id` | STRING | Globally unique order identifier. |
| `customer_id` | STRING | FK to [customers](/tables/customers.md). |
# Joins
Joined with [customers](/tables/customers.md) on `customer_id`.์ ์์์ฒ๋ผ metricยทtableยทjoin์ ๋ฌธ์๋ก ์ ์ํ๋ ๋ฐฉ์์ ์๋งจํฑ ๋ ์ด์ด์ ๋ฌธ์ ์์ญ์ด ๊ฒน์น๋ค. ๋ค๋ง OKF๋ ์คํ ๊ฐ๋ฅํ ์ฟผ๋ฆฌ ์์ง์ด ์๋๋ผ ์ง์์ ํํยท๊ตํํ๋ ํฌ๋งท์ด๋ผ๋ ์ ์ด ๋ค๋ฅด๋ค โ โ์ด metric์ด ๋ฌด์์ ์๋ฏธํ๋์งโ๋ฅผ ์ ๋ฌํ์ง, ์ง์ ์ซ์๋ฅผ ๊ณ์ฐํด ์ฃผ์ง๋ ์๋๋ค.
ํ์ผ ์์คํ ์ ๋์ด์๋ โ์ง์ ๊ทธ๋ํโ
concept๋ค์ด ์ผ๋ฐ markdown ๋งํฌ๋ก ์๋ก๋ฅผ ์ฐธ์กฐํ๋ฉด์, ๋๋ ํฐ๋ฆฌ๋ ๋จ์ํ ๋ถ๋ชจ/์์ ๊ด๊ณ๋ฅผ ๋์ด ๊ด๊ณ์ ๊ทธ๋ํ๊ฐ ๋๋ค โ OKF๋ ๋ฌด๊ฑฐ์ด RDFยทtriple store ์์ด markdown ๋งํฌ๋ง์ผ๋ก ๊ฐ๋ฒผ์ด ์ง์ ๊ทธ๋ํ๋ฅผ ๊ตฌํํ๋ ์ ์ด๋ค.
RAG์์ ๊ด๊ณ โ โ์ ์ฐพ๊ธฐโ ์์ โ์ ์จ๋๊ธฐโ
RAG๋ก ์๋งจํฑ ๊ฒ์์ด ์ด๋ฏธ ๊ฐ๋ฅํ๋ฐ ์ OKF๊ฐ ํ์ํ๋๋ ๋ฌผ์์ด ์์ฃผ ๋์จ๋ค. ๋ต์ ๋์ด ๊ฒฝ์ ๊ธฐ์ ์ด ์๋๋ผ ์๋ก ๋ค๋ฅธ ๋ ์ด์ด๋ผ๋ ๋ฐ ์๋ค.
- RAG = read path(์ ์ฐพ๋ ๋ฒ) โ ์ง์ ์์ ์ ๋ฐฉ๋ํ ์ง์์์ ๊ด๋ จ ์กฐ๊ฐ์ ๊บผ๋ด ์ค๋ ๊ฒ์ ๋ฉ์ปค๋์ฆ
- OKF = write path(์ ์จ๋๋ ๋ฒ/ํฌ๋งท) โ ๊ทธ ์ง์์ ์ ์ด์ ์ด๋ค ์์์ผ๋ก ํ๋ ์ด์ ยทํํยท๊ณต์ ํ ์ง ์ ํ ๊ตํ ํฌ๋งท
์ฆ โRAG๋ ์ ์ฐพ๋ ๋ฐฉ๋ฒ, OKF๋ ์ ์จ๋๊ณ ๊ณต์ ํ๋ ์์โ์ด๋ผ๋ ์ดํด๊ฐ ์ ํํ๋ค. ๋ค๋ง OKF์ โ์จ๋๊ธฐโ๋ ๋จ์ ์ ์ฅ(storage)์ด ์๋๋ผ ๊ตฌ์กฐยท์ถ์ฒยท๊ด๊ณ๊น์ง ๋ด์ ์ฌ๋๊ณผ ์์ด์ ํธ๊ฐ ํจ๊ป ์ฝ๊ฒ ๋ง๋๋ ํํ์ ๊ฐ๊น๋ค. ๊ทธ๋ฆฌ๊ณ OKF ๋ฒ๋ค์ด ์ปค์ง๋ฉด ๊ทธ ์์ ๊ทธ๋๋ก RAG๋ฅผ ์น์ด ๊ฒ์ํ๋ค โ ๋์ฒด๊ฐ ์๋๋ผ ์๋ณด ๊ด๊ณ๋ค.
flowchart TB RAW[(ํฉ์ด์ง ์์ฒ<br/>DB ยท ๋ฌธ์ ยท ์ํค ยท ๋จธ๋ฆฟ์)] -->|ํ๋ ์ด์ ยทํ์คํ| OKF subgraph W["write path โ OKF๊ฐ ๋ด๋น (์ ์จ๋๊ธฐ)"] OKF[(OKF ๋ฒ๋ค<br/>markdown + YAML<br/>๊ตฌ์กฐยท์ถ์ฒยท๊ด๊ณ ๋ณด์กด)] end subgraph R["read path โ RAG๊ฐ ๋ด๋น (์ ์ฐพ๊ธฐ)"] RET[์๋ฒ ๋ฉ ยท ๋ฒกํฐ๊ฒ์ ยท ๋ฆฌ๋ญํน] end OKF -->|์ด ์์์ ๊ฒ์| RET RET --> AG[์์ด์ ํธ / LLM] OKF -->|๋ฒ๋ค์ด ์์ผ๋ฉด ํต์งธ๋ก| AG
๋น์ ํ๋ฉด RAG๋ ๊ด๋ จ ์ฑ ์ฅ์ ์ฐพ์์ฃผ๋ ์ฌ์, OKF๋ ์ฑ ์ ์ด๋ค ์์์ผ๋ก ์ฐ๊ณ ๋ถ๋ฅํด ๊ฝ์์ง ์ ํ ์ถํ ๊ท๊ฒฉ์ด๋ค. ์ฌ์๊ฐ ์ ๋ฅํด๋ ์ฑ ์ด ๋์ยท์ค๋ณตยท์ถ์ฒ๋ถ๋ช ์ด๋ฉด ์์ฉ์๊ณ , ์ข์ ์ฌ์๋ ์ ์ ๋ฆฌ๋ ์๊ฐ ์์์ ๋ ์ ์๋ํ๋ค.
OKF๊ฐ ๋ฉ์ฐ๋ RAG์ ๋นํ 5๊ฐ์ง (sales ๋ฒ๋ค ์์)
์๋ ์์๋ ๋ชจ๋ ์ sales/ ๋ฒ๋ค(orders, customers, weekly_active_users)์ ๊ธฐ์ค์ผ๋ก ํ๋ค.
โ Chunking์ด ๊ตฌ์กฐยท๊ด๊ณ๋ฅผ ํ๊ดดํ๋ค
RAG๋ orders.md๋ฅผ ํ ํฐ ๋จ์๋ก ์๋ผ ์๋ฒ ๋ฉํ๋ค. โ์คํค๋ง ํโ๋ ์ฒญํฌ A, โcustomers์ customer_id๋ก joinโ ๋ฌธ์ฅ์ ์ฒญํฌ B๋ก ํฉ์ด์ง๋ค. โ์ฃผ๋ฌธ์ ๊ณ ๊ฐ ์ด๋ฆ๊ณผ ํจ๊ป ๋ณด๋ ค๋ฉด?โ์ ๋ฌผ์ผ๋ฉด ์ฒญํฌ A๋ง ๊ฑธ๋ ค์ค๊ณ join ๋ฌธ์ฅ์ ๋์ณ ๋ฐ์ชฝ ๋ต์ด ๋์จ๋ค. OKF๋ ํ ๋ฌธ์ ์์ ์คํค๋ง ํ + # Joins + [customers](/tables/customers.md) ๋งํฌ๋ฅผ ํต์งธ๋ก ๋ณด์กดํด join path๋ฅผ ์์ง ์๋๋ค.
โก ์ ๋ฐํ ๊ตฌ์กฐ ์ง์๋ฅผ ๋ชป ํ๋ค
โrevenue ๊ด๋ จ ํ
์ด๋ธ ์ ๋ถ ๋์ดํด์ค.โ RAG๋ โrevenueโ์ ์๋ฏธ๊ฐ ๊ฐ๊น์ด ์ฒญํฌ๋ฅผ ์ ์ฌ๋ ์์ผ๋ก ๊ฐ์ ธ์ค๋ค weekly_active_users(๋งค์ถ ์๋)๋ฅผ ๋ธ๋ ค์ค๊ณ , ํ๊ทธ๋ง revenue์ด๊ณ ๋ณธ๋ฌธ์ ๊ทธ ๋จ์ด๊ฐ ์๋ ํ
์ด๋ธ์ ๋์น๋ค โ โ์ ๋ถโ๋ฅผ ๋ณด์ฅ ๋ชป ํ๋ค. OKF๋ tags: [sales, revenue] frontmatter๋ฅผ ์กฐ๊ฑด์ผ๋ก ํํฐํด ์ ํํ ๊ทธ ์งํฉ์ ์ค๋ค.
โข ์ฝํผ์ค ํ์ง์ ๋ฌด๊ด์ฌํ๋ค (garbage-in)
โWAU ์ด๋ป๊ฒ ๊ณ์ฐํด?โ ์ฝํผ์ค์ 2๋
์ ํ๊ธฐ๋ ์ด์๊ณผ ์ต์ ์ ์๊ฐ ํจ๊ป ์์ผ๋ฉด, RAG๋ ์ ์ฌ๋๋ง ๋์ผ๋ฉด ํ๊ธฐ๋ ์ด์์ ๊ฐ์ ธ์ ์์ ์๊ฒ ํ๋ฆฐ ๋ต์ ํ๋ค โ ์ด๋ ๊ฒ ๊ถ์ ์๋์ง ๋ชจ๋ฅธ๋ค. OKF๋ weekly_active_users.md์ ๊ณต์ ๋ฌธ์ citation๊ณผ timestamp๋ฅผ ๋ถ์ด๊ณ , stale ์ด์์ ์ ์ด์ ๋ฒ๋ค์์ ํ๋ ์ด์
์ผ๋ก ๋ฐฐ์ ํ๋ค.
โฃ ์ ์ยท์ด์์ฑ์ ์์ ๋ค๋ฃจ์ง ์๋๋ค (lock-in)
ํ A๊ฐ ๋ฒกํฐ์คํ ์ด์ ์๋ฒ ๋ฉํด ๋ ์ง์์ ํ B์ ๋ค๋ฅธ ์คํ์์ ๊ทธ๋๋ก ๋ชป ์ด๋ค. ์ฒญํน ์ ๋ตยท์๋ฒ ๋ฉ ๋ชจ๋ธยท๋ฒกํฐ์คํ ์ด๊ฐ ๋ฌ๋ผ ์ฌ์์ธยท์ฌํตํฉ์ด ํ์ํ๋ค โ ์ง์์ด ํ์ดํ๋ผ์ธ์ ๊ฐํ๋ค. OKF๋ sales/ ํด๋๋ฅผ tarball์ด๋ git repo๋ก ๋์ง๋ฉด ํ B๊ฐ cloneํด ์๊ธฐ ์์ด์ ํธ์ ๊ทธ๋๋ก ๋จน์ธ๋ค. ์ฌํตํฉ ๋น์ฉ 0.
โค ์ฌ๋์ด ๋ชป ์ฝ๋๋ค
๋ฒกํฐDB๋ฅผ ์ด๋ฉด [0.023, -0.19, ...] ๋ถ๋์์ ๋ฐฐ์ด๋ฟ์ด๋ผ ์ฌ๋์ด ๊ฒ์ํ๋ ค๋ฉด ๋ณ๋ ์ํค๋ฅผ ๋ ์ ์งํด์ผ ํ๋ค(์ด์ค ๋น์ฉ). OKF์ orders.md๋ GitHub์์ ์ด๋ฉด ์ฌ๋์ด ์ฝ๋ ๋ฌธ์ ๊ทธ๋๋ก์ด๊ณ , ์์ด์ ํธ๊ฐ ๋จน๋ ๊ฒ๊ณผ ๋์ผํ ํ ๋ฒ์ด๋ค.
์์ฝ: RAG๋ *โ์ด๋ป๊ฒ ๊ด๋ จ ํ ์คํธ๋ฅผ ์ปจํ ์คํธ ์ฐฝ์ ๋ฃ์ง?โ*๋ฅผ, OKF๋ *โ๊ทธ ํ ์คํธ๊ฐ ๋ญ์ฌ์ผ ํ๊ณ ๋๊ฐ ํ๋ ์ด์ ํ๋ฉฐ ์ด๋ป๊ฒ ๊ณต์ ๋์ง?โ*๋ฅผ ํผ๋ค. ๊ฒ์์ ์ด๋ฏธ ์ ํ๋ ธ๊ณ , ํ๋ ์ด์ ๋ ์ง์์ด ์ ๋ณ๋ชฉ์ด๋ผ OKF๊ฐ ๊ฐ๊ด๋ฐ๋๋ค.
์ค์ ๋ก RAG์ ์ด๋ป๊ฒ ์ ์ฅ๋๋ โ ingestion ์ด๋ํฐ๊ฐ ํ์
๋ฒกํฐ์คํ ์ด(PineconeยทWeaviateยทQdrantยทpgvector ๋ฑ)๋ ์ฒญํฌ๋ง๋ค (id, ๋ฒกํฐ, ๋ฉํ๋ฐ์ดํฐ key-value)๋ฅผ ์ ์ฅํ๊ณ , ์ด ๋ฉํ๋ฐ์ดํฐ key-value๋ก ๋น ๋ฅธ ํํฐ๋ง์ ํ๋ค. OKF์ frontmatter๋ ๋ฐ๋ก ์ด ๋ฉํ๋ฐ์ดํฐ ํ๋๋ก ์น๊ฒฉ๋ผ ๋ค์ด๊ฐ๋ค โ ์ฒญํฌ๋ง๋ค ์์ผ๋ก ํ๊ทธ๋ฅผ ๋ฌ ํ์ ์์ด, ์ด๋ฏธ ์ ๋ฆฌ๋ key-value๋ฅผ ๊ทธ๋๋ก ์น๋ ๊ฒ์ด๋ค.
๋จ, concept ๋จ์ ์ฒญํน๊ณผ ์ด ์น๊ฒฉ์ ์ ์ ๋ก ๋์ง ์๋๋ค. OKF ๊ตฌ์กฐ๋ฅผ ์ธ์ํ๋ ingestion ์ด๋ํฐ๋ฅผ ๋ฐ๋์ ๊ฑฐ์ณ์ผ ํ๋ค. ์ฌ๋ฃ๊ฐ ์ข์๋ โํ์ฐ๋ ๊ฑด ํ์ดํ๋ผ์ธ ๋ชซโ์ด๋ค.
flowchart TB OKF[(OKF ๋ฒ๋ค<br/>markdown + frontmatter + ๋งํฌ)] OKF ==>|"ํ์: OKF-aware ์ด๋ํฐ"| PIPE OKF -.->|"์ด๋ํฐ ์์ด ๊ทธ๋ฅ ํ์ฐ๋ฉด"| NAIVE subgraph PIPE["ingestion ์ด๋ํฐ๊ฐ ํ๋ ์ผ"] direction LR A1[concept ๋จ์ ์ฒญํน] --- A2["frontmatter โ<br/>๋ฉํ๋ฐ์ดํฐ ์น๊ฒฉ"] --- A3["๋งํฌ โ<br/>๊ทธ๋ํ ์ธ๋ฑ์ค"] end NAIVE["512ํ ํฐ ๋ง์๋ฅด๊ธฐ<br/>frontmatterยท๋งํฌ ์ ์ค"] PIPE ==> GOOD[("๋ฒกํฐ์คํ ์ด<br/>์๊ฒฐ ์ฒญํฌ + key-value ํํฐ + ๊ทธ๋ํ")] NAIVE -.-> POOR[("๋ฒกํฐ์คํ ์ด<br/>ํ ์คํธ ์กฐ๊ฐ๋ง โ ๋ฐ์ชฝ ๊ฒ์")]
OKF ์์ด โ raw ์ํค ๋ฌธ์๋ฅผ 512ํ ํฐ ๋ง์๋ฅด๊ธฐ
์๋ณธ์์ ์คํค๋ง์ join ์ค๋ช ์ด ํ ๋ฌธ๋จ์ฉ ๋จ์ด์ ธ ์์ผ๋ฉด, ๊ฒฝ๊ณ๊ฐ ๊ทธ ์ฌ์ด๋ฅผ ๊ฐ๋ผ๋ฒ๋ฆฐ๋ค.
// chunk c1
{ "id": "c1", "vector": [0.02, -0.19, ...],
"text": "Orders ํ
์ด๋ธ. ์๋ฃ ์ฃผ๋ฌธ 1๊ฑด๋น 1ํ. order_id(string, ์ ์ญ ๊ณ ์ ), customer_id(string) ...",
"metadata": { "source": "wiki/page-317" } } // ํ๊ทธยทํ์
์์
// chunk c2 โ join ์ค๋ช
์ด ์ฌ๊ธฐ๋ก ์๋ ค๋๊ฐ
{ "id": "c2", "vector": [0.05, 0.11, ...],
"text": "... customers ํ
์ด๋ธ๊ณผ customer_id๋ก joinํด ๊ณ ๊ฐ ์ด๋ฆยท์ง์ญ์ ์ป๋๋ค.",
"metadata": { "source": "wiki/page-317" } }- โ์ฃผ๋ฌธ์ ๊ณ ๊ฐ ์ด๋ฆ๊ณผ ํจ๊ป ๋ณด๋ ค๋ฉด?โ โ c1(์คํค๋ง)๋ง ๊ฑธ๋ฆฌ๊ณ join์ด ๋ด๊ธด c2๋ฅผ ๋์ณ ๋ฐ์ชฝ ๋ต
- โrevenue ํ ์ด๋ธ ์ ๋ถโ โ metadata์ ํ๊ทธ๊ฐ ์์ด ํํฐ ๋ถ๊ฐ, ์ ์ฌ๋ ์ถ์ธก๋ฟ
- ์ถ์ฒ
wiki/page-317์ด ์ต์ ์ธ์ง ํ๊ธฐ๋ณธ์ธ์ง ์ ์ ์์
OKF ์ ์ฉ โ concept ๋จ์ ์ฒญํน + frontmatter ์น๊ฒฉ
orders.md ํ ์ฅ์ด ์๊ฒฐ๋ ํ ๋ ์ฝ๋๋ก ๋ค์ด๊ฐ๋ค.
{ "id": "orders", "vector": [0.02, -0.19, ...],
"text": "# Schema\n| order_id | STRING | ์ ์ญ ๊ณ ์ |\n| customer_id | STRING | FKโcustomers |\n# Joins\ncustomers์ customer_id๋ก join.",
"metadata": {
"type": "BigQuery Table",
"title": "Orders",
"tags": ["sales", "revenue"],
"resource": "https://console.cloud.google.com/.../orders",
"timestamp": "2026-05-28T14:30:00Z",
"links": ["customers"]
} }- โ์ฃผ๋ฌธ์ ๊ณ ๊ฐ ์ด๋ฆ๊ณผ ํจ๊ป?โ โ ์คํค๋ง ์ join์ด ํ ์ฒญํฌ์ โ ์๊ฒฐ ๋ต (โ ์ฒญํน)
- โrevenue ํ
์ด๋ธ ์ ๋ถโ โ
WHERE 'revenue' IN tags์ ํ ํํฐ (โก ๋ฉํ๋ฐ์ดํฐ key-value) links:[customers]๋กcustomers๋ ์ฝ๋๊น์ง ํ์ฅ (โข ๊ทธ๋ํ)resourceยทtimestamp๋ก ์ถ์ฒยท์ ์ ๋ ํ์ธ (provenance)
๊ฐ์ ์ง์์ด๋ผ๋ โ OKF ์์ด๋ โํ ์คํธ ์กฐ๊ฐ + ๋น ๋ฉํ๋ฐ์ดํฐโ๋ก, OKF ์์ผ๋ฉด โ์๊ฒฐ ์ฒญํฌ + ์ง์ ๊ฐ๋ฅํ key-valueโ๋ก ์ ์ฅ๋๋ค. RAG ์์ง์ ๋์ผํ๊ณ , ๋จน์ธ ์ฌ๋ฃ์ ๋ชจ์๋ง ๋ค๋ฅด๋ค.
๊ทธ๋ผ ์ง์๋ ์ด๋ป๊ฒ ๋ฌ๋ผ์ง๋ โ โtags๋ก ๊ฑธ๋ฌ๋ผโ๋ ๋๊ฐ ์ ํ๋
์ ์ฅ์ด ๋ฌ๋ผ์ก์ผ๋ **๊บผ๋ด๋ ๋ฐฉ์(์ง์)**๋ ๋ฌ๋ผ์ง๋ค.
OKF๊ฐ ์์ ๋๋ ์์ ์๋ฏธ๊ฒ์๋ฟ์ด๋ค.
query = "์ด๋ฒ ๋ถ๊ธฐ ๋งค์ถ ๊ด๋ จ ํ
์ด๋ธ"
โ embed(query) โ ๋ฒกํฐ ์ ์ฌ๋ top-k โ ์ฒญํฌ
โ๋งค์ถ ๊ด๋ จโ๋ โ์ด๋ฒ ๋ถ๊ธฐโ๋ ์ ๋ถ ์๋ฒ ๋ฉ ์ ์ฌ๋๋ก ์ถ์ธกํ๋ค. ๊ตฌ์กฐํ ํํฐ๊ฐ ์์ด ์ต์ /ํ๊ทธ๋ฅผ ๊ฑฐ๋ฅผ ์ ์๋ค.
OKF๊ฐ ์์ผ๋ฉด ์๋ฏธ๊ฒ์๊ณผ ๊ตฌ์กฐํ ํํฐ๋ฅผ ํจ๊ป ์ฐ๋ ํ์ด๋ธ๋ฆฌ๋๊ฐ ๋๋ค.
query = "์ด๋ฒ ๋ถ๊ธฐ ๋งค์ถ ๊ด๋ จ ํ
์ด๋ธ"
โ ์ง์ ํด์ (์ฌ์ฉ ๊ฐ๋ฅ ํ๋: type, tags, timestamp ๋ฅผ ์)
โ { semantic: "๋งค์ถ ํ
์ด๋ธ",
filter: { tags: {$in: ["revenue","sales"]},
type: "BigQuery Table",
timestamp: {$gte: "2026-04-01"} } }
โ ๋ฒกํฐ๊ฒ์(semantic) WHERE filter โ ์ ํ + ์ต์ ์ฒญํฌ
์ฌ๊ธฐ์ ์์ฐ์ค๋ ๋ ์ค๋ฅด๋ ์๋ฌธ โ โtagsยทtimestamp๋ฅผ ํ์ธํด ๊ฑธ๋ฌ๋ผโ๋ ๊ฑธ ์ด๋์, ๋๊ฐ ์ ํ๋? ๊ทธ๋ฅ LLM์๊ฒ ํ๋จ์ ๋งก๊ธฐ๋ ๊ฑด๊ฐ?
๋จผ์ ํ์คํ ํ ๊ฒ: OKF๋ ์ด๊ฑธ ์ ํ์ง ์๋๋ค. OKF๋ โformat, not platformโ์ด๋ผ ํ๋๋ฅผ ์ ๊ณต๋ง ํ์ง, โ์ง์ ๋ tags๋ก ํํฐํ๋ผโ๋ ๊ท์น์ ๋ช ์ธ์ ์๋ค. ๊ทธ ๊ท์น์ ์๋นํ๋ ์ชฝ(retriever/์์ด์ ํธ)์ ์ง์ ๋ ์ด์ด์ ์ฐ๋ค. ๋ฐฉ์์ ์ ์ค ํ๋๋ค.
| ๋ฐฉ์ | ํํฐ๋ฅผ ๋๊ฐ ๊ณ ๋ฅด๋ | LLM ํ๋จ | ์ |
|---|---|---|---|
| โ ๊ท์น ๊ธฐ๋ฐ | ๊ฐ๋ฐ์๊ฐ ์ฝ๋/์ค์ ์ ๊ณ ์ | ์์ | ํ๊ทธ ๋๋กญ๋ค์ด, filter={"type":"BigQuery Table"} ํ๋์ฝ๋ฉ |
| โก self-query | LLM์ด ์ ์ธ๋ ํ๋ ์คํค๋ง ์์์ ์์ฐ์ดโํํฐ ๋ฒ์ญ | ์์(์ ์ฝ๋จ) | LangChain SelfQueryRetriever |
| โข ์์ด์ ํธ tool-calling | LLM์ด ์ ์๋ ๋๊ตฌ ๊ณ์ฝ ์์์ ํธ์ถ ๊ฒฐ์ | ์์(์ ์ฝ๋จ) | query(semantic, filters) ํด์ ํ๋ผ๋ฏธํฐ๋ก ํ๋ ๋
ธ์ถ |
๊ทธ๋์ โ๋จ์ํ LLM์ ์์ํ๋?โ์ ๋ต์ โ ์๋๋ค, โ์ ์ฝ๋ ์์โ์ด๋ค. โกโข์ฒ๋ผ LLM์ ๋งก๊ธฐ๋๋ผ๋ ์ด๋ค ํ๋๊ฐ ์๊ณ ๋ฌด์์ ๋ปํ๋์ง(field schema / ๋๊ตฌ ํ๋ผ๋ฏธํฐ)๋ ๊ฐ๋ฐ์๊ฐ ๋จผ์ ์ ์ธํ๋ค. LLM์ ๊ทธ ์ธํ๋ฆฌ ์์์ ๊ฐ๋ง ์ฑ์ธ ๋ฟ, ์๋ ํ๋๋ฅผ ๋ฐ๋ช ํ์ง ๋ชปํ๋ค. โ ์ ์์ LLM ํ๋จ์ด 0์ด๋ค.
OKF๋ค์ด ๋ณด๋์ค๊ฐ ํ๋ ์๋ค. ๋ฒ๋ค์ index.md๊ฐ โ์ด ํด๋์ ๋ฌด์จ conceptยทํ๋ยทํ๊ทธ๊ฐ ์๋คโ๋ฅผ ์ฌ๋์ด ์ฝ๋ ๋ฌธ์ฅ์ผ๋ก ์ ์ด๋๋ฏ๋ก, ์์ด์ ํธ๊ฐ ๋ฒ๋ค์ ์ง์ ์ฝ์ด ์ฌ์ฉ ๊ฐ๋ฅํ ํํฐ๋ฅผ ์ค์ค๋ก ํ์
ํ ์๋ ์๋ค. ๊ทธ๋๋ ๊ทธ๊ฒ์ ์ค์ ํํฐ๋ก ๋ฐ๊พธ๋ ๋ก์ง์ ์ฌ์ ํ ์๋น ์ธก ๋ชซ์ด๋ค โ OKF๋ ์ฌ๋ฃ, ์ง์ ์ ๋ต์ ํ์ดํ๋ผ์ธ.
sequenceDiagram autonumber actor U as ์ฌ์ฉ์ box RAG = ์ง์ ํด์๊ธฐ + ๋ฒกํฐ์คํ ์ด participant Q as ์ง์ ํด์๊ธฐ(์ง์๊ตฌ์ฑยท๋ต์์ฑ) participant V as ๋ฒกํฐ์คํ ์ด(๊ฒ์) end Note over Q: ๊ฐ๋ฐ์๊ฐ ์ ์ธํ ํ๋ ์คํค๋ง(typeยทtagsยทtimestamp)๋ฅผ ์ U->>Q: "์ด๋ฒ ๋ถ๊ธฐ ๋งค์ถ ๊ด๋ จ ํ ์ด๋ธ" Q->>Q: ์์ฐ์ด โ semantic ๋ฌธ๊ตฌ + ๊ตฌ์กฐํ ํํฐ๋ก ๋ถํด Q->>V: ๋ฒกํฐ๊ฒ์(semantic) WHERE tags has revenue AND timestamp >= Q2 V-->>Q: ์๊ฒฐ ์ฒญํฌ(์ ํยท์ต์ ) Q-->>U: ๋ต๋ณ + ์ถ์ฒ(resource)
โ์๋น ์ธก ์ง์ ๋ ์ด์ดโ ํ์ด๋ณด๊ธฐ โ self-query๊ฐ ๋๋ ์์
์ฉ์ด๋ถํฐ ํ์. ์๋น(consume)ํ๋ ์ชฝ์ด๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ โ ๊ฒ์์ ์์ฒญํ๊ณ โ ๋์์จ ์ฒญํฌ๋ก ๋ต์ ๋ง๋ค์ด ๋๋ ค์ฃผ๋ ์ฑ/์์ด์ ํธ ์ ์ฒด๋ค (OKF๋ฅผ ์ฐ๋ producer ๋ฐ๋ํธ์, ์ฝ์ด ์ฐ๋ consumer์ ๊ฐ์ ๋ง). ๊ทธ ์ฑ ์์์ ์์ฐ์ด๋ฅผ ์ค์ ๊ฒ์ ์์ฒญ์ผ๋ก ๋ฐ๊พธ๋ ๋จ๊ณ๊ฐ ์ง์ ๋ ์ด์ด๋ค.
ํ ๊ฐ์ง ์ง์ ๊ฒ โ RAG์ ๋ฒกํฐ์คํ ์ด๋ ์ธต์ด ๋ค๋ฅด๋ค. ๋ฒกํฐ์คํ ์ด(PineconeยทQdrantยทpgvector ๋ฑ)๋ ์๋ฒ ๋ฉยท๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ ์ฌ๋ ๊ฒ์ยทํํฐ๋ฅผ ํด์ฃผ๋ *์ปดํฌ๋ํธ(๊ฒ์ DB)*๋ค. RAG๋ ๊ทธ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ LLM์ ๋จน์ฌ ๋ต์ ๋ง๋๋ **retrieve + generate ํจํด(ํ์ดํ๋ผ์ธ)**์ด๋ค. ์ฆ ๋ฒกํฐ์คํ ์ด๋ RAG์ โ๊ฒ์โ ๋จ๊ณ๊ฐ ์ฐ๋ ๋๊ตฌ ํ๋์ด๊ณ (๊ฒ์์ BM25ยทSQLยท๊ทธ๋ํ๋ก ํด๋ ์ฌ์ ํ RAG), ์ง์๋ฅผ ๋ง๋๋ LLM๋ ๊ทธ ํจํด ์์ ์๋ค โ โLLM์ด ๋ฐ์์ RAG๋ฅผ ๋ถ๋ฅธ๋คโ๊ฐ ์๋๋ผ ํ ํ์ดํ๋ผ์ธ์์ LLM์ด ์ง์๋ฅผ ๋ง๋ค๊ณ โ ๋ฒกํฐ์คํ ์ด์์ ๊ฒ์ํ๊ณ โ ๋ค์ LLM์ด ๋ต์ ์ด๋ค.
| ๋ฒกํฐ์คํ ์ด | RAG | |
|---|---|---|
| ์ ์ฒด | ์ปดํฌ๋ํธ โ ์ ์ฅ+๊ฒ์ DB | ํจํด/ํ์ดํ๋ผ์ธ โ ๊ฒ์+์์ฑ |
| ํ๋ ์ผ | ์๋ฒ ๋ฉยท๋ฉํ๋ฐ์ดํฐ ์ ์ฅ โ ์ ์ฌ๋ ๊ฒ์ + ํํฐ | retrieve(๊ฒ์) โ LLM generate(๋ต ์์ฑ) |
| LLM ํฌํจ? | ์์ | ์์ (์์ฑ ๋จ๊ณ) |
| ์ | Pinecone ยท Qdrant ยท pgvector ยท FAISS | ๋ฌธ์ ์ฐพ์ ๋ตํ๋ ์ฑ๋ด ์ ์ฒด |
| ์๋ก์ ๊ด๊ณ | RAG์ ๊ฒ์ ๋จ๊ณ๊ฐ ์ฐ๋ ๋๊ตฌ ํ๋ | ๋ฒกํฐ์คํ ์ด๋ฅผ ์ฐ๋ ์์ ์ ์ฐจ |
RAG๋ ๋ฒกํฐ์คํ ์ด ์์ด๋(BM25ยทSQLยท๊ทธ๋ํ ๊ฒ์) ์ฑ๋ฆฝํ๊ณ , ๋ฒกํฐ์คํ ์ด๋ RAG ๋ฐ(์ถ์ฒยท์ค๋ณตํ์งยท์ด๋ฏธ์ง ์ ์ฌ๊ฒ์)์์๋ ์ฐ์ธ๋ค โ ๊ฐ์ ๊ฒ์ด ์๋๋ผ ํฌํจ ๊ด๊ณ๋ค.
โกself-query ๊ธฐ์ค์ผ๋ก ์์๋ฅผ ๋ณด๋ฉด:
- ์ฌ์ฉ์ ์์ฐ์ด ์ง์๊ฐ ๋ค์ด์จ๋ค.
- [A] ์ง์ ๊ตฌ์ฑ LLM ํธ์ถ โ ์ด๋ค
tagsยทtypeยท๊ธฐ๊ฐ์ผ๋ก ๊ฑธ๋ฌ์ผ ํ๋์ง๋ฅผ LLM์ด ๋ฝ๋๋ค. ์ด๋ LLM์ด ๊ทธ๊ฑธ ์ ์ ์๋ ์ด์ ๋, ๊ฐ๋ฐ์๊ฐ โ์ธ ์ ์๋ ํ๋ ๋ชฉ๋ก๊ณผ ์๋ฏธโ๋ฅผ ํ๋กฌํํธ(๋๋ ํจ์/tool ํ๋ผ๋ฏธํฐ ์คํค๋ง)์ ๋ฏธ๋ฆฌ ์ฃผ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค. - ๊ทธ ๊ฒฐ๊ณผ(semantic ๋ฌธ๊ตฌ + ๊ตฌ์กฐํ ํํฐ)๋ก ๋ฒกํฐ์คํ ์ด์ ๊ฒ์ํ๋ค.
- ๋์์จ ์๊ฒฐ ์ฒญํฌ๋ก ๋ต๋ณ ์์ฑ LLM์ด ์ต์ข ๋ต์ ์ด๋ค.
2๋จ๊ณ์์ ์ค์ ๋ก ์ค๊ฐ๋ ๊ฒ:
# ๊ฐ๋ฐ์๊ฐ ํ๋กฌํํธ/์คํค๋ง์ ์ฃผ์
ํด ๋๋ "์ธ ์ ์๋ ํ๋"
filterable_fields:
tags: "๋น์ฆ๋์ค ๋๋ฉ์ธ ๋ชฉ๋ก (sales, revenue, marketing ...)"
type: "๋ฆฌ์์ค ์ข
๋ฅ (BigQuery Table, Metric ...)"
timestamp: "๋ง์ง๋ง ๊ฐฑ์ ์๊ฐ"// ์ ์คํค๋ง๋ฅผ ๋ณด๊ณ LLM์ด ์์ฐ์ด ์ง์๋ฅผ ๋ฒ์ญํ ์ถ๋ ฅ
{ "semantic": "๋งค์ถ ํ
์ด๋ธ",
"filter": { "tags": {"$in": ["revenue","sales"]},
"type": "BigQuery Table",
"timestamp": {"$gte": "2026-04-01"} } }์ ๋ฆฌํ๋ฉด โ A(์ด๋ค ๊ฐ์ ๋ฝ์์ง ํ๋จ)๋ 2๋จ๊ณ์์ LLM์ด ํ๊ณ , A๋ฅผ ๊ฐ๋ฅ์ผ ํ๋ โํ๋ ๋ชฉ๋กยท์๋ฏธโ๋ ๊ฐ๋ฐ์๊ฐ ํ๋กฌํํธ๋ก ์ค์ ํ๋ค. LLM์ ๊ทธ ๋ชฉ๋ก ์์์๋ง ๊ฐ์ ์ฑ์ฐ๋ฏ๋ก โ์ ์ฝ๋ ์์โ์ด๋ค. ๋จ, โ ๊ท์น ๊ธฐ๋ฐ์๋ ์ด 2๋จ๊ณ LLM์ด ์๊ณ (๊ฐ๋ฐ์๊ฐ ํํฐ๋ฅผ ๊ณ ์ ), self-query์ LLM์ ์ง์๋ฅผ ๋ง๋๋ ์ญํ (2๋จ๊ณ) ๊ณผ ๋ต์ ์ฐ๋ ์ญํ (4๋จ๊ณ) ๋ก ๋ ๋ฒ ๋ฑ์ฅํ๋ค(๊ฐ์ ๋ชจ๋ธ์ด๋ ์๋๋ ).
์ค์ : ์ฐ๋ฆฌ ๋ฌธ์๋ฅผ OKF๋ก RAGํํ๊ธฐ โ ๋ฌด์์ค + ์ต์ ํ
ํ์ฌ์ ์คํ ๋ฌธ์ A(์: ๊ธฐ๋ฅ X ๋ช
์ธ)๋ฅผ RAGํํ๋ค๊ณ ํ์. ํํ ์คํด๊ฐ โOKFํ = ์์ฝ์ด๋ผ ์๋ฌธ์ด ์ ์ค๋๋คโ์ธ๋ฐ ๊ทธ๋ ์ง ์๋ค. OKF๋ markdown + frontmatter์ผ ๋ฟ์ด๋ผ A์ ์๋ฌธ ์ ์ฒด๋ฅผ body์ ๊ทธ๋๋ก ๋๊ณ ๊ทธ ์์ ๋ฉํ๋ฐ์ดํฐยท๊ตฌ์กฐ๋ง ์น์ผ๋ฉด ์ ์ค์ด 0์ด๋ค. ์ ์ค์ ์ค์ง โ์์ฝยท์ฌ์์ฑํ๊ธฐ๋ก ์ ํโํ์ ๋๋ง ์๊ธฐ๋ ํ์ดํ๋ผ์ธ ์ ํ์ด๋ฉฐ, ๊ทธ๋๋ resource ๋งํฌ๊ฐ ์๋ฌธ์ผ๋ก ๊ฐ๋ ์์ ๋ง์ด ๋๋ค. ์คํ์ฒ๋ผ ์ ํํ ์กฐํญ์ด ์๋ช
์ธ ๋ฌธ์๋ verbatim ๋ณด์กด์ ๊ถ์ฅํ๋ค.
naive ์ ์ฒดํ ์คํธ RAG์ ๋ฌด์์ด ๋ค๋ฅธ๊ฐ โ ๋ ๊ฐ์ ๋ ๋ฒ
์๋ฌธ์ ์์ชฝ ๋ค ๋๊ฐ์ด ๋ด๋๋ค๋ฉด, ๋ฌ๋ผ์ง๋ ๊ฑด ๋ฑ ๋ ๊ฐ์ง๋ค.
- โ ์๋ฅด๋ ์์น(์ฒญํน ๊ฒฝ๊ณ) โ ๊ธธ์ด ๋จ์(512ํ ํฐ)๋ ํยท์ ์ฐจ๋ฅผ ์ค๊ฐ์์ ๊ฐ๋ผ ์ฒญํฌ ๋ฒกํฐ๊ฐ ์ฌ๋ฌ ์ฃผ์ ์ ํ๋ฆฟํ ํ๊ท ์ด ๋๋ค(์ ์ฌ๋ ๋งค์นญ ์ ํ). ํค๋ฉ ๋ฑ ์๋ฏธ ๋จ์๋ก ์๋ฅด๋ฉด ์ฒญํฌ๊ฐ ์๊ฒฐ๋๊ณ ์๋ฒ ๋ฉ์ด ์ ๋ช ํด์ง๋ค.
- โ ๋ถ๋ ๋ผ๋ฒจ(๋ฉํ๋ฐ์ดํฐ) โ ๊ธธ์ด ์ฒญํน์ ๋ณดํต
source๋ฟ์ด๋ผ ์ฌ๋ฌ ๋ฌธ์ยท๋ฒ์ ์ด ๋ค์์ธ๋ค. frontmatter๋ฅผ ๋ฉํ๋ก ์น๊ฒฉํ๋ฉดfeatureยทversionยทtags๋ก ์ ๋ฐ ํํฐยท์ค์ฝํยท๊ด๊ณ ํ์ฅ์ด ๋๋ค.
ํจ์ : ์๋ฌธ ์์ ๋ฉํ๋ฐ์ดํฐ๋ง ์น๊ณ ์ฒญํน์ ์ฌ์ ํ ๊ธธ์ด ๋จ์๋ก ํ๋ฉด โ(ํํฐ)๋ง ์ป๊ณ โ(์๊ฒฐ ์ฒญํฌ)๋ ๋ชป ์ป๋๋ค. ์ด์ ์ ๋ค ๊ฐ์ง๋ ค๋ฉด ์๋ฏธ ๋จ์ ์ฒญํน + ๋ฉํ ์น๊ฒฉ ๋ ๋ค ํ์ํ๋ค.
์ธ์ OKF-RAG๊ฐ ๊ฐ์ ํ๋
- ๋ฌธ์๊ฐ ํ๋๋ฟ์ด๊ณ ์์ Q&A๋ง ํ๋ฉด โ naive ์ ์ฒดํ ์คํธ RAG๋ก ์ถฉ๋ถ(OKF๋ ์ค๋ฒํค๋).
- ๋ฌธ์๊ฐ ๋ง๊ณ ยท๊ธธ๊ณ ยท๋ฒ์ ์ด ๊ฐ๋ฆฌ๊ณ ยท์๋ก ์ฐธ์กฐํ ์๋ก โ ํํฐยท๊ทธ๋ํยท์ ๊ทํยท์ ์ง๋ณด์ ์ด์ ์ด ์ปค์ง๋ค. OKF์ ์ง์ง ๊ฐ์ ์ฌ๋ฌ ๋ฌธ์ยท์์ฐ์์ ๊ฑธ์ณ ๋ ๋ ๋ฒ๋ฅผ ์ผ๊ด๋๊ฒ ๊ฐ์ ํ๋ ์์์ด๋ผ๋ ์ ์ด๋ค. (๋ฉํ๋ฐ์ดํฐ ์์ฒด๋ naive RAG์๋ ๋ถ์ผ ์ ์์ผ๋, ์ผ๊ด์ฑยท์ ์ง๋ณด์๋ฅผ ํฌ๋งท์ด ๋ณด์ฅํ์ง ์๋๋ค.)
๋ฌด์์ค ์ ์งํ๋ฉฐ ๊ฒ์์ ์ต์ ํํ๋ ๋ํ ๊ธฐ๋ฒ
| ๋จ๊ณ | ๋ํ ๊ธฐ๋ฒ | ๋ฌด์์ ํด๊ฒฐ |
|---|---|---|
| ์ฒญํน | Recursive split ยท Markdown/ํค๋ฉ ์ธ์ split ยท Semantic chunking ยท Proposition | ์๋ฏธ ๋จ์ ๊ฒฝ๊ณ |
| ๋งฅ๋ฝ ๋ณด์กด | Parent-Document(small-to-big) ยท Sentence-window ยท Contextual Retrieval(Anthropic) ยท Late chunking ยท RAPTOR | ์์ ์ฒญํฌ๊ฐ ๋ฌธ์ ๋งฅ๋ฝ์ ์๋ ๋ฌธ์ |
| ๊ฒ์ | Hybrid(BM25+๋ฒกํฐ)+RRF ยท Reranking(cross-encoder) ยท self-query ๋ฉํํํฐ ยท HyDEยทmulti-query ยท GraphRAG | ์ ํ ํ ํฐยท์ ๋ฐ๋ยท๋ณตํฉ ์ง์ยท๊ด๊ณ |
์คํ ๋ฌธ์ A ์ถ์ฒ ์คํ: ํค๋ฉ ์ฒญํน(์๋ฌธ ๋ณด์กด) + feature/version ๋ฉํ โ small-to-big ๋๋ Contextual Retrieval โ ์ง์ ์ Hybrid + Reranker + version=latest ํํฐ โ ์ฐธ์กฐ๋ ๋งํฌ๋ก ํ์ฅ, ๋ชป ์ฐพ์ผ๋ฉด resource๋ก ์๋ฌธ fallback. ์ด๋ ์กฐํฉ์ด ๋์์ง๋ ๋ฐ์ดํฐยท์ง์๋ง๋ค ๋ค๋ฅด๋ RAGAS ๋ฑ์ผ๋ก ์ธก์ ํด ๊ณ ๋ฅธ๋ค.
์ ๋ฐ์ดํธ flow โ A ์คํ์ด ๋ฐ๋๋ฉด
OKFํํด ์ ์ฅํ ๋ค ์๋ฌธ์ด ๋ฐ๋๋ฉด, ์ ์ฒด ์ฌ์์ธ์ด ์๋๋ผ ๋ฐ๋ ์ฒญํฌ๋ง upsert + ์ฌ๋ผ์ง ์ฒญํฌ๋ deleteํ๋ ์ฆ๋ถ ์์ธ์ ํ๋ค.
flowchart TB U[์ฌ์ฉ์ A๊ฐ ์คํ ์๋ฌธ ๋ณ๊ฒฝ] --> D{๋ณ๊ฒฝ ์ธ์ง<br/>์นํ ยท ํด์ ํด๋ง ยท git diff} D --> RC[์ฌ์ฒญํน<br/>MarkdownHeaderTextSplitter<br/>timestampยทversion ๊ฐฑ์ ] RC --> DIFF{์ฒญํฌ ๋จ์ diff<br/>์์ ID + ์ฝํ ์ธ ํด์} DIFF -->|ํด์ ๊ฐ์| SKIP[skip ยท ์ฌ์๋ฒ ๋ฉ 0] DIFF -->|ํด์ ๋ค๋ฆ| UP[์ฌ์๋ฒ ๋ฉ โ upsert] DIFF -->|์์ด์ง| DEL["delete โ ์ ๋ น์ฒญํฌ ์ ๊ฑฐโ "] DIFF -->|์๋ก ์๊น| INS[์๋ฒ ๋ฉ โ insert] UP --> VS[(๋ฒกํฐ์คํ ์ด ๊ฐฑ์ )] DEL --> VS INS --> VS SKIP -.-> VS
๊ฐ์ฅ ํํ ๋ฒ๊ทธ๋ ์ญ์ ๋๋ฝ โ ์๋ฌธ์์ ์ง์ด ์น์ ์ ์ ์ฒญํฌ๊ฐ ๋จ์ โ์ ๋ น ์ง์โ์ผ๋ก ๊ฒ์๋๋ ๊ฒ. ๊ทธ๋์ โ๋ฐ๋ ๊ฒ upsertโ๋ณด๋ค โ์ฌ๋ผ์ง ๊ฒ deleteโ๊ฐ ๋ณธ์ง์ด๋ค.
์ด diffยท์ญ์ ๋ ์ง์ ์งค ํ์ ์๋ค โ LangChain Indexing API + RecordManager(cleanup=incremental/full), LlamaIndex refresh_ref_docs, ๋๋ Knowledge Catalog re-ingest๊ฐ ์ฒ๋ฆฌํ๋ค. ๋จ ๋ณ๊ฒฝ ์ ํ๋ณ ํ๊ณ๊ฐ ๋ค๋ฅด๋ค.
| ๋ณ๊ฒฝ ์ ํ | ๋๊ตฌ๊ฐ ํด๊ฒฐ? | ์ค์ ๋์ |
|---|---|---|
| ์น์ ์ญ์ | โ ์์ | cleanup์ด ์ฌ๋ผ์ง ์ฒญํฌ ์๋ delete |
| ์์ ๋ณ๊ฒฝ | โ ์กฐ๊ฑด๋ถ | ์ฝํ ์ธ ๊ธฐ๋ฐ ํด์๋ฉด ๋ด์ฉ ๊ฐ์ ๋ skip. ์์น๋ฅผ ID/ํด์์ ๋ฃ์ผ๋ฉด delete+insert |
| ํค๋ฉ ๋ฆฌ๋ค์ | โ ๏ธ ์ ํ์ฑ๋ง | delete+insert๋ก KB๋ ๋ง์ง๋ง ๋ฆฌ๋ค์ ์ธ์์ ์ ๋จ(๋ถํ์ ์ฌ์๋ฒ ๋ฉยท์ ID ์ฐธ์กฐ ๊นจ์ง) |
์ง์ง ๋ฆฌ๋ค์ ์ถ์ ์ด ํ์ํ๋ฉด ์/์ ์ฒญํฌ์ ์๋ฒ ๋ฉ ์ ์ฌ๋๋ก ID๋ฅผ ์น๊ณํ๋ ์ปค์คํ ๋งคํ์ด ํ์ํ๋ฉฐ, ๋๊ฐ delete+insert(์ฌ์๋ฒ ๋ฉ 1ํ)๊ฐ ๋ ์ธ์ ๊ฐ์ํ๋ค.
์ฐธ๊ณ ์ฌ๋ก: FinSage โ ๊ธ์ต ๊ณต์ ๋ฉํฐํฌ๋งท RAG (์ค์ ๋ฐฐํฌ)
ํยท์ฐจํธ๊ฐ ์์ธ ๊ธ์ต ๊ณต์ PDF๋ฅผ QAํ๋ ์์คํ . ์จ๋ผ์ธ ๋ฏธํ QA ์์ด์ ํธ๋ก 1,200๋ช + ์๋น์ค, CIKM 2025 ์ฑํ. ์์์ ์ ๋ฆฌํ ์กฐ๊ฐ๋ค์ด ํ ํ์ดํ๋ผ์ธ์ ๋ค ๋ค์ด์์ด ์ข์ ๋ ํผ๋ฐ์ค๋ค.
- Ingestion(์ ๊ทํ) โ
MinerU๋ก PDFโ๊ตฌ์กฐํ JSON(reading order, text/table/image ํ์ ), ํยท์ฐจํธ๋ GPT-4o๊ฐ โํ ์คํธ ์์ ๋ฌธโ์ผ๋ก ๋ณํํด ์๋ฒ ๋ฉ ๊ฐ๋ฅํ๊ฒ. + ์ค๋ณต์ ๊ฑฐยท์ํธ์ฐธ์กฐ ํด์ยท์น์ ์์ฝ ๋ฉํ ์์ฑ. ์ฒญํฌ = (text, metadata, denseยทsparseยทmetadata ์๋ฒ ๋ฉ) 5-ํํ. โ canonicalํ(=OKFํ)์ ๊ตฌ์ฒด ๊ตฌํ - Chunking โ ์ฑํฐ + ํ ํฐ ๊ธธ์ด, ์น์ ์ ๋ชฉ์ ๊ฐ๋ก์ง๋ฌ ์๋ฅด์ง ์์. โ ํค๋ฉ ์ธ์ ์ฒญํน
- Retrieval โ 4๊ฒฝ๋ก ํฉ์งํฉ: BM25 + Dense(BGE-M3/FAISS) + Metadata(ํค๋ฉ+์์ฝ ์๋ฒ ๋ฉ, ๊ฑธ๋ฆฌ๋ฉด ์ธ๊ทธ๋จผํธ ์ ์ฒด ํ์) + HyDE(๊ฐ์๋ต๋ณ 3๊ฐ). โ Hybrid + self-query + small-to-big + HyDE๋ฅผ ๋์์
- Rerank โ
bge-reranker-v2-Gemma+ timeยทmetadata ๋ณด๋์ค(์ ์ ๋ยท์ถ์ฒ ๋ฐ์) + DPO ํ์ธํ๋. โ ๋ฆฌ๋ญํน +timestamp์ ์ ๋ - ํ๊ฐ โ FinanceBench + ์ ๋ฌธ๊ฐ 75๋ฌธํญ, recall 92.51%, ๋ฒ ์ด์ค๋ผ์ธ ๋๋น +24.06%, ๋ฆฌ๋ญ์ปค๋ก precision 5.6%โ18.5%. โ โ๋ฐ๋์ ์ธก์ โ์ ์ค์ฆ
ํ๊ณ: 4๊ฒฝ๋ก ์ ์ ์ตํฉ ๊ฐ์ค์น๋ ๋ ผ๋ฌธ์ ๋ฏธ๋ช ์(์ฌํ ์ ํ๋ ํ์). ์๋ฌธ: FinSage โ arXiv 2504.14493 (CIKM 2025)
๋ ํผ๋ฐ์ค ๊ตฌํ (v0.1)
- Enrichment agent โ BigQuery ๋ฐ์ดํฐ์ ์ ์ํํ๋ฉฐ ํ ์ด๋ธ/๋ทฐ๋ง๋ค OKF concept ๋ฌธ์๋ฅผ ์ด์ ์์ฑํ๊ณ , 2์ฐจ LLM ํจ์ค๋ก ๊ณต์ ๋ฌธ์๋ฅผ ํฌ๋กค๋งํด citationยท์คํค๋งยทjoin path๋ก ๋ณด๊ฐ
- Static HTML visualizer โ ๋ฐฑ์๋ ์์ด ๋์ํ๋ ์๊ฐํ ๋๊ตฌ
- 3๊ฐ ์ํ ๋ฒ๋ค โ GA4 e-commerce, Stack Overflow, Bitcoin ๋ฐ์ดํฐ์
- Google Cloud Knowledge Catalog๊ฐ OKF๋ฅผ ingestํด ์์ด์ ํธ์ ์๋นํ๋๋ก ์ ๋ฐ์ดํธ๋จ
์ค์ ์ ์ฉ ์ฌ๋ก
โ BigQuery ๋ฐ์ดํฐ์ ์ OKF ๋ฒ๋ค๋ก ์๋ ๋ณํ โ enrichment agent
๊ฐ์ฅ ๊ตฌ์ฒด์ ์ธ ์ ์ฉ์ Google์ด ๋ ํผ๋ฐ์ค๋ก ๊ณต๊ฐํ enrichment agent(enrichment_agent)๋ค. ๊ณต์ ๊ตฌํ์ ๋ ๊ฐ์ ํจ์ค๋ก ๋์ํ๋ค.
- BQ Pass (1์ฐจ) โ BigQuery ๋ฉํ๋ฐ์ดํฐ๋ง ์ฌ์ฉํด ์์ค๊ฐ ๊ด๊ณ ํ๋ concept๋ง๋ค OKF ๋ฌธ์ ํ ์ฅ์ ์์ฑํ๋ค (โwrites one OKF doc per concept the source advertises, using BigQuery metadata aloneโ). frontmatter์
type: BigQuery Table,title,resource(์ฝ์ ๋งํฌ)๋ฅผ ์ฑ์ฐ๊ณ ๋ณธ๋ฌธ์ ์คํค๋ง ํ๋ฅผ ๋ฃ๋๋ค. - Web Pass (2์ฐจ, LLM) โ seed URL ๋ชฉ๋ก(
--web-seed-file)์ ๋ฐ์fetch_url๋ก ๊ณต์ ๋ฌธ์๋ฅผ ํฌ๋กค๋งํ๊ณ , ๊ถ์ ์๋ ๋ฌธ์๋ก ๋ณด์ด๋ outbound ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ๋ค. ํ์ด์ง๋ง๋ค โ ๊ธฐ์กด concept์ citationยท์คํค๋งยทjoin path ๋ณด๊ฐ, โreferences/<slug>์ ๋ฌธ์ ์์ฑ, โ skip ์ค ํ๋๋ฅผ ์ ํํ๋ค.--web-max-pages์ํ๊ณผ same-domain ํํฐ๋ก ํฌ๋กค๋ง ํญ์ฃผ๋ฅผ ๋ง๋๋ค.
์คํ์ ํ ์ค์ด๋ค.
python -m enrichment_agent enrich \
--source bq \
--dataset <project>.<dataset> \
--web-seed-file seeds.txt \
--out ./bundles/<name>AS-IS โ ์์์ ๋ฌธ์ํ + ํฉ์ด์ง ์ปจํ ์คํธ
flowchart LR DS[(BigQuery Dataset<br/>์๋ฐฑ ๊ฐ table/view)] --> ENG[์์ง๋์ด<br/>์์์ ๋ฌธ์ํ] ENG --> WK[Wiki] ENG --> CAT[Metadata Catalog] ENG --> CM[์ฝ๋ ์ฃผ์] ENG -. ๋๋ฝยท๋ฐฉ์น .-> SE[(์๋์ด ๋จธ๋ฆฟ์)] Q["์์ด์ ํธ ์ง๋ฌธ<br/>'WAU ์ด๋ป๊ฒ ๊ณ์ฐ?'"] --> ST{ํฉ์ด์ง ๊ณณ์์<br/>์ปจํ ์คํธ ์ฌ์กฐ๋ฆฝ} WK --> ST CAT --> ST CM --> ST SE --> ST ST -. ๋ถ์์ ยท๋ถ์ผ์นยทstale .-> X((๋ต ์ ๋ขฐ๋ ๋ฎ์))
TO-BE โ enrichment agent 2-pass ์๋ ์์ฑ
flowchart TB DS[(BigQuery Dataset)] --> BQ SEED[seed URLs<br/>--web-seed-file] --> WEB subgraph BQ["BQ Pass (1์ฐจ)"] BQ1[ํ ์ด๋ธยท๋ทฐ ์ํ] --> BQ2[concept๋ง๋ค OKF ๋ฌธ์ ์ด์<br/>๋ฉํ๋ฐ์ดํฐ๋ง ์ฌ์ฉ] end BQ --> WEB subgraph WEB["Web Pass (2์ฐจ, LLM)"] W1[fetch_url๋ก ๊ณต์ ๋ฌธ์ ํฌ๋กค๋ง] --> W2{ํ์ด์ง๋ณ ํ๋จ} W2 -->|enrich| W3[citationยท์คํค๋งยทjoin path ๋ณด๊ฐ] W2 -->|mint| W4["references/<slug> ์ ๋ฌธ์"] W2 -->|skip| W5[๊ฑด๋๋] end WEB --> OUT[(OKF ๋ฒ๋ค<br/>./bundles/name)] OUT --> HUMAN[์ฌ๋: GitHub ๋ ๋๋ง] OUT --> AGENT[์์ด์ ํธ: ๋ฒ์ญ ์์ด ์๋น]
์ด์ โ ์๋ฐฑ ๊ฐ ํ ์ด๋ธ์ ์๋ฏธยท์กฐ์ธ ๊ด๊ณ๋ฅผ ์ฌ๋์ด ์ผ์ผ์ด ๋ฌธ์ํํ๋ ์์ ์ด ์๋ํ๋๋ค. ๋ ์ค์ํ ๊ฑด ๊ฒฐ๊ณผ๋ฌผ์ด ์ฌ๋์ด GitHub์์ ์ฝ๋ ๋ฌธ์์ ์์ด์ ํธ๊ฐ ์๋นํ๋ ์ปจํ ์คํธ๊ฐ ๊ฐ์ ๋งํฌ๋ค์ด ํ ๋ฒ์ด๋ผ๋ ์ ์ด๋ค. โ์์ด์ ํธ์ฉ ๋ฉํ๋ฐ์ดํฐโ์ โ์ฌ๋์ฉ ์ํคโ๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ๋ ์ด์ค ๋น์ฉ์ด ์ฌ๋ผ์ง๋ค.
โก Knowledge Catalog๊ฐ OKF๋ฅผ ingestํด ์์ด์ ํธ์ ์๋น
Google Cloud๋ Knowledge Catalog๊ฐ OKF ๋ฒ๋ค์ ingestํ๋๋ก ์ ๋ฐ์ดํธํ๋ค โ โWe have also updated Google Cloudโs Knowledge Catalog to be able to ingest Open Knowledge Format and serve it to our agents.โ OKF๋ก ์ ๋ฆฌํ ์ง์์ ์นดํ๋ก๊ทธ์ ์ฌ๋ฆฌ๋ฉด GCP์ ์์ด์ ํธ๋ค์ด ๊ทธ ์ปจํ ์คํธ๋ฅผ ๋ฒ์ญยท๋ณํ ๋ ์ด์ด ์์ด ๊ทธ๋๋ก ๋ฐ์ ์ด๋ค.
AS-IS โ ์์ด์ ํธ๋ง๋ค surface๋ณ ์ปค๋ฅํฐ ์ง์ ๊ตฌํ
flowchart LR subgraph SRC[ํฉ์ด์ง ์ง์ surface] MC[Metadata Catalog<br/>๋ ์ API] WK[Wiki / Drive] CC[์ฝ๋ ์ฃผ์] SE[(์๋์ด ๋จธ๋ฆฟ์)] end A1[Agent A] --> MC A1 --> WK A2[Agent B] --> MC A2 --> CC MC -. ์นดํ๋ก๊ทธ ๋ฒค๋๋ง๋ค<br/>๋ฐ์ดํฐ ๋ชจ๋ธ ์ฌ๋ฐ๋ช .-> X((ํตํฉยท์ฌ์ฌ์ฉ ์ ๋จ))
TO-BE โ OKF ๋ฒ๋ค์ ์นดํ๋ก๊ทธ๊ฐ ingest โ ์์ด์ ํธ์ serve
flowchart LR P[Producer<br/>์ฌ๋ or enrichment agent] -->|OKF ๋ฒ๋ค ์์ฑ| OKF[(OKF bundle<br/>markdown + YAML)] OKF -->|ingest| KC[Google Cloud<br/>Knowledge Catalog] KC -->|serve| A1[Agent A] KC -->|serve| A2[Agent B] KC -->|serve| A3[Agent C]
์ด์ โ ์ด๋ฏธ GCP๋ฅผ ์ฐ๋ ํ์ โ์ง์ ์์ฑ โ ์นดํ๋ก๊ทธ ์ ์ฌ โ ์์ด์ ํธ ์๋นโ๋ฅผ ํ์ค ํฌ๋งท ํ๋๋ก ์ฐ๊ฒฐํ ์ ์๋ค. ์นดํ๋ก๊ทธ ๋ฒค๋๊ฐ ๋งค๋ฒ ์์ฒด ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ฌ๋ฐ๋ช ํ๋ ๋ฌธ์ (๋ธ๋ก๊ทธ๊ฐ ์ง์ ํ โevery catalog vendor is reinventing the same data modelsโ)๋ฅผ ์ฐํํ๋ค.
๋ ์ด์ด๋ก ๋ณด๋ฉด โ ์์ box RAG = ์ง์ ํด์๊ธฐ(Q) + ๋ฒกํฐ์คํ ์ด(V)์์ Knowledge Catalog๊ฐ V ์๋ฆฌ(OKF ingest = ์ ์ฌยท์์ธ, serve = ๊ฒ์ ์๋น), ์์ด์ ํธ๊ฐ Q(์ง์ ๊ตฌ์ฑยท๋ต ์์ฑ)๋ค. enrichment agent๋ ์ด ์ง์ ๋ฃจํ ๋ฐ์ ์คํ๋ผ์ธ write path โ ์นดํ๋ก๊ทธ๋ฅผ ์ฑ์ฐ๋ ์ชฝ์ด๋ค. ์ ๋ฆฌ: BigQuery = ์์ฒ(์ค์ ๊ฐ), OKF = ๊ตํ ํฌ๋งท, KC = ์ ์ฌยท์๋น(โV), agent = ์ง์ยท์์ฑ(โQ).
๋ ํ๊ณ๋ ๋ถ๋ช
ํ โ โ KC์ ๋ด๊ธฐ๋ ๊ฑด ์๋ฌธ ํ ๋ฐ์ดํฐ๊ฐ ์๋๋ผ ๋ฐ์ดํฐ์ ๋ํ ์ง์(์คํค๋งยท์๋ฏธยทjoinยท์ ์)์ด๋ผ, โ๋งค์ถ์ด ์ผ๋ง๋โ ๊ฐ์ ์ค์ ๊ฐ์ ์ฌ์ ํ BigQuery์์ ์ฟผ๋ฆฌ๋ฅผ ์คํํด์ผ ๋์จ๋ค(OKF๋ ์ฟผ๋ฆฌ ์์ง์ด ์๋๋ค). โ KC๋ ์ ์ฌ๋ ๊ฒ๋ง ๊ฒ์ํ๋ค โ ์๋ฌธ์ ์ ๋ณด X๊ฐ OKF ๋ฌธ์์ ์ ๋ด๊ฒผ์ผ๋ฉด KC ์ง์๋ก X๋ ์ ๋์จ๋ค(LLM์ด ์ง์ด๋ด๋ฉด hallucination). ๋น ์ง X๋ write path๋ฅผ ๋ค์ ๋๋ ค ๋ด๊ฑฐ๋ resource ๋งํฌ๋ก ์์ฒ์ ๋์๊ฐ ์ป๋๋ค.
โข ์ด์์๋ ์์ โ ๊ณต๊ฐ ์ํ ๋ฒ๋ค 3์ข + ๋น์ฃผ์ผ๋ผ์ด์
GA4 e-commerce / Stack Overflow / Bitcoin ๊ณต๊ฐ ๋ฐ์ดํฐ์ ์ enrichment agent๋ก ๋ณํํ ๋ฒ๋ค์ด GitHub์ ์ปค๋ฐ๋ผ ์๋ค. ๋ฐฑ์๋ ์์ด ๋๋ static HTML visualizer๋ก concept ๊ฐ ๋งํฌ ๊ทธ๋ํ๋ฅผ ๋ฐ๋ก ๋๋ฌ๋ณผ ์ ์์ด, โOKF ๋ฒ๋ค์ด ์ค์ ๋ก ์ด๋ค ๋ชจ์์ธ์งโ๋ฅผ ํด๋ก ํ ๋ฒ์ผ๋ก ํ์ธํ ์ ์๋ค.
์ด์ โ ์ ๋์ ํ์ด โํ์ค์ด ์๋ํ ์ ์ฉ ๋ฐฉ์โ์ ์ถ์์ ๋ช ์ธ๊ฐ ์๋๋ผ ๋์ํ๋ conformant ๋ฒ๋ค๋ก ํ์ตํ ์ ์๋ค. ๋ช ์ธ์๊ฐ ํ ํ์ด์ง์ ๋ค์ด๊ฐ ๋งํผ ์๊ณ , ์ํ์ด ๊ณง ํํ ๋ฆฌ์ผ ์ญํ ์ ํ๋ค.
์ฐธ๊ณ : OKF๋ 2026-06-12 ๊ณต๊ฐ๋ v0.1 ์ ์ ํ์ค์ด๋ผ, ์์ง์ ์ธ๋ถ ๋๊ท๋ชจ ๋์ ์ฌ๋ก๋ณด๋ค ์ ๋ ํผ๋ฐ์ค ๊ตฌํ์ด โํ์ค์ด ์๋ํ ์ ์ฉ ๋ฐฉ์โ์ ๋ณด์ฌ์ฃผ๋ ์ค์ฌ ์์๋ค.