Local Whisper ๋ฐ LLM ํ์ดํ๋ผ์ธ ๊ธฐ๋ฐ์ ์์ฑ ์ ์ด AI ์์ด์ ํธ ๊ตฌํ
๐๏ธ Building a Local Voice-Controlled AI Agent
AI ์์ฝ
Context
ํด๋ผ์ฐ๋ ์์กด์ฑ์ ์ ๊ฑฐํ๊ณ ์ผ๋ฐ ๋ ธํธ๋ถ ํ๊ฒฝ์์ ๋์ํ๋ ๋ก์ปฌ AI ์์ด์ ํธ ๊ตฌ์ถ ํ์์ฑ ๋๋. ๊ธฐ์กด API ๊ธฐ๋ฐ ์ฐ๋ ๋ฐฉ์์ ํ ํฐ ๋น์ฉ ๋ฐ์ ๋ฐ ๊ฐ์ธ์ ๋ณด ์ ์ถ ๋ฆฌ์คํฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ก์ปฌ ์ค์ฌ ์ํคํ ์ฒ ์ค๊ณ.
Technical Solution
- streamlit-mic-recorder๋ฅผ ํตํ ๋ธ๋ผ์ฐ์ MediaRecorder API ๊ธฐ๋ฐ์ raw WAV ๋ฐ์ดํธ ๋ฐ์ดํฐ ์์ง ๊ตฌ์กฐ ์ค๊ณ
- ํ๋์จ์ด ์ ์ฝ์ ๋ฐ๋ฅธ STT_BACKEND ํ๊ฒฝ ๋ณ์ ๋ถ๋ฆฌ ๋ฐ Local Whisper(Base)์ Groq API ๊ฐ์ ์ถ์ํ ๋ ์ด์ด ๊ตฌ์ถ
- ๋จ์ ํค์๋ ๋งค์นญ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด LLM ๊ธฐ๋ฐ์ Structured Prompt๋ฅผ ํตํ JSON ํํ์ Intent Classification ๊ตฌํ
- Path Traversal ๊ณต๊ฒฉ ๋ฐฉ์ง๋ฅผ ์ํ ํ์ผ ๊ฒฝ๋ก ์ ๋ ๊ฒฝ๋ก ํด์ ๋ฐ output/ ๋๋ ํ ๋ฆฌ ๋ด ๊ฒฉ๋ฆฌ ๊ฒ์ฆ ๋ก์ง ์ ์ฉ
- Audio Input โ STT โ Intent Classification โ Tool Dispatch โ UI Output์ผ๋ก ์ด์ด์ง๋ ๋จ๋ฐฉํฅ ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ
- Ollama, Gemini, Groq ๋ฑ ๋ค์ํ LLM ๋ฐฑ์๋๋ฅผ ์ ์ฐํ๊ฒ ๊ต์ฒด ๊ฐ๋ฅํ ํ๋ฌ๊ทธ์ธ ๊ตฌ์กฐ ์ฑํ
์ค์ฒ ํฌ์ธํธ
- STT ๋ชจ๋ธ ์ ํ ์ CPU ํ๊ฒฝ์์๋ Base ๋ชจ๋ธ์ ํตํด ์ ํ๋์ ์ง์ฐ ์๊ฐ(Latency)์ ๊ท ํ์ ํ๋ณด - LLM ๊ฒฐ๊ณผ๋ฌผ์ ๋๊ตฌ ์คํ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ๋์ JSON Schema๋ฅผ ๊ฐ์ ํ์ฌ ํ์ฑ ์๋ฌ ์ต์ํ - ๋ก์ปฌ ํ์ผ ์์คํ ์ ๊ทผ ๋๊ตฌ ๊ตฌํ ์ ์ ๋ ๊ฒฝ๋ก ๊ฒ์ฆ์ ํตํ Path Traversal ๋ฐฉ์ด ๊ธฐ์ ํ์ ์ ์ฉ - ํ๊ฒฝ ๋ณ์๋ฅผ ํตํ Backend ์ถ์ํ๋ก ์ธํ๋ผ ํ๊ฒฝ ๋ณํ์ ์ ์ฐํ ๋์ ๊ตฌ์กฐ ์ค๊ณ