Rubberduck ์๊ฐ
์ต๊ทผ ๋ช ๋ ๊ฐ OpenAI, Anthropic, Google, Microsoft ๊ฐ์ ์ฃผ์ ๊ธฐ์ ๋ค์ด ์ ๊ณตํ๋ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM)์ ํ์ฉํ ์๋น์ค๊ฐ ํญ๋ฐ์ ์ผ๋ก ๋์ด๋๊ณ ์์ต๋๋ค. ํ์ง๋ง LLM API๋ฅผ ์ง์ ํธ์ถํ๋ฉด์ ๊ฐ๋ฐํ๊ฑฐ๋ ํ ์คํธ๋ฅผ ์งํํ๋ค ๋ณด๋ฉด ์ฌ๋ฌ ๊ฐ์ง ์ด๋ ค์์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋คํธ์ํฌ ์ง์ฐ์ด๋ ์๋ ์ ํ, ์์ธก ๋ถ๊ฐ๋ฅํ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๊ณ , ์ด๋ฐ ๋ฌธ์ ๋ ์ค์ ์๋น์ค ํ๊ฒฝ์์ ๊ฐ์๊ธฐ ๋๋ฌ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ํ API ํธ์ถ ๋น์ฉ๋ ๋ฌด์ํ๊ธฐ ํ๋ ์์ค์ ๋๋ค.
์ด๋ฐ ์ํฉ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๋๊ตฌ๊ฐ ๋ฐ๋ก
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 ๋ผ์ด์ ์ค๋ก ๋ฐฐํฌ๋๋ฉฐ, ์์ ์ ์ฌ์ฉ์๋ ์ ์ฝ์ด ์์ต๋๋ค.
Rubberduck ํ๋ก์ ํธ GitHub ์ ์ฅ์
์ด ๊ธ์ GPT ๋ชจ๋ธ๋ก ์ ๋ฆฌํ ๊ธ์ ๋ฐํ์ผ๋ก ํ ๊ฒ์ผ๋ก, ์๋ฌธ์ ๋ด์ฉ ๋๋ ์๋์ ๋ค๋ฅด๊ฒ ์ ๋ฆฌ๋ ๋ด์ฉ์ด ์์ ์ ์์ต๋๋ค. ๊ด์ฌ์๋ ๋ด์ฉ์ด์๋ผ๋ฉด ์๋ฌธ๋ ํจ๊ป ์ฐธ๊ณ ํด์ฃผ์ธ์! ์ฝ์ผ์๋ฉด์ ์ด์ํ๊ฑฐ๋ ์๋ชป๋ ๋ด์ฉ์ ๋ฐ๊ฒฌํ์๋ฉด ๋ง๊ธ๋ก ์๋ ค์ฃผ์๊ธฐ๋ฅผ ๋ถํ๋๋ฆฝ๋๋ค. ![]()
ํ์ดํ ์น ํ๊ตญ ์ฌ์ฉ์ ๋ชจ์
์ด ์ ๋ฆฌํ ์ด ๊ธ์ด ์ ์ฉํ์
จ๋์? ํ์์ผ๋ก ๊ฐ์
ํ์๋ฉด ์ฃผ์ ๊ธ๋ค์ ์ด๋ฉ์ผ
๋ก ๋ณด๋ด๋๋ฆฝ๋๋ค! (๊ธฐ๋ณธ์ Weekly์ง๋ง Daily๋ก ๋ณ๊ฒฝ๋ ๊ฐ๋ฅํฉ๋๋ค.)
์๋
์ชฝ์ ์ข์์
๋ฅผ ๋๋ฌ์ฃผ์๋ฉด ์๋ก์ด ์์๋ค์ ์ ๋ฆฌํ๊ณ ๊ณต์ ํ๋๋ฐ ํ์ด ๋ฉ๋๋ค~ ![]()

