All Products
Search
Document Center

Vector Retrieval Service for Milvus:Buat aplikasi Tanya Jawab bank soal pendidikan dengan basis pengetahuan Alibaba Cloud Milvus

Last Updated:Aug 28, 2026

Buat aplikasi Tanya Jawab bank soal untuk skenario pendidikan berbasis basis pengetahuan Alibaba Cloud Milvus. Basis pengetahuan ini mengubah buku teks, rencana pelajaran, soal, dan ground truth menjadi asisten bank soal yang dapat dicari: siswa mengajukan pertanyaan dalam bahasa alami dan menerima penjelasan lengkap dengan kutipan ke materi sumber. Siswa juga dapat mengunggah gambar soal untuk menemukan soal serupa di bank soal, dikombinasikan dengan penjelasan dari buku teks.

Ikhtisar solusi

Pipeline end-to-end identik dengan Buat aplikasi Tanya Jawab layanan pelanggan cerdas dengan basis pengetahuan Alibaba Cloud Milvus: definisikan tag di Konsol → impor materi secara massal berdasarkan tag → publikasikan versi → pengambilan melalui SDK (mendukung penyaringan tag dan lampiran gambar) → LLM menghasilkan jawaban dengan kutipan sumber → Flask menyajikan halaman Tanya Jawab. Tutorial ini menggunakan kembali kode proyek langsung dari tutorial tersebut. Topik ini hanya menjelaskan bagian yang berubah untuk skenario pendidikan: tag mata pelajaran dan poin pengetahuan, cara materi gambar ditangani, batasan kemampuan kueri gambar, dan tampilan rumus.

Untuk versi pertama, pilih hanya 5 hingga 20 materi dari satu tingkat kelas dan satu mata pelajaran, lalu perluas setelah verifikasi. Seluruh proses memakan waktu sekitar 25 hingga 40 menit. Waktu parsing dokumen bergantung pada jumlah dan ukuran materi.

Prasyarat

  • Anda telah menyelesaikan Buat aplikasi Tanya Jawab layanan pelanggan cerdas dengan basis pengetahuan Alibaba Cloud Milvus. Tutorial ini menggunakan kembali kode proyek berikut dari tutorial tersebut:

    • kb_client.py, upload.py, app.py, templates/index.html, dan start.sh

    • File konfigurasi config.json

  • Basis pengetahuan Milvus omni-modal (ALL_MODAL), dengan ID basis pengetahuan dicatat (misalnya kd-803ae9b10cc31). Buat basis pengetahuan baru untuk tutorial ini, atau gunakan kembali yang dari tutorial layanan pelanggan. Perhatikan hal berikut:

    • Tipe basis pengetahuan tidak dapat diubah setelah dibuat.

    • Basis pengetahuan terstruktur hanya menerima lima format: xlsx, xls, csv, jsonl, dan faq. Mengunggah gambar secara langsung akan mengembalikan error parameter. Oleh karena itu, bank soal yang berisi materi gambar harus menggunakan basis pengetahuan omni-modal.

    • Konsol saat ini selalu menggunakan tipe omni-modal (ALL_MODAL) saat membuat basis pengetahuan, dan tidak ada opsi lain di halaman tersebut, sehingga tidak diperlukan keputusan tambahan. Untuk memeriksa tipe basis pengetahuan yang sudah ada, lihat Data Type di bagian Basic Information pada halaman detail basis pengetahuan.

  • Pengguna RAM untuk Akun Alibaba Cloud Anda. Pilih Access with a permanent AccessKey untuk pengguna RAM dan berikan kebijakan sistem AliyunMilvusFullAccess.

  • Titik akhir LLM yang mendukung protokol OpenAI chat/completions, dan Kunci API.

  • Python 3.8 atau versi lebih baru telah diinstal secara lokal.

Langkah 1: Definisikan tag tingkat kelas dan poin pengetahuan

Di bagian Basic Information pada halaman detail basis pengetahuan, pilih Tags > Manage dan tambahkan keempat tag berikut. Semua tag bertipe string.

Nama tag

Deskripsi

Contoh nilai

grade

Tingkat kelas

Grade 8

subject

Subjek

Mathematics, Physics

knowledgePoint

Poin pengetahuan

quadratic function, Pythagorean theorem

questionType

Jenis materi

textbook, practice question, ground truth

Nilai tag mendukung bahasa Tionghoa. Anda dapat langsung menggunakan nama Tionghoa untuk tingkat kelas, mata pelajaran, dan poin pengetahuan.

Peringatan

Kotak dialog manajemen tag disimpan secara keseluruhan. Setelah kotak dialog terbuka, daftar tag dimuat secara asinkron. Tunggu hingga semua tag yang ada ditampilkan sebelum menambahkan tag baru dan mengklik OK. Jika tidak, seluruh daftar mungkin ditimpa dengan daftar kosong ditambah tag baru, dan definisi tag yang ada akan dihapus.

Langkah 2: Siapkan materi dan manifes impor

  • Tempatkan materi Anda di direktori documents/. Format yang didukung meliputi PDF, DOCX, Markdown, TXT, dan gambar. Unggah buku teks, soal, dan ground truth sebagai satu set: saat menghasilkan penjelasan, model mengutip metode dari buku teks, teks soal asli, dan poin penilaian dari jawaban secara bersamaan, sehingga jawaban menjadi jauh lebih lengkap.

  • Buat file documents.jsonl dan anotasi setiap materi dengan tingkat kelas, mata pelajaran, poin pengetahuan, dan jenis materi.

    {"path": "documents/math-grade8-textbook.pdf", "metadata": {"grade": "Grade 8", "subject": "Mathematics", "knowledgePoint": "quadratic function", "questionType": "textbook"}}
    {"path": "documents/math-quadratic-problem.png", "metadata": {"grade": "Grade 8", "subject": "Mathematics", "knowledgePoint": "quadratic function", "questionType": "practice question"}}
    {"path": "documents/math-quadratic-answers.docx", "metadata": {"grade": "Grade 8", "subject": "Mathematics", "knowledgePoint": "quadratic function", "questionType": "ground truth"}}
    {"path": "documents/math-pythagorean-exercise.docx", "metadata": {"grade": "Grade 8", "subject": "Mathematics", "knowledgePoint": "Pythagorean theorem", "questionType": "practice question"}}
  • Untuk materi gambar, pahami cara pengimpornya. Gambar pertama-tama melalui Pengenalan karakter optik (OCR) untuk dikonversi menjadi teks, lalu teks tersebut dipecah menjadi chunk dan diindeks. Oleh karena itu:

    • Kemampuan mengenali teks dalam gambar menentukan apakah gambar tersebut dapat diambil. Gambar tanpa teks, seperti gambar geometri atau grafik fungsi tanpa teks, hampir tidak dapat ditemukan dan tidak cocok diunggah sebagai materi mandiri. Tempatkan dalam gambar atau dokumen yang sama dengan soal yang mengandung teks.

    • Pastikan gambar soal jelas, dengan ukuran font cukup besar, dan lebih baik menggunakan teks cetak. Hasil pengenalan mungkin menyimpang. Misalnya, koma ideografis (、) mungkin dikenali sebagai simbol lain, atau variabel x sebagai tanda perkalian ×. Simbol matematika sangat rentan terhadap hal ini.

  • Sesuaikan granularitas pemecahan chunk. Soal dan penjelasan umumnya berupa item pendek. Di halaman detail basis pengetahuan, pada bagian Processing Strategy, klik Create Strategy untuk menyesuaikan granularitas pemecahan chunk. Unit panjang maksimum chunk adalah karakter (default 512). Atur menjadi 580 hingga 770 karakter (sekitar 384 hingga 512 token) agar soal dan penjelasannya tetap berada dalam chunk yang sama sebanyak mungkin.

Langkah 3: Konfigurasikan parameter pengambilan dan prompt

Sesuaikan retrieval dan scenario dalam config.json untuk skenario pendidikan.

{
  "retrieval": {
    "page_size": 8,
    "candidate_count": 64,
    "min_score": 0.2,
    "semantic_weight": 0.75,
    "enable_query_expansion": true,
    "rerank_model_name": "qwen3-rerank",
    "tag_filter": {
      "relation": "and",
      "conditions": [
        {"field": "subject", "op": "=", "value": "Mathematics"}
      ]
    }
  },
  "scenario": {
    "title": "Pengambilan dan penjelasan bank soal pendidikan",
    "system_prompt": "Anda adalah asisten pengajar. Jelaskan hanya berdasarkan buku teks, soal, dan ground truth yang diambil. Berikan pendekatan terlebih dahulu, lalu langkah-langkahnya, dan akhirnya jawabannya, dengan mengutip [Source N]. Tulis rumus dalam teks biasa; jangan gunakan sintaks LaTeX. Jika soal yang diambil tidak sesuai dengan deskripsi pengguna, tunjukkan secara eksplisit perbedaannya alih-alih langsung menerapkan jawaban dari bank soal. Jangan menebak ground truth jika materi tidak mencukupi.",
    "image_enabled": true,
    "sample_questions": [
      "Bagaimana cara menemukan nilai maksimum dari bentuk vertex fungsi kuadrat?",
      "Temukan contoh soal yang menggunakan teorema Pythagoras dan jelaskan.",
      "Poin pengetahuan apa saja yang diuji oleh soal ini?"
    ]
  }
}

Penjelasan parameter:

  • semantic_weight=0.75 dengan qwen3-rerank diaktifkan: pertanyaan siswa umumnya berupa deskripsi masalah dalam bahasa alami, dan bobot semantik yang lebih tinggi mendukung pencocokan soal serupa.

    Perhatikan bahwa skor reranking dan skor vektor tidak berada pada skala yang sama. Skor akhir dihitung sebagai score ≈ (1-semantic_weight) × keywordScore + semantic_weight × semanticScore (fitur peringkat juga mungkin ditambahkan). Saat reranking dinonaktifkan, semanticScore adalah kemiripan vektor. Saat reranking diaktifkan, nilainya menjadi skor model reranking, dan min_score selalu menyaring berdasarkan skor akhir ini. Dalam pengujian, mengaktifkan reranking mengurangi jumlah hasil untuk pertanyaan yang sama dari 5 menjadi 4. Ini merupakan efek gabungan dari ambang batas dan skala baru; bukan berarti reranking memperburuk recall.

    Tidak ada kombinasi yang direkomendasikan yang berlaku umum untuk semua korpus. Pertama-tama atur min_score ke 0 untuk mengambil sejumlah hasil, lalu tandai secara manual relevansinya, kemudian pilih ambang batas berdasarkan distribusi recall dan false recall. Lakukan kalibrasi ulang setiap kali Anda mengganti model reranking, mengaktifkan/nonaktifkan reranking, atau menyesuaikan semantic_weight.

  • Menetapkan subject dalam tag_filter secara efektif mencegah false recall lintas-mata pelajaran. Dalam pengujian, menanyakan poin pengetahuan fisika dengan filter subject=Mathematics menghasilkan 0 hasil, dan model menjawab "materi tidak mencukupi" sesuai prompt.

  • Untuk op, hanya tiga operator =, in, dan not in yang benar-benar berlaku. Alias seperti eq, ==, equal, atau like mengembalikan 400 Unsupported tag filter operator dan menyebabkan setiap pertanyaan gagal. Meskipun , >, <, , , empty, not empty, start with, dan end with muncul dalam daftar "Supported operators" pada pesan error tersebut, dalam pengujian kondisi tersebut diabaikan diam-diam dan semua data tanpa filter dikembalikan.

    Perhatikan bahwa contains dan not contains hanyalah alias untuk in / not in. Keduanya tidak melakukan pencarian substring, dan memberikan fragmen string sebagai nilai akan menghasilkan 0 hasil.

    Untuk menyaring berdasarkan rentang, enumerasikan nilai-nilainya dengan in. Untuk memeriksa apakah tag kosong, gunakan = "". Setelah konfigurasi, selalu bandingkan jumlah total hasil dengan dan tanpa filter untuk memastikan filter berlaku.

  • Dalam system_prompt, nyatakan secara eksplisit "rumus dalam teks biasa". Prompt pendidikan cenderung membuat model menghasilkan LaTeX, tetapi halaman contoh menampilkan dengan teks biasa <pre>, sehingga rumus tidak dirender dan muncul sebagai tanda dolar dan garis miring terbalik mentah. Jika Anda ingin tetap menggunakan LaTeX, integrasikan KaTeX atau MathJax ke dalam halaman.

Langkah 4: Unggah, publikasikan, dan verifikasi

  1. Unggah materi. MetaFields berlaku untuk seluruh batch; skrip mengelompokkan materi berdasarkan tag terlebih dahulu lalu mengirimkannya dalam batch.

    python upload.py --manifest documents.jsonl
  2. Di halaman Data Management Konsol, pastikan status materi adalah Processed. Untuk materi gambar, klik View Chunks dan pastikan teks yang dikenali sesuai dengan konten gambar sebelum mempublikasikan versi.

  3. Di halaman Version Management, klik Publish Version. Setelah menyelesaikan wizard tiga langkah, pastikan status versi baru adalah Published.

    Penting

    Paling banyak tiga versi yang dipublikasikan dapat ada secara bersamaan. Saat batas tercapai, tombol Publish Version akan dinonaktifkan, tetapi halaman tetap menampilkan "Saat ini ada N perubahan tertunda untuk dipublikasikan". Anda harus menghapus versi lama yang tidak lagi diperlukan dalam catatan versi terlebih dahulu. Penghapusan versi tidak dapat dikembalikan. Bank soal biasanya menerima penambahan materi setiap semester atau setiap unit, jadi simpan hanya "versi saat ini + versi historis terbaru".

  4. Jalankan layanan. Halaman Tanya Jawab disajikan di http://127.0.0.1:7860.

    python app.py
  5. Jika bank soal Anda berisi materi gambar, coba kueri gambar. Titik akhir /api/ask dari app.py menerima parameter opsional image_url dan meneruskannya ke bidang image dari SearchKnowledgeBase. Gambar paling membantu untuk soal dengan referensi tidak jelas. Dalam pengujian, untuk pertanyaan yang sama "Poin pengetahuan apa saja yang diuji oleh soal ini?": tanpa gambar, hasil temuannya adalah latihan teorema Pythagoras (relevansi 0,431, bukan soal yang dimaksud); dengan gambar soal fungsi kuadrat yang dilampirkan, hasil temuannya adalah soal fungsi kuadrat di bank soal (0,583). Gambar tersebut memberikan semantik kunci untuk pengambilan.

    curl -sS http://127.0.0.1:7860/api/ask \
      -H 'Content-Type: application/json' \
      -d '{"question":"Poin pengetahuan apa saja yang diuji oleh soal ini?","image_url":"https://<URL gambar yang dapat diakses publik>"}'
  6. Verifikasi hasil terhadap empat pemeriksaan berikut:

    • Halaman di http://127.0.0.1:7860 terbuka secara normal. Skenario pendidikan juga menampilkan kotak input untuk URL gambar soal. Mengirim pertanyaan mengembalikan jawaban dan sumber pengambilan.

    • Setiap [Source N] dalam jawaban memiliki chunk materi yang sesuai di bagian sumber di bawahnya.

    • Saat menanyakan konten yang tidak tercakup dalam bank soal, jawaban secara eksplisit menyatakan materi tidak mencukupi alih-alih mengarang jawaban.

    • Setelah menambahkan materi dan mempublikasikan ulang versi, halaman dapat mengambil konten baru.

  7. Tambahkan satu verifikasi lagi untuk recall semantik: ajukan pertanyaan dengan informasi yang hanya muncul dalam konten materi, bukan dalam nama file (misalnya, nomor soal), dan pastikan materi yang sesuai ditemukan. Pemeriksaan ini juga berlaku untuk memverifikasi apakah gambar dikenali dan diimpor dengan benar.

Kemampuan dan batasan kueri gambar

Gambar hanya berpartisipasi dalam pengambilan dan tidak pernah dikirim ke LLM. Perilaku sistem adalah "temukan soal paling mirip di bank soal berdasarkan gambar, lalu jelaskan berdasarkan materi yang diambil", bukan "kenali dan selesaikan soal dalam gambar". Jika Anda mengunggah soal baru yang tidak ada di bank soal, sistem akan menjawab dengan soal paling mirip di bank, dan jawabannya mungkin berbeda dari soal dalam gambar tanpa disadari. Misalnya, saat mengunggah y=-(x-1)²+4 (nilai maksimum adalah 4), jika y=-2(x-3)²+5 ada di bank soal, jawabannya mungkin memberikan nilai maksimum 5. Oleh karena itu:

  • Tampilkan petunjuk di halaman bahwa "gambar digunakan untuk menemukan soal serupa di bank soal".

  • Wajibkan model dalam prompt untuk menunjukkan perbedaan antara hasil pengambilan dan deskripsi pengguna.

    Oleh karena itu, kemampuan ini sebaiknya disebut "pengambilan berbantuan gambar" atau "pencarian soal berbasis gambar", dan tidak boleh dipresentasikan secara eksternal sebagai "penyelesaian foto-ke-jawaban". Untuk menyelesaikan soal baru dalam gambar, lapisan aplikasi harus meneruskan gambar asli secara terpisah ke LLM yang mendukung input multi-modal. Instruksikan LLM untuk cross-check materi yang diambil. Jangan hanya mengandalkan pengambilan basis pengetahuan.

image_url harus berupa alamat yang dapat diakses publik. Sisi server memvalidasinya:

Input

Tanggapan server

Alamat intranet atau lokal (seperti 127.0.0.1)

400 URL resolves to a non-public or blocked address

Tautan ke sumber daya non-gambar

400 image_query URL must point to an image.

Nama domain yang tidak dapat diselesaikan

400 Could not resolve hostname

Dibiarkan kosong

Fallback ke pengambilan teks biasa (perilaku normal)

Pengenalan gambar memiliki batasan berikut, yang harus Anda ketahui sebelum menyiapkan materi bank soal:

  • Format: gunakan hanya JPG, JPEG, PNG, dan GIF. Pengenalan file dasar mungkin juga menerima format seperti WebP dan TIFF, tetapi tidak ada komitmen publik yang terpadu; jangan mengandalkannya.

  • Ukuran: API tidak memiliki batas keras terpisah untuk byte atau piksel gambar, tetapi sebenarnya dibatasi bersama oleh gerbang unggah, decoding gambar, memori, dan layanan model konversi gambar-ke-teks. Gambar yang terlalu besar mungkin tetap gagal.

  • Akurasi pengenalan: tidak ada metrik akurasi yang dijamin untuk tulisan tangan, rumus matematika, gambar geometri, atau sistem koordinat. Gambar tanpa teks mungkin menghasilkan deskripsi yang dihasilkan oleh konversi gambar-ke-teks, tetapi tidak dijamin akan ditemukan. Dalam pengujian untuk topik ini, x dikenali sebagai ×, dan koma ideografis dikenali sebagai karakter goresan titik tunggal. Simbol matematika khususnya memerlukan pemeriksaan spot manual.

  • Tidak ada ambang batas kualitas pengenalan: selama gambar dapat didekode dan pipeline tidak melaporkan error, status dokumen adalah Processed, meskipun teks yang dikenali sangat sedikit atau salah. Hanya saat decoding gagal atau panggilan model yang diperlukan mengalami error, status Processing Failed akan muncul. Oleh karena itu Anda harus memeriksa spot teks chunk di halaman Data Management setelah unggah; jangan hanya mengandalkan status saja.

Catatan penggunaan untuk skenario pendidikan

  • Unggah buku teks, soal, dan jawaban sebagai satu set, dan bedakan dengan questionType sehingga Anda dapat menyaring sesuai kebutuhan (misalnya, biarkan siswa hanya mengambil "practice question", dan guru mengambil "ground truth").

  • Buat entri independen per mata pelajaran: setelah menetapkan subject dalam tag_filter, entri tersebut hanya dapat menjawab pertanyaan untuk mata pelajaran tersebut. Pertahankan contoh pertanyaan dalam mata pelajaran yang sama; jika tidak, siswa yang menanyakan mata pelajaran lain hanya akan mendapatkan "materi tidak mencukupi".

  • Batasi akses ke materi jawaban secara terpisah: jika siswa tidak boleh langsung mendapatkan ground truth, saring dengan kondisi seperti questionType not in ["ground truth"] pada entri siswa.

  • Hasil pengambilan berisi bidang images. Secara desain, bidang ini mengembalikan gambar yang terkait dengan chunk, dan server menghasilkan URL yang ditandatangani berumur pendek untuk gambar yang dipertahankan. Bidang ini adalah kemampuan yang telah diimplementasikan, bukan bidang kosong yang dicadangkan. Namun, saat ini bidang tersebut tidak mengembalikan URL gambar. Saat dokumen gambar ditemukan tetapi bidangnya kosong, gambar materi tersebut tidak dipertahankan ke chunk yang sesuai selama fase parsing dan pemecahan chunk, atau asosiasi tanda tangan tidak dibuat — ini merupakan masalah pipeline yang perlu diselidiki per dokumen spesifik. Tidak ada parameter permintaan yang dapat mengaktifkannya, jadi jangan anggap "selalu kosong" sebagai desain produk. Anda tidak perlu memelihara tabel pemetaan "nama file → URL gambar" sendiri dalam jangka panjang: dalam jangka pendek halaman dapat fallback ke menampilkan teks yang dikenali; saat gambar soal asli perlu ditampilkan, tangani sementara dengan mengasosiasikan melalui documentId dengan manifes impor.

  • Lakukan tinjauan manual untuk kesimpulan penting, dan ingatkan siswa bahwa buku teks resmi dan penjelasan guru tetap menjadi acuan utama.

FAQ

Gejala

Penyebab dan solusi

Soal mengembalikan 500, dan log menunjukkan 400 Unsupported tag filter operator

op menggunakan alias seperti eq, ==, atau like. Gunakan =, in, atau not in.

Dengan penyaringan tag ditambahkan, jumlah hasil persis sama seperti tanpa filter

Operator yang tidak berfungsi (seperti >, , , atau empty) digunakan. Hanya =, in, dan not in yang berlaku.

Materi gambar tidak dapat ditemukan setelah diunggah

Periksa secara berurutan: apakah tipe data basis pengetahuan mendukung gambar; apakah status data adalah Processed; apakah teks yang dikenali di View Chunks kosong atau tidak sesuai dengan gambar (gambar tanpa teks, ukuran font terlalu kecil, dan tulisan tangan dapat menyebabkan kegagalan pengenalan).

Anda bertanya dengan gambar soal, tetapi jawabannya tentang soal yang berbeda

Perilaku yang diharapkan. Gambar hanya digunakan untuk mengambil soal serupa; model menjelaskan soal yang diambil.

Soal mengembalikan 400 URL resolves to a non-public or blocked address

image_url mengarah ke alamat intranet atau lokal. Ubah menjadi URL gambar yang dapat diakses publik.

Rumus muncul sebagai $y = a(x-h)^2 + k$ di halaman

Model menghasilkan LaTeX tetapi halaman merendernya sebagai teks biasa. Wajibkan rumus dalam teks biasa di prompt, atau integrasikan library rendering rumus ke dalam halaman.

Lebih sedikit hasil setelah mengaktifkan reranking

Skor reranking dan skor vektor memiliki skala berbeda; dikombinasikan dengan min_score, lebih banyak hasil yang disaring. Turunkan min_score atau nonaktifkan reranking untuk membandingkan efeknya.

Penyaringan tag selalu mengembalikan 0 hasil

Ejaan nama tag berbeda dari yang ditulis (API tidak melaporkan error dan hanya mengembalikan 0 hasil). Verifikasi di halaman detail basis pengetahuan → Tags → Manage.

Unggah mengembalikan 400 No OSS document can be registered.

Semua file dalam batch dideduplikasi karena nama identik. Ganti nama file atau hapus data lama di Konsol terlebih dahulu.

Pengambilan mengembalikan 404 Knowledge base version ... does not exist

Belum ada versi yang dipublikasikan, atau nomor versi yang ditentukan tidak ada.