Team Ai
Apppublic

jonathanjordan21/Qdrant-knowledge

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
app.py331 linesDownload Raw Back to root
1from fastapi import FastAPI2from langchain_qdrant import QdrantVectorStore3from qdrant_client import QdrantClient4from qdrant_client.http.models import Distance, VectorParams5 6from langchain_qdrant import FastEmbedSparse, QdrantVectorStore, RetrievalMode7from langchain_community.embeddings.fastembed import FastEmbedEmbeddings8 9from qdrant_client import QdrantClient, models10from qdrant_client.http.models import Distance, SparseVectorParams, VectorParams11 12from uuid import uuid413 14from langchain_core.documents import Document15 16from typing import Union, List, Dict, Any17from pydantic import BaseModel, Field18 19class Data(BaseModel):20    items: Union[Dict[str, Any], List[Dict[str, Any]]] = Field(..., description="Either a dictionary or a list of dictionaries.")21 22# document_1 = Document(23#     page_content="I had chocolate chip pancakes and scrambled eggs for breakfast this morning.",24#     metadata={"source": "tweet"},25# )26 27# document_2 = Document(28#     page_content="The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees Fahrenheit.",29#     metadata={"source": "news"},30# )31 32# document_3 = Document(33#     page_content="Building an exciting new project with LangChain - come check it out!",34#     metadata={"source": "tweet"},35# )36 37# document_4 = Document(38#     page_content="Robbers broke into the city bank and stole $1 million in cash.",39#     metadata={"source": "news"},40# )41 42# document_5 = Document(43#     page_content="Wow! That was an amazing movie. I can't wait to see it again.",44#     metadata={"source": "tweet"},45# )46 47# document_6 = Document(48#     page_content="Is the new iPhone worth the price? Read this review to find out.",49#     metadata={"source": "website"},50# )51 52# document_7 = Document(53#     page_content="The top 10 soccer players in the world right now.",54#     metadata={"source": "website"},55# )56 57# document_8 = Document(58#     page_content="LangGraph is the best framework for building stateful, agentic applications!",59#     metadata={"source": "tweet"},60# )61 62# document_9 = Document(63#     page_content="The stock market is down 500 points today due to fears of a recession.",64#     metadata={"source": "news"},65# )66 67# document_10 = Document(68#     page_content="I have a bad feeling I am going to get deleted :(",69#     metadata={"source": "tweet"},70# )71 72# documents = [73#     document_1,74#     document_2,75#     document_3,76#     document_4,77#     document_5,78#     document_6,79#     document_7,80#     document_8,81#     document_9,82#     document_10,83# ]84# uuids = [str(uuid4()) for _ in range(len(documents))]85 86# docs = documents87 88 89# from uuid import uuid490# from langchain.schema import Document91 92document_1 = Document(93    page_content="Aduan: Saya tidak bisa login ke sistem e-learning.\nJawaban: Kami menemukan bahwa akun Anda terkunci setelah tiga kali gagal login. Kami telah membuka kunci akun dan menyarankan Anda untuk melakukan reset password menggunakan fitur 'Lupa Kata Sandi'.",94    metadata={"source": "Aduan"},95)96 97document_2 = Document(98    page_content="Request: Mohon bantuannya untuk mendapatkan akses ke folder tim di server.\nJawaban: Kami telah menambahkan akun Anda ke grup pengguna 'Tim IT' di Active Directory. Akses ke folder sekarang dapat dilakukan setelah Anda login ulang.",99    metadata={"source": "Request"},100)101 102document_3 = Document(103    page_content="Incident: Laporan printer di lantai 3 tidak bisa mencetak.\nJawaban: Kami melakukan restart pada spooler service di perangkat printer dan membersihkan antrian cetak yang bermasalah. Printer sudah kembali normal.",104    metadata={"source": "Incident"},105)106 107document_4 = Document(108    page_content="Aduan: Email saya sering masuk ke folder spam penerima.\nJawaban: Kami periksa konfigurasi SPF, DKIM, dan DMARC pada domain Anda. Ternyata ada konfigurasi SPF yang tidak lengkap. Kami telah memperbaikinya dan hasil pengujian sudah menunjukkan pengiriman email berjalan normal.",109    metadata={"source": "Aduan"},110)111 112document_5 = Document(113    page_content="Request: Saya membutuhkan instalasi software AutoCAD untuk proyek desain.\nJawaban: Kami telah mengunduh versi terbaru dari situs resmi AutoDesk dan melakukan instalasi di laptop Anda. Lisensi telah diaktivasi menggunakan akun universitas.",114    metadata={"source": "Request"},115)116 117document_6 = Document(118    page_content="Incident: Sistem ERP tidak bisa mengakses modul keuangan sejak pagi.\nJawaban: Kami temukan bahwa service database MySQL berhenti secara tiba-tiba. Service telah kami nyalakan kembali dan modul keuangan kini dapat diakses kembali.",119    metadata={"source": "Incident"},120)121 122document_7 = Document(123    page_content="Aduan: Aplikasi mobile sering crash saat dibuka.\nJawaban: Kami analisis log error dan menemukan bug pada fitur notifikasi. Kami telah melakukan patch pada versi 1.2.3 dan memperbarui aplikasi Anda melalui MDM.",124    metadata={"source": "Aduan"},125)126 127document_8 = Document(128    page_content="Request: Mohon dibuatkan email dinas baru untuk staf baru di departemen HR.\nJawaban: Email telah dibuat dengan format nama.staf@institusi.ac.id dan password default. Informasi login telah kami kirimkan melalui email pribadi yang terdaftar.",129    metadata={"source": "Request"},130)131 132document_9 = Document(133    page_content="Incident: Koneksi internet putus-putus di gedung B.\nJawaban: Kami lakukan pengecekan router dan mengganti kabel jaringan yang rusak di lantai 2. Koneksi kini stabil dan normal.",134    metadata={"source": "Incident"},135)136 137document_10 = Document(138    page_content="Aduan: Layar laptop saya berkedip-kedip.\nJawaban: Masalah disebabkan oleh driver grafis yang tidak kompatibel. Kami telah menginstal versi driver yang sesuai dengan perangkat Anda dan masalah layar sudah tidak muncul lagi.",139    metadata={"source": "Aduan"},140)141 142documents = [143    Document(144        page_content="Aduan: Tidak bisa login ke sistem akademik.\nJawaban: Kami periksa bahwa akun Anda belum terverifikasi oleh admin fakultas. Setelah verifikasi dilakukan, Anda dapat login kembali.",145        metadata={"source": "Aduan"},146    ),147    Document(148        page_content="Aduan: Tidak bisa login ke sistem akademik.\nJawaban: Kami menemukan bahwa browser Anda menyimpan cache lama. Setelah Anda membersihkan cache dan cookies, akses sistem berhasil dilakukan.",149        metadata={"source": "Aduan"},150    ),151    Document(152        page_content="Request: Permintaan instalasi Adobe Photoshop.\nJawaban: Kami sudah menginstal Adobe Photoshop versi 2024 dengan lisensi institusi dan memastikan kompatibilitas dengan perangkat Anda.",153        metadata={"source": "Request"},154    ),155    Document(156        page_content="Request: Permintaan instalasi Adobe Photoshop.\nJawaban: Software tidak tersedia dalam lisensi institusi. Kami menyarankan penggunaan alternatif GIMP, yang telah kami instal dan konfigurasi sesuai kebutuhan Anda.",157        metadata={"source": "Request"},158    ),159    Document(160        page_content="Incident: Email tidak terkirim ke eksternal.\nJawaban: Kami periksa log email server dan menemukan bahwa IP server masuk daftar hitam. Kami sudah lakukan delisting dan konfigurasi ulang DNS.",161        metadata={"source": "Incident"},162    ),163    Document(164        page_content="Incident: Email tidak terkirim ke eksternal.\nJawaban: SMTP relay yang digunakan mengalami gangguan. Kami sudah ubah sementara ke relay backup agar email tetap dapat dikirim.",165        metadata={"source": "Incident"},166    ),167    Document(168        page_content="Aduan: Sistem presensi tidak mencatat kehadiran saya.\nJawaban: Ditemukan bahwa fingerprint scanner tidak tersambung ke jaringan. Kami restart koneksi dan sistem kembali berfungsi.",169        metadata={"source": "Aduan"},170    ),171    Document(172        page_content="Aduan: Sistem presensi tidak mencatat kehadiran saya.\nJawaban: Waktu di sistem berbeda 5 menit dari waktu server. Sinkronisasi waktu berhasil menyelesaikan masalah.",173        metadata={"source": "Aduan"},174    ),175    Document(176        page_content="Request: Tambah user baru ke sistem absensi.\nJawaban: Akun telah ditambahkan atas nama Sdr. Andi dan sudah diberikan akses pada shift pagi dan siang.",177        metadata={"source": "Request"},178    ),179    Document(180        page_content="Request: Tambah user baru ke sistem absensi.\nJawaban: Permintaan ditolak karena tidak ada surat permohonan resmi dari manajer. Mohon untuk melengkapi dokumen pendukung.",181        metadata={"source": "Request"},182    ),183    Document(184        page_content="Incident: Komputer tidak bisa menyala.\nJawaban: PSU mengalami kerusakan. Kami ganti dengan unit cadangan dan komputer dapat dinyalakan kembali.",185        metadata={"source": "Incident"},186    ),187    Document(188        page_content="Incident: Komputer tidak bisa menyala.\nJawaban: Kabel power longgar. Setelah diperbaiki, perangkat langsung menyala normal.",189        metadata={"source": "Incident"},190    ),191    Document(192        page_content="Aduan: Projector tidak bisa digunakan di ruang rapat.\nJawaban: Remote projector rusak. Kami gunakan tombol manual di perangkat untuk menghidupkannya sementara remote pengganti disiapkan.",193        metadata={"source": "Aduan"},194    ),195    Document(196        page_content="Aduan: Projector tidak bisa digunakan di ruang rapat.\nJawaban: Port HDMI longgar. Setelah mengganti kabel HDMI dan port, projector berfungsi kembali.",197        metadata={"source": "Aduan"},198    ),199    Document(200        page_content="Request: Ganti password akun email dinas.\nJawaban: Password telah kami reset dan dikirimkan ke nomor WhatsApp terdaftar. Silakan ubah setelah login.",201        metadata={"source": "Request"},202    ),203    Document(204        page_content="Request: Ganti password akun email dinas.\nJawaban: Reset password gagal karena email belum diverifikasi. Kami telah kirim ulang email verifikasi untuk proses selanjutnya.",205        metadata={"source": "Request"},206    ),207    Document(208        page_content="Incident: Aplikasi HRIS tidak bisa diakses.\nJawaban: Server aplikasi overload. Kami telah scale up resource di cloud dan restart service.",209        metadata={"source": "Incident"},210    ),211    Document(212        page_content="Incident: Aplikasi HRIS tidak bisa diakses.\nJawaban: Sertifikat SSL expired. Sertifikat telah diperbarui dan sistem kembali online.",213        metadata={"source": "Incident"},214    ),215    Document(216        page_content="Request: Instalasi software Zoom untuk keperluan rapat daring.\nJawaban: Zoom telah diinstal dan shortcut disiapkan di desktop Anda. Kami juga sinkronkan dengan kalender Outlook.",217        metadata={"source": "Request"},218    ),219    Document(220        page_content="Request: Instalasi software Zoom untuk keperluan rapat daring.\nJawaban: Permintaan ditunda karena perangkat belum memenuhi spesifikasi minimal. Kami akan bantu upgrade RAM terlebih dahulu.",221        metadata={"source": "Request"},222    ),223    Document(224        page_content="Incident: Suara speaker di ruang auditorium tidak keluar.\nJawaban: Output audio salah pilih di panel mixer. Kami atur kembali dan suara normal.",225        metadata={"source": "Incident"},226    ),227    Document(228        page_content="Incident: Suara speaker di ruang auditorium tidak keluar.\nJawaban: Kabel XLR mengalami short. Kami ganti kabel dan suara kembali terdengar jernih.",229        metadata={"source": "Incident"},230    ),231    Document(232        page_content="Aduan: Tidak bisa mengakses aplikasi mobile learning.\nJawaban: Kami temukan aplikasi belum diperbarui. Setelah update via Play Store, aplikasi berjalan normal.",233        metadata={"source": "Aduan"},234    ),235    Document(236        page_content="Aduan: Tidak bisa mengakses aplikasi mobile learning.\nJawaban: Login Anda diblokir karena ada aktivitas mencurigakan. Akses sudah kami pulihkan setelah validasi identitas.",237        metadata={"source": "Aduan"},238    ),239    Document(240        page_content="Request: Tambahan storage di Google Drive institusi.\nJawaban: Kami ajukan ke Google Admin dan menambah kapasitas sebesar 50GB sesuai permintaan.",241        metadata={"source": "Request"},242    ),243    Document(244        page_content="Request: Tambahan storage di Google Drive institusi.\nJawaban: Kuota maksimal telah tercapai. Kami arahkan untuk menyimpan file besar di server lokal.",245        metadata={"source": "Request"},246    ),247]248 249documents += [250    document_1,251    document_2,252    document_3,253    document_4,254    document_5,255    document_6,256    document_7,257    document_8,258    document_9,259    document_10,260]261 262uuids = [str(uuid4()) for _ in range(len(documents))]263docs = documents264 265 266sparse_embeddings = FastEmbedSparse(model_name="Qdrant/bm25")267embeddings = FastEmbedEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")268 269client = QdrantClient(path="tmp/langchain_qdrant")270 271# Create a collection with sparse vectors272client.create_collection(273    collection_name="my_documents",274    # vectors_config={"dense": VectorParams(size=3072, distance=Distance.COSINE)},275    vectors_config={"dense": VectorParams(size=384, distance=Distance.COSINE)},276    sparse_vectors_config={277        "sparse": SparseVectorParams(index=models.SparseIndexParams(on_disk=False))278    },279)280 281qdrant = QdrantVectorStore(282    client=client,283    collection_name="my_documents",284    embedding=embeddings,285    sparse_embedding=sparse_embeddings,286    # retrieval_mode=RetrievalMode.SPARSE,287    # retrieval_mode=RetrievalMode.HYBRID,288    retrieval_mode=RetrievalMode.DENSE,289    vector_name="dense",290    sparse_vector_name="sparse",291    292)293 294qdrant.add_documents(documents=documents, ids=uuids)295 296app = FastAPI()297 298@app.get("/get_data")299def get_data(query: str):300    # query = "How much money did the robbers steal?"301    # found_docs = [x.model_dump() for x in qdrant.similarity_search(query)]302    found_docs = [x[0].model_dump() for x in qdrant.similarity_search_with_score(query, k=10, score_threshold=0.25)]303 304    for doc in found_docs:305        doc.pop("id", None)306        # key = 307        for k in list(doc["metadata"].keys()):308            if k[0] == "_":309                doc["metadata"].pop(k)310 311    return {312        "data": found_docs313    }314 315 316@app.post("/add_data")317def add_data(data: Data):318    global qdrant319    if isinstance(data.items, dict):320        qdrant.add_documents(documents=[Document(**data.items)])321    else:322        qdrant.add_documents(documents=[Document(**x.items) for x in data])323 324    return {"message":"Create data successfully!", "status_code":201}325 326 327 328@app.get("/")329def greet_json():330    return {"Hello": "World!"}331