๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
๊ฒฝ๊ณ 

์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ์—ฌ๋กœ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ Open WebUI ํŒ€์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๊ฒŒ Open WebUI๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ๋ฐ๋ชจ๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์—ฌ๋ฅผ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ธฐ์—ฌ ํŠœํ† ๋ฆฌ์–ผ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”.

[!WARNING] ์ด ๋ฌธ์„œ๋Š” ํ˜„์žฌ ๋ฒ„์ „(0.5.16)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Jupyter Notebook ํ†ตํ•ฉ

v0.5.11๋ถ€ํ„ฐ Open-WebUI๋Š” ์ฝ”๋“œ ํ•ด์„๊ธฐ์—์„œ Jupyter Notebook ์ง€์›์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ Open-WebUI์™€ Jupyter๋ฅผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ›„์† ๋ฆด๋ฆฌ์Šค์—์„œ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์žˆ์—ˆ์œผ๋ฏ€๋กœ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ๋‚ด์šฉ์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ๊ฒ€ํ† ํ•˜์‹ญ์‹œ์˜ค.

์ด ํŠœํ† ๋ฆฌ์–ผ์€ ๋‘ ์„œ๋น„์Šค ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๊ธฐ์ดˆ์— ๋Œ€ํ•ด ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

Jupyter Notebook์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€โ€‹

Jupyter Notebook์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ, ๊ณต์‹, ์‹œ๊ฐํ™” ๋ฐ ์„œ์ˆ  ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ๋ฐ์ดํ„ฐ ๊ณผํ•™, ๊ณผํ•™ ๊ณ„์‚ฐ ๋ฐ ๊ต์œก์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฉฐ, Python, R, Julia์™€ ๊ฐ™์€ ์–ธ์–ด๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์„ค๋ช… ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€ ๋ฐ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์‹œ๊ฐํ™”์™€ ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค๋‹ˆ๋‹ค. Jupyter Notebook์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ถ„์„ ๊ณผ์ •๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํฌ๊ด„์ ์ด๊ณ  ๊ณต์œ  ๊ฐ€๋Šฅํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋™์‹œ์— ์ฝ”๋“œ ๋””๋ฒ„๊น… ๋ฐ ์‹คํ—˜์„ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ํƒ๊ตฌ์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Jupyter ์›น์‚ฌ์ดํŠธ์—์„œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜์„ธ์š”: Project Juptyer

๋‹จ๊ณ„ 0: ์„ค์ • ์š”์•ฝโ€‹

์ด ํŠœํ† ๋ฆฌ์–ผ์„ ํ†ตํ•ด ์„ค์ •ํ•˜๋ ค๋Š” ๋ชฉํ‘œ ๊ตฌ์„ฑ์„ ์•„๋ž˜์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์‹คํ–‰ ๊ตฌ์„ฑ

๋‹จ๊ณ„ 1: OUI์™€ Jupyter ์‹คํ–‰

docker-compose๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ์„œ๋น„์Šค์™€ ๋‚ด LLM์„ ํฌํ•จํ•˜๋Š” ์Šคํƒ์„ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ๊ฐ ์‹คํ–‰ํ•ด๋„ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

docker-compose.yml
version: "3.8"

services:
open-webui:
image: ghcr.io/open-webui/open-webui:latest
container_name: open-webui
ports:
- "3000:8080"
volumes:
- open-webui:/app/backend/data

jupyter:
image: jupyter/minimal-notebook:latest
container_name: jupyter-notebook
ports:
- "8888:8888"
volumes:
- jupyter_data:/home/jovyan/work
environment:
- JUPYTER_ENABLE_LAB=yes
- JUPYTER_TOKEN=123456

volumes:
open-webui:
jupyter_data:

์œ„์˜ ์Šคํƒ์€ docker-compose ํŒŒ์ผ์ด ์ €์žฅ๋œ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

docker-compose ์‹คํ–‰
docker-compose up -d

์ด์ œ ๋‹ค์Œ URL์—์„œ ๋‘ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

์„œ๋น„์ŠคURL
Open-WebUIhttp://localhost:3000
Jupyterhttp://localhost:8888

Jupyter ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ๋•Œ ์œ„์—์„œ ์ •์˜ํ•œ JUPYTER_TOKEN์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” 123456์ด๋ผ๋Š” ๋”๋ฏธ ํ† ํฐ ๊ฐ’์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์‹คํ–‰ ๊ตฌ์„ฑ

๋‹จ๊ณ„ 2: Jupyter๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ ์‹คํ–‰ ๊ตฌ์„ฑ

์ด์ œ Open-WebUI์™€ Jupyter๋ฅผ ์‹คํ–‰ํ–ˆ์œผ๋‹ˆ, Open-WebUI์˜ ์ฝ”๋“œ ์‹คํ–‰์„ Admin Panel -> Settings -> Code Execution์—์„œ Jupyter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Open-WebUI๋Š” ์ง€์†์ ์œผ๋กœ ์ด ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์ตœ์‹  ์„ค์ •์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด configs.py ํŒŒ์ผ์„ ํ•ญ์ƒ ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. v0.5.16 ๊ธฐ์ค€์œผ๋กœ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

Open-WebUI ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ’
ENABLE_CODE_INTERPRETERTrue
CODE_EXECUTION_ENGINEjupyter
CODE_EXECUTION_JUPYTER_URLhttp://host.docker.internal:8888
CODE_EXECUTION_JUPYTER_AUTHtoken
CODE_EXECUTION_JUPYTER_AUTH_TOKEN123456
CODE_EXECUTION_JUPYTER_TIMEOUT60
CODE_INTERPRETER_ENGINEjupyter
CODE_INTERPRETER_JUPYTER_URLhttp://host.docker.internal:8888
CODE_INTERPRETER_JUPYTER_AUTHtoken
CODE_INTERPRETER_JUPYTER_AUTH_TOKEN123456
CODE_INTERPRETER_JUPYTER_TIMEOUT60

๋‹จ๊ณ„ 3: ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธโ€‹

์šฐ์„  Jupyter ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ด๋ฏธ์ง€์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ํ˜„์žฌ๋Š” ๋นˆ work ํด๋”๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์‹คํ–‰ ๊ตฌ์„ฑ

CSV ํŒŒ์ผ ์ƒ์„ฑโ€‹

์ฒซ ๋ฒˆ์งธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‹คํ–‰ํ•ด ๋ด…์‹œ๋‹ค. Code Execution ๋ฒ„ํŠผ์„ ์„ ํƒํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

ํ”„๋กฌํ”„ํŠธ: ๊ฐ€์งœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ CSV ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์„ธ์š”. ์ฒซ ๋ฒˆ์งธ CSV๋Š” ๊ธฐ๋ณธ ํŒŒ์ด์ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ CSV๋Š” pandas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•˜์„ธ์š”. CSV ํŒŒ์ผ ์ด๋ฆ„์€ ๊ฐ๊ฐ data1.csv์™€ data2.csv๋กœ ํ•˜์„ธ์š”.

์ฝ”๋“œ ์‹คํ–‰ ๊ตฌ์„ฑ

CSV ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ ํ˜„์žฌ Jupyter์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์‹คํ–‰ ๊ตฌ์„ฑ

์‹œ๊ฐํ™” ์ƒ์„ฑโ€‹

๋‘ ๋ฒˆ์งธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‹คํ–‰ํ•ด ๋ด…์‹œ๋‹ค. ๋‹ค์‹œ ํ•œ ๋ฒˆ, Code Execution ๋ฒ„ํŠผ์„ ์„ ํƒํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

ํ”„๋กฌํ”„ํŠธ: matplotlib๊ณผ seaborn์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ด์ฌ์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์‹œ๊ฐํ™”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ jupyter์— ์ €์žฅํ•˜์„ธ์š”.

์ฝ”๋“œ ์‹คํ–‰ ๊ตฌ์„ฑ

์‹œ๊ฐํ™”๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ ํ˜„์žฌ Jupyter์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์‹คํ–‰ ๊ตฌ์„ฑ

๋…ธํŠธ๋ถ ์ƒ์„ฑโ€‹

๋งˆ์ง€๋ง‰ ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ•จ๊ป˜ ์‹คํ–‰ํ•ด ๋ด…์‹œ๋‹ค. ์ด๋ฒˆ ํ”„๋กฌํ”„ํŠธ์—์„œ๋Š” ํ”„๋กฌํ”„ํŠธ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์™„์ „ํžˆ ์ƒˆ ๋…ธํŠธ๋ถ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กฌํ”„ํŠธ: json ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ฐ๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ด๋ฅผ notebook.ipynb๋ผ๋Š” ์ด๋ฆ„์˜ ๋‚ด ๋…ธํŠธ๋ถ์— ์ €์žฅํ•˜์„ธ์š”.

์ฝ”๋“œ ์‹คํ–‰ ๊ตฌ์„ฑ

์‹œ๊ฐํ™”๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ ํ˜„์žฌ Jupyter์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์‹คํ–‰ ๊ตฌ์„ฑ

์›Œํฌํ”Œ๋กœ์šฐ์— ๋Œ€ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญโ€‹

์ด ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋ฉด์„œ Open-WebUI์—์„œ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋‚˜ ์ถœ๋ ฅ์„ ๋‚ด Jupyter ์ธ์Šคํ„ด์Šค์— ์ž๋™์œผ๋กœ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ƒ์„ฑํ•œ ํŒŒ์ผ/ํ•ญ๋ชฉ์„ ์ถœ๋ ฅํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋ ค๋ฉด, ๋จผ์ € ์›ํ•˜๋Š” ์ฝ”๋“œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์ด๋ฅผ Jupyter ์ธ์Šคํ„ด์Šค์— ์ €์žฅํ•˜๋„๋ก ์š”์ฒญํ•˜๋Š” ๋‘ ๋‹จ๊ณ„์˜ ์›Œํฌํ”Œ๋กœ๋ฅผ ์ž์ฃผ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์‹คํ–‰ ๊ตฌ์„ฑ

์ด ๊ธฐ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹ ๊ฐ€์š”?โ€‹

Code Execution ๊ธฐ๋Šฅ๊ณผ/๋˜๋Š” Jupyter๋ฅผ ์‚ฌ์šฉ ์ค‘์ด์‹ ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ผญ ์—ฐ๋ฝ ์ฃผ์„ธ์š”. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ฉ‹์ง„ ๋ฐฉ๋ฒ•์˜ ์˜ˆ๋ฅผ ์ด ํŠœํ† ๋ฆฌ์–ผ์— ๊ณ„์† ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!