AGI ja tulevaisuuden AI

Rerankkerien ja kahden vaiheen hakujen voima Retrieval Augmented Generationissa

mm
Lisää Unite.AI suosikkilähteisiisi Google-palvelussa

Kun on kyse luonnollisen kielen prosessoinnista ja tiedon hakemisesta, on tärkeää pystyä hakemaan relevanttia tietoa tehokkaasti ja tarkasti. Kun ala jatkaa kehittymistään, kehitetään uusia tekniikoita ja menetelmiä parantamaan hakujärjestelmien suorituskykyä, erityisesti Retrieval Augmented Generation (RAG) -yhteydessä. Yksi tällainen tekniikka, jota kutsutaan kahden vaiheen hakujen ja rerankkerien käyttämiseksi, on noussut voimakkaaksi ratkaisuksi perinteisten hakumenetelmien sisäänrakennettuihin rajoituksiin.

Tässä artikkelissa keskustelemme kahden vaiheen hakujen ja rerankkerien yksityiskohtia, tutkimme niiden perussääntöjä, toteutusstrategioita ja niiden tarjoamia etuja RAG-järjestelmien tarkkuuden ja tehokkuuden parantamiseksi. Tarjoamme myös käytännön esimerkkejä ja koodinpätkiä havainnollistamaan käsitteitä ja helpottamaan syvemmän ymmärryksen tätä viimeisintä tekniikkaa.

Ymmärtäminen Retrieval Augmented Generation (RAG)

swe agent LLM

Ennen kuin tutustumme kahden vaiheen hakujen ja rerankkerien yksityiskohtiin, käymme lyhyesti läpi Retrieval Augmented Generation (RAG) -käsitteen. RAG on tekniikka, joka laajentaa suurten kielen mallien tiedon ja kykyjä antamalla niille pääsyn ulkoisiin tietolähteisiin, kuten tietokantoihin tai asiakirjakokoelmiin. Lue lisää artikkelista “A Deep Dive into Retrieval Augmented Generation in LLM“.

Tyypillinen RAG-prosessi koostuu seuraavista vaiheista:

  1. Kysely: Käyttäjä esittää kysymyksen tai antaa ohjeen järjestelmälle.
  2. Haku: Järjestelmä kysyy vektortietokantaa tai asiakirjakokoelmaa, jotta löytää tietoa, joka on relevanttia käyttäjän kyselyyn.
  3. Täydennys: Haettu tieto yhdistetään käyttäjän alkuperäiseen kyselyyn tai ohjeeseen.
  4. Generointi: Kielen malli prosessoi täydennetyn syötteen ja generoi vastauksen, hyödyntäen ulkoista tietoa parantamaan tulosteen tarkkuutta ja kattavuutta.

Vaikka RAG on osoittautunut voimakkaaksi tekniikaksi, se ei ole ilman haasteita. Yksi avainhaasteista liittyy hakuvaiheeseen, jossa perinteiset hakumenetelmät saattavat epäonnistua löytämään relevantimmat asiakirjat, johtaen suboptimaalisiin tai epätarkkoviin vastauksiin kielen mallilta.

Kahden vaiheen hakujen ja rerankkerien tarve

Perinteiset hakumenetelmät, kuten ne, jotka perustuvat avainsanamatchingiin tai vektoritilaan, usein kamppailevat kiinniottamaan hienostuneet semanttiset suhteet kyselyiden ja asiakirjojen välillä. Tämä rajoitus voi johtaa siihen, että haetaan asiakirjoja, jotka ovat vain pintapuolisesti relevantteja tai puuttuvat tärkeitä tietoja, jotka voivat parantaa merkittävästi generoituja vastauksia.

Tätä haastetta vastaan tutkijat ja käytännön soveltajat ovat kääntyneet kahden vaiheen hakujen ja rerankkerien puoleen. Tämä lähestymistapa koostuu kahdesta vaiheesta:

  1. Alkuperäinen haku: Ensimmäisessä vaiheessa haetaan suhteellisen suuri joukko potentiaalisesti relevantteja asiakirjoja nopealla ja tehokkaalla hakumenetelmällä, kuten vektoritila- tai avainsanaperusteisella haulla.
  2. Reranking: Toisessa vaiheessa käytetään sofistikoituneempaa reranking-mallia järjestämään alkuperäisesti haetut asiakirjat uudelleen niiden relevanttiuden perusteella, tuomalla relevantimmat asiakirjat listan yläosaan.

Reranking-malli, usein neuroverkko tai transformer-pohjainen arkkitehtuuri, on erityisesti koulutettu arvioimaan asiakirjan relevanttia kyselyyn. Hyödyntämällä edistyneitä luonnollisen kielen ymmärtämiskykyjä, reranker voi kiinniottaa semanttiset nuansen ja kontekstuaaliset suhteet kyselyiden ja asiakirjojen välillä, johtaa tarkempaan ja relevantimpaan rankingiin.

Kahden vaiheen hakujen ja rerankkerien hyödyt

Kahden vaiheen hakujen ja rerankkerien käyttöönotto tarjoaa useita merkittäviä hyötyjä RAG-järjestelmissä:

  1. Parannettu tarkkuus: Rerankkauksen jälkeen haetut asiakirjat ja niiden relevanttien asiakirjojen edistäminen listan yläosaan voi parantaa kielen mallin generoimien vastauksien laatua.
  2. Vähennetty ulkopuolinen ongelma: Perinteiset hakumenetelmät perustuvat usein yleispäteviin tekstikorpuksiin, jotka eivät välttämättä kiinniota alan spesifejä kieltä ja semantiikkaa. Reranking-mallit voidaan kouluttaa alan spesifeille tiedoille, mikä vähentää “ulkopuolista” ongelmaa ja parantaa haettujen asiakirjojen relevanttia alan sisällä.
  3. Skalautuvuus: Kahden vaiheen lähestymistapa mahdollistaa tehokkaan skaalautuvuuden hyödyntämällä nopeita ja kevyitä hakumenetelmiä alkuvaiheessa ja varaten enemmän laskentaresursseja reranking-prosessille.
  4. Joustavuus: Reranking-mallit voidaan vaihtaa tai päivittää itsenäisesti alkuperäisestä hakumenetelmästä, tarjoten joustavuutta ja sopeutumiskykyä järjestelmän kehittyviin tarpeisiin.

ColBERT: Tehokas ja vaikuttava myöhäinen interaktio

Yksi merkittävä malli reranking-alalla on ColBERT (Contextualized Late Interaction over BERT). ColBERT on asiakirjan reranking-malli, joka hyödyntää BERTin syvät kielen ymmärtämiskykyjä ja esittelee uuden interaktiomekanismin, jota kutsutaan “myöhäiseksi interaktioksi”.

ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT

ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT

ColBERTin myöhäinen interaktiomekanismi mahdollistaa tehokkaan ja tarkan hakutoiminnan prosessoiden kyselyjä ja asiakirjoja erikseen loppuvaiheessa. Nimenomaan ColBERT koodaa kyselyn ja asiakirjan itsenäisesti BERTin avulla ja käyttää kevyttä mutta voimakasta interaktiovaihetta, joka mallintaa niiden hienojakoisia yhtäläisyyksiä. Viivästämällä mutta säilyttämällä tämän hienojakoiset interaktiot, ColBERT voi hyödyntää syvien kielen mallien ilmaisukykyä ja samalla saavuttaa edun, joka johtuu asiakirjamuotojen ennakkokäsittelystä, mikä merkittävästi nopeuttaa kyselyprosessia.

ColBERTin myöhäinen interaktioarkkitehtuuri tarjoaa useita etuja, kuten parannetun laskennallisen tehokkuuden, skaalautuvuuden asiakirjakokoelman koossa ja soveltamiskelpoisuuden käytännön tilanteissa. Lisäksi ColBERT on edelleen kehitetty tekniikoilla, kuten melun vaimennuksella ja residuaalipakkaamisella (ColBERTv2), jotka tarkentavat koulutusprosessia ja vähentävät mallin tilanjälkeä säilyttäen samalla korkean hakutehokkuuden.

Kahden vaiheen hakujen ja rerankkerien toteuttaminen

Nyt, kun olemme ymmärtäneet kahden vaiheen hakujen ja rerankkerien periaatteita, tutustumme niiden käytännön toteutukseen RAG-järjestelmässä. Hyödynnämme suosittuja kirjastoja ja kehyksiä esittämään näiden tekniikoiden integrointia.

Ympäristön asettaminen

Ennen kuin ryhdymme koodaamaan, asetamme kehitysympäristön. Käytämme Pythonia ja useita suosittuja NLP-kirjastoja, kuten Hugging Face Transformers, Sentence Transformers ja LanceDB.

# Asenna tarvittavat kirjastot
!pip install datasets huggingface_hub sentence_transformers lancedb

Datavalmistelu

Esimerkkinä käytämme “ai-arxiv-chunked” -tietojoukkoa Hugging Face Datasetsista, joka sisältää yli 400 ArXiv-artikkelia koneoppimisesta, luonnollisen kielen prosessoinnista ja suurista kielen malleista.

from datasets import load_dataset

<p>dataset = load_dataset(&quot;jamescalam/ai-arxiv-chunked&quot;, split=&quot;train&quot;)</p>

&amp;lt;pre&amp;gt;

Seuraavaksi prosessoidaan dataa ja jaetaan se pienempiin osiin, jotta haku ja prosessointi olisivat tehokkaita.

from transformers import AutoTokenizer

<p>tokenizer = AutoTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)</p>

<p>def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors=&quot;pt&quot;, truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts</p>

<p>chunked_data = []
for doc in dataset:
text = doc[&quot;chunk&quot;]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)</p>

Alkuvaiheessa käytämme Sentence Transformer -mallia koodataksesi asiakirjamme ja kyselymme tiheiksi vektorimuotoisiksi edustuksiksi ja suorittamaan lähimmän naapurin hakua vektortietokannan avulla, kuten LanceDB.

from sentence_transformers import SentenceTransformer
from lancedb import lancedb

<p># Lataa Sentence Transformer -malli
model = SentenceTransformer(&#039;all-MiniLM-L6-v2&#039;)</p>

<p># Luo LanceDB-vektoritietokanta
db = lancedb.lancedb(&#039;/path/to/store&#039;)
db.create_collection(&#039;docs&#039;, vector_dimension=model.get_sentence_embedding_dimension())</p>

<p># Indeksoi asiakirjat
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document(&#039;docs&#039;, vector, text)</p>

<p>from sentence_transformers import SentenceTransformer
from lancedb import lancedb</p>

<p># Lataa Sentence Transformer -malli
model = SentenceTransformer(&#039;all-MiniLM-L6-v2&#039;)</p>

<p># Luo LanceDB-vektoritietokanta
db = lancedb.lancedb(&#039;/path/to/store&#039;)
db.create_collection(&#039;docs&#039;, vector_dimension=model.get_sentence_embedding_dimension())</p>

<p># Indeksoi asiakirjat
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document(&#039;docs&#039;, vector, text)

Kun asiakirjat on indeksoitu, voidaan suorittaa alkuperäinen haku etsimällä lähimmät naapurit annetulle kyselyvektorille.

from transformers import AutoTokenizer

<p>tokenizer = AutoTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)</p>

<p>def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors=&quot;pt&quot;, truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts</p>

<p>chunked_data = []
for doc in dataset:
text = doc[&quot;chunk&quot;]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)

Reranking

Alkuperäisen hakuvaiheen jälkeen käytämme reranking-mallia järjestämään haetut asiakirjat uudelleen niiden relevanttia kyselyyn. Tässä esimerkissä käytämme ColBERT-rerankkeria, nopeaa ja tarkkaa transformer-pohjaista mallia, joka on suunniteltu asiakirjojen järjestämiseen.

from lancedb.rerankers import ColbertReranker

reranker = ColbertReranker()

<p># Rerankkaa alkuperäiset asiakirjat
reranked_docs = reranker.rerank(query, initial_docs)

reranked_docs -lista sisältää nyt asiakirjat, jotka on järjestetty uudelleen niiden relevanttia kyselyyn, kuten ColBERT-reranker on määrittänyt.

Täydennys ja generointi

Kun rerankatut ja relevantit asiakirjat on saatavilla, voidaan jatkaa täydennys- ja generointivaiheisiin RAG-pipelineen. Käytämme kielen mallia Hugging Face Transformers -kirjastosta generoimaan lopullisen vastauksen.

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

<p>tokenizer = AutoTokenizer.from_pretrained(&quot;t5-base&quot;)
model = AutoModelForSeq2SeqLM.from_pretrained(&quot;t5-base&quot;)</p>

<p># Täydennä kysely rerankatuilla asiakirjoilla
augmented_query = query + &quot; &quot; + &quot; &quot;.join(reranked_docs[:3])</p>

<p># Generoi vastaus kielen mallilla
input_ids = tokenizer.encode(augmented_query, return_tensors=&quot;pt&quot;)
output_ids = model.generate(input_ids, max_length=500)
response = tokenizer.decode(output_ids[0], skip_special_tokens=True)</p>

print(response)

Yllä oleva koodipätkä esittää, miten jina-colbert-v1-en-mallia voidaan konfiguroida ja käyttää asiakirjojen indeksointiin, hyödyntäen sen kykyä käsitellä pitkiä konteksteja tehokkaasti.

Edistyneet tekniikat ja huomioon otettavat seikat

Vaikka toteutus, jonka esittelimme, tarjoaa vankkan perustan kahden vaiheen hakujen ja rerankkerien integroimiseksi, on useita edistyneitä tekniikoita ja huomioon otettavia seikkoja, jotka voivat edelleen parantaa lähestymistapaa.

  1. Kyselyn laajennus: Alkuperäisen hakuvaiheen parantamiseksi voidaan käyttää kyselyn laajennusmenetelmiä, jotka liittävät alkuperäiseen kyselyyn liittyviä termejä tai lauseita. Tämä voi auttaa hakemaan monipuolisemman joukon potentiaalisesti relevantteja asiakirjoja.
  2. Rerankkerien yhdistäminen: Sen sijaan, että luotaisiin yhteen reranking-malliin, voidaan yhdistää useita rerankkereita yhdistelmäksi, joka hyödyntää eri mallien vahvuuksia parantamaan kokonaisuuden suorituskykyä.
  3. Rerankkerien hienosäätö: Vaikka esikoulutetut reranking-mallit voivat olla tehokkaita, niiden hienosäätö alakohtaisilla tiedoilla voi edelleen parantaa niiden kykyä kiinniottaa alakohtaisia semantiikkaa ja relevanttia signaaleja.
  4. Toistuva haku ja reranking: Joidenkin tapausten osalta yksittäinen hakuvaihe ja reranking-ehto eivät riitä. Voidaan tutkia toistuvia lähestymistapoja, joissa kielen mallin tulostus käytetään kyselyn ja hakuprosessin tarkentamiseen, johtaen dynaamisempaan ja vuorovaikutteisempaan järjestelmään.
  5. Relevanttia ja monipuolisuuden tasapaino: Vaikka rerankkerit pyrkivät edistämään relevantimpia asiakirjoja, on tärkeää löytää tasapaino relevanttia ja monipuolisuuden välillä. Monipuolisuuden edistävien tekniikoiden sisällyttäminen voi auttaa estämään järjestelmän liian kapean tai vääristyneen näkemyksen tiedonlähteistä.
  6. Arviointimittarit: Kahden vaiheen hakujen ja rerankkerien lähestymistapaa arvioitaessa on määritettävä sopivat arviointimittarit. Nämä voivat käsittää perinteisiä informaatiohakumittareita, kuten tarkkuutta, palautuskykyä ja keskimääräistä kääntöväliä (MRR), sekä tehtäväkohtaisia mittareita, jotka on suunniteltu käyttökohteeseen.

Johtopäätös

Retrieval Augmented Generation (RAG) on osoittautunut voimakkaaksi tekniikaksi suurten kielen mallien kykyjen laajentamiseksi ulkoisten tietolähteiden avulla. Perinteiset hakumenetelmät kuitenkin usein kamppailevat löytämään relevantimmat asiakirjat, johtaen suboptimaalisiin suorituksiin.

Kahden vaiheen haku ja rerankkerit tarjoavat houkuttelevan ratkaisun tähän haasteeseen. Yhdistämällä nopean alkuperäisen hakuvaiheen ja sofistikoituneemman reranking-mallin, tämä lähestymistapa voi merkittävästi parantaa haettujen asiakirjojen tarkkuutta ja relevanttia, johtaen lopulta laadukkaampiin generoituun vastauksiin kielen mallilta.

Olen viettänyt viimeiset viisi vuotta uppoutumalla kiinnostavaan koneoppimisen ja syvän oppimisen maailmaan. Minun intohimoni ja asiantuntemukseni ovat johtaneet minun osallistumiseen yli 50:een monipuoliseen ohjelmistosuunnitteluhankkeeseen, joissa on erityisesti painottunut AI/ML. Minun jatkuva uteliaisuuteni on myös ohjannut minun luontaisen kielen prosessoinnin pariin, jota haluan tutkia tarkemmin.