Tekoälyn prompt engineering · Oppitunti

Kontekstin säilyttäminen osien välillä

Jatkuvuuden varmistaminen limityksen, vierivän kontekstin ja metadatan lisäämisen avulla.

Oppitunti 4/413 vaihetta

Kontekstin säilyttäminen osien välillä on ilmainen Tekoälyn prompt engineering-oppitunti CoddyKitissä. Tämä on oppitunti 4/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.

Tekstipalat ylittävän kontekstin ongelma

Kun asiakirja jaetaan tekstipaloihin, tekstipalasta N saatetaan tarvita tietoa tekstipalan N+1 tulkitsemiseksi oikein. Esimerkiksi tekstipalassa 3 määriteltyä termiä käytetään tekstipalassa 7. Ilman kontekstin välittämistä tekstipalaa 7 käsittelevä malli ei tunne kyseistä määritelmää.

Tähän on neljä ratkaisua: limitys, jatkuvan yhteenvedon lisääminen, metatietotunnisteet ja sivunumeroihin viittaaminen.

Strategia 1: tokenien limitys

Limityksessä tekstipalan N viimeiset N tokenia toistetaan tekstipalan N+1 alussa. Näin varmistetaan, että rajan ylittävä lause tai argumentti esiintyy kokonaisena ainakin yhdessä tekstipalassa.

Tyypillinen limitys on 100–200 tokenia (noin 75–150 sanaa). Liian suuri limitys lisää toisteisuutta ja kustannuksia, kun taas liian pieni jättää aukkoja rajakohtiin.

import tiktoken

enc = tiktoken.get_encoding('cl100k_base')

def chunk_with_overlap(text, max_tokens=1000, overlap=200):
    tokens = enc.encode(text)
    chunks = []
    step = max_tokens - overlap
    i = 0
    while i < len(tokens):
        chunk = tokens[i:i + max_tokens]
        chunks.append(enc.decode(chunk))
        i += step
    return chunks

chunks = chunk_with_overlap(document, max_tokens=1000, overlap=200)
print(f'{len(chunks)} chunks with 200-token overlap')

Limitys haussa ja tiivistämisessä

Limitys toimii eri tavoin eri tehtävissä:

  • Tiedonhaku: limitys auttaa — kysely vastaa limitysalueeseen kummassa tahansa vierekkäisessä tekstipalassa, mikä parantaa kattavuutta. Käyttäkää limityksenä 10–20 % tekstipalan koosta.
  • Tiivistäminen: limitys voi aiheuttaa toistoa — sama lause tiivistetään kahdesti. Käyttäkää pienempää limitystä (5–10 %) tai poistakaa limitys ennen tiivistämistä.
def strip_overlap(chunks, overlap_tokens=200):
    '''Remove the leading overlap from each chunk (except the first).'''
    cleaned = [chunks[0]]
    for chunk in chunks[1:]:
        tokens = enc.encode(chunk)
        trimmed = enc.decode(tokens[overlap_tokens:])
        cleaned.append(trimmed)
    return cleaned

Strategia 2: Juoksevan yhteenvedon lisääminen

Juokseva yhteenveto on kaikkien tähän mennessä käsiteltyjen lohkojen jatkuvasti päivittyvä tiivistelmä. Ennen lohkon N käsittelyä lisätkää juokseva yhteenveto kehotteeseen kontekstiksi. Näin malli saa tiedot aiemmasta sisällöstä ilman, että konteksti-ikkuna ylittyy.

import openai
client = openai.OpenAI(api_key='sk-...')

def process_with_rolling_summary(chunks):
    rolling_summary = ''
    results = []

    for i, chunk in enumerate(chunks):
        context = ''
        if rolling_summary:
            context = f'Summary of previous sections:\n{rolling_summary}\n\n'

        prompt = context + f'Current section:\n{chunk}'
        resp = client.chat.completions.create(
            model='gpt-4o',
            messages=[
                {'role': 'system', 'content': 'Answer questions or summarize, using prior context.'},
                {'role': 'user', 'content': prompt}
            ]
        )
        result = resp.choices[0].message.content
        results.append(result)

        # Update rolling summary
        rolling_summary = update_rolling_summary(rolling_summary, chunk)

    return results

Juoksevan yhteenvedon päivittäminen

Juoksevaa yhteenvetoa tulee kasvattaa vaiheittain. Pyytäkää LLM:ää jokaisen lohkon käsittelyn jälkeen päivittämään yhteenveto sisällyttämällä siihen kyseisen lohkon uudet tiedot. Pitäkää juokseva yhteenveto lyhyenä — 200–400 tokenia — jotta nykyiselle lohkolle jää tilaa.

def update_rolling_summary(current_summary, new_chunk, max_words=150):
    if not current_summary:
        prompt = f'Summarize the following in under {max_words} words:\n\n{new_chunk}'
    else:
        prompt = (
            f'Current running summary (under {max_words} words):\n{current_summary}\n\n'
            f'New section to incorporate:\n{new_chunk}\n\n'
            f'Update the summary to include the new section. Stay under {max_words} words.'
        )
    resp = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}]
    )
    return resp.choices[0].message.content

Strategia 3: Metatietotunnisteet

Metatietotunnisteet liittävät jokaiseen lohkoon rakenteisia tietoja, jotta LLM tietää, mitä se käsittelee, ja pystyy säilyttämään loogisen jatkuvuuden.

Yleisiä tunnisteita ovat document_title, chapter, section, page, chunk_index ja total_chunks. Lisätkää nämä kehotteeseen otsakkeena, ei lohkotekstiin, jotta sisältö ja metatiedot pysyvät erillään.

def build_prompt_with_metadata(chunk, metadata):
    header = (
        f'Document: {metadata["title"]}\n'
        f'Chapter: {metadata["chapter"]}\n'
        f'Section: {metadata["section"]}\n'
        f'Page: {metadata["page"]}\n'
        f'Chunk: {metadata["chunk_index"] + 1} of {metadata["total_chunks"]}\n'
        '---\n'
    )
    return header + chunk

prompt = build_prompt_with_metadata(
    chunk=chunks[5],
    metadata={
        'title': 'Annual Report 2024',
        'chapter': '3. Financial Results',
        'section': '3.2 Revenue Breakdown',
        'page': 42,
        'chunk_index': 5,
        'total_chunks': 120
    }
)

Strategia 4: Viittaukset sivunumeroihin

Kun lohkossa viitataan aiemman sivun sisältöön, malli voi viitata siihen, jos sivunumerot on upotettu tekstiin. Lisätkää sivunvaihdot tekstiin merkkeinä ennen lohkoiksi jakamista, jotta ne säilyvät lohkoissa:

def inject_page_markers(pages):
    '''pages: list of strings, one per page.'''
    marked = []
    for i, page_text in enumerate(pages):
        marked.append(f'[PAGE {i+1}]\n{page_text}')
    return '\n\n'.join(marked)

# When the model sees [PAGE 12] in context, it can say
# 'As defined on page 12...' in its output, enabling traceability.
document_with_markers = inject_page_markers(pdf_pages)
chunks = chunk_with_overlap(document_with_markers)

Strategioiden yhdistäminen

Tuotannossa yhdistäkää kaikki neljä strategiaa, jotta konteksti säilyy mahdollisimman tarkasti:

  1. Lisätkää sivumerkit ennen lohkoiksi jakamista
  2. Jakakaa teksti lohkoiksi käyttäen 200 tokenin päällekkäisyyttä
  3. Liittäkää jokaiseen lohkon kehotteeseen metatieto-otsake
  4. Lisätkää juokseva yhteenveto ennen jokaista lohkoa

Yhdistetty lähestymistapa varmistaa, että malli tietää aina, missä kohtaa asiakirjaa se on, mitä aiemmin on käsitelty ja miten nykyinen lohko liittyy kokonaisuuteen.

def process_document(pages, doc_metadata):
    # Step 1: inject page markers
    full_text = inject_page_markers(pages)
    # Step 2: chunk with overlap
    chunks = chunk_with_overlap(full_text, max_tokens=900, overlap=150)
    total = len(chunks)
    rolling_summary = ''
    results = []

    for i, chunk in enumerate(chunks):
        meta = {**doc_metadata, 'chunk_index': i, 'total_chunks': total}
        prompt = build_prompt_with_metadata(chunk, meta)
        if rolling_summary:
            prompt = 'Prior context:\n' + rolling_summary + '\n\n' + prompt
        result = call_llm(prompt)
        results.append(result)
        rolling_summary = update_rolling_summary(rolling_summary, chunk)

    return results

Kontekstin säilymisen arviointi

Varmistaaksenne, että kontekstistrategianne toimii, laatikaa testikysymyksiä, jotka edellyttävät tietoja useista lohkoista:

  • Määritelkää lohkossa 2 esitelty termi, kun sitä kysytään lohkossa 8
  • Laskekaa useille sivuille ulottuva kokonaismäärä
  • Tunnistakaa ristiriita luvun 1 ja luvun 5 välillä

Suorittakaa käsittelyputki ja tarkistakaa, viittaavatko vastaukset oikein aiempaan sisältöön. Jos vastaukset ovat virheellisiä, kasvattakaa päällekkäisyyttä tai juoksevan yhteenvedon kokoa.

test_questions = [
    {
        'question': 'What is the definition of "net recurring revenue" used in this report?',
        'defined_in_chunk': 2,
        'asked_in_chunk': 9,
        'expected_keywords': ['net recurring revenue', 'subscription', 'exclude']
    }
]

def evaluate_context_retention(pipeline_results, test_questions):
    for test in test_questions:
        answer = pipeline_results[test['asked_in_chunk']]
        for kw in test['expected_keywords']:
            if kw.lower() not in answer.lower():
                print(f'FAIL: missing "{kw}" in answer to chunk {test["asked_in_chunk"]}')

Hyötyjen ja kustannusten yhteenveto

Jokaisella strategialla on omat kustannuksensa ja hyötynsä:

  • Päällekkäisyys: yksinkertainen, lisää tokenien määrää päällekkäisyyden prosenttiosuuden verran ja saattaa johtaa yhteenvetojen toistumiseen
  • Juokseva yhteenveto: tehokas, lisää yhden LLM-kutsun jokaista lohkoa kohden, ja yhteenveto saattaa muuttua tai menettää yksityiskohtia
  • Metatietotunnisteet: niiden lisääminen ei maksa ylimääräistä, auttaa mallia hahmottamaan sijaintinsa, mutta ei korvaa sisältöä
  • Sivumerkit: mahdollistavat jäljitettävyyden, lisäävät tekstiin merkkejä, mutta vain vähän tokeneita

Aloittakaa päällekkäisyydestä ja metatiedoista. Lisätkää juokseva yhteenveto vasta, kun testeissä havaitaan lohkojen väliseen kontekstiin liittyviä virheitä.

Käytännön mitoitusohje

Käytännön mitoitus 100-sivuiselle asiakirjalle (keskimäärin 500 tokenia sivua kohden = yhteensä 50 000 tokenia):

  • Lohkon koko: 800 tokenia, päällekkäisyys 150 tokenia → noin 73 lohkoa
  • Juokseva yhteenveto: enintään 200 tokenia (päivitetään jokaisen lohkon jälkeen)
  • Metatieto-otsake: noin 30 tokenia lohkoa kohden
  • Tehokas syöte API-kutsua kohden: 800 + 200 + 30 = 1030 tokenia
  • Map-kustannus (gpt-4o-mini hintaan $0.15/1M): 73 × 1030 × $0.15/1M ≈ $0.011

Kontekstistrategiat lisäävät kustannuksia vain vähän, mutta parantavat johdonmukaisuutta merkittävästi.

Tietotesti

Mikä tarkoitus juoksevalla yhteenvedolla on asiakirjan käsittelyssä lohko kerrallaan?

Kertaus: Konteksti lohkojen välillä

Neljä strategiaa kontekstin säilyttämiseen lohkojen välillä:

  • Päällekkäisyys: toistakaa lohkon N viimeiset N tokenia lohkon N+1 alussa
  • Juokseva yhteenveto: lisätkää lyhyt, jatkuvasti päivittyvä tiivistelmä ennen jokaista lohkoa
  • Metatietotunnisteet: otsake, joka sisältää asiakirjan, luvun, osion ja sivun tiedot
  • Sivumerkit: upottakaa sivunumerot tekstiin ennen lohkoiksi jakamista

Yhdistäkää kaikki neljä tuotannon käsittelyputkissa. Testatkaa lohkojen välisen kontekstin säilymistä useita lohkoja koskevilla kysymyksillä. Tämä päättää kurssin 16, joka käsittelee pitkien asiakirjojen käsittelystrategioita.

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 ”Kontekstin säilyttäminen osien välillä” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Tekoälyn prompt engineering-oppimispolun 3 oppituntia, myös oppitunnin “Kontekstin säilyttäminen osien välillä”. 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 ”Kontekstin säilyttäminen osien välillä”?

Jatkuvuuden varmistaminen limityksen, vierivän kontekstin ja metadatan lisäämisen avulla. 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 4/4.

Kuinka kauan ”Kontekstin säilyttäminen osien välillä”-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. Pitkien tekstien pilkkomisstrategiat
  2. Map-Reduce-tiivistämismalli
  3. Hierarkkinen tiivistäminen
  4. Kontekstin säilyttäminen osien välillä
← Takaisin: Tekoälyn prompt engineering