Artificial Intelligence is changing how users engage with websites. One simple and effective example is building a smart FAQ generator. This tool responds to queries in real-time and adapts to different topics, making user support fast and dynamic.

In this tutorial, you’ll learn how to create an AI-powered FAQ system using React, TypeScript, and the OpenAI API. The app is fast, easy to build, and suitable for real projects. Moreover, it requires no external UI libraries or complex AI models.

This approach gives developers a head start in using AI for frontend experiences. You can use it on landing pages, help centers, or even product dashboards.

Why Use AI for FAQ Generation?

Want more frontend AI tools? Explore other resources on our developer blog.

Tech Stack

We also recommend reading the official docs for Vite and the OpenAI API.

Step 1: Set Up the Project

npm create vite@latest smart-faq-generator -- --template react-ts
cd smart-faq-generator
npm install

Step 2: Install Dependencies

npm install axios react-markdown

Step 3: Add OpenAI API Key

// .env
VITE_OPENAI_API_KEY=your_openai_key_here

Step 4: Build the SmartFAQ Component

import React, { useState, useEffect } from "react";
import axios from "axios";
import ReactMarkdown from "react-markdown";

const cache: Record<string, string[]> = {};

const SmartFAQ = () => {
  const [query, setQuery] = useState("");
  const [faqs, setFaqs] = useState<string[]>([]);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState("");

  useEffect(() => {
    if (!query) return;

    const timer = setTimeout(() => {
      if (cache[query]) {
        setFaqs(cache[query]);
        return;
      }
      fetchFAQs(query);
    }, 600);

    return () => clearTimeout(timer);
  }, [query]);

  const fetchFAQs = async (q: string) => {
    setLoading(true);
    setError("");

    try {
      const res = await axios.post(
        "https://api.openai.com/v1/chat/completions",
        {
          model: "gpt-3.5-turbo",
          messages: [
            { role: "system", content: "You are an FAQ generator bot." },
            { role: "user", content: `Generate 3 FAQs about: "${q}"` },
          ],
        },
        {
          headers: {
            Authorization: `Bearer ${import.meta.env.VITE_OPENAI_API_KEY}`,
            "Content-Type": "application/json",
          },
        }
      );

      const text = res.data.choices?.[0]?.message?.content || "";
      const result = text.split("###").filter((line) => line.trim());

      cache[q] = result;
      setFaqs(result);
    } catch (err) {
      console.error(err);
      setError("Failed to fetch FAQs. Please try again.");
    } finally {
      setLoading(false);
    }
  };

  return (
    <div style={styles.container}>
      <h1 style={styles.heading}>🧠 Smart FAQ Generator</h1>

      <input
        value={query}
        onChange={(e) => setQuery(e.target.value)}
        placeholder="Type a product or topic..."
        style={styles.input}
      />

      {loading && <p style={styles.status}>🔄 Generating FAQs...</p>}
      {error && <p style={{ ...styles.status, color: "red" }}>{error}</p>}

      <div style={styles.faqBlock}>
        {faqs.map((faq, idx) => (
          <div key={idx} style={styles.gptStyleCard}>
            <ReactMarkdown>{faq}</ReactMarkdown>
          </div>
        ))}
      </div>
    </div>
  );
};

export default SmartFAQ;

Step 5: Add Styling

const styles: Record<string, React.CSSProperties> = {
  container: {
    maxWidth: "800px",
    margin: "80px auto",
    padding: "40px",
    fontFamily: "'Inter', 'Segoe UI', system-ui, sans-serif",
  },
  heading: {
    fontSize: "2rem",
    marginBottom: "24px",
    textAlign: "center",
  },
  input: {
    width: "100%",
    padding: "14px",
    fontSize: "1.2rem",
    marginBottom: "30px",
    border: "1px solid #ccc",
    borderRadius: "8px",
  },
  status: {
    fontStyle: "italic",
    fontSize: "1rem",
    color: "#555",
    textAlign: "center",
    marginBottom: "20px",
  },
  faqBlock: {
    marginTop: "30px",
  },
  gptStyleCard: {
    fontFamily: "'Inter', 'Segoe UI', 'Helvetica Neue', system-ui, sans-serif",
    padding: "24px",
    marginBottom: "24px",
    backgroundColor: "#fefefe",
    borderRadius: "16px",
    border: "1px solid #e0e0e0",
    boxShadow: "0 2px 8px rgba(0, 0, 0, 0.05)",
    fontSize: "1.05rem",
    lineHeight: 1.75,
    color: "#333",
  },
};

Try These Example Topics

Final UI of Smart FAQ Generator

Final Thoughts & Next Steps

You now have a working Smart FAQ Generator powered by GPT-3.5. It’s fast, clean, and easy to extend. For example, you could add voice input, database saving, or feedback buttons.

Found this useful? Share it, or visit our blog for more dev guides and AI integrations. Let’s keep building smarter!

Leave a Reply

Your email address will not be published. Required fields are marked *


The reCAPTCHA verification period has expired. Please reload the page.