๋ณด์ ๋งํฌ : 0x00F4B00์ํธํ: AES-256-GCM์ฌ์ ์: ๊ฑฐ์ง
๋ฐ์ดํฐ ์คํธ๋ฆผ : ๋ฒํผ๋ง ์์คํ
๋ฉ๋ชจ๋ฆฌ : 0.0MB
VRAM : 0.0MB
๋
ธ๋ : ์จ๋ผ์ธ
๋๊ธฐ์๊ฐ : 14ms
> ๋ถํ
์์ : ์ปค๋ ๋ก๋... ํ์ธ
์์คํ
์ด๊ธฐํ ์ค...
[000%]
Autonomous Portfolio Assistant: Multi-LLM & RAG Agent
์ปจํ
์คํธ ์ธ์ ํฐ๋ฏธ๋ ์ฑ๋ด ๋ฐ MCP ํตํฉ
LIVE DEMO โข [GITHUB: Private Source]
๊ฐ์
- ์ญํ : ํ์คํ ์์ง๋์ด๋ง (์ํคํ
์ฒ, ๋ฐฑ์๋ API, ์ํ ๊ด๋ฆฌ, UI/UX, ์ค๋์ค ํตํฉ์ ํฌํจํ์ฌ ์ ์ฒด ์์คํ
์ ์ฒ์๋ถํฐ ๊ตฌ์ถ)
- ์คํ: React, Next.js, TypeScript, Tailwind CSS, Framer Motion, next-intl, MCP
- ํต์ฌ ๊ฒฐ๊ณผ: ์ฌ์ด๋ฒํํฌ ํฌํธํด๋ฆฌ์ค์ ์ค์ ๋ํํ ๋
ธ๋ ์ญํ ์ ํ๋ ๋ชฐ์
ํ ์ปจํ
์คํธ ์ธ์ V2 ์ฑ๋ด
- ์์ฝ: ํฌํธํด๋ฆฌ์ค: ์ฌ์ด๋ฒํํฌ๋ฅผ ์ํด ๊น์ด ํตํฉ๋ V2 ์ฑ๋ด ์์คํ
์ผ๋ก, ์๋์ V1 ์ฑ๋ด(ํฌํธํด๋ฆฌ์ค: ๊ธ๋์ค)์์ ๋๋์ ์ผ๋ก ๋ฐ์ ํ์ต๋๋ค. ์ค์๊ฐ ๋๋น,
ToolBadge ํ์๊ธฐ๋ฅผ ํตํ ๋์ MCP ๋๊ตฌ ์คํ, ์์คํ
๋ช
๋ น, ํ์ฑ ์ปจํ
์คํธ ํ๊ณ ๊ด๋ฆฌ๋ฅผ ํน์ง์ผ๋ก ํ๋ "Oz"๋ผ๋ AI ํฐ๋ฏธ๋์ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค. ํ๋์ธ ๋ฅผ ๋ํํ๋ ์์ ํ ์์จ ์์ด์ ํธ ์ญํ ์ ํฉ๋๋ค.
๋ฌธ์
- ๊ณผ์ : ์ฌ์ด๋ฒํํฌ ํฌํธํด๋ฆฌ์ค๋ ๋จ์ํ ์์ ฏ์ด ์๋๋ผ ๋ด์ฅํ ํฐ๋ฏธ๋์ด๋ AI ๋น์์ฒ๋ผ ๋๊ปด์ง๋ ์ฑ๋ด์ด ํ์ํ์ต๋๋ค. ํ์ค ๋ํํ ์ธํฐํ์ด์ค์๋ V1 ๊ธ๋์ค ์ฑ๋ด๊ณผ ๋ฌ๋ฆฌ, ์ด V2 ๋ฐ๋ณต ๋ฒ์ ์ ์ฌ๋ฌ ์์คํ
์์ค์ ๋ช
๋ น์ ์ฒ๋ฆฌํ๊ณ , LLM ๋๊ตฌ ํธ์ถ(์: ํ์ ๋๋ ์์
์ฌ์)์ ์๊ฐ์ ์ผ๋ก ๋ ๋๋งํ๋ฉฐ, ์ค๋์ค ๊ฒน์นจ ์์ด ๋๊ธฐํ๋ AI ๋๋น์ ์ฌ์ํ๊ณ , ์ปจํ
์คํธ ์ฐฝ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ์ต๋๋ค.
- ๋์: ํฌํธํด๋ฆฌ์ค๋ฅผ ํ์ํ๋ ๊ธฐ์ ์ฑ์ฉ ๋ด๋น์, ๊ฐ๋ฐ์ ๋ฐ ๋ฐฉ๋ฌธ์.
- ์ ์ฝ ์ฌํญ: ์ฌ์ด๋ ์ฌ์, UI ๋ ์ด์์ ๋ณ๊ฒฝ, ์ฌ์ฉ์ ํ์ดํ, ๋น๋๊ธฐ ๋๊ตฌ ํธ์ถ ๋ ๋๋ง, API ์ ์ฝ(ํ ํฐ ์ ํ ์ฒ๋ฆฌ)์ ํฌํจํ๋ ๋ณต์กํ ์ํ ๊ด๋ฆฌ๋ฅผ 60fps ์ ๋๋ฉ์ด์
์์ ์์ด ์ ์คํ ์ํคํ
์ฒ ๊ณํ์ ํตํด ํด๊ฒฐํด์ผ ํ์ต๋๋ค.
์ ๊ทผ ๋ฐฉ์ ๋ฐ ๊ฒฐ์
- ์ํคํ
์ฒ: ๊ตฌ์ฑ ์์๋ฅผ ๋ชจ๋์ ๊ธฐ๋ฅ์ผ๋ก ๋ถ๋ฆฌํ์ต๋๋ค:
ChatHeader, ChatInput, ChatMessage, ChatHistory, DubPopup, ToolBadge. ์คํธ์ ํผํ๊ณ ์๋ฆฌ๋ฅผ ์์ ํ๊ฒ ์ค์ผ์คํธ๋ ์ด์
ํ๊ธฐ ์ํด useChatbotAudio๋ฅผ ํ์ฉํ์ต๋๋ค.
- ์ฃผ์ ๊ฒฐ์ ์ฌํญ:
- ๋๊ตฌ ์คํ (
ToolBadge): AI์ ์์
์ ์๊ฐ์ ์ด๊ณ ํฌ๋ช
ํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ToolBadge ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌ์ถํ์ต๋๋ค. AI๊ฐ MCP ๋๊ตฌ(์: ์์
์ ํ, ์ด๋ ฅ์ ๋ค์ด๋ก๋, ํ
๋ง ๋ณ๊ฒฝ, ์ฌ์ดํธ ๋ฒ์ญ)๋ฅผ ์คํํ ๋ ์ ๋๋ฉ์ด์
ํจ๊ณผ๊ฐ ์ ์ฉ๋ ์ธ๋ จ๋ ํฐ๋ฏธ๋ ๋ฐฐ์ง๊ฐ ์ฑํ
ํ๋ฆ์ ํ์๋์ด ์์
์ ์์ธํ ์ค๋ช
ํฉ๋๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์คํ
์์
๊ณผ ์ผ๋ฐ ํ
์คํธ๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค.
- ์์ด๋ดํฐํฐ ๋ฐ ์์จ์ ํ๋: AI๋ ์ ๋ฌธ AI ๋น์ ์ญํ ์ ํ๋ "Oz"๋ผ๋ ํ๋ฅด์๋๋ก ์๋ํฉ๋๋ค. ๊ฐ๊ฒฉ ๋ฌธ์(์จ๊ฒจ์ง ๋ด๋ถ ๊ฐ๊ฒฉํ ํ์) ๋ฐ ๋ฌธ์ ์์ ๋ผ์ฐํ
(Oz๊ฐ ์ฌ์ฉ์๋ฅผ ์ํด ์ด๋ฉ์ผ์ ์ด์ ์์ฑํ์ง๋ง ์๊ฒฉํ ๊ฒํ ๋ฐ ์น์ธ UI ๋ฃจํ๋ฅผ ๊ฑฐ์น๋๋ก ๊ฐ์ ํจ)๊ณผ ๊ฐ์ ๋ณต์กํ ์ํฌํ๋ก๋ฅผ ๋์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- LLM ์์ง ๋ฐ ๋์ฒด ์ํคํ
์ฒ: ํ๋ ฅ์ ์ธ ๋ฐฑ์๋ ๋์ฒด ์ฒด์ธ์ ๊ตฌ์ถํ์ต๋๋ค. ๊ธด ์ปจํ
์คํธ ์ ์ง๋ฅผ ์ง์ํ๊ธฐ ์ํด ํ์ด๋ธ๋ฆฌ๋ ์ดํ
์
์ํคํ
์ฒ๋ก ์ต๋ 100๋ง ๊ฐ์ ์ปจํ
์คํธ ํ ํฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์๋ ์ ํ์ด๋ ์ผ์์ ์ธ ์ค๋จ์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ๋ ๋น ๋ฅธ ๊ธฐ๋ณธ ๋ชจ๋ธ์์ ๊ฐ๋ ฅํ ๋ณด์กฐ ๋คํธ์ํฌ๋ก ์ ์ฐํ๊ฒ ์ด์ด์ง๋๋ค.
- RAG ๋ฐ ์ปจํ
์คํธ ๊ด๋ฆฌ: ์ฌ์ฉ์๊ฐ ๊น์ ๊ธฐ์ ์ ์ธ ์ง๋ฌธ์ ํ ๋ ์ ์ฒด MDX ์ฌ๋ก ์ฐ๊ตฌ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด RAG(
query_portfolio_data)๋ฅผ ํ์ฉํฉ๋๋ค. ์ ์ํ ์ฌ๋ผ์ด๋ฉ ์ฐฝ์ ์ปจํ
์คํธ ์ฉ๋์ 90-98%์ ๋๋ฌํ๋ฉด ๊ฐ์ฅ ์ค๋๋ ๋ฉ์์ง๋ฅผ ์ญ์ ํฉ๋๋ค.
- ๋ชจ๋๋ ์ด์
์ ๊ธ: Oz๊ฐ ๋จ์ฉ์ ์ธ ์ธ์ด๋ ์คํธ์ผ๋ก ์ธํด ์ฌ์ฉ์๋ฅผ ์ผ์์ ์ผ๋ก ์ฐจ๋จ(์งง์, ์ค๊ฐ ๋๋ ๊ธด ํ์์์)ํ ์ ์๋ ์๋ํ๋
lockdown ์์คํ
์ ๊ตฌํํ์ผ๋ฉฐ ์๋ฒ ์ธก ์ฟ ํค์ ์์ ํ ๋๊ธฐํ๋ฉ๋๋ค.
- ์ ์ถฉ์ : ๋ณต์กํ ์ํ์ Redux๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ง์ญํ๋ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด React Context ๋ฐ
useSyncExternalStore์ ์์กดํ์ต๋๋ค. ์ด๋ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ต์ ํํ์ง๋ง ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ํํ ํ
(hook) ์ค๊ณ๊ฐ ํ์ํ์ต๋๋ค.
ํต์ฌ ๊ฒฐ๊ณผ ๋ฐ ์ํฅ
- ๊ฒฐ๊ณผ: ์ง์ ํ ์ ํธ๋ฆฌํฐ(์: ์ง๋ฌธ ๋ต๋ณ, ์์
์ ์ด, ๊ธฐ์ ์ผ์ผ์ด์ค)๋ฅผ ์ ๊ณตํ๋ฉด์ ์ฌ์ด๋ฒํํฌ ๋ด๋ฌํฐ๋ธ๋ฅผ ๊ฐํํ๋ ์ธ์์ ์ด๊ณ ๋งค์ฐ ๊ธฐ๋ฅ์ ์ธ ๋น์์
๋๋ค.
- ์ํฅ: ๊ณ ๊ธ Next.js ํจํด, MCP๋ฅผ ํตํ ์์คํ
ํตํฉ, ๋ง์ถคํ ํ
๋ฐ ์ ํํ ์์ฒญ๊ฐ ์กฐ์ ์ ๋ณด์ฌ์ค๋๋ค.
๊ธฐ์ ์ ๋ฅ ๋ค์ด๋ธ
- ์ฃผ๋ชฉํ ๋งํ ์ธ๋ถ ์ฌํญ:
- ์ค์๊ฐ ์ง๋จ(์๋ณต ์๊ฐ, ํ์ฑ ๋ชจ๋ธ, ํ ํฐ)์ UI์์ ์ง์ ์ถ์ ํฉ๋๋ค.
- ๋๊ตฌ ํธ์ถ ์์:
ToolBadge.tsx ๊ตฌ์ฑ ์์๋ AI๊ฐ ๋จ์ํ ํ
์คํธ๊ฐ ์๋ action ๊ฐ์ฒด๋ฅผ ๋ฐํํ ๋๋ง๋ค ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค. ๋๊ตฌ์ ๋งค๊ฐ๋ณ์(์: { type: "toggle_theme", theme: "dark" })๋ฅผ ๋ถ์ํ๊ณ ์ฑํ
ํผ๋ ๋ด์์ ์คํ๋ ์์
์ ์์ฝํ๋ ๋ฏธ๋ ์งํฅ์ ์ธ ๋น๋๋ ๋ฐฐ์ง๋ฅผ ๋ ๋๋งํฉ๋๋ค.
- ํด์ปค์ ๊ฐ์ ํ์๊ธฐ ํจ๊ณผ๋ก ๋งํฌ๋ค์ด์ ์์ ํ๊ฒ ๋ ๋๋งํ๊ธฐ ์ํ ๋ง์ถคํ
TypewriterMarkdown.
DubPopup ์๊ฐํ ๋๊ตฌ๋ API ์์
์ ๊ธฐ๋ฐ์ผ๋ก "AI๊ฐ ๋งํ๋ ์ค" ์ํ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํฉ๋๋ค.
- ๊ฒ์ฆ: ๋จ์ฉ์ ์ธ ์ฌ์ฉ์ด๋ ์๋ ์ ํ์ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ์ ํ(์ ๊ธ ์ํ, ์คํธ ๋ณดํธ)์ ๊ตฌ์ถํ์ฌ ์๋ฒ ๊ตฌ์ฑ์ UI์ ์ง์ ๋ฐ์ํ์ต๋๋ค.
- ์ฝ๋ ํ์ง:
ToolDetail, ChatSession์ ๋ํ TypeScript ์ธํฐํ์ด์ค์ ๊ด๋ฒ์ํ ์ฌ์ฉ ๋ฐ ์ฐธ์กฐ ๋ฐ ์๊ฐ์ ๋ ์ด์์ ์ํธ์์ฉ์ ๋ํ ์๊ฒฉํ null ๊ฒ์ฌ.
ํ๊ณ
- ์์ฌ์ด ์ : ๋ชจ๋ฐ์ผ ์ฅ์น์์ ๊ธด ์ค๋์ค ํ์ผ์ ๋์ฝ๋ฉํ ๋ ์ฃผ ์ค๋ ๋ ๋๊น ํ์์ ์์ ํ ์ ๊ฑฐํ๊ธฐ ์ํด ์ค๋์ค ํ๋ ์ด์ด ์์ง์ ์ผ๋ฐ ์์ปค๋ก ๋ถ๋ฆฌํ ์๋ ์์์ต๋๋ค.
- ์ฑ๊ณต:
useMusicPlayer ์ปจํ
์คํธ๋ฅผ AI ๋ช
๋ น๊ณผ ์ํํ๊ฒ ์ฐ๊ฒฐํ์ฌ ๋น์๊ฐ ์ฑํ
๊ณผ ์ฌ์ดํธ ํ์ ์ฌ์ด์ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์น์ฌ์ดํธ ๋ด์์ ์ง์ ์ผ๋ก "์๋"ํ ์ ์๋๋ก ํ์ต๋๋ค.
- ๊ตํ: "๋ฉ์ง" ์ฌ์ด๋ฒํํฌ ํจ๊ณผ(ํ์๊ธฐ, ๊ฒฐํจ ์๋ ๋๊ตฌ)์ ์ ๊ทผ์ฑ์ ๊ท ํ์ ๋ง์ถ๋ ค๋ฉด ์ง์์ ์ธ ํ
์คํธ๊ฐ ํ์ํฉ๋๋ค. ๊ณ ์ ๋ ์์น ์ง์ ๋ฐ ์คํฌ๋กค ์ ๊ธ ๊ธฐ๋ฅ์ด ์๋ ๋ชจ๋ฐ์ผ ์นํ์ ์ธ ํ๋กํ
์ฑํ
์ฐฝ์ ๋์์ธํ๋ ๊ฒ์ ๋ธ๋ผ์ฐ์ ์ ํน์ง์ ํฌ๊ฒ ์ข์ฐ๋ฉ๋๋ค.
๋์ ๊ธฐ์ฌ
- ์์คํ
์ํคํ
์ฒ: ์ฑํ
์ํ ์์ง, ์ค์๊ฐ ์ง๋จ์ ์ํ ํด๋ง ๋
ผ๋ฆฌ ๋ฐ ์ธ์
์คํ ๋ฆฌ์ง ๊ธฐ๋ก์ ์ค๊ณํ์ต๋๋ค.
- ์ค๋์ค ์์ง๋์ด๋ง: ์ํ์ค ๊ธฐ๋ฐ ๋๋น ๋ฐ ์ํฅ ํจ๊ณผ ํ
(
useChatbotAudio)์ ํ๋ก๊ทธ๋๋ฐํ์ต๋๋ค.
- UI/UX: ์ง์ ํ ํฐ๋ฏธ๋ ๋ชจ์์ ์ํด Tailwind ๋ฐ Framer Motion์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ์์(
ChatSettings, ChatInput)์ ์คํ์ผ์ ์ง์ ํ์ต๋๋ค.
- ํตํฉ: AI ์ถ๋ ฅ์ ๊ด๋ฒ์ํ ์ฑ์ ์ํฅ์ ๋ฏธ์น๋ ์คํ ๊ฐ๋ฅํ ๋๊ตฌ(
ToolBadge)์ ๋งคํํ์ต๋๋ค(์: ์ธ์ด ๋ณ๊ฒฝ, ์ด๋ ฅ์ ๋ค์ด๋ก๋, ํ
๋ง ์ ํ).
ํ๋ก์ ํธ ์ํคํ
์ฒ
components/chatbot/ ๋๋ ํ ๋ฆฌ๋ ๋น์ ๋
ผ๋ฆฌ๋ฅผ ์ค์ผ์คํธ๋ ์ด์
ํฉ๋๋ค:
- ์ฝ์ด ์์ง:
Chatbot.tsx๋ ์ฃผ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํฉ๋๋ค.
- UI ๊ตฌ์ฑ ์์:
ChatMessage.tsx, ChatInput.tsx, ChatHistory.tsx.
- ํน์ ๊ธฐ๋ฅ: ์๊ฐ์ ํจ๊ณผ๋ฅผ ์ํ
TypewriterMarkdown.tsx, ์ค๋์ค ์กด์ฌ๊ฐ์ ์ํ DubPopup.tsx, ๋๊ตฌ ์คํ ์์ฝ์ ์ํ ToolBadge.tsx.
- ํตํฉ: ๊ธ๋ก๋ฒ ํ๋ก๋ฐ์ด๋(
useMusicPlayer, useTheme, useLocale)์ ํตํฉ๋ฉ๋๋ค.
๋ผ์ด๋ธ ํ๋ฆฌ๋ทฐ
- ๋ผ์ด๋ธ ๋ฐ๋ชจ ๋งํฌ: ๋ผ์ด๋ธ ํฌํธํด๋ฆฌ์ค ์ฌ์ดํธ franzdomingo.dev์์ ์ฑ๋ด์ ์ง์ ์ฒดํํด ๋ณด์ธ์.
- ์๋ํด ๋ณผ ๊ธฐ๋ฅ:
/help๋ฅผ ์
๋ ฅํ์ฌ ๋ช
๋ น์ด๋ฅผ ํ์ธํ๊ฑฐ๋ "Play music"์ ์์ฒญํ์ฌ ๊ธ๋ก๋ฒ ๋ฎค์ง ํ๋ ์ด์ด๊ฐ ์๋ํ๋์ง ํ์ธํ์ธ์.