Chatbot Router Refactoring: Out-of-Scope Guard ๋์ ๊ธฐ
ํ์ฌ ์ด์ ์ค์ธ ์ฑ๋ด์ ๊ธฐ๋ณธ ํ๋ฆ์ ์ฌ์ฉ์์ ์ง๋ฌธ์ด ์์น ๊ธฐ๋ฐ(Location) ์ธ์ง ์ฌ๋ถ๋ฅผ ํ๋ณํ ๋ค, ๊ทธ์ ๋ฐ๋ผ ๋ฒกํฐ ๊ฒ์ ๋ ธ๋ ๋๋ ๋ต๋ณ ์์ฑ ๋ ธ๋๋ก ๋ผ์ฐํ ๋๋ค. ํ์ง๋ง ๊ธฐ์กด ๊ตฌ์กฐ์์๋ ์์น ๊ธฐ๋ฐ์ด ์๋ ์ง๋ฌธ๋ ๋ฌด์กฐ๊ฑด ๋ฒกํฐ ๊ฒ์์ ๊ฑฐ์น๋๋ก ์ค๊ณ๋์ด ์์๋ค. ์๋ฅผ ๋ค์ด โWhat is my name? ๊ฐ์ ๋จ์ํ ์ง์์กฐ์ฐจ ๋ฒกํฐ ๊ฒ์์ ํตํด ๋ถํ์ํ ๋ฌธ์๋ฅผ LLM ์ ๋ ฅ์ ์ถ๊ฐํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ ์๋ต ์๋๊ฐ ๋๋ ค์ง๊ณ ํ ํฐ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด classify_query() ๋ก์ง์ ํ์ฅํ๋ค. ๊ธฐ์กด์๋ โlocationโ๊ณผ โcommonโ ๋ ๊ฐ์ง ํ์
์ผ๋ก๋ง ๋ถ๋ฅํ์ง๋ง, ์ฌ๊ธฐ์ โvisaโ ์ โfallbackโ ํ์
์ ์ถ๊ฐํ๋ค. ์๋ก์ด ๋ผ์ฐํ
๊ท์น์ ๋ฐ๋ผ ๋๋ฉ์ธ ๋ฐ(fallback) ์ง๋ฌธ์ ๋ฌธ์ ๊ฒ์์ ์๋ตํ๊ณ ๋ฐ๋ก ๋ต๋ณ ์์ฑ ๋
ธ๋๋ก ๋ณด๋ผ ์ ์๊ฒ ํ๋ค. ๊ทธ ๊ฒฐ๊ณผ, ๊ธฐ์กด ํ
์คํธ ์คํ ์๊ฐ์ด 310.05์ด โ 241.72์ด๋ก ์ฝ 22% ๋จ์ถ๋์๋ค.

๋ฒ์ ๋ฐ ์ง๋ฌธ ๋ฌธ์ ์ Out-of-Scope Guard
๋ผ์ฐํ
๊ฐ์ ํ์๋, ๋ฒ์ ๋ฐ ์ง๋ฌธ(์: โTell me a jokeโ)์ ๋ํด LLM์ด ๋ฒ์ฉ ๋ต๋ณ์ ํ๋ ๋ฌธ์ ๊ฐ ๋จ์๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด, generate ๋
ธ๋ ์
๊ตฌ์์ ๋๋ฉ์ธ ํ๋ณ์ ๊ฑฐ์ณ OOS(Out-of-Scope) ์ ์ฆ์ ์๋ด ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ Guard Layer๋ฅผ ์ถ๊ฐํ๋ค. ์ด Guard๋ ๋ ๊ฐ์ง ๊ธฐ์ ์ ์กฐํฉํ๋ค.
- Config-driven ๋ฃฐ ๊ธฐ๋ฐ ํํฐ
- YAML/JSON ํ์ผ์ Allow(๋๋ฉ์ธ) / Deny(์ค๋ชฐํก) ๋ฌธ๊ตฌ๋ฅผ ์ ์
- ํซ๋ฆฌ๋ก๋ ์ง์ โ ์ด์ ์ค์๋ ์ฆ์ ๋ฐ์ ๊ฐ๋ฅ
- ๋ค๊ตญ์ด ์๋ฒ ๋ฉ ์ต์ปค ๋งค์นญ
- ๋ฉํฐ๋ง๊ตฌ์ผ ์๋ฒ ๋ฉ ๋ชจ๋ธ(
multilingual-e5,bge-m3)์ ์ฌ์ฉํด ์ธ์ดยทํํ์ด ๋ฌ๋ผ๋ ์๋ฏธ ์ ์ฌ๋๋ฅผ ํ๋จ - ์ฟผ๋ฆฌ์ Allow/Deny ์ต์ปค๋ฅผ ์๋ฒ ๋ฉ ํ dot product๋ก ์ ์ฌ๋ ๊ณ์ฐ
- ์๊ณ๊ฐ(allow/deny threshold) ์กฐ์ ์ผ๋ก ๋ฏผ๊ฐ๋ ์ ์ด
- ๋ฉํฐ๋ง๊ตฌ์ผ ์๋ฒ ๋ฉ ๋ชจ๋ธ(
์ด ๋ฐฉ์์ ์ฑํํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ธ์ด ํ์ฅ์ฑ: ํค์๋ ๋งค์นญ๋ง์ผ๋ก๋ ๋ค๊ตญ์ด/ํจ๋ฌํ๋ ์ด์ฆ ๋์์ด ์ด๋ ต๋ค.
- ์ด์ ํธ์: ์๊ทธ๋ ์ถ๊ฐยท์์ ์ด ์ฆ์ ๋ฐ์๋๋ฉฐ ์ฌ๋ฐฐํฌ๊ฐ ๋ถํ์ํ๋ค.
- ์ํ ์ต์ํ: Generate ๋จ๊ณ ์ ๊ตฌ์์๋ง ์ฐจ๋จํ๋ฏ๋ก ํ๊ท ๋ฆฌ์คํฌ๊ฐ ์ ๋ค.
- ๋น์ฉ/์ง์ฐ ์ต์ ํ: ์ํ ์๋ฒ ๋ฉ 1ํ + ์ฝ์ฌ์ธ ์ ์ฌ๋ ๊ณ์ฐ๋ง ์ถ๊ฐ, ์บ์ฑ ์ ์ง์ฐ ๊ฑฐ์ ์์
๊ตฌํ ๋ฐฉ์
OOS Guard๋ ๋ค์ ์์๋ก ๋์ํ๋ค.
- ๋๋ฉ์ธ ๋งค์นญ
- Allow ๋ฆฌ์คํธ ๋งค์นญ ์ ๋ฐ๋ก ํต๊ณผ
- ๋งค์นญ ์คํจ ์ Deny ๋ฆฌ์คํธ ๋งค์นญ + ์งง์ ์ง์ ํด๋ฆฌ์คํฑ์ผ๋ก OOS ํ์
- OOS ์๋ต
- ์ฆ์ ๋๋ฉ์ธ ์ ๋ ์๋ด ๋ฉ์์ง ๋ฐํ (LLM ํธ์ถ ์๋ต)
- ์๊ณ๊ฐ ํ๋
- ๋ก๊ทธ์ Allow/Deny ์ ์ ๊ธฐ๋ก, ์ฃผ ๋จ์ ๋ถ์์ผ๋ก threshold ์ฌ์ค์
- Fallback ๋ณด๊ฐ
- FAQ ์ธ๋ฑ์ค(BM25/์๋ฒ ๋ฉ)๋ก ๋น ๋ฅธ ์กฐํ ํ ๋งค์นญ ์ ์์ ์์ฑ์ฑ
์ฑ๋ฅ๊ณผ ๋ฐฐํฌ ์ํฅ
์ด๊ธฐ ๊ตฌํ์๋ Hugging Face์ SentenceTransformer๋ฅผ ์ฌ์ฉํ์ผ๋, ๋ชจ๋ธ ๋ค์ด๋ก๋์ 30์ด ์ด์ ์์๋๊ณ Docker ๋น๋ ์๊ฐ๋ 10๋ถ ์ด์ ์ฆ๊ฐํ๋ค. ์ด์ ํจ์จ์ฑ์ ์ํด OpenAI Embedder๋ก ๊ธฐ๋ณธ ์ค์ ์ ๋ณ๊ฒฝํ์, ํ
์คํธ ์คํ ์๊ฐ์ด 210.45์ด๋ก ๋ ์ค์๊ณ , Docker ๋น๋๋ 94.5์ด, ์ด๋ฏธ์ง ํฌ๊ธฐ๋ 1GB๋ก ์์ ํ๋์๋ค.

์ต์ข ์ ์ผ๋ก, Out-of-Scope Guard ๋์ ์ผ๋ก ์๋น์ค ๋ฒ์ ๋ฐ ์ง๋ฌธ์ LLM ํธ์ถ ์์ด ์ฒ๋ฆฌํ๋ฉด์๋ ์ฑ๋ฅ ์ ํ ์์ด ์์ ์ ์ธ ๋ผ์ฐํ ์ ๊ตฌํํ ์ ์์๋ค.
OOS ๊ฒฐ๊ณผ:
