Salah satu tantangan yang dihadapi oleh sistem pencarian adalah ketika data dimasukkan ke dalam sistem, tidak diketahui sebelumnya kueri spesifik mana yang akan ditangani.
Ini berarti bahwa informasi yang paling relevan dengan kueri mungkin terkubur dalam dokumen yang berisi sejumlah besar teks yang tidak relevan.
Mengirimkan dokumen lengkap ini ke aplikasi dapat menyebabkan panggilan LLM yang lebih mahal dan respons yang lebih rendah.
ContextualCompressionRetriever dirancang untuk mengatasi masalah ini.
Idenya sederhana. Alih-alih langsung mengembalikan dokumen yang diambil sebagaimana adanya, Anda dapat menggunakan konteks kueri yang diberikan untuk mengompresi dokumen sehingga hanya informasi yang relevan yang dikembalikan.
“Mengompresi” di sini berarti mengompresi konten dokumen individual dan menyaring dokumen secara keseluruhan.
Untuk menggunakan Retriever Kompresi Kontekstual, Anda memerlukan yang berikut ini
Base Retriever
Document Compressor
ContextualCompressionRetriever meneruskan kueri ke base retriever, yang mendapatkan dokumen awal dan meneruskannya melalui document compressor.
Kompresi Dokumen mengambil daftar dokumen dan mengurangi daftar tersebut dengan mengurangi konten dokumen atau menghapus seluruh dokumen.
Fungsi pretty_print_docs adalah fungsi pembantu yang mencetak daftar dokumen dengan indah.
# Helper function to print documents nicelydefpretty_print_docs(docs):print(f"\n{'-'*100}\n".join( [f"Document {i+1}:\n\n"+ d.page_content for i, d inenumerate(docs)] ) )
Pengaturan Dasar Retriever
Mari kita mulai dengan menginisialisasi retriever penyimpanan vektor sederhana dan menyimpan dokumen teks dalam bentuk potongan-potongan.
Ketika kita mengajukan pertanyaan contoh kita, kita dapat melihat bahwa retriever mengembalikan satu atau dua dokumen yang relevan dan beberapa dokumen yang tidak relevan.
Bahkan dokumen yang relevan mengandung banyak informasi yang tidak relevan.
from langchain_community.document_loaders import TextLoaderfrom langchain_community.vectorstores import FAISSfrom langchain_openai import OpenAIEmbeddingsfrom langchain_text_splitters import CharacterTextSplitter# Menggunakan TextLoader untuk memuat dokumen dari file "appendix-keywords.txt".loader =TextLoader("./data/appendix-keywords.txt")# Membagi dokumen menjadi bagian-bagian dengan ukuran chunk 300 karakter dan tidak ada overlapping.text_splitter =CharacterTextSplitter(chunk_size=300, chunk_overlap=0)texts = loader.load_and_split(text_splitter)# Menggunakan OpenAIEmbeddings untuk membuat basis data vektor FAISS dan mengkonversi menjadi search engine.retriever = FAISS.from_documents(texts, OpenAIEmbeddings()).as_retriever()# Definisi query dan mencari dokumen terkait.docs = retriever.get_relevant_documents("Apa itu Semantic Search?")# Mencetak hasil pencarian dengan cara yang lebih rapih.pretty_print_docs(docs)
Document 1:
Pencarian Semantik
----------------------------------------------------------------------------------------------------
Document 2:
Definisi: Pencarian semantik adalah metode pencarian yang melampaui pencocokan kata kunci sederhana untuk memahami makna dari kueri pengguna dan mengembalikan hasil yang relevan.
Contoh: Jika seorang pengguna mencari "planet tata surya", sistem akan mengembalikan informasi tentang planet terkait, seperti "Jupiter", "Mars", dll.
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Algoritma Pencarian, Penambangan Data
----------------------------------------------------------------------------------------------------
Document 3:
Definisi: Word2Vec adalah teknik pemrosesan bahasa alami yang memetakan kata-kata ke dalam ruang vektor untuk merepresentasikan hubungan semantik antar kata. Teknik ini menghasilkan vektor berdasarkan kesamaan konteks kata.
Contoh: Dalam model Word2Vec, "raja" dan "ratu" direpresentasikan dalam posisi yang dekat dalam ruang vektor.
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Embedding, Kesamaan Semantik
----------------------------------------------------------------------------------------------------
Document 4:
Definisi: Crawling adalah proses mengunjungi halaman web secara otomatis untuk mengumpulkan data. Ini sering digunakan dalam optimasi mesin pencari atau analisis data.
Contoh: Mesin pencari Google mengunjungi situs web di internet untuk mengumpulkan konten dan membuat indeks, yang dikenal sebagai crawling.
Kata Kunci Terkait: Pengumpulan Data, Web Scraping, Mesin Pencari
ContextualCompression
ContextualCompressionRetriever adalah DocumentCompressor yang kita buat dengan menggunakan LLMChainExtractor dan diterapkan pada retriever.
from langchain_teddynote.document_compressors import LLMChainExtractorfrom langchain.retrievers import ContextualCompressionRetriever# from langchain.retrievers.document_compressors import LLMChainExtractorfrom langchain_openai import ChatOpenAIllm =ChatOpenAI(temperature=0, model="gpt-4o-mini")# Inisialisasi model bahasa OpenAI# Membuat kompresor dokumen menggunakan LLMcompressor = LLMChainExtractor.from_llm(llm)compression_retriever =ContextualCompressionRetriever(# Membuat retriever kompresi kontekstual menggunakan kompresor dokumen dan retriever base_compressor=compressor, base_retriever=retriever,)pretty_print_docs(retriever.invoke("Jelaskan tentang Semantic Search."))print("=========================================================")print("============== Setelah penerapan LLMChainExtractor ==================")compressed_docs = ( compression_retriever.invoke( # Mencari dokumen yang relevan menggunakan retriever kompresi kontekstual"Jelaskan tentang Semantic Search." ))pretty_print_docs(compressed_docs)# Menampilkan dokumen yang ditemukan secara terformat
Document 1:
Pencarian Semantik
----------------------------------------------------------------------------------------------------
Document 2:
Definisi: Pencarian semantik adalah metode pencarian yang melampaui pencocokan kata kunci sederhana untuk memahami makna dari kueri pengguna dan mengembalikan hasil yang relevan.
Contoh: Jika seorang pengguna mencari "planet tata surya", sistem akan mengembalikan informasi tentang planet terkait, seperti "Jupiter", "Mars", dll.
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Algoritma Pencarian, Penambangan Data
----------------------------------------------------------------------------------------------------
Document 3:
Definisi: Word2Vec adalah teknik pemrosesan bahasa alami yang memetakan kata-kata ke dalam ruang vektor untuk merepresentasikan hubungan semantik antar kata. Teknik ini menghasilkan vektor berdasarkan kesamaan konteks kata.
Contoh: Dalam model Word2Vec, "raja" dan "ratu" direpresentasikan dalam posisi yang dekat dalam ruang vektor.
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Embedding, Kesamaan Semantik
----------------------------------------------------------------------------------------------------
Document 4:
Definisi: SQL (Structured Query Language) adalah bahasa pemrograman yang digunakan untuk mengelola data di dalam basis data. Ini memungkinkan berbagai operasi seperti pencarian, modifikasi, penyisipan, dan penghapusan data.
Contoh: SELECT * FROM users WHERE age > 18; akan menampilkan informasi pengguna yang berusia lebih dari 18 tahun.
Kata Kunci Terkait: Basis Data, Query, Manajemen Data
=========================================================
============== Setelah penerapan LLMChainExtractor ==================
Document 1:
Pencarian Semantik
----------------------------------------------------------------------------------------------------
Document 2:
Definisi: Pencarian semantik adalah metode pencarian yang melampaui pencocokan kata kunci sederhana untuk memahami makna dari kueri pengguna dan mengembalikan hasil yang relevan.
Memfilter dokumen dengan LLM
LLMChainFilter
LLMChainFilter adalah kompresor yang lebih sederhana namun lebih kuat yang menggunakan rantai LLM untuk menentukan dokumen mana yang akan disaring dan mana yang akan dikembalikan dari dokumen yang awalnya diambil.
Filter ini secara selektif mengembalikan dokumen tanpa mengubah (mengompresi) isinya.
from langchain_altero.document_compressors import LLMChainFilter# Membuat objek LLMChainFilter menggunakan LLM_filter = LLMChainFilter.from_llm(llm)compression_retriever =ContextualCompressionRetriever(# Membuat objek ContextualCompressionRetriever menggunakan LLMChainFilter dan retriever base_compressor=_filter, base_retriever=retriever,)compressed_docs = compression_retriever.invoke(# Pertanyaan atau kueri"Jelaskan tentang Semantic Search.")pretty_print_docs(compressed_docs)# Menampilkan dokumen yang terkompresi secara terformat
Document 1:
Pencarian Semantik
----------------------------------------------------------------------------------------------------
Document 2:
Definisi: Pencarian semantik adalah metode pencarian yang melampaui pencocokan kata kunci sederhana untuk memahami makna dari kueri pengguna dan mengembalikan hasil yang relevan.
Contoh: Jika seorang pengguna mencari "planet tata surya", sistem akan mengembalikan informasi tentang planet terkait, seperti "Jupiter", "Mars", dll.
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Algoritma Pencarian, Penambangan Data
Penyaring sematan (EmbeddingsFilter)
Membuat panggilan LLM tambahan untuk setiap dokumen yang diambil adalah mahal dan lambat.
EmbeddingsFilter menyediakan opsi yang lebih murah dan lebih cepat dengan menyematkan dokumen dan kueri dan hanya mengembalikan dokumen dengan sematan yang cukup mirip dengan kueri.
Hal ini menghemat biaya dan waktu komputasi dengan tetap menjaga relevansi hasil pencarian.
Proses pengompresan dan pengambilan dokumen yang relevan menggunakan EmbeddingsFilter dan ContextualCompressionRetriever.
Gunakan EmbeddingsFilter untuk memfilter dokumen yang berada di atas ambang batas kemiripan yang ditentukan (0,86).
from langchain.retrievers.document_compressors import EmbeddingsFilterfrom langchain_openai import OpenAIEmbeddingsembeddings =OpenAIEmbeddings()# Membuat objek EmbeddingsFilter dengan ambang batas kemiripan 0.76.embeddings_filter =EmbeddingsFilter( embeddings=embeddings, similarity_threshold=0.86)# Membuat objek ContextualCompressionRetriever dengan menggunakan embeddings_filter sebagai kompresor dasar, dan retriever sebagai pencari dasar.
compression_retriever =ContextualCompressionRetriever( base_compressor=embeddings_filter, base_retriever=retriever)# Menggunakan objek ContextualCompressionRetriever untuk mencari dokumen terkait.compressed_docs = compression_retriever.get_relevant_documents(# Query"Ceritakan tentang Semantic Search.")# Mencetak dokumen yang telah dikompres dengan tampilan yang indah.pretty_print_docs(compressed_docs)
Document 1:
Pencarian Semantik
----------------------------------------------------------------------------------------------------
Document 2:
Definisi: Pencarian semantik adalah metode pencarian yang melampaui pencocokan kata kunci sederhana untuk memahami makna dari kueri pengguna dan mengembalikan hasil yang relevan.
Contoh: Jika seorang pengguna mencari "planet tata surya", sistem akan mengembalikan informasi tentang planet terkait, seperti "Jupiter", "Mars", dll.
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Algoritma Pencarian, Penambangan Data
Membuat pipeline (kompresor + konverter dokumen)
DocumentCompressorPipeline memungkinkan Anda menggabungkan beberapa kompresor secara berurutan.
Bersama dengan kompresor, Anda dapat menambahkan BaseDocumentTransformer ke pipeline, yang hanya melakukan transformasi pada sekumpulan dokumen tanpa melakukan kompresi kontekstual apa pun.
Sebagai contoh, TextSplitter dapat digunakan sebagai transformator dokumen untuk membagi dokumen menjadi bagian yang lebih kecil, dan EmbeddingsRedundantFilter dapat digunakan untuk memfilter dokumen yang duplikat berdasarkan kesamaan embeddings antar dokumen.
Di bawah ini, kita akan membuat pipeline kompresor dengan terlebih dahulu membagi dokumen menjadi bagian yang lebih kecil, lalu menghapus dokumen duplikat, dan memfilter berdasarkan relevansi dengan kueri.
from langchain.retrievers.document_compressors import DocumentCompressorPipelinefrom langchain_community.document_transformers import EmbeddingsRedundantFilterfrom langchain_text_splitters import CharacterTextSplitter# Membuat pemisah teks berbasis karakter dengan ukuran chunk 300 dan overlap antar chunk 0.splitter =CharacterTextSplitter(chunk_size=300, chunk_overlap=0)# Membuat filter redundansi menggunakan embeddings.redundant_filter =EmbeddingsRedundantFilter(embeddings=embeddings)# Membuat filter relevansi menggunakan embeddings dan menetapkan ambang batas kemiripan 0.86.relevant_filter =EmbeddingsFilter( embeddings=embeddings, similarity_threshold=0.86)pipeline_compressor =DocumentCompressorPipeline( # Buat pipeline kompresi dokumen, atur pembagi, filter duplikat, filter relevansi, dan LLMChainExtractor sebagai konverter.
transformers=[ splitter, redundant_filter, relevant_filter, LLMChainExtractor.from_llm(llm), ]
Inisialisasi ContextualCompressionRetriever, dengan menggunakan pipeline_compressor sebagai base_compressor dan retriever sebagai base_retriever.
compression_retriever =ContextualCompressionRetriever( # Menginisialisasi ContextualCompressionRetriever dengan menggunakan pipeline_compressor sebagai kompresor dasar, dan retriever sebagai pencari dasar.
base_compressor=pipeline_compressor, base_retriever=retriever,)compressed_docs = compression_retriever.get_relevant_documents(# query / pertanyaan"Ceritakan tentang Semantic Search.")# Mencetak dokumen yang telah dikompres dengan tampilan yang indah.pretty_print_docs(compressed_docs)
Document 1:
Pencarian Semantik
----------------------------------------------------------------------------------------------------
Document 2:
Definisi: Pencarian semantik adalah metode pencarian yang melampaui pencocokan kata kunci sederhana untuk memahami makna dari kueri pengguna dan mengembalikan hasil yang relevan. Contoh: Jika seorang pengguna mencari "planet tata surya", sistem akan mengembalikan informasi tentang planet terkait, seperti "Jupiter", "Mars", dll.