Seri Tutorial Laravel 13 AI #2 Perancangan Arsitektur Database & Model Dokumen
Halo lagi! 👋
Setelah kita berhasil menyiapkan proyek di Part 1, sekarang saatnya kita masuk ke tahap yang sangat krusial: Merancang Arsitektur Database.
Karena aplikasi kita akan mengelola dokumen skripsi yang kompleks (terdiri dari bab, sub-bab, dan referensi), kita butuh struktur database yang rapi agar AI bisa menganalisisnya dengan akurat. Yuk, kita bedah!
Step 1 - Mengapa Struktur Itu Penting bagi AI?
AI bekerja paling baik saat diberikan konteks yang terorganisir. Strategi ini sering disebut sebagai Chunking. Daripada memberikan seluruh file PDF 100 halaman sekaligus, kita akan memecah dokumen tersebut menjadi bagian-bagian kecil (misal per Bab atau per 1000 karakter).
Step 2 - Arsitektur Database (ERD)
Berikut adalah visualisasi bagaimana data skripsi, bab, riwayat chat, dan hasil analisis AI saling terhubung:

[!IMPORTANT] Tabel AGENT_CONVERSATIONS dan MESSAGES tidak perlu kita buat manual. Tabel ini sudah disediakan oleh Laravel AI SDK saat kita menjalankan perintah
vendor:publishdi Part 3 Tabel inilah yang membuat AI kita bisa "mengingat" konteks chat sebelumnya.
Step 3 - Membuat Migration & Model
Jalankan perintah ini untuk membuat struktur dasar kita:
php artisan make:model Thesis -m
php artisan make:model ThesisSection -m
php artisan make:model AiAnalysis -m
1. Migration Tabel theses
Schema::create('theses', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->string('title');
$table->string('section')->default('keseluruhan');
$table->string('conversation_id')->nullable();
$table->string('file_path');
$table->string('status')->default('pending')->comment('pending, processing, completed, error');
$table->softDeletes(); // Keamanan data mahasiswa
$table->timestamps();
});
2. Migration Tabel thesis_sections
Di sini kita menggunakan kolom vector. Dimensi 1536 adalah standar emas untuk model text-embedding-3-small milik OpenAI atau Gemini.
Schema::create('thesis_sections', function (Blueprint $table) {
$table->id();
$table->foreignId('thesis_id')->constrained()->onDelete('cascade');
$table->string('section_name');
$table->longText('content');
$table->longText('embedding')->nullable(); // Jantung dari Semantic Search
// [TIP] Kolom vector membutuhkan database yang mendukung (seperti PostgreSQL dengan pgvector)
// atau gunakan Laravel AI SDK yang akan mensimulasikan pencarian ini jika menggunakan MySQL.
$table->integer('order')->default(0);
$table->softDeletes();
$table->timestamps();
// Indexing untuk pencarian cepat
$table->index('section_name');
});
3. Migration Tabel ai_analyses
Schema::create('ai_analyses', function (Blueprint $table) {
$table->id();
$table->foreignId('thesis_id')->constrained()->onDelete('cascade');
$table->string('analysis_type'); // logic_check, grammar_fix, etc.
$table->json('result'); // AI akan memberikan output JSON terstruktur
$table->softDeletes();
$table->timestamps();
});
Agar Laravel bisa menangani data AI dengan pintar, kita perlu mengatur Trait, Casts, dan Relationships di dalam Model.
Model Thesis.php
use Illuminate\Database\Eloquent\SoftDeletes;
class Thesis extends Model
{
use SoftDeletes;
protected $fillable = ['user_id', 'title', 'section', 'file_path', 'status', 'conversation_id'];
public function sections()
{
return $this->hasMany(ThesisSection::class)->orderBy('order');
}
public function analyses()
{
return $this->hasMany(AiAnalysis::class);
}
}
Model ThesisSection.php
use Illuminate\Database\Eloquent\SoftDeletes;
use Laravel\Ai\Casts\AsVector;
class ThesisSection extends Model
{
use SoftDeletes;
protected $fillable = ['thesis_id', 'section_name', 'content', 'embedding', 'order'];
protected $casts = [
'embedding' => AsVector::class,
];
public function thesis()
{
return $this->belongsTo(Thesis::class);
}
}
Model AiAnalysis.php
use Illuminate\Database\Eloquent\SoftDeletes;
class AiAnalysis extends Model
{
use SoftDeletes;
protected $fillable = ['thesis_id', 'analysis_type', 'result'];
protected $casts = [
'result' => 'array',
];
public function thesis()
{
return $this->belongsTo(Thesis::class);
}
}
Kesimpulan
Kita telah berhasil merancang "otak" dari aplikasi kita, yaitu struktur database yang siap menampung dokumen skripsi dan hasil pemrosesan AI. Penggunaan fitur Vector Column di Laravel 13 akan menjadi pembeda besar dalam kecerdasan aplikasi kita nanti.
Pada Part 3 nanti, kita akan membangun Sistem Otentikasi & UI Setup menggunakan Laravel Breeze dan Vue.js agar aplikasi kita aman dan modern!
Sampai jumpa di tutorial berikutnya!
Artikel ini dibaca sebanyak 94 kali
{ setTimeout(() => { showShimmer = false; }, 300); })"
:class="{'opacity-0': !loaded, 'opacity-100': loaded}"
class="lazy w-full h-auto rounded-xl border border-white dark:border-neutral-700/80 transition-opacity duration-500"
loading="lazy"
/>
SAWERIA
Memuat komentar...