Ejen AI · Pelajaran

Pengurusan Konteks dan Sejarah Pelanggan

Respons diperibadikan menggunakan pembelian lalu, tiket dan pilihan pelanggan.

Pelajaran 4 daripada 413 langkah

Pengurusan Konteks dan Sejarah Pelanggan ialah pelajaran Ejen AI percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Ejen AI, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.

Mengapa Konteks Membuatkan Ejen Berasa Seperti Manusia

Perbezaan antara ejen khidmat pelanggan yang sederhana dengan yang cemerlang ialah konteks. Apabila ejen berkata, “Saya nampak langganan anda diperbaharui minggu depan — adakah anda mahu menjedanya sebelum itu?”, pelanggan berasa dirinya dikenali, bukannya sekadar diproses.

Pelajaran ini menerangkan pembinaan lapisan konteks pelanggan yang kaya untuk ejen anda.

Skema Profil Pelanggan

Tentukan profil pelanggan standard yang mengagregatkan data daripada pelbagai sumber. Ejen menerima kamus ini pada permulaan setiap perbualan.

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}')

Mendapatkan Sejarah Pembelian

Dapatkan N pesanan terakhir daripada sistem belakang e-dagang anda. Sertakan tarikh pesanan, item, jumlah keseluruhan dan status. Ini memberitahu ejen perkara yang telah dibeli oleh pelanggan serta sama ada terdapat masalah pada mana-mana pesanan terkini.

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
    ]

Mendapatkan Tiket Sokongan Terdahulu

Dapatkan N tiket sokongan terakhir untuk memahami masalah yang berulang. Jika masalah yang sama bagi pelanggan telah diselesaikan sebanyak tiga kali, itu ialah masalah produk — tingkatkan kepada pihak yang berkaitan dan tandakan sewajarnya.

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) >= 3

Membaca Peringkat dan Status Langganan

Peringkat langganan menentukan perkara yang layak diterima oleh pelanggan. Pelanggan Pro yang bertanya tentang ciri yang tidak tersedia dalam pelan mereka memerlukan respons yang berbeza daripada pelanggan Enterprise dengan soalan yang sama.

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)
    }

Mengira Umur Akaun

Umur akaun menunjukkan kesetiaan pelanggan. Pelanggan yang telah bersama anda sejak 2021 patut dilayan secara berbeza daripada seseorang yang baru mendaftar semalam. Sebut tempoh mereka bersama anda apabila sesuai untuk membina hubungan baik.

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)'

Membina Rentetan Konteks untuk LLM

Tukarkan profil pelanggan kepada blok konteks ringkas yang disuntik ke dalam gesaan sistem. Pastikan blok itu pendek — hanya sertakan fakta yang berkaitan secara langsung dengan sesi semasa.

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)

Memperibadikan Respons dengan Konteks

Suntik blok konteks ke dalam gesaan sistem supaya LLM merujuknya secara semula jadi dalam respons tanpa perlu diarahkan secara jelas.

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.content

Menyimpan Konteks Pelanggan dalam Tembolok

Mendapatkan data profil daripada berbilang API pada setiap mesej adalah lambat dan mahal. Simpan profil dalam tembolok pada permulaan perbualan dan kemas kini hanya medan yang mungkin berubah (status pesanan, status tiket).

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()
    }

Mengesan Situasi Sensitif daripada Sejarah

Sejarah boleh mendedahkan corak yang memerlukan pengendalian khas: pelanggan yang tiga pesanan terakhirnya rosak, seseorang yang mengugut untuk membatalkan langganan pada bulan lalu, atau pengguna yang telah bersama anda selama 7 tahun.

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 flags

Aliran Kerja Pemasangan Konteks Penuh

Gabungkan semua sumber data ke dalam satu fungsi assemble_context() yang dipanggil sekali pada permulaan perbualan.

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 profile

Bahagian konteks pelanggan yang manakah paling membolehkan ejen berkata, 'Saya nampak anda telah bersama kami sejak 2021'?

Memperibadikan respons memerlukan rujukan kepada titik data tertentu daripada profil pelanggan. Mengenal pasti medan yang membolehkan pernyataan ini ialah soalan ingatan yang praktikal.

Ringkasan Konteks Pelanggan

Ejen khidmat pelanggan yang hebat membina profil yang lengkap daripada sejarah pembelian, tiket sokongan, peringkat langganan dan umur akaun. Suntik blok konteks yang ringkas ke dalam gesaan sistem, simpan dalam tembolok sepanjang sesi dan gunakan penanda risiko untuk mengesan situasi sensitif sebelum menjadi lebih serius.

Percuma untuk bermula

Pelajari Ejen AI dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
60
Pelajaran
239

Soalan Lazim

Adakah pelajaran “Pengurusan Konteks dan Sejarah Pelanggan” percuma?

Ya — teks penuh “Pengurusan Konteks dan Sejarah Pelanggan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Ejen AI, tingkat taraf kepada CoddyKit PRO. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pengurusan Konteks dan Sejarah Pelanggan”?

Respons diperibadikan menggunakan pembelian lalu, tiket dan pilihan pelanggan. Anda berlatih Ejen AI menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Ejen AI?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Ejen AI di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Pengurusan Konteks dan Sejarah Pelanggan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Ejen AI ini?

Ya. Setiap pelajaran Ejen AI menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Penghalaan Tiket dan Logik Eskalasi
  2. Integrasi CRM: Salesforce dan HubSpot
  3. Protokol Penyerahan kepada Manusia
  4. Pengurusan Konteks dan Sejarah Pelanggan
← Kembali ke Ejen AI