Buat aplikasi kartu flash bertenaga AI

 – Beragampengetahuan
14 mins read

Buat aplikasi kartu flash bertenaga AI – Beragampengetahuan

Flashcards telah lama digunakan sebagai alat belajar yang efektif, menyediakan pertanyaan yang cepat dan berulang untuk membantu pengguna mengingat fakta atau konsep. Secara tradisional, kartu flash berisi pertanyaan di satu sisi dan jawaban di sisi lain. Konsepnya sederhana namun efektif dalam menghafal apakah Anda sedang mempelajari suatu bahasa, matematika atau mata pelajaran apa pun.

Permainan kartu flash bertenaga AI membawa metode pembelajaran ini ke tingkat berikutnya. Daripada mengandalkan konten statis, AI secara dinamis menghasilkan pertanyaan dan jawaban baru berdasarkan masukan pengguna, pola pembelajaran, dan kinerja dari waktu ke waktu. Personalisasi ini menjadikan proses pembelajaran lebih interaktif dan adaptif, memberikan pertanyaan yang menargetkan area tertentu yang perlu ditingkatkan pengguna.

Dalam tutorial ini, kita akan menggunakan LLaMA 3.1, model bahasa besar open source yang kuat, untuk membuat kartu flash dinamis. Mesin AI akan menghasilkan pertanyaan dan jawaban baru secara real time berdasarkan topik atau kata kunci yang diberikan pengguna. Hal ini membuat kartu flash lebih serbaguna, dipersonalisasi, dan efisien, sehingga meningkatkan pengalaman belajar.

Contents

Ciptakan lingkungan pengembangan

Sebelum kita mulai mengkodekan aplikasi kartu flash kita, kita perlu menyiapkan lingkungan kerja kita.

1. Instal Node.js dan npm

Langkah pertama adalah menginstal Node.js dan npm. Kunjungi situs web Node.js dan dapatkan versi dukungan jangka panjang untuk sistem yang dijalankan komputer Anda. Silakan ikuti langkah-langkah instalasi yang diberikan.

2. Gunakan Next.js untuk membuat proyek

Jalankan terminal Anda dan pergi ke lokasi di mana Anda ingin membuat proyek. Setelah itu, jalankan perintah berikut:

  • npx create-next-app@latest flash-card-app (Dan @latest flag, npm mendapatkan versi terbaru Next.js untuk mulai menyiapkan. )
  • cd flash-card-app

Ini akan membuat proyek Next.js baru dan membawa Anda ke jalurnya. Pada proses setup, Anda akan diberikan beberapa pilihan konfigurasi, pengaturannya sebagai berikut:

  • Apakah Anda ingin menggunakan TypeScript? TIDAK
  • Apakah Anda ingin menggunakan ESLint? Ya
  • Apakah Anda ingin menggunakan Tailwind CSS? TIDAK
  • Anda ingin menggunakan kode sumber/ Daftar isi? TIDAK
  • Apakah Anda ingin menggunakan Router Aplikasi? Ya
  • Apakah Anda ingin menyesuaikan alias impor default? TIDAK

3. Instal Firebase dan Material-UI

Di direktori proyek Anda, jalankan perintah berikut: npm install @mui/material @emotion/react @emotion/styled firebase.

Siapkan Firebase

  • Mulai proyek baru di Firebase console.
  • Setelah proyek dibuat, klik Tambahkan Aplikasi dan pilih Platform Web ().
  • Beri nama pada aplikasi Anda saat mendaftar, misalnya “flash-card-app”.
  • Buat salinan file pengaturan Firebase. Ini akan berguna di masa depan.

4. Buat file konfigurasi Firebase

Buat file baru dengan nama firebase.js Tambahkan kode berikut ke root proyek Anda, ganti placeholder dengan setelan Firebase proyek Anda yang sebenarnya:

import  initializeApp  from "firebase/app";
import  getAnalytics  from "firebase/analytics";
import  getAuth  from "firebase/auth";
import  getFirestore  from "firebase/firestore";

const firebaseConfig = 
apiKey: "YOUR_API_KEY",
authDomain: "YOUR_PROJECT_ID.firebaseapp.com",
projectId: "YOUR_PROJECT_ID",
storageBucket: "YOUR_PROJECT_ID.appspot.com",
messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
appId: "YOUR_APP_ID"
 ;

const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);
export const auth = getAuth(app);
export const db = getFirestore(app);

Cara membuat token API di OpenRouter

Kami akan menggunakan versi gratis LLaMA 3.1 buka router Untuk melakukan ini, kita perlu mendapatkan token API. Berikut langkah-langkah untuk mendapatkannya:

Langkah 1: Daftar atau masuk ke OpenRouter

  1. mengakses Situs web resmi OpenRouter.
  2. membuat akun Jika belum. Anda dapat mendaftar menggunakan email, atau menggunakan penyedia OAuth (seperti Google, GitHub, atau lainnya).
  3. Masuk Jika Anda sudah memiliki akun OpenRouter, buka akun OpenRouter Anda.

Langkah 2: Navigasikan ke Pengaturan Kunci API

  1. Setelah masuk, buka Dasbor.
  2. Di dasbor, temukan antarmuka pemrograman aplikasi atau Alat Pengembang bagian.
  3. klik Kunci API atau Token pilihan.

Langkah 3: Buat kunci API baru

  1. Di bagian Kunci API Anda akan melihat tombol atau tautan Hasilkan kunci API baru.
  2. klik menghasilkan tombol untuk membuat kunci API baru.
  3. Anda mungkin diminta memberikan nama kunci API Anda. Ini dapat membantu Anda mengatur kunci jika Anda memiliki beberapa kunci API untuk proyek berbeda (seperti “Kunci Aplikasi Kartu Flash”).

Langkah 4: Salin kunci API

  1. Setelah kunci API dibuat, kunci itu akan muncul di layar. menyalin Segera kembalikan kunci API, karena beberapa layanan mungkin tidak muncul lagi setelah Anda keluar dari halaman.
  2. Simpan kunci API dengan aman di file konfigurasi lingkungan Anda (misalnya, .env.local).

Langkah 5: Tambahkan kunci API .env.local dokumen

  1. Di proyek Next.js Anda, buka .env.local file (jika tidak ada, buatlah).
  2. Tambahkan baris berikut: OPENROUTER_API_KEY=your-generated-api-key-here.

Pastikan untuk mengganti your-generated-api-key-here Gunakan kunci API sebenarnya yang Anda salin.

Langkah 6: Gunakan kunci API di aplikasi Anda

Bangun logika inti untuk diimpor ke LLaMa 3.1 guna membuat kartu flash

Buat file baru di bawah folder aplikasi bernama route.js dan ikuti kode yang diberikan di bawah ini:

import  NextResponse  from "next/server";

const OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY;

const systemPrompt = `
You are an AI flashcard creator. Your task is to generate concise and effective flashcards based on the given topic or content. Follow these guidelines:
1. Create clear and concise questions for the front of the flashcard.
2. Provide accurate and informative answers for the back of the flashcard, ensuring they do not exceed one or two sentences.
3. Ensure that each flashcard focuses on a single concept or piece of information.
4. Use simple language to make the flashcards accessible to a wide range of learners.
5. Include a variety of question types, such as definitions, examples, comparisons, and applications.
6. Avoid overly complex or ambiguous phrasing in both questions and answers.
7. When appropriate, use mnemonics or memory aids to help reinforce the information.
8. Tailor the difficulty level of the flashcards to the user's specified preferences.
9. If given a body of text, extract the most important and relevant information for the flashcards.
10. Aim to create a balanced set of flashcards that covers the topic comprehensively.
11. Only generate 10 flashcards.

Return in the following JSON format:

    "flashcards": [
        "front": str,
        "back": str
    ]


Remember, the goal is to facilitate effective learning and retention of information through these flashcards.
`;

export async function POST(req) {
    const data = await req.text(); // Get the raw text from the request
  
    try 
      const response = await fetch(" 
        method: "POST",
        headers: 
          "Authorization": `Bearer $OPENROUTER_API_KEY`,
          "Content-Type": "application/json",
        ,
        body: JSON.stringify(
          model: "meta-llama/llama-3.1-8b-instruct",
          messages: [
             role: "system", content: systemPrompt ,
             role: "user", content: data 
          ],
        )
      );
  
      if (!response.ok) 
        throw new Error(`Failed to fetch from OpenRouter AI: $response.statusText`);
      
  
      const completion = await response.json();
      // Extracting JSON from the response content
      const rawJson = completion.choices[0].message.content;
      const startIndex = rawJson.indexOf('');
      const endIndex = rawJson.lastIndexOf('') + 1;
      const jsonString = rawJson.substring(startIndex, endIndex);
      const flashcardsData = JSON.parse(jsonString);
  
      // Assuming flashcardsData contains the "flashcards" array directly
      return NextResponse.json( flashcards: flashcardsData.flashcards );
     catch (error) 
      console.error("Error processing request:", error);
      return new Response("Error processing request",  status: 500 );
    
  }

Kode bekerja dengan menerima a POST permintaan dari klien dan ekstrak input teks mentah menggunakan req.text(). Kemudian ia mengirimkan a POST Membuat permintaan ke OpenRouter API, sistem meminta menguraikan bagaimana LLaMA 3.1 harus menghasilkan kartu flash. Respons yang berisi kartu flash dalam format JSON diurai dan dikembalikan ke klien. Jika kesalahan terjadi selama panggilan atau pemrosesan API, kesalahan tersebut dicatat dan respons 500 dikembalikan ke klien.

Komponen inti untuk membangun aplikasi kartu flash Login dan registrasi menggunakan Clerk

Langkah 1: Siapkan akun juru tulis Anda

  1. Mendaftarlah untuk menjadi juru tulis: Jika Anda belum memiliki akun, buka Clerk.dev dan buat akun.
  2. Buat aplikasi:
    • Setelah masuk, navigasikan ke Dasbor Petugas dan membuat aplikasi baru.
    • Aplikasi ini akan digunakan sebagai sistem otentikasi untuk aplikasi kartu flash Anda.
  3. Ambil kunci API: Di dasbor Panitera Anda, Anda akan menemukan dua kunci: Kunci API ujung depan Dan kunci rahasia. Anda akan menggunakannya dalam proyek Next.js untuk integrasi Clerk.

Langkah 2: Instal Clerk SDK di proyek Next.js

Jalankan perintah berikut untuk menginstal SDK Next.js Clerk: npm install @clerk/nextjs.

Langkah 3: Tetapkan variabel lingkungan

Untuk menyimpan kredensial Panitera Anda dengan aman, tambahkan kredensial tersebut ke file .env.local Anda. Jika file tidak ada, buatlah file:

NEXT_PUBLIC_CLERK_FRONTEND_API=your-frontend-api-key
CLERK_API_KEY=your-secret-api-key

mengganti your-frontend-api-key Dan your-secret-api-key dengan nilai sebenarnya dari dashboard Clerk.

Langkah 4: Bangun komponen login



Belajar dengan cepat





Masuk ke akun Anda


); “data-lang=”teks/javascript”>

"use client";

import  AppBar, Container, Typography, Box, Toolbar, Button  from "@mui/material";
import  useRouter  from 'next/navigation';
import  SignIn  from "@clerk/nextjs";

export default function LoginPage() 
  const router = useRouter();

  const handleHomeClick = () => 
    router.push("
  ;

  return (
    <Container maxWidth="sm">
      <AppBar position="static" sx= mb: 4 >
        <Toolbar>
          <Typography variant="h6" sx= flexGrow: 1 >
            Learn in a Flash
          </Typography>
          <Button color="inherit" onClick=handleHomeClick>
            Home
          </Button>
        </Toolbar>
      </AppBar>
      <Box
        sx=
          display: 'flex',
          flexDirection: 'column',
          alignItems: 'center',
          justifyContent: 'center',
          mt: 4,
          p: 3,
          border: 1,
          borderColor: 'grey.300',
          borderRadius: 2,
        
      >
        <Typography variant="h4" gutterBottom>
          Login to Your Account
        </Typography>
        <SignIn />
      </Box>
    </Container>
  );

Langkah 5: Bangun komponen registrasi

router.push(‘/login’); // Pastikan garis miring di depan untuk rute return (



Belajar dengan cepat






membuat akun


); “data-lang=”teks/javascript”>

"use client";

import  AppBar, Container, Typography, TextField, Button, Box, Toolbar  from "@mui/material";
import  useRouter  from 'next/navigation';

export default function SignUpPage() 
  const router = useRouter();

  const handleHomeClick = () => 
    router.push("
  ;

  const handleLoginClick = () => 
    router.push('/sign-in'); // Ensure the leading slash for routing
  ;

  return (
    <Container maxWidth="sm">
      <AppBar position="static" sx= mb: 4 >
        <Toolbar>
          <Typography variant="h6" sx= flexGrow: 1 >
            Learn in a Flash
          </Typography>
          <Button color="inherit" onClick=handleHomeClick>
            Home
          </Button>
          <Button color="inherit" onClick=handleLoginClick>
            Login
          </Button>
        </Toolbar>
      </AppBar>
      <Box
        sx=
          display: 'flex',
          flexDirection: 'column',
          alignItems: 'center',
          justifyContent: 'center',
          mt: 4,
          p: 3,
          border: 1,
          borderColor: 'grey.300',
          borderRadius: 2,
        
      >
        <Typography variant="h4" gutterBottom>
          Create an Account
        </Typography>
        <form noValidate autoComplete="off">
          <TextField
            label="Email"
            variant="outlined"
            fullWidth
            margin="normal"
            type="email"
            required
          />
          <TextField
            label="Password"
            variant="outlined"
            fullWidth
            margin="normal"
            type="password"
            required
          />
          <Button variant="contained" color="primary" fullWidth sx= mt: 2 >
            Sign Up
          </Button>
        </form>
      </Box>
    </Container>
  );

Buat komponen front-end pembuatan kartu flash

1. Siapkan Petugas untuk otentikasi pengguna

Pada bagian ini, kami menggunakan Clerk’s useUser() Kait untuk mengelola otentikasi pengguna. Ini membantu mengidentifikasi apakah pengguna masuk dan memberikan akses ke data pengguna, yang sangat penting untuk mengaitkan kartu flash dengan pengguna yang benar.

import  useUser  from "@clerk/nextjs"; 
export default function Generate()  
const  isLoaded, isSignedIn, user  = useUser(); 
// Other code will be placed below this 

catatan:

  • isLoaded: Periksa apakah data pengguna telah terisi penuh
  • isSignedIn: Periksa apakah pengguna sudah login
  • user: Berisi data pengguna (jika diautentikasi)

2. Kelola status kartu flash

Di sini kita mendefinisikan variabel status menggunakan React useState Menangani kartu flash, status flipnya, input pengguna, dan manajemen dialog untuk menyimpan kartu flash.

const [flashcards, setFlashcards] = useState([]);  // Stores the generated flashcards
const [flipped, setFlipped] = useState();  // Keeps track of which flashcards are flipped
const [text, setText] = useState("");  // User input for generating flashcards
const [name, setName] = useState("");  // Name for the flashcard collection
const [open, setOpen] = useState(false);  // Dialog state for saving flashcards

catatan:

  • flashcards: Array yang menyimpan kartu flash yang dihasilkan
  • flipped: Objek yang melacak apakah setiap kartu flash dibalik
  • text: Menyimpan teks yang dimasukkan pengguna untuk menghasilkan kartu flash
  • name: menyimpan nama koleksi kartu flash
  • open:Kelola visibilitas kotak dialog untuk menyimpan kartu flash

3. Kirim masukan pengguna untuk menghasilkan kartu flash

Fungsi ini menangani pengiriman teks masukan ke API untuk menghasilkan kartu flash dan pembaruan flashcards Status berdasarkan respons API.

const handleSubmit = async () => 
  try 
    const response = await fetch("/api/generate", 
      method: "POST",
      headers:  "Content-Type": "application/json" ,
      body: JSON.stringify( text ),  // Sends the input text to the API
    );

    if (!response.ok) 
      throw new Error("Failed to fetch flashcards");
    

    const data = await response.json();  // Extracts the response data
    if (data && data.flashcards) 
      setFlashcards(data.flashcards);  // Updates the flashcards state with the generated flashcards
    
   catch (error) 
    console.error("Error generating flashcards:", error);
  
;

catatan:

  • kirim a POST Memerlukan /api/generate dengan teks masukan pengguna
  • Server mengembalikan kartu flash yang dihasilkan, yang kemudian dimasukkan flashcards negara.

4. Menangani pembalikan kartu flash saat diklik

Fitur ini memungkinkan pengguna mengklik kartu flash untuk “membaliknya”, menampilkan bagian depan atau belakang kartu.

const handleCardClick = (index) => 
  setFlipped((prev) => (
    ...prev,
    [index]: !prev[index],  // Toggles the flipped state of the flashcard at the given index
  ));
;

catatan:

  • Ketika kartu diklik, flipped Statusnya diubah untuk indeks kartu yang sesuai, beralih antara menampilkan bagian depan dan belakang.

5. Buka dan tutup kotak dialog simpan

Di sini, fungsi mengatur visibilitas kotak dialog. Pengguna dapat membuka kotak dialog untuk menyimpan flashcard dan menutupnya setelah selesai.

const handleOpen = () => 
  setOpen(true);  // Opens the dialog
;

const handleClose = () => 
  setOpen(false);  // Closes the dialog
;

catatan:

  • handleOpen: Buka kotak dialog simpan
  • handleClose: Tutup kotak dialog simpan

6. Simpan kartu flash ke Firebase

Fungsi ini menyimpan kartu flash yang dihasilkan ke Firebase Firestore pada koleksi pengguna saat ini, memastikan bahwa setiap kumpulan kartu flash dikaitkan secara unik dengan pengguna.

const saveFlashcards = async () => 
  if (!name) 
    alert("Please enter a name");
    return;
  

  const batch = writeBatch(db);  // Firestore batch for atomic writes
  const userDocRef = doc(collection(db, "users"), user.id);  // User document reference
  const docSnap = await getDoc(userDocRef);

  if (docSnap.exists())  [];
    if (collectionData.find((f) => f.name === name)) 
      alert("Flashcard with this name already exists.");
      return;
     else 
      collectionData.push( name );  // Add the new flashcard collection name
      batch.set(userDocRef,  flashcards: collectionData ,  merge: true );
    
   else 
    batch.set(userDocRef,  flashcards: [ name ] );  // Create a new user document if it doesn't exist
  

  const colRef = collection(userDocRef, name);  // Reference to the flashcard collection
  flashcards.forEach((flashcard) => 
    const cardDocRef = doc(colRef);  // Create a document for each flashcard
    batch.set(cardDocRef, flashcard);  // Save each flashcard
  );

  await batch.commit();  // Commit the batch
  handleClose();
  router.push("/flashcards");  // Redirect to the flashcards page after saving
;

catatan:

  • Periksa apakah pengguna memasukkan nama koleksi kartu flash
  • Gunakan penulisan batch Firestore untuk memastikan semua kartu flash disimpan secara atom
  • Simpan kartu flash di Firestore pada Dokumen dan Koleksi Pengguna

7. Merender antarmuka pengguna

Ini adalah bagian utama BEJ, yang menangani formulir untuk memasukkan teks, menampilkan kartu flash, dan menampilkan dialog penyimpanan.

return (
  <Container maxWidth="md">
    <Box sx= mt: 4, mb: 6, display: "flex", flexDirection: "column", alignItems: "center" >
      <TextField
        label="Enter Text"
        variant="outlined"
        fullWidth
        margin="normal"
        value=text
        onChange=(e) => setText(e.target.value)  // Update the text state on input
      />
      <Button variant="contained" onClick=handleSubmit>
        Generate Flashcards
      </Button>
    </Box>

    flashcards.length > 0 && (
      <Box sx= mt: 4 >
        <Typography variant="h5" align="center" gutterBottom>
          Flashcard Preview
        </Typography>
        <Grid container spacing=3>
          flashcards.map((flashcard, index) => (
            <Grid item xs=12 sm=6 md=4 key=index>
              <Card onClick=() => handleCardClick(index)>
                <CardActionArea>
                  <CardContent>
                    <Typography variant="h6">
                      flipped[index] ? flashcard.back : flashcard.front
                    </Typography>
                  </CardContent>
                </CardActionArea>
              </Card>
            </Grid>
          ))
        </Grid>
        <Box sx= mt: 4, display: "flex", justifyContent: "center" >
          <Button variant="contained" color="secondary" onClick=handleOpen>
            Save
          </Button>
        </Box>
      </Box>
    )

    <Dialog open=open onClose=handleClose>
      <DialogTitle>Save the Flashcards</DialogTitle>
      <DialogContent>
        <DialogContentText>
          Please enter a name for your Flashcard's Collection
        </DialogContentText>
        <TextField
          autoFocus
          margin="dense"
          label="Collection Name"
          type="text"
          fullWidth
          value=name
          onChange=(e) => setName(e.target.value)
        />
      </DialogContent>
      <DialogActions>
        <Button onClick=handleClose>Cancel</Button>
        <Button onClick=saveFlashcards>Save</Button>
      </DialogActions>
    </Dialog>
  </Container>
);

catatan:

  • Ini akan membuat formulir untuk memasukkan teks dan menghasilkan kartu flash.
  • Ini juga menangani rendering kartu flash yang dihasilkan dengan fungsi flip, dan menyertakan dialog untuk menyimpan kartu flash ke Firebase Firestore.

Buat contoh tampilan untuk layar backend

Buat contoh tampilan untuk layar backend

sebagai kesimpulan

Ini menyelesaikan pembuatan aplikasi kartu flash Anda. Dalam contoh ini, saya menggunakan model bahasa LLaMA 3.1, namun jangan ragu untuk mencoba model lain pilihan Anda.

Selamat membuat kode!

rencana pengembangan website



metode pengembangan website

jelaskan beberapa rencana untuk pengembangan website, proses pengembangan website, kekuatan dan kelemahan bisnis pengembangan website
, jasa pengembangan website, tahap pengembangan website, biaya pengembangan website

#Buat #aplikasi #kartu #flash #bertenaga

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *