Tugas P-10: RAG Part 1 (Lab 1-3)

This commit is contained in:
2026-11-02 15:32:35 +07:00
commit 3872cf11a3
19 changed files with 830 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
.venv/
chroma_db/
__pycache__/
*.pyc
+15
View File
@@ -0,0 +1,15 @@
# Kesimpulan Lab 3
**Tabel hasil** (15 pertanyaan uji, 3 dokumen, overlap 15%)
| Ukuran chunk | Jumlah chunk | Hit@1 | Hit@3 | Hit@5 | MRR |
|---|---|---|---|---|---|
| 500 | 25 | 0,60 | 1,00 | 1,00 | 0,77 |
| 1000 | 13 | 0,33 | 0,80 | 0,87 | 0,55 |
| 1500 | 10 | 0,47 | 0,53 | 0,73 | 0,54 |
**Kesimpulan:**
1. Ukuran chunk yang paling baik adalah 500 karakter karena Hit@3 = 1,00 dan MRR = 0,77 paling tinggi; semua pertanyaan terjawab dalam top-3.
2. Pertanyaan yang gagal masuk top-5: pada ukuran 1000 ada 2 ("Berapa karakter minimal kata sandi akun kampus?" dan "Apakah boleh memakai laptop untuk bermain game saat kuliah berlangsung?"); pada ukuran 1500 ada 4 (SKS maksimum untuk IPS di atas 3,00; lama cuti akademik; batas waktu lapor insiden; dan "berhenti kuliah sementara waktu"). Pada ukuran 500 tidak ada yang gagal.
3. Dugaan penyebab: (a) chunk terlalu besar sehingga relevansi mengabur: rata-rata chunk memuat 1,9 pasal pada ukuran 500, 3,5 pasal pada 1000, dan 4,6 pasal pada 1500. Frasa "minimal 12 karakter" berada di chunk 1000 yang memuat 4 pasal (peminjaman perangkat, kata sandi, autentikasi dua faktor), dan "paling banyak dua semester" berada di chunk 1500 yang memuat 7 pasal (penilaian sampai kelulusan). (b) Pertanyaan parafrase tidak dekat dengan istilah dokumen: "laptop untuk bermain game" vs "perangkat elektronik untuk kegiatan di luar pembelajaran".
4. Keterbatasan evaluasi: pencocokan kata kunci kasar (chunk bisa memuat kata kunci tanpa benar-benar menjawab); hanya 15 pertanyaan pada 3 dokumen pendek (koleksi 1500 hanya 10 chunk, sehingga top-5 sudah separuh koleksi); dan urutan 1000 vs 1500 tidak konsisten (Hit@1 1500 = 0,47 > 1000 = 0,33), jadi tidak bisa disimpulkan bahwa makin besar chunk selalu makin buruk.
+22
View File
@@ -0,0 +1,22 @@
# Paket Lab P-10 (RAG Part 1)
## Persiapan (sekali saja)
```
python -m venv .venv
.venv\Scripts\activate # Windows (Mac/Linux: source .venv/bin/activate)
pip install -r requirements.txt # unduhan besar (PyTorch); bila berat, pakai Google Colab
```
Letakkan 2-3 PDF berbasis teks (bukan scan) di folder `dokumen/`.
## Urutan pengerjaan
| Lab | Perintah | Hasil |
|---|---|---|
| 1 | `python lab1_chunking.py dokumen/NAMA.pdf` | tabel jumlah chunk + contoh chunk -> `hasil_lab1.txt` |
| 2 | `python indeks.py 500 1000 1500` | koleksi pedoman_500/1000/1500 di `chroma_db/` |
| 2 | `python cari.py 1000` lalu ajukan 5 pertanyaan biasa + 2 parafrase | cek manual: chunk teratas relevan? |
| 3 | `python bantu_buat_uji.py` -> isi `uji.py` (15 pasangan) | |
| 3 | `python evaluasi_retrieval.py 500 1000 1500` | tabel Hit@1/3/5 + MRR -> `hasil_lab3.txt/.csv` |
| 3 | isi `KESIMPULAN_LAB3.md` | kesimpulan 3-4 kalimat |
Jangan hapus folder `chroma_db/` - dipakai di P-11.
Pertama kali dijalankan, model embedding diunduh (ratusan MB), jadi `indeks.py` terasa lama.
+20
View File
@@ -0,0 +1,20 @@
"""Bantu membuat pertanyaan uji: tampilkan 20 potongan teks acak dari PDF-mu.
Pakai: python bantu_buat_uji.py
Baca potongannya, lalu tulis pertanyaan + frasa kunci (persis seperti di teks) ke uji.py.
"""
import random
from umum import FOLDER_DOKUMEN, baca_pdf_per_halaman, potong
random.seed()
kandidat = []
for pdf in sorted(FOLDER_DOKUMEN.glob("*.pdf")):
for no_hal, teks in baca_pdf_per_halaman(pdf):
for c in potong(teks, 500, 0):
kandidat.append((pdf.name, no_hal, c.replace("\n", " ")))
if not kandidat:
raise SystemExit("Tidak ada teks. Pastikan PDF ada di dokumen/ dan berbasis teks.")
for i, (nama, hal, c) in enumerate(random.sample(kandidat, min(20, len(kandidat))), 1):
print(f"#{i} [{nama} hal {hal}]\n{c}\n")
+31
View File
@@ -0,0 +1,31 @@
"""Lab 2 - Cari di indeks.
Pakai:
python cari.py # mode interaktif, koleksi pedoman_800
python cari.py 1000 # pakai koleksi pedoman_1000
python cari.py 800 "Apa syarat cuti akademik?" # satu pertanyaan
Catatan: jarak lebih kecil = lebih mirip.
"""
import sys
from umum import ambil_embedding, buka_klien, ambil_koleksi, nama_koleksi
ukuran = int(sys.argv[1]) if len(sys.argv) > 1 else 800
emb = ambil_embedding()
koleksi = ambil_koleksi(buka_klien(), nama_koleksi(ukuran), emb)
def tampilkan(pertanyaan, k=3):
hasil = koleksi.query(query_texts=[pertanyaan], n_results=k)
print(f"\nPertanyaan: {pertanyaan}")
for doc, meta, jarak in zip(hasil["documents"][0], hasil["metadatas"][0], hasil["distances"][0]):
print(f"[{meta['sumber']} - hal {meta.get('halaman', '?')} - chunk {meta['chunk']}] jarak={jarak:.3f}")
print(" ", doc[:200].replace("\n", " "), "...\n")
if len(sys.argv) > 2:
tampilkan(" ".join(sys.argv[2:]))
else:
print(f"Koleksi {koleksi.name} ({koleksi.count()} chunk). Ketik 'keluar' untuk berhenti.")
while True:
q = input("\nTanya: ").strip()
if q.lower() in {"keluar", "exit", ""}:
break
tampilkan(q)
+93
View File
@@ -0,0 +1,93 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
5 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20261102142418+07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261102142418+07'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Pedoman Akademik Program Studi Teknik Informatika) /Trapped /False
>>
endobj
8 0 obj
<<
/Count 2 /Kids [ 4 0 R 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1600
>>
stream
GatU29lJcG&A@sBbgB^@<E$==kIA@:5W66))nWRa7aY20.FK\1&EM_%L6Nu3NU<IR`!AdA+5a_V1BQ\m#8-u"Bn4qiI/GN\jKSRe@[SfVq_*?N:;0Ll^[p^tY)>`W>2?:<8Pd&rk4+)+-b!:k6b"FY215=lK33,l4QetZc80H'?`eA$5/VJ:eR##%^D'_EV1Q,2f+p5[I&J<,8K"Mcc@"ANNF"+4!8AN1s+!*Os0S>ER='8^Cf(VVhL6*PLj=<)-&;utacl5q%=H\l+/$9%ii9N!Gh(e7h'G=B8G-!/cWj]i99K!8LFn<U^k!qK,\SqjqI$!Ao0P$s\jhTk5Z',\UB*LH=^iu!;&a=b5\#FA]'%Zr::m*=GCoDp2WQ0-j*>mhSLd&?Y@n4WReVpSNBG.NWe%8g1c9N`:M>.&:go8#\t]Kjg7\Rq`YLBl9LuIq"OAaanpQ)p:35'\&)a]!7tc/nQ*_1NUOt$=37?kM=g1k\QL##d;#2lKf4]?5AIaHmO5J#d2t/aWQXj;W[0rkojIesHVkpBY0OkA,>u2Z0rRqgm,HF-]YsC/Ja7.O^#WmkI4:@o%m[;&4r4!29,OM`$/C2<+qKI3k^b(h1,Kd'Mjommt1qaA9*_Y*_-2gB^j)f@WH2Nc#,]2s.i5hZ6UcY^RXTjYCQ\4qgdBc5n_AQT!(5IM2A=^1qq9ZJ=itdV$B"fKO>`rb^cVT(3b&E76Ab&S8:7f9(e^A`$/sY'P=s)[RbS(mg(3pDCng?QrD!pjf]Rh81<.QjgP+H1"%N3aF@N-RPkr`[AaZu@9CTG?fbhim\4s%D2P+FdZ$;Ca)%479T6WU-plu]WUnMo#=8gn2K7SSs'(fg8D]EF:m6XWEi(hLU,VU-XB-Ji-FWHdkSLneE@X+8/]>i`FtSE2b\0=UF1]mnZsIXk$_IP,n\YrQ89K7AL8,q]^fb"3UqUhq6Kgpbcu,uL#q;)2<1dh::$9L[+?g62'Ok[pp1]/AL4W2)=bo7@k8XZ')L`jhD\kD)./@hlsT'X=(%$Y+sL=8#5.QOImMKB0@J5-3(JDW'"^Oj4q,CMHs7OqOCl8^U:$&1`c[5'_GD]1'#U2;(g3:>l+[!tC\8KF0g57lA3D5M0pFf!FUBZ"I,=h_TN@*NgXQaG1eJA@6X"/%UtVPboL:/,#>YO4Z_Nm\gPC"rdFW4bZXbj[+Zr1/]\D0QTgnlB:Lph!N@aI!(k,e&JlT8ZT["g:gD8,:VdUjl5j5BBsN!M'Mmh1JYm)H'9.N\1UZ?(mgNGpE&(V:"!JB7HPR&idpsAFk79hHHj)#R-..<a+4;GQ4/@4,s=(uKB!XL`NttXgCISok[-@+??&F.53p:!PN:B%ITk5IHLS40%R%BsS3W*H3F-*@IO#TYQg)i8=o._L@bV"m%CB*W-;c@PU!L'1@uKb/=WUQ.a\"08M*)>n8^kQj,+BJJ*@ke[rI)l(DgK\06=Ks0JYEq9q<'D[qtZ-le>LFTYjOT>QZ7sVoAZfBE0qJL5FHXp#8>j"(\OHJ"1=r;h=H`#6od*:8jXKD7Xq*IGA&X3J.O([i$PaLIJ%@kYfpKL7^a^l$i%kuncfFprWh-1>F>~>endstream
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1244
>>
stream
GatUrgMYb8&;KZH'`Y"6&?;[]m3#K8lN2d0_FE#[(n)+YZj/@58Dl[[0dK3@73GqS&-tS6S=TK<s(>>@Kb_bhq;d'q4b!:'7(L>:/'@7"Mu@"mgFp8mb%^&#-*Gg#bNnI)f6D=oDi</M&=US_*p"AZF+q:HA!KE_99"&`5`mV+b7Y?P`KH<Q92R5i[WJ0m`1`J>TL9A@2\ZXe/?qH(kjHC'Tb`b2a2FZ:9n$7idn9B=qZHQ,io7IXM4:[5&gA]s*i=",kLlVr`//e-*d&:PUY!SicU5WSZHGuZH`Ccig2fgOZMr&kOe_#Xl#+7\>Wf_)Fa7!$(Xs@Q/#KR0eDd)Ld?$.eEbKO8?h(,2Vjdba\Lhc)i:di,*GV^uUDaE"Dp52FD6`qn9sN0fl6FmVD6;\fIH^!t,sIN9-iTd*8)%j$7*LlN*$p3Y<i?2p</Ec/i7R]B3m0+0?GhU97i&SsWKk*i;VU-%5nPilC^5gmB.]h:+Bj>)m4-mrh)"j2'o/)+%E&YYp4Pt+dTk-e1Zgq/F_:pW\K%H?(5?\'cqpFac(f@m3''A!nsr.46ue%g%^'S/5DY7.foU]Wfd@-&*_=sV4Q^?;AO7KM-BLSg\JFgJ`Ab$^.SV6'=pb>KiBXDc[a^>O3"()Bqs[qE>MSgK%O8G[QG^7ef&8#h"3:DOo8-1mMPh01&JFo2+TI<@"T(MG^1jkpe9:&7'WB!T-UB"rU1gTJ:QqmJ0Qlt4`PfTSUs[?7;pmTUq*R>gdkINGg3?A%c;WGgN;W^Pnnip3Ol%)=[IRP*#C\U2@CO0l:/^$<45!;)n3srNg@q0DVk(?q/@Fm,45I2HQ9u-)6T$q['<kZ]<FV"UX40IJ&DD-0,-o`O3f5bnnmrJueG=d(P-T!QAQ6QPs$8!nnJ*p7Ds3iMoh!W2`KF)"+EGFZ3s9FHVP&$##L5i$V+?&Wmt%Ut'i#rUFo,QPD*+TAObS5V8Oe&&Aj+oAc%jQ5BQorPB\00%:4VKl#0i0<I0OGrc;_S5]:RHL!lOBHc&#bSIQb&-b)ZE6od&0pilh:ej4s\+iI2iZlXI7?&*7:ng<;s%p93mCD<X#0oo`6[M+3!?b0W_Z/@>s.q(SACAb)Zmd+8NIiJ75uPCJ#`r8sQ"0QtXa\Z9MWW%\]Q*DUE2dSN]Lh($5BNh'9,U(C+Qklo:?Aj:.&VU:4bB<e3<dRRI"AoPT.2lHF]U:BPTC6o^tFr&,D@P=V*irY/=!36e,o)~>endstream
endobj
xref
0 11
0000000000 65535 f
0000000061 00000 n
0000000102 00000 n
0000000209 00000 n
0000000321 00000 n
0000000524 00000 n
0000000728 00000 n
0000000796 00000 n
0000001112 00000 n
0000001177 00000 n
0000002868 00000 n
trailer
<<
/ID
[<f71e70ffd94ab329c7ad7d2d4ca030ed><f71e70ffd94ab329c7ad7d2d4ca030ed>]
% ReportLab generated PDF document -- digest (opensource)
/Info 7 0 R
/Root 6 0 R
/Size 11
>>
startxref
4204
%%EOF
+93
View File
@@ -0,0 +1,93 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
5 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20261102142418+07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261102142418+07'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Pedoman Penggunaan Laboratorium dan Keamanan Informasi) /Trapped /False
>>
endobj
8 0 obj
<<
/Count 2 /Kids [ 4 0 R 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1630
>>
stream
GatU39lJcU&A@C2bgA"A7O2P:5/p+pUe+Dg&^^-r*(cq(+L<.Igg=F4Y"6[;/HtgdONch3RlBf\N(TJR%*J5:h>l?6iSCCEapQ]=.-JPhemICrHLbQD*_n='YcQ#W[CTMW]p\ecbgHU&S_UBA*3ZCYYVu"=;[)8Tm]%bIBj"]uPfoP3R)-@fX#k&XK,3mrDR\";>53tLk:h"<UOa14Hm(=[dJa454fj-eE`Eq-p%!(>B=mDu6-mI/ho_Fo.'(lJ+8E@;I%,M1#/@60ps1!5DD#Q[IjqY'>ATr`i-.$IB29"#G8>>Di4\^B#CJ0*>1C`R;<qd'>=)Jig+6.S47oJF/BXm/WQt,jOFr9mQf12j/]%u<_frD&_5$7WiV.">5Ta"U0O#=cCd<;h3)D5cfaRlVI%-;@(LRp9nBOWI%qhr\f`F>kk_K`BBHWE.eAO$]n*Z5Of;HCn)0.bf[,@^s!;m@3BI0UO*]6,A?CYNuH?Hca(Kdft&)<jks+'ThHZ$W\NHQD/!*&/KKRgL"0]P0EfcnMH5Yn^*2**7"AN>t4%rgX0+YB[gO/b0rfWmu%Ft9@Fp`Mke3+3/KD)Cea"%Hrp&DSKl:]r@b*$`^+";g0cT-nOHW^!ZLDt-=tS3$V/,WUS;*1$EcNRk%c'#%:Plq_BGO:.G+CgiA8fEdW=kaG$#X(;=#PXl]%Ju<+J\`t38^abcS^6"7:*CRjU##M*m,GQ!am'1,H(2ZltE`@r[#&%/%`T-oSP2O^L_e=\Xf.]B4o]-p$L%]=#k<I@j02Qkms1g39BXoK<8?GMK)>(dG5L^=QE$kDSR(PKq%^rXYh(c=_DKm+!;bAYs#9b%lpXmCa$6.Et8&oeB(pYM$H?-YALUr!H(_D#6NGpF;)e68Ag%=j,QuO\DP?sGFf('=JkeY_2\tf`\?,gO!T\?Z'Sh>"g0<a9UFU`P*f^<>)SRedsH%W#d>[T7e>c0V%>c5\<_3=P_RjNkFC!ni&oZrX,,AN28@Rl$9'#RTlp'`]MUJ<6K=:4gQi]mG&GVL\o"uV(DO1RLl:'KI;ld>,h+!*cPKpp>oGeJL,n^R5CJmWFYFYU$2n6X)8W%T?dmq>ohLT,Uc'WI!GL[l&b:r4_>U:D;Uk[c`^lo;Hs__t@q<\duXM.dDW;OqOSSuatS]BJ5Y)Y3*hOM<3TB0CqoSh(8qVWi2BMBS%dQ;^j&UeV[71f7o#NA7a+RnhF-L-,rZ!cJ\#n]o#dZ]B@>`)ZJ"UXW).daJf=jZJi!:kr3?)1.$#g8U1)jt$WjcS@ZYUW<d6,9W(XgTlu;FW:XCMpCFPb')tn%B7"LjAe_ZUKOFF5Oi4?\PsFASDX*G3a.Q\/_Ro?rE0oZeR]Msngo\V]T5?fjl@W&#$'mB-k7,5)aP9WLcLGgMTL^3PWa:p3H>cTPN6."(M6i+XAZbN+-Q_RFJKE_31o<leTOd7hpN"sBb*MW0j=?g]s.L.*uZdub!-E&MuPBdq/IDmQ,Nt.l2Y3Q[ei`u^LP#g]:J(.[-T36cSP0'TcPOM'((F<B/$8+d*ZqdC/SCo8TmS1/2&F+l#&"BL<?>E&fsl'#h=<],0Tm<:GTF#l+SIIncWkcA6[]gQZYe1%*N95rptHRjBi;M9bI~>endstream
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 837
>>
stream
GatUp:N+uI&B4,;'QZqaXuCB1a12CfJaFPP`TdgnKsT3pjG4OB"R`0pOKqmT*g/lD&tgBihu&4)%GfGa2>-e3M4RoIo4(/4QJ-he\_l1@qh75@WunD)]Q1cbL[E"AE-OLlZX<Z5h:BHmYF\p4(:h$^CAk6a<3:RG](q'd8,&K)rQU0>#'("0"=5:L-h1;;&l4hPTht=H@'bQM`6f_8"eMC#79U?=:85[Ne/kUfK5LbVM*#fp$LG*_!D3j"U9l6LV6V5aXS)I<Y\4`g\tO%I57q]p=0%lBC#<@A:l5Q.7ga404ZW9IM$t@dR1'uf$!Ej[fN^=aBNO(mhu=((s3UZr`&mgQ!E%haaG<4BEWn"u(Gub;Z,<#B%"Y>>Z,7!&dtB,b6:/D`f]V;-mlZ?Cdf>"c7nfY*.D^cZ.7"&,IS*n0ZBI83e@rsc=3CrE#dmNq1Q4^.::*d8+;BK,q:g45J,ofk@&`2NKb`=Vc?"3=nGIe#p@1l,g\m(W9?j0'hJOk/-Zl^G%;F^4/^Q[e!#4Icg#<.udahcofWe-gmPV>_h<t#l^Y:T[S=E)(5Yn%jF?GYI@^i#SR^+6_]c]VajYlJE?IHVaP!Bhj2l5'+-4dM5NZ,I&7NILXF%pi-`(K%!LKfpa5no]apM#"^hK4ACMn!Ee#BUT:ZOU_V`2$hP]WVh?rpfA)^;4VYT1?d5VQlcOMsl>P]bt\\XOSm?.B.?r%_9N(U%\rIdSe+aKEmo"ErBhp@>)r#[T4TmN;DEm6>N[*\6h]""\7g[;*@9Fp;KMF^>nH?bK*6d.--b';=3,l<_\M6,X!c>S8Z70?k:L^EbP,!n=82J~>endstream
endobj
xref
0 11
0000000000 65535 f
0000000061 00000 n
0000000102 00000 n
0000000209 00000 n
0000000321 00000 n
0000000524 00000 n
0000000728 00000 n
0000000796 00000 n
0000001117 00000 n
0000001182 00000 n
0000002903 00000 n
trailer
<<
/ID
[<dca60b858bbf25b2a582f4a4f7e19a89><dca60b858bbf25b2a582f4a4f7e19a89>]
% ReportLab generated PDF document -- digest (opensource)
/Info 7 0 R
/Root 6 0 R
/Size 11
>>
startxref
3831
%%EOF
+93
View File
@@ -0,0 +1,93 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
5 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20261102142418+07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261102142418+07'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Pedoman Penulisan dan Bimbingan Skripsi) /Trapped /False
>>
endobj
8 0 obj
<<
/Count 2 /Kids [ 4 0 R 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1627
>>
stream
GatU2gMZ%@%"7kOn1cM"XlWcW^28BO)PgSJfD5Lt@O-7Pf$4Fgrk@=3P*L-!(Rl5Yp0;k)nF2N"b[:X#qKt$u[fq0UP!_EgiYh;u[Y3XY\18mj-M_ZEH4AK,7CLn)CuEE/IS=?f_:=b(!qP<],npPII@3I:OfRVc\S/P!At.ldAl)HGogmWiTS5nA;6rb#'jA+Y;mNOQ_H&[74oY`*%Z90&O&r7JMTN?L[l:f4Wr^i,V>M,Q?eo/tGm9>jr!POo*T.i1aniapIg0]%]"&Z)ESUfE+jUhplP07/4_i'E*55m7T)A\`_A36@*Wm5f#V'T/#(211YXO*JJM]9jQV8>;0PoF8m_N5kq$a\B>Grq^IfK2iDh7_+2,!c/Y0^$9s!lN"$N"SApGE=#UcC-_Cq+f8;3.a:-aY$8Pu=a3^r,muZreJr1?8Nt.*:jQO)FeCUU/.s]YN_NMLEZ_^t,0:?D8r\amkLVOt3ms-t7$;=supE<cDuLpWd/SKi9\l;;2m,hX3qn$[RJl*84S)!$*Yk.4BKd=.s<@N2!-tm*Klq=*rE95]-oG0S3pZa?Ujad%\WC]L.X8E>MD=Q=N?^d(4Y;QNqj)id,@emc4[S7.=knA-cEb1ii!cc`>=&"gqN`UnHjJ:o<SPr@E]V#HML/jfkSsfRc*u&KcYC?;m'/WV2o7ZidBY]HDthq?LIpF%Wc<a(V_(>G5caelf#/JF2Y3'l-btB.9^P&5b2`4#Gk_X9KKO.Q`nTfrW8YO2t4W8[8u<Ub\pUpW<X<CbD(S_mD)d3$4R[kqTk]<2A!$'l!qKU+YpPii0AeFRBG;L/dhuZd5q)Q*4g\'F2.rA4gs=\%O'_8l\ni1,W5Vd@-&r0lVgRb!`FqF?BeM&t^be52%PVOWtc,Q)(/U6\]Dn(j=:Pa#q(M!-+=Y`Qe'GWEm=&ULfoRY;+N?I:D9YY,Jdf3m#3lk[O<3I1A">BNn/8OlLsd'Z1e;Z6\%t&@RT_C3A#V#'"&'`@C/h+;Kl7G4eJ:kLmD[H-\koX38GpD^()J^*FLY9b:rWI'dT=`(5V`(*qneI;^EE#ktd]>Om`DA4olVEEe@sVb2+54a^QW]?<HO'4$!?Jdm##LCWf:bsbJuLK8"A.3.6>B?6u$&\P0t8t5<a8[2bjJ^V=H4P@N)Ulu2f4B8?m=YS[b&eEW:LXDj`:G528cR*eKr1N*efc7H"`MG1Ja=NFRdW=Jh-.ZOPGX+FZJ$9AEm6'mJWZ$$ugn'g-qB'(AfcZM]r[DleY_bE+6c!r$db5e<%k.DS1tbR]Y@J;H)Z!-qdVQt2\q'98SkY^>:c<4=?1<dM-N>K>$eTJ25pT7nI'2iXO<hjr#)7"dJc!'k]<(IP5)L<OVCL?S:;nI/P_TA/\<LfO,MQ)ZY9S1(n5Q,oAR@-DY=IJTcXc`@rU^Aq,U^r/c-qO(3fCS=G?VKM>_ssWBRsF1i>C-E)g,s^/5.BgfB)o]a4H7D>UNlaVZ2(r=UL@lTles_"6)<d?$!M^s)PQ7Bn5G7G&8`e?]UbYGj7b?MdAtLZ_n@Y;&idY`(rJVO9S(LFX0D:T&mC55W_[3IBT'b6rtf^<kdtjJ>FMOTRFZ+3,BUZIHM[Ro]P'X$RYlTLilAP~>endstream
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 772
>>
stream
GatU0bAu)d&A7I5oF\$0D!rU<CT>5X;??[tm7=K0OqgIt;Z$3Q[#Y?I8ugh/K/IDgFSBm0)E!uS]q'\s%\GpDBNfM%BNEXjh%s==MoS8-W8)3.hO[g'mDTjMe)G@EQNKH'/itm;\E,`^BogdYXA)01GJc\(<Rp)a.(TF9UNe1)WPf/cX<+&J1$bg*W>@KYd2d\H+l,eFCU"QVj(/^PW-u5!aRC8,4h;/K\#M/u+1-Zp(V"MG&'W;UCCZDQjiAS'M,<2TN&5X\aen5k_I8+c]iZ<Up&e%KA>7%SFf`=B(>fnbIOB0BI@J<dH'QGs^?_C(">dqI%ipZ%.6pJO<X27bI&>/0>>E,Bc4pCJX.@\Q_DQu)Lc]U`Vt"pJ.Vd-=8g9g8U`8M#8s1+tN\DAXcOW>$K,9=O;.9laTR./OUE)KBG"G8e1qcZ(k2JeKT1>rkH!9TLC=-iR9l4*J\n$kEKrZVV7J%PB60KUgqR'qd(X%<8prBtGl\deG4rn3<<t0Tum(1e\dQYpp;MKWj4Eq1#Hq[&b<Tq@1L(QmNianuS;+/O-]pQTFs)iTYl)[U&2##U<E\uIq8k3a(6_6e<'LdYgXP9PQmU[*>lbc&Z'rk$tSfCW$,VUQu2"fT&*Ti1KWnQe#IqHd5C0ujDQFE>AU`://glIQ+Gt<rKG\5V1EJS`.5#c4Db9=i<Qb?$n=OU3p85"/!S.\A_):<5lmZSSD;\cB<p*nEud$FZq$rQmcR4-D'U%`nFF@d1\_,^)I1U-WXXf\q?~>endstream
endobj
xref
0 11
0000000000 65535 f
0000000061 00000 n
0000000102 00000 n
0000000209 00000 n
0000000321 00000 n
0000000524 00000 n
0000000728 00000 n
0000000796 00000 n
0000001102 00000 n
0000001167 00000 n
0000002885 00000 n
trailer
<<
/ID
[<8e64b0ef2addd2fbfe61d19a42b1f7d3><8e64b0ef2addd2fbfe61d19a42b1f7d3>]
% ReportLab generated PDF document -- digest (opensource)
/Info 7 0 R
/Root 6 0 R
/Size 11
>>
startxref
3748
%%EOF
+70
View File
@@ -0,0 +1,70 @@
"""Lab 3 - Ukur Hit@k dan MRR untuk satu atau beberapa koleksi.
Pakai:
python evaluasi_retrieval.py 500 1000 1500
Hasil juga disimpan ke hasil_lab3.csv (rincian per pertanyaan) dan hasil_lab3.txt (ringkasan).
"""
import csv
import sys
from umum import ambil_embedding, buka_klien, ambil_koleksi, nama_koleksi
from uji import UJI
KS = (1, 3, 5)
K_MAKS = max(KS)
ukuran_list = [int(a) for a in sys.argv[1:]] or [800]
if len(UJI) < 15:
print(f"PERINGATAN: baru {len(UJI)} pertanyaan uji; tugas meminta 15. Lengkapi uji.py.\n")
emb = ambil_embedding()
klien = buka_klien()
keluaran, baris_csv = [], []
def cetak(s=""):
print(s)
keluaran.append(s)
ringkasan = {}
for ukuran in ukuran_list:
koleksi = ambil_koleksi(klien, nama_koleksi(ukuran), emb)
# cek: apakah tiap frasa kunci memang ada di suatu chunk? (menangkap salah ketik)
semua = " ".join(koleksi.get(include=["documents"])["documents"]).lower()
for q, kunci in UJI:
if kunci.lower() not in semua:
cetak(f" [!] koleksi {ukuran}: frasa '{kunci}' tidak ditemukan di chunk mana pun "
f"(salah ketik, atau terbelah di batas chunk) - pertanyaan: {q}")
hit = {k: 0 for k in KS}
rr_total = 0.0
gagal = []
for q, kunci in UJI:
docs = koleksi.query(query_texts=[q], n_results=K_MAKS)["documents"][0]
peringkat = next((i + 1 for i, d in enumerate(docs) if kunci.lower() in d.lower()), None)
for k in KS:
if peringkat and peringkat <= k:
hit[k] += 1
rr_total += (1 / peringkat) if peringkat else 0
if not peringkat:
gagal.append(q)
baris_csv.append([ukuran, q, kunci, peringkat or "tidak muncul"])
n = len(UJI)
ringkasan[ukuran] = ({k: hit[k] / n for k in KS}, rr_total / n, gagal)
cetak()
cetak(f"{'ukuran chunk':>13} " + " ".join(f"Hit@{k:<3}" for k in KS) + f" {'MRR':>6}")
for ukuran, (h, mrr, _) in ringkasan.items():
cetak(f"{ukuran:>13} " + " ".join(f"{h[k]:>6.2f}" for k in KS) + f" {mrr:>6.2f}")
cetak()
for ukuran, (_, _, gagal) in ringkasan.items():
cetak(f"Pertanyaan yang gagal masuk top-{K_MAKS} pada ukuran {ukuran} ({len(gagal)}):")
for q in gagal:
cetak(f" - {q}")
with open("hasil_lab3.csv", "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["ukuran_chunk", "pertanyaan", "frasa_kunci", "peringkat_chunk_benar"])
w.writerows(baris_csv)
with open("hasil_lab3.txt", "w", encoding="utf-8") as f:
f.write("\n".join(keluaran))
print("\nDisimpan: hasil_lab3.csv dan hasil_lab3.txt")
+34
View File
@@ -0,0 +1,34 @@
=== Langkah 1: cek teks terbaca ===
Total karakter: 3834
Pedoman Akademik Program Studi Teknik Informatika Bab 1. Ketentuan Umum Pasal 1.1 Pedoman ini mengatur penyelenggaraan kegiatan akademik bagi seluruh mahasiswa program studi Teknik Informatika. Setiap mahasiswa wajib memahami dan mematuhi ketentuan yang tercantum dalam pedoman ini sejak awal masa studi. Pasal 1.2 Satu tahun akademik terdiri atas dua semester reguler, yaitu semester ganjil dan semester genap. Setiap semester berlangsung selama 16 minggu, termasuk 14 minggu perkuliahan, satu mingg
=== Langkah 2: jumlah chunk per pengaturan ===
ukuran overlap jumlah chunk rata2 panjang % tdk berakhir kalimat
500 75 9 493 100%
1000 150 5 887 100%
1500 225 3 1428 100%
=== Langkah 3: 3 chunk acak per ukuran (awal 200 + akhir 100 karakter) ===
--- ukuran 500 (overlap 75) ---
[chunk 0] Pedoman Akademik Program Studi Teknik Informatika Bab 1. Ketentuan Umum Pasal 1.1 Pedoman ini mengatur penyelenggaraan kegiatan akademik bagi seluruh mahasiswa program studi Teknik Informatika. Setiap ... ster genap. Setiap semester berlangsung selama 16 minggu, termasuk 14 minggu perkuliahan, satu mingg
berakhir di akhir kalimat? TIDAK (terpotong)
[chunk 1] er berlangsung selama 16 minggu, termasuk 14 minggu perkuliahan, satu minggu ujian tengah semester, dan satu minggu ujian akhir semester. Pasal 1.3 Beban studi dinyatakan dalam satuan kredit semester ... iap awal semester melalui sistem informasi akademik pada jadwal yang ditetapkan. Mahasiswa yang tida
berakhir di akhir kalimat? TIDAK (terpotong)
[chunk 5] gunakan perangkat elektronik untuk kegiatan di luar pembelajaran. Bab 4. Penilaian dan Ujian Pasal 4.1 Penilaian hasil belajar terdiri atas tugas, kuis, ujian tengah semester, dan ujian akhir semester ... 0; 1,0; dan 0. Mahasiswa dinyatakan lulus suatu mata kuliah apabila memperoleh nilai minimal C. Pasa
berakhir di akhir kalimat? TIDAK (terpotong)
--- ukuran 1000 (overlap 150) ---
[chunk 0] Pedoman Akademik Program Studi Teknik Informatika Bab 1. Ketentuan Umum Pasal 1.1 Pedoman ini mengatur penyelenggaraan kegiatan akademik bagi seluruh mahasiswa program studi Teknik Informatika. Setiap ... pkan. Mahasiswa yang tidak melakukan registrasi sampai batas akhir dinyatakan cuti tanpa keterangan
berakhir di akhir kalimat? TIDAK (terpotong)
[chunk 1] sistem informasi akademik pada jadwal yang ditetapkan. Mahasiswa yang tidak melakukan registrasi sampai batas akhir dinyatakan cuti tanpa keterangan dan tidak berhak mengikuti kegiatan perkuliahan. P ... diran karena sakit harus dibuktikan dengan surat keterangan dokter yang diserahkan paling lambat tig
berakhir di akhir kalimat? TIDAK (terpotong)
[chunk 2] uk dapat mengikuti ujian akhir semester. Ketidakhadiran karena sakit harus dibuktikan dengan surat keterangan dokter yang diserahkan paling lambat tiga hari setelah masuk kembali. Pasal 3.2 Keterlamba ... leh nilai minimal C. Pasal 4.3 Ujian susulan hanya diberikan kepada mahasiswa yang berhalangan karen
berakhir di akhir kalimat? TIDAK (terpotong)
--- ukuran 1500 (overlap 225) ---
[chunk 0] Pedoman Akademik Program Studi Teknik Informatika Bab 1. Ketentuan Umum Pasal 1.1 Pedoman ini mengatur penyelenggaraan kegiatan akademik bagi seluruh mahasiswa program studi Teknik Informatika. Setiap ... lakukan pada minggu pertama dan kedua perkuliahan dengan persetujuan dosen pembimbing akademik. Sete
berakhir di akhir kalimat? TIDAK (terpotong)
[chunk 1] 99 boleh mengambil sampai 21 SKS, dan IPS di bawah 2,50 boleh mengambil sampai 18 SKS. Pasal 2.3 Perubahan KRS hanya dapat dilakukan pada minggu pertama dan kedua perkuliahan dengan persetujuan dosen ... wa yang berhalangan karena sakit dengan surat dokter, musibah keluarga, atau tugas resmi universitas
berakhir di akhir kalimat? TIDAK (terpotong)
[chunk 2] dinyatakan lulus suatu mata kuliah apabila memperoleh nilai minimal C. Pasal 4.3 Ujian susulan hanya diberikan kepada mahasiswa yang berhalangan karena sakit dengan surat dokter, musibah keluarga, ata ... dak memiliki nilai E, dan telah menyelesaikan skripsi. Batas masa studi maksimum adalah 14 semester.
berakhir di akhir kalimat? YA
+64
View File
@@ -0,0 +1,64 @@
Koleksi: pedoman_1000 (13 chunk)
[biasa] Apa syarat untuk dapat mengambil skripsi?
#1 pedoman_skripsi.pdf hal 1 chunk 0 jarak=0.386
Pedoman Penulisan dan Bimbingan Skripsi Bab 1. Persyaratan Pengambilan Skripsi Pasal 1.1 Mahasiswa dapat mengambil mata kuliah skripsi apabila telah menempuh minimal 110 SKS dengan IPK minimal 2,50 dan telah lulus mata kuliah Metodologi Penelitian. P ...
#2 pedoman_skripsi.pdf hal 2 chunk 3 jarak=0.485
Pasal 4.2 Sidang akhir dihadiri oleh dua pembimbing dan dua penguji. Nilai skripsi terdiri atas 40 persen dari nilai pembimbing dan 60 persen dari nilai penguji. Mahasiswa dinyatakan lulus sidang apabila nilai akhir minimal B. Pasal 4.3 Revisi pascas ...
#3 pedoman_skripsi.pdf hal 1 chunk 1 jarak=0.491
inimal delapan kali selama satu semester dan dicatat pada lembar bimbingan yang ditandatangani pembimbing. Mahasiswa tidak boleh mendaftar seminar hasil sebelum memenuhi jumlah minimal bimbingan. Pasal 2.3 Apabila mahasiswa tidak melakukan bimbingan ...
Relevan? (isi: ya/tidak, chunk teratas): ya
[biasa] Berapa lama peminjaman perangkat keras laboratorium?
#1 pedoman_lab_dan_keamanan.pdf hal 1 chunk 1 jarak=0.289
nfigurasi sistem, atau mencabut kabel jaringan dan perangkat periferal. Data pribadi yang disimpan pada komputer laboratorium akan dihapus secara berkala setiap akhir pekan. Pasal 2.3 Peminjaman perangkat keras seperti mikrokontroler, sensor, dan kab ...
#2 pedoman_akademik.pdf hal 1 chunk 0 jarak=0.394
Pedoman Akademik Program Studi Teknik Informatika Bab 1. Ketentuan Umum Pasal 1.1 Pedoman ini mengatur penyelenggaraan kegiatan akademik bagi seluruh mahasiswa program studi Teknik Informatika. Setiap mahasiswa wajib memahami dan mematuhi ketentuan y ...
#3 pedoman_lab_dan_keamanan.pdf hal 1 chunk 0 jarak=0.411
Pedoman Penggunaan Laboratorium dan Keamanan Informasi Bab 1. Jam Operasional dan Akses Pasal 1.1 Laboratorium komputer beroperasi pada hari Senin sampai Jumat pukul 07.30 sampai 17.00 WIB dan hari Sabtu pukul 08.00 sampai 12.00 WIB. Di luar jam ters ...
Relevan? (isi: ya/tidak, chunk teratas): ya
[biasa] Berapa persen kehadiran minimal agar boleh ikut ujian akhir?
#1 pedoman_akademik.pdf hal 2 chunk 3 jarak=0.350
Pasal 4.1 Penilaian hasil belajar terdiri atas tugas, kuis, ujian tengah semester, dan ujian akhir semester. Bobot setiap komponen ditetapkan dosen pengampu dan diumumkan pada pertemuan pertama. Pasal 4.2 Nilai akhir dinyatakan dalam huruf A, AB, B, ...
#2 pedoman_akademik.pdf hal 1 chunk 1 jarak=0.396
sistem informasi akademik pada jadwal yang ditetapkan. Mahasiswa yang tidak melakukan registrasi sampai batas akhir dinyatakan cuti tanpa keterangan dan tidak berhak mengikuti kegiatan perkuliahan. Pasal 2.2 Kartu Rencana Studi (KRS) diisi setelah r ...
#3 pedoman_akademik.pdf hal 2 chunk 4 jarak=0.397
g etik. Bab 5. Cuti, Evaluasi Studi, dan Kelulusan Pasal 5.1 Cuti akademik dapat diambil paling banyak dua semester selama masa studi dan tidak dihitung dalam batas waktu studi. Pengajuan cuti dilakukan sebelum registrasi dengan alasan yang jelas, mi ...
Relevan? (isi: ya/tidak, chunk teratas): tidak (jawaban '75 persen' ada di #2, chunk akademik hal 1 chunk 1)
[biasa] Apa format huruf dan spasi penulisan skripsi?
#1 pedoman_skripsi.pdf hal 1 chunk 0 jarak=0.523
Pedoman Penulisan dan Bimbingan Skripsi Bab 1. Persyaratan Pengambilan Skripsi Pasal 1.1 Mahasiswa dapat mengambil mata kuliah skripsi apabila telah menempuh minimal 110 SKS dengan IPK minimal 2,50 dan telah lulus mata kuliah Metodologi Penelitian. P ...
#2 pedoman_skripsi.pdf hal 1 chunk 1 jarak=0.532
inimal delapan kali selama satu semester dan dicatat pada lembar bimbingan yang ditandatangani pembimbing. Mahasiswa tidak boleh mendaftar seminar hasil sebelum memenuhi jumlah minimal bimbingan. Pasal 2.3 Apabila mahasiswa tidak melakukan bimbingan ...
#3 pedoman_akademik.pdf hal 2 chunk 3 jarak=0.635
Pasal 4.1 Penilaian hasil belajar terdiri atas tugas, kuis, ujian tengah semester, dan ujian akhir semester. Bobot setiap komponen ditetapkan dosen pengampu dan diumumkan pada pertemuan pertama. Pasal 4.2 Nilai akhir dinyatakan dalam huruf A, AB, B, ...
Relevan? (isi: ya/tidak, chunk teratas): tidak (format huruf/spasi ada di Pasal 3.1, chunk skripsi hal 1 chunk 1 = #2)
[biasa] Bagaimana prosedur ujian susulan?
#1 pedoman_akademik.pdf hal 2 chunk 3 jarak=0.436
Pasal 4.1 Penilaian hasil belajar terdiri atas tugas, kuis, ujian tengah semester, dan ujian akhir semester. Bobot setiap komponen ditetapkan dosen pengampu dan diumumkan pada pertemuan pertama. Pasal 4.2 Nilai akhir dinyatakan dalam huruf A, AB, B, ...
#2 pedoman_akademik.pdf hal 1 chunk 2 jarak=0.534
uk dapat mengikuti ujian akhir semester. Ketidakhadiran karena sakit harus dibuktikan dengan surat keterangan dokter yang diserahkan paling lambat tiga hari setelah masuk kembali. Pasal 3.2 Keterlambatan lebih dari 15 menit tanpa alasan yang dapat di ...
#3 pedoman_akademik.pdf hal 2 chunk 4 jarak=0.538
g etik. Bab 5. Cuti, Evaluasi Studi, dan Kelulusan Pasal 5.1 Cuti akademik dapat diambil paling banyak dua semester selama masa studi dan tidak dihitung dalam batas waktu studi. Pengajuan cuti dilakukan sebelum registrasi dengan alasan yang jelas, mi ...
Relevan? (isi: ya/tidak, chunk teratas): ya
[parafrase] Bolehkah saya berhenti kuliah sementara waktu?
#1 pedoman_akademik.pdf hal 2 chunk 4 jarak=0.552
g etik. Bab 5. Cuti, Evaluasi Studi, dan Kelulusan Pasal 5.1 Cuti akademik dapat diambil paling banyak dua semester selama masa studi dan tidak dihitung dalam batas waktu studi. Pengajuan cuti dilakukan sebelum registrasi dengan alasan yang jelas, mi ...
#2 pedoman_akademik.pdf hal 1 chunk 0 jarak=0.602
Pedoman Akademik Program Studi Teknik Informatika Bab 1. Ketentuan Umum Pasal 1.1 Pedoman ini mengatur penyelenggaraan kegiatan akademik bagi seluruh mahasiswa program studi Teknik Informatika. Setiap mahasiswa wajib memahami dan mematuhi ketentuan y ...
#3 pedoman_akademik.pdf hal 1 chunk 1 jarak=0.650
sistem informasi akademik pada jadwal yang ditetapkan. Mahasiswa yang tidak melakukan registrasi sampai batas akhir dinyatakan cuti tanpa keterangan dan tidak berhak mengikuti kegiatan perkuliahan. Pasal 2.2 Kartu Rencana Studi (KRS) diisi setelah r ...
Relevan? (isi: ya/tidak, chunk teratas): ya (cuti akademik, Pasal 5.1)
[parafrase] Bagaimana kalau saya dapat surel penipuan yang meminta password?
#1 pedoman_lab_dan_keamanan.pdf hal 1 chunk 2 jarak=0.492
apor dan melakukan verifikasi identitas. Pasal 3.3 Autentikasi dua faktor wajib diaktifkan untuk akun yang memiliki akses ke sistem informasi akademik dan layanan surel kampus. Bab 4. Penanganan Insiden Keamanan Pasal 4.1 Setiap indikasi insiden keam ...
#2 pedoman_lab_dan_keamanan.pdf hal 1 chunk 1 jarak=0.663
nfigurasi sistem, atau mencabut kabel jaringan dan perangkat periferal. Data pribadi yang disimpan pada komputer laboratorium akan dihapus secara berkala setiap akhir pekan. Pasal 2.3 Peminjaman perangkat keras seperti mikrokontroler, sensor, dan kab ...
#3 pedoman_lab_dan_keamanan.pdf hal 2 chunk 3 jarak=0.709
Pasal 4.2 Setelah laporan diterima, tim keamanan melakukan isolasi perangkat, analisis penyebab, pemulihan layanan, dan penyusunan laporan insiden. Pelapor akan menerima pembaruan status paling lambat dalam dua hari kerja. Pasal 4.3 Mahasiswa dilaran ...
Relevan? (isi: ya/tidak, chunk teratas): ya (Pasal 4.1: phishing, lapor 24 jam)
+46
View File
@@ -0,0 +1,46 @@
ukuran_chunk,pertanyaan,frasa_kunci,peringkat_chunk_benar
500,Berapa minimal kehadiran agar boleh mengikuti ujian akhir semester?,75 persen,1
500,"Berapa SKS maksimum yang boleh diambil jika IPS di atas 3,00?",24 SKS,1
500,Berapa SKS yang harus diselesaikan agar dinyatakan lulus?,144 SKS,2
500,Berapa semester batas masa studi maksimum?,14 semester,3
500,Berapa lama cuti akademik boleh diambil?,paling banyak dua semester,2
500,Apa sanksi bagi mahasiswa yang menyontek saat ujian?,sidang etik,1
500,Berapa SKS minimal untuk dapat mengambil skripsi?,110 SKS,2
500,Berapa batas tingkat kemiripan plagiarisme pada skripsi?,25 persen,1
500,Berapa karakter minimal kata sandi akun kampus?,minimal 12 karakter,1
500,Dalam berapa jam insiden keamanan harus dilaporkan?,24 jam,3
500,Bolehkah saya berhenti kuliah sementara waktu?,cuti akademik,1
500,Bagaimana kalau saya lupa daftar ulang di awal semester?,cuti tanpa keterangan,3
500,Apakah boleh memakai laptop untuk bermain game saat kuliah berlangsung?,perangkat elektronik,1
500,Apa yang harus saya lakukan jika menerima surel penipuan yang meminta data akun?,phishing,1
500,Bolehkah saya meminjamkan password akun saya ke teman?,membagikan kata sandi,1
1000,Berapa minimal kehadiran agar boleh mengikuti ujian akhir semester?,75 persen,2
1000,"Berapa SKS maksimum yang boleh diambil jika IPS di atas 3,00?",24 SKS,1
1000,Berapa SKS yang harus diselesaikan agar dinyatakan lulus?,144 SKS,3
1000,Berapa semester batas masa studi maksimum?,14 semester,2
1000,Berapa lama cuti akademik boleh diambil?,paling banyak dua semester,1
1000,Apa sanksi bagi mahasiswa yang menyontek saat ujian?,sidang etik,5
1000,Berapa SKS minimal untuk dapat mengambil skripsi?,110 SKS,2
1000,Berapa batas tingkat kemiripan plagiarisme pada skripsi?,25 persen,1
1000,Berapa karakter minimal kata sandi akun kampus?,minimal 12 karakter,tidak muncul
1000,Dalam berapa jam insiden keamanan harus dilaporkan?,24 jam,3
1000,Bolehkah saya berhenti kuliah sementara waktu?,cuti akademik,1
1000,Bagaimana kalau saya lupa daftar ulang di awal semester?,cuti tanpa keterangan,3
1000,Apakah boleh memakai laptop untuk bermain game saat kuliah berlangsung?,perangkat elektronik,tidak muncul
1000,Apa yang harus saya lakukan jika menerima surel penipuan yang meminta data akun?,phishing,1
1000,Bolehkah saya meminjamkan password akun saya ke teman?,membagikan kata sandi,2
1500,Berapa minimal kehadiran agar boleh mengikuti ujian akhir semester?,75 persen,1
1500,"Berapa SKS maksimum yang boleh diambil jika IPS di atas 3,00?",24 SKS,tidak muncul
1500,Berapa SKS yang harus diselesaikan agar dinyatakan lulus?,144 SKS,1
1500,Berapa semester batas masa studi maksimum?,14 semester,2
1500,Berapa lama cuti akademik boleh diambil?,paling banyak dua semester,tidak muncul
1500,Apa sanksi bagi mahasiswa yang menyontek saat ujian?,sidang etik,4
1500,Berapa SKS minimal untuk dapat mengambil skripsi?,110 SKS,1
1500,Berapa batas tingkat kemiripan plagiarisme pada skripsi?,25 persen,1
1500,Berapa karakter minimal kata sandi akun kampus?,minimal 12 karakter,1
1500,Dalam berapa jam insiden keamanan harus dilaporkan?,24 jam,tidak muncul
1500,Bolehkah saya berhenti kuliah sementara waktu?,cuti akademik,tidak muncul
1500,Bagaimana kalau saya lupa daftar ulang di awal semester?,cuti tanpa keterangan,5
1500,Apakah boleh memakai laptop untuk bermain game saat kuliah berlangsung?,perangkat elektronik,5
1500,Apa yang harus saya lakukan jika menerima surel penipuan yang meminta data akun?,phishing,1
1500,Bolehkah saya meminjamkan password akun saya ke teman?,membagikan kata sandi,1
1 ukuran_chunk pertanyaan frasa_kunci peringkat_chunk_benar
2 500 Berapa minimal kehadiran agar boleh mengikuti ujian akhir semester? 75 persen 1
3 500 Berapa SKS maksimum yang boleh diambil jika IPS di atas 3,00? 24 SKS 1
4 500 Berapa SKS yang harus diselesaikan agar dinyatakan lulus? 144 SKS 2
5 500 Berapa semester batas masa studi maksimum? 14 semester 3
6 500 Berapa lama cuti akademik boleh diambil? paling banyak dua semester 2
7 500 Apa sanksi bagi mahasiswa yang menyontek saat ujian? sidang etik 1
8 500 Berapa SKS minimal untuk dapat mengambil skripsi? 110 SKS 2
9 500 Berapa batas tingkat kemiripan plagiarisme pada skripsi? 25 persen 1
10 500 Berapa karakter minimal kata sandi akun kampus? minimal 12 karakter 1
11 500 Dalam berapa jam insiden keamanan harus dilaporkan? 24 jam 3
12 500 Bolehkah saya berhenti kuliah sementara waktu? cuti akademik 1
13 500 Bagaimana kalau saya lupa daftar ulang di awal semester? cuti tanpa keterangan 3
14 500 Apakah boleh memakai laptop untuk bermain game saat kuliah berlangsung? perangkat elektronik 1
15 500 Apa yang harus saya lakukan jika menerima surel penipuan yang meminta data akun? phishing 1
16 500 Bolehkah saya meminjamkan password akun saya ke teman? membagikan kata sandi 1
17 1000 Berapa minimal kehadiran agar boleh mengikuti ujian akhir semester? 75 persen 2
18 1000 Berapa SKS maksimum yang boleh diambil jika IPS di atas 3,00? 24 SKS 1
19 1000 Berapa SKS yang harus diselesaikan agar dinyatakan lulus? 144 SKS 3
20 1000 Berapa semester batas masa studi maksimum? 14 semester 2
21 1000 Berapa lama cuti akademik boleh diambil? paling banyak dua semester 1
22 1000 Apa sanksi bagi mahasiswa yang menyontek saat ujian? sidang etik 5
23 1000 Berapa SKS minimal untuk dapat mengambil skripsi? 110 SKS 2
24 1000 Berapa batas tingkat kemiripan plagiarisme pada skripsi? 25 persen 1
25 1000 Berapa karakter minimal kata sandi akun kampus? minimal 12 karakter tidak muncul
26 1000 Dalam berapa jam insiden keamanan harus dilaporkan? 24 jam 3
27 1000 Bolehkah saya berhenti kuliah sementara waktu? cuti akademik 1
28 1000 Bagaimana kalau saya lupa daftar ulang di awal semester? cuti tanpa keterangan 3
29 1000 Apakah boleh memakai laptop untuk bermain game saat kuliah berlangsung? perangkat elektronik tidak muncul
30 1000 Apa yang harus saya lakukan jika menerima surel penipuan yang meminta data akun? phishing 1
31 1000 Bolehkah saya meminjamkan password akun saya ke teman? membagikan kata sandi 2
32 1500 Berapa minimal kehadiran agar boleh mengikuti ujian akhir semester? 75 persen 1
33 1500 Berapa SKS maksimum yang boleh diambil jika IPS di atas 3,00? 24 SKS tidak muncul
34 1500 Berapa SKS yang harus diselesaikan agar dinyatakan lulus? 144 SKS 1
35 1500 Berapa semester batas masa studi maksimum? 14 semester 2
36 1500 Berapa lama cuti akademik boleh diambil? paling banyak dua semester tidak muncul
37 1500 Apa sanksi bagi mahasiswa yang menyontek saat ujian? sidang etik 4
38 1500 Berapa SKS minimal untuk dapat mengambil skripsi? 110 SKS 1
39 1500 Berapa batas tingkat kemiripan plagiarisme pada skripsi? 25 persen 1
40 1500 Berapa karakter minimal kata sandi akun kampus? minimal 12 karakter 1
41 1500 Dalam berapa jam insiden keamanan harus dilaporkan? 24 jam tidak muncul
42 1500 Bolehkah saya berhenti kuliah sementara waktu? cuti akademik tidak muncul
43 1500 Bagaimana kalau saya lupa daftar ulang di awal semester? cuti tanpa keterangan 5
44 1500 Apakah boleh memakai laptop untuk bermain game saat kuliah berlangsung? perangkat elektronik 5
45 1500 Apa yang harus saya lakukan jika menerima surel penipuan yang meminta data akun? phishing 1
46 1500 Bolehkah saya meminjamkan password akun saya ke teman? membagikan kata sandi 1
+15
View File
@@ -0,0 +1,15 @@
ukuran chunk Hit@1 Hit@3 Hit@5 MRR
500 0.60 1.00 1.00 0.77
1000 0.33 0.80 0.87 0.55
1500 0.47 0.53 0.73 0.54
Pertanyaan yang gagal masuk top-5 pada ukuran 500 (0):
Pertanyaan yang gagal masuk top-5 pada ukuran 1000 (2):
- Berapa karakter minimal kata sandi akun kampus?
- Apakah boleh memakai laptop untuk bermain game saat kuliah berlangsung?
Pertanyaan yang gagal masuk top-5 pada ukuran 1500 (4):
- Berapa SKS maksimum yang boleh diambil jika IPS di atas 3,00?
- Berapa lama cuti akademik boleh diambil?
- Dalam berapa jam insiden keamanan harus dilaporkan?
- Bolehkah saya berhenti kuliah sementara waktu?
+45
View File
@@ -0,0 +1,45 @@
"""Lab 2 - Bangun indeks ChromaDB dari semua PDF di folder dokumen/.
Pakai:
python indeks.py # ukuran 800, overlap 100 (koleksi: pedoman_800)
python indeks.py 500 1000 # beberapa ukuran sekaligus (overlap 15%)
Tiap ukuran menjadi koleksi sendiri (pedoman_500, pedoman_1000, ...) untuk Lab 3.
Aman dijalankan ulang (upsert).
"""
import sys
from umum import (FOLDER_DOKUMEN, baca_pdf_per_halaman, potong, nama_koleksi,
ambil_embedding, buka_klien, buat_koleksi)
if len(sys.argv) > 1:
daftar = [(int(a), int(int(a) * 0.15)) for a in sys.argv[1:]]
else:
daftar = [(800, 100)]
pdfs = sorted(FOLDER_DOKUMEN.glob("*.pdf"))
if not pdfs:
sys.exit("Tidak ada PDF di folder dokumen/. Letakkan 2-3 PDF berbasis teks di sana.")
print("Memuat model embedding (pertama kali akan mengunduh ratusan MB)...")
emb = ambil_embedding()
klien = buka_klien()
for ukuran, tumpang in daftar:
koleksi = buat_koleksi(klien, nama_koleksi(ukuran), emb)
print(f"\n== Koleksi {koleksi.name} (ukuran={ukuran}, overlap={tumpang}) ==")
for pdf in pdfs:
halaman = baca_pdf_per_halaman(pdf)
if not halaman:
print(f"{pdf.name}: TEKS KOSONG (PDF scan?) - dilewati")
continue
ids, docs, metas = [], [], []
n = 0
for no_hal, teks in halaman: # potong per halaman agar metadata halaman akurat
for c in potong(teks, ukuran, tumpang):
ids.append(f"{pdf.stem}-{ukuran}-{n}")
docs.append(c)
metas.append({"sumber": pdf.name, "halaman": no_hal, "chunk": n})
n += 1
for i in range(0, len(ids), 100): # kirim bertahap
koleksi.upsert(ids=ids[i:i+100], documents=docs[i:i+100], metadatas=metas[i:i+100])
print(f"{pdf.name} -> {len(ids)} chunk")
print(f"Total di koleksi: {koleksi.count()} chunk")
+56
View File
@@ -0,0 +1,56 @@
"""Lab 1 - Eksperimen chunking.
Pakai: python lab1_chunking.py dokumen/namafile.pdf
Hasil dicetak ke layar dan disimpan ke hasil_lab1.txt (bisa ditempel ke laporan).
"""
import random
import sys
from umum import baca_pdf, potong
UKURAN = [500, 1000, 1500]
OVERLAP_PERSEN = 0.15 # 15% (rentang yang disarankan 10-20%)
AKHIR_KALIMAT = (".", "!", "?", ":", ";")
if len(sys.argv) < 2:
sys.exit("Pakai: python lab1_chunking.py dokumen/namafile.pdf")
random.seed(42) # supaya contoh acak bisa diulang
teks = baca_pdf(sys.argv[1])
if not teks.strip():
sys.exit("Teks kosong. PDF kemungkinan hasil scan; pakai PDF berbasis teks.")
keluaran = []
def cetak(s=""):
print(s)
keluaran.append(s)
cetak("=== Langkah 1: cek teks terbaca ===")
cetak(f"Total karakter: {len(teks)}")
cetak(teks[:500])
cetak()
cetak("=== Langkah 2: jumlah chunk per pengaturan ===")
cetak(f"{'ukuran':>7} {'overlap':>8} {'jumlah chunk':>13} {'rata2 panjang':>14} {'% tdk berakhir kalimat':>24}")
hasil_per_ukuran = {}
for u in UKURAN:
t = int(u * OVERLAP_PERSEN)
chunks = potong(teks, u, t)
terpotong = sum(1 for c in chunks[:-1] if not c.rstrip().endswith(AKHIR_KALIMAT))
persen = 100 * terpotong / max(1, len(chunks) - 1)
rata = sum(len(c) for c in chunks) / len(chunks)
hasil_per_ukuran[u] = (chunks, t)
cetak(f"{u:>7} {t:>8} {len(chunks):>13} {rata:>14.0f} {persen:>23.0f}%")
cetak()
cetak("=== Langkah 3: 3 chunk acak per ukuran (awal 200 + akhir 100 karakter) ===")
for u, (chunks, t) in hasil_per_ukuran.items():
cetak(f"--- ukuran {u} (overlap {t}) ---")
for idx in sorted(random.sample(range(len(chunks)), min(3, len(chunks)))):
c = chunks[idx].replace("\n", " ")
cetak(f"[chunk {idx}] {c[:200]} ... {c[-100:]}")
cetak(f" berakhir di akhir kalimat? {'YA' if chunks[idx].rstrip().endswith(AKHIR_KALIMAT) else 'TIDAK (terpotong)'}")
cetak()
with open("hasil_lab1.txt", "w", encoding="utf-8") as f:
f.write("\n".join(keluaran))
print("Disimpan ke hasil_lab1.txt")
+33
View File
@@ -0,0 +1,33 @@
"""Lab 2 - Jalankan 7 pertanyaan sekaligus (5 biasa + 2 parafrase) dan simpan hasilnya.
Pakai: python lab2_tanya.py (koleksi pedoman_1000)
python lab2_tanya.py 500 (koleksi pedoman_500)
Hasil: hasil_lab2.txt. Isi sendiri baris 'Relevan?' setelah membaca chunk teratas.
"""
import sys
from umum import ambil_embedding, buka_klien, ambil_koleksi, nama_koleksi
PERTANYAAN = [
("biasa", "Apa syarat untuk dapat mengambil skripsi?"),
("biasa", "Berapa lama peminjaman perangkat keras laboratorium?"),
("biasa", "Berapa persen kehadiran minimal agar boleh ikut ujian akhir?"),
("biasa", "Apa format huruf dan spasi penulisan skripsi?"),
("biasa", "Bagaimana prosedur ujian susulan?"),
("parafrase", "Bolehkah saya berhenti kuliah sementara waktu?"),
("parafrase", "Bagaimana kalau saya dapat surel penipuan yang meminta password?"),
]
ukuran = int(sys.argv[1]) if len(sys.argv) > 1 else 1000
koleksi = ambil_koleksi(buka_klien(), nama_koleksi(ukuran), ambil_embedding())
baris = [f"Koleksi: {koleksi.name} ({koleksi.count()} chunk)\n"]
for jenis, q in PERTANYAAN:
baris.append(f"[{jenis}] {q}")
hasil = koleksi.query(query_texts=[q], n_results=3)
for r, (doc, meta, jarak) in enumerate(zip(hasil["documents"][0], hasil["metadatas"][0], hasil["distances"][0]), 1):
baris.append(f" #{r} {meta['sumber']} hal {meta['halaman']} chunk {meta['chunk']} jarak={jarak:.3f}")
baris.append(f" {doc[:250]} ...")
baris.append(" Relevan? (isi: ya/tidak, chunk teratas): ____\n")
teks = "\n".join(baris)
print(teks)
open("hasil_lab2.txt", "w", encoding="utf-8").write(teks)
print("Disimpan ke hasil_lab2.txt")
+3
View File
@@ -0,0 +1,3 @@
chromadb
sentence-transformers
pypdf
+26
View File
@@ -0,0 +1,26 @@
"""Lab 3 - Daftar pertanyaan uji untuk 3 dokumen:
pedoman_akademik.pdf, pedoman_lab_dan_keamanan.pdf, pedoman_skripsi.pdf
Format: (pertanyaan, frasa yang HARUS muncul di chunk jawaban yang benar)
10 pertanyaan dengan kata mirip dokumen + 5 pertanyaan parafrase (kata berbeda, makna sama).
Periksa sendiri tiap pasangan dengan membuka PDF-nya sebelum dipakai di laporan.
"""
UJI = [
# --- kata mirip dokumen ---
("Berapa minimal kehadiran agar boleh mengikuti ujian akhir semester?", "75 persen"),
("Berapa SKS maksimum yang boleh diambil jika IPS di atas 3,00?", "24 SKS"),
("Berapa SKS yang harus diselesaikan agar dinyatakan lulus?", "144 SKS"),
("Berapa semester batas masa studi maksimum?", "14 semester"),
("Berapa lama cuti akademik boleh diambil?", "paling banyak dua semester"),
("Apa sanksi bagi mahasiswa yang menyontek saat ujian?", "sidang etik"),
("Berapa SKS minimal untuk dapat mengambil skripsi?", "110 SKS"),
("Berapa batas tingkat kemiripan plagiarisme pada skripsi?", "25 persen"),
("Berapa karakter minimal kata sandi akun kampus?", "minimal 12 karakter"),
("Dalam berapa jam insiden keamanan harus dilaporkan?", "24 jam"),
# --- parafrase (kata berbeda dari dokumen) ---
("Bolehkah saya berhenti kuliah sementara waktu?", "cuti akademik"),
("Bagaimana kalau saya lupa daftar ulang di awal semester?", "cuti tanpa keterangan"),
("Apakah boleh memakai laptop untuk bermain game saat kuliah berlangsung?", "perangkat elektronik"),
("Apa yang harus saya lakukan jika menerima surel penipuan yang meminta data akun?", "phishing"),
("Bolehkah saya meminjamkan password akun saya ke teman?", "membagikan kata sandi"),
]
+67
View File
@@ -0,0 +1,67 @@
"""Fungsi bersama untuk Lab P-10 (RAG Part 1)."""
import re
from pathlib import Path
from pypdf import PdfReader
MODEL_EMBED = "paraphrase-multilingual-MiniLM-L12-v2" # multilingual, jalan lokal
DB_PATH = "./chroma_db"
FOLDER_DOKUMEN = Path("dokumen")
def baca_pdf_per_halaman(path):
"""Kembalikan list (nomor_halaman, teks). Halaman tanpa teks (scan) dilewati."""
reader = PdfReader(path)
hasil = []
for i, p in enumerate(reader.pages, start=1):
teks = re.sub(r"\s+", " ", p.extract_text() or "").strip() # rapikan baris baru PDF
if teks:
hasil.append((i, teks))
return hasil
def baca_pdf(path):
"""Seluruh teks PDF sebagai satu string."""
return "\n".join(t for _, t in baca_pdf_per_halaman(path))
def potong(teks, ukuran=800, tumpang=100):
"""Pemotongan ukuran tetap (karakter) dengan overlap."""
if tumpang >= ukuran:
raise ValueError("tumpang harus lebih kecil dari ukuran")
hasil, mulai = [], 0
while mulai < len(teks):
hasil.append(teks[mulai:mulai + ukuran])
if mulai + ukuran >= len(teks): # sisa teks sudah masuk chunk ini; jangan buat chunk ekor
break
mulai += ukuran - tumpang
return [h for h in hasil if h.strip()]
def nama_koleksi(ukuran):
return f"pedoman_{ukuran}"
def ambil_embedding():
"""Model embedding multilingual (diunduh sekali, lalu tersimpan di cache)."""
from chromadb.utils import embedding_functions
return embedding_functions.SentenceTransformerEmbeddingFunction(model_name=MODEL_EMBED)
def buka_klien():
import chromadb
return chromadb.PersistentClient(path=DB_PATH)
def buat_koleksi(klien, nama, emb):
"""Buat/ambil koleksi dengan jarak cosine (menyesuaikan versi ChromaDB)."""
try:
return klien.get_or_create_collection(
name=nama, embedding_function=emb, metadata={"hnsw:space": "cosine"})
except Exception:
return klien.get_or_create_collection(
name=nama, embedding_function=emb,
configuration={"hnsw": {"space": "cosine"}})
def ambil_koleksi(klien, nama, emb):
return klien.get_collection(name=nama, embedding_function=emb)