Kalbant apie natūralios kalbos apdorojimą (NLP) ir informacijos gavimą, svarbiausia yra galimybė efektyviai ir tiksliai gauti atitinkamą informaciją. Sričiai ir toliau tobulėjant, kuriami nauji metodai ir metodikos, skirtos pagerinti paieškos sistemų veikimą, ypač atsižvelgiant į Atkūrimo papildyta karta (SKUDRAS). Vienas iš tokių metodų, žinomas kaip dviejų etapų paieška su perreitinguotojais, pasirodė kaip galingas sprendimas sprendžiant būdingus tradicinių paieškos metodų apribojimus.
Šiame išsamiame tinklaraščio įraše gilinsimės į dviejų etapų paieškos ir pervertinimo sudėtingumą, išnagrinėsime jų pagrindinius principus, įgyvendinimo strategijas ir jų teikiamą naudą didinant RAG sistemų tikslumą ir efektyvumą. Taip pat pateiksime praktinių pavyzdžių ir kodo fragmentų, iliustruojančių sąvokas ir palengvinančius šios pažangiausios technikos supratimą.
Išplėstinės kartos (RAG) supratimas
Prieš pasinerdami į dviejų etapų paieškos ir reitingavimo specifiką, trumpai peržvelkime išplėstinės kartos paieškos (RAG) koncepciją. RAG yra metodas, praplečiantis didelių kalbų modelių (LLM) žinias ir galimybes, suteikiant jiems prieigą prie išorinių informacijos šaltinių, tokių kaip duomenų bazės ar dokumentų rinkiniai. Daugiau skaitykite straipsnyje "Gilus pasinerimas į papildytą kartą LLM".
Įprastas RAG procesas apima šiuos veiksmus:
- Užklausa: vartotojas užduoda klausimą arba pateikia nurodymus sistemai.
- Atsiėmimas: sistema pateikia užklausą vektorinėje duomenų bazėje arba dokumentų rinkinyje, kad surastų informaciją, susijusią su vartotojo užklausa.
- padidėjimas: gauta informacija sujungiama su pradine vartotojo užklausa ar instrukcija.
- Karta: Kalbos modelis apdoroja papildytą įvestį ir generuoja atsaką, panaudodamas išorinę informaciją, kad padidintų jos išvesties tikslumą ir išsamumą.
Nors RAG pasirodė esanti galinga technika, ji nėra be iššūkių. Viena iš pagrindinių problemų slypi paieškos etape, kai tradiciniais paieškos metodais gali nepavykti nustatyti svarbiausių dokumentų, todėl kalbos modelio atsakymai gali būti neoptimalūs arba netikslūs.
Dviejų etapų paieškos ir pakartotinio reitingavimo poreikis
Tradiciniai paieškos metodai, pvz., pagrįsti raktinių žodžių atitikimu arba vektorinės erdvės modeliais, dažnai stengiasi užfiksuoti niuansuotus semantinius ryšius tarp užklausų ir dokumentų. Dėl šio apribojimo gali būti išieškomi tik paviršutiniškai svarbūs dokumentai arba gali būti praleista svarbi informacija, galinti žymiai pagerinti sugeneruoto atsakymo kokybę.
Siekdami išspręsti šį iššūkį, mokslininkai ir praktikai pradėjo dviejų etapų paiešką su pertvarkytojais. Šis metodas apima dviejų etapų procesą:
- Pradinis paėmimas: Pirmajame etape, naudojant greitą ir efektyvų paieškos metodą, pvz., vektorinės erdvės modelį arba raktažodžiu pagrįstą paiešką, gaunamas gana didelis potencialiai svarbių dokumentų rinkinys.
- Perskirstymas: Antrajame etape naudojamas sudėtingesnis perskirstymo modelis, kad iš pradžių gauti dokumentai būtų pertvarkyti pagal jų atitikimą užklausai, todėl svarbiausi dokumentai iškeliami į sąrašo viršų.
Perskirstymo modelis, dažnai neuroninis tinklas arba transformatoriumi pagrįsta architektūra, yra specialiai išmokytas įvertinti dokumento tinkamumą tam tikrai užklausai. Naudodamas pažangias natūralios kalbos supratimo galimybes, perreitinguotojas gali užfiksuoti semantinius niuansus ir kontekstinius ryšius tarp užklausos ir dokumentų, todėl reitingas bus tikslesnis ir tinkamesnis.
Dviejų etapų paieškos ir pakartotinio reitingavimo pranašumai
Dviejų etapų paieškos su perreitinguotojais pritaikymas suteikia keletą reikšmingų pranašumų RAG sistemų kontekste:
- Patobulintas tikslumas: Perskirstydama iš pradžių gautus dokumentus ir iškeldama pačius aktualiausius į viršų, sistema gali pateikti tikslesnę ir tikslesnę informaciją kalbos modeliui, todėl sugeneruoti atsakymai bus kokybiškesni.
- Sušvelnintos už domeno ribų esančios problemos: Įterpimo modeliai, naudojami tradiciniam paieškai, dažnai mokomi bendrosios paskirties teksto korpusuose, kurie gali tinkamai neužfiksuoti konkrečios srities kalbos ir semantikos. Kita vertus, reitingavimo modeliai gali būti mokomi naudojant specifinius domeno duomenis, taip sumažinant „ne domeno“ problemą ir pagerinant gautų dokumentų tinkamumą specializuotose srityse.
- Mastelis: Dviejų etapų metodas leidžia efektyviai keisti mastelį, naudojant greitus ir lengvus paieškos metodus pradiniame etape, o sudėtingesnį skaičiavimo perskirstymo procesą paliekant mažesniam dokumentų pogrupiui.
- Lankstumas: Perskirstymo modelius galima keisti arba atnaujinti nepriklausomai nuo pradinio paieškos metodo, suteikiant lankstumo ir prisitaikymo prie besikeičiančių sistemos poreikių.
ColBERT: Efektyvi ir efektyvi vėlyva sąveika
Vienas iš išskirtinių modelių perskirstymo srityje yra ColBERT (Kontekstualizuota vėlyva sąveika per BERT). ColBERT yra dokumentų pervertinimo modelis, kuris išnaudoja BERT gilaus kalbos supratimo galimybes, tuo pačiu įdiegdamas naują sąveikos mechanizmą, vadinamą „vėlyva sąveika“.
ColBERT: efektyvi ir efektyvi ištraukų paieška naudojant kontekstualizuotą vėlyvą sąveiką per BERT
Vėlyvosios sąveikos mechanizmas ColBERT leidžia efektyviai ir tiksliai gauti paiešką apdorojant užklausas ir dokumentus atskirai iki paskutinių paieškos proceso etapų. Tiksliau, ColBERT savarankiškai koduoja užklausą ir dokumentą naudodamas BERT, o tada naudoja lengvą, bet galingą sąveikos veiksmą, kuris modeliuoja jų smulkų panašumą. Atidėliodama, bet išlaikydama šią smulkią sąveiką, ColBERT gali panaudoti gilios kalbos modelių išraiškingumą ir tuo pat metu įgyti galimybę iš anksto apskaičiuoti dokumentų reprezentacijas neprisijungus, o tai žymiai pagreitina užklausų apdorojimą.
Vėlyvoji ColBERT sąveikos architektūra siūlo keletą privalumų, įskaitant patobulintą skaičiavimo efektyvumą, mastelio keitimą atsižvelgiant į dokumentų rinkinio dydį ir praktinį pritaikymą realaus pasaulio scenarijams. Be to, „ColBERT“ buvo dar labiau patobulintas naudojant tokius metodus kaip pašalinta priežiūra ir liekamasis suspaudimas (ColBERTv2), kurie patobulina mokymo procesą ir sumažina modelio erdvės pėdsaką, kartu išlaikant aukštą paieškos efektyvumą.
Šis kodo fragmentas parodo, kaip sukonfigūruoti ir naudoti modelį jina-colbert-v1-en indeksuojant dokumentų rinkinį, išnaudojant jo gebėjimą efektyviai tvarkyti ilgus kontekstus.
Dviejų etapų paieškos įgyvendinimas naudojant rerankuotojus
Dabar, kai jau suprantame dviejų etapų paieškos ir reitingavimo principus, panagrinėkime jų praktinį įgyvendinimą RAG sistemos kontekste. Mes panaudosime populiarias bibliotekas ir sistemas, kad parodytume šių metodų integravimą.
Aplinkos nustatymas
Prieš pasinerdami į kodą, nustatykime kūrimo aplinką. Naudosime Python ir keletą populiarių NLP bibliotekų, įskaitant Hugging Face Transformers, Sentence Transformers ir LanceDB.
# Install required libraries
!pip install datasets huggingface_hub sentence_transformers lancedb
Duomenų paruošimas
Demonstravimo tikslais naudosime „ai-arxiv-chunked“ duomenų rinkinį iš Hugging Face Datasets, kuriame yra daugiau nei 400 ArXiv dokumentų apie mašininį mokymąsi, natūralios kalbos apdorojimą ir didelius kalbų modelius.
from datasets import load_dataset
dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")
<pre>
Tada iš anksto apdorosime duomenis ir suskirstysime į mažesnius gabalus, kad būtų lengviau gauti ir apdoroti.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors="pt", truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts
chunked_data = []
for doc in dataset:
text = doc["chunk"]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)
Pradiniame paieškos etape naudosime Sakinio transformatoriaus modelį, kad koduotume savo dokumentus ir užklausas į tankias vektorines reprezentacijas, o tada atliksime apytikslę artimiausio kaimyno paiešką naudodami vektorinę duomenų bazę, pvz., LanceDB.
from sentence_transformers import SentenceTransformer
from lancedb import lancedb
# Load Sentence Transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Create LanceDB vector store
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())
# Index documents
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', vector, text)
from sentence_transformers import SentenceTransformer
from lancedb import lancedb
# Load Sentence Transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Create LanceDB vector store
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())
# Index documents
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', vector, text)
Kai mūsų dokumentai yra indeksuoti, galime atlikti pradinę paiešką, surasdami artimiausius nurodyto užklausos vektoriaus kaimynus.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors="pt", truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts
chunked_data = []
for doc in dataset:
text = doc["chunk"]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)
Perskirstymas
Po pirminio gavimo naudosime pakartotinio reitingavimo modelį, kad gautus dokumentus pertvarkytume pagal jų atitikimą užklausai. Šiame pavyzdyje naudosime ColBERT reranker – greitą ir tikslų transformatoriaus modelį, specialiai sukurtą dokumentų reitingavimui.
from lancedb.rerankers import ColbertReranker
reranker = ColbertReranker()
# Rerank initial documents
reranked_docs = reranker.rerank(query, initial_docs)
Šios reranked_docs
Dabar sąraše yra dokumentai, pertvarkyti pagal jų svarbą užklausai, kaip nustatyta ColBERT perreitinguotojo.
Augmentacija ir generavimas
Turėdami pertvarkytus ir atitinkamus dokumentus, galime pereiti prie RAG dujotiekio papildymo ir generavimo etapų. Naudosime kalbos modelį iš Hugging Face Transformers bibliotekos, kad sukurtume galutinį atsakymą.
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
tokenizer = AutoTokenizer.from_pretrained("t5-base")
model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
# Augment query with reranked documents
augmented_query = query + " " + " ".join(reranked_docs[:3])
# Generate response from language model
input_ids = tokenizer.encode(augmented_query, return_tensors="pt")
output_ids = model.generate(input_ids, max_length=500)
response = tokenizer.decode(output_ids[0], skip_special_tokens=True)
print(response)