Open WebUI๐Ÿ‘‹, ์˜คํ”„๋ผ์ธ ๋ฐ Local LLM ๋“ฑ์„ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค AI ํ”Œ๋žซํผ

Open WebUI ์†Œ๊ฐœ

Open WebUI๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์™„์ „ํžˆ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ๋„ AI ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์˜คํ”ˆ์†Œ์Šค AI ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ์ด ํ”Œ๋žซํผ์€ Ollama ๋ฐ OpenAI API์™€ ํ˜ธํ™˜๋˜๋Š” ๋ชจ๋ธ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋ฉฐ, RAG(Retrieval-Augmented Generation) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ฌธ์„œ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Open WebUI ์‚ฌ์šฉ ์˜ˆ์‹œ

ํŠนํžˆ Docker์™€ Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ์„ค์น˜ ๋ฐ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , Markdown๊ณผ LaTeX ์ง€์›์„ ํ†ตํ•ด ๋”์šฑ ์ง๊ด€์ ์ธ LLM ์ƒํ˜ธ์ž‘์šฉ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์›น ๊ธฐ๋ฐ˜์ด์ง€๋งŒ PWA(Progressive Web App)๋ฅผ ์ง€์›ํ•˜์—ฌ ๋ชจ๋ฐ”์ผ์—์„œ๋„ ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋กœ, GitHub์—์„œ ์ฝ”๋“œ ๋ฐ ์ƒ์„ธ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Open WebUI์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

  • :rocket: ์†์‰ฌ์šด ์„ค์น˜: Docker ๋˜๋Š” Kubernetes(kubectl, kustomize, helm)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :ollama ๋ฐ :cuda ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜์—ฌ ๋ฒˆ๊ฑฐ๋กœ์›€ ์—†๋Š” ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • :handshake: Ollama/OpenAI API ํ†ตํ•ฉ: Ollama ๋ชจ๋ธ๊ณผ ํ•จ๊ป˜ OpenAI ํ˜ธํ™˜ API๋ฅผ ์†์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋Œ€ํ™”๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OpenAI API URL์„ LMStudio, GroqCloud, Mistral, OpenRouter ๋“ฑ๊ณผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • :shield: ์„ธ๋ถ€์ ์ธ ๊ถŒํ•œ ์„ค์ • ๋ฐ ์‚ฌ์šฉ์ž ๊ทธ๋ฃน ๊ด€๋ฆฌ: ๊ด€๋ฆฌ์ž๊ฐ€ ์„ธ๋ถ€์ ์ธ ์‚ฌ์šฉ์ž ์—ญํ•  ๋ฐ ๊ถŒํ•œ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์•ˆ์ „ํ•œ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ธ๋ถ„ํ™”๋Š” ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋งž์ถคํ™”ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์†Œ์†๊ฐ๊ณผ ์ฑ…์ž„๊ฐ์„ ์ฆ์ง„ํ•ฉ๋‹ˆ๋‹ค.

  • :iphone: ๋ฐ˜์‘ํ˜• ๋””์ž์ธ: ๋ฐ์Šคํฌํ†ฑ PC, ๋…ธํŠธ๋ถ ๋ฐ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ๋งค๋„๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • :iphone: ๋ชจ๋ฐ”์ผ์šฉ PWA(Progressive WebApp): ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๊ฐ™์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” PWA๋ฅผ ํ†ตํ•ด ๋กœ์ปฌํ˜ธ์ŠคํŠธ์—์„œ ์˜คํ”„๋ผ์ธ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์›ํ™œํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • :black_nib::1234: Markdown ๋ฐ LaTeX ์™„์ „ ์ง€์›: ํ’๋ถ€ํ•œ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ ์ข…ํ•ฉ์ ์ธ Markdown ๋ฐ LaTeX ๊ธฐ๋Šฅ์œผ๋กœ LLM(๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ) ๊ฒฝํ—˜์„ ํ–ฅ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • :microphone::video_camera: ํ•ธ์ฆˆํ”„๋ฆฌ ์Œ์„ฑ/์˜์ƒ ํ†ตํ™”: ํ•ธ์ฆˆํ”„๋ฆฌ ์Œ์„ฑ ๋ฐ ์˜์ƒ ํ†ตํ™” ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉํ•˜์—ฌ ๋” ์—ญ๋™์ ์ด๊ณ  ์ƒํ˜ธ์ž‘์šฉ์ ์ธ ์ฑ„ํŒ… ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • :hammer_and_wrench: ๋ชจ๋ธ ๋นŒ๋”: ์›น UI๋ฅผ ํ†ตํ•ด Ollama ๋ชจ๋ธ์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ์บ๋ฆญํ„ฐ/์—์ด์ „ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฑ„ํŒ… ์š”์†Œ๋ฅผ ๋งž์ถคํ™”ํ•˜๋ฉฐ, Open WebUI ์ปค๋ฎค๋‹ˆํ‹ฐ ํ†ตํ•ฉ์„ ํ†ตํ•ด ๋ชจ๋ธ์„ ๊ฐ„๋‹จํžˆ ๊ฐ€์ ธ์˜ค๊ณ  ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • :snake: ๋„ค์ดํ‹ฐ๋ธŒ Python ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋„๊ตฌ: ํˆด ์ž‘์—…๊ณต๊ฐ„ ๋‚ด ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ ์ง€์›์„ ํ†ตํ•ด LLM ๊ธฐ๋Šฅ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ Python ํ•จ์ˆ˜๋ฅผ ๊ฐ„๋‹จํžˆ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ Python ํ•จ์ˆ˜(BYOF, Bring Your Own Function)๋ฅผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • :books: ๋กœ์ปฌ RAG ํ†ตํ•ฉ: ํš๊ธฐ์ ์ธ RAG(๊ฒ€์ƒ‰ ์ฆ๊ฐ• ์ƒ์„ฑ) ์ง€์›์„ ํ†ตํ•ด ์ฑ„ํŒ… ์ƒํ˜ธ์ž‘์šฉ์˜ ๋ฏธ๋ž˜๋ฅผ ํƒํ—˜ํ•ด ๋ณด์„ธ์š”. ๋ฌธ์„œ๋ฅผ ์ฑ„ํŒ…์— ์ง์ ‘ ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋ฌธ์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•œ ๋’ค, ์ฟผ๋ฆฌ ์ „์— # ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • :mag: RAG์šฉ ์›น ๊ฒ€์ƒ‰: SearXNG, Google PSE, Brave Search, serpstack, serper, Serply, DuckDuckGo, TavilySearch, SearchApi, Bing๊ณผ ๊ฐ™์€ ์ œ๊ณต์—…์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ฑ„ํŒ… ๊ฒฝํ—˜์— ์ง์ ‘ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • :globe_with_meridians: ์›น ๋ธŒ๋ผ์šฐ์ง• ๊ธฐ๋Šฅ: ๋ช…๋ น์–ด ๋’ค์— URL์„ ์ž…๋ ฅํ•˜์—ฌ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ฑ„ํŒ… ๊ฒฝํ—˜์— ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ’๋ถ€ํ•˜๊ณ  ๊นŠ์ด ์žˆ๋Š” ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•ด ์›น ์ฝ˜ํ…์ธ ๋ฅผ ๋Œ€ํ™”์— ๋ฐ”๋กœ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • :art: ์ด๋ฏธ์ง€ ์ƒ์„ฑ ํ†ตํ•ฉ: AUTOMATIC1111 API, ComfyUI(๋กœ์ปฌ), OpenAI์˜ DALL-E(์™ธ๋ถ€)์™€ ๊ฐ™์€ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๊ธฐ๋Šฅ์„ ๋งค๋„๋Ÿฝ๊ฒŒ ํ†ตํ•ฉํ•˜๋ฉฐ, ์—ญ๋™์ ์ธ ๋น„์ฃผ์–ผ ์ฝ˜ํ…์ธ ๋กœ ์ฑ„ํŒ… ๊ฒฝํ—˜์„ ํ’๋ถ€ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • :gear: ๋‹ค์ค‘ ๋ชจ๋ธ ๋Œ€ํ™”: ๋‹ค์–‘ํ•œ ๋ชจ๋ธ์„ ๋™์‹œ์— ํ™œ์šฉํ•˜์—ฌ ๊ฐ ๋ชจ๋ธ์˜ ๊ณ ์œ ํ•œ ๊ฐ•์ ์„ ํ™œ์šฉํ•˜๊ณ  ์ตœ์ ์˜ ์‘๋‹ต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ชจ๋ธ์„ ๋ณ‘๋ ฌ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝํ—˜์„ ํ–ฅ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • :closed_lock_with_key: ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด(RBAC): ์ œํ•œ๋œ ๊ถŒํ•œ์œผ๋กœ ๋ณด์•ˆ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. Ollama์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์€ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋œ ์‚ฌ์šฉ์ž๋กœ ์ œํ•œ๋˜๋ฉฐ, ๋ชจ๋ธ ์ƒ์„ฑ/๊ฐ€์ ธ์˜ค๊ธฐ ๊ถŒํ•œ์€ ๊ด€๋ฆฌ์ž์—๊ฒŒ๋งŒ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

  • :globe_with_meridians::earth_africa: ๋‹ค๊ตญ์–ด ์ง€์›: ๊ตญ์ œํ™”(i18n) ์ง€์›์„ ํ†ตํ•ด ์„ ํ˜ธํ•˜๋Š” ์–ธ์–ด๋กœ Open WebUI๋ฅผ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์› ์–ธ์–ด๋ฅผ ํ™•์žฅํ•˜๋Š” ๋ฐ ํ•จ๊ป˜ ์ฐธ์—ฌํ•ด ์ฃผ์„ธ์š”! ํ˜„์žฌ๋„ ์ ๊ทน์ ์œผ๋กœ ๊ธฐ์—ฌ์ž๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • :jigsaw: ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ Open WebUI ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์›: ํŒŒ์ดํ”„๋ผ์ธ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Open WebUI์— ์‚ฌ์šฉ์ž ์ง€์ • ๋กœ์ง ๋ฐ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์›ํ™œํžˆ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  OpenAI URL์„ ํŒŒ์ดํ”„๋ผ์ธ URL๋กœ ์„ค์ •ํ•œ ๋’ค, ๋ฌดํ•œํ•œ ๊ฐ€๋Šฅ์„ฑ์„ ํƒ๊ตฌํ•ด ๋ณด์„ธ์š”. ์˜ˆ๋กœ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ, ์‚ฌ์šฉ์ž ์‚ฌ์šฉ๋ฅ  ์ œํ•œ, Langfuse ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•œ ์‚ฌ์šฉ ๋ชจ๋‹ˆํ„ฐ๋ง, LibreTranslate๋ฅผ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ๋ฒˆ์—ญ ๋‹ค๊ตญ์–ด ์ง€์›, ์œ ํ•ด ๋ฉ”์‹œ์ง€ ํ•„ํ„ฐ๋ง ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • :star2: ์ง€์†์ ์ธ ์—…๋ฐ์ดํŠธ: Open WebUI์˜ ๊ฐœ์„ ๊ณผ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€, ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์ •๊ธฐ์ ์ธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด์„ ์Šค

Open WebUI ํ”„๋กœ์ ํŠธ๋Š” BSD-3ํ•ญ ๋ผ์ด์„ ์Šค๋กœ ๊ณต๊ฐœ๋œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

:house: OpenWebUI ํ™ˆํŽ˜์ด์ง€

:books: OpenWebUI ๊ณต์‹ ๋ฌธ์„œ

:github: OpenWebUI GitHub ์ €์žฅ์†Œ

https://github.com/open-webui/open-webui




์ด ๊ธ€์€ GPT ๋ชจ๋ธ๋กœ ์ •๋ฆฌํ•œ ๊ธ€์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ ๊ฒƒ์œผ๋กœ, ์›๋ฌธ์˜ ๋‚ด์šฉ ๋˜๋Š” ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ์ •๋ฆฌ๋œ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์žˆ๋Š” ๋‚ด์šฉ์ด์‹œ๋ผ๋ฉด ์›๋ฌธ๋„ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”! ์ฝ์œผ์‹œ๋ฉด์„œ ์–ด์ƒ‰ํ•˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๋‚ด์šฉ์„ ๋ฐœ๊ฒฌํ•˜์‹œ๋ฉด ๋ง๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๊ธฐ๋ฅผ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. :hugs:

:pytorch:ํŒŒ์ดํ† ์น˜ ํ•œ๊ตญ ์‚ฌ์šฉ์ž ๋ชจ์ž„:kr:์ด ์ •๋ฆฌํ•œ ์ด ๊ธ€์ด ์œ ์šฉํ•˜์…จ๋‚˜์š”? ํšŒ์›์œผ๋กœ ๊ฐ€์ž…ํ•˜์‹œ๋ฉด ์ฃผ์š” ๊ธ€๋“ค์„ ์ด๋ฉ”์ผ:love_letter:๋กœ ๋ณด๋‚ด๋“œ๋ฆฝ๋‹ˆ๋‹ค! (๊ธฐ๋ณธ์€ Weekly์ง€๋งŒ Daily๋กœ ๋ณ€๊ฒฝ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.)

:gift: ์•„๋ž˜:arrow_lower_right:์ชฝ์— ์ข‹์•„์š”:+1:๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์‹œ๋ฉด ์ƒˆ๋กœ์šด ์†Œ์‹๋“ค์„ ์ •๋ฆฌํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š”๋ฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค~ :star_struck: