Rubberduck๐Ÿฆ†: ์ฃผ์š” LLM ์ œ๊ณต์ž์˜ API๋ฅผ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” LLM API Caching Reverse Proxy Server

Rubberduck ์†Œ๊ฐœ

์ตœ๊ทผ ๋ช‡ ๋…„๊ฐ„ OpenAI, Anthropic, Google, Microsoft ๊ฐ™์€ ์ฃผ์š” ๊ธฐ์—…๋“ค์ด ์ œ๊ณตํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLM)์„ ํ™œ์šฉํ•œ ์„œ๋น„์Šค๊ฐ€ ํญ๋ฐœ์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ LLM API๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด๋‚˜ ์†๋„ ์ œํ•œ, ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ์‹ค์ œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ๊ฐ‘์ž๊ธฐ ๋“œ๋Ÿฌ๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ API ํ˜ธ์ถœ ๋น„์šฉ๋„ ๋ฌด์‹œํ•˜๊ธฐ ํž˜๋“  ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๊ฐ€ ๋ฐ”๋กœ :duck:Rubberduck์ž…๋‹ˆ๋‹ค. Rubberduck์€ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋Š” **LLM ์บ์‹ฑ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„(LLM API Caching Reverse Proxy Server)**๋กœ, OpenAI, Anthropic, Azure OpenAI, AWS Bedrock, Google Vertex AI ๋“ฑ ์ฃผ์š” LLM ์ œ๊ณต์ž์˜ API๋ฅผ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ ํ™˜๊ฒฝ๊ณผ ๊ฑฐ์˜ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋ฉด์„œ๋„ ๋น„์šฉ ๋ถ€๋‹ด ์—†์ด ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” Rubberduck์„ ํ†ตํ•ด ์š”์ฒญ/์‘๋‹ต ์บ์‹ฑ, ์‹คํŒจ ์ฃผ์ž…, ์†๋„ ์ œํ•œ, ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰ ์ถ”์ , ์‚ฌ์šฉ์ž๋ณ„ ํ”„๋ก์‹œ ์ธ์Šคํ„ด์Šค ๊ฒฉ๋ฆฌ ๋“ฑ์„ ์†์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ React ๊ธฐ๋ฐ˜์˜ ์ง๊ด€์ ์ธ ์›น ๋Œ€์‹œ๋ณด๋“œ๋„ ์ œ๊ณตํ•˜์—ฌ ํ”„๋ก์‹œ ์ƒ์„ฑ๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์‹œ๊ฐ์ ์œผ๋กœ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด OpenAI API๋‚˜ Anthropic API๋ฅผ ์ด์šฉํ•ด ์ฑ—๋ด‡, ๋ฌธ์„œ ์š”์•ฝ, ์ฝ”๋“œ ๋ณด์กฐ ๋„๊ตฌ ๋“ฑ์„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ณผ์ •์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ ๋ฏผ์ด ์ƒ๊น๋‹ˆ๋‹ค:

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

Rubberduck์€ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๋งˆ์น˜ โ€œLLM API์˜ ์ƒŒ๋“œ๋ฐ•์Šค ํ™˜๊ฒฝโ€์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

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

LLM Provider์˜ API ์—๋ฎฌ๋ ˆ์ด์…˜

Rubberduck์€ OpenAI, Anthropic, Google, Microsoft, AWS ๊ฐ™์€ ์ฃผ์š” LLM ์ œ๊ณต์ž๋ฅผ ๊ทธ๋Œ€๋กœ ํ‰๋‚ด๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, OpenAI SDK๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹จ์ˆœํžˆ base_url๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด Rubberduck์„ ํ†ตํ•ด ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์‹ค์ œ API ํ˜ธ์ถœ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

import openai

client = openai.OpenAI(
    api_key="your-openai-key",
    base_url="http://localhost:8001"  # Rubberduck ํ”„๋ก์‹œ ํฌํŠธ
)

response = client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "์•ˆ๋…•ํ•˜์„ธ์š”!"}]
)

์บ์‹ฑ ๊ธฐ๋Šฅ

  • ์„ฑ๊ณต์ ์ธ ์‘๋‹ต(2xx)๋งŒ ์บ์‹ฑ
  • ๋™์ผ ์š”์ฒญ์ด ๋ฐ˜๋ณต๋˜๋ฉด ์ฆ‰์‹œ ์‘๋‹ต ๋ฐ˜ํ™˜ โ†’ ๋น„์šฉ ์ ˆ๊ฐ ๋ฐ ์†๋„ ํ–ฅ์ƒ
  • ํ”„๋ก์‹œ ์ธ์Šคํ„ด์Šค๋ณ„ ์บ์‹œ ๋ฌดํšจํ™” ๊ฐ€๋Šฅ

์‹คํŒจ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Rubberduck์€ ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์ง์ ‘ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

  • Timeout: ์‘๋‹ต ์ง€์—ฐ ํ˜น์€ ๋ฌดํ•œ ๋Œ€๊ธฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
  • Error Injection: 429(์†๋„ ์ œํ•œ), 500(์„œ๋ฒ„ ์—๋Ÿฌ), 400(์ž˜๋ชป๋œ ์š”์ฒญ) ๋“ฑ ์›ํ•˜๋Š” ์—๋Ÿฌ์œจ ์„ค์ •
  • Rate Limiting: LLM ์ œ๊ณต์ž์˜ ํ˜„์‹ค์ ์ธ ์†๋„ ์ œํ•œ ์ƒํ™ฉ ์žฌํ˜„

๋กœ๊น…๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง

  • ์š”์ฒญ๋ณ„ ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰, ์‘๋‹ต ์‹œ๊ฐ„, ์บ์‹œ ์ ์ค‘๋ฅ  ์ถ”์ 
  • CSV/JSON ๋‚ด๋ณด๋‚ด๊ธฐ ์ง€์› โ†’ ๋ถ„์„ ๋„๊ตฌ์™€ ์—ฐ๊ณ„ ๊ฐ€๋Šฅ
  • ์ „์ฒด ํ”„๋ก์‹œ ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•œ ๋Œ€์‹œ๋ณด๋“œ ์ œ๊ณต

Web UI

React ๊ธฐ๋ฐ˜์˜ ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํด๋ฆญ ๋ช‡ ๋ฒˆ์œผ๋กœ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ ์ŠคํŠธ๋ฆฌ๋ฐ, ์‚ฌ์šฉ์ž ๊ณ„์ • ๊ด€๋ฆฌ, ์„ค์ • ๋ณ€๊ฒฝ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด์„ ์Šค

Rubberduck ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค๋กœ ๋ฐฐํฌ๋˜๋ฉฐ, ์ƒ์—…์  ์‚ฌ์šฉ์—๋„ ์ œ์•ฝ์ด ์—†์Šต๋‹ˆ๋‹ค.

:github: Rubberduck ํ”„๋กœ์ ํŠธ GitHub ์ €์žฅ์†Œ




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

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

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