Menerapkan Retrieval Augmented Generation (RAG): Panduan Langsung!

Kredit Gambar: https://arxiv.org/abs/2402.19473

Model bahasa besar (LLM) menjadi tulang punggung sebagian besar organisasi saat ini karena seluruh dunia sedang melakukan transisi menuju AI. Meskipun LLM sangat bagus dan menjadi tren karena alasan-alasan positif, LLM juga memiliki beberapa kelemahan jika tidak digunakan dengan benar. Ya, LLM terkadang dapat menghasilkan respons yang tidak diharapkan, bisa jadi palsu, informasi yang dibuat-buat, atau bahkan bias. Hal ini dapat terjadi karena berbagai alasan. Kami menyebut proses menghasilkan informasi yang salah oleh LLM sebagai halusinasi.

Ada beberapa pendekatan penting untuk mengurangi halusinasi LLM seperti fine-tuning, rekayasa cepat, retrieval augmented generation (RAG), dll. Retrieval augmented generation (RAG) telah menjadi pendekatan yang paling banyak dibicarakan dalam mengurangi halusinasi yang dihadapi oleh model bahasa yang besar.

Mari kita bahas lebih dalam tentang cara kerja RAG melalui implementasi langsung menggunakan SingleStore sebagai database vektor untuk menyimpan data vektor.

Apa yang dimaksud dengan Retrieval Augmented Generation (RAG)?

Model Bahasa Besar (LLM) terkadang menghasilkan jawaban yang berhalusinasi dan salah satu teknik untuk mengurangi halusinasi ini adalah dengan RAG. Untuk sebuah pertanyaan pengguna, RAG cenderung mengambil informasi dari sumber/informasi/data yang telah disediakan yang disimpan di dalam database vektor. Basis data vektor adalah basis data yang merupakan basis data khusus selain basis data tradisional di mana data vektor disimpan.

Data vektor berbentuk penyematan yang menangkap konteks dan makna dari objek. Sebagai contoh, bayangkan sebuah skenario di mana Anda ingin mendapatkan respons khusus dari aplikasi AI Anda.

Pertama, dokumen organisasi diubah menjadi embeddings melalui model penyematan dan disimpan dalam database vektor. Ketika sebuah kueri dikirim ke aplikasi AI, kueri tersebut akan diubah menjadi penyematan kueri vektor dan melewati basis data vektor untuk menemukan objek yang paling mirip dengan pencarian kemiripan vektor. Dengan cara ini, aplikasi Anda yang didukung LLM tidak berhalusinasi karena Anda telah menginstruksikannya untuk memberikan respons khusus dan diumpankan dengan data khusus.

Salah satu kasus penggunaan sederhana adalah aplikasi dukungan pelanggan, di mana data khusus diumpankan ke aplikasi yang disimpan dalam basis data vektor dan ketika ada pertanyaan dari pengguna, aplikasi ini akan memberikan respons yang paling tepat terkait dengan produk atau layanan Anda dan bukannya jawaban umum. Dengan cara ini, RAG merevolusi banyak bidang lain di dunia.

Pipa RAG

Pipeline RAG pada dasarnya melibatkan tiga komponen penting: Komponen pengambilan, komponen Augmentasi, komponen Pembangkitan.

  • Pengambilan: Komponen ini membantu Anda mengambil informasi yang relevan dari basis pengetahuan eksternal seperti basis data vektor untuk setiap pertanyaan pengguna. Komponen ini sangat penting karena ini adalah langkah pertama dalam mengkurasi tanggapan yang bermakna dan sesuai konteks.
  • Augmentasi: Bagian ini melibatkan peningkatan dan penambahan konteks yang lebih relevan pada respons yang diambil untuk kueri pengguna.
  • Pembuatan: Akhirnya, hasil akhir disajikan kepada pengguna dengan bantuan model bahasa besar (LLM). LLM menggunakan pengetahuannya sendiri dan konteks yang disediakan dan menghasilkan respons yang tepat untuk pertanyaan pengguna.

Ketiga komponen ini adalah dasar dari pipeline RAG untuk membantu pengguna mendapatkan respons yang kaya konteks dan akurat yang mereka cari. Itulah alasan mengapa RAG sangat istimewa dalam hal membangun chatbot, sistem penjawab pertanyaan, dll.

Tutorial RAG

Mari kita buat aplikasi AI sederhana yang dapat mengambil informasi yang relevan secara kontekstual dari data kita sendiri untuk setiap permintaan pengguna.

Daftar ke database SingleStore untuk menggunakannya sebagai database vektor kita.

Setelah mendaftar, Anda perlu membuat ruang kerja. Mudah dan gratis, jadi lakukanlah.


Setelah Anda membuat ruang kerja, buatlah basis data dengan nama apa pun yang Anda inginkan.


Seperti yang dapat Anda lihat dari gambar di atas, Anda dapat membuat database dari tab 'Create Database' di sisi kanan.

Sekarang, mari kita pergi ke 'Develop' untuk menggunakan fitur Notebooks kami [seperti halnya Jupyter Notebooks]


Buat Notebook baru dan beri nama sesuai keinginan Anda.

Sebelum melakukan apa pun, pilih ruang kerja dan basis data Anda dari menu tarik-turun pada Notebook.

Sekarang, mulailah menambahkan semua cuplikan kode yang ditunjukkan di bawah ini ke dalam Notebook yang baru saja Anda buat seperti yang ditunjukkan di bawah ini.

Instal pustaka yang diperlukan

!pip install openai numpy pandas singlestoredb langchain==0.1.8 langchain-community==0.0.21 langchain-core==0.1.25 langchain-openai==0.0.6

Contoh penyematan vektor

def word_to_vector(word):
# Define some basic rules for our vector components
vector = [0] * 5 # Initialize a vector of 5 dimensions
# Rule 1: Length of the word (normalized to a max of 10 characters for simplicity)
vector[0] = len(word) / 10
# Rule 2: Number of vowels in the word (normalized to the length of the word)
vowels = 'aeiou'
vector[1] = sum(1 for char in word if char in vowels) / len(word)
# Rule 3: Whether the word starts with a vowel (1) or not (0)
vector[2] = 1 if word[0] in vowels else 0
# Rule 4: Whether the word ends with a vowel (1) or not (0)
vector[3] = 1 if word[-1] in vowels else 0
# Rule 5: Percentage of consonants in the word
vector[4] = sum(1 for char in word if char not in vowels and char.isalpha()) / len(word)
return vector
# Example usage
word = "example"
vector = word_to_vector(word)
print(f"Word: {word}\nVector: {vector}")

Contoh kemiripan vektor

import numpy as np
def cosine_similarity(vector_a, vector_b):
# Calculate the dot product of vectors
dot_product = np.dot(vector_a, vector_b)
# Calculate the norm (magnitude) of each vector
norm_a = np.linalg.norm(vector_a)
norm_b = np.linalg.norm(vector_b)
# Calculate cosine similarity
similarity = dot_product / (norm_a * norm_b)
return similarity
# Example usage
word1 = "example"
word2 = "sample"
vector1 = word_to_vector(word1)
vector2 = word_to_vector(word2)
# Calculate and print cosine similarity
similarity_score = cosine_similarity(vector1, vector2)
print(f"Cosine similarity between '{word1}' and '{word2}': {similarity_score}")

Model penyematan

OPENAI_KEY = "INSERT OPENAI KEY"
from openai import OpenAI
client = OpenAI(api_key=OPENAI_KEY)
def openAIEmbeddings(input):
response = client.embeddings.create(
input="input",
model="text-embedding-3-small"
)
return response.data[0].embedding
print(openAIEmbeddings("Golden Retreiver"))

Membuat basis data vektor dengan SingleStoreDB

Kita akan menggunakan kerangka kerja LangChain, SingleStore sebagai basis data vektor untuk menyimpan embedding kita dan tautan file .txt publik yang berisi tentang kisah-kisah rumah Sherlock.

Tambahkan kunci API OpenAI sebagai variabel lingkungan.

import os
os.environ['OPENAI_API_KEY'] = ‘mention your openai api key’

Selanjutnya, impor pustaka, sebutkan file yang ingin Anda gunakan dalam contoh, muat file, pisahkan, dan tambahkan konten file ke dalam basis data SingleStore. Terakhir, tanyakan kueri yang terkait dengan dokumen yang Anda gunakan.

import openai
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders import TextLoader
from langchain_community.embeddings import OpenAIEmbeddings
from langchain_community.vectorstores.singlestoredb import SingleStoreDB
import os
import pandas as pd
import requests
# URL of the public .txt file you want to use
file_url = "https://sherlock-holm.es/stories/plain-text/stud.txt"
# Send a GET request to the file URL
response = requests.get(file_url)
# Proceed if the file was successfully downloaded
if response.status_code == 200:
file_content = response.text
# Save the content to a file
file_path = 'downloaded_example.txt'
with open(file_path, 'w', encoding='utf-8') as f:
f.write(file_content)
# Now, you can proceed with your original code using 'downloaded_example.txt'
# Load and process documents
loader = TextLoader(file_path) # Use the downloaded document
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=2000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
# Generate embeddings and create a document search database
OPENAI_KEY = "add your openai key" # Replace with your OpenAI API key
embeddings = OpenAIEmbeddings(api_key=OPENAI_KEY)
# Create Vector Database
vector_database = SingleStoreDB.from_documents(docs, embeddings, table_name="scarlet") # Replace "your_table_name" with your actual table name
query = "which university did he study?"
docs = vector_database.similarity_search(query)
print(docs[0].page_content)
else:
print("Failed to download the file. Please check the URL and try again.")

Setelah menjalankan kode di atas, Anda akan melihat sebuah tab untuk memasukkan query/pertanyaan yang ingin Anda tanyakan mengenai cerita Sherlock Holmes yang telah kami referensikan.

Kami mengambil informasi yang relevan dari data yang disediakan dan kemudian menggunakan informasi ini untuk memandu proses pembuatan tanggapan. Dengan mengubah file kami menjadi embeddings dan menyimpannya di database SingleStore, kami menciptakan korpus informasi yang dapat diambil. Dengan cara ini, kami memastikan bahwa tanggapan tidak hanya relevan tetapi juga kaya akan konten yang berasal dari kumpulan data yang disediakan.

Cerita ini diterbitkan di bawah Publikasi AI Generatif.

Terhubung dengan kami di Substack, LinkedIn, dan Zeniteq untuk terus mendapatkan informasi terbaru tentang kisah-kisah AI. Mari kita bentuk masa depan AI bersama!

Comments