์ถ์ ์ฐํด ๊ฐ,
๊ฐ์ธ ํ๋ก์ ํธ๋ก ์งํํ ํ์ด๋ธ๋ฆฌ๋ ์ฑ๋ด ๋ฐ๋ชจ๋ฅผ ๊ณต๊ฐํฉ๋๋ค.
Rule์ ์์ ์ฑ๊ณผ LLM์ ํ์ฅ์ฑ์ ๊ฒฐํฉํ์ฌ,
์ฐํด ๊ธฐ๊ฐ ๋์ ๋ฐ์ด๋ธ์ฝ๋ฉ ๋ฐฉ์์ผ๋ก ์ง์ ๊ตฌ์ถํ๊ณ ๋ค๋ฌ์ด ๋ณด์์ต๋๋ค.
(โป ํ๋์๋์ฐจ ๊ณต์ ์ฑ๋ด๊ณผ ๋ฌด๊ดํฉ๋๋ค.)
🎬 Hook: 1๋ถ ๋ฐ๋ชจ + ์ต์ข ํ๊ฐ ํ
👉 Demo: hyundai-chatbot-demo.vercel.app
โป ์ฐธ๊ณ : Vercel ๋น๋ ํ๊ฒฝ์์๋ ์ผ๋ถ RAG ์ง์(๋์ด์ฐ๊ธฐยท์ ์ฌ๋ช
์นญยท์คํ์ ๋ฑ)์ ์ธ์๋ฅ ์ด Stackblitz ์คํ ํ๊ฒฝ๋ณด๋ค ๋ฎ๊ฒ ๋ํ๋ ์ ์์ต๋๋ค.
๋ณธ ์์์ Stackblitz ๊ธฐ์ค์ผ๋ก ์ดฌ์๋์์ผ๋ฉฐ, ๋์ผ ์ฝ๋ ๊ธฐ๋ฐ์ผ๋ก Vercel์์๋ ๋๋ถ๋ถ ์ ์์ ์ผ๋ก ์๋ํฉ๋๋ค.
1️⃣ ์ ๋ง๋ค์๋ (Why)
์ด๋ฒ ๋ฐ๋ชจ๋ ๋ฐ์ด๋ธ์ฝ๋ฉ์ ํตํ ์ฑ๋ด ๊ตฌํ ํ๋ก์ ํธ์ ์ผํ์ผ๋ก, ์ฐจ๋ ๊ตฌ๋งค ๋ชฉ์ ์ ์ค์ ์ฌ์ฉ์ ์๋๋ฆฌ์ค์์ ์ถ๋ฐํ์ต๋๋ค.
๊ธฐ์กด ์ฑ๋ด์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ์ ๋ณด ์ ๊ณต์ ์ถฉ๋ถํ์ง๋ง, ๊ตฌ๋งคยท์์นยท์๋ด ๋ฑ ๋ค์ ํ๋์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ์ด์ด์ง๋ ํ๋ฆ์ ๋ ๋ณด์๋ ์ฌ์ง๊ฐ ์์์ต๋๋ค.
๋ชฉํ๋ ๊ธฐ์กด ์์คํ ์ ๋นํํ๋ ๊ฒ์ด ์๋, โ์ ๋ณด ์ ๋ฌ โ ํ๋ ์ ํโ ๊ฐ๊ฒฉ์ ์ค์ด๋ ํ๋ก์ฐ ์ค๊ณ์์ต๋๋ค.
- ๊ตฌ๋งค ๋ชฉ์ ์ฌ์ฉ์ ์๋๋ฆฌ์ค์ ๊ฐ์ ย ํฌ์ธํธ
- ๊ฒฌ์ /์์น ๋ฌธ์๊น์ง ์ด๋ ๋จ๊ณ๊ฐ ๋น๊ต์ ๊ธธ์ด์ง๋ ๊ตฌ๊ฐ
- ์ธ๋ถ ํ์ด์ง ์ด๋ ์ ๋ํ ๋งฅ๋ฝ์ด ๋จ์ ๋๋ ์ง์
- ๋์ผ ๋ฉ๋ด/๋ฒํผ ๋ฐ๋ณต ๋ ธ์ถ๋ก ์ธํ ํ์ ํผ๋ก
์ด์ ๋ฐ๋ผ ๋ฐ๋ชจ๋ โFAQ ์์ฝ + ๊ณต์ ๋งํฌ(CTA) + ์ต์ ๋จ๊ณ ์ ํโ์ ์์น์ผ๋ก, ์ฌ์ฉ์๊ฐ ์ง๋ฌธํ๋ฉด ํ์ ํ๋๊น์ง ์ฆ์ ์ฐ๊ฒฐ๋๊ณ ์ํ๋๋ ๊ฒฝํ์ ์งํฅํ์ต๋๋ค.
2️⃣ ์ด๋ป๊ฒ ๋ง๋ค์๋ (How)
Part 1. ๋ถ์ & ์ ๋ต
- ๊ฐ์ค
- ๋ชฉํ ํ๋(๊ตฌ๋งคยท์์นยทAS)๊น์ง ๊ฒฝ๋ก ๋จ์ถ๊ณผ ๋งํฌ/CTA ๋ฌด๊ฒฐ์ฑ์ด ์ฌ์ฉ์ ๋ง์กฑ๋์ ๋ชฉํ(KPI) ์ ํ์ ๊ฒฐ์ ์ ์ด๋ผ๊ณ ๊ฐ์
- ๋ํ LLM ์ธก๋ฉด์์ ์ ์ฌ ๋ฐํ ๋์๋ ฅ(๋์ด์ฐ๊ธฐยท๋ณ์นญยท์คํ์)์ด ์ค์ฌ์ฉ์ฑ์ ํฐ ์ํฅ์ ์ค๋ค๊ณ ๊ฐ์
- ๋ถ์
- ์ค์ ๊ณต์ ์ฌ์ดํธ ์บก์ฒยท๋ฉ๋ด ํธ๋ฆฌ ๋ถ์
- Top FAQ ๋ฐ ์ ์ฌ ๋ฐํ ์์ง&์ ๊ทํ
- ๋งํฌ ์ ํจ์ฑ ๋ฐ ๋๋ฉ์ธ ์ ๊ฒ
- ์ ๋ต
- ํ๋ก์ฐ ๋จ์ํ(Simplify Flow) โ ๋ฉ๋ด ํตํฉ, CTA ์ค์ฌ ์ค๊ณ, 1~2๋จ๊ณ ๋ด ํด๊ฒฐ
- ์ง์์ ์ธ ์ฐ๊ฒฐ(Connect Experience) โ ํต์ฌ ์ ๋ณด๋ ๋ํ ๋ด ์ ๊ณต, ํ์ ์์๋ง ์ธ๋ถ ๋งํฌ
- ๋ฐ์ดํฐ ์ต์ ํ(Keep Data Fresh) โ ๊ณต์ FAQ 247 + ์ถ๊ฐ Top 50 ์ ๋นํ์ฌ ๋ฐ์ ( ์ง์ ๊ฐํ๋ก RAG ํ์ง ์์ ํ/๊ณ ๋ํ์ ๊ธฐ์ฌ)
Part 2. ์ค๊ณ & ๊ฐ๋ฐ
- ์ํคํ
์ฒ(Front-only Hybrid)
- Rule Layer: ๊ฐ๊ฒฉยท๋ณด์ฆยท๋ฆฌ์ฝยทEV ์ถ์ฒ ๋ฑ ๊ณ ์ ์๋ ์ฐ์ ์ฒ๋ฆฌ
- RAG Layer: faq.json + BM25 ๊ฒ์ โ LLM ์์ฝ
- UX Layer: ์นฉ(Chips), ๋ฐํ ์ํธ, Sticky CTA(๊ณต์ ๋งํฌ/์ ํ)
- R1 โ R2 โ R3 ๊ฐ์ ์ฌ์ดํด
- R1 (Prototype): Rule 70~80% + RAG ๊ธฐ๋ณธ(๊ฐ๋ฅ์ฑ/ํ๋ฆ ์ฐ์ )
- R2 (Tuning): Rule 100% + ํ๋์ฐจ ๊ณต์ FAQ ํฌ๋กค๋ง ๋ฐ์ + BM25 ๊ต์ฒด, ์ ์ฌ ๋ฐํ ์ ๊ทํ, ์๋ ํ ์คํธ ๋ฃจํด ๊ตฌ์ถ
- R3 (QA/Deploy): ์๋/์๋ ๋ผ๋ฒจ ๊ต์ฐจ๊ฒ์ฆ, CTAยทFallback ๋ณด๊ฐ โ ์ต์ข ํ๊ฐ ํ ๊ธฐ์ค ์ ํญ๋ชฉ Pass
Part 3. ์๋ ํ ์คํธ & QA
- ํ
์คํธ ๋ฃจํด
- ์ฝ์ ๊ธฐ๋ฐ runBatch() ์๋ ํ ์คํธ โ ์๋ ๋ผ๋ฒจ๋ง์ผ๋ก ์ต์ข ํ์
- ๋ผ๋ฒจ ๋ถํฌ ๋ณด์ (R1์ ์์)
- ๋ณด์ ์ ์ฑ
(R3 ๋ฐ์)
- Retrieval TopScore ์๊ณ๊ฐ ์กฐ์ (์: โฅ20=Good ํ๋ณด)
- Retrieval ์ฑ๊ณต ์ CTA ํ์ ๋ถ์ฐฉ, Fallback์๋ ๊ณ ๊ฐ์ผํฐ CTA ์ ๊ณต
- ๋ถ๋ถ๋งค์นญ Good๋ Gold ๋ฐ์ดํฐ ๋ณด๊ฐํ์ฌ ์
๋ฐ์ดํธ
โ ์ ๋ณด์ ์ดํ, ๋ณธ๋ฌธ ์๋จ ์ต์ข ํ๊ฐ ํ์ ๊ธฐ์ค์ผ๋ก ํ์ง์ ์ ๊ฒยท์ ๋ฆฌํ์ต๋๋ค.
Part 4. RAG + Rule ํ์ด๋ธ๋ฆฌ๋
- ํ์ ์์๋ Rule-first๋ฅผ ๋ฐ์ํ์ผ๋, ๋ณธ ํ๋ก์ ํธ์์๋ RAG-first๋ฅผ ๋์ ํ์ฌ ์คํ
- Retrieval ์ ๋ขฐ๋(TopScore/Threshold)์ ๋ฐ๋ผ FAQ โ OpenDomain โ Fallback์ผ๋ก ๋ถ๊ธฐ ์ฒ๋ฆฌ
- ์ญํ ๋ถ๋ฆฌ: โRule = ์์ ์ฑโ, โRAG = ์ปค๋ฒ๋ฆฌ์งยท์ค๋ช
๋ ฅโ
โป Vercel ๋ฐฐํฌ ํ๊ฒฝ์์๋ ๋ฐํ์(Edge vs Node) ๋ฐ ๊ฒฝ๋ก ์ฒ๋ฆฌ ์ฐจ์ด๋ก ์ธํด ์ผ๋ถ ์ง์(๋์ด์ฐ๊ธฐ, ์ ์ฌ๋ช ์นญ ๋ฑ)์ ๊ฒ์ ์ธ์๋ฅ ์ด Stackblitz ์คํ ํ๊ฒฝ ๋๋น ๋ค์ ๋ฎ๊ฒ ๋ํ๋ฌ์ต๋๋ค. ์ฝ๋ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ ๋์ผํ๋ฉฐ, ์ด๋ ํ๊ฒฝ ํน์ฑ์์ ๋น๋กฏ๋ ๊ฒฐ๊ณผ๋ก ํ๋จ๋ฉ๋๋ค.
Part 5. ๋ฐฐํฌ ํธ๋ฌ๋ธ์ํ
- Vercel ํ๊ฒฝ: OpenAI ์ง์ ํธ์ถ ์ง์ โ /api/chat.ts ์์ง ํ๋ก์
- ์ธ๋ฑ์ฑ race ๋ฐฉ์ง: ensureRagReady() ์ฑ๊ธํค ์ด๊ธฐํ + ์๋ฒ ๋๋ ์ฝํผ์ค
- dev/prod ์ฝํผ์ค ๋๊ธฐํ: assets ์๋ฒ ๋ + ๋ฐํ์ /faq.json ๋ฎ์ด์ฐ๊ธฐ
- ์ฌํ ๋น ๊ฒฝ๊ณ ํด๊ฒฐ: const โ let
- ๊ณต์ FAQ URL ๋ณ๊ฒฝ: ๋ฆฌ๋ค์ด๋ ํธ ๋ฏธ์ง์ ๊ฑด์ ์ธ๋ถ ์ด์๋ก Skip
3️⃣ ๊ฒฐ๊ณผ & ๋ฐฐ์ด ์ (What / Lessons)
🎯 ํต์ฌ ์ฑ๊ณผ
- ์ต์๋จ ์ต์ข ํ๊ฐ ํ ๊ธฐ์ค์ผ๋ก ์ ํ๋ยท๋ผ์ฐํ /ํด๋ฐฑยท๋งํฌ/CTAยท์ฑ๋ฅยท์คํ์ผ/์์ ยทUI/UX ์ ํญ๋ชฉ Pass๋ฅผ ๋ฌ์ฑํ์ต๋๋ค.
- Rule + RAG ๊ฒฐํฉ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ๊ณ , ์๋ QA ๋ฃจํด(runBatch)์ ์ ์ฉํ์ต๋๋ค.
- R1โR2โR3 ๊ฐ์ ์ฌ์ดํด์ ํตํด ํ์ง์ ํ๋ณดํ๊ณ ํ๋ก๋์ ๋ ๋ ์์ค์ผ๋ก ์ ๋นํ์์ต๋๋ค.
🧩 ์งํ ์ค ์ด๋ ค์
- ๋ง์ง๋ง 5% ์์ฑ ๊ตฌ๊ฐ์์ ์๊ฐ ์์๊ฐ ์ง์ค๋์์ต๋๋ค. (์ฒด๊ฐ์ ์ ์ฒด ์์ ์๊ฐ์ 20% ์ด์)
- ๊ณต์ ์ฌ์ดํธ URL ๋ณ๊ฒฝ(๋ฆฌ๋ค์ด๋ ํธ ๋ฏธ์ง์)๋ก ์ผ๋ถ ํญ๋ชฉ์ Skip ์ฒ๋ฆฌํ์ต๋๋ค.
- ๋ฐ์ด๋ธ ์ฝ๋ฉ ์, ํ๋กฌํํธ ๋ฐ๋ณต ์ ๋ ฅ ์ ๋งฅ๋ฝ์ ๋ฒ์ด๋ ํ์ ์ด์์ผ๋ก ์์ ๋ฐ์ํ๋ ์ผ์ด์ค๊ฐ ๋ง์์ต๋๋ค.
- ๋ฐฐํฌ ํ๊ฒฝ(Vercel)์์ RAG ๊ฒ์ ์ฑ๋ฅ์ด Stackblitz ๋๋น ์ฝํ๊ฒ ๋ํ๋ฌ์ต๋๋ค. ์ด๋ ๋ฐํ์ ๋ฐ ๋น๋ ํ๊ฒฝ ์ฐจ์ด๋ก ์ธํ ํ์์ผ๋ก, ์ค ์๋น์ค ์ํฅ ๋ฒ์๋ RAG ํ์ ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
💡 ๊ตํ
- ์์ ๋จ์๋ ์ต๋ํ ์๊ฒ ์ชผ๊ฐ๊ณ , ๋ฌธ๋งฅ์ ๋ช ํํ๊ฒ ๊ฐ์ ธ๊ฐ์ผ ํฉ๋๋ค. (์ฑ๋ฐฉ ์ต๋ํ ์ชผ๊ฐ๊ธฐ + ์์ธํ ํ๋กฌํํธ ํ์)
- ์ ์ ์ฝ๋๋ ๊ทธ๋๋ก ์ ์ฉํ๊ธฐ๋ณด๋ค ๊ตฌ์กฐ๋ฅผ ํ์ธํ๊ณ ์ต์ ์์ ์ผ๋ก ํด๊ฒฐํด์ผ ํฉ๋๋ค.
- ๋ฐ์ด๋ธ ์ฝ๋ฉ์ ๊ฐ๋ฐ ๋๊ตฌ์ ๊ฐ๊น์ต๋๋ค(๊ธฐ๋ณธ ๋ฌธ๋ฒยท๊ตฌ์กฐ ์ดํด๊ฐ ํจ์จ์ ์ข์ฐ).
- Agent ๋ก ์๋ ๊ฒ์ + ์๋ QA ์กฐํฉ์ผ๋ก ํจ์จ์ ์ผ๋ก ์๊ฐ์ ์๋ผ๊ณ ํ์ง์ ๋์ฌ์ค๋๋ค.
- ์ด๊ธฐ ๋ชฉํ๋ 50% ๋ฒ์๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ์ต์ด ์์๋ณด๋ค 2~3๋ฐฐ์ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ด ์์๋๊ธฐ ์ฌ์, ๋จ๊ณ๋ณ ํ์ฅ์ด ํ๋ช ํฉ๋๋ค.
- RAG ๋ณด์ ์ ์๊ฐ๋ณด๋ค ์ด๋ ต์ต๋๋ค. (์: ์ ์ฌ ๋ฐํยท๋์ด์ฐ๊ธฐยท๋ณ์นญ ๋์ ๋ฑ)
P.S. ์ถ์ ์ฐํด ๋ด๋ด ์์ ํ์ฌ ๋ง์ง๋ง ๋ณด์ ์์ ๊ณผ ๊ธ ์์ ์ ์งํํ๋ ์ด๋๋ง 1์ฃผ์ผ์ด ๊ธ๋ฐฉ์ด๋ค์. ์ฒ์ ํด๋ณด๋ ๋ฐ์ด๋ธ์ฝ๋ฉ์ ์๊ฐ๋ณด๋ค ์ด๋ ต๊ณ ํ๋ค์์ง๋ง, ์๊ฐ๋ณด๋ค ์ฌ๋ฏธ์๊ณ ๋ง์ ๊ฑธ ๋ฐฐ์ธ ์ ์์์ต๋๋ค. ๋ ์ฌ๋ฏธ๋๊ณ ์ฌ์ด ๋ฐ์ด๋ธ์ฝ๋ฉ 2ํ์ผ๋ก ์ฐพ์์ค๊ฒ ์ต๋๋ค 😊🤩








