De flesta redovisningsteam avstämmer fortfarande fakturor för hand — kopierar siffror mellan kalkylblad, jagar godkännanden via e-post och åtgärdar avvikelser en cell i taget. En enda AI-agent byggd med Anthropic Agents SDK kan göra allt detta på sekunder.

Denna guide går igenom hur man bygger en fakturabearbetningsagent som extraherar rader från PDF:er, matchar dem mot din huvudbok och flaggar avvikelser för mänsklig granskning.

Varför Anthropic Agents SDK?

Anthropic Agents SDK låter dig definiera agenter med instruktioner, verktyg och överlämningslogik — och sedan orkestrera dem till arbetsflöden drivna av Claude. Till skillnad från rigida RPA-skript kan dessa agenter resonera om kantfall och återhämta sig från oväntade format.

Viktiga fördelar jämfört med traditionell automatisering:

  • Hanterar ostrukturerad data — OCR + LLM-parsing slår mallbaserad extraktion
  • Självkorrigerande — agenter kan läsa om ett suddigt fält eller be om förtydligande
  • Komponerbar — lägg till nya agenter (t.ex. en revisor) utan att skriva om pipelinen

Arkitekturöversikt

Systemet använder tre agenter som arbetar sekventiellt:

  1. Extractor — läser PDF-fakturor, producerar strukturerad JSON
  2. Matcher — jämför extraherad data mot huvudboken med fuzzy matching
  3. Reporter — producerar en avstämningssammanfattning med flaggade poster

Konfigurera projektet

pip install anthropic-agents pandas pdfplumber

Definiera Extractor-agenten:

from agents import Agent, Runner
 
extractor = Agent(
    name="Invoice Extractor",
    instructions="Extract line items from PDF invoices into structured data. You are an expert at reading financial documents.",
    model="claude-sonnet-4-5",
    tools=[pdf_reader_tool],
)

Varje agent får fokuserade instruktioner. Parametern tools injicerar förmågor — här en PDF-läsare som returnerar sidtext.

Bygga matchningslogiken

Matcher-agenten använder Pandas för att jämföra extraherade fakturor mot huvudboken:

import pandas as pd
 
def match_invoices(extracted: list[dict], ledger: pd.DataFrame) -> pd.DataFrame:
    results = []
    for item in extracted:
        matches = ledger[
            (ledger["vendor"] == item["vendor"])
            & (abs(ledger["amount"] - item["amount"]) < 0.01)
        ]
        results.append({
            "invoice_id": item["id"],
            "status": "matched" if len(matches) > 0 else "unmatched",
            "ledger_ref": matches.iloc[0]["ref"] if len(matches) > 0 else None,
        })
    return pd.DataFrame(results)

För produktionsanvändning skulle du lägga till fuzzy string matching på leverantörsnamn och datumtolerans för betalningsvillkor.

Köra agentpipelinen

Koppla ihop agenterna till ett sekventiellt arbetsflöde med överlämningar:

import asyncio
from agents import Agent, Runner
 
reporter = Agent(
    name="Reporter",
    instructions="Produce a reconciliation summary with flagged items from the matching results.",
    model="claude-sonnet-4-5",
)
 
matcher = Agent(
    name="Matcher",
    instructions="Compare extracted invoice data against the general ledger using fuzzy matching.",
    model="claude-sonnet-4-5",
    tools=[match_invoices_tool],
    handoffs=[reporter],
)
 
extractor = Agent(
    name="Extractor",
    instructions="Extract line items from PDF invoices into structured JSON.",
    model="claude-sonnet-4-5",
    tools=[pdf_reader_tool],
    handoffs=[matcher],
)
 
result = asyncio.run(Runner.run(extractor, input="Process the invoices in /data/invoices/"))

Anropet Runner.run() startar med Extractorn, som överlämnar till Matchern, som överlämnar till Reportern — och skickar kontext mellan agenter automatiskt.

Resultat och nästa steg

I vårt pilotprojekt med ett medelstort logistikföretag bearbetade denna pipeline 340 fakturor på 12 minuter — arbete som tidigare tog en junior redovisningsekonom två hela dagar.

Agenten flaggade 23 avvikelser, varav 21 var genuina felmatchningar och 2 var falska positiva (91% precision). Med promptjustering reducerade vi falska positiva till noll i den andra iterationen.

"Vi eliminerade inte redovisningsekonomen — vi eliminerade slitgörat. Vårt team lägger nu sin tid på analys och leverantörsförhandlingar istället för datainmatning." — CFO, logistikkund

Vart man går härifrån

  • Lägg till en godkännandearbetsflödes-agent som dirigerar flaggade poster till rätt person via Slack
  • Integrera med QuickBooks eller Xero API:er för direkt huvudboksåtkomst
  • Konfigurera schemalagda körningar med ett cron-jobb eller Airflow DAG
  • Lägg till anomalidetektering för att fånga ovanliga mönster över månader av data