• **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-queryLLM์ด ์„ ์–ธ๋œ ํ•„๋“œ ์Šคํ‚ค๋งˆ ์•ˆ์—์„œ ์ž์—ฐ์–ดโ†’ํ•„ํ„ฐ ๋ฒˆ์—ญ์žˆ์Œ(์ œ์•ฝ๋จ)LangChain SelfQueryRetriever
โ‘ข ์—์ด์ „ํŠธ tool-callingLLM์ด ์ •์˜๋œ ๋„๊ตฌ ๊ณ„์•ฝ ์•ˆ์—์„œ ํ˜ธ์ถœ ๊ฒฐ์ •์žˆ์Œ(์ œ์•ฝ๋จ)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 ๊ธฐ์ค€์œผ๋กœ ์ˆœ์„œ๋ฅผ ๋ณด๋ฉด:

  1. ์‚ฌ์šฉ์ž ์ž์—ฐ์–ด ์งˆ์˜๊ฐ€ ๋“ค์–ด์˜จ๋‹ค.
  2. [A] ์งˆ์˜ ๊ตฌ์„ฑ LLM ํ˜ธ์ถœ โ€” ์–ด๋–ค tagsยทtypeยท๊ธฐ๊ฐ„์œผ๋กœ ๊ฑธ๋Ÿฌ์•ผ ํ•˜๋Š”์ง€๋ฅผ LLM์ด ๋ฝ‘๋Š”๋‹ค. ์ด๋•Œ LLM์ด ๊ทธ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š”, ๊ฐœ๋ฐœ์ž๊ฐ€ โ€œ์“ธ ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ ๋ชฉ๋ก๊ณผ ์˜๋ฏธโ€๋ฅผ ํ”„๋กฌํ”„ํŠธ(๋˜๋Š” ํ•จ์ˆ˜/tool ํŒŒ๋ผ๋ฏธํ„ฐ ์Šคํ‚ค๋งˆ)์— ๋ฏธ๋ฆฌ ์ฃผ์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  3. ๊ทธ ๊ฒฐ๊ณผ(semantic ๋ฌธ๊ตฌ + ๊ตฌ์กฐํ™” ํ•„ํ„ฐ)๋กœ ๋ฒกํ„ฐ์Šคํ† ์–ด์— ๊ฒ€์ƒ‰ํ•œ๋‹ค.
  4. ๋Œ์•„์˜จ ์™„๊ฒฐ ์ฒญํฌ๋กœ ๋‹ต๋ณ€ ์ƒ์„ฑ 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)๋‹ค. ๊ณต์‹ ๊ตฌํ˜„์€ ๋‘ ๊ฐœ์˜ ํŒจ์Šค๋กœ ๋™์ž‘ํ•œ๋‹ค.

  1. 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(์ฝ˜์†” ๋งํฌ)๋ฅผ ์ฑ„์šฐ๊ณ  ๋ณธ๋ฌธ์— ์Šคํ‚ค๋งˆ ํ‘œ๋ฅผ ๋„ฃ๋Š”๋‹ค.
  2. 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/&lt;slug&gt; ์ƒˆ ๋ฌธ์„œ"]
        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 ์‹ ์ƒ ํ‘œ์ค€์ด๋ผ, ์•„์ง์€ ์™ธ๋ถ€ ๋Œ€๊ทœ๋ชจ ๋„์ž… ์‚ฌ๋ก€๋ณด๋‹ค ์œ„ ๋ ˆํผ๋Ÿฐ์Šค ๊ตฌํ˜„์ด โ€œํ‘œ์ค€์ด ์˜๋„ํ•œ ์ ์šฉ ๋ฐฉ์‹โ€์„ ๋ณด์—ฌ์ฃผ๋Š” ์ค‘์‹ฌ ์˜ˆ์‹œ๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ