Naivin RAG-menetelmän jälkeen
Perushaun rajoitukset
Naivin RAG-menetelmän jälkeen on ilmainen Tekoälyn prompt engineering-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Tekoälyn prompt engineering-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Tekoälyn prompt engineering-kurssilla on yhteensä 4 oppituntia.
Naive RAGin toimintaperiaate
Naive RAG on lähtötason ratkaisu: pilko dokumentit chunkeiksi, muodosta niistä embeddingit, tallenna vektorit, muodosta kyselystä embedding, hae top-k kosinisamankaltaisuuden perusteella, lisää chunkit promptiin ja generoi vastaus. Se on vahva lähtökohta, mutta epäonnistuu laajassa mittakaavassa ennustettavilla tavoilla.
Näiden ongelmatilanteiden ymmärtäminen on edellytys tällä kurssilla käsiteltäville kehittyneille tekniikoille (uudelleenjärjestäminen, tiivistäminen ja kyselyn uudelleenkirjoitus).
def naive_rag(query, k=5):
q = embed(query)
chunks = vector_store.search(q, k) # top-k by cosine
context = '\n\n'.join(c.text for c in chunks)
return llm('Context:\n' + context + '\n\nQ: ' + query)Haun recall ja precision
Naivessa top-k-haussa optimoidaan raakaa vektorin samankaltaisuutta, jossa relevanssi sekoittuu pinnalliseen semanttiseen läheisyyteen. Edessä on kompromissi: pieni k voi jättää vastauksen löytymättä (heikko recall); suuri k täyttää kontekstin häiriötekijöillä (heikko precision).
Haun perustana oleva embedding-samankaltaisuus on karkea todellisen relevanssin vastine, ja se on useiden myöhempien ongelmien juurisyy.
# The core dilemma
# small k -> may miss the gold chunk (recall problem)
# large k -> distractors crowd context (precision + cost problem)
# Advanced RAG decouples 'retrieve many' from 'use few'Embeddingien yhteensopimattomuusongelma
Kyselyt ja dokumentit ovat usein eri kielellisissä rekistereissä: lyhyt kysymys ja pitkä toteava tekstikappale poikkeavat toisistaan. Bi-encoderin embeddingit voivat sijoittaa relevantin vastauksen kauas kyselystä, koska ne on muotoiltu eri tavalla (sanastojen yhteensopimattomuusongelma).
Tämä synnyttää query rewritingin ja HyDEn kaltaisia tekniikoita, jotka muokkaavat kyselyä vastaamaan dokumenttiavaruutta ennen hakua.
# Query: 'how do I revoke a token?'
# Doc: 'Token invalidation is performed via the /sessions endpoint.'
# Lexically and semantically distant -> bi-encoder may miss it
sim = cos(embed('how do I revoke a token?'),
embed('Token invalidation via /sessions')) # may be lowKeskelle hukkuvan sisällön ilmiö
Vaikka oikea chunk löytyisi haulla, monien chunkien syöttäminen aiheuttaa lost-in-the-middle-ilmiön: malli kiinnittää liian vähän huomiota pitkän kontekstin keskelle sijoitettuun sisältöön. Sijalla 3/10 oleva oikea chunk voidaan käytännössä sivuuttaa.
Tämä perustelee uudelleenjärjestämistä (parhaan chunkin sijoittaminen kohtaan, johon malli kiinnittää huomiota) ja tiivistämistä (kontekstin pienentäminen, jotta mikään ei huku).
# Retrieval rank != attention rank
# Place the highest-relevance chunk at the START or END,
# never stranded in the middle of a large concatenation.Häiriötekijöiden vaikutus
LLM:t ovat herkkiä epärelevantille kontekstille. Uskottavilta mutta vääriltä vaikuttavien chunkien lisääminen voi ohjata vastauksen väärään suuntaan, vaikka oikea chunk olisi mukana. Suurempi haettu konteksti ei ole aina parempi.
Siksi precision on tärkeää: tiivis, uudelleenjärjestetty ja tiivistetty konteksti päihittää usein suuren joukon löyhästi liittyviä chunkeja.
# Empirically: appending a single highly-similar but WRONG chunk
# can flip a previously-correct answer. RAG quality depends on
# keeping distractors OUT, not just getting the gold chunk IN.Chunkingin ongelmakohdat
Kiinteän koon chunking katkaisee ajatukset kesken lauseen, erottaa väitteen sen perusteluista ja riisuu rakenteellisen kontekstin (mikä osio, mikä dokumentti). Itsenäisenä johdonmukaiselta vaikuttava chunk voi olla ympäristöstään irrotettuna hyödytön tai harhaanjohtava.
Kehittyneissä putkissa käytetään rakenteen huomioivaa chunkingia, päällekkäisyyttä, parent-document-laajennusta ja metadataa merkityksen säilyttämiseksi.
def structure_aware_chunks(doc, max_tokens=400, overlap=50):
sections = split_by_headings(doc) # respect document structure
chunks = []
for sec in sections:
for c in sliding_window(sec.text, max_tokens, overlap):
chunks.append(Chunk(c, meta={'section': sec.title}))
return chunksPelkkään semantiikkaan perustuvan haun puutteet
Pelkkä dense-haku ei löydä tarkkaa osumaa vaativia asioita: tunnisteita, virhekoodeja, harvinaisia erisnimiä ja API-nimiä. Juuri näissä käyttäjät odottavat sanatarkkaa täsmällisyyttä. Hybridihaku yhdistää dense-haun (semanttinen) ja sparse-haun (BM25/avainsanat) signaalit kattaakseen molemmat tarpeet.
Reciprocal rank fusion on yksinkertainen ja luotettava tapa yhdistää kaksi järjestettyä listaa ilman painokertoimen säätämistä.
def rrf(dense_ranks, sparse_ranks, k0=60):
scores = {}
for ranks in (dense_ranks, sparse_ranks):
for rank, doc_id in enumerate(ranks):
scores[doc_id] = scores.get(doc_id, 0) + 1.0 / (k0 + rank)
return sorted(scores, key=scores.get, reverse=True)Vanhentunut ja varmentamaton konteksti
Naive RAG ei tunne tuoreutta eikä provenienssia. Se voi hakea vanhentuneita dokumentteja eikä tarjoa sisäänrakennettua tapaa yhdistää väitteitä lähteisiin, mikä heikentää luottamusta ja vaikeuttaa hallusinaatioiden havaitsemista.
Kehittyneet järjestelmät liittävät mukaan metadataa (aikaleima, lähde, versio), suodattavat sen perusteella ja vaativat generoijaa viittaamaan chunk-tunnisteisiin, jotta vastaukset voidaan varmentaa.
def filtered_retrieve(q, after_date):
cands = vector_store.search(embed(q), k=50)
fresh = [c for c in cands if c.meta['date'] >= after_date]
return fresh # then re-rank; generator must cite c.idEi palautetta, ei sopeutumista
Naive RAG tekee haun sokeasti: se ei huomaa, milloin haku epäonnistui, ei osaa päättää, ettei hakua tarvita, eikä pysty iteroimaan. Kehittyneissä malleissa lisätään relevanssitarkistus, ehdollinen haku ja monivaiheinen (agenttinen) haku, joka muotoilee kyselyn uudelleen, kun tulokset vaikuttavat heikoilta.
Putkesta tulee itsearvioiva silmukka yhden eteenpäinsyötön sijaan.
def adaptive_rag(q):
chunks = retrieve(q)
if relevance_score(q, chunks) < 0.4:
q2 = rewrite_query(q) # reformulate and retry
chunks = retrieve(q2)
if relevance_score(q, chunks) < 0.4:
return 'I could not find this in the sources.'
return generate(q, chunks)Edistyneen RAGin pino
Kun ongelmat kootaan yhteen, kehittynyt putki sisältää seuraavat kerrokset: rakennetietoinen chunking metadatoineen, korkean recallin hybridihaku, cross-encoderin re-ranker precisionia varten, kontekstin tiivistäminen tilan säästämiseksi ja fokuksen parantamiseksi, kyselyn uudelleenkirjoitus / HyDE yhteensopimattomuuden korjaamiseksi sekä relevanssiportti lähdeviitteineen.
Seuraavissa oppitunneissa rakennetaan kukin kerros. Kaiken läpi kulkeva periaate on: hae laajasti, suodata ja jalosta sitten tehokkaasti.
def advanced_rag(q):
cands = hybrid_retrieve(rewrite_query(q), k=50) # high recall
top = rerank(q, cands)[:8] # precision
ctx = compress(q, top) # focus + fit
return generate_with_citations(q, ctx) # verifiableMittaa ennen optimointia
Selvittäkää ensin, mikä ongelma teillä todella on, ennen kuin lisäätte monimutkaisuutta. Mitatkaa haun recall@k (löytyykö oikea chunk haulla ylipäätään) erikseen vastauksen tarkkuudesta (käyttääkö generoija sitä). Recall- ja precision-ongelmat vaativat erilaiset korjaukset.
Seuratkaa putken molempia puoliskoja; älkää lisätkö re-rankeria, jos todellinen ongelmanne on chunking tai kyselyn yhteensopimattomuus.
def diagnose(eval_set):
return {
'recall@5': recall_at_k(eval_set, k=5), # retrieval health
'recall@50': recall_at_k(eval_set, k=50), # ceiling with rerank
'answer_acc': answer_accuracy(eval_set), # generation health
}Pikatarkistus
Diagnosoikaa RAGin ongelmatilanne.
Kertaus
Keskeiset opit:
- Naive RAG (chunk, embed, top-k, lisää promptiin, generoi) on vahva lähtötaso, jossa on ennustettavia ongelmia.
- Bi-encoderin samankaltaisuus on karkea relevanssin vastine; kyselyn ja dokumentin rekisterien yhteensopimattomuus heikentää recallia.
- Suurempi konteksti ei ole parempi: häiriötekijöille herkkyys ja lost-in-the-middle-ilmiö heikentävät vastauksia, kun k kasvaa.
- Chunkingin ongelmat, pelkkään semantiikkaan perustuvan haun puutteet, vanhentuneisuus ja palautteen puute rajoittavat Naive RAGia.
- Kehittynyt RAG hakee laajasti ja suodattaa sitten: hybridihaku, uudelleenjärjestäminen, tiivistäminen, kyselyn uudelleenkirjoitus ja relevanssin tarkistus. Mitatkaa recall ja vastauksen tarkkuus erikseen ennen optimointia.
Opi Tekoälyn prompt engineering tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 53
- Oppitunnit
- 199
Usein kysytyt kysymykset
Onko oppitunti ”Naivin RAG-menetelmän jälkeen” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Tekoälyn prompt engineering-oppimispolun 3 oppituntia, myös oppitunnin “Naivin RAG-menetelmän jälkeen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Tekoälyn prompt engineering-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Naivin RAG-menetelmän jälkeen”?
Perushaun rajoitukset Harjoittelet Tekoälyn prompt engineering-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Tekoälyn prompt engineering-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Tekoälyn prompt engineering-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Naivin RAG-menetelmän jälkeen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Tekoälyn prompt engineering-oppitunnilla?
Kyllä. Jokainen Tekoälyn prompt engineering-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Naivin RAG-menetelmän jälkeen
- Haettujen tekstiosien uudelleenjärjestäminen
- Kontekstin tiivistäminen
- Kyselyn uudelleenkirjoitus ja HyDE