Ihmiselle siirtämisen käytännöt
Siirtämisen käynnistimien tunnistaminen ja keskustelun sujuva siirtäminen live-agenteille.
Ihmiselle siirtämisen käytännöt on ilmainen Tekoälyagentit-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 Tekoälyagentit-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Tekoälyagentit-kurssilla on yhteensä 4 oppituntia.
Milloin agentin pitäisi siirtää keskustelu ihmiselle?
Kaikkia keskusteluja ei pidä antaa tekoälyagentin hoidettavaksi alusta loppuun. Sen tietäminen, milloin keskustelu on siirrettävä ihmiselle, on yhtä tärkeää kuin se, että tiedetään, miten vastataan. Yleisiä käynnistimiä ovat:
- Asiakas pyytää nimenomaisesti ihmisagenttia
- Havaittu viha tai hätä
- Monimutkainen tai epäselvä tilanne, joka ei kuulu agentin toimialaan
- Oikeudellisesti, turvallisuuden kannalta tai vaatimustenmukaisuuden näkökulmasta arkaluonteinen tilanne
Siirron käynnistimien tunnistaminen
Käyttäkää LLM-luokittelijaa siirron käynnistimien tunnistamiseen reaaliajassa. Tarkistakaa ne jokaisella agentin vuorolla – ei vain ensimmäisessä viestissä.
import openai, json
client = openai.OpenAI(api_key='YOUR_OPENAI_KEY')
def should_handoff(message: str, history: list[dict]) -> dict:
context = '\n'.join(f"{m['role']}: {m['content']}" for m in history[-4:])
prompt = (
f'Conversation context:\n{context}\n'
f'Latest message: "{message}"\n'
f'Should this be handed to a human agent? Reasons: '
f'angry_customer, explicit_human_request, complex_issue, legal_risk, other.\n'
f'JSON: {{"handoff": true/false, "reason": "..."}}'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}],
response_format={'type': 'json_object'}
)
return json.loads(resp.choices[0].message.content)Lämmin ja kylmä siirto
Siirtotapoja on kaksi:
- Lämmin siirto: agentti esittelee itsensä ihmisagentille, kertoo tälle asiakkaasta, tekee keskustelusta yhteenvedon ja odottaa ihmisagentin vahvistusta ennen poistumistaan.
- Kylmä siirto: keskustelu siirretään yhteenvedon sisältävän keskustelulokin kera, ja agentti katkaisee yhteyden välittömästi.
Lämmin siirto vähentää asiakkaan turhautumista, mutta edellyttää ihmisagentin reaaliaikaista saatavuutta.
Keskusteluyhteenvedon luominen
Ennen siirtoa agentti luo keskustelusta rakenteisen yhteenvedon. Yhteenveto näytetään ihmisagentille taustatietona, joten asiakkaan ei tarvitse toistaa asioitaan.
def generate_handoff_summary(history: list[dict]) -> str:
transcript = '\n'.join(
f"{m['role'].upper()}: {m['content']}" for m in history
)
prompt = (
f'Summarize this support conversation for a human agent.\n'
f'Include: customer issue, what was tried, current status, and urgency level.\n'
f'Be brief (3-5 sentences).\n\n'
f'TRANSCRIPT:\n{transcript}'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
return resp.choices[0].message.content
summary = generate_handoff_summary([
{'role': 'user', 'content': 'My account was charged twice for January'},
{'role': 'assistant', 'content': 'I can look into that for you...'}
])
print(summary)Zendesk-tiketin luominen siirron yhteydessä
Kun siirrätte keskustelun, luokaa Zendesk-tiketti, joka sisältää yhteenvedon ja koko keskustelulokin. Ihmisagentti avaa tiketin ja saa kontekstin heti.
import requests
ZENDESK_DOMAIN = 'yourcompany.zendesk.com'
ZENDESK_TOKEN = 'YOUR_ZENDESK_API_TOKEN'
ZENDESK_EMAIL = 'agent@yourcompany.com'
def create_zendesk_ticket(customer_email: str, subject: str,
summary: str, transcript: str) -> str:
payload = {
'ticket': {
'subject': subject,
'comment': {'body': f'AI Agent Summary:\n{summary}\n\nFull Transcript:\n{transcript}'},
'requester': {'email': customer_email},
'tags': ['ai_handoff'],
'priority': 'high'
}
}
resp = requests.post(
f'https://{ZENDESK_DOMAIN}/api/v2/tickets.json',
json=payload,
auth=(f'{ZENDESK_EMAIL}/token', ZENDESK_TOKEN)
)
resp.raise_for_status()
return str(resp.json()['ticket']['id'])Intercom-keskustelun siirtäminen
Siirtäkää keskustelu Intercomissa määrittämällä se tietylle tiimille tai agentille Intercom API:n avulla. Ihmisagentti saa ilmoituksen ja voi jatkaa valmista keskustelua.
import requests
INTERCOM_TOKEN = 'YOUR_INTERCOM_ACCESS_TOKEN'
def handoff_to_intercom_team(conversation_id: str, team_id: str,
note: str) -> bool:
headers = {
'Authorization': f'Bearer {INTERCOM_TOKEN}',
'Content-Type': 'application/json'
}
# Add a note with the AI summary
requests.post(
f'https://api.intercom.io/conversations/{conversation_id}/parts',
headers=headers,
json={'type': 'note', 'body': note}
)
# Assign to human team
resp = requests.put(
f'https://api.intercom.io/conversations/{conversation_id}/parts',
headers=headers,
json={'type': 'assignment', 'assignee_id': team_id,
'message_type': 'assignment'}
)
return resp.status_code == 200Asiakkaalle lähetettävä siirtoviesti
Siirron aikana asiakkaalle lähetettävällä viestillä on merkitystä. Sen pitäisi vahvistaa siirto, kertoa odotettavissa olevasta odotusajasta ja osoittaa, että asia otetaan vakavasti.
def generate_handoff_message(reason: str, wait_minutes: int = 5) -> str:
messages = {
'explicit_human_request':
f'Of course! I am connecting you with a human agent right now. '
f'Estimated wait: {wait_minutes} minutes. Your conversation history '
f'has been shared so you will not need to repeat anything.',
'angry_customer':
f'I completely understand your frustration. Let me get a senior '
f'team member on the line immediately. Wait: ~{wait_minutes} min.',
'complex_issue':
f'This situation needs specialist attention. I am escalating now '
f'and sharing all the context we have discussed. Wait: ~{wait_minutes} min.',
'legal_risk':
f'This matter requires our compliance team. Connecting you now.'
}
return messages.get(reason, f'Connecting you with a human agent. ~{wait_minutes} min wait.')
if __name__ == '__main__':
print(generate_handoff_message('angry_customer', wait_minutes=3))
print(generate_handoff_message('explicit_human_request'))
Jonottaminen, kun ihmisagenttia ei ole saatavilla
Toimistoaikojen ulkopuolella tai ruuhka-aikoina ihmisagenttia ei ehkä ole heti saatavilla. Asettakaa siirto jonoon, lähettäkää asiakkaalle vahvistus ja viitenumero sekä ilmoittakaa päivystävälle henkilöstölle Slackin tai PagerDutyn kautta.
import requests
SLACK_WEBHOOK = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
def notify_on_call(ticket_id: str, summary: str, priority: str):
payload = {
'text': f'*New AI Handoff* [{priority.upper()}]',
'attachments': [{
'color': '#ff0000' if priority == 'high' else '#ffcc00',
'fields': [
{'title': 'Ticket ID', 'value': ticket_id, 'short': True},
{'title': 'Summary', 'value': summary[:500]}
]
}]
}
requests.post(SLACK_WEBHOOK, json=payload)Agentin toiminta siirron jälkeen
Kun siirto on käynnistetty, agentin pitäisi lopettaa asian ratkaisemisen yrittäminen. Se voi edelleen vastata tosiasioita koskeviin kysymyksiin (tilauksen tila, käytäntöjen linkit), mutta sen ei pidä tehdä sitoumuksia tai päätöksiä.
def agent_post_handoff_response(message: str, handoff_complete: bool) -> str:
if not handoff_complete:
return 'Connecting you now...'
# Still answer simple factual questions
simple_keywords = ['status', 'where', 'when', 'policy', 'link']
if any(kw in message.lower() for kw in simple_keywords):
return 'I can help with that while you wait for the agent.'
# Defer everything else
return (
'Your case has been assigned to a specialist. '
'They will respond shortly. I will step back to avoid confusion.'
)
if __name__ == '__main__':
print(agent_post_handoff_response('Where is my order?', handoff_complete=True))
print(agent_post_handoff_response('I want a refund now', handoff_complete=True))
Siirtomittareiden seuranta
Mitatkaa siirtojen osuutta, syiden jakaumaa ja siirron jälkeistä ratkaisuaikaa. Tietyn aikomuksen suuri siirtojen osuus osoittaa, että agentti tarvitsee parempaa kattavuutta kyseisessä aiheessa.
from collections import Counter
import json
handoff_log = [] # In production: a database table
def record_handoff(session_id: str, reason: str, turn_number: int):
handoff_log.append({
'session_id': session_id,
'reason': reason,
'turns_before_handoff': turn_number
})
def handoff_analytics() -> dict:
reasons = Counter(h['reason'] for h in handoff_log)
avg_turns = sum(h['turns_before_handoff'] for h in handoff_log) / max(len(handoff_log), 1)
return {
'total_handoffs': len(handoff_log),
'reason_breakdown': dict(reasons),
'avg_turns_before_handoff': round(avg_turns, 1)
}
if __name__ == '__main__':
record_handoff('s1', 'angry_customer', 4)
record_handoff('s2', 'complex_issue', 7)
record_handoff('s3', 'angry_customer', 2)
stats = handoff_analytics()
print(f"Total handoffs: {stats['total_handoffs']}")
print(f"Reasons: {stats['reason_breakdown']}")
print(f"Avg turns before handoff: {stats['avg_turns_before_handoff']}")
Koko siirron orkestrointi
Yhdistäkää kaikki vaiheet execute_handoff()-funktioksi, jota agentti kutsuu heti, kun käynnistin havaitaan.
def execute_handoff(session: dict, reason: str) -> str:
# 1. Generate summary
summary = generate_handoff_summary(session['history'])
transcript = '\n'.join(
f"{m['role']}: {m['content']}" for m in session['history']
)
# 2. Create ticket
ticket_id = create_zendesk_ticket(
session['customer_email'],
f'AI Handoff: {reason}',
summary,
transcript
)
# 3. Notify on-call team
notify_on_call(ticket_id, summary, priority='high')
# 4. Record metrics
record_handoff(session['id'], reason, len(session['history']))
# 5. Return customer-facing message
wait = 5 # fetch from queue depth in production
return generate_handoff_message(reason, wait)Mikä on lämpimän ja kylmän siirron keskeinen ero?
Oikean siirtotavan valinta vaikuttaa asiakaskokemukseen ja toiminnan monimutkaisuuteen. Eron ymmärtäminen auttaa toteuttamaan oikean toimintamallin.
Ihmiselle siirtämisen toimintamallien yhteenveto
Tehokas siirto edellyttää: käynnistimien tunnistamista (viha, nimenomainen pyyntö, monimutkaisuus), yhteenvedon luomista ihmisagentille, tiketin luomista Zendeskissä/Intercomissa koko keskustelulokin kera, päivystävän henkilöstön ilmoittamista sekä selkeän odotusviestin antamista asiakkaalle.
Siirron jälkeen agentti vetäytyy ja jättää kaikki päätökset ihmiselle.
Opi Tekoälyagentit 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
- 60
- Oppitunnit
- 239
Usein kysytyt kysymykset
Onko oppitunti ”Ihmiselle siirtämisen käytännöt” ilmainen?
Kyllä – oppitunnin ”Ihmiselle siirtämisen käytännöt” 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 Tekoälyagentit-kurssin, päivitä CoddyKit PROhon. Tekoälyagentit-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Ihmiselle siirtämisen käytännöt”?
Siirtämisen käynnistimien tunnistaminen ja keskustelun sujuva siirtäminen live-agenteille. Harjoittelet Tekoälyagentit-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Tekoälyagentit-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Tekoälyagentit-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Ihmiselle siirtämisen käytännöt”-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ä Tekoälyagentit-oppitunnilla?
Kyllä. Jokainen Tekoälyagentit-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
- Tiketöinnin reititys ja eskalointilogiikka
- CRM-integraatio: Salesforce ja HubSpot
- Ihmiselle siirtämisen käytännöt
- Asiayhteyden ja historian hallinta