- 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 Code | vault ํด๋์์ ์ด๊ณ ์ง๋ฌธ โ ํ์ผ ์ฝ๊ณ ๋ต๋ณ | ๊ทธ ํด๋์์ ์คํ (๊ฐ๋ฐ 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๋จ๊ณ)
- Alfred ํซํค + ์ง๋ฌธ โ ์ํฌํ๋ก์ฐ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐ์ฌํ๊ณ Alfred ์ฐฝ์ ์ฆ์ ๋ซํ
- ๋๋ ๊ณง๋ฐ๋ก ๋ค๋ฅธ ํฐ๋ฏธ๋์์ ๋ณ๋ ฌ ์์ (์ง์๋ ๋ ๋ฆฝ ํ๋ก์ธ์ค๋ผ ์ฝ๋ฉ๊ณผ ์ ์์)
- ์๋ฃ ์ ์คํฌ๋ฆฝํธ๊ฐ ๋ต์ ์ ์ฅํ๊ณ 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-watch | sources/์ ํ์ผ ์ถ๊ฐ/์์ ๊ฐ์ง(์ ์ด ํด๋ง) โ ์๋ 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 ๊ธฐ์ค, ๋จ๊ณ๋ณ)
- ์ด๋ฏธ ์๋ Obsidian vault๋ฅผ
sources/๋ก ์ผ๊ฑฐ๋sources/ยทwiki/ํด๋์SCHEMA.md์์ฑ SCHEMA.md์ โsources/๋ ๋ถ๋ณ,wiki/์๋ง ํ์ ์์ฑโ ๊ท์น๊ณผ ํ์ด์ง ํฌ๋งทยท๋ช ๋ช ยท๋ชจ์ ์ฒ๋ฆฌยท๋ช ๋ น ์ ์- LLM ๋๊ตฌ๋ฅผ ๊ทธ ํด๋์ ์ฐ๊ฒฐ (Claude Code ์คํ / Obsidian ํ๋ฌ๊ทธ์ธ ์ค์น)
- ๋
ธํธ ๋ช ๊ฐ๋ก ingest โ
wiki/์ ์๊ธด ๊ด๊ณยท์์ธยท๊ฐ์ฌ๋ฅผ ์ฌ๋์ด ๊ฒํ , ์คํค๋ง๋ฅผ ๋ค๋ฌ์ - ์ง์๋ก ์ฌ์ฉ โ โ๋ด ๋ ธํธ ๊ธฐ์ค X ์์ฝโ ๋ฑ ์ธ์ฉ ๋ต๋ณ ํ์ธ
- ํธ์ง์ด ์ฆ์์ง๋ฉด 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๊ฐ์ ๋ฉํ๋ฐ์ดํฐ
| path | title | tags_json | aliases_json | wikilink_refs_json | sha256 |
|---|---|---|---|---|---|
RAG.md | RAG | ["ai","rag"] | ["๊ฒ์์ฆ๊ฐ์์ฑ"] | [{"target":"LLM Wiki","count":2}] | (ํ์ผ ํด์) |
chunks (2ํ) โ heading ๋จ์ ์กฐ๊ฐ. line_start~line_end๊ฐ ๋์ค์ ์ธ์ฉ์ ์์น๊ฐ ๋จ
| ordinal | heading | level | line | text(์์ฝ) |
|---|---|---|---|---|
| 0 | RAG | 1 | 2โ5 | # RAG โฆ [[LLM Wiki]]์ ๋๋น๋๋ค. |
| 1 | RAG > ํ๊ณ | 2 | 6โ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์ ๋ฃ๊ณ (์ปจํ
์คํธ ์ ์ฝ), ๋ต๋ณ์ ๊ฐ ์ฃผ์ฅ์ ์ ํํ ์ถ์ฒ๋ฅผ ๋ถ์ผ ์ ์๋ค.
์ฐธ๊ณ ๋ฌธ์
- karpathy/llm-wiki (์๋ณธ Gist)
- I rebuilt Karpathyโs LLM Wiki: whatโs missing (theaioperator) โ write-backยท์ค์ผ์ค ์๋ํ ๊ถ๊ณ
- nashsu/llm_wiki (GitHub) โ ํด๋ auto-watchยทํด๋ฆฌํผ auto-ingest ๊ตฌํ
- How to Build an LLM Wiki with Obsidian and Claude Code (MindStudio)
- How I Built a Self-Maintaining KB for 6 Projects with Claude Code (HackerNoon)
- Auto LLM Wiki โ Obsidian Plugin
- Astro-Han/karpathy-llm-wiki (Agent Skills ํธํ)