
Waktu Membaca: ~ 10 Menit
Membangun Art Deco Rag Chatbot Menggunakan Pulsejet Github Repo: https://github.com/jet-engine/art-deco-chatbot
BlogPost ini dapat dibaca dari tautan berikut:
Model bahasa besar (LLM) telah secara signifikan maju, meningkatkan kemampuan mereka untuk menjawab beragam pertanyaan. Namun, mereka masih menghadapi tantangan, terutama dengan informasi spesifik atau terbaru, sering mengakibatkan ketidakakuratan atau "halusinasi." Untuk mengatasi masalah ini, pendekatan pengambilan augmented generasi (RAG) mengintegrasikan langkah pengambilan dokumen ke dalam proses pembuatan respons. Pendekatan ini menggunakan kumpulan dokumen dan menggunakan database vektor untuk pengambilan yang efisien, meningkatkan keakuratan dan keandalan respons LLM melalui tiga langkah utama:
Database vektor memfasilitasi pencarian kesamaan yang cepat dan manajemen data yang efisien, menjadikan Rag solusi yang kuat untuk meningkatkan kemampuan LLM.
Era Art Deco, yang membentang tahun 1920 -an hingga tahun 1940 -an, meninggalkan warisan arsitektur yang mempesona. Terlepas dari kemampuan model seperti Meta's LLAMA3.1, tanggapan mereka bisa tidak dapat diandalkan, terutama untuk pertanyaan yang bernuansa atau terperinci khusus untuk Art Deco. Tujuan kami dengan Art Deco Chatbot adalah menggunakan RAG untuk meningkatkan kualitas tanggapan tentang Arsitektur Art Deco, membandingkannya dengan yang dihasilkan oleh LLM tradisional dalam kualitas dan efisiensi waktu.
Dengan merancang Art Deco Chatbot, kami juga bertujuan untuk menunjukkan bagaimana sistem kain yang kompleks dapat dibangun. Anda dapat mengakses kode lengkap di Repositori Art Deco Chatbot Github. Dengan memeriksa kode dan membaca readme ini, Anda akan belajar:
Ollama adalah program yang memfasilitasi menjalankan model LLM dengan mudah di mesin lokal.
ollama pull llama3.1 (llm yang akan digunakan untuk kain)ollama pull nomic-embed-text (model embedding yang akan digunakan untuk RAG) Dalam proyek ini, kami tidak hanya bertujuan untuk menulis kode untuk menunjukkan bagaimana RAG dapat dilakukan tetapi juga untuk membandingkan dan membandingkan hasil kain dengan pertanyaan ke LLM yang berbeda. Beberapa LLM ini tidak dapat dijalankan secara lokal (seperti GPT-4o ), sementara yang lain komputasi berat dan dijalankan pada layanan cloud (seperti Llama3.1:70b di Groq).
Litellm menyediakan antarmuka terpadu untuk menanyakan LLM yang berbeda, membuat kode kami lebih bersih dan lebih mudah dibaca. Memeriksa Perpustakaan Litellm Python direkomendasikan tetapi tidak diperlukan untuk proyek ini.
Dapatkan kunci API Anda dari Openai dan Groq untuk menggunakannya dalam proyek. Ketahuilah bahwa Anda mungkin ditagih untuk menggunakan layanan ini. Sementara Groq API dapat digunakan secara gratis pada saat penulisan, OpenAI API tidak gratis.
Pulsejet adalah basis data vektor kinerja tinggi yang memungkinkan penyimpanan dan pengambilan yang efisien dari embeddings dokumen. Untuk mengatur pulsejet:
pip install pulsejetdocker run --name pulsejet_container -p 47044-47045:47044-47045 jetngine/pulsejet Catatan: Anda dapat melewatkan langkah pertama karena pulsejet sudah termasuk dalam file requirements.txt .
Periksa Dokumen Pulsejet untuk detail tentang menjalankan gambar Pulsejet Docker dan menggunakan Pulsejet Python Library untuk operasi database vektor.
Instal semua dependensi yang diperlukan dengan menjalankan:
pip install -r requirements.txt
Proyek ini dikembangkan menggunakan lingkungan
condadenganPython 3.11.
Karena kami belum menguji proyek di lingkungan yang berbeda, kami merekomendasikan untuk mematuhi konfigurasi ini untuk kinerja dan kompatibilitas yang optimal.
Art Deco Chatbot menggunakan dua file YAML untuk konfigurasi: config.template.yaml dan secrets.yaml . Berikut ini rincian terperinci dari setiap bagian:
Buat file secrets.yaml dengan tombol API Anda:
# api_keys:
openai_key : " your_openai_key_here "
groq_key : " your_groq_key_here " # models:
main_model : " llama3.1 "
embed_model : " nomic-embed-text "
# vector_db:
vector_db : " pulsejet "
# pulsejet:
pulsejet_location : " remote "
pulsejet_collection_name : " art-deco "
# paths:
rag_files_path : " rag_files/ "
questions_file_path : " evaluation/questions.csv "
evaluation_path : " evaluation/ "
rag_prompt_path : " evaluation/rag_prompt.txt "
metrics_file_path : " evaluation/metrics.json "
# embeddings:
embeddings_file_path : " embeddings_data/all_embeddings_HSNW.h5 "
use_precalculated_embeddings : true
# llm_models:
all_models :
gpt-4o : " gpt-4o "
groq-llama3.1-8b : " groq/llama-3.1-8b-instant "
groq-llama3.1-70b : " groq/llama-3.1-70b-versatile "
ollama-llama3.1 : " ollama/llama3.1 "
ollama-llama3.1-70b : " ollama/llama3.1:70b "
selected_models :
- " gpt-4o "
- " groq-llama3.1-70b "
- " ollama-llama3.1 "
# rag_parameters:
sentences_per_chunk : 10
chunk_overlap : 2
file_extension : " .txt "Berikut penjelasan terperinci dari setiap bagian:
true , sistem akan memuat embeddings dari file yang ditentukan. Saat false , itu akan menghasilkan embeddings baru dan menyimpannya ke file ini. Pastikan Anda memperbarui file konfigurasi ini dengan pengaturan spesifik Anda sebelum menjalankan proyek. Menyesuaikan parameter RAG dapat secara signifikan memengaruhi kinerja dan akurasi sistem RAG. Eksperimen dengan nilai yang berbeda mungkin diperlukan untuk menemukan konfigurasi optimal untuk kasus penggunaan spesifik dan set dokumen Anda.
wiki-bot.pyLangkah ini opsional karena file konten dari semua artikel yang dikikis dari Wikipedia tersedia di https://huggingface.co/datasets/jetengine/art_deco_usa_ds.
Anda dapat mengunduh dataset ini dan menyalin semua file teks darinya ke direktori RAG_FILES. Jika Anda berencana untuk menggunakan embeddings yang telah dihitung sebelumnya, yang akan dijelaskan di bagian berikutnya, Anda sebenarnya tidak perlu mengunduh dataset ini.
Tidak perlu mengulangi proses pengikis. Anda dapat melewatkan membaca bagian ini jika Anda tidak tertarik dengan proses pengikis data.
Langkah awal kami melibatkan pengumpulan pengetahuan tentang arsitektur art-deco. Kami fokus pada struktur kami, memberikan keunggulan mereka dalam gerakan art-deco. Wiki-Bot.py Script mengotomatiskan kumpulan artikel Wikipedia yang relevan, mengaturnya menjadi direktori terstruktur untuk kemudahan akses.
Jalankan bot menggunakan:
python wiki-bot.py
Saat Anda menjalankan wiki-bot.py dengan direktori rag_files kosong, itu menyimpan isi artikel Wikipedia yang dikikis dalam sub-folder bernama text di bawah Rag_files. Bot juga membuat berbagai sub-folder untuk mengatur berbagai jenis data seperti URL artikel, referensi, dll. Karena fokus kami saat ini hanya pada isi artikel Wikipedia, untuk mengurangi kekacauan, kami hanya mentransfer konten dari sub-folder text ke dataset HG kami dan menghapus semua sub-tolder lainnya.
Dengan demikian, jika Anda ingin menjalankan bot sendiri yang opsional karena dokumen yang rag_files_path sudah tersedia di wajah rag_files , Anda perlu menyalin semua file dari sub-folder rag_files/text ke direktori rag_files di config.yaml .
indexing.pyIndeks dokumen dengan menjalankan:
python indexing.py
Skrip ini memproses dokumen, menghasilkan embeddings, dan menyimpannya di Pulsejet. Jika Anda tidak ingin kehilangan waktu untuk menghasilkan embeddings, Anda dapat mengunduh embeddings pra-dihitung dari https://huggingface.co/jetengine/rag_art_deco_embeddings dan atur use_precalculated_embeddings: true dalam konfigurasi.
Dalam generasi pengaturan embeddings kami membutuhkan waktu sekitar 15 menit untuk menyelesaikan dan penyisipan vektor ke pulsejet membutuhkan waktu sekitar 4 detik .
Informasi waktu output skrip untuk:
chat.pyPastikan konfigurasi Anda benar, lalu jalankan:
python chat.py
Script ini menanyakan LLMS yang berbeda dan sistem RAG, menghasilkan hasil dalam format HTML, JSON, dan CSV untuk perbandingan.
Pulsejet digunakan dalam proyek ini untuk penyimpanan dan pengambilan vektor yang efisien. Berikut adalah gambaran terperinci tentang bagaimana Pulsejet diintegrasikan ke dalam proyek Art Deco Chatbot kami:
Menginisialisasi klien pulsejet :
client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ]) Ini menciptakan klien pulsejet. Dalam proyek kami, kami menggunakan instance Pulsejet jarak jauh, sehingga location diatur ke "jarak jauh". Ini terhubung ke server pulsejet yang berjalan dalam wadah Docker.
Membuat koleksi :
client . create_collection ( collection_name , vector_config ) Ini menciptakan koleksi baru di Pulsejet untuk menyimpan embeddings dokumen kami. Parameter vector_config menentukan konfigurasi untuk penyimpanan vektor, seperti ukuran vektor dan jenis indeks (misalnya, HNSW untuk pencarian kesamaan yang efisien).
Memasukkan vektor : Dalam proyek kami, kami menggunakan pola berikut untuk memasukkan vektor:
collection [ 0 ]. insert_single ( collection [ 1 ], embed , meta )Ini mungkin terlihat membingungkan pada awalnya, tapi inilah artinya:
collection[0] sebenarnya adalah instance klien Pulsejet kami.collection[1] adalah nama koleksi yang kami masukkan.embed adalah vektor yang kami masukkan.meta adalah metadata tambahan yang terkait dengan vektor.Ini setara dengan menelepon:
client . insert_single ( collection_name , vector , meta )Untuk penyisipan massal, kami menggunakan:
client . insert_multi ( collection_name , embeds )Ini menyisipkan beberapa embedding sekaligus, yang lebih efisien untuk kumpulan data besar.
Mencari vektor :
results = client [ 'db' ]. search_single ( collection , query_embed , limit = 5 , filter = None ) Ini melakukan pencarian kesamaan dalam koleksi pulsejet yang ditentukan untuk menemukan dokumen yang paling relevan untuk vektor kueri yang diberikan. Parameter limit menentukan jumlah maksimum hasil yang akan dikembalikan.
Dalam proyek kami, client['db'] digunakan untuk mengakses metode database klien pulsejet. Ini setara dengan menggunakan klien secara langsung:
results = client . search_single ( collection_name , query_vector , limit = 5 , filter = None )Menutup Koneksi :
client . close ()Ini menutup koneksi ke database pulsejet saat tidak diperlukan lagi.
Kelas PulsejetRagClient didefinisikan dalam pulsejet_rag_client.py dan menyediakan antarmuka tingkat tinggi untuk berinteraksi dengan pulsejet dalam konteks sistem kain kami. Berikut ini rincian komponen utamanya:
Inisialisasi :
class PulsejetRagClient :
def __init__ ( self , config ):
self . config = config
self . collection_name = config [ 'pulsejet_collection_name' ]
self . main_model = config [ 'main_model' ]
self . embed_model = config [ 'embed_model' ]
self . client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ])Klien diinisialisasi dengan parameter konfigurasi, mengatur klien pulsejet dan menyimpan nilai konfigurasi yang relevan.
Membuat koleksi :
def create_collection ( self ):
vector_size = get_vector_size ( self . config [ 'embed_model' ])
vector_params = pj . VectorParams ( size = vector_size , index_type = pj . IndexType . HNSW )
try :
self . client . create_collection ( self . collection_name , vector_params )
logger . info ( f"Created new collection: { self . collection_name } " )
except Exception as e :
logger . info ( f"Collection ' { self . collection_name } ' already exists or error occurred: { str ( e ) } " ) Metode ini membuat koleksi baru di pulsejet dengan parameter yang ditentukan. Ini menggunakan fungsi get_vector_size untuk menentukan ukuran vektor yang sesuai untuk embeddings.
Memasukkan vektor :
def insert_vector ( self , vector , metadata = None ):
try :
self . client . insert_single ( self . collection_name , vector , metadata )
logger . debug ( f"Inserted vector with metadata: { metadata } " )
except Exception as e :
logger . error ( f"Error inserting vector: { str ( e ) } " )
def insert_vectors ( self , vectors , metadatas = None ):
try :
self . client . insert_multi ( self . collection_name , vectors , metadatas )
logger . debug ( f"Inserted { len ( vectors ) } vectors" )
except Exception as e :
logger . error ( f"Error inserting multiple vectors: { str ( e ) } " )Metode -metode ini menangani penyisipan vektor tunggal dan beberapa ke dalam koleksi pulsejet, bersama dengan metadata yang terkait.
Mencari vektor :
def search_similar_vectors ( self , query_vector , limit = 5 ):
try :
results = self . client . search_single ( self . collection_name , query_vector , limit = limit , filter = None )
return results
except Exception as e :
logger . error ( f"Error searching for similar vectors: { str ( e ) } " )
return []Metode ini melakukan pencarian kesamaan dalam koleksi Pulsejet untuk menemukan dokumen yang paling relevan untuk vektor kueri yang diberikan.
Menutup Koneksi :
def close ( self ):
try :
self . client . close ()
logger . info ( "Closed Pulsejet client connection" )
except Exception as e :
logger . error ( f"Error closing Pulsejet client connection: { str ( e ) } " )Metode ini menutup koneksi ke database pulsejet saat tidak diperlukan lagi.
PulsejetRagClient digunakan di seluruh proyek untuk berinteraksi dengan pulsejet. Begini cara biasanya dipakai dan digunakan:
Penciptaan :
from pulsejet_rag_client import create_pulsejet_rag_client
config = get_config ()
rag_client = create_pulsejet_rag_client ( config )Dokumen Pengindeksan :
Di indexing.py , kami menggunakan klien untuk membuat koleksi dan memasukkan vektor:
rag_client . create_collection ()
for file_name , file_embeddings in embeddings_data . items ():
for chunk_id , content , embed in file_embeddings :
metadata = { "filename" : file_name , "chunk_id" : chunk_id , "content" : content }
rag_client . insert_vector ( embed , metadata ) Di rag.py , kami menggunakan klien untuk mencari vektor serupa selama proses RAG:
results = rag_client . search_similar_vectors ( query_embed , limit = 5 )Setelah operasi selesai, kami menutup koneksi:
rag_client . close ()Implementasi ini menyediakan antarmuka yang bersih dan dienkapsulasi untuk semua operasi pulsejet dalam sistem RAG kami.
LLama3.1 membutuhkan waktu lebih lama daripada menjawab pertanyaan sederhana karena meningkatnya panjang permintaan.Art Deco Chatbot menunjukkan bagaimana LLMS bisa lebih baik digunakan dengan kain. Proyek kami menawarkan eksplorasi komprehensif implementasi kain, yang mencakup setiap langkah dari pengikis data dan mendokumentasikan chunking hingga penyematan pembuatan dan integrasi basis data vektor.
Ketika basis dokumen untuk sistem RAG tumbuh lebih besar, kinerja insersi dan operasi pencarian menjadi semakin kritis. Dengan mempelajari cara mengintegrasikan database Vektor Pulsejet ke dalam sistem RAG penuh, orang dapat secara signifikan mendapat manfaat dari kemampuannya, terutama ketika berurusan dengan aplikasi RAG pada basis dokumen besar.
Respons kain kami bisa lebih akurat. Untuk meningkatkan kinerja Art Deco Chatbot kami, kami sedang mempertimbangkan beberapa pendekatan eksperimental:
Kami berencana untuk memperluas proyek ini melalui inisiatif berikut:
Kami mendorong Anda untuk bereksperimen dengan Art Deco Chatbot, memodifikasi parameternya, dan menyesuaikannya dengan domain Anda sendiri yang menarik.
Penulis: Güvenç Usanmaz