Proyek kecil ini bertujuan untuk memasukkan entri blog WordPress ke dalam basis pengetahuan yang menggunakan teknik Retrieval-Augmented Generation (RAG).
Premis proyek ini sederhana - serangkaian skrip akan melakukan tindakan spesifik melalui baris perintah. Setiap skrip bersifat mandiri, yang membantu mendemonstrasikan setiap tindakan dalam konteksnya sendiri, dengan relatif sederhana.
Secara default, skrip yang disertakan menggunakan pustaka dan model sumber terbuka dan gratis, meskipun opsi untuk menggunakan LLM OpenAI tersedia jika Anda memiliki akses. Contoh ini seharusnya dapat dijalankan di CPU jika Anda tidak memiliki GPU yang kompatibel, kecuali YMMV.
RAG menggunakan dua komponen: sistem pengambilan dan model bahasa generatif. Sistem pengambilan menanyakan dokumen yang relevan dengan kueri dari penyimpanan data/basis pengetahuan (misalnya, kumpulan postingan blog). Dokumen yang diambil kemudian dimasukkan ke dalam model bahasa, yang menghasilkan respons yang terinformasi bagi pengguna. Salah satu manfaat utama penggunaan RAG adalah memungkinkan sistem AI untuk melampaui data pelatihan tanpa memerlukan penyesuaian atau pelatihan ulang - data dapat ditambahkan dan diperbarui di penyimpanan data secara dinamis. Hasil kueri tidak hanya mencakup teks yang disediakan model bahasa, tetapi juga kumpulan dokumen atau sumber yang relevan. Anda dapat membaca lebih lanjut tentang RAG di Blog Penelitian IBM.
Ini adalah proyek yang cukup mudah untuk dijalankan dan dijalankan...
Pertama-tama atur lingkungan virtual proyek dan aktifkan
python3 -m venv virtualenv
source ./virtualenv/bin/activate
Anda dapat menginstal semua dependensi untuk proyek ini dengan menggunakan file requirements.txt
. Jika ya, tidak perlu menginstal paket lain secara manual melalui pip
dalam dokumen ini.
pip install -r requirements.txt
Buat file .env
menggunakan env.example
sebagai panduan.
cp env.example .env
Ini penting untuk mengunduh data wordpress Anda. Pastikan untuk menyalin nama pengguna Wordpress Anda, kata sandi aplikasi, dan domain blog ke .env
. CATATAN: Ini mengasumsikan blog berada di jalur root.
pip install --upgrade python-dotenv requests pandas langchain langchain_community html2text sentence_transformers
Unduh konten wordpress ke direktori ./data
(ini mengasumsikan blog Anda berada di root domain, untuk saat ini):
python3 wordpress-dl.py
PGVector digunakan untuk menyimpan dan menanyakan penyematan teks (vektor) dalam database Postgresql. Salah satu manfaat PGVector adalah dapat ditambahkan ke sistem database yang sudah ada dan tidak memerlukan produk pihak ketiga yang berpemilik.
Untuk dukungan penyematan pgvector:
pip install pgvector psycopg2-binary
Pastikan Anda memiliki nilai .env
yang tepat. Meskipun defaultnya baik-baik saja untuk pengembangan lokal, ada kemungkinan Anda memiliki sesuatu yang berbeda jika menggunakan database Postgres yang sudah ada (yaitu tidak menjalankan image buruh pelabuhan). Di sini, kami menggunakan image Docker untuk menjaga pengaturan tetap sederhana, tetapi Anda dapat dengan mudah menggunakan instance PostgreSQL lain jika Anda dapat menambahkan dan memuat sendiri ekstensi pgvector.
Untuk menjalankan gambar buruh pelabuhan di ./postgres
:
docker compose up
Jalankan skrip embeddings untuk mengunduh wordpress dan menyimpan embeddings ke database postgres. Ini mungkin memerlukan waktu. _Jika Anda ingin memasukkan data ke dalam database, yaitu menghapus dan memulai dengan data bersih, berikan argumen --embed
CLI:
python3 embed.py --embed
Secara default, hanya 1 record yang disisipkan untuk pengujian (yaitu dengan tidak menentukan --limit
dan kemudian bilangan bulat > 1, ini hanya akan membuat penyematan vektor untuk record pertama) - sehingga Anda dapat menguji dengan lebih mudah tanpa menghabiskan terlalu banyak waktu komputasi ekstra.
Jika Anda penasaran dengan informasi tambahan, berikan --verbose
Contoh pemanggilan akan terlihat seperti:
python3 embed.py --verbose --embed --limit 100
...tetapi tingkatkan batas ukuran yang sesuai untuk blog wordpress Anda. Tidak masalah jika jumlahnya lebih besar dari jumlah entri - cukup pintar untuk mengimpor hingga jumlah rekaman maksimal.
Repo ini menunjukkan kasus penggunaan lokal dan berbasis api. Salah satu keuntungan model yang dijalankan secara lokal adalah data Anda tetap bersifat pribadi dan tidak akan digunakan untuk melatih model orang lain. Selain itu, mungkin ada beberapa peningkatan kinerja dengan menjaga kueri tetap lokal di server atau jaringan, dan juga tidak menimbulkan biaya penggunaan API pada sistem yang dihosting sendiri. Di sisi lain, penggunaan API mungkin diinginkan, karena OpenAI memiliki jendela konteks yang jauh lebih besar daripada model yang digunakan dalam proyek ini, dan model OpenAI bisa jadi cukup bagus.
Penggunaan model bahasa lokal memerlukan paket python trsnformers
dan pytorch ( torch
)
pip install transformers torch llama-cpp-python
Selanjutnya, unduh model yang digunakan dalam pendekatan offline ini. Karena model bahasa bisa berukuran besar (beberapa GB), saya memilih model Llama yang lebih kecil untuk mendemonstrasikannya. Model yang lebih kecil pun dapat digunakan, namun seringkali berada pada batas jendela konteks, yang dapat dikurangi, namun di luar cakupan proyek ini. Proyek ini menggunakan TheBloke/Llama-2-7b-Chat-GGUF
( Q4_K_M
)
(Jika Anda belum menginstal huggingface-cli
, Anda dapat menemukan detailnya di sini).
huggingface-cli download TheBloke/Llama-2-7b-Chat-GGUF llama-2-7b-chat.Q4_K_M.gguf --local-dir ./models/ --local-dir-use-symlinks True
Perintah ini akan mengunduh model ke direktur cache akun pengguna, dan akan melakukan symlink dari direktori model.
Setelah model diunduh, Anda dapat menjalankan inferensi lokal, yang merupakan opsi default. Lihat bagian berikutnya, Permintaan instruksi.
Instalasi diperlukan untuk penggunaan OpenAI API
pip install langchain_openai
Pastikan Anda menyimpan kunci API OpenAI ke file .env
Anda. Anda dapat mengonfigurasinya di tab Kunci API Platform OpenAI: OPENAI_API_KEY="...
Dokumen (disematkan dan diambil, btw) memiliki struktur umum berikut dalam proyek ini.
## document
## page_content
## metadata
## id
## link
## title
## categories
## tags
Hasil sering kali dikembalikan sebagai List
tupel (idx, Dokumen), sehingga tepat untuk menghitung daftar tersebut:
for ( idx , doc ) in enumerate ( results [" docs ]):
print ( f" { doc . metadata [ 'title' ] } " )
Sebagian besar data yang berguna untuk meningkatkan respons LLM akan disertakan dalam properti metadata
, yaitu kamus data yang dimasukkan selama penyematan.
Menjalankan kueri dari CLI itu sederhana..
...model lokal:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? "
...menggunakan OpenAI:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? " --use-api
Setelah beberapa saat, perkirakan akan melihat respons seperti ini,
❓ 'Does RaspberryPi have GPIO that swift can use?'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yes, RasbperryPi has GPIO that swift can use as per the context given.
- - Supporing Docs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
? Accessing Raspberry Pi GPIO Pins (With Swift) ? https://archive.mistercameron.com/2016/06/accessing-raspberry-pi-gpio-pins-with-swift/
? Currently, Swift on Raspberry Pi3 ? https://archive.mistercameron.com/2016/04/currently-swift-on-raspberry-pi3/
? Compile Swift 3.0 on Your ARM computers (Raspberry Pi, BeagleBone Black, etc) ? https://archive.mistercameron.com/2016/06/compile-swift-3-0-on-your-arm-computer/
? Ready Your Raspberry Pi for Swift ? https://archive.mistercameron.com/2016/05/ready-your-raspberry-pi-for-swift/
~ ~ ~ ~ ~ Finished in 14.80s ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
********************************************************************************
Ada argumen tambahan yang dapat membantu saat menguji data dan model Anda. jalankan python3 query.py --help
untuk opsi lainnya.