03. Memanfaatkan berbagai modul RAG berdasarkan fungsinya
Menjelajahi RAG di LangChain
Pemrosesan Pertanyaan Pada tahap pemrosesan pertanyaan, pertanyaan pengguna diterima dan diproses, serta data yang relevan diambil. Komponen-komponen berikut diperlukan untuk proses ini:
Menghubungkan ke Sumber Data: Untuk menemukan jawaban dari pertanyaan, berbagai sumber data teks harus dihubungkan. LangChain membantu mengatur koneksi dengan berbagai sumber data secara mudah.
Pengindeksan dan Pencarian Data: Untuk menemukan informasi yang relevan secara efisien dari sumber data, data harus diindeks. LangChain mengotomatisasi proses pengindeksan dan menyediakan alat untuk mencari data terkait dengan pertanyaan pengguna.
Pembuatan Jawaban Setelah menemukan data yang relevan, jawaban harus dihasilkan berdasarkan data tersebut. Komponen-komponen berikut penting pada tahap ini:
Model Pembuatan Jawaban: LangChain menyediakan fungsionalitas untuk menghasilkan jawaban dari data yang ditemukan menggunakan model pemrosesan bahasa alami (NLP) canggih. Model-model ini menerima pertanyaan pengguna dan data yang ditemukan sebagai input untuk menghasilkan jawaban yang sesuai.
Arsitektur
Seperti yang dijelaskan dalam pengenalan Q&A, kita akan membuat aplikasi RAG yang khas. Ini memiliki dua komponen utama:
Indexing: Sebuah pipeline yang mengumpulkan dan mengindeks data dari sumber. Proses ini biasanya terjadi secara offline.
Retrieval and Generation: RAG chain yang sebenarnya, yang menerima query dari pengguna saat runtime, mengambil data relevan dari index, kemudian mengirimkan data tersebut ke model.
Urutan keseluruhan dari RAW data hingga menerima jawaban adalah sebagai berikut.
Pengindeksan (Indexing)
Load: Pertama-tama, data harus dimuat. Untuk itu, kita akan menggunakan DocumentLoaders.
Split: Text splitters membagi Documents besar menjadi potongan-potongan kecil. Ini berguna untuk mengindeks data dan mengirimkannya ke model, karena potongan besar sulit untuk dicari dan tidak sesuai dengan jendela konteks model yang terbatas.
Store: Kita memerlukan tempat untuk menyimpan dan mengindeks potongan-potongan ini agar bisa dicari di kemudian hari. Hal ini sering dilakukan menggunakan VectorStore dan model Embeddings.
Retrieval and Generation
Retrieval: Ketika input pengguna diberikan, Retriever digunakan untuk mencari potongan-potongan relevan dalam penyimpanan.
Generation: ChatModel / LLM menghasilkan jawaban menggunakan prompt yang mencakup pertanyaan dan data yang telah ditemukan.
Dokumen yang digunakan untuk praktik
Penulis: Misnawati Misnawati
Tautan: https://badanpenerbit.org/index.php/mateandrau/article/view/221
Nama File: ChatGPT: Keuntungan, Risiko, Dan Penggunaan Bijak Dalam Era Kecerdasan Buatan.
Silakan salin file yang telah diunduh ke folder data untuk praktik.
Setting
Mengatur API KEY
Aplikasi yang dibangun dengan LangChain sering kali melibatkan beberapa panggilan LLM di berbagai tahap. Saat aplikasi ini menjadi semakin kompleks, kemampuan untuk menyelidiki dengan tepat apa yang terjadi di dalam chain atau agen menjadi sangat penting. Cara terbaik untuk melakukannya adalah dengan menggunakan LangSmith.
Meskipun LangSmith tidak wajib, itu sangat berguna. Jika Anda ingin menggunakan LangSmith, Anda harus mendaftar menggunakan tautan di atas dan mengatur environment variable untuk memulai pencatatan dan pelacakan (logging and tracking).
Melihat lebih detail setiap modul
Berikut adalah contoh yang menggunakan model RAG dasar yang telah dibahas sebelumnya.
Pada setiap tahap, berbagai opsi dapat dikonfigurasi atau teknik baru dapat diterapkan.
Langkah 1: Muat Dokumen (Load Document)
Tautan Dokumentasi Resmi - Document Loaders: https://python.langchain.com/v0.1/docs/modules/data_connection/document_loaders/
Halaman Web
WebBaseLoader menggunakan bs4.SoupStrainer untuk mem-parsing hanya bagian yang diperlukan dari halaman web yang ditentukan.
[Catatan]
bs4.SoupStrainer memungkinkan Anda untuk dengan mudah mengambil elemen yang diinginkan dari web. (Contoh)
Berikut adalah artikel berita BBC. Jika Anda ingin mencobanya dengan artikel yang ditulis dalam bahasa Inggris.
PDF
CSV
CSV mengambil data menggunakan nomor baris, bukan nomor halaman.
File TXT
Memuat semua file di dalam folder
Berikut adalah contoh memuat semua file .txt di dalam folder.
Berikut adalah contoh memuat semua file .pdf di dalam folder
Python
Berikut ini adalah contoh pemuatan file .py.
Langkah 2: Membagi Dokumen (Split Documents)
CharacterTextSplitter
Ini adalah metode paling sederhana. Metode ini membagi teks berdasarkan karakter (nilai default adalah "\n\n"), dan panjang setiap potongan diukur berdasarkan jumlah karakter.
Bagaimana teks dibagi: Berdasarkan unit karakter tunggal.
Bagaimana ukuran potongan diukur: Panjang karakter.
Contoh visualisasi: https://chunkviz.up.railway.app/
Kelas CharacterTextSplitter menyediakan fungsi untuk membagi teks menjadi potongan-potongan dengan ukuran tertentu.
Parameter separator menentukan string yang digunakan untuk memisahkan potongan; dalam kasus ini, digunakan dua baris baru ("\n\n").
chunk_size menentukan panjang maksimum setiap potongan.
chunk_overlap menentukan jumlah karakter yang tumpang tindih antara potongan yang berdekatan.
length_function menentukan fungsi yang digunakan untuk menghitung panjang potongan; secara default, fungsi
lendigunakan untuk mengembalikan panjang string.is_separator_regex adalah nilai boolean yang menentukan apakah separator diinterpretasikan sebagai ekspresi reguler.
Fungsi ini menggunakan metode create_documents dari objek text_splitter untuk membagi teks yang diberikan (state_of_the_union) menjadi beberapa dokumen dan menyimpan hasilnya dalam variabel texts. Setelah itu, ia menampilkan dokumen pertama dari texts. Proses ini dapat dianggap sebagai langkah awal dalam memproses dan menganalisis data teks, dan sangat berguna untuk membagi data teks besar menjadi unit-unit yang lebih mudah dikelola.
RecursiveTextSplitter
Pemisah teks ini direkomendasikan untuk teks biasa.
Bagaimana teks dibagi: daftar pemisah (list of separators)
Bagaimana ukuran potongan diukur: panjang karakter (len of characters)
Kelas RecursiveCharacterTextSplitter menyediakan fungsi untuk membagi teks secara rekursif. Kelas ini menerima parameter seperti chunk_size untuk menentukan ukuran potongan, chunk_overlap untuk menentukan tumpang tindih antara potongan yang berdekatan, length_function untuk menghitung panjang potongan, dan is_separator_regex untuk menunjukkan apakah pemisah adalah ekspresi reguler. Dalam contoh ini, ukuran potongan diatur menjadi 100, ukuran tumpang tindih menjadi 20, fungsi perhitungan panjang menggunakan len, dan is_separator_regex diatur ke False untuk menunjukkan bahwa pemisah bukanlah ekspresi reguler.
Daftar separator yang ditentukan dicoba secara berurutan untuk membagi dokumen yang diberikan. Pemisahan dilakukan secara berurutan hingga potongan teks menjadi cukup kecil. Daftar default adalah ["\n\n", "\n", " ", ""]. Ini umumnya memiliki efek menjaga semua paragraf (dan kalimat, kata) tetap panjang, yang tampak sebagai potongan teks yang paling terkait secara semantik
Semantic Similarity
Membagi teks berdasarkan kesamaan semantik.
Pada tingkat tinggi, teks pertama-tama dibagi menjadi kalimat, kemudian dikelompokkan menjadi tiga kalimat, dan akhirnya, kalimat yang mirip digabungkan di ruang embedding.
Langkah 3: Embedding
Referensi: https://python.langchain.com/docs/integrations/text_embedding
Embedding Berbayar (OpenAI)
Berikut ini adalah daftar model Embedding yang didukung oleh OpenAI.
Nilai defaultnya adalah text-embedding-ada-002.

Embedding Berbasis Open Source Gratis
Langkah 4: Membuat Vectorstore
Langkah 5: Membuat Retriever
Retriever adalah antarmuka yang mengembalikan dokumen ketika diberikan kueri yang tidak terstruktur.
Retriever hanya mengembalikan (atau mengambil) dokumen tanpa perlu menyimpannya.
Dokumentasi Resmi: https://python.langchain.com/v0.1/docs/modules/data_connection/retrievers/
Retriever dibuat dengan memanggil as_retriever() pada VectorStore yang telah dihasilkan.
Pencarian Berbasis Kemiripan (Similarity-based Search)
Standar yang digunakan adalah similarity yang merupakan cosine similarity.
similarity_score_threshold dalam pencarian berbasis kemiripan hanya mengembalikan hasil yang memiliki skor sama dengan atau lebih besar dari ambang batas.
Melakukan pencarian menggunakan maximum marginal search result
Membuat Kueri yang berbeda
Ensemble Retriever
Langkah 6: Membuat Prompt
Prompt engineering memainkan peran penting dalam menghasilkan hasil yang diinginkan berdasarkan data (konteks) yang diberikan.
[TIP1]
Jika informasi penting hilang dari hasil yang dihasilkan oleh retriever, Anda perlu mengubah logika retriever.
Jika hasil yang dihasilkan oleh retriever mengandung banyak informasi, tetapi LLM gagal menemukan informasi penting atau tidak menampilkannya dalam format yang diinginkan, Anda perlu menyesuaikan prompt.
[TIP2]
Hub LangSmith memiliki banyak prompt yang telah diverifikasi.
Dengan memanfaatkan atau sedikit memodifikasi prompt yang telah diverifikasi ini, Anda dapat menghemat waktu dan biaya.
Langkah 7: Membuat model bahasa besar ( Large Language Model(LLM))
Pilih salah satu model OpenAI
gpt-3.5-turbo: Model GPT-3.5-turbo OpenAI
gpt-4-turbo-preview: Model GPT-4-turbo-preview OpenAI
Anda dapat menemukan struktur harga yang terperinci di daftar model / tabel harga API OpenAI.
Anda dapat memeriksa penggunaan token dengan cara berikut
Anda dapat dengan mudah mengunduh dan menggunakan model open-source yang tersedia di HuggingFace.
Anda dapat melihat leaderboard open-source yang meningkatkan performa setiap hari pada leaderboard di bawah ini.
Bereksperimen dengan template RAG
Dokumen: ../data/ChatGPT: Keuntungan, Risiko, Dan Penggunaan Bijak Dalam Era Kecerdasan Buatan.pdf
Dokumen: ../data/ChatGPT: Keuntungan, Risiko, Dan Penggunaan Bijak Dalam Era Kecerdasan Buatan.pdf
Dokumen: ../data/ChatGPT: Keuntungan, Risiko, Dan Penggunaan Bijak Dalam Era Kecerdasan Buatan.pdf
Last updated