โ† Back to skills
extension
Category: Content & MediaNo API key required

ai-chatbot-builder

The skill of building a custom AI chatbot based on Next.js and Node.js. Develops intelligent business chatbots utilizing OpenAI, Anthropic APIs.

personAuthor: jakexiaohubgithub

๐Ÿค– Next.js AI ์ฑ—๋ด‡ ๋นŒ๋” ์Šคํ‚ฌ

์ด ์Šคํ‚ฌ์€ BSD ๋ฐ”์ด๋ธŒ์ฝ”๋”ฉ ์ˆ˜๊ฐ•์ƒ๋“ค์ด Next.js์™€ Node.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€๋Šฅํ˜• AI ์ฑ—๋ด‡์„ ์›น์‚ฌ์ดํŠธ์— ์ง์ ‘ ๊ตฌ์ถ•ํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

๐Ÿ“‹ ์ด ์Šคํ‚ฌ์ด ํ•˜๋Š” ์ผ

  1. AI ์—”์ง„ ์„ค์ •: OpenAI (GPT-4), Anthropic (Claude) ๋“ฑ ์ตœ์ ์˜ LLM ์„ ํƒ
  2. ๋ฐฑ์—”๋“œ ๊ตฌ์ถ•: Next.js API Routes (Route Handlers)๋ฅผ ์‚ฌ์šฉํ•œ ์ฑ—๋ด‡ ์„œ๋ฒ„ ๊ตฌํ˜„
  3. ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌํ˜„: React(Next.js) ๊ธฐ๋ฐ˜์˜ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ์ฑ„ํŒ… UI ์ œ์ž‘
  4. ์ง€์‹๋ฒ ์ด์Šค(RAG): ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™œ์šฉํ•œ ์ „์šฉ ๋ฐ์ดํ„ฐ ํ•™์Šต ๋ฐ ๋‹ต๋ณ€ ์ตœ์ ํ™”
  5. ์™ธ๋ถ€ ์—ฐ๋™: Slack, Discord, ํ…”๋ ˆ๊ทธ๋žจ ๋“ฑ ๋ฉ€ํ‹ฐ ์ฑ„๋„ ์—ฐ๋™ ๊ฐ€์ด๋“œ

๐ŸŽฏ ์–ธ์ œ ์ด ์Šคํ‚ฌ์„ ์‚ฌ์šฉํ•˜๋‚˜์š”?

  • "Next.js ์‚ฌ์ดํŠธ์— ์šฐ๋ฆฌ ํšŒ์‚ฌ๋งŒ์˜ AI ์ƒ๋‹ด์›์„ ๋„ฃ๊ณ  ์‹ถ์–ด์š”"
  • "PDF ๋ฌธ์„œ๋ฅผ ํ•™์Šตํ•ด์„œ ๋‹ต๋ณ€ํ•ด์ฃผ๋Š” ์ฑ—๋ด‡์„ ์ง์ ‘ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ์–ด์š”"
  • "์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•ด์„œ ๊ฐœ์ธํ™”๋œ ์ถ”์ฒœ์„ ํ•ด์ฃผ๋Š” AI ๋ด‡์ด ํ•„์š”ํ•ด์š”"

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ (Code-First)

1. Framework & Language

  • Next.js 14+ (App Router): ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ API ์„œ๋ฒ„ ํ†ตํ•ฉ
  • TypeScript: ์•ˆ์ •์ ์ธ ์ฝ”๋“œ ๊ฐœ๋ฐœ

2. AI SDKs

  • AI SDK (Vercel): ํ…์ŠคํŠธ ์ƒ์„ฑ ๋ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ์ตœ์ ํ™”
  • LangChain / LlamaIndex: ๋ณต์žกํ•œ ์ฒด์ธ ๋ฐ ๋ฐ์ดํ„ฐ ์—ฐ๋™

3. Database & Vector Store

  • Supabase (pgvector): ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ฐ ๋ฒกํ„ฐ ๊ฒ€์ƒ‰
  • Pinecone: ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์šฉ ๋ฒกํ„ฐ ์—”์ง„

๐Ÿ’ป Next.js ์ฑ—๋ด‡ ๊ตฌํ˜„ ์˜ˆ์‹œ

1. Client UI (components/ChatBox.tsx)

"use client";
import { useChat } from "ai/react";

export default function ChatBox() {
  const { messages, input, handleInputChange, handleSubmit } = useChat();

  return (
    <div className="flex flex-col w-full max-w-md mx-auto stretch">
      {messages.map((m) => (
        <div
          key={m.id}
          className={`whitespace-pre-wrap p-4 ${
            m.role === "user"
              ? "bg-slate-100"
              : "bg-blue-50 text-blue-900 border-l-4 border-blue-500"
          }`}
        >
          <strong>{m.role === "user" ? "๐Ÿ‘ค ๋‚˜: " : "๐Ÿค– AI: "}</strong>
          {m.content}
        </div>
      ))}
      <form onSubmit={handleSubmit}>
        <input
          className="fixed bottom-0 w-full max-w-md p-2 mb-8 border border-gray-300 rounded shadow-xl focus:outline-none focus:ring-2 focus:ring-blue-500"
          value={input}
          placeholder="๋ฌด์—‡์ด๋“  ๋ฌผ์–ด๋ณด์„ธ์š”..."
          onChange={handleInputChange}
        />
      </form>
    </div>
  );
}

2. Server API (app/api/chat/route.ts)

import { OpenAIStream, StreamingTextResponse } from "ai";
import OpenAI from "openai";

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

export async function POST(req: Request) {
  const { messages } = await req.json();
  const response = await openai.chat.completions.create({
    model: "gpt-4-turbo",
    stream: true,
    messages: [
      {
        role: "system",
        content: "๋‹น์‹ ์€ BSD ๋ฐ”์ด๋ธŒ์ฝ”๋”ฉ ์„ผํ„ฐ์˜ ์นœ์ ˆํ•œ ์ƒ๋‹ด์›์ž…๋‹ˆ๋‹ค.",
      },
      ...messages,
    ],
  });

  const stream = OpenAIStream(response);
  return new StreamingTextResponse(stream);
}

๐Ÿ“Š ์ฑ—๋ด‡ ์œ ํ˜•๋ณ„ ํ™œ์šฉ ์‚ฌ๋ก€

1. ์ง€์‹ ๊ธฐ๋ฐ˜ ์ƒ๋‹ด ๋ด‡ (RAG)

  • ํšŒ์‚ฌ์˜ ๋งค๋‰ด์–ผ, ์ •์ฑ… PDF๋ฅผ ํ•™์Šตํ•˜์—ฌ ๋‹ต๋ณ€
  • API ์—ฐ๋™์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์žฌ๊ณ ๋‚˜ ๊ฐ€๊ฒฉ ์ •๋ณด ๋ฐ˜์˜

2. ์˜์—… ๋ฐ ๋ฆฌ๋“œ ์ œ๋„ค๋ ˆ์ด์…˜ ๋ด‡

  • ๋Œ€ํ™”๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ๋‹ˆ์ฆˆ ํŒŒ์•… ํ›„ DB์— ์ €์žฅ
  • ๊ด€๋ จ ์ƒํ’ˆ์˜ ๊ฒฐ์ œ ๋งํฌ(Check-out)๋กœ ์œ ๋„

๐Ÿ’ฌ ์˜ˆ์ œ ๋Œ€ํ™”

์‚ฌ์šฉ์ž: "์šฐ๋ฆฌ ์‡ผํ•‘๋ชฐ์— ์ƒํ’ˆ ์ถ”์ฒœํ•ด์ฃผ๋Š” AI ์ฑ—๋ด‡์„ Next.js๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์–ด"

Claude: "Next.js์™€ OpenAI API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งž์ถคํ˜• ์ƒํ’ˆ ์ถ”์ฒœ ์ฑ—๋ด‡์„ ๊ตฌ์ถ•ํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ์ทจํ–ฅ์„ ๋ถ„์„ํ•˜๊ณ , ๋‚ด๋ถ€ DB์™€ ์—ฐ๋™ํ•˜์—ฌ ์ตœ์ ์˜ ์ƒํ’ˆ์„ ์ œ์•ˆํ•˜๋Š” ๋กœ์ง์„ ํฌํ•จํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด ๋“œ๋ฆด๊ฒŒ์š”..."


๐ŸŽฏ ํ•ต์‹ฌ ์ •๋ฆฌ

์ด ์Šคํ‚ฌ์„ ์‚ฌ์šฉํ•˜๋ฉด: โœ… Vercel AI SDK๋ฅผ ํ™œ์šฉํ•œ ๊ณ ์„ฑ๋Šฅ ์ฑ—๋ด‡ ๊ตฌํ˜„ โœ… Stream ์‘๋‹ต์œผ๋กœ ์‹ค์ œ ์‚ฌ๋žŒ๊ณผ ๋Œ€ํ™”ํ•˜๋Š” ๋“ฏํ•œ UX ์ œ๊ณต โœ… Node.js ๋ฐฑ์—”๋“œ๋ฅผ ํ†ตํ•ด ๋ณด์•ˆ ์ด์Šˆ(API Key ๋…ธ์ถœ) ํ•ด๊ฒฐ โœ… Custom Data ์—ฐ๋™์œผ๋กœ ์šฐ๋ฆฌ ํšŒ์‚ฌ๋งŒ์˜ ํŠน๋ณ„ํ•œ AI ๊ตฌ์ถ•

BSD ํ•™์ƒ์ด๋ผ๋ฉด: ์™ธ๋ถ€ ์œ ๋ฃŒ ์ฑ—๋ด‡ ์†”๋ฃจ์…˜์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์ง์ ‘ AI ํ”„๋กœ๋•ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ€์น˜๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿค–