Close Menu
    Trending
    • Why PDF Extraction Still Feels LikeHack
    • GenAI Will Fuel People’s Jobs, Not Replace Them. Here’s Why
    • Millions of websites to get ‘game-changing’ AI bot blocker
    • I Worked Through Labor, My Wedding and Burnout — For What?
    • Cloudflare will now block AI bots from crawling its clients’ websites by default
    • 🚗 Predicting Car Purchase Amounts with Neural Networks in Keras (with Code & Dataset) | by Smruti Ranjan Nayak | Jul, 2025
    • Futurwise: Unlock 25% Off Futurwise Today
    • 3D Printer Breaks Kickstarter Record, Raises Over $46M
    AIBS News
    • Home
    • Artificial Intelligence
    • Machine Learning
    • AI Technology
    • Data Science
    • More
      • Technology
      • Business
    AIBS News
    Home»Machine Learning»Membuat Policy Assistant System dengan Sentence Transformer dan Chroma DB | by Nevan Rayyandithya | Apr, 2025
    Machine Learning

    Membuat Policy Assistant System dengan Sentence Transformer dan Chroma DB | by Nevan Rayyandithya | Apr, 2025

    Team_AIBS NewsBy Team_AIBS NewsApril 28, 2025No Comments5 Mins Read
    Share Facebook Twitter Pinterest LinkedIn Tumblr Reddit Telegram Email
    Share
    Facebook Twitter LinkedIn Pinterest Email


    Pemrosesan per Halaman (Skenario 1)

    Inisialisasi fungsi penyimpanan dibuat berbeda sesuai dengan skenarionya masing-masing. Berikut merupakan penyimpanan information berdasarkan per halaman:

    def store_page_in_chromadb(textual content, doc_id, page_num, total_pages):
    strive:
    if not textual content.strip():
    print(f"Skipping {doc_id} - Web page {page_num + 1}: No legitimate textual content extracted.")
    return

    page_id = f"{doc_id}_page_{page_num + 1}"

    # Pembuatan db pada Chroma
    assortment.upsert(
    ids=[page_id], # Distinctive ID per halaman
    paperwork=[text], # Information teks mentah
    metadatas=[{"source": "pdf", "page": page_num + 1}] # Metadata
    )
    print(f"Textual content from {doc_id} - Web page {page_num + 1} saved in ChromaDB!")

    besides Exception as e:
    print(f"Error storing web page {page_num + 1} in ChromaDB: {e}")

    ID halaman akan dibuat format {doc_id}_page_{page_num + 1} karena jumlah halaman dokumen tidak mungkin dimulai dari 0. Walaupun hanya sekedar sampul dokumen, tetap hitungannya dimulai dari 1. Metode pengunggahan information menggunakan perintah upsert() agar jika ada perubahan pada information dengan nama atau ID yang sama, tidak terjadi penyimpanan duplikat.

    # Pemrosesan PDF
    def process_pdf(pdf_path):
    doc_id = pdf_path.cut up("/")[-1].cut up(".")[0]
    strive:
    doc = fitz.open(pdf_path)
    total_pages = len(doc)

    with pdfplumber.open(pdf_path) as pdf:
    for page_num in vary(total_pages):
    full_page_text = extract_text_and_tables(doc, pdf.pages[page_num], page_num)

    store_page_in_chromadb(full_page_text, doc_id, page_num, total_pages)

    print(f"Whole paperwork in ChromaDB: {assortment.depend()}")
    print(f"Processed {pdf_path} efficiently!n")

    besides Exception as e:
    print(f"Error processing {pdf_path}: {e}")

    Pemrosesan dokumen PDF akan diambil terlebih dahulu alamat di mana dokumen tersebut berada. Misalnya memiliki dokumen pada C:/Paperwork/Folder_A1/A1.pdf, alamat akan dipisah berdasarkan tanda /, dan diambil bagian yang paling belakang sehingga didapatkan A1.pdf. Alamat yang sudah didapatkan dipisah lagi berdasarkan tanda . dan akhirnya didapatkan A1 sebagai nama ID untuk disimpan dalam Chroma. Dokumen akan dipisah setiap halamannya dan disimpan dalam Chroma.

    Pemrosesan per Bagian Judul (Skenario 2)

    Metode penyimpanan pada skenario ini menyerupai penyimpanan pada skenario 1. Yang membedakan hanya nama ID beserta pembagian isi dari dokumen PDF.

    def store_page_in_chromadb(textual content, doc_id, metadata):
    strive:
    if not textual content.strip():
    print(f"Skipping {doc_id}: No legitimate textual content extracted.")
    return

    assortment.upsert(
    ids=[doc_id],
    paperwork=[text],
    metadatas=[metadata]
    )
    print(f"Textual content from {doc_id} saved in ChromaDB!")

    besides Exception as e:
    print(f"Error storing {doc_id} in ChromaDB: {e}")

    Pada skenario 2, terdapat sebuah fungsi khusus berupa manual_sections(). Fungsi ini ditujukan untuk membuat batasan halaman per judul secara guide supaya respon memiliki hasil akurasi relevansi yang baik dengan pertanyaan yang diberikan nantinya.

    # Definisikan part secara guide untuk setiap PDF
    def manual_sections():
    return {
    "Doc1": {
    "COVER": (1, 1),
    "LEMBAR PENGESAHAN DOKUMEN": (2, 2),
    "DAFTAR ISI": (3, 3),
    "KATA PENGANTAR": (4, 4),
    "DAFTAR ISTILAH": (5, 5),
    "PENDAHULUAN": (6, 7),
    "Isi": (8, 10)
    "LAMPIRAN": (11, 12)
    },
    "Doc2": {
    "COVER": (1, 1),
    "LEMBAR PENGESAHAN DOKUMEN": (2, 2),
    "DAFTAR ISI": (3, 3),
    "KATA PENGANTAR": (4, 4),
    "DAFTAR ISTILAH": (5, 5),
    "PENDAHULUAN": (6, 7),
    "Isi": (8, 10)
    "LAMPIRAN": (11, 12)
    }
    }

    Untuk penamaan dokumen, judul isi, dan halaman dapat disesuaikan dengan dokumen PDF yang digunakan. Fungsi manual_sections() juga digunakan pada skenario 3. Untuk pemrosesan dokumen PDF pada skenario 2 ini memiliki konfigurasi yang sedikit berbeda dari skenario pertama. Berikut merupakan inisialisasi process_pdf() pada skenario 2:

    # Pemrosesan file dalam folder
    def process_pdf(pdf_path):
    original_filename = os.path.splitext(os.path.basename(pdf_path))[0]
    strive:
    doc = fitz.open(pdf_path)
    sections = manual_sections().get(original_filename, {})

    with pdfplumber.open(pdf_path) as pdf:
    if sections:
    for section_name, (start_page, end_page) in sections.objects():
    combined_text = ""
    for page_num in vary(start_page - 1, end_page):
    full_page_text = extract_text_and_tables(doc, pdf.pages[page_num], page_num)
    combined_text += full_page_text + "n"
    if start_page == end_page:
    page_id = f"{original_filename}_{section_name}_page_{start_page}"
    metadata = {"supply": "pdf", "part": section_name, "page_range": f"Web page {start_page}"}
    store_page_in_chromadb(full_page_text.strip(), page_id, metadata)
    else:
    page_id = f"{original_filename}_{section_name}_page_{start_page}_to_{end_page}"
    metadata = {"supply": "pdf", "part": section_name, "page_range": f"Web page {start_page} to {end_page}"}
    store_page_in_chromadb(combined_text.strip(), page_id, metadata)

    print(f"Whole paperwork in ChromaDB: {assortment.depend()}")
    print(f"Processed {pdf_path} efficiently!n")

    besides Exception as e:
    print(f"Error processing {pdf_path}: {e}")

    Pemrosesan pada skenario 2 ini menyimpan dokumen dengan format {nama}_{judul bagian}_{halaman}. Jika halaman awal sama dengan halaman akhir, letak halaman hanya akan dicetak halaman mulainya. Misal daftar isi terletak pada halaman 3 dengan format pada manual_sections() berbentuk ”DAFTAR ISI”: (3, 3), maka nama yang akan disimpan pada Chroma berupa Doc1_section_DAFTAR ISI_page_3. Jika tidak, akan mencetak Doc1_section_DAFTAR ISI_page_3_to_4.

    Contoh Warning Output pada pemrosesan PDF

    Pemrosesan Bagian Judul dengan Ringkasan (Skenario 3)

    Metode penyimpanan pada skenario 3 ini memerlukan API OpenAI sebagai pembuat ringkasan dari isi dokumen yang kita berikan. Sayangnya, dibutuhkan untuk melakukan pembayaran untuk mendapatkan token API dari OpenAI. Untuk membuat token, pergi ke halaman Sign Up untuk membuat akun terlebih dahulu atau log in. Nantinya Anda akan diarahkan ke halaman dashboard dan Klik tombol “Create new secret key” untuk membuat token undertaking Anda.

    Tampilan Halaman Pembuatan Token API pada OpenAI

    Untuk pemilihan mannequin yang sesuai dengan kebutuhan undertaking, segala kelebihan beserta kemampuan kinerja mannequin dan fashions pricing dapat dilihat pada laman OpenAI documentaries bagian Models. Untuk inisialisasi OpenAI consumer, dapat dilihat pada fungsi di bawah berikut:

    consumer = openai.OpenAI(api_key="token_API_anda")

    def summarize_text(textual content):

    summary_prompt = f"Ringkas informasi berikut secara singkat dan jelas:nn{textual content[:3000]}" # Mencegah token melewati batas generate

    response = consumer.chat.completions.create(
    mannequin="gpt-4.1-mini",
    messages=[{"role": "system", "content": "Anda adalah asisten yang ahli dalam merangkum teks."},
    {"role": "user", "content": summary_prompt}],
    max_tokens=200 # Batas panjang response
    )

    return response.decisions[0].message.content material

    Consumer OpenAI akan membuat ringkasan dan menyertakan sebagian teks asli dari isi dokumen hingga 3000 karakter pertama sesuai perintah yang diberikan pada summary_prompt. Batas ditetapkan pada 3000 karakter supaya tidak melebihi batas output token maksimal dan mengurangi harga pricing per kata. Panjang ringkasan yang akan dihasilkan juga dibatasi mencapai 200 token. Hasil yang paling relevan (alternative[0]) akan diberikan kepada LLM untuk disimpan dalam Chroma.

    def store_page_in_chromadb(textual content, doc_id, metadata):
    strive:
    if not textual content.strip():
    print(f"Skipping {doc_id}: No legitimate textual content extracted.")
    return

    abstract = summarize_text(textual content)
    combined_text = f"nRingkasan:n{abstract}nnTeks Lengkap:n{textual content}"

    metadata["summary"] = abstract
    metadata["original_text"] = textual content
    metadata["combined_text"] = combined_text

    assortment.upsert(
    ids=[doc_id],
    paperwork=[combined_text],
    metadatas=[metadata]
    )
    print(f"Saved {doc_id} in ChromaDB!")

    besides Exception as e:
    print(f"Error storing {doc_id}: {e}")

    Metode penyimpanan information pada Chroma di skenario 3 ini menyatukan teks asli dengan ringkasan di dalam metadata yang sama (combined_text). Information yang telah disatukan itulah yang disimpan dalam Chroma. Untuk cara pemrosesan dokumen PDF (process_pdf(pdf_path)), metodenya sama dengan pemrosesan dokumen PDF yang ada pada skenario 2.



    Source link

    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    Previous ArticleHow Armenia is trying to build a Silicon Valley in the Caucasus
    Next Article I Stopped Chasing Time. Managing Energy Changed Everything
    Team_AIBS News
    • Website

    Related Posts

    Machine Learning

    Why PDF Extraction Still Feels LikeHack

    July 1, 2025
    Machine Learning

    🚗 Predicting Car Purchase Amounts with Neural Networks in Keras (with Code & Dataset) | by Smruti Ranjan Nayak | Jul, 2025

    July 1, 2025
    Machine Learning

    Reinforcement Learning in the Age of Modern AI | by @pramodchandrayan | Jul, 2025

    July 1, 2025
    Add A Comment
    Leave A Reply Cancel Reply

    Top Posts

    Why PDF Extraction Still Feels LikeHack

    July 1, 2025

    I Tried Buying a Car Through Amazon: Here Are the Pros, Cons

    December 10, 2024

    Amazon and eBay to pay ‘fair share’ for e-waste recycling

    December 10, 2024

    Artificial Intelligence Concerns & Predictions For 2025

    December 10, 2024

    Barbara Corcoran: Entrepreneurs Must ‘Embrace Change’

    December 10, 2024
    Categories
    • AI Technology
    • Artificial Intelligence
    • Business
    • Data Science
    • Machine Learning
    • Technology
    Most Popular

    9 Python Myths Beginners Must Stop Believing

    April 5, 2025

    News Bytes 20250505: Japan’s Rapidus 2nm Chips, $7T Data Center Forecast, NVIDIA and Trade Restrictions, ‘Godfather of AI’ Issues Warning

    May 5, 2025

    Meet a Swift Student Challenge Winner Attending Apple’s WWDC

    June 10, 2025
    Our Picks

    Why PDF Extraction Still Feels LikeHack

    July 1, 2025

    GenAI Will Fuel People’s Jobs, Not Replace Them. Here’s Why

    July 1, 2025

    Millions of websites to get ‘game-changing’ AI bot blocker

    July 1, 2025
    Categories
    • AI Technology
    • Artificial Intelligence
    • Business
    • Data Science
    • Machine Learning
    • Technology
    • Privacy Policy
    • Disclaimer
    • Terms and Conditions
    • About us
    • Contact us
    Copyright © 2024 Aibsnews.comAll Rights Reserved.

    Type above and press Enter to search. Press Esc to cancel.