Artikel ini meneroka pelaksanaan sistem menjawab soalan yang mudah tetapi berkesan yang menggabungkan model berasaskan transformer moden. Sistem ini menggunakan T5 (Pengubah Pemindahan Teks ke Teks) untuk penjanaan jawapan dan Pengubah Ayat untuk pemadanan persamaan semantik.
Dalam artikel saya sebelum ini, saya menerangkan cara mencipta API terjemahan mudah dengan antara muka web menggunakan model LLM asas percuma. Kali ini, mari kita terjun ke dalam membina sistem Retrieval-Augmented Generation (RAG) menggunakan model LLM berasaskan transformer percuma dan pangkalan pengetahuan.
RAG (Retrieval-Augmented Generation) ialah teknik yang menggabungkan dua komponen utama:
Pendapatan semula: Mula-mula, ia mencari melalui pangkalan pengetahuan (seperti dokumen, pangkalan data, dll.) untuk mencari maklumat yang berkaitan untuk pertanyaan yang diberikan. Ini biasanya melibatkan:
Penjanaan: Kemudian ia menggunakan model bahasa (seperti T5 dalam kod kami) untuk menjana respons melalui:
Menggabungkan maklumat yang diambil dengan soalan asal
Mencipta respons bahasa semula jadi berdasarkan konteks ini
Dalam kod:
Kebaikan RAG:
Pelaksanaan terdiri daripada kelas SimpleQASystem yang mengatur dua komponen utama:
Anda boleh memuat turun versi terkini kod sumber di sini: https://github.com/alexander-uspenskiy/rag_project
Panduan ini akan membantu anda menyediakan projek Retrieval-Augmented Generation (RAG) anda pada kedua-dua macOS dan Windows.
Untuk macOS:
Pasang Homebrew (jika belum dipasang):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Pasang Python 3.8 menggunakan Homebrew
bru pasang python@3.10
Untuk Windows:
Muat turun dan pasang Python 3.8 daripada python.org
Pastikan anda menyemak “Tambah Python pada PATH” semasa pemasangan
macOS:
mkdir RAG_project
cd RAG_project
Tingkap:
mkdir RAG_project
cd RAG_project
Langkah 2: Sediakan Persekitaran Maya
macOS:
python3 -m venv venv
sumber venv/bin/activate
Tingkap:
python -m venv venv
venvScriptsactivate
**Komponen Teras
def __init__(self): self.model_name = 't5-small' self.tokenizer = T5Tokenizer.from_pretrained(self.model_name) self.model = T5ForConditionalGeneration.from_pretrained(self.model_name) self.encoder = SentenceTransformer('paraphrase-MiniLM-L6-v2')
Sistem dimulakan dengan dua model utama:
T5-kecil: Versi model T5 yang lebih kecil untuk menjana jawapan
paraphrase-MiniLM-L6-v2: Model pengubah ayat untuk pengekodan teks kepada vektor yang bermakna
2. Penyediaan Set Data
def prepare_dataset(self, data: List[Dict[str, str]]): self.answers = [item['answer'] for item in data] self.answer_embeddings = [] for answer in self.answers: embedding = self.encoder.encode(answer, convert_to_tensor=True) self.answer_embeddings.append(embedding)
Fasa penyediaan set data:
1. Pemprosesan Soalan
Apabila pengguna menyerahkan soalan, sistem mengikut langkah berikut:
Penjanaan Benam: Soalan ditukar kepada perwakilan vektor menggunakan model pengubah ayat yang sama digunakan untuk jawapan.
Carian Semantik: Sistem mencari jawapan tersimpan yang paling relevan dengan:
2. Penjanaan Jawapan
def get_answer(self, question: str) -> str: # ... semantic search logic ... input_text = f"Given the context, what is the answer to the question: {question} Context: {context}" input_ids = self.tokenizer(input_text, max_length=512, truncation=True, padding='max_length', return_tensors='pt').input_ids outputs = self.model.generate(input_ids, max_length=50, num_beams=4, early_stopping=True, no_repeat_ngram_size=2
Proses penjanaan jawapan:
3. Jawapan Pembersihan
def __init__(self): self.model_name = 't5-small' self.tokenizer = T5Tokenizer.from_pretrained(self.model_name) self.model = T5ForConditionalGeneration.from_pretrained(self.model_name) self.encoder = SentenceTransformer('paraphrase-MiniLM-L6-v2')
Anda boleh memuat turun versi terbaharu kod sumber di sini: https://github.com/alexander-uspenskiy/rag_project
def prepare_dataset(self, data: List[Dict[str, str]]): self.answers = [item['answer'] for item in data] self.answer_embeddings = [] for answer in self.answers: embedding = self.encoder.encode(answer, convert_to_tensor=True) self.answer_embeddings.append(embedding)
Sistem secara eksplisit menggunakan CPU untuk mengelakkan masalah ingatan
Pembenaman ditukar kepada tensor CPU apabila diperlukan
Panjang input terhad kepada 512 token
Contoh Penggunaan
def get_answer(self, question: str) -> str: # ... semantic search logic ... input_text = f"Given the context, what is the answer to the question: {question} Context: {context}" input_ids = self.tokenizer(input_text, max_length=512, truncation=True, padding='max_length', return_tensors='pt').input_ids outputs = self.model.generate(input_ids, max_length=50, num_beams=4, early_stopping=True, no_repeat_ngram_size=2
Jalankan di terminal
Skalabiliti:
Pelaksanaan semasa menyimpan semua benam dalam ingatan
Boleh dipertingkatkan dengan pangkalan data vektor untuk aplikasi berskala besar
Kualiti Jawapan:
Sangat bergantung pada kualiti set data jawapan yang disediakan
Terhad oleh tetingkap konteks T5-small
Boleh mendapat manfaat daripada pengesahan jawapan atau pemarkahan keyakinan
Prestasi:
Pelaksanaan ini menyediakan asas yang kukuh untuk sistem menjawab soalan, menggabungkan kekuatan carian semantik dan penjanaan teks berasaskan transformer. Jangan ragu untuk bermain dengan parameter model (seperti max_length, num_beams, early_stopping, no_repeat_ngram_size, dll) untuk mencari cara yang lebih baik untuk mendapatkan jawapan yang lebih koheren dan stabil. Walaupun terdapat ruang untuk penambahbaikan, pelaksanaan semasa menawarkan keseimbangan yang baik antara kerumitan dan fungsi, menjadikannya sesuai untuk tujuan pendidikan dan aplikasi kecil hingga sederhana.
Selamat mengekod!
Atas ialah kandungan terperinci Cara Mencipta RAG Anda Sendiri dengan Model LLM Percuma dan Pangkalan Pengetahuan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!