AI Engineer › Embeddings และ RAG
ชุดฝึกท้าย module: Embeddings และ RAG
โจทย์คละหัวข้อทั้ง module โดยไม่บอกว่าต้องใช้เทคนิคไหน ให้เลือกวิธีเองเหมือนตอนทำงานจริง
TfidfVectorizer() ค่าเริ่มต้น (ไม่ตัด stop words) ที่ fit บน docs["text"] มีคำในคลังคำกี่คำ เก็บไว้ในตัวแปร n_terms_default
hit@1 ของ TfidfVectorizer() ค่าเริ่มต้น (gold_ranks ให้ไว้) ปัด 4 ตำแหน่ง เก็บไว้ในตัวแปร hit1_default
retrieve (ให้ไว้) คำถาม "When do flash sales start?" ที่ k = 1 — doc_id อันดับหนึ่งเก็บไว้ในตัวแปร top_doc
คะแนน cosine ระหว่างคำถาม "I forgot my password" (คำถามที่ 22, index 21) กับเอกสาร d18 (แถวที่ 18, index 17) จาก sims ปัด 4 ตำแหน่ง เก็บไว้ในตัวแปร score_q22
ต่อทุกเอกสารเป็นคำเดียวกันเป็นคู่มือ (words = ต่อ text.split() ของทุกเอกสารตามลำดับ) แล้วตัดเป็น chunk ขนาด 80 คำ overlap 10 (เลื่อนทีละ 70 คำ หยุดเมื่อหน้าต่างถึงท้าย) มีกี่ chunk เก็บไว้ในตัวแปร n_chunks_80
คำถามที่เอกสารเฉลยไม่ได้อันดับ 1 (ranks > 1) มีอันดับเฉลี่ยเท่าไร (ปัด 2 ตำแหน่ง) เก็บไว้ในตัวแปร mean_miss_rank และมีกี่ข้อไว้ใน n_misses
MRR แยกตามหมวดของเอกสารเฉลย: หมวด shipping และ returns (ใช้ gold ที่ให้ไว้) ปัด 4 ตำแหน่ง เก็บไว้ในตัวแปร shipping_mrr, returns_mrr
ที่ threshold 0.15 คำถามใน qs กี่ข้อที่ถูกตอบ (คะแนนอันดับ 1 ≥ 0.15) เก็บไว้ใน n_answered และในกลุ่มที่ถูกตอบนี้ กี่ข้อที่เอกสารอันดับ 1 คือเอกสารเฉลย เก็บไว้ใน n_correct_answered
ประกอบ prompt ของคำถามที่ 14 (index 13) ด้วย TEMPLATE_RAG โดยบริบทเป็น top-2 จาก retrieve ในรูป "[doc_id] title: text" หนึ่งบรรทัดต่อเอกสาร (คั่นด้วย "\n") แล้วเก็บ token ที่ประมาณ (est_tokens) ไว้ในตัวแปร prompt_tokens_q14
answer ที่ให้ไว้อ้าง doc id หลายตัว: สัดส่วนของการอ้างอิงที่ id อยู่ใน retrieved (cite_precision, ปัด 4 ตำแหน่ง) และจำนวน id ที่แต่งขึ้น (n_fake)
hit@k สำหรับ k = 1..5 (สัดส่วนคำถามที่ ranks <= k ปัด 4 ตำแหน่ง) เก็บเป็น list 5 ค่าไว้ในตัวแปร hit_by_k
query expansion: แทนคำในคำถามตาม synonyms ที่ให้ไว้ (แทนที่ทั้งคำแบบไม่สนตัวพิมพ์ใหญ่เล็ก เช่นใช้ re.sub(r"\b" + old + r"\b", new, q, flags=re.I)) แล้วจัดอันดับใหม่ด้วย TfidfVectorizer(stop_words="english") ที่ fit บน docs — เก็บ hit@1, hit@3 และ MRR (ปัด 4 ตำแหน่ง) ไว้ใน hit1_exp, hit3_exp, mrr_exp (หมายเหตุ: synonyms เขียนจากคำถามที่เห็นจึงเป็นการจูนกับชุดตรวจ ตัวเลขจะดีเกินจริง)
hybrid: คะแนนรวม = 0.5 × cosine TF-IDF (sims) + 0.5 × cosine LSA (TruncatedSVD(10, random_state=42) fit บน D แล้ว transform ทั้งคำถามและเอกสาร) — เก็บ hit@1 และ hit@3 ของ hybrid (ปัด 4 ตำแหน่ง) ไว้ใน hybrid_hit1, hybrid_hit3
ใช้ mock_answer (ให้ไว้) กับบริบท top-5 จาก retrieve ของทุกคำถาม — สัดส่วนที่ประโยคที่เลือกมาจากเอกสารเฉลย (ปัด 4 ตำแหน่ง) เก็บไว้ใน from_gold_top5 และจำนวนคำถามที่ mock_answer เลือกจากเอกสารที่ไม่ใช่เฉลยแม้เฉลยอยู่ในบริบท (retrieval ถูกแต่เลือกประโยคผิด) เก็บไว้ใน n_selection_errors
bootstrap ช่วง 95% ของ MRR: rng = np.random.RandomState(0), idx = rng.randint(0, 30, (500, 30)), ค่า MRR ของแต่ละรอบ = (1 / ranks)[idx].mean(axis=1), percentile 2.5 และ 97.5 ปัด 4 ตำแหน่ง เก็บไว้ใน mrr_ci_low, mrr_ci_high
question_id ของ 3 คำถามที่อันดับของเอกสารเฉลยแย่ที่สุด เรียงจากอันดับแย่สุดไปน้อย (เสมออันดับให้เรียง question_id ตามตัวอักษร) เก็บเป็น list ไว้ในตัวแปร worst3_ids และอันดับของทั้งสามไว้ใน worst3_ranks