Gestión del contexto y el historial del cliente
Respuestas personalizadas mediante compras anteriores, tickets y preferencias.
Gestión del contexto y el historial del cliente es una lección gratuita de AI Agents en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Agents, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Agents incluye 4 lecciones en total.
Por qué el contexto hace que los agentes parezcan humanos
La diferencia entre un agente de atención al cliente mediocre y uno excelente es el contexto. Cuando un agente dice 'Veo que su suscripción se renueva la próxima semana; ¿le gustaría pausarla antes de esa fecha?', el cliente siente que se le conoce, no que simplemente se está procesando su solicitud.
Esta lección explica cómo crear una capa de contexto completo del cliente para sus agentes.
Esquema del perfil del cliente
Defina un perfil de cliente estándar que agregue datos de varias fuentes. El agente recibe este diccionario al inicio de cada conversación.
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}')
Obtención del historial de compras
Obtenga los últimos N pedidos de su backend de comercio electrónico. Incluya la fecha del pedido, los artículos, el total y el estado. Esto indica al agente qué ha comprado el cliente y si hay algún problema con pedidos recientes.
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
]Obtención de tickets de soporte anteriores
Obtenga los últimos N tickets de soporte para comprender los problemas recurrentes. Si el mismo problema del cliente se ha resuelto tres veces, se trata de un problema del producto: escálelo y márquelo según corresponda.
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) >= 3Lectura del nivel y estado de suscripción
El nivel de suscripción determina a qué tiene derecho el cliente. Un cliente Pro que pregunta por una función que no está disponible en su plan necesita una respuesta diferente a la de un cliente Enterprise con la misma pregunta.
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)
}Cálculo de la antigüedad de la cuenta
La antigüedad de la cuenta refleja la fidelidad del cliente. Un cliente que está con usted desde 2021 debe recibir un trato diferente al de alguien que se registró ayer. Mencione la antigüedad cuando sea apropiado para crear una buena relación.
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)'Construcción de la cadena de contexto para el LLM
Convierta el perfil del cliente en un bloque de contexto conciso que se inyectará en el mensaje del sistema. Manténgalo breve: incluya únicamente los datos directamente relevantes para la sesión actual.
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)Personalización de respuestas con contexto
Inyecte el bloque de contexto en el mensaje del sistema para que el LLM lo mencione de forma natural en sus respuestas, sin indicárselo explícitamente.
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.contentAlmacenamiento en caché del contexto del cliente
Obtener datos del perfil desde varias API en cada mensaje es lento y costoso. Almacene el perfil en caché al inicio de la conversación y actualice únicamente los campos que puedan cambiar, como el estado del pedido y el estado del ticket.
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()
}Detección de situaciones sensibles a partir del historial
El historial puede revelar patrones que requieren un tratamiento especial: un cliente cuyos tres últimos pedidos fueron defectuosos, alguien que amenazó con cancelar el mes pasado o un usuario que lleva 7 años con usted.
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 flagsFlujo completo de ensamblaje del contexto
Combine todas las fuentes de datos en una única función assemble_context() que se llame una vez al inicio de la conversación.
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¿Qué elemento del contexto del cliente permite más directamente que el agente diga «Veo que está con nosotros desde 2021»?
Personalizar las respuestas requiere hacer referencia a puntos de datos específicos del perfil del cliente. Identificar qué campo permite expresar esta frase es una cuestión práctica de recuperación de información.
Resumen del contexto del cliente
Un excelente agente de atención al cliente crea un perfil detallado a partir del historial de compras, los tickets de soporte, el nivel de suscripción y la antigüedad de la cuenta. Inyecte un bloque de contexto conciso en el mensaje del sistema, almacénelo en caché durante la sesión y use indicadores de riesgo para detectar situaciones sensibles antes de que se agraven.
Preguntas frecuentes
¿La lección «Gestión del contexto y el historial del cliente» es gratis?
Sí — el texto completo de «Gestión del contexto y el historial del cliente» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Agents, actualiza a CoddyKit PRO. El curso de AI Agents incluye 4 lecciones en total.
¿Qué aprenderé en «Gestión del contexto y el historial del cliente»?
Respuestas personalizadas mediante compras anteriores, tickets y preferencias. Practicas AI Agents con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AI Agents?
No se requiere experiencia previa. AI Agents en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Gestión del contexto y el historial del cliente»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AI Agents?
Sí. Cada lección de AI Agents incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Enrutamiento de tickets y lógica de escalado
- Integración con CRM: Salesforce y HubSpot
- Protocolos de transferencia a agentes humanos
- Gestión del contexto y el historial del cliente