Menerapkan Oracle Database 23AI untuk GenAI RAG, Bagian 1
Menerapkan Oracle Database 23AI untuk GenAI RAG, Bagian 1
[ad_1]
Terkini Dunia Berawan acara, Oracle menyajikan Basis Data Oracle 23cbasis data generasi berikutnya, yang menggabungkan kemampuan AI melalui penambahan pencarian vektor AI ke basis data terkonvergensinya. Fungsi pencarian vektor ini memungkinkan bisnis menjalankan kueri multimodal dengan mengintegrasikan berbagai jenis data, sehingga meningkatkan kegunaan GenAI dalam aplikasi bisnis. Dengan Oracle Database 23c, tidak diperlukan database terpisah untuk menyimpan dan menanyakan data berbasis AI. Dengan mendukung penyimpanan vektor bersama dengan tabel relasional, bagan, dan tipe data lainnya, Oracle 23c menjadi alat yang ampuh bagi pengembang yang membuat aplikasi bisnis, khususnya untuk kebutuhan pencarian semantik.
Dalam seri blog dua bagian ini, kita akan menjelajahi dasar-dasar vektor dan penyematan, menjelaskan cara kerja database vektor Oracle, dan mengembangkan aplikasi pengambilan augmented generasi (RAG) untuk meningkatkan LLM lokal.
Pada artikel ini, kami akan membahas langkah-langkah berikut:
- Instal dan konfigurasikan Database Oracle Standalone Gratis (tanpa ADB) dalam wadah Docker.
- Konfigurasikan DBeaver untuk menjelajahi database (opsional).
- Buat notebook Jupyter untuk mengurai file dan menyimpan/mencari integrasi di database Oracle ADB-Free.
Klarifikasi konsep
Sebelum mendalami proses instalasi dan konfigurasi, mari kita perjelas beberapa konsep, seperti penyematan dan vektor di AI Generatif. Jika Anda sudah familiar dengan konsep-konsep ini, silakan lewati bagian ini.
Apa itu vektor?
Mari kita mulai dengan istilahnya vektor. Dalam matematika, vektor adalah suatu benda yang mewakili nilai dan arah suatu besaran dalam dimensi apa pun.
# Creating a vector as an array
!pip install numpy import numpy as np
vector = np.array([1, 2, 3, 4, 5])
print("Vector of 5 elements:", vector)
Untuk keluar:
Vector of 5 elements: [1 2 3 4 5]
Dalam konteks AI Generatif, vektor digunakan untuk merepresentasikan teks atau data dalam format digital, sehingga model dapat memahami dan memprosesnya. Hal ini diperlukan karena mesin hanya memahami angka, sehingga teks dan gambar harus diubah menjadi vektor agar model bahasa besar (LLM) dapat memahaminya.
Berikut ini adalah pseudocode yang mengubah teks motivasi menjadi token dengan menggunakan model Phi-2. Kami menggunakan AutoTokenizer
kelas Wajah yang menggemaskan untuk menyandikan teks menjadi vektor dan mendekodekannya menjadi teks.
!pip install transformersfrom transformers import AutoTokenizer from huggingface_hub import interpreter_login # Use your API KEY of Hugging Face here and click enter ;-)
interpreter_login()
model_name="microsoft/phi-2"
tokenizer = AutoTokenizer.from_pretrained(model_name,token="HF_TOKEN")
txt = "We must always change, renew, rejuvenate ourselves; otherwise, w\ e harden."
token = tokenizer.encode(txt)
print(token)
decoded_text = tokenizer.decode(token)
print(decoded_text)
Untuk keluar:
[1135, 1276, 1464, 1487, 11, 6931, 11, 46834, 378, 6731, 26, 4306, 11, \ 356, 1327, 268, 13] We must always change, renew, rejuvenate ourselves; otherwise, we harden.
Vektor saja tidak cukup untuk LLM karena mereka hanya menangkap karakteristik numerik dasar dari sebuah token, tanpa menyandikan makna semantiknya yang kaya. Vektor hanyalah representasi matematis yang dapat dimasukkan ke dalam model. Untuk menangkap hubungan semantik antar token, kita memerlukan sesuatu yang lebih: penyematan.
Apa itu integrasi?
A integrasi adalah versi vektor yang lebih canggih, biasanya dihasilkan oleh pelatihan pada kumpulan data besar. Tidak seperti vektor mentah, penyematan menangkap hubungan semantik antar token. Artinya, token dengan makna serupa akan memiliki penyematan serupa, meskipun muncul dalam konteks berbeda.
Penyematan memungkinkan LLM utama memahami seluk-beluk bahasa, termasuk konteks, nuansa, dan makna kata dan frasa. Mereka dihasilkan dari proses pembelajaran model, karena model tersebut menyerap sejumlah besar data tekstual dan mengkodekan tidak hanya identitas token individual, namun juga hubungannya dengan token lain.
Biasanya, penyematan dibuat menggunakan teknik seperti Word2Vec, GloVe, atau menggunakan pengubah kalimat. Berikut adalah contoh bagaimana OpenAI Embeddings dapat digunakan untuk menghasilkan embeddings dari teks masukan: Singa, Harimau, Dan iPhone.
!pip install sentence-transformers
from sentence_transformers import SentenceTransformer
encoder = SentenceTransformer('all-MiniLM-L12-v2')
txt = "Lion"
embeddings = encoder.encode(txt, batch_size=10)
print (embeddings)
Untuk keluar:
Apa itu database vektor?
Juga dikenal sebagai mesin pencari kesamaan, a basis data vektor adalah database khusus yang dirancang untuk menyimpan dan mengambil vektor secara efisien. Basis data ini dioptimalkan untuk melakukan pencarian tetangga terdekat (yaitu menemukan elemen yang paling mirip berdasarkan penyematannya) dalam ruang vektor berdimensi tinggi. Tidak seperti database relasional tradisional, database vektor dapat membandingkan vektor secara langsung tanpa memerlukan kueri atribut eksplisit.
Fitur Utama dari Database Vektor
- Integrasi Toko: Daripada menyimpan data mentah (seperti teks atau gambar), ia menyimpan representasi vektor (embeddings) dari data ini.
- Pengindeksan khusus: Menggunakan teknik seperti HNSW (Grafik Hierarchical Navigable Small World) atau FAISS (Facebook AI Kemiripan Pencarian) untuk mengindeks dan mencari vektor serupa secara efisien.
- Skalabilitas: Dapat menangani jutaan atau milyaran vektor dan melakukan pencarian kesamaan dengan cepat bahkan di ruang berdimensi tinggi.
Contoh
Mari kita lihat sebuah contoh:
- Film A: “Seorang bajak laut terkenal yang ditandai dengan kesombongannya yang sedikit mabuk”
- Integrasi: [0.9, 0.1, 0.8, …]
- Film B: “Seorang bajak laut yang ingin menghadapi Jack karena mencuri kapalnya. »
- Integrasi: [0.85, 0.15, 0.75, …]
Jika Anda menanyakan database dengan penyematan film A, film B juga akan dikembalikan karena penyematannya dekat dalam ruang vektor, yang menunjukkan bahwa film tersebut memiliki konten yang serupa.
Basis data vektor dapat digunakan dalam berbagai skenario:
- Pencarian semantik: Misalnya, saat Anda mencari kecerdasan buatan dalam database dokumen, database vektor dapat menemukan dokumen dengan topik terkait seperti pembelajaran mesin atau jaringan saraf.
- Pemulihan gambar: Mencari gambar serupa berdasarkan karakteristik visualnya, misalnya dengan mencari semua gambar anjing dalam koleksi foto yang banyak.
- Sistem rekomendasi: Temukan dan rekomendasikan produk, artikel, atau media serupa dengan cepat yang diminati pengguna.
Database Oracle untuk menyimpan dan menanyakan integrasi
Sekarang setelah kita memiliki cukup teori, mari kita jelajahi penggunaan Oracle Database untuk menyimpan dan menanyakan integrasi.
Saya akan menggunakan server mini lokal yang didukung oleh Proxmox untuk menginstal dan mengkonfigurasi Oracle Autonomous Database Free (Bebas ADB) dalam wadah Docker. Konfigurasi saya dijelaskan di bawah ini:
Langkah 1: Instal dan konfigurasikan database
Jalankan perintah bash berikut:
docker run -d \ -p 1521:1522 \ -p 1522:1522 \ -p 8443:8443 \ -p 27017:27017 \ -e WORKLOAD_TYPE=ATP \ -e WALLET_PASSWORD=Welcome_12345 \ -e ADMIN_PASSWORD=Welcome_12345 \ --cap-add SYS_ADMIN \ --device /dev/fuse \ --name adb-free \ ghcr.io/oracle/adb-free:latest-23ai
Di sini kita telah mengkonfigurasi kata sandi admin dan dompet: Welcome_12345
.
Jika semuanya berjalan dengan baik, instance database baru akan diberi nama ATPDB
akan dibuat.
Aplikasi Oracle Database Actions tipe SQL Web Developer akan dapat diakses melalui URL.
Anda dapat menggunakan aplikasi web ini untuk memanipulasi database, misalnya dengan membuat skema dan pengguna atau membuat kueri database.
Langkah 2: Penyiapan dompet
Oleh karena itu, Oracle ADB-Free tidak dapat diakses secara langsung: kita memerlukan dompet untuk berkomunikasi dengan database. Buat direktori baru di mesin host Anda dengan nama “/gores/tls_wallet” dan salin dompet ke mesin host Docker menggunakan perintah berikut:
docker cp adb-free:/u01/app/oracle/wallets/tls_wallet /scratch/tls_wallet
Menunjukkan TNS_ADMIN
variabel lingkungan di direktori dompet.
export TNS_ADMIN=/scratch/tls_wallet
Dalam kasus saya, karena saya berencana untuk terhubung dari jarak jauh, saya perlu mengganti “localhost” di $TNS_ADMIN/tnsnames.ora
dengan FQDN dari host jarak jauh.
sed -i 's/localhost/my.host.com/g' $TNS_ADMIN/tnsnames.ora
Sekarang arsipkan (zip) dompet untuk digunakan nanti.
zip -j /scratch/tls_wallet.zip /scratch/tls_wallet/*
Langkah 3: Buat pengguna/skema baru
Masuk ke database sebagai pengguna administrator (= sys
):
docker exec -it adb-free sqlplus sys/Welcome_12345@myatp_medium.adb.oraclecloud.com as sysdba
Atau myatp_medium.adb.oraclecloud.com
adalah nama layanan database dari tnsnames.ora deposito.
Buat pengguna basis data biasa SCOTT
dan berikan dia CONNECT
Dan RESOURCE
peran.
CREATE USER SCOTT
IDENTIFIED BY Welcome_12345
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON users;
GRANT CONNECT, RESOURCE TO SCOTT;
Logout dengan perintah berikut:
exit
Verifikasi bahwa Anda dapat masuk dengan pengguna baru. Gunakan perintah berikut dari terminal mana pun:
docker exec -it adb-free sqlplus SCOTT/Welcome_12345@myatp_medium.adb.oraclecloud.com
Langkah 4: Mulai coding dengan Python
Saya akan menggunakan Jupyter Notebook dengan Miniconda untuk menjalankan aplikasi Python; Namun, Anda dapat menggunakan IDE favorit Anda, seperti Visual Studio Code, untuk menjalankannya.
Buat notebook Python Jupyter baru dan tambahkan pernyataan berikut.
!pip install oracledb sentence-transformers oci
Perintah ini akan menginstal semua paket yang kita perlukan.
Unduh file bernama Generative_AI_FAQ.txt
dari link dan simpan di direktori yang sama dengan file Jupyter Notebook Anda.
Perhatikan bahwa sebagian kode Python diambil dari postingan blog “Mengonfigurasi Integrasi Vektor dan Oracle Generative AI dengan Oracle Database 23ai,” dan tetap tidak berubah.
Muat file dari direktori:
import os
def loadFAQs(directory_path):
faqs = {}
for filename in os.listdir(directory_path):
if filename.endswith(".txt"):
file_path = os.path.join(directory_path, filename)
with open(file_path) as f:
raw_faq = f.read()
faqs[filename] = [text.strip() for text in raw_faq.split('=====')]
return faqs
faqs = loadFAQs('.')
Setiap pertanyaan dan jawaban dipisahkan oleh '====='
simbol, jadi kita akan menggunakan '====='
sebagai pembatas.
Tambahkan pernyataan berikut di sel baru.
docs = [{'text': filename + ' | ' + section, 'path': filename} for filename, sections in faqs.items() for section in sections]
Hubungkan ke skema database SCOTT
dan buat tabel:
import oracledb
connection = oracledb.connect(user="scott", password="Welcome_12345", dsn="myatp_medium", config_dir="/home/shamim/projects/tls_wallet", wallet_location="/home/shamim/projects/tls_wallet", wallet_password="Welcome_12345")
table_name="genaifaqs"
with connection.cursor() as cursor:
cursor.execute(f"""
CREATE TABLE IF NOT EXISTS {table_name} (
id NUMBER PRIMARY KEY,
payload CLOB CHECK (payload IS JSON),
vector VECTOR
)""")
Tokenisasi dan sematkan konten file seperti yang ditunjukkan di bawah ini.
from sentence_transformers import SentenceTransformer
encoder = SentenceTransformer('all-MiniLM-L12-v2')
data = [{"id": idx, "vector_source": row['text'], "payload": row} for idx, row in enumerate(docs)]
texts = [row['vector_source'] for row in data]
embeddings = encoder.encode(texts, batch_size=10)
import array
for row, embedding in zip(data, embeddings):
row['vector'] = array.array("f", embedding)
Simpan vektor dalam array génaïfaqs:
import json
with connection.cursor() as cursor:
cursor.execute(f"TRUNCATE TABLE {table_name}")
prepared_data = [(row['id'], json.dumps(row['payload']), row['vector']) for row in data]
cursor.executemany(f"INSERT INTO {table_name} (id, payload, vector) VALUES (:1, :2, :3)", prepared_data)
connection.commit()
Di sini Anda dapat mencetak baris mana pun dari buku catatan atau menyambungkan ke database untuk menjelajahi baris tabel.
cr = connection.cursor()
r = cr.execute("SELECT * FROM genaifaqs f where rownum =1")
print(r.fetchall())
Ini akan menunjukkan hasil yang sangat mirip:
[(24, {'text': 'Generative_AI_FAQ.txt | Q25: What is deepfake technology?\nA: Deepfake uses AI to create realistic, altered videos or images of people.', 'path': 'Generative_AI_FAQ.txt'}, array('f', [-0.0007201445405371487, -0.0258498378098011, 0.007152569945901632, -0.003656314220279455, -0.0020476249046623707, 0.02976640872657299, -0.0202650036662817, -0.09278019517660141, 0.03025302290916443, 0.04996906593441963, -0.03872310370206833, -0.01933300867676735, -0.007471167482435703, -0.01518948096781969, -0.042043089866638184, -0.0028244946151971817, 0.022211210802197456, 0.12178391218185425, -0.03381387144327164, -0.0340578518807888, 0.09609763324260712, 0.015460986644029617, 0.019726844504475594, -0.0542815737426281]))]
Mari kita coba pencarian semantik pada data tabel dan tambahkan query SQL berikut:
topK = 4
sql = f"""SELECT payload, vector_distance(vector, :vector, COSINE) AS score
FROM {table_name}
ORDER BY score
FETCH FIRST {topK} ROWS ONLY"""
Di sini kami menggunakan COSINE
metrik untuk mengambil nilai tabel. Anda dapat menggunakan metrik yang berbeda seperti MANHATTAN
Atau JACCARD
untuk menghitung jarak.
Sekarang kami dapat mengajukan pertanyaan apa pun terkait dengan file Tanya Jawab AI yang kami buat dan mendapatkan hasil semantiknya.
question = "What are GANs?"
embedding = list(encoder.encode(question))
vector = array.array("f", embedding)
results = []
with connection.cursor() as cursor:
for (info, score,) in cursor.execute(sql, vector=vector):
text_content = info.read()
results.append((score, json.loads(text_content)))
print(results)
Kode di atas akan mengembalikan hasil yang terlihat seperti di bawah ini:
[(0.27902800283631, {'text': 'Generative_AI_FAQ.txt | Q6: What are GANs?\nA: GANs are models with two networks—generator and discriminator—that work together to produce realistic outputs.', 'path': 'Generative_AI_FAQ.txt'}), (0.5485436443629503, {'text': 'Generative_AI_FAQ.txt | Q26: Are deepfakes harmful?\nA: They can be used maliciously, but also have valid applications in entertainment.', 'path': 'Generative_AI_FAQ.txt'}), (0.5558175537684329, {'text': 'Generative_AI_FAQ.txt | ', 'path': 'Generative_AI_FAQ.txt'}), (0.5777062333924782, {'text': 'Generative_AI_FAQ.txt | Q22: What is AI-generated art?\nA: Artwork created by AI models trained on visual data to generate creative visuals.', 'path': 'Generative_AI_FAQ.txt'})]
Pada titik ini, saya mendorong Anda untuk bereksperimen dengan berbagai tindakan, seperti MANHATTAN
dan menggunakan berbagai file untuk bekerja dengan vektor dan pencarian semantik.
Berikutnya
Dalam postingan blog tindak lanjut, kami akan melanjutkan dan menambahkan fungsionalitas untuk berkomunikasi dengan LLM lokal guna mengembangkan aplikasi RAG.
Seperti biasa, kode sumber tersedia di GitHub.
[ad_2]