Håndtering af kundekontekst og -historik
Personaliserede svar baseret på tidligere køb, billetter og præferencer.
Håndtering af kundekontekst og -historik er en gratis AI-agenter-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i AI-agenter, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. AI-agenter-kurset indeholder 4 lektioner i alt.
Hvorfor kontekst får agenter til at virke menneskelige
Forskellen på en middelmådig og en fremragende kundeserviceagent er kontekst. Når en agent siger: 'Jeg kan se, at dit abonnement fornyes i næste uge — vil du sætte det på pause inden da?', føler kunden sig genkendt og ikke bare ekspederet.
Denne lektion handler om at opbygge et rigt kundekontekstlag til dine agenter.
Skema for kundeprofil
Definér en standardiseret kundeprofil, der samler data fra flere kilder. Agenten modtager denne datastruktur i starten af hver samtale.
from dataclasses import dataclass, field
from datetime import date
@dataclass
class CustomerProfile:
customer_id: str
name: str
email: str
join_date: date
subscription_tier: str # 'free', 'pro', 'enterprise'
account_age_days: int
lifetime_value_usd: float
previous_tickets: list[dict] = field(default_factory=list)
recent_purchases: list[dict] = field(default_factory=list)
preferences: dict = field(default_factory=dict)
@property
def is_long_term_customer(self) -> bool:
return self.account_age_days > 365
if __name__ == '__main__':
from datetime import date
profile = CustomerProfile(
customer_id='cust_1', name='Jane Doe', email='jane@example.com',
join_date=date(2023, 1, 15), subscription_tier='pro',
account_age_days=400, lifetime_value_usd=1250.50,
)
print(f'{profile.name} ({profile.subscription_tier}) - long-term customer: {profile.is_long_term_customer}')
Hentning af købshistorik
Hent de seneste N ordrer fra din e-handelsløsning. Medtag ordredato, varer, samlet beløb og status. Det fortæller agenten, hvad kunden har købt, og om nogle af de seneste ordrer giver problemer.
import requests
SHOP_API = 'https://api.yourshop.com'
SHOP_KEY = 'YOUR_SHOP_API_KEY'
def get_purchase_history(customer_id: str, limit: int = 10) -> list[dict]:
resp = requests.get(
f'{SHOP_API}/customers/{customer_id}/orders',
headers={'Authorization': f'Bearer {SHOP_KEY}'},
params={'limit': limit, 'sort': '-created_at'}
)
resp.raise_for_status()
orders = resp.json()['orders']
return [
{
'order_id': o['id'],
'date': o['created_at'][:10],
'total_usd': o['total'],
'status': o['status'],
'items': [i['name'] for i in o['line_items']]
}
for o in orders
]Hentning af tidligere supportsager
Hent de seneste N supportsager for at forstå tilbagevendende problemer. Hvis kundens samme problem er blevet løst tre gange, er det et produktproblem — eskalér det, og markér det tilsvarende.
def get_support_history(customer_id: str, limit: int = 5) -> list[dict]:
resp = requests.get(
f'{SHOP_API}/customers/{customer_id}/tickets',
headers={'Authorization': f'Bearer {SHOP_KEY}'},
params={'limit': limit, 'sort': '-created_at'}
)
resp.raise_for_status()
tickets = resp.json()['tickets']
return [
{
'ticket_id': t['id'],
'subject': t['subject'],
'status': t['status'],
'resolved': t.get('resolved_at', ''),
'category': t.get('category', 'general')
}
for t in tickets
]
def has_recurring_issue(tickets: list[dict], category: str) -> bool:
return sum(1 for t in tickets if t['category'] == category) >= 3Aflæsning af abonnementsniveau og status
Abonnementsniveauet afgør, hvad kunden har ret til. En Pro-kunde, der spørger om en funktion, som ikke er tilgængelig på vedkommendes abonnement, har brug for et andet svar end en Enterprise-kunde med det samme spørgsmål.
def get_subscription_info(customer_id: str) -> dict:
resp = requests.get(
f'{SHOP_API}/customers/{customer_id}/subscription',
headers={'Authorization': f'Bearer {SHOP_KEY}'}
)
if resp.status_code == 404:
return {'tier': 'free', 'status': 'active', 'renewal_date': None}
resp.raise_for_status()
sub = resp.json()
return {
'tier': sub['plan'],
'status': sub['status'], # active / past_due / canceled
'renewal_date': sub.get('current_period_end', '')[:10],
'cancel_at': sub.get('cancel_at_period_end', False)
}Beregning af kontoens alder
Kontoens alder siger noget om kundeloyaliteten. En kunde, der har været hos dig siden 2021, bør behandles anderledes end en person, der oprettede en konto i går. Nævn ancienniteten, når det er relevant, for at skabe en god kontakt.
from datetime import datetime, timezone
def calculate_account_age(join_date_str: str) -> dict:
join = datetime.fromisoformat(join_date_str.replace('Z', '+00:00'))
now = datetime.now(timezone.utc)
delta = now - join
years = delta.days // 365
months = (delta.days % 365) // 30
return {
'days': delta.days,
'years': years,
'months': months,
'label': f'{years} year(s) and {months} month(s)' if years else f'{months} month(s)'
}
age = calculate_account_age('2021-03-15T00:00:00Z')
print(age['label']) # e.g. '5 year(s) and 2 month(s)'Opbygning af kontekststrengen til LLM'en
Omdan kundeprofilen til en kortfattet kontekstblok, der indsættes i systemprompten. Hold den kort — medtag kun fakta, der er direkte relevante for den aktuelle session.
def build_context_block(profile: CustomerProfile) -> str:
recent_order = profile.recent_purchases[0] if profile.recent_purchases else None
last_ticket = profile.previous_tickets[0] if profile.previous_tickets else None
parts = [
f'Customer: {profile.name} ({profile.email})',
f'Account age: {profile.account_age_days} days | Tier: {profile.subscription_tier}',
f'Lifetime value: USD {profile.lifetime_value_usd:.0f}',
]
if recent_order:
parts.append(
f'Last order: {recent_order["date"]} — '
f'{', '.join(recent_order["items"][:2])} ({recent_order["status"]})'
)
if last_ticket:
parts.append(f'Last ticket: "{last_ticket["subject"]}" ({last_ticket["status"]})')
return '\n'.join(parts)Tilpasning af svar med kontekst
Indsæt kontekstblokken i systemprompten, så LLM'en naturligt henviser til den i sine svar uden at få en direkte besked om at gøre det.
import openai
client = openai.OpenAI(api_key='YOUR_OPENAI_KEY')
def respond_with_context(user_message: str, profile: CustomerProfile) -> str:
context = build_context_block(profile)
system_prompt = (
f'You are a helpful customer service agent for ShopCo.\n'
f'Customer context:\n{context}\n\n'
f'Be warm and personal. Reference their history when relevant. '
f'Address the customer by first name.'
)
resp = client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'system', 'content': system_prompt},
{'role': 'user', 'content': user_message}
]
)
return resp.choices[0].message.contentCachelagring af kundekontekst
Det er langsomt og dyrt at hente profildata fra flere API'er ved hver besked. Cachelagr profilen ved samtalens start, og opdatér kun de felter, der kan ændre sig (ordrestatus, sagsstatus).
import time
profile_cache: dict[str, dict] = {} # customer_id -> {profile, fetched_at}
CACHE_TTL = 300 # 5 minutes
def get_cached_profile(customer_id: str) -> CustomerProfile | None:
entry = profile_cache.get(customer_id)
if entry and time.time() - entry['fetched_at'] < CACHE_TTL:
return entry['profile']
return None
def set_cached_profile(customer_id: str, profile: CustomerProfile):
profile_cache[customer_id] = {
'profile': profile,
'fetched_at': time.time()
}Registrering af følsomme situationer ud fra historikken
Historikken kan afsløre mønstre, der kræver særlig håndtering: en kunde, hvis seneste tre ordrer var defekte, en person, der truede med at opsige sit abonnement i sidste måned, eller en bruger, der har været kunde hos dig i 7 år.
def assess_risk_flags(profile: CustomerProfile) -> list[str]:
flags = []
# Check for cancellation risk
cancel_keywords = ['cancel', 'unsubscribe', 'quit', 'competitor']
for ticket in profile.previous_tickets:
if any(kw in ticket.get('subject', '').lower() for kw in cancel_keywords):
flags.append('cancellation_risk')
break
# Defective product pattern
defective = sum(1 for o in profile.recent_purchases if o.get('status') == 'refunded')
if defective >= 2:
flags.append('product_quality_issue')
# High-value customer
if profile.lifetime_value_usd > 5000:
flags.append('high_value_customer')
return flagsKomplet arbejdsgang til samling af kontekst
Saml alle datakilder i én assemble_context()-funktion, der kaldes én gang ved samtalens start.
from datetime import date
def assemble_context(email: str) -> CustomerProfile:
# Try cache first
# In production: look up customer_id from email in your user DB
customer_id = 'CUST_123'
cached = get_cached_profile(customer_id)
if cached:
return cached
# Fetch from all sources
sub = get_subscription_info(customer_id)
orders = get_purchase_history(customer_id)
tickets = get_support_history(customer_id)
profile = CustomerProfile(
customer_id=customer_id,
name='Alice Smith',
email=email,
join_date=date(2021, 3, 15),
subscription_tier=sub['tier'],
account_age_days=calculate_account_age('2021-03-15T00:00:00Z')['days'],
lifetime_value_usd=1240.00,
previous_tickets=tickets,
recent_purchases=orders
)
set_cached_profile(customer_id, profile)
return profileHvilken del af kundekonteksten gør det mest direkte muligt for agenten at sige 'Jeg kan se, at du har været kunde hos os siden 2021'?
Tilpasning af svar kræver, at der henvises til bestemte datapunkter i kundeprofilen. At identificere det felt, der gør denne formulering mulig, er et praktisk spørgsmål, der tester din genkaldelse af oplysninger.
Opsummering af kundekontekst
En dygtig kundeserviceagent opbygger en omfattende profil ud fra købshistorik, supportsager, abonnementsniveau og kontoens alder. Indsæt en kortfattet kontekstblok i systemprompten, cachelagr den under sessionen, og brug risikomarkeringer til at registrere følsomme situationer, før de eskalerer.
Lær AI-agenter med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 60
- Lektioner
- 239
Ofte stillede spørgsmål
Er lektionen “Håndtering af kundekontekst og -historik” gratis?
Ja — hele teksten til “Håndtering af kundekontekst og -historik” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af AI-agenter-kurset, skal du opgradere til CoddyKit PRO. AI-agenter-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Håndtering af kundekontekst og -historik”?
Personaliserede svar baseret på tidligere køb, billetter og præferencer. Du øver dig i AI-agenter med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på AI-agenter?
Der kræves ingen tidligere erfaring. AI-agenter på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Håndtering af kundekontekst og -historik”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne AI-agenter-lektion?
Ja. Alle AI-agenter-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Billetdirigering og eskaleringslogik
- CRM-integration: Salesforce og HubSpot
- Protokoller for overdragelse til mennesker
- Håndtering af kundekontekst og -historik