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

๐Ÿ Python ์ฝ”๋“œ ์‹คํ–‰

๊ฐœ์š”โ€‹

Open WebUI๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ณ ๊ฐ ์ธก๋ฉด์—์„œ Python ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉฐ, Pyodide๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฑ„ํŒ… ๋‚ด ์ฝ”๋“œ ๋ธ”๋ก์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLMs)์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉฐ, Pyodide๊ฐ€ ์ง€์›ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๊ฐœ์ธ์ •๋ณด์™€ ์œ ์—ฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Open WebUI๋Š” PyPI ํŒจํ‚ค์ง€๋ฅผ ๋ฏธ๋Ÿฌ๋งํ•˜์—ฌ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ง์ ‘์ ์œผ๋กœ ํ”ผํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ๋ฒ•์€ ์ธํ„ฐ๋„ท ์ ‘์†์ด ์—†๋Š” ํ™˜๊ฒฝ์—์„œ๋„ Pyodide๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

Open WebUI ํ”„๋ก ํŠธ์—”๋“œ๋Š” Pyodide๋กœ ๊ตฌ๋™๋˜๋Š” ๋…๋ฆฝ์ ์ธ WASM (WebAssembly) Python ํ™˜๊ฒฝ์„ ํฌํ•จํ•˜๋ฉฐ, LLMs๊ฐ€ ์ƒ์„ฑํ•œ ๊ธฐ๋ณธ์ ์ธ Python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ™˜๊ฒฝ์€ ์ถ”๊ฐ€์ ์ธ ์„ค์น˜๋‚˜ ์ค€๋น„ ๊ณผ์ • ์—†์ด๋„ ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ง€์›๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌโ€‹

Pyodide ์ฝ”๋“œ ์‹คํ–‰์€ scripts/prepare-pyodide.js์— ๊ตฌ์„ฑ๋œ ํŒจํ‚ค์ง€๋งŒ ๋กœ๋“œ๋˜๋„๋ก ์„ค์ •๋˜๋ฉฐ ์ดํ›„ "CodeBlock.svelte"์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ Open WebUI์—์„œ ์ง€์›๋˜๋Š” Pyodide ํŒจํ‚ค์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • micropip
  • packaging
  • requests
  • beautifulsoup4
  • numpy
  • pandas
  • matplotlib
  • scikit-learn
  • scipy
  • regex

์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ์กฐ์ž‘, ๋จธ์‹ ๋Ÿฌ๋‹, ์›น ์Šคํฌ๋ ˆ์ดํ•‘ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Open WebUI์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” Pyodide์— ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Python ์ฝ”๋“œ ์‹คํ–‰ ํ˜ธ์ถœโ€‹

Python ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์ฑ„ํŒ… ๋‚ด์—์„œ LLM์—๊ฒŒ Python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ์š”์ฒญํ•˜์‹ญ์‹œ์˜ค. LLM์ด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ฝ”๋“œ ๋ธ”๋ก์˜ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ์‹คํ–‰ ๋ฒ„ํŠผ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด Pyodide๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ธ”๋ก ํ•˜๋‹จ์— ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•˜๋ ค๋ฉด ์ฝ”๋“œ ๋‚ด์— ์ตœ์†Œ ํ•˜๋‚˜์˜ print ๋ฌธ์„ ํฌํ•จ์‹œ์ผœ ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Python ์ฝ”๋“œ ์‹คํ–‰ ์‚ฌ์šฉ ํŒโ€‹

  • Python ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ Pyodide ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋œ๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค. ์ฝ”๋“œ๋ฅผ ์š”์ฒญํ•  ๋•Œ "Pyodide ํ™˜๊ฒฝ"์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ•˜์—ฌ LLM์—๊ฒŒ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Pyodide ๋ฌธ์„œ๋ฅผ ์กฐ์‚ฌํ•˜์—ฌ ํ™˜๊ฒฝ์˜ ๊ธฐ๋Šฅ๊ณผ ์ œํ•œ ์‚ฌํ•ญ์„ ์ดํ•ดํ•˜์‹ญ์‹œ์˜ค.
  • ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ—˜ํ•˜์—ฌ Open WebUI๋ฅผ ํ†ตํ•ด Python ์ฝ”๋“œ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ์„ ํƒ์ƒ‰ํ•˜์‹ญ์‹œ์˜ค.

Pyodide ๋ฌธ์„œโ€‹

์ฝ”๋“œ ์˜ˆ์ œโ€‹

๋‹ค์Œ์€ Pyodide๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ Python ์Šคํฌ๋ฆฝํŠธ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค:

import pandas as pd

# ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ƒ์„ฑ
data = {Name: [John, Anna, Peter],
Age: [28, 24, 35]}
df = pd.DataFrame(data)

# ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ถœ๋ ฅ
print(df)

์ด ์Šคํฌ๋ฆฝํŠธ๋Š” pandas๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ์ƒ์„ฑํ•˜๊ณ  ์ฑ„ํŒ… ๋‚ด ์ฝ”๋“œ ๋ธ”๋ก ์•„๋ž˜์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์ง€์›๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชฉ๋ก ํ™•์žฅโ€‹

๊ฐ€๋Šฅ์„ฑ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ํ™•์žฅํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? ์ง€์›๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชฉ๋ก์„ ํ™•์žฅํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค:

  1. Pyodide ์ €์žฅ์†Œ๋ฅผ ํฌํฌํ•˜์—ฌ ๊ฐœ์ธ ๋ฒ„์ „์„ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค.
  2. Pyodide ๋‚ด ๊ธฐ์กด ํŒจํ‚ค์ง€ ๋ชฉ๋ก์—์„œ ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€ ์„ ํƒํ•˜๊ฑฐ๋‚˜ Open WebUI์—์„œ ํ˜„์žฌ ๋ˆ„๋ฝ๋œ ๊ณ ํ’ˆ์งˆ ํŒจํ‚ค์ง€๋ฅผ ํƒ์ƒ‰ํ•˜์‹ญ์‹œ์˜ค.
  3. ํฌํฌ๋œ ์ €์žฅ์†Œ์— ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€ ํ†ตํ•ฉํ•˜์—ฌ ๋”์šฑ ๋งŽ์€ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋ณด์‹ญ์‹œ์˜ค.