๐Ÿ“บ ์˜์ƒ ์š”์•ฝ ์•„์นด์ด๋ธŒ
โ† ๋ชฉ๋ก

Productionizing LLM Gateways: Architecture, Tradeoffs and Hard Lessons โ€” Kanish Manuja, Twilio

AI Engineer ยท 2026-08-29 00:30 ยท 16:24

ํ•œ ์ค„ ํ•ต์‹ฌ

LLM ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ๋‹จ์ˆœํ•œ ์ค‘๊ณ„๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ€์šฉ์„ฑยท์ง€์—ฐ์‹œ๊ฐ„ยท๊ฐ€๋“œ๋ ˆ์ผยท๋น„์šฉ์„ ๋™์‹œ์— ๋‹ค๋ฃจ๋Š” ์ œ์–ด๋ฉด์ด๋ฏ€๋กœ, ๊ฐ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๊ฒŒ ์‹คํŒจ ์ •์ฑ…๊ณผ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.

์‹œ๊ฐ„๋ณ„ ์š”์•ฝ

  1. 0:00
    ๋ฉ”์‹œ์ง€ ๋„ˆ๋จธ์˜ ์‹œ์Šคํ…œ ๋ชจ๋ธ ์ œ๊ณต์ž๊ฐ€ ๋‹ค์šด๋ผ๋„ "Something went wrong" ๋ฉ”์‹œ์ง€๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋’ค์—๋Š” ๋ณต์žกํ•œ ๊ฒŒ์ดํŠธ์›จ์ด ์‹œ์Šคํ…œ์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์•ฑ๊ณผ ๋ชจ๋ธ ์ œ๊ณต์ž ์‚ฌ์ด์—์„œ ๋ผ์šฐํŒ…ยท์ธ์ฆยทfallbackยทrate limitยท๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค. ํ•ต์‹ฌ์€ LLM ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ ๊ฐ€์šฉ์„ฑ, ์ง€์—ฐ์‹œ๊ฐ„, ๊ฐ€๋“œ๋ ˆ์ผ, ๋น„์šฉ์„ ๋™์‹œ์— ์ตœ๋Œ€ํ™”ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ด๋‹ค.
  2. 1:21
    ๋™์‹œ์— ์ตœ๋Œ€๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๋„ค ๊ฐ€์ง€ ๋‹จ์ผ ๋ชจ๋ธ ์ œ๊ณต์ž๋ฅผ ์“ฐ๋ฉด ๊ทธ ์ œ๊ณต์ž์˜ ์žฅ์• ๊ฐ€ ๊ณง ์„œ๋น„์Šค ์žฅ์• ๊ฐ€ ๋˜๋ฏ€๋กœ, ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ณ„๋กœ ๋ฌด์—‡์„ ์šฐ์„ ํ• ์ง€ ์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ๋งŒ๋“œ๋Š” ์ชฝ์€ ํ˜ธ์ถœ์ž์™€ ๊ณ ๊ฐ์ด ์ด ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ ํƒ์ง€๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.
  3. 2:33
    ์žฌ์‹œ๋„์™€ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๊ฐ€ ํ†ตํ•˜์ง€ ์•Š๋Š” ์ด์œ  LLM API๋Š” ๋А๋ฆฌ๊ณ  ๋น„์‹ธ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ API์ฒ˜๋Ÿผ ๋ฌด์ž‘์ • ์žฌ์‹œ๋„ํ•˜๋ฉด ์ง€์—ฐ์‹œ๊ฐ„ ์˜ˆ์‚ฐ๊ณผ ๋น„์šฉ์ด ๋น ๋ฅด๊ฒŒ ์†Œ์ง„๋œ๋‹ค. ๋‹ค๋ฅธ ์ œ๊ณต์ž๊ฐ€ ๋ฉ€์ฉกํ•  ๋•Œ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋งŒ ํŠธ๋ฆฝํ•˜๋Š” ๊ฒƒ๋„ ์ ์ ˆํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์‹  ์š”์ฒญ ๋‹จ์œ„์˜ fallback์ด๋‚˜ ๋ณ‘๋ ฌ ํ˜ธ์ถœ ๊ฐ™์€ ์ „๋žต์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
  4. 3:39
    ์š”์ฒญ๋ณ„ fallback๊ณผ ์‹คํŒจ ์นด์šดํŠธ์˜ ์œ„์น˜ primary๊ฐ€ ๊ณ„์† ์‹คํŒจํ•˜๋ฉด ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์š”์ฒญ ๊ฒฝ๋กœ์—์„œ ๋นผ๊ณ  cooldown ํ›„ ๋‹ค์‹œ ๋„ฃ๋Š” ๋ฐฉ์‹์ด ์œ ํšจํ•˜๋‹ค. ์‹คํŒจ ์นด์šดํŠธ๋ฅผ ์ธ์Šคํ„ด์Šค ๋กœ์ปฌ์— ๋‘˜์ง€, fleet ์ „์ฒด๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์ธํ”„๋ผ์— ๋‘˜์ง€์— ๋”ฐ๋ผ failover ์†๋„์™€ ๋ฐฐํฌ ๊ทœ๋ชจ ๋ณ€๊ฒฝ ์‹œ์˜ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง„๋‹ค.
  5. 4:49
    fallback์€ ํˆฌ๋ช…ํ•˜์ง€ ์•Š๋‹ค OpenAI API ํ˜ธํ™˜ ํ˜•์‹์ด ๋„๋ฆฌ ํผ์กŒ๋”๋ผ๋„ tool calling schema, token limit, stop reason ๊ฐ™์€ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด ๋•Œ๋ฌธ์— fallback์€ ๊ทธ๋Œ€๋กœ ๋ฏฟ์„ ์ˆ˜ ์—†๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์—๋Š” ์ข‹์ง€๋งŒ ํ•œ ๋ฒˆ provider A๋กœ ๋ณด๋‚ด๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ค‘๊ฐ„์— provider๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์œ ์—ฐ์„ฑ์„ ์žƒ๋Š” ๋Œ€๊ฐ€๊ฐ€ ๋”ฐ๋ฅธ๋‹ค.
  6. 5:55
    ๋ฐฑ์—… ์ œ๊ณต์ž์— ๋” ๋งŽ์€ ์—ฌ์œ ๋ฅผ ์ค˜์•ผ ํ•œ๋‹ค fallback provider๋Š” ๋งˆ์ง€๋ง‰ ๋ฐฉ์–ด์„ ์ด๋ฏ€๋กœ primary๋ณด๋‹ค ๋” ๋†’์€ throughput๊ณผ headroom์„ ํ™•๋ณดํ•ด์•ผ ํ•œ๋‹ค. ์ง€์—ฐ์‹œ๊ฐ„ ๋ฌธ์ œ๋Š” ์กฐ์šฉํžˆ ์„œ๋น„์Šค ํ’ˆ์งˆ์„ ๊ฐ‰์•„๋จน๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ˆœ ๊ฐ€์šฉ์„ฑ๋ณด๋‹ค ๋” ์ ๊ทน์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  7. 7:08
    ํ˜ผํ•ฉ ์›Œํฌ๋กœ๋“œ์™€ ํ‰๊ท  ์ง€์—ฐ์‹œ๊ฐ„์˜ ์ฐฉ์‹œ embedding, classification, chat, reasoning์ฒ˜๋Ÿผ ์„ฑ๊ฒฉ์ด ๋‹ค๋ฅธ ์š”์ฒญ์ด ์„ž์ธ ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ๋Š” ์ „์ฒด ํ‰๊ท  ์ง€์—ฐ์‹œ๊ฐ„์ด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. P99๋Š” ๋ชจ๋ธ๋ณ„ยทroute๋ณ„๋กœ ์ถ”์ ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฐ model class์™€ route์— timeout์„ ๋ฐ˜๋“œ์‹œ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์กฐ์šฉํ•œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  8. 8:17
    Reasoning๊ณผ router ๋ชจ๋ธ, 2์ดˆ์—์„œ 60์ดˆ๊นŒ์ง€ reasoning model์€ ๋น„๊ฒฐ์ •์„ฑ์ด ์ปค์„œ ๊ฐ™์€ ํ”„๋กฌํ”„ํŠธ๋„ 2์ดˆ์—์„œ 60์ดˆ๊นŒ์ง€ ํ”๋“ค๋ฆด ์ˆ˜ ์žˆ๊ณ , router model์€ ์–ด๋–ค ๋ชจ๋ธ์„ ์ผ๋Š”์ง€ ๋’ค์—์„œ ์ˆจ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ธก์ด ๋” ์–ด๋ ต๋‹ค. ์ตœ์†Œํ•œ route๋ณ„ reasoning ์ˆ˜์ค€์„ ๊ณ ์ •ํ•˜๊ณ , ๊ฐ€๋Šฅํ•œ ํ•œ ์š”์ฒญ์„ ๊ฒฐ์ •์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์šด์˜ํ•ด์•ผ ํ•œ๋‹ค.
  9. 9:28
    ๊ผฌ๋ฆฌ ์ง€์—ฐ์‹œ๊ฐ„์„ ํ—ค์ง€ํ•˜๊ธฐ primary ์š”์ฒญ์ด P90 ์ •๋„์˜ ์ง€์—ฐ ์˜ˆ์‚ฐ์„ ์†Œ๋ชจํ•˜๋ฉด ๋‹ค๋ฅธ ์š”์ฒญ์„ ์ถ”๊ฐ€๋กœ ๋ฐœ์‚ฌํ•˜๋Š” hedging์œผ๋กœ P99 ๊ผฌ๋ฆฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€๋“œ๋ ˆ์ผ์€ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜, PII, ๋…์„ฑ ํ•„ํ„ฐ๋ง์— ํ•„์š”ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ์„œ๋น„์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์žฅ์• ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ fail open๊ณผ fail closed ์ค‘ ๋ฌด์—‡์ด ๋” ๋‚˜์œ์ง€ ๋จผ์ € ์ •ํ•ด์•ผ ํ•œ๋‹ค.
  10. 10:40
    ์—ด๋ฆฐ ์‹คํŒจ์™€ ๋‹ซํžŒ ์‹คํŒจ์˜ ๊ฐ€๋“œ๋ ˆ์ผ ๊ฐ€๋“œ๋ ˆ์ผ์ด ๋‚ด๋ ค๊ฐ”์„ ๋•Œ๋„ ์„œ๋น„์Šค๋ฅผ ๊ณ„์†ํ• ์ง€, ์•„๋‹ˆ๋ฉด ์š”์ฒญ์„ ๋ง‰์„์ง€๋Š” use case์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฉฐ ์ •๋‹ต์€ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ๋“  ๊ฐ€๋“œ๋ ˆ์ผ์€ ์š”์ฒญ ์‹œ๊ฐ„์„ ์ง€๋ฐฐํ•˜์ง€ ์•Š๋„๋ก ๋ณ„๋„ time budget๊ณผ timeout์„ ๊ฐ€์ ธ์•ผ ํ•˜๊ณ , fallback๊ณผ cache decision๋„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
  11. 11:53
    ์‹œ๊ฐ„ ์˜ˆ์‚ฐ, fallback, ๋ฐฐ์น˜ ์œ„์น˜ ๊ฐ€๋“œ๋ ˆ์ผ์€ ์ž…๋ ฅ์— ๋จผ์ € ์ ์šฉํ•˜๋Š” pre-hook, ๋ณ‘๋ ฌ ์‹คํ–‰, ์ถœ๋ ฅ ์ดํ›„์— ์ ์šฉํ•˜๋Š” post-hook์œผ๋กœ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. pre-hook์€ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜์ง€๋งŒ ์ง€์—ฐ์‹œ๊ฐ„์ด ๋Š˜๊ณ , structured output์—์„œ๋Š” ๋ณ‘๋ ฌ ์‹คํ–‰์ด ํŠนํžˆ ์œ ์šฉํ•˜๋ฉฐ, post-hook์€ ์ถœ๋ ฅ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๊ฐ์‚ฌ์— ์ ํ•ฉํ•˜๋‹ค.
  12. 13:02
    ์ƒˆ๋กœ์šด ์˜์กด์„ฑ์œผ๋กœ์„œ์˜ ๊ฒŒ์ดํŠธ์›จ์ด LLM ๊ฒŒ์ดํŠธ์›จ์ด ์ž์ฒด๊ฐ€ ์š”์ฒญ ๊ฒฝ๋กœ์— ์ƒˆ dependency๊ฐ€ ๋˜๋ฏ€๋กœ, API key๋ฅผ route์™€ use case๋ณ„๋กœ ์ตœ๋Œ€ํ•œ ์„ธ๋ถ„ํ™”ํ•ด noisy tenant์˜ ์˜ํ–ฅ์„ ์ค„์—ฌ์•ผ ํ•œ๋‹ค. retry storm ์ƒํ™ฉ์—์„œ๋Š” ๋‹จ์ˆœ scale-out์ด ํ†ตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ load shedding, bounded queue, traffic prioritization์ด ์ค‘์š”ํ•˜๋‹ค.
  13. 14:11
    ์žฌ์‹œ๋„ ํญ์ฃผ ์† ๋กœ๋“œ ์…ฐ๋”ฉ ์žฌ์‹œ๋„ ํญ์ฃผ๊ฐ€ ์˜ค๋ฉด ์›น ์„œ๋ฒ„ ๋‚ด๋ถ€ ํ๊ฐ€ ๋ฌดํ•œ์ • ์Œ“์ด์ง€ ์•Š๋„๋ก ์ œํ•œํ•ด์•ผ ํ•˜๋ฉฐ, ์ค‘์š”ํ•œ ํŠธ๋ž˜ํ”ฝ์„ ์šฐ์„  ์ฒ˜๋ฆฌํ•˜๋Š” ์ •์ฑ…์ด ํ•„์š”ํ•˜๋‹ค. ํšŒ์‚ฌ ์ „์ฒด๋ฅผ ์œ„ํ•œ ๋‹จ์ผ central gateway๋Š” single point of failure๊ฐ€ ๋˜๊ธฐ ์‰ฌ์šฐ๋ฏ€๋กœ, ํŠธ๋ž˜ํ”ฝ์€ ๋ถ„์‚ฐํ•˜๋˜ ๊ฑฐ๋ฒ„๋„Œ์Šค๋งŒ ์ค‘์•™ํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์ด ๋” ์•ˆ์ „ํ•˜๋‹ค.
  14. 15:18
    ์ค‘์•™ ๊ฒŒ์ดํŠธ์›จ์ด ์—†์ด ์ค‘์•™ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ตฌํ˜„ํ•˜๊ธฐ ์ค‘์•™ํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ํŠธ๋ž˜ํ”ฝ์ด ์•„๋‹ˆ๋ผ cost tracking๊ณผ rate limit ๊ฐ™์€ ๊ฑฐ๋ฒ„๋„Œ์Šค์ด๋ฉฐ, ์ด๋Š” plugin์ด๋‚˜ custom code๋กœ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ „์ฒด ํšŒ์‚ฌ๋ฅผ ํ•˜๋‚˜์˜ ๋ฐฐํฌ ๋‹จ์œ„๋กœ ๋ฌถ๊ธฐ๋ณด๋‹ค, ๋ถ„์‚ฐ๋œ ๊ฒŒ์ดํŠธ์›จ์ด ์œ„์— ์ค‘์•™ ์ •์ฑ…์„ ์–น๋Š” ๊ตฌ์กฐ๊ฐ€ ๋” ์‹ค์šฉ์ ์ด๋‹ค.

์‹ค๋ฌด ์ธ์‚ฌ์ดํŠธ

  • LLM ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ๋Š” "์‹คํŒจ ์‹œ ๋ฌด์—‡์„ ํฌ๊ธฐํ• ์ง€"๋ฅผ ๋จผ์ € ์ •ํ•˜๊ณ , provider๋ณ„ fallbackยทtimeoutยทheadroom์„ ๊ทธ ์ •์ฑ…์— ๋งž๊ฒŒ ์ˆซ์ž๋กœ ๊ณ ์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • ์šด์˜ ์ง€ํ‘œ๋Š” gateway ์ „์ฒด ํ‰๊ท ์ด ์•„๋‹ˆ๋ผ ๋ชจ๋ธยทroute ๋‹จ์œ„ P99์™€ timeout ์ค€์ˆ˜ ์—ฌ๋ถ€๋กœ ๋ด์•ผ ํ•˜๋ฉฐ, ํ˜ผํ•ฉ ์›Œํฌ๋กœ๋“œ์—์„œ๋Š” ์ด๋ฅผ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ์žฅ์• ๋ฅผ ๋†“์น˜๊ธฐ ์‰ฝ๋‹ค.
  • ๋ณด์•ˆ๊ณผ ๊ฐ€์šฉ์„ฑ์˜ ์ถฉ๋Œ์€ ๊ฐ€๋“œ๋ ˆ์ผ์˜ fail open/closed, ๋ฐฐ์น˜ ์œ„์น˜, time budget์„ ๋ช…์‹œํ•˜๋ฉด ์ƒ๋‹น ๋ถ€๋ถ„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.