AI Engineering Academy · Oppitunti

Datan poiminta rakenteettomasta tekstistä

Rakennatte tiedonpoimintaputken, joka lukee raakatekstiä, kuten sähköposteja, kuitteja ja artikkeleita, ja palauttaa rakenteiset kentät tyyppeineen, oletusarvoineen ja validointeineen.

Oppitunti 3/413 vaihetta

Datan poiminta rakenteettomasta tekstistä on ilmainen AI Engineering Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu AI Engineering Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. AI Engineering Academy-kurssilla on yhteensä 4 oppituntia.

Tiedonpoiminnan ongelma

Organisaatiot hukkuvat rakenteettomaan tekstiin: sähköposteihin, tukipyyntöihin, sopimuksiin, laskuihin, uutisartikkeleihin, potilasmerkintöihin ja sosiaalisen median julkaisuihin. Arvokas rakenteinen data on hautautunut tähän tekstiin, mutta sen poimiminen manuaalisesti on hidasta, kallista ja altista virheille. Rakenteisia tulosteita tuottavat LLM-mallit muuttavat tilanteen: ne voivat lukea mitä tahansa tekstiä ja täyttää ennalta määritellyn skeeman olennaisilla kentillä laajassa mittakaavassa ja kohtuullisella tarkkuudella.

Tiedonpoiminta (IE) tarkoittaa rakenteisten tietojen automaattista tunnistamista ja poimimista rakenteettomasta tekstistä. LLM-pohjainen tiedonpoiminta päihittää aiemmat sääntöpohjaiset ja perinteiset NLP-lähestymistavat selvästi, koska LLM-mallit ymmärtävät asiayhteyden, synonyymit ja implisiittisen tiedon ilman käsin laadittuja regex-kuvioita jokaista muunnelmaa varten.

Yleisiä tiedonpoiminnan käyttötapauksia

Tiedonpoiminta mahdollistaa monia arvokkaita liiketoimintasovelluksia:

  • Laskujen käsittely: toimittajan, rivikohtaisten tietojen, summien ja eräpäivien poimiminen PDF-laskuista ostoreskontran automatisointia varten
  • Sopimusanalyysi: osapuolten, voimaantulopäivien, maksuehtojen ja irtisanomislausekkeiden poimiminen oikeudellisista asiakirjoista
  • Ansioluetteloiden jäsentäminen: taitojen, kokemuksen, koulutuksen ja yhteystietojen poimiminen ansioluetteloista ATS-järjestelmiä varten
  • Tukipyyntöjen reititys: luokan, vakavuusasteen, vaikutuksen kohteena olevan tuotteen ja asiakastason poimiminen tukipyyntöjen automaattista reititystä varten
  • Uutisten seuranta: entiteettien, tapahtumien ja tunteiden poimiminen uutisartikkeleista kilpailutiedustelua varten

Sähköpostien poimintaputken rakentaminen

Rakennetaan käytännöllinen poimintaputki, joka lukee asiakkaiden sähköposteja ja poimii niistä toiminnan kannalta olennaista rakenteista dataa. Putkessa käytetään Pydantic-skeemaa määrittämään tarkasti, mitä kustakin sähköpostista halutaan, minkä jälkeen sähköpostit käsitellään eräajona.

import openai
from pydantic import BaseModel
from typing import List, Optional
from enum import Enum

client = openai.OpenAI()

class Priority(str, Enum):
    urgent = 'urgent'
    high = 'high'
    normal = 'normal'
    low = 'low'

class EmailExtraction(BaseModel):
    subject_summary: str
    sender_intent: str
    product_mentioned: Optional[str]
    issue_category: str  # billing / technical / general / feedback
    priority: Priority
    action_required: bool
    action_description: Optional[str]
    customer_sentiment: str  # positive / negative / neutral / frustrated

def extract_from_email(email_body: str) -> EmailExtraction:
    result = client.beta.chat.completions.parse(
        model='gpt-4o-mini',
        messages=[
            {'role': 'system', 'content': 'You are an expert at analyzing customer emails and extracting structured information for a support team.'},
            {'role': 'user', 'content': f'Analyze this customer email:\n\n{email_body}'}
        ],
        response_format=EmailExtraction
    )
    return result.choices[0].message.parsed

Nimettyjen entiteettien tunnistus LLM-malleilla

Nimettyjen entiteettien tunnistus (NER) on perinteinen tiedonpoiminnan tehtävä: tekstissä esiintyvien nimettyjen entiteettien (henkilöiden, organisaatioiden, sijaintien, päivämäärien ja rahamäärien) tunnistaminen ja luokittelu. LLM-mallit yksinkertaistavat NER-tunnistusta huomattavasti, koska tarvittavat entiteetit tarvitsee vain kuvata, minkä jälkeen malli poimii ne ilman erikseen koulutettua NER-mallia.

import openai
from pydantic import BaseModel
from typing import List, Optional

client = openai.OpenAI()

class NamedEntity(BaseModel):
    text: str       # The exact text as it appears
    entity_type: str  # PERSON / ORG / LOCATION / DATE / MONEY / PRODUCT
    normalized: Optional[str]  # Standardized form where applicable

class NERResult(BaseModel):
    entities: List[NamedEntity]

text = '''
Apple Inc. CEO Tim Cook announced yesterday that the company will invest $1.2 billion
in a new manufacturing facility in Austin, Texas, expected to open in Q3 2026.
'''

result = client.beta.chat.completions.parse(
    model='gpt-4o-mini',
    messages=[
        {'role': 'system', 'content': 'Extract all named entities from the text. Classify each as PERSON, ORG, LOCATION, DATE, MONEY, or PRODUCT.'},
        {'role': 'user', 'content': text}
    ],
    response_format=NERResult
)
for entity in result.choices[0].message.parsed.entities:
    print(f'[{entity.entity_type}] {entity.text}')

Asiakirjojen poiminta suuressa mittakaavassa

Tuhansia asiakirjoja käsittelevissä tuotantokäyttöön tarkoitetuissa poimintaputkissa tarvitaan asynkronista käsittelyä ja nopeusrajoitusten hallintaa. Tyypillisessä toteutuksessa käytetään asyncio-kirjastoa yhdessä semaforin kanssa, jotta asiakirjoja voidaan käsitellä rinnakkain API:n nopeusrajoituksia noudattaen.

import asyncio
import openai
from pydantic import BaseModel
from typing import List, Optional

async_client = openai.AsyncOpenAI()

class InvoiceExtraction(BaseModel):
    vendor: str
    total_amount: Optional[float]
    currency: str
    invoice_date: Optional[str]

async def extract_invoice(doc_text: str, semaphore: asyncio.Semaphore) -> InvoiceExtraction:
    async with semaphore:  # Limit concurrent requests
        result = await async_client.beta.chat.completions.parse(
            model='gpt-4o-mini',
            messages=[
                {'role': 'system', 'content': 'Extract invoice data.'},
                {'role': 'user', 'content': doc_text}
            ],
            response_format=InvoiceExtraction
        )
        return result.choices[0].message.parsed

async def process_invoices(documents: List[str]):
    sem = asyncio.Semaphore(5)  # Max 5 concurrent requests
    tasks = [extract_invoice(doc, sem) for doc in documents]
    return await asyncio.gather(*tasks, return_exceptions=True)

# results = asyncio.run(process_invoices(invoice_texts))
print('Async pipeline defined - handles rate limits via semaphore')

Implisiittisen ja päätellyn tiedon käsittely

LLM-mallit voivat poimia paitsi suoraan ilmaistua tietoa myös pääteltyä tai implisiittistä tietoa. Jos arvostelussa sanotaan ”Olen käyttänyt tätä päivittäin kuukauden ajan, ja se toimii edelleen täydellisesti”, malli voi päätellä kestävyyden olevan myönteinen ominaisuus, vaikka sanaa ”kestävyys” ei esiinny tekstissä lainkaan. Tämä on merkittävä etu regex-pohjaiseen poimintaan verrattuna, sillä regex voi löytää vain sen, mikä tekstissä ilmaistaan suoraan.

Tähän kyvykkyyteen liittyy kuitenkin riski: malli voi tehdä liiallisia päätelmiä ja täyttää kenttiä arvausten eikä tosiasioiden perusteella. Korkean riskin tiedonpoiminnassa (oikeudellinen, taloudellinen tai lääketieteellinen tieto) skeemaan kannattaa lisätä confidence-kenttä ja ohjeistaa malli arvioimaan varmuutensa sekä merkitsemään vähän luottamusta herättävät poiminnat ihmisen tarkistettaviksi.

Poimintakehotteiden suunnittelu

Poiminnan laatu riippuu suuresti kehotteen suunnittelusta. Poimintakehotteiden keskeiset periaatteet:

  • Määritä epäselvät kentät: jos ”päivämäärä” voi tarkoittaa laskun päiväystä, eräpäivää tai vastaanottopäivää, määritä tarkasti, mitä niistä halutaan
  • Anna esimerkkejä epätavallisista muodoista: ”Palauta hinnasta vain numeerinen arvo, esimerkiksi 29.99, ei $29.99”
  • Käsittele normalisointi: ”Normalisoi maiden nimet ISO 3166-1 alpha-2 -koodeiksi”
  • Määritä poiminnan lähde: ”Poimi tiedot vain aiheriviltä, älä sähköpostin leipätekstistä”

Ajatelkaa poimintakehotetta täsmällisenä ohjeistuksena ihmisen suorittamalle tietojen syöttämiselle: jokainen kehotteeseen jätetty epäselvyys on harkintapäätös, jonka malli tekee epäjohdonmukaisesti.

Monivaiheinen poiminta monimutkaisista asiakirjoista

Joitakin asiakirjoja on liian monimutkaista käsitellä yhdellä poimintakierroksella, koska koko skeema on suuri, eri osiot edellyttävät erilaista asiantuntemusta tai asiakirjan rakenne vaihtelee paljon. Monivaiheinen poiminta jakaa tehtävän peräkkäisiin vaiheisiin: ensin luokitellaan asiakirjan tyyppi ja sen jälkeen poimitaan kyseiselle tyypille sopivan skeeman mukaiset tiedot.

import openai
from pydantic import BaseModel
from typing import Optional

client = openai.OpenAI()

class DocumentType(BaseModel):
    doc_type: str  # invoice / contract / resume / report
    confidence: float

def classify_document(text: str) -> str:
    result = client.beta.chat.completions.parse(
        model='gpt-4o-mini',
        messages=[
            {'role': 'system', 'content': 'Classify the document type.'},
            {'role': 'user', 'content': text[:500]}  # Use only the beginning for classification
        ],
        response_format=DocumentType
    )
    return result.choices[0].message.parsed.doc_type

# Then route to the appropriate extraction schema
EXTRACTION_SCHEMAS = {
    'invoice': 'InvoiceSchema',  # Replace with actual Pydantic classes
    'contract': 'ContractSchema',
    'resume': 'ResumeSchema',
}

print('Multi-pass: classify first, then extract with the right schema')

Poiminnan jälkeinen rikastaminen

Poimittu data tarvitsee usein rikastamista ensimmäisen poiminnan jälkeen: poimitut yritysnimet voidaan muuntaa vakiintuneeseen muotoon kyselyllä yritystietokannasta, poimitun postinumeron avulla voidaan hakea kaupunki ja osavaltio tai poimitut päivämäärät voidaan muuntaa vakiomuotoon. Tämä rikastusvaihe kannattaa tehdä sovelluskoodissa poiminnan jälkeen, ei LLM-kutsun aikana.

Kun poiminta ja rikastaminen pidetään erillään, putkea on helpompi testata ja ylläpitää. Rikastuslogiikan voi yksikkötestata itsenäisesti, ja poimintamallin voi vaihtaa muuttamatta rikastuskoodia.

Poiminnan tarkkuuden mittaaminen

Tuotantokäyttöön tarkoitetuissa poimintaputkissa tarkkuutta on mitattava järjestelmällisesti merkityllä testiaineistolla. Keskeiset mittarit ovat:

  • Kenttäkohtainen tarkkuus: oikein poimittujen kenttien prosenttiosuus asiakirjaa kohden
  • Täsmällinen osuma: kentän arvo vastaa täsmälleen vertailuarvoa
  • Normalisoitu osuma: kentän arvo vastaa vertailuarvoa normalisoinnin jälkeen (esim. '$1,234.00' == '1234.0')
  • Väärien positiivisten osuus: kuinka usein malli poimii kentän, jonka pitäisi olla null
  • Väärien negatiivisten osuus: kuinka usein malli palauttaa kentälle null, vaikka kenttä esiintyy aineistossa

Suorittakaa tämä arviointi aina, kun vaihdatte mallia, päivitätte kehotteita tai lisäätte putkeen uusia asiakirjalähteitä. Pienetkin tarkkuuden laskut voivat johtaa merkittäviin liiketoimintavaikutuksiin, kun käsitellään tuhansia asiakirjoja.

Poiminnan kirjaaminen jatkuvaa kehittämistä varten

Jokainen tuotannossa syntyvä poimintatulos on datapiste, jonka avulla putkea voidaan parantaa. Kirjatkaa tietokantaan jokainen syöteasiakirja, poimittu tuloste ja mahdolliset validointivirheet. Ottakaa tuotantolokeista säännöllisesti otoksia yleisten virhemallien tunnistamiseksi: tietyt asiakirjamuodot, joiden kanssa mallilla on vaikeuksia, kentät, jotka ovat usein null, vaikka niiden ei pitäisi olla, tai epätavalliset arvot, jotka viittaavat kehotteen muuttumiseen.

Kirjatuista tiedoista muodostuu myös tuleva koulutusaineisto, jos haluatte joskus hienosäätää mallin juuri poimintatehtäväänne varten. Näin voitte saada yleiskäyttöisiä LLM-malleja tarkemman ja edullisemman vaihtoehdon rakenteiseen tiedonpoimintaan.

Pikatarkistus

Testatkaa tämän oppitunnin AI Engineering -käsitteiden ymmärtämistänne.

Oppitunnin yhteenveto

Tässä oppitunnissa opitte, että Pydantic-skeemojen kanssa käytettävät LLM-mallit poimivat rakenteista dataa luotettavasti mistä tahansa rakenteettomasta tekstilähteestä, semaforeja käyttävä asynkroninen käsittely mahdollistaa tuhansien asiakirjojen eräpoiminnan nopeusrajoituksia noudattaen ja monivaiheisessa poiminnassa asiakirjat luokitellaan ensin, minkä jälkeen kuhunkin tyyppiin sovelletaan asianmukaista skeemaa. Seuraavaksi rakennamme validointi- ja automaattisen uudelleenyrityksen logiikan tilanteisiin, joissa poimittu data ei täytä liiketoimintasääntöjä.

Aloita maksutta

Opi Python 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
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Datan poiminta rakenteettomasta tekstistä” ilmainen?

Kyllä – oppitunnin ”Datan poiminta rakenteettomasta tekstistä” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko AI Engineering Academy-kurssin, päivitä CoddyKit PROhon. AI Engineering Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Datan poiminta rakenteettomasta tekstistä”?

Rakennatte tiedonpoimintaputken, joka lukee raakatekstiä, kuten sähköposteja, kuitteja ja artikkeleita, ja palauttaa rakenteiset kentät tyyppeineen, oletusarvoineen ja validointeineen. Harjoittelet AI Engineering Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni AI Engineering Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin AI Engineering Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Datan poiminta rakenteettomasta tekstistä”-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ä AI Engineering Academy-oppitunnilla?

Kyllä. Jokainen AI Engineering Academy-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. JSON-tila ja response_format
  2. Rakenteiset tulosteet Pydanticilla
  3. Datan poiminta rakenteettomasta tekstistä
  4. Virheellisten tulosteiden validointi ja uudelleenyritys
← Takaisin: AI Engineering Academy