• LLM Wiki ์‹ค์ „ ๊ตฌํ˜„์€ LLM Wiki ๊ฐœ๋…์„, ์ด๋ฏธ ์“ฐ๋˜ Obsidian vault ์œ„์— LLM ๊ด€๋ฆฌ ๊ณ„์ธต์„ ์–น์–ด ์‹ค์ œ๋กœ ๊ตด๋ฆฌ๋Š” ๋ฐฉ๋ฒ•
  • ์†์œผ๋กœ ์“ด ๋…ธํŠธ๋Š” ๋ถˆ๋ณ€ ์›๋ณธ์œผ๋กœ ๋ณดํ˜ธํ•˜๊ณ , ๊ด€๊ณ„ยท์ƒ‰์ธยท์ข…ํ•ฉ์€ LLM์ด ๋ณ„๋„ ํŒŒ์ƒ ๊ณ„์ธต์œผ๋กœ ๋งŒ๋“œ๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ (์ด ๋ฌธ์„œ๊ฐ€ ํƒํ•œ Model A)
  • ์œ„ํ‚ค ์ž์ฒด๋Š” ์ •์  ๋งˆํฌ๋‹ค์šด โ€” ์งˆ์˜ยท์œ ์ง€๋ณด์ˆ˜๋Š” ํด๋”๋ฅผ ์ฝ๋Š” LLM ๋„๊ตฌ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ˆ˜ํ–‰ (๊ฐœ๋ฐœ์ด ์•„๋‹ˆ๋ผ ๋„๊ตฌ ์„ ํƒ)
  • ๋ฒกํ„ฐ DB ์—†์ด ํ‚ค์›Œ๋“œยทํƒœ๊ทธยทgrep๋กœ ๋„๋Š” ๊ฒฝ๋Ÿ‰ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ

์ด๋ฏธ Obsidian์œผ๋กœ ์ •๋ฆฌ ์ค‘์ธ๋ฐ, LLM Wiki๊ฐ€ ์™œ ํ•„์š”ํ•œ๊ฐ€

LLM Wiki๋Š” Obsidian์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ™์€ ๋งˆํฌ๋‹ค์šด vault ์œ„์— โ€œLLM ๊ด€๋ฆฌ์žโ€๋ฅผ ์–น๋Š” ๊ฒƒ์ด๊ณ , ํŒŒ์ผ๋„ ๋ทฐ์–ด๋„ ๊ทธ๋Œ€๋กœ๋‹ค. ๋ฐ”๋€Œ๋Š” ๊ฑด ํ•˜๋‚˜ โ€” ์ •๋ฆฌ ๋…ธ๋™์„ ๋ˆ„๊ฐ€ ํ•˜๋А๋ƒ๋‹ค.

๊ด€์ ์ˆ˜๋™ Obsidian (์ง€๊ธˆ)LLM ๊ณ„์ธต ์ถ”๊ฐ€
์ •๋ฆฌ ๋…ธ๋™ (์ฝ๊ธฐยท์š”์•ฝยท๋งํฌยท๋ชจ์ˆœ ๋ฐœ๊ฒฌยท์ตœ์‹ ํ™”)์ „๋ถ€ ๋‚ด๊ฐ€ ํ•จLLM์ด ๋Œ€์‹  ํ•จ, ๋‚˜๋Š” โ€œ๋ฌด์—‡์„ ๋„ฃ์„์ง€โ€ ํ๋ ˆ์ด์…˜๋งŒ
ํ•™์Šต์ด ๋ชฉ์  (์“ฐ๋ฉฐ ์ดํ•ดยท๊ธฐ์–ต)์šฐ์œ„ โ€” ์ง์ ‘ ์“ฐ๋Š” ํ–‰์œ„๊ฐ€ ์ดํ•ด๋ฅผ ๋งŒ๋“ฆ์•ฝํ•จ โ€” ์“ฐ๊ธฐ๋ฅผ ์œ„์ž„ํ•˜๋ฉด ๋œ ๋‚จ์Œ
์ฐธ์กฐยท์งˆ์˜๊ฐ€ ๋ชฉ์  (์Œ“์•„์„œ ๋‚˜์ค‘์— ํ™œ์šฉ)์–‘์ด ๋Š˜๋ฉด ์†์œผ๋กœ ์œ ์ง€ ๋ฒ„๊ฑฐ์›€์šฐ์œ„ โ€” ์งˆ๋ฌธ์— ๋‹ตยท๊ฐ์‚ฌยท์ƒ‰์ธ

๊ทธ๋ž˜์„œ ํŒ๋‹จ์€ โ€œ๋„๊ตฌ๋ฅผ ๋˜ ์“ฐ๋‚˜?โ€๊ฐ€ ์•„๋‹ˆ๋ผ **โ€œ์ด ์ •๋ฆฌ ๋…ธ๋™์„ ๊ณ„์† ๊ฐ๋‹นํ• ์ง€, ์œ„์ž„ํ• ์ง€โ€**๋‹ค. ๊ฒฐ๋ก ์€ ๋‘˜ ์ค‘ ํƒ์ผ์ด ์•„๋‹ˆ๋ผ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ โ€” ํ•™์Šต ์ •๋ฆฌ๋Š” ์†์œผ๋กœ ๊ณ„์†ํ•˜๊ณ , ์–‘์ด ๋Š˜์–ด ์งˆ๋ฌธยท๋งํฌยท๊ฐ์‚ฌ๊ฐ€ ๋ฒˆ๊ฑฐ๋กœ์›Œ์ง€๋Š” ์ง€์ ์—์„œ LLM ๊ณ„์ธต์˜ ์ด๋“์ด ์ปค์ง„๋‹ค.

ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฐ์น˜ โ€” ๋‚ด ์›๋ณธ์€ ๋ถˆ๋ณ€, LLM์€ ํŒŒ์ƒ ๊ณ„์ธต๋งŒ (Model A)

๋จผ์ € ์˜คํ•ด ํ•˜๋‚˜: โ€œ๋ถˆ๋ณ€โ€์€ LLM ๊ธฐ์ค€์ด๋‹ค. LLM์ด ๋‚ด ๋…ธํŠธ๋ฅผ ์•ˆ ๊ฑด๋“œ๋ฆฐ๋‹ค๋Š” ๋œป์ด์ง€, ์ฃผ์ธ์ธ ๋‚ด๊ฐ€ ์ง์ ‘ ๊ณ ์น˜๋Š” ๊ฑด ๋‹น์—ฐํžˆ ์ •์ƒ์ด๋‹ค.

๋ฐฐ์น˜๋Š” โ€œraw๋ƒ vs ์ด๋ฏธ ์ข…ํ•ฉ๋œ ๊ฒƒ์ด๋ƒโ€๋กœ ๋‚˜๋‰œ๋‹ค. ์†์œผ๋กœ ์“ด ํ•™์Šต ๋…ธํŠธ๋Š” ์ด๋ฏธ ์ข…ํ•ฉ๋œ ์ง€์‹์ด๋ฏ€๋กœ, ์ด๊ฑธ ๊ทธ๋Œ€๋กœ ๋ถˆ๋ณ€ ์›๋ณธ์œผ๋กœ ๋‘๊ณ  LLM์—๋Š” ์ฝ๊ธฐ๋งŒ ํ—ˆ์šฉํ•œ๋‹ค. ๊ด€๊ณ„ยท์ƒ‰์ธยท์ข…ํ•ฉ์€ LLM์ด ๋ณ„๋„ ๊ฒน์œผ๋กœ ๋งŒ๋“ ๋‹ค.

my-wiki/
โ”œโ”€โ”€ sources/            # ๋‚ด ํ•™์Šต ๋…ธํŠธ + ์›์ž๋ฃŒ (LLM ์ฝ๊ธฐ๋งŒ, ์ ˆ๋Œ€ ์ˆ˜์ • ์•ˆ ํ•จ)
โ””โ”€โ”€ wiki/               # LLM์ด ์ƒ์„ฑํ•˜๋Š” ํŒŒ์ƒ ๊ณ„์ธต (์–ธ์ œ๋“  ์žฌ์ƒ์„ฑ ๊ฐ€๋Šฅ)
    โ”œโ”€โ”€ entities/       # ๊ฐœ์ฒดยท๊ฐœ๋… ๊ด€๊ณ„ ํŽ˜์ด์ง€ (MOC)
    โ”œโ”€โ”€ index.md        # ์ „์ฒด ๋…ธํŠธ ํ•œ ์ค„ ์š”์•ฝ ์นดํƒˆ๋กœ๊ทธ
    โ”œโ”€โ”€ audit.md        # ๋ชจ์ˆœยท๊ณต๋ฐฑยทstale ๋ฆฌํฌํŠธ
    โ””โ”€โ”€ log.md          # ์ž‘์—… ๊ธฐ๋ก
flowchart LR
    U["๋‚˜<br/>(์ €์žยทํ๋ ˆ์ดํ„ฐ)"]
    subgraph SRC["sources/ โ€” ๋ถˆ๋ณ€ (LLM ์ฝ๊ธฐ๋งŒ)"]
        N["๋‚ด ํ•™์Šต ๋…ธํŠธ"]
        RAW["์›์ž๋ฃŒ"]
    end
    subgraph W["wiki/ โ€” LLM ํŒŒ์ƒ (์žฌ์ƒ์„ฑ ๊ฐ€๋Šฅ)"]
        MOC["๊ด€๊ณ„ยท์ƒ‰์ธ"]
        AUD["๋ชจ์ˆœยท๊ณต๋ฐฑ ๊ฐ์‚ฌ"]
    end
    U -->|"์ž‘์„ฑยท์ˆ˜์ •"| N
    SRC ==>|"ingest (LLM์ด ์ฝ์–ด ์ƒ์„ฑ)"| W
    MOC -.->|"์œ„ํ‚ค๋งํฌ โ†’ ๋ฐฑ๋งํฌ๋กœ ๊ทธ๋ž˜ํ”„ ์—ฐ๊ฒฐ"| N
    U -->|"์งˆ์˜"| W
    W -->|"์ธ์šฉ ์ข…ํ•ฉ ๋‹ต๋ณ€"| U

๋‚ด ๋…ธํŠธ๋Š” 100% ๋ณดํ˜ธ๋˜๊ณ , ๊ด€๊ณ„ยท์ƒ‰์ธยท์ข…ํ•ฉ์€ LLM์ด ๋ณ„๋„ ๊ฒน์œผ๋กœ ๋งŒ๋“ ๋‹ค. (๋Œ€์•ˆ์œผ๋กœ LLM์ด ๋‚ด ๋…ธํŠธ ์•ˆ์— ์ง์ ‘ ๋งํฌ๋ฅผ ๋ฐ•๋Š” Model B๋„ ์žˆ์ง€๋งŒ, ๋…ธํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋ฏ€๋กœ ์ด ๋ฌธ์„œ๋Š” ์›๋ณธ ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด Model A๋ฅผ ํƒํ•œ๋‹ค.)

โ€์ค‘๋ณตโ€์ด ์•„๋‹ˆ๋ผ โ€œ์ƒ์„ฑ๋œ ์ƒ‰์ธโ€

wiki/๋Š” ๋‘ ๋ฒˆ์งธ ์›๋ณธ์ด ์•„๋‹ˆ๋ผ ๋‚ด ๋…ธํŠธ๋กœ๋ถ€ํ„ฐ ์–ธ์ œ๋“  ๋‹ค์‹œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” index/answer ๊ณ„์ธต์ด๋‹ค. ์ง„์‹ค์€ ๋‚ด ๋…ธํŠธ ํ•˜๋‚˜๋ฟ์ด๊ณ , wiki/๋Š” ๋ฒ„๋ฆฌ๊ณ  ์žฌ์ƒ์„ฑํ•ด๋„ ๋˜๋Š” ์บ์‹œ ๊ฐ™์€ ๊ฒน์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ด์ค‘ ๊ด€๋ฆฌ ๋ถ€๋‹ด์€ ์ž‘๋‹ค.

Obsidian ๋‹จ๋… ๋Œ€๋น„ ์‹ค์ œ ์ด์ 

Model A์—์„œ LLM์ด ๋‚ด ๋…ธํŠธ๋ฅผ ๋ชป ๊ณ ์ณ๋„, ํŒŒ์ƒ ๊ณ„์ธต๊ณผ ์งˆ์˜๋งŒ์œผ๋กœ ๋‹ค์Œ์„ ์–ป๋Š”๋‹ค.

  • ์งˆ์˜ โ†’ ๋‹ต๋ณ€ (find๊ฐ€ ์•„๋‹ˆ๋ผ answer) โ€” Obsidian ๊ฒ€์ƒ‰์€ ๋‹จ์–ด๊ฐ€ ๋“  ํŒŒ์ผ ๋ชฉ๋ก์„ ์ฃผ์ง€๋งŒ, LLM์€ ์—ฌ๋Ÿฌ ๋…ธํŠธ๋ฅผ ๊ฑธ์ณ ์ธ์šฉ๊นŒ์ง€ ๋ถ™์—ฌ ๋‹ต์„ ์ข…ํ•ฉํ•œ๋‹ค. (โ€œ๊ทธ ํŒŒ์ผ ์–ด๋””โ€ ๊ฐ™์€ ๋‹จ์ˆœ ์ฐพ๊ธฐ๋Š” Obsidian์ด ์ด๋ฏธ ๋น ๋ฅด๋‹ˆ ์ด์ ์ด ์—†๋‹ค โ€” ์ด๋“์€ โ€œ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐโ€์— ์žˆ๋‹ค)
  • ๋…ธํŠธ๋ฅผ ์•ˆ ๊ฑด๋“œ๋ฆฌ๊ณ  ๊ทธ๋ž˜ํ”„๊ฐ€ ์—ฐ๊ฒฐ๋จ โ€” LLM์ด wiki/์— ๋งŒ๋“  MOC๊ฐ€ ๋‚ด ๋…ธํŠธ๋กœ ์œ„ํ‚ค๋งํฌ๋ฅผ ๊ฑธ๋ฉด, Obsidian ๋ฐฑ๋งํฌ ๋•์— ๋‚ด ๋ถˆ๋ณ€ ๋…ธํŠธ์—๋„ ์—ฐ๊ฒฐ์ด ๋œจ๊ณ  graph view์— ๋‚˜ํƒ€๋‚œ๋‹ค. ํŒŒ์ผ์€ ํ•œ ๊ธ€์ž๋„ ์•ˆ ๋ฐ”๋€Œ๋Š”๋ฐ ๊ด€๊ณ„๋ง์ด ์ƒ๊ธด๋‹ค
  • ๋ชจ์ˆœยท๊ณต๋ฐฑยทstale ๊ฐ์‚ฌ โ€” โ€œA์™€ C ๋…ธํŠธ๊ฐ€ ์ƒ์ถฉโ€, โ€œRAGยท์ž„๋ฒ ๋”ฉ์„ ์ฐธ์กฐํ•˜๋Š”๋ฐ ์ž„๋ฒ ๋”ฉ ๋…ธํŠธ ์—†์Œโ€, โ€œ์ด ๋…ธํŠธ๋Š” ์˜ค๋ž˜๋ผ ์˜› ์ •๋ณด ์ฐธ์กฐโ€ ๊ฐ™์€ ๋ฆฌํฌํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ณ ์น ์ง€๋Š” ๋‚ด๊ฐ€ ํŒ๋‹จ
  • ์ž๋™ ์ƒ‰์ธยท์กฐ๊ฐ๋„ โ€” ์ „์ฒด ๋…ธํŠธ๋ฅผ ํ•œ ์ค„ ์š”์•ฝ์œผ๋กœ ์นดํƒˆ๋กœ๊ทธ, โ€œ๋‚ด๊ฐ€ X์— ๋Œ€ํ•ด ๋ฐฐ์šด ๊ฒƒโ€ ์ข…ํ•ฉ โ€” ํƒœ๊ทธยท๊ฒ€์ƒ‰ ์œ„์˜ ์กฐ๊ฐ๋„
  • ๋‹ค์Œ ํ•™์Šต๊ฑฐ๋ฆฌ ์ œ์•ˆ โ€” ๊ณต๋ฐฑ ๋ถ„์„์œผ๋กœ ์ด์–ด์„œ ๋ฐฐ์šธ ๊ฒƒ์„ ์ œ์•ˆ

LLM์ด ๋‚ด ๋…ธํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์†ํ•ด๊ฐ€ ์•„๋‹ˆ๋ผ ์˜๋„ํ•œ ๋ณด์žฅ์ด๋‹ค โ€” ์›๋ณธ ๋ณดํ˜ธ๊ฐ€ Model A์˜ ํ•ต์‹ฌ์ด๋‹ค. ๊ทธ ๊ฒฐ๊ณผ LLM์ด ๋งŒ๋“  [[๋งํฌ]]๋Š” ๋‚ด ๋…ธํŠธ ํŒŒ์ผ ์•ˆ์ด ์•„๋‹ˆ๋ผ wiki/ ํŒŒ์ƒ ๊ณ„์ธต์— ์ƒ๊ธด๋‹ค. ํ•˜์ง€๋งŒ Obsidian ๋ฐฑ๋งํฌ๊ฐ€ ์ด์–ด์ฃผ๋ฏ€๋กœ ๋‚ด ๋…ธํŠธ๋„ graph์—์„œ ์—ฐ๊ฒฐ๋˜์–ด ๋ณด์ด๊ณ , ํƒ์ƒ‰์—์„œ ์žƒ๋Š” ๊ฒƒ์€ ์—†๋‹ค.

(๋‹จ ํ•˜๋‚˜ ์˜ˆ์™ธ โ€” ์ƒ์ถฉยท์ค‘๋ณต ์ •๋ฆฌ๋Š” LLM์ด ๊ณ ์นœ ์›๋ณธ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋™ ์ ์šฉ์ด ์•„๋‹ˆ๋ผ git์œผ๋กœ ๋‚ด ์Šน์ธ์„ ๊ฑฐ์น˜๋ฏ€๋กœ ์›๋ณธ ๋ณดํ˜ธ ์›์น™์€ ์œ ์ง€๋œ๋‹ค. ์•„๋ž˜ [๋ชฉ์ ๋ณ„ LLM ๊ฐœ์ž… ์ˆ˜์œ„์™€ ์Šน์ธ ํ๋ฆ„] ์ฐธ์กฐ.)

๋ชฉ์ ๋ณ„ LLM ๊ฐœ์ž… ์ˆ˜์œ„์™€ ์Šน์ธ ํ๋ฆ„

์ด ์ง€์‹๋ฒ ์ด์Šค๋กœ ์–ป์œผ๋ ค๋Š” ๊ฒƒ์€ ๋„ค ๊ฐ€์ง€์ด๊ณ , ๊ฐ๊ฐ LLM์ด ์–ด๋””๊นŒ์ง€ ํ•˜๊ณ  ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์Šน์ธํ•˜๋Š”์ง€๊ฐ€ ๋‹ค๋ฅด๋‹ค. ์›๋ณธ์€ ๋‚ด ๊ฒƒ์ด๋ฏ€๋กœ, LLM์ด ์›๋ณธ์„ ๊ณ ์น  ๋•Œ๋Š” ์ž๋™ ์ ์šฉ์ด ์•„๋‹ˆ๋ผ ํ•ญ์ƒ ๋‚ด ์Šน์ธ(git commit)์„ ๊ฑฐ์นœ๋‹ค.

๋ชฉ์ LLM์ด ํ•˜๋Š” ๊ฒƒ๋‚˜์˜ ์—ญํ• ์›๋ณธ ์ˆ˜์ •?
1. ์ƒ์ถฉ ํ™•์ธ๊ณ ์นœ ์›๋ณธ(diff)์„ ์ œ์•ˆํ™•์ธ โ†’ ์ˆ˜์šฉ or ์ง์ ‘ ์ˆ˜์ •O (๋‚ด ์Šน์ธ ์‹œ)
3. ์ค‘๋ณต ํ™•์ธ์ •๋ฆฌ๋ณธ(๋ณ‘ํ•ฉ/๋งํฌ, diff)์„ ์ œ์•ˆํ™•์ธ โ†’ ์ˆ˜์šฉ or ์ง์ ‘ ์ˆ˜์ •O (๋‚ด ์Šน์ธ ์‹œ)
2. ๋ถ€์กฑ ํ™•์ธโ€์ด ๊ฐœ๋…์ด ๋น ์กŒ๋‹คโ€๊ณ  ์ง€์ ๋งŒ๋‚ด๊ฐ€ ๊ณต๋ถ€ํ•ด์„œ ์ง์ ‘ ์ž‘์„ฑX (๋‚ด๊ฐ€ ์ƒˆ๋กœ)
4. ์ž์—ฐ์–ด ๊ฒ€์ƒ‰์งˆ์˜์— ์ธ์šฉ๊ณผ ํ•จ๊ป˜ ๋‹ต๋ณ€โ€”X

Model A์˜ ์ •์ œ โ€” โ€œ์•ˆ ์”€โ€์ด ์•„๋‹ˆ๋ผ โ€œ๋‚ด ์Šน์ธ ์—†์ด๋Š” ํ™•์ • ์•ˆ ๋จโ€

์•ž์˜ Model A๋Š” โ€œLLM์€ ์›๋ณธ์„ ์ ˆ๋Œ€ ์•ˆ ์“ด๋‹คโ€์˜€๋‹ค. 1ยท3์—์„œ **โ€œLLM์ด ๊ณ ์นœ ์›๋ณธ์„ ์ œ์•ˆํ•ด์ฃผ๋ฉด ์ข‹๋‹คโ€**๋Š” ์š”๊ตฌ๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ, ๋ถˆ๋ณ€์‹์ด ํ•œ ๋‹จ๊ณ„ ์ •์ œ๋œ๋‹ค.

  • ์ด์ „: LLM์€ ์›๋ณธ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค
  • ์ง€๊ธˆ: LLM์€ ์›๋ณธ ์ˆ˜์ •์„ ์ œ์•ˆํ•˜๋˜, ๋‚ด commit ์—†์ด๋Š” ํ™•์ •๋˜์ง€ ์•Š๋Š”๋‹ค

์ด โ€œ์Šน์ธ ๊ฒŒ์ดํŠธโ€์˜ ์ •๋‹ต์ด git์ด๋‹ค. ์›๋ณธ(sources/)์„ git ์ €์žฅ์†Œ๋กœ ๋‘๋ฉด, ์ž‘์—…ํŠธ๋ฆฌ๊ฐ€ ์ œ์•ˆ ์ƒŒ๋“œ๋ฐ•์Šค๊ฐ€ ๋˜๊ณ  commit์ด ์Šน์ธ ๊ฒŒ์ดํŠธ๊ฐ€ ๋œ๋‹ค.

git ์Šน์ธ ํ๋ฆ„ (1ยท3์— ์ ์šฉ)

flowchart TD
    A["๊ฐ์‚ฌ: ์ƒ์ถฉ/์ค‘๋ณต ๋ฐœ๊ฒฌ"] --> B["LLM์ด ๊ณ ์นœ ์›๋ณธ์„<br/>git ์ž‘์—…ํŠธ๋ฆฌ์— ์”€ (๋ฏธ์ปค๋ฐ‹)"]
    B --> C{"git diff ๋กœ ๊ฒ€ํ† "}
    C -->|"๋งž๋‹ค"| D["git commit โ†’ ์ˆ˜์šฉ"]
    C -->|"๋‚ด๊ฐ€ ๋” ๊ณ ์นจ"| E["์ง์ ‘ ํŽธ์ง‘ ํ›„ commit"]
    C -->|"์•„๋‹ˆ๋‹ค"| F["git checkout โ†’ ํ๊ธฐ (์›์ƒ๋ณต๊ตฌ)"]

๋‚ด commit ์—†์ด๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ™•์ •๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ โ€œ์›๋ณธ์€ ๋‚ด ๊ฒƒโ€์ด ์ง€์ผœ์ง€๊ณ , ์ˆ˜์šฉยท์ง์ ‘์ˆ˜์ •ยท๊ฑฐ๋ถ€ ์„ธ ๊ฒฝ๋กœ๊ฐ€ git์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค. 2(๋ถ€์กฑ)๋Š” ์ง€์ ๋งŒ ํ•˜๊ณ  ๋‚ด๊ฐ€ ์ง์ ‘ ์“ฐ๋ฉฐ, 4(๊ฒ€์ƒ‰)๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๋‹ค.

ํ˜„์žฌ CLI: propose-edit ๊ตฌํ˜„๋จ

llm-wiki CLI๋Š” ๊ฐ์‚ฌ์˜ prose ์ œ์•ˆ์— ๋”ํ•ด, ์ƒ์ถฉยท์ค‘๋ณต findings์— ๋Œ€ํ•ด ๊ณ ์นœ ์›๋ณธ ํ›„๋ณด๋ฅผ git worktree์— ๊ธฐ๋กํ•˜๋Š” propose ๋ช…๋ น์œผ๋กœ 1ยท3์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์›๋ณธ์€ HEAD์—์„œ ๋œฌ ๊ฒฉ๋ฆฌ worktree์— ์“ฐ์ด๋ฏ€๋กœ ๋ฉ”์ธ ์ž‘์—…ํŠธ๋ฆฌ๋Š” ์•ˆ ๊ฑด๋“œ๋ฆฌ๊ณ , ๋‚˜๋Š” git diff๋กœ ๊ฒ€ํ†  ํ›„ mergeํ•˜๊ฑฐ๋‚˜ propose --cleanup์œผ๋กœ ํ๊ธฐํ•œ๋‹ค. 2ยท4๋Š” ๊ฐ์‚ฌยท์งˆ์˜๋กœ ์ถฉ์กฑ๋œ๋‹ค.

์œ„ํ‚ค๋Š” ์ •์  md โ€” ์“ฐ๋ ค๋ฉด LLM์„ ํด๋”์— โ€œ์—ฐ๊ฒฐโ€

ํ•ต์‹ฌ์€ ์œ„ํ‚ค๊ฐ€ **์ˆ˜๋™์  ์ €์žฅ์†Œ(md ํŒŒ์ผ)**์ผ ๋ฟ์ด๊ณ  ํ–‰์œ„ ์ฃผ์ฒด๋Š” LLM์ด๋ผ๋Š” ์ ์ด๋‹ค. ์œ„ํ‚ค๋งŒ์œผ๋ก  ์•„๋ฌด๊ฒƒ๋„ ๋ชป ํ•˜๊ณ , ์งˆ์˜ํ•˜๋ ค๋ฉด LLM์ด ๊ทธ ํด๋”๋ฅผ ์ฝ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด โ€œ์—ฐ๊ฒฐโ€์€ ๊ฐœ๋ฐœ์ด ์•„๋‹ˆ๋‹ค โ€” ํŒŒ์ผ ์ ‘๊ทผ์ด ๋˜๋Š” LLM ๋„๊ตฌ๋ฅผ ํด๋”์— ํ–ฅํ•˜๊ฒŒ ํ•˜๊ณ  ๋ฌผ์œผ๋ฉด ๋์ด๋‹ค. ์œ„ํ‚ค๋ฅผ ์œ ์ง€ํ•˜๋Š” LLM๊ณผ ์งˆ์˜ํ•˜๋Š” LLM์€ ๊ฐ™์€ ์ฃผ์ฒด๋‹ค.

๋„๊ตฌ์งˆ์˜ ๋ฐฉ๋ฒ•๋‚ด๊ฐ€ ํ•  ์ผ
Claude Codevault ํด๋”์—์„œ ์—ด๊ณ  ์งˆ๋ฌธ โ†’ ํŒŒ์ผ ์ฝ๊ณ  ๋‹ต๋ณ€๊ทธ ํด๋”์—์„œ ์‹คํ–‰ (๊ฐœ๋ฐœ 0)
OMC wiki ์Šคํ‚ฌwiki_query โ†’ ๋งค์นญ ํŽ˜์ด์ง€ + LLM ์ข…ํ•ฉ๋‚ด์žฅ
Obsidian ํ”Œ๋Ÿฌ๊ทธ์ธ (Auto LLM Wiki / Copilot / Smart Connections)vault ์•ˆ ์ฑ„ํŒ…์ฐฝ์— ์งˆ๋ฌธํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜๋งŒ
๋ฐ์Šคํฌํ†ฑ ์•ฑ (nashsu ๋“ฑ)์•ฑ ๋‚ด์žฅ ์ฑ„ํŒ…์•ฑ ์„ค์น˜๋งŒ

์–ด๋””์—๋„ โ€œ์งˆ์˜ ๊ธฐ๋Šฅ์„ ์ฝ”๋”ฉโ€ํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ์—†๋‹ค. ๋‚ด โ€œ๋ชซโ€์€ ์„ธ ๊ฐ€์ง€๋ฟ์ด๊ณ  ์ „๋ถ€ ์ฝ”๋”ฉ์ด ์•„๋‹ˆ๋‹ค โ€” โ‘  ๋„๊ตฌ ์„ ํƒ โ‘ก ํด๋” ์ ‘๊ทผ ํ—ˆ์šฉ โ‘ข ์‹คํ–‰ ๋น„์šฉ(ํด๋ผ์šฐ๋“œ๋ฉด ํ† ํฐ, ๋กœ์ปฌ ๋ชจ๋ธ์ด๋ฉด ์—†์Œ).

๋น ๋ฅธ ์งˆ์˜ ์ธํ„ฐํŽ˜์ด์Šค โ€” ์ฝ”๋”ฉ ์ค‘ ์ฆ‰์„ ์งˆ๋ฌธ (Alfred + ๋กœ์ปฌ LLM + Quicklook)

๊ฐœ๋ฐœ(์˜ˆ: Codex) ์ค‘์— โ€œ์–ด์ œ ์ •๋ฆฌํ•œ ๊ฒŒ ๋ญ์˜€์ง€?โ€๊ฐ€ ๋– ์˜ค๋ฅผ ๋•Œ, Obsidian์„ ์—ด์ง€ ์•Š๊ณ  ๊ทธ ์ž๋ฆฌ์—์„œ ๋ฌป๊ณ  ๋‹ต์„ ๋ฐ›๋Š” ํ๋ฆ„์ด๋‹ค. ๋‘ ์ œ์•ฝ์ด ์„ค๊ณ„๋ฅผ ์ •ํ•œ๋‹ค.

  • ์ฝ”๋”ฉ ํ„ฐ๋ฏธ๋„์— ๊ทธ๋ƒฅ ๋ฌผ์œผ๋ฉด ์•ˆ ๋œ๋‹ค โ€” ์ง„ํ–‰ ์ค‘ ์ž‘์—…๊ณผ ์ปจํ…์ŠคํŠธ๊ฐ€ ์„ž์ธ๋‹ค. ๊ทธ๋ž˜์„œ ์ฝ”๋”ฉ ์„ธ์…˜๊ณผ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ๋ณ„๋„ ํ”„๋กœ์„ธ์Šค๋กœ ๋ฌผ์–ด์•ผ ํ•œ๋‹ค
  • ๋˜์ ธ๋‘๊ณ  ๋ณ‘๋ ฌ๋กœ ๊ณ„์† ์ผํ•˜๊ณ  ์‹ถ๋‹ค โ€” ๋‹ต์ด ์ค€๋น„๋˜๋ฉด ๊ทธ๋•Œ ํ™•์ธ

์—”์ง„๊ณผ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค

  • ์—”์ง„ = ๋…ธํŠธ ํด๋”๋ฅผ ์ฝ์–ด ๋‹ตํ•˜๋Š” ํ—ค๋“œ๋ฆฌ์Šค ๋กœ์ปฌ LLM ํ˜ธ์ถœ (ํ•œ ๋ฒˆ ๋งŒ๋“ค๋ฉด ์žฌ์‚ฌ์šฉ)
  • ํŠธ๋ฆฌ๊ฑฐ = ์—”์ง„์„ ๋ถ€๋ฅด๋Š” ๋ฐฉ๋ฒ• โ€” ์—ฌ๊ธฐ์„  Alfred Powerpack ์›Œํฌํ”Œ๋กœ์šฐ(์ „์—ญ ํ•ซํ‚ค)

์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ„๋ฉด ์ฝ”๋”ฉ ์„ธ์…˜๊ณผ ๊ฒฉ๋ฆฌ๋˜๊ณ , ํŠธ๋ฆฌ๊ฑฐ๋Š” ๋‚˜์ค‘์— ๋ญ๋“  ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

์—”์ง„: ๋กœ์ปฌ LLM (Ollama)

ollama run <model>๋กœ ๋กœ์ปฌ ์‹คํ–‰ โ†’ ํด๋ผ์šฐ๋“œ ์ธ์ฆ ๋ถˆํ•„์š”, ์‚ฌ์„คยท์˜คํ”„๋ผ์ธ. ์ด ์ž‘์—…์€ โ€œ๋‚ด ๋…ธํŠธ๋ฅผ ๊ทผ๊ฑฐ๋กœ ์š”์•ฝยท์ข…ํ•ฉโ€์ด๋ผ ์ œ๊ณต๋œ ํ…์ŠคํŠธ์— grounded๋˜๋ฏ€๋กœ ์ค‘ํ˜• ๋กœ์ปฌ ๋ชจ๋ธ(8~14B)๋กœ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค. ํ•ต์‹ฌ ์ œ์•ฝ์€ ์ปจํ…์ŠคํŠธ ํ•œ๊ณ„ โ€” vault ์ „์ฒด๋ฅผ ๋„ฃ์œผ๋ฉด ์•ˆ ๋˜๊ณ , ๊ด€๋ จ ํŽ˜์ด์ง€๋งŒ ์ถ”๋ ค ๋„ฃ๋Š”๋‹ค. Ollama ๋ฐ๋ชฌ์€ ์ƒ์‹œ ์‹คํ–‰ํ•ด ๋‘”๋‹ค. (์ด ์—”์ง„์€ ์ดํ›„ ์ž์ฒด CLI llm-wiki query๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค โ€” ์•„๋ž˜ โ€œ์‹ค์ œ ๊ตฌํ˜„โ€ ์ฐธ์กฐ)

ํ๋ฆ„ (๊ธฐ๋Œ€ํ•œ 3๋‹จ๊ณ„)

  1. Alfred ํ•ซํ‚ค + ์งˆ๋ฌธ โ†’ ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐœ์‚ฌํ•˜๊ณ  Alfred ์ฐฝ์€ ์ฆ‰์‹œ ๋‹ซํž˜
  2. ๋‚˜๋Š” ๊ณง๋ฐ”๋กœ ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์—์„œ ๋ณ‘๋ ฌ ์ž‘์—… (์งˆ์˜๋Š” ๋…๋ฆฝ ํ”„๋กœ์„ธ์Šค๋ผ ์ฝ”๋”ฉ๊ณผ ์•ˆ ์„ž์ž„)
  3. ์™„๋ฃŒ ์‹œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ต์„ ์ €์žฅํ•˜๊ณ  Quicklook์„ ๋„์›Œ ํ™”๋ฉด์— ์ž๋™ ํŒ์—… โ†’ ์ฝ๊ณ  ๋‹ซ์Œ
sequenceDiagram
    autonumber
    actor Me as ๋‚˜
    participant AL as Alfred
    participant Q as ์งˆ์˜ ์Šคํฌ๋ฆฝํŠธ<br/>(๋ฐฑ๊ทธ๋ผ์šด๋“œ)
    participant LLM as ๋กœ์ปฌ LLM<br/>(Ollama)
    participant N as ๋…ธํŠธ ํด๋”
    participant QL as Quicklook
    Me->>AL: ํ•ซํ‚ค + ์งˆ๋ฌธ
    AL->>Q: ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ฐœ์‚ฌ (Alfred ์ฐฝ ๋‹ซํž˜)
    Note over Me: ๊ณง๋ฐ”๋กœ ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์—์„œ ๋ณ‘๋ ฌ ์ž‘์—…
    Q->>N: index.md ๋จผ์ € โ†’ ๊ด€๋ จ ํŽ˜์ด์ง€ ์„ ๋ณ„
    Q->>LLM: ์„ ๋ณ„ ๋…ธํŠธ + ์งˆ๋ฌธ
    LLM-->>Q: ์ข…ํ•ฉ ๋‹ต๋ณ€ (markdown)
    Q->>QL: /tmp/wiki-answer.md ์ €์žฅ ํ›„ qlmanage -p
    QL-->>Me: ์ž๋™ ํŒ์—… (Space/Esc๋กœ ๋‹ซ๊ธฐ)

ํ‘œ์‹œ: Quicklook (ํ™•์ •)

  • ์™„๋ฃŒ๋œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ qlmanage -p /tmp/wiki-answer.md๋ฅผ ํ˜ธ์ถœ โ†’ Quicklook ํŒจ๋„์ด ์ž๋™์œผ๋กœ ์•ž์œผ๋กœ ๋– ์˜ค๋ฅธ๋‹ค(๋ณ„๋„ ํด๋ฆญยท์•Œ๋ฆผ ๋ถˆํ•„์š”)
  • ๋‹จ์ผ ํŒŒ์ผ ์žฌ์‚ฌ์šฉ โ€” ๋งค ์งˆ์˜๊ฐ€ ๊ฐ™์€ /tmp/wiki-answer.md๋ฅผ ๋ฎ์–ด์“ฐ๋ฏ€๋กœ ํŒŒ์ผ์€ ํ•ญ์ƒ 1๊ฐœ, ๋ˆ„์  ์—†์Œ
  • ๋‹ซ๊ธฐ๋Š” Space/Esc โ€” Quicklook์€ Cmd+W๊ฐ€ ์•ˆ ๋จน๋Š”๋‹ค. ์ด ์ ์„ ๊ฐ์•ˆํ•˜๊ณ  Quicklook์„ ํƒํ•จ
  • ๋งˆํฌ๋‹ค์šด์„ ๋ Œ๋”๋งํ•˜๋ ค๋ฉด QLMarkdown ํ”Œ๋Ÿฌ๊ทธ์ธ(brew install --cask qlmarkdown) ์„ค์น˜, ์—†์œผ๋ฉด ํ‰๋ฌธ์œผ๋กœ ํ‘œ์‹œ
  • ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ์ž๋™ ํŒ์—…์ด๋ผ ์™„๋ฃŒ ์ˆœ๊ฐ„ ํฌ์ปค์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ(ํƒ€์ดํ•‘ ์ค‘ ๋Š๊ธธ ์ˆ˜ ์žˆ์Œ) โ€” ์•Œ๋ฆผ ๋Œ€๊ธฐ ๋Œ€์‹  ์ฆ‰์‹œ ๋…ธ์ถœ์„ ํƒํ•œ ๊ฒฐ๊ณผ

์ฃผ์˜ (Alfred ์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ)

Alfred Run Script๋Š” ์ตœ์†Œ ํ™˜๊ฒฝ์—์„œ ๋Œ๋ฏ€๋กœ ollamaยทqlmanage๋Š” ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ๋ถ€๋ฅด๊ณ , ๋‹ต๋ณ€ ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” /tmp/wiki-answer.md๋กœ ๊ณ ์ •ํ•ด ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

์ˆ˜์ง‘(ingest): ์ˆ˜๋™์ด ๊ธฐ๋ณธ, ์ž๋™ํ™”๋Š” ์˜ต์…˜

Karpathy์˜ ๊ธฐ๋ณธ์€ โ€œ์ˆ˜๋™ + ์‚ฌ๋žŒ ๊ฒ€ํ† โ€(ํ•œ ๋ฒˆ์— ํ•˜๋‚˜, ์š”์•ฝ ์ฝ๊ณ  ๊ฐ•์กฐ์  ์ง€์‹œ)๋‹ค. ๊ทธ ์œ„์—์„œ ๋งˆ์ฐฐ๋งŒ ์ž๋™ํ™”ํ•œ๋‹ค.

๋ฐฉ์‹ํŠธ๋ฆฌ๊ฑฐ์„ฑ๊ฒฉ
ํด๋” auto-watchsources/์— ํŒŒ์ผ ์ถ”๊ฐ€/์ˆ˜์ • ๊ฐ์ง€(์ˆ˜ ์ดˆ ํด๋ง) โ†’ ์ž๋™ ingest๋ฐ˜์ž๋™ (๋„ฃ๋Š” ๊ฑด ์‚ฌ๋žŒ)
Web Clipper ์›ํด๋ฆญ๋ฐฉ๋ฌธ ํŽ˜์ด์ง€๋ฅผ ๋‹จ์ถ•ํ‚ค๋กœ ํด๋ฆฝ โ†’ markdown ์ €์žฅ โ†’ ์ž๋™ ingest๋ฐ˜์ž๋™ (ํŽ˜์ด์ง€๋‹น 1ํด๋ฆญ)
Save to Wiki์ข‹์€ ์ฑ— ๋‹ต๋ณ€ ์ €์žฅ โ†’ ์—”ํ‹ฐํ‹ฐ/๊ฐœ๋… ์ž๋™ ์ถ”์ถœ๋ฐ˜์ž๋™
์Šค์ผ€์ค„ ์—์ด์ „ํŠธ์•ผ๊ฐ„ ์œ ์ง€๋ณด์ˆ˜ยท์ฃผ๊ฐ„ ์žฌ์กฐ์ •ยท์ž๋™ lint์ž๋™ (์ˆ˜์ง‘์ด ์•„๋‹Œ ์ •๋ฆฌ)

โ€œ์ ‘์†ํ•œ ์‚ฌ์ดํŠธ ์ž๋™ ingestโ€๋Š” ์ง€์–‘ํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ง• ํžˆ์Šคํ† ๋ฆฌ ๋ฌด์ธ ์ˆ˜์ง‘์€ (1) ๋Œ€๋ถ€๋ถ„ ์ง€์‹ ๊ฐ€์น˜ ์—†๋Š” ํŽ˜์ด์ง€๋กœ ์œ„ํ‚ค๋ฅผ ์˜ค์—ผ์‹œํ‚ค๊ณ (๋…ธ์ด์ฆˆ), (2) history-sniffing ์˜์—ญ์˜ ํ”„๋ผ์ด๋ฒ„์‹œ ์ด์Šˆ๋ฅผ ๋‚ณ์œผ๋ฉฐ, (3) โ€œ์‚ฌ๋žŒ์ด ํ๋ ˆ์ด์…˜โ€ ์ „์ œ์™€ ์ถฉ๋Œํ•œ๋‹ค. ์‹ค๋ฌด ์ •๋‹ต์€ โ€œ์ž๋™ ๊ฐ์ง€ + ์˜๋„์  ์„ ๋ณ„โ€ โ€” ๋„ฃ๋Š” ๋งˆ์ฐฐ์€ ์ž๋™ํ™”ํ•˜๋˜ ๋ฌด์—‡์„ ๋„ฃ์„์ง€๋Š” ์‚ฌ๋žŒ์ด 1ํด๋ฆญ์œผ๋กœ ๊ฒฐ์ •ํ•œ๋‹ค.

์›๋ณธ์„ ๊ณ ์น˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜ โ€” ์žฌ-ingest์™€ ๊ด€๊ณ„ ๊ฐฑ์‹ 

๋‚ด๊ฐ€ sources/์˜ ๋…ธํŠธ๋ฅผ ๊ณ ์น˜๋ฉด, wiki/ ํŒŒ์ƒ ๊ณ„์ธต์€ ๊ทธ ๋…ธํŠธ์— ๋Œ€ํ•ด stale(๋‚ก์Œ) ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์žฌ-ingest๊ฐ€ ํ•„์š”ํ•˜๋‹ค: LLM์ด ๋ฐ”๋€ ๋…ธํŠธ๋ฅผ ๋‹ค์‹œ ์ฝ์–ด ํŒŒ์ƒ ํŽ˜์ด์ง€(๊ด€๊ณ„ยท์š”์•ฝยท๊ฐ์‚ฌ)๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. ๊ฐœ๋…์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉด MOC์— ๋งํฌ๊ฐ€ ๋ถ™๊ณ , ์ด์ „ ๊ฐ์‚ฌ์—์„œ ์žกํžŒ ๋ชจ์ˆœ์ด ํ•ด์†Œ๋์œผ๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. ๋‚ด ๋…ธํŠธ ์ชฝ์€ ๊ทธ๋Œ€๋กœ, ํŒŒ์ƒ ๊ณ„์ธต๋งŒ ๋ฐ”๋€๋‹ค.

์žฌ-ingest๋Š” ๋ฐ”๋€ ๋…ธํŠธ + ๊ทธ๊ฑธ ์ฐธ์กฐํ•˜๋Š” ํŒŒ์ƒ ํŽ˜์ด์ง€๋งŒ ์ฆ๋ถ„ ๊ฐฑ์‹ ํ•˜๋ฉฐ(log.md์— ๊ธฐ๋ก), ํŠธ๋ฆฌ๊ฑฐ๋Š” ํด๋” auto-watch(์ž๋™)๋‚˜ ์ˆ˜๋™ ์š”์ฒญ์ด๋‹ค. ํŒŒ์ผ๋ช…์„ ๋ฐ”๊พธ๋ฉด(rename) ํŒŒ์ƒ ๋งํฌ๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ์–ด lint๊ฐ€ ๊ฐ์ง€ยท์ˆ˜์ •ํ•œ๋‹ค. ๋…ธํŠธ A์˜ ๋ณ€๊ฒฝ์ด โ€œA์™€ C์˜ ๊ด€๊ณ„โ€์— ์ฃผ๋Š” 2์ฐจ ํŒŒ๊ธ‰๊นŒ์ง€ ๋งž์ถ”๋ ค๋ฉด ์ฃผ๊ธฐ์  lint/์žฌ์กฐ์ •์„ ๊ฑธ์–ด๋‘”๋‹ค.

์—ฌ๊ธฐ์„œ ์‹คํšจ์„ฑ์˜ ํ•ต์‹ฌ์ด ๋‚˜์˜จ๋‹ค โ€” ํŒŒ์ƒ ๊ณ„์ธต์„ append-only(์ƒˆ ํŽ˜์ด์ง€๋งŒ ๊ณ„์† ์ถ”๊ฐ€)๋กœ ๋‘๋ฉด ๋‚ก์€ ๊ด€๊ณ„๊ฐ€ ์Œ“์—ฌ ๋ฌด๋„ˆ์ง„๋‹ค. ์žฌ-ingest๋กœ ๊ธฐ์กด ํŽ˜์ด์ง€๋ฅผ ๊ฐฑ์‹ (write-back)ํ•˜๊ณ , ์Šค์ผ€์ค„ ์žฌ์กฐ์ •์œผ๋กœ ์ตœ์‹ ์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.

AS-IS โ€” ์ˆœ์ง„ํ•œ append-only: ์Œ“์ผ์ˆ˜๋ก ๋ฌด๋„ˆ์ง

flowchart TB
    S1["์†Œ์Šค 1"] --> P["์ƒˆ ํŽ˜์ด์ง€๋งŒ ๊ณ„์† ์ถ”๊ฐ€ (append-only)"]
    S2["์†Œ์Šค 2"] --> P
    S3["์†Œ์Šค N"] --> P
    P --> C["๋ชจ์ˆœยท๋‚ก์€ ์ •๋ณด๊ฐ€ ํ•จ๊ป˜ ์ถ•์  (๋‘˜ ๋‹ค ์‚ด์•„์žˆ์Œ)"]
    C --> X["์ˆ˜๋ฐฑ ์†Œ์Šค ํ›„ ๋ถ•๊ดด โœ—"]

TO-BE โ€” write-back + ์Šค์ผ€์ค„ ์œ ์ง€๋ณด์ˆ˜

flowchart TB
    S["์ƒˆ ์†Œ์Šค"] --> ING["Ingest: ๊ธฐ์กด ํŽ˜์ด์ง€๋ฅผ ๊ฐฑ์‹  (write-back)"]
    ING --> W[("์œ„ํ‚ค")]
    W --> RECON["์Šค์ผ€์ค„ ์žฌ์กฐ์ •: ์ตœ์‹ ์„ฑยท๊ถŒ์œ„ยท์‹ ๋ขฐ๋„๋กœ ๋ชจ์ˆœ ํ•ด์†Œ"]
    RECON -->|"๋‚ก์€ ์ฃผ์žฅ์€ ๋‚ ์งœ ์ด๋ ฅ์œผ๋กœ ๋ณด๊ด€"| W
    LINT["์Šค์ผ€์ค„ Lint: ๊ณ ์•„ยทstaleยท๊นจ์ง„ ๋งํฌ"] --> W

auto-watch๋Š” ์ง์ ‘ ๊ฐœ๋ฐœํ•˜๋‚˜ โ€” ์•„๋‹ˆ์˜ค

์žฌ-ingest ์ž๋™ํ™”(auto-watch)๋Š” ๋Œ€๊ฐœ ์ง์ ‘ ๊ฐœ๋ฐœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์„ธ ์ˆ˜์ค€์œผ๋กœ ๊ฐˆ๋ฆฐ๋‹ค.

  • ๋‚ด์žฅ (์ฝ”๋“œ 0) โ€” Obsidian Auto LLM Wiki ํ”Œ๋Ÿฌ๊ทธ์ธ, nashsu ๋ฐ์Šคํฌํ†ฑ ์•ฑ ๋“ฑ์€ ํด๋” ๋ณ€๊ฒฝ ๊ฐ์ง€ยท์žฌ-ingest๊ฐ€ ๋‚ด์žฅ. ์„ค์น˜ยท์„ค์ •๋งŒ
  • ๊ธฐ์กด ์œ ํ‹ธ ๊ธ€๋ฃจ (ํ•œ ์ค„) โ€” ์ˆœ์ˆ˜ Claude Code๋ฉด fswatch sources/ | xargs โ€ฆ ํ•œ ์ค„, ๋˜๋Š” launchd/cron์œผ๋กœ ์•ผ๊ฐ„ ์žฌ-ingest ์Šค์ผ€์ค„. ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋„๊ตฌ ์—ฐ๊ฒฐ
  • ์ˆ˜๋™ (์„ค์ • 0) โ€” ๋…ธํŠธ ๊ณ ์นœ ๋’ค โ€œ๋ฐ”๋€ ๋…ธํŠธ ์žฌ-ingest ํ•ด์ค˜โ€ ํ•œ๋งˆ๋””

๊ฐœ์ธ ํ•™์Šต vault๋Š” ํŽธ์ง‘์ด ์žฆ์ง€ ์•Š์•„ ์‹ค์‹œ๊ฐ„ ๊ฐ์‹œ ์ž์ฒด๊ฐ€ ๊ณผํ•˜๋‹ค. ์‹ค์‹œ๊ฐ„ watch๋Š” ์†Œ์Šค๊ฐ€ ๊ณ„์† ์Ÿ์•„์ง€๋Š” ๋Œ€๋Ÿ‰ ํŒŒ์ดํ”„๋ผ์ธ์šฉ์ด๋‹ค. ๊ถŒ๊ณ : Obsidian ์œ ์ €๋ผ๋ฉด Auto LLM Wiki ํ”Œ๋Ÿฌ๊ทธ์ธ(์„ค์น˜๋งŒ), ์•„๋‹ˆ๋ฉด ์ˆ˜๋™ ์žฌ-ingest๋‚˜ ์•ผ๊ฐ„ ์Šค์ผ€์ค„๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค.

์Šคํ‚ค๋งˆ ๋ฌธ์„œ (์‹คํšจ์„ฑ์˜ 90%)

LLM์„ โ€œ์ผ๋ฐ˜ ์ฑ—๋ด‡โ€์ด ์•„๋‹ˆ๋ผ โ€œ๊ทœ์œจ ์žˆ๋Š” ์œ„ํ‚ค ๊ด€๋ฆฌ์žโ€๋กœ ๋งŒ๋“œ๋Š” ์„ค์ • ๋ฌธ์„œ(SCHEMA.md ๋˜๋Š” CLAUDE.md). ์ตœ์†Œํ•œ ์•„๋ž˜๋ฅผ ๋ช…์‹œํ•œ๋‹ค.

  • ๋ถˆ๋ณ€ ๊ทœ์น™ โ€” sources/๋Š” LLM ์ฝ๊ธฐ ์ „์šฉ, ์ƒ์„ฑยท์ˆ˜์ •์€ wiki/์—๋งŒ
  • ํŽ˜์ด์ง€ ํฌ๋งท โ€” YAML frontmatter: title / tags / category / updated / sources
  • ๋ช…๋ช…ยท๋งํฌ ๊ทœ์น™ โ€” ํŒŒ์ผ๋ช… ํ‘œ๊ธฐ, [[wiki-link]] ๊ทœ์น™
  • ๋ชจ์ˆœ ์ฒ˜๋ฆฌ โ€” ์ƒ์ถฉ ์‹œ ์ตœ์‹ ์„ฑยท๊ถŒ์œ„ยท์‹ ๋ขฐ๋„ ์šฐ์„ ์ˆœ์œ„, ์ง„ ์ฃผ์žฅ์€ ๋‚ ์งœ ์ด๋ ฅ์œผ๋กœ ๋ณด๊ด€
  • ๋ช…๋ น ์ •์˜ โ€” ingest / query / lint ์ ˆ์ฐจ

๊ฒ€์ƒ‰์€ ๋ฌด-๋ฒกํ„ฐ๋กœ ์‹œ์ž‘

๊ฐœ์ธ/ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์—์„  ํ‚ค์›Œ๋“œ + ํƒœ๊ทธ + grep๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค(Karpathy ๊ถŒ์žฅ). ๋ฒกํ„ฐ ์ž„๋ฒ ๋”ฉ์€ ์œ„ํ‚ค๊ฐ€ ์ˆ˜์ฒœ ํŽ˜์ด์ง€๋กœ ์ปค์ง„ ๋’ค ์˜ต์…˜์œผ๋กœ ์–น์œผ๋ฉด ๋œ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฒกํ„ฐ DB๋ฅผ ์„ธ์šฐ๋Š” ๊ฒƒ์€ ๊ณผ์„ค๊ณ„๋‹ค.

์‹ค์ œ ๊ตฌํ˜„์—์„œ๋Š” ์—ฌ๊ธฐ์„œ ํ•œ ๋‹จ๊ณ„ ๋‚˜์•„๊ฐ€ SQLite FTS5(bm25) ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰ + ์ž„๋ฒ ๋”ฉ(bge-m3) ํ•˜์ด๋ธŒ๋ฆฌ๋“œ๋ฅผ ํƒํ–ˆ๋‹ค โ€” ๋‹จ ๋ณ„๋„ ๋ฒกํ„ฐ DB ์—†์ด, Node ๋‚ด์žฅ node:sqlite ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ์žฌ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ์บ์‹œ๋กœ ์“ฐ๋Š” ์„ ์ด๋ผ โ€œ๋ฒกํ„ฐ DB ๊ณผ์„ค๊ณ„โ€ ๊ฒฝ๊ณ„๋Š” ๋„˜์ง€ ์•Š๋Š”๋‹ค.

์‹œ์ž‘ ์ ˆ์ฐจ (Model A ๊ธฐ์ค€, ๋‹จ๊ณ„๋ณ„)

  1. ์ด๋ฏธ ์žˆ๋Š” Obsidian vault๋ฅผ sources/๋กœ ์‚ผ๊ฑฐ๋‚˜ sources/ยทwiki/ ํด๋”์™€ SCHEMA.md ์ƒ์„ฑ
  2. SCHEMA.md์— โ€œsources/๋Š” ๋ถˆ๋ณ€, wiki/์—๋งŒ ํŒŒ์ƒ ์ƒ์„ฑโ€ ๊ทœ์น™๊ณผ ํŽ˜์ด์ง€ ํฌ๋งทยท๋ช…๋ช…ยท๋ชจ์ˆœ ์ฒ˜๋ฆฌยท๋ช…๋ น ์ •์˜
  3. LLM ๋„๊ตฌ๋ฅผ ๊ทธ ํด๋”์— ์—ฐ๊ฒฐ (Claude Code ์‹คํ–‰ / Obsidian ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜)
  4. ๋…ธํŠธ ๋ช‡ ๊ฐœ๋กœ ingest โ†’ wiki/์— ์ƒ๊ธด ๊ด€๊ณ„ยท์ƒ‰์ธยท๊ฐ์‚ฌ๋ฅผ ์‚ฌ๋žŒ์ด ๊ฒ€ํ† , ์Šคํ‚ค๋งˆ๋ฅผ ๋‹ค๋“ฌ์Œ
  5. ์งˆ์˜๋กœ ์‚ฌ์šฉ โ€” โ€œ๋‚ด ๋…ธํŠธ ๊ธฐ์ค€ X ์š”์•ฝโ€ ๋“ฑ ์ธ์šฉ ๋‹ต๋ณ€ ํ™•์ธ
  6. ํŽธ์ง‘์ด ์žฆ์•„์ง€๋ฉด auto-watch(ํ”Œ๋Ÿฌ๊ทธ์ธ)๋‚˜ ์•ผ๊ฐ„ ์žฌ-ingestยทlint ์Šค์ผ€์ค„๋กœ ์ตœ์‹ ํ™” ์ž๋™ํ™” (๋ณ€๊ฒฝ์€ diff/๋ฒ„์ „ ํžˆ์Šคํ† ๋ฆฌ๋กœ ๋˜๋Œ๋ฆผ ๊ฐ€๋Šฅํ•˜๊ฒŒ)

์‹ค์ œ ๊ตฌํ˜„ โ€” local-llm-wiki CLI

์ด ๋ฌธ์„œ์˜ ์„ค๊ณ„๋ฅผ ์‹ค์ œ ์ฝ”๋“œ๋กœ ์˜ฎ๊ธด ๊ฒฐ๊ณผ๋ฌผ์ด heepie-repo/llm-wiki(TypeScript CLI, ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ 0)๋‹ค. Model A ์›์น™ ๊ทธ๋Œ€๋กœ โ€” source_root(๋‚ด ๋…ธํŠธ)๋Š” ์ฝ๊ธฐ ์ „์šฉ์„ ๋‹ค์ธต์œผ๋กœ ๊ฐ•์ œ(symlink ํƒˆ์ถœ ์ฐจ๋‹จยท๊ฒฝ๋กœ ๊ฒฉ๋ฆฌ ๊ฒ€์ฆ)ํ•˜๊ณ , ์ธ๋ฑ์Šคยท๋ฆฌํฌํŠธยทํ”„๋กœํ•„์€ ์ „๋ถ€ vault ๋ฐ–(~/Library/Application Support/local-llm-wiki/, review_output/)์— ๋‘”๋‹ค. ํŒŒ์ƒ ๊ณ„์ธต์€ md ์œ„ํ‚ค ํŽ˜์ด์ง€ ๋Œ€์‹  ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค + ๋‚ ์งœ๋ณ„ ๊ฐ์‚ฌ ๋ฆฌํฌํŠธ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค: ์งˆ์˜๋Š” ๋งค๋ฒˆ ์žฌํ•ฉ์„ฑํ•˜๋˜, โ€˜๋ณต๋ฆฌ ์ถ•์ โ€™์€ ๋ฆฌํฌํŠธ์˜ TODO๋ฅผ ๋ณด๊ณ  ์‚ฌ๋žŒ์ด ์›๋ณธ์„ ๊ณ ์น˜๋Š” human write-back ๋ฃจํ”„๋กœ ์ผ์–ด๋‚œ๋‹ค.

๋ ˆ์ด์–ด ๊ตฌ์กฐ

flowchart TB
    subgraph L1["CLI ๊ณ„์ธต (cli.ts)"]
        CMD["ingest ยท audit ยท batch ยท search ยท query ยท status ยท launchd"]
    end
    subgraph L2["์—”์ง„ ๊ณ„์ธต"]
        IDX["WikiIndexer<br/>์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ + batch lock"]
        QE["QueryEngine<br/>ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰ + ์ธ์šฉ ๊ฒ€์ฆ"]
        AE["AuditEngine<br/>์ค‘๋ณตยท๋ถ€์กฑยท์ƒ์ถฉ ๊ฐ์‚ฌ"]
        RPT["Report Writer<br/>๋‚ ์งœ๋ณ„ ๊ฒ€ํ†  ๋ฆฌํฌํŠธ"]
    end
    subgraph L3["Provider ์ธํ„ฐํŽ˜์ด์Šค (providers.ts) โ€” ๊ต์ฒด ์ง€์ "]
        CP["ChatProvider"]
        EP["EmbeddingProvider"]
        SP["SemanticConflictProvider"]
    end
    subgraph L4["๊ตฌํ˜„์ฒด"]
        OL["Ollama (ollama.ts)<br/>qwen3:14b ยท bge-m3"]
        LM["LM Studio ๋“ฑ OpenAI ํ˜ธํ™˜<br/>(์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๊ต์ฒด)"]
    end
    subgraph L5["์ €์žฅ ๊ณ„์ธต โ€” ์ „๋ถ€ source_root ๋ฐ–"]
        PF["ProfileStore (JSON ํ”„๋กœํ•„)"]
        IS[("state.sqlite<br/>FTS5 bm25 ยท ์ž„๋ฒ ๋”ฉ ์บ์‹œ ยท ๊ฐ์‚ฌ lifecycle")]
        OUT["review_output/*.md ๋ฆฌํฌํŠธ"]
    end
    SRC[("source_root โ€” ๋‚ด ๋…ธํŠธ<br/>์ฝ๊ธฐ ์ „์šฉ, ๋ถˆ๋ณ€ ๊ฐ•์ œ")]
    QLV["QuickLook ํŒ์—…"]

    CMD --> IDX
    IDX --> QE
    IDX --> AE
    IDX --> RPT
    IDX --> PF
    SRC -->|"์ฝ๊ธฐ๋งŒ"| IDX
    QE --> CP
    QE --> EP
    AE --> SP
    CP --> OL
    EP --> OL
    SP --> OL
    CP -.-> LM
    EP -.-> LM
    IDX --> IS
    QE --> IS
    AE --> IS
    RPT --> OUT
    QE --> QLV

์ €์žฅ ๊ณ„์ธต์˜ state.sqlite๋Š” ํŒŒ์ƒ ์บ์‹œ๋‹ค(ingest --full๋กœ ์–ธ์ œ๋“  ์žฌ์ƒ์„ฑ) โ€” ์œ ์ผํ•œ ์˜ˆ์™ธ๋Š” ๊ฐ์‚ฌ ์ด์Šˆ์˜ new/persistent/resolved ์ด๋ ฅ(lifecycle)์œผ๋กœ, ์ด๊ฒƒ๋งŒ์€ ์ง€์šฐ๋ฉด ํ•ด๊ฒฐ ์ถ”์ ์ด ๋ฆฌ์…‹๋œ๋‹ค.

์งˆ์˜ ์‹œํ€€์Šค (Alfred โ†’ ๋‹ต๋ณ€)

sequenceDiagram
    autonumber
    actor Me as ๋‚˜ (Alfred)
    participant CLI as llm-wiki query
    participant QE as QueryEngine
    participant DB as state.sqlite
    participant EP as EmbeddingProvider<br/>(bge-m3)
    participant CP as ChatProvider<br/>(qwen3:14b)
    participant QL as QuickLook
    Me->>CLI: ์งˆ๋ฌธ (--quicklook)
    CLI->>QE: query(์งˆ๋ฌธ)
    QE->>DB: FTS5 bm25 ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰
    QE->>EP: ์งˆ๋ฌธ ์ž„๋ฒ ๋”ฉ (+๋ฏธ๊ณ„์‚ฐ ์ฒญํฌ ๋ฐฑํ•„)
    EP-->>QE: ๋ฒกํ„ฐ
    QE->>DB: ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„ ์ƒ์œ„ ์ฒญํฌ
    Note over QE: RRF๋กœ ํ‚ค์›Œ๋“œยท๋ฒกํ„ฐ ์ˆœ์œ„ ๊ฒฐํ•ฉ โ†’ ์ƒ์œ„ 8์ฒญํฌ
    QE->>CP: ๊ทผ๊ฑฐ ์ฒญํฌ + ์งˆ๋ฌธ (๊ทผ๊ฑฐ๋งŒ ์‚ฌ์šฉ, ์ธ์šฉ ํ•„์ˆ˜)
    CP-->>QE: ๋‹ต๋ณ€ + [C#] ์ธ์šฉ ๋งˆ์ปค
    QE->>QE: ์ธ์šฉ ๋งˆ์ปค ๊ฒ€์ฆ (๋ฌด์ธ์šฉยท๋ฏธ์ง€ ๋งˆ์ปค โ†’ ์‹คํŒจ ์ฒ˜๋ฆฌ)
    CLI->>QL: answer.md(0600) ์ €์žฅ โ†’ qlmanage -p
    QL-->>Me: ์ž๋™ ํŒ์—… (์ธ์šฉยท๊ฒฝ๊ณ  ํฌํ•จ)

์ธ์šฉ ๊ฒ€์ฆ์ด fail-closed๋ผ๋Š” ์ ์ด ํ•ต์‹ฌ์ด๋‹ค โ€” ๋‹ต๋ณ€์— ์•Œ๋ ค์ง„ [C#] ๋งˆ์ปค๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋ชจ๋ฅด๋Š” ๋งˆ์ปค๊ฐ€ ์žˆ์œผ๋ฉด ์„ฑ๊ณต์œผ๋กœ ์œ„์žฅํ•˜์ง€ ์•Š๊ณ  ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค(ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜ ๊ฐ€๋“œ๋„ ๊ทผ๊ฑฐ ํ…์ŠคํŠธ ์•ž์— ๋ช…์‹œ).

๋ฐฐ์น˜ ์ชฝ์€ launchd๊ฐ€ ๋งค์ผ ์•„์นจ ์‹คํ–‰ํ•œ๋‹ค: batch lock ํš๋“ โ†’ ๋ณ€๊ฒฝ ํŒŒ์ผ๋งŒ ingest(sha256 ๋น„๊ต) โ†’ ๊ตฌ์กฐ ๊ฐ์‚ฌ(์ค‘๋ณตยท๋ถ€์กฑ ๊ฐœ๋…) + semantic ์ƒ์ถฉ ๊ฐ์‚ฌ โ†’ review_output/์— ๋‚ ์งœ ๋ฆฌํฌํŠธ ์ƒ์„ฑ โ†’ ๋‚ด๊ฐ€ ๋ฆฌํฌํŠธ์˜ TODO๋ฅผ ๋ณด๊ณ  ์›๋ณธ์„ ์ˆ˜์ • โ†’ ๋‹ค์Œ batch๊ฐ€ โ€œ์ด์ „ ์‹คํ–‰ ์ดํ›„ ํ•ด๊ฒฐ๋œ ํ•ญ๋ชฉโ€์œผ๋กœ ๊ฐ์ง€. ์ด ๋ฃจํ”„๊ฐ€ ์œ„ TO-BE ๋‹ค์ด์–ด๊ทธ๋žจ์˜ โ€œ์Šค์ผ€์ค„ ์žฌ์กฐ์ •โ€์˜ ์‹ค์ œ ๋ชจ์Šต์ด๋‹ค.

์—”์ง„ ๊ต์ฒด โ€” LM Studio ์ง€์› ๊ตฌํ˜„๋จ

QueryEngineยทAuditEngine์€ ChatProviderยทEmbeddingProviderยทSemanticConflictProvider ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•œ๋‹ค. ์ด์ œ LM Studio(๋ฐ OpenAI ํ˜ธํ™˜ ์„œ๋ฒ„)๋ฅผ ์œ„ํ•œ openai.ts ๊ตฌํ˜„์ฒด๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๊ณ , cli.ts๊ฐ€ profile.provider(ollama|lmstudio)์™€ baseUrl๋กœ ๋ฐฑ์—”๋“œ๋ฅผ ๊ณ ๋ฅด๋Š” ํŒฉํ† ๋ฆฌ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ฆ‰ Ollama๋Š” ์„ ํƒ์ด๊ณ  LM Studio๋งŒ์œผ๋กœ ์™„๊ฒฐ๋œ๋‹ค. ๋‹ค๋งŒ ์šด์˜์ƒ launchd ์ƒˆ๋ฒฝ ๋ฐฐ์น˜๊นŒ์ง€ ์“ฐ๋ ค๋ฉด LM Studio๋Š” headless ์„œ๋ฒ„(lms server start)๋ฅผ ์ƒ์‹œ๋กœ ๋‘ฌ์•ผ ํ•ด์„œ, ๋ฐ๋ชฌ ์šด์˜์€ Ollama๊ฐ€ ๋” ๋‹จ์ˆœํ•˜๋‹ค.

์„ค๊ณ„ ๋Œ€๋น„ ๋‹ฌ๋ผ์ง„ ์ 

  • ๊ฒ€์ƒ‰: grep ๋Œ€์‹  SQLite FTS5 + ์ž„๋ฒ ๋”ฉ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ (์œ„ โ€œ๊ฒ€์ƒ‰์€ ๋ฌด-๋ฒกํ„ฐ๋กœ ์‹œ์ž‘โ€ ์ฐธ์กฐ)
  • ingest ๋Œ€์ƒ: ์ „์ฒด .md ์Šค์บ” ๋Œ€์‹  git ์ถ”์  ํŒŒ์ผ(git ls-files)๋งŒ โ€” node_modules/.gitignore ์ž๋™ ์ œ์™ธ, ํŒŒ์ผํƒ€์ž… ์„ค์ •(๊ธฐ๋ณธ md)
  • Quicklook ํŒŒ์ผ: ๋‹จ์ผ ํŒŒ์ผ ์žฌ์‚ฌ์šฉ ๋Œ€์‹  ์งˆ์˜๋งˆ๋‹ค ์ž„์‹œ ํด๋”(0600 ๊ถŒํ•œ) ์ƒ์„ฑ โ€” ํ•ฉ์˜ํ–ˆ๋˜ ๋‹จ์ผ ์žฌ์‚ฌ์šฉ ๋ฐฉ์‹์œผ๋กœ ์ •๋ฆฌ ์˜ˆ์ •
  • ํŒŒ์ƒ ๊ณ„์ธต: MOC md ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์ธ๋ฑ์Šค+๋ฆฌํฌํŠธ โ€” Obsidian ๋ฐฑ๋งํฌ ๊ทธ๋ž˜ํ”„ ์—ฐ๊ฒฐ ์ด์ ์€ ์•„์ง ๋ฏธ๊ตฌํ˜„

ingest๋ž€ ๋ฌด์—‡์ธ๊ฐ€ โ€” mock ์˜ˆ์‹œ๋กœ ํ•œ ๋ฒˆ์— ์ดํ•ด

ingest = ๋‚ด Markdown์„ โ€œ๊ฒ€์ƒ‰ยท๊ฐ์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฐ(chunk)๋“คโ€๋กœ ๋ถ„ํ•ดํ•ด, ์›๋ณธ ๋ฐ–์˜ ์ƒ‰์ธ DB์— ์ ์žฌํ•˜๋Š” ๊ฒƒ. ์›๋ณธ์€ ํ•œ ๊ธ€์ž๋„ ์•ˆ ๋ฐ”๋€๋‹ค(์ฝ๊ธฐ๋งŒ). ์•„๋ž˜ mock ํŒŒ์ผ ํ•˜๋‚˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ˜•ยท์ €์žฅ๋˜๋Š”์ง€ ๋”ฐ๋ผ๊ฐ€๋ฉด ๊ฐœ๋…์ด ์žกํžŒ๋‹ค.

์ž…๋ ฅ โ€” sources/RAG.md

---
tags: [ai, rag]
aliases: [๊ฒ€์ƒ‰์ฆ๊ฐ•์ƒ์„ฑ]
---
 
# RAG
 
RAG๋Š” ์งˆ์˜๋งˆ๋‹ค ์›๋ฌธ์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค. [[LLM Wiki]]์™€ ๋Œ€๋น„๋œ๋‹ค.
 
## ํ•œ๊ณ„
 
๋งค๋ฒˆ ์žฌ๊ฒ€์ƒ‰ํ•˜๋ฏ€๋กœ [[LLM Wiki]] ๋Œ€๋น„ ์ถ•์ ์ด ์—†๋‹ค.

1๋‹จ๊ณ„: ํŒŒ์‹ฑ (parseMarkdown) โ€” ๋ฌด์—‡์„ ๋ฝ‘์•„๋‚ด๋‚˜

  • title = ๋ณธ๋ฌธ ์ฒซ H1 โ†’ "RAG"
  • tags = frontmatter โ†’ ["ai","rag"]
  • aliases = frontmatter โ†’ ["๊ฒ€์ƒ‰์ฆ๊ฐ•์ƒ์„ฑ"]
  • wikilinks / ์ฐธ์กฐ ์ˆ˜ = ๋ณธ๋ฌธ์˜ [[...]] ์ง‘๊ณ„ โ†’ [[LLM Wiki]] 2ํšŒ (๊ฐ์‚ฌ์˜ โ€œ๋ถ€์กฑํ•œ ๊ฐœ๋…โ€ ํŒ์ • ๊ทผ๊ฑฐ)
  • chunks = heading ๋‹จ์œ„๋กœ ์ชผ๊ฐ  ์กฐ๊ฐ โ€” ์ด๊ฒŒ ํ•ต์‹ฌ. ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ heading ๋ธ”๋ก์ด ๊ฒ€์ƒ‰ยท์ธ์šฉ์˜ ์ตœ์†Œ ๋‹จ์œ„๊ฐ€ ๋œ๋‹ค

2๋‹จ๊ณ„: ์ €์žฅ (state.sqlite) โ€” ์–ด๋–ค ๊ตฌ์กฐ๋กœ ์–ด๋””์—

์ €์žฅ ์œ„์น˜: ~/Library/Application Support/local-llm-wiki/projects/<project-id>/state.sqlite (vault ๋ฐ–, ์ง€์›Œ๋„ ingest --full๋กœ ์žฌ์ƒ์„ฑ๋˜๋Š” ์บ์‹œ)

flowchart LR
    MD["sources/RAG.md<br/>(๋‚ด ์›๋ณธ, ๋ถˆ๋ณ€)"]
    P["parseMarkdown()<br/>frontmatter ยท H1 ยท [[๋งํฌ]] ยท heading๋ณ„ chunk"]
    subgraph DB["state.sqlite (vault ๋ฐ–)"]
        SR["sources 1ํ–‰<br/>titleยทtagsยทaliasesยทwikilinks"]
        CH["chunks 2ํ–‰<br/>headingยทline๋ฒ”์œ„ยท๋ณธ๋ฌธ"]
        FT["chunks_fts 2ํ–‰<br/>bm25 ๊ฒ€์ƒ‰์šฉ ๋ฏธ๋Ÿฌ"]
    end
    MD -->|"์ฝ๊ธฐ๋งŒ"| P
    P --> SR
    P --> CH
    CH --> FT

sources (1ํ–‰) โ€” ๋ฌธ์„œ 1๊ฐœ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

pathtitletags_jsonaliases_jsonwikilink_refs_jsonsha256
RAG.mdRAG["ai","rag"]["๊ฒ€์ƒ‰์ฆ๊ฐ•์ƒ์„ฑ"][{"target":"LLM Wiki","count":2}](ํŒŒ์ผ ํ•ด์‹œ)

chunks (2ํ–‰) โ€” heading ๋‹จ์œ„ ์กฐ๊ฐ. line_start~line_end๊ฐ€ ๋‚˜์ค‘์— ์ธ์šฉ์˜ ์œ„์น˜๊ฐ€ ๋จ

ordinalheadinglevellinetext(์š”์•ฝ)
0RAG12โ€“5# RAG โ€ฆ [[LLM Wiki]]์™€ ๋Œ€๋น„๋œ๋‹ค.
1RAG > ํ•œ๊ณ„26โ€“9## ํ•œ๊ณ„ โ€ฆ ์ถ•์ ์ด ์—†๋‹ค.

(๊ฐ chunk์—” chunk_id = sha256(path, ํŒŒ์ผํ•ด์‹œ, ordinal, heading)[:24]๊ฐ€ ๋ถ™์–ด ํŒŒ์ผ์ด ๋ฐ”๋€Œ๋ฉด ์ž๋™์œผ๋กœ ๋‹ค๋ฅธ id๊ฐ€ ๋œ๋‹ค)

chunks_fts (2ํ–‰) โ€” ์œ„ chunk์˜ text๋ฅผ FTS5๋กœ ๋ฏธ๋Ÿฌ๋งํ•œ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค. search/query๋Š” ์—ฌ๊ธฐ์— bm25๋กœ ํ‚ค์›Œ๋“œ ๋งค์นญํ•œ ๋’ค chunksยทsources์™€ joinํ•ด โ€œ์–ด๋А ํŒŒ์ผ ์–ด๋А heading ๋ช‡ ๋ฒˆ์งธ ์ค„โ€๊นŒ์ง€ ์งš์–ด ์ธ์šฉํ•œ๋‹ค. (์ž„๋ฒ ๋”ฉ์€ ์ด ๋‹จ๊ณ„์—์„œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ , query ์ค‘ ํ•„์š”ํ•  ๋•Œ chunk_embeddings์— ์ฑ„์›Œ์ง„๋‹ค)

3๋‹จ๊ณ„: ์ฆ๋ถ„ ๋™์ž‘ โ€” ๋‹ค์‹œ ingestํ•˜๋ฉด

  • ํŒŒ์ผ์˜ sha256์„ ๋น„๊ต โ†’ ์•ˆ ๋ฐ”๋€ ํŒŒ์ผ์€ ๊ฑด๋„ˆ๋œ€(unchanged), ๋ฐ”๋€ ํŒŒ์ผ๋งŒ ์ง€์šฐ๊ณ  ๋‹ค์‹œ ๋„ฃ์Œ, ์‚ฌ๋ผ์ง„ ํŒŒ์ผ์€ ์ธ๋ฑ์Šค์—์„œ ์‚ญ์ œ
  • ๊ทธ๋ž˜์„œ ์žฌ-ingest๋Š” ๋ฐ”๋€ ๊ฒƒ๋งŒ ์ฒ˜๋ฆฌํ•ด ๋น ๋ฅด๋‹ค
  • query๋Š” ์‹คํ–‰ ์ง์ „์— ์ด ์ฆ๋ถ„ ingest๋ฅผ ์ž๋™์œผ๋กœ 1ํšŒ ๋Œ๋ฆฐ๋‹ค(์ž„๋ฒ ๋”ฉ ์ œ์™ธ) โ†’ ๋ฐฉ๊ธˆ ์ถ”๊ฐ€ยท์ˆ˜์ •ํ•œ ๋…ธํŠธ๋„ ๊ทธ ์งˆ์˜์—์„œ ๋ฐ”๋กœ ์žกํž˜. ๋„๋ ค๋ฉด --no-refresh

์™œ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ chunk๋กœ ์ชผ๊ฐœ๋‚˜

์งˆ๋ฌธ์— ๋‹ตํ•  ๋•Œ โ€œ์ด ํŒŒ์ผ ์–ด๋”˜๊ฐ€์— ์žˆ์Œโ€์ด ์•„๋‹ˆ๋ผ **โ€œRAG.md์˜ ํ•œ๊ณ„ ์„น์…˜ 6โ€“9๋ฒˆ์งธ ์ค„โ€**์ฒ˜๋Ÿผ ๊ทผ๊ฑฐ๋ฅผ ์ •ํ™•ํžˆ ์งš๊ณ  ์ธ์šฉ([C1])ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. heading ๋‹จ์œ„ chunk๊ฐ€ ์žˆ์–ด์•ผ ๊ธด ๋ฌธ์„œ์—์„œ ๊ด€๋ จ ์กฐ๊ฐ๋งŒ ๊ณจ๋ผ LLM์— ๋„ฃ๊ณ (์ปจํ…์ŠคํŠธ ์ ˆ์•ฝ), ๋‹ต๋ณ€์˜ ๊ฐ ์ฃผ์žฅ์— ์ •ํ™•ํ•œ ์ถœ์ฒ˜๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ