Tekoälyn prompt engineering · Oppitunti

Naivin RAG-menetelmän jälkeen

Perushaun rajoitukset

Oppitunti 1/413 vaihetta

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 low

Keskelle 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 chunks

Pelkkää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.id

Ei 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)            # verifiable

Mittaa 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.
Aloita maksutta

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

  1. Naivin RAG-menetelmän jälkeen
  2. Haettujen tekstiosien uudelleenjärjestäminen
  3. Kontekstin tiivistäminen
  4. Kyselyn uudelleenkirjoitus ja HyDE
← Takaisin: Tekoälyn prompt engineering