Kontekstin säilyttäminen osien välillä
Jatkuvuuden varmistaminen limityksen, vierivän kontekstin ja metadatan lisäämisen avulla.
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 cleanedStrategia 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 resultsJuoksevan 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.contentStrategia 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:
- Lisätkää sivumerkit ennen lohkoiksi jakamista
- Jakakaa teksti lohkoiksi käyttäen 200 tokenin päällekkäisyyttä
- Liittäkää jokaiseen lohkon kehotteeseen metatieto-otsake
- 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 resultsKontekstin 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.
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
- Pitkien tekstien pilkkomisstrategiat
- Map-Reduce-tiivistämismalli
- Hierarkkinen tiivistäminen
- Kontekstin säilyttäminen osien välillä