การส่งต่อให้มนุษย์มีส่วนร่วม
กำหนดเงื่อนไขการส่งต่อที่ทำให้เอเจนต์หยุดชั่วคราวและขอคำแนะนำจากมนุษย์เมื่อความเชื่อมั่นต่ำ กำลังจะดำเนินการที่ทำลายข้อมูล หรือใช้โควตาการลองใหม่จนหมด
การส่งต่อให้มนุษย์มีส่วนร่วม เป็นบทเรียน AI Engineering Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Engineering Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน
เมื่อเอเจนต์ต้องการคำแนะนำจากมนุษย์
เอเจนต์อัตโนมัติเต็มรูปแบบเหมาะกับงานที่กำหนดไว้อย่างชัดเจนและมีความเสี่ยงต่ำ แต่บางสถานการณ์ต้องอาศัยการตัดสินใจของมนุษย์ เช่น คำสั่งที่กำกวม ความมั่นใจของแบบจำลองต่ำ การดำเนินการที่ก่อความเสียหายและย้อนกลับไม่ได้ หรืองานที่ความล้มเหลวมีผลกระทบร้ายแรง การส่งต่องานให้มนุษย์เข้ามามีส่วนร่วม (HITL)จะหยุดเอเจนต์ที่จุดตัดสินใจเหล่านี้และขอข้อมูลจากมนุษย์ก่อนดำเนินการต่อ ซึ่งผสานประสิทธิภาพของระบบอัตโนมัติเข้ากับวิจารณญาณของมนุษย์
การกำหนดตัวกระตุ้นการส่งต่องาน
ควรเรียกใช้การส่งต่องานจากเงื่อนไขที่เฉพาะเจาะจงและวัดผลได้ แทนที่จะอาศัยความรู้สึกที่คลุมเครือ ให้กำหนด ตัวกระตุ้นการส่งต่องานที่ชัดเจนสำหรับแอปพลิเคชันของคุณ ตัวกระตุ้นที่พบบ่อย ได้แก่ ความมั่นใจของแบบจำลองต่ำกว่าเกณฑ์ กำลังจะดำเนินการที่ก่อความเสียหาย กำลังเข้าใกล้ขอบเขตของนโยบาย ใช้งบประมาณการลองซ้ำหมด หรือใช้เวลาเกินขีดจำกัดของงาน ให้บันทึกตัวกระตุ้นไว้ในโค้ดเป็นค่าคงที่ที่มีชื่อ เพื่อให้ปรับค่าได้โดยไม่ต้องเปลี่ยนตรรกะการควบคุมการทำงาน
from enum import Enum
class EscalationReason(Enum):
LOW_CONFIDENCE = 'low_confidence' # model uncertainty
DESTRUCTIVE_ACTION = 'destructive_action' # irreversible change
AMBIGUOUS_TASK = 'ambiguous_task' # unclear instructions
RETRY_BUDGET_EXHAUSTED = 'retry_exhausted' # too many failures
POLICY_BOUNDARY = 'policy_boundary' # approaching limit
HUMAN_REQUESTED = 'human_requested' # explicit request
TIMEOUT = 'timeout' # took too long
ESCALATION_THRESHOLDS = {
'min_confidence': 0.6,
'max_retries': 5,
'max_runtime_minutes': 30,
}การตรวจจับความมั่นใจต่ำ
ขอให้แบบจำลองแสดงระดับความมั่นใจต่อการดำเนินการที่เสนอ ก่อนที่จะดำเนินการจริง คะแนนความมั่นใจที่ต่ำกว่าเกณฑ์ของคุณจะเรียกใช้การส่งต่องาน ใช้การตรวจสอบความมั่นใจที่มีโครงสร้าง ซึ่งประกอบด้วยทั้งคะแนนตัวเลขและเหตุผลสั้น ๆ เพื่อให้ผู้ตรวจสอบที่เป็นมนุษย์เข้าใจได้อย่างชัดเจนว่าเหตุใดเอเจนต์จึงไม่มั่นใจ เหตุผลนี้ช่วยให้มนุษย์ให้คำแนะนำที่ตรงประเด็นได้ โดยไม่ต้องตรวจสอบประวัติงานทั้งหมด
from pydantic import BaseModel
class ConfidenceCheck(BaseModel):
proposed_action: str
confidence: float # 0.0 to 1.0
uncertainty_reason: str | None
proceed: bool
async def check_confidence(context: str, proposed_action: str) -> ConfidenceCheck:
return await judge_client.chat.completions.create(
model='gpt-4o',
response_model=ConfidenceCheck,
messages=[{
'role': 'user',
'content': f'Context: {context}\n\nI am about to: {proposed_action}\n\nHow confident am I that this is correct? Be honest about uncertainty.'
}]
)การตรวจจับการดำเนินการที่ก่อความเสียหาย
กำกับเครื่องมือที่ดำเนินการ แบบย้อนกลับไม่ได้ด้วยแฟล็ก destructive=True และกำหนดให้มนุษย์ยืนยันก่อนเรียกใช้ ตัวอย่างเช่น การลบไฟล์ การส่งอีเมลถึงผู้ใช้จริง การเปลี่ยนแปลงฐานข้อมูลที่ย้อนกลับไม่ได้ การเรียกเก็บเงินจากลูกค้า หรือการเผยแพร่เนื้อหาต่อสาธารณะ เอเจนต์ต้องหยุดที่การดำเนินการเหล่านี้และรอการอนุมัติจากมนุษย์อย่างชัดเจน แม้โดยปกติจะทำงานแบบอัตโนมัติก็ตาม
from dataclasses import dataclass
from typing import Callable
@dataclass
class Tool:
name: str
func: Callable
destructive: bool = False
description: str = ''
tools = [
Tool('search_web', search_web, destructive=False),
Tool('read_file', read_file, destructive=False),
Tool('write_file', write_file, destructive=True, description='Overwrites existing file'),
Tool('send_email', send_email, destructive=True, description='Sends real email to user'),
Tool('delete_records', delete_records, destructive=True, description='Permanent DB deletion'),
]
def requires_approval(tool: Tool) -> bool:
return tool.destructiveการหยุดเอเจนต์และรอข้อมูล
เมื่อตัวกระตุ้นการส่งต่องานทำงาน ให้ บันทึกจุดตรวจสอบเพื่อให้งานดำเนินต่อได้ สร้างรายการคำขอส่งต่องาน และแจ้งผู้ตรวจสอบที่เป็นมนุษย์ เอเจนต์จะหยุดประมวลผลและรอ มนุษย์จะตรวจสอบการส่งต่องานผ่านแดชบอร์ดหรือการแจ้งเตือน ให้คำแนะนำหรือการอนุมัติ จากนั้นเอเจนต์จะดำเนินงานต่อจากจุดตรวจสอบ โดยรวมคำแนะนำนั้นไว้เป็นข้อความใหม่ในประวัติ
import asyncio
async def escalate_and_wait(task_id: str, reason: EscalationReason, context: str,
question: str, timeout_hours: int = 24) -> str:
# Save checkpoint
save_checkpoint(load_checkpoint(task_id))
# Create escalation record
escalation_id = create_escalation(task_id, reason, context, question)
# Notify reviewer
notify_reviewer(escalation_id, question)
# Wait for response (polling with timeout)
deadline = asyncio.get_event_loop().time() + timeout_hours * 3600
while asyncio.get_event_loop().time() < deadline:
response = get_escalation_response(escalation_id)
if response:
return response.guidance
await asyncio.sleep(60) # check every minute
raise TimeoutError(f'Escalation {escalation_id} not answered within {timeout_hours}h')การสร้างส่วนติดต่อสำหรับผู้ตรวจสอบ
ผู้ตรวจสอบที่เป็นมนุษย์ต้องมีอินเทอร์เฟซที่เรียบง่ายสำหรับตอบกลับการส่งต่อให้ตรวจสอบ อย่างน้อยควรแสดงสิ่งต่อไปนี้: คำอธิบายงาน ความคืบหน้าของเอเจนต์จนถึงขณะนี้ คำถามเฉพาะหรือการดำเนินการที่เสนอซึ่งต้องได้รับอนุมัติ และปุ่มอนุมัติ ปฏิเสธ และให้คำแนะนำ บันทึกการตัดสินใจของผู้ตรวจสอบทุกครั้ง พร้อมตัวตนของผู้ตรวจสอบและเวลาที่เกิดขึ้นเพื่อใช้ในการตรวจสอบย้อนหลัง บอต Slack หรือแบบฟอร์มเว็บอย่างง่ายต่างก็เหมาะสำหรับทีมภายใน
# FastAPI escalation endpoint
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class EscalationResponse(BaseModel):
escalation_id: str
decision: str # 'approve', 'reject', 'guide'
guidance: str | None = None
reviewer_id: str
@app.post('/escalations/{escalation_id}/respond')
async def respond_to_escalation(esc_id: str, response: EscalationResponse):
escalation = get_escalation(esc_id)
if not escalation or escalation.status != 'pending':
return {'error': 'Escalation not found or already resolved'}
save_escalation_response(esc_id, response)
return {'status': 'response_recorded', 'task_will_resume': True}การใส่คำแนะนำจากมนุษย์ลงในบริบทของเอเจนต์
หลังจากมนุษย์ตอบกลับแล้ว ให้ใส่คำแนะนำของมนุษย์เป็นข้อความใหม่ในประวัติการสนทนาของเอเจนต์ก่อนดำเนินการต่อ ระบุให้ชัดเจนว่าคำแนะนำนี้มาจาก "ผู้ควบคุม" เพื่อแยกจากข้อสังเกตของเอเจนต์เอง จากนั้นเอเจนต์จะสามารถอ้างอิงคำแนะนำนี้ในขั้นตอนถัดไปได้ หากมนุษย์ปฏิเสธการดำเนินการที่เสนอ ให้ใส่คำแนะนำว่าควรดำเนินการอย่างไรแทน
def inject_human_guidance(messages: list, decision: str, guidance: str | None) -> list:
if decision == 'approve':
messages.append({
'role': 'user',
'content': 'Supervisor: Your proposed action has been approved. Proceed.'
})
elif decision == 'reject':
messages.append({
'role': 'user',
'content': f'Supervisor: Your proposed action was rejected. Instead: {guidance}'
})
elif decision == 'guide':
messages.append({
'role': 'user',
'content': f'Supervisor: Additional guidance: {guidance}'
})
return messagesการติดตามตัวชี้วัดการส่งต่อให้ตรวจสอบ
ติดตามปริมาณการส่งต่อ เหตุผล และเวลาตอบกลับ ปริมาณการส่งต่อที่สูงบ่งชี้ว่าเอเจนต์ยังไม่มั่นใจเพียงพอ ซึ่งอาจเกิดจากงานคลุมเครือเกินไป โมเดลต้องการคำแนะนำที่ดีกว่านี้ หรือกำหนดเกณฑ์ความมั่นใจไว้ต่ำเกินไป เวลาตอบกลับที่นานบ่งชี้ถึงปัญหาด้านภาระงานของผู้ตรวจสอบ ตัวชี้วัดเหล่านี้ช่วยให้คุณปรับสมดุลระหว่างการทำงานอัตโนมัติกับการทำงานของมนุษย์ เพื่อลดการรบกวนที่ไม่จำเป็น ขณะเดียวกันก็ยังให้มนุษย์มีส่วนร่วมในการตัดสินใจที่มีความเสี่ยงอย่างแท้จริง
def escalation_report(db_connection, days: int = 7) -> dict:
# SQL query (pseudocode)
rows = db_connection.execute('''
SELECT
reason,
COUNT(*) as count,
AVG(EXTRACT(EPOCH FROM (responded_at - created_at)) / 3600) as avg_response_hours,
SUM(CASE WHEN decision = 'approve' THEN 1 ELSE 0 END) as approvals,
SUM(CASE WHEN decision = 'reject' THEN 1 ELSE 0 END) as rejections
FROM escalations
WHERE created_at > NOW() - INTERVAL '%s days'
GROUP BY reason
ORDER BY count DESC
''' % days).fetchall()
return [dict(r) for r in rows]การขยายความเป็นอิสระทีละน้อย
เริ่มต้นด้วยความไวในการส่งต่อให้ตรวจสอบในระดับสูง (เกณฑ์ความมั่นใจต่ำ และส่งต่อการดำเนินการที่ทำลายข้อมูลทั้งหมด) จากนั้นค่อย ๆ ลดความถี่ในการส่งต่อเมื่อคุณมีความมั่นใจในพฤติกรรมของเอเจนต์มากขึ้น ติดตามว่าการส่งต่อรายการใดนำไปสู่การอนุมัติ และรายการใดนำไปสู่การแก้ไขจริง อัตราการอนุมัติที่สูงอย่างสม่ำเสมอสำหรับประเภทตัวกระตุ้นใดประเภทหนึ่งหมายความว่าคุณสามารถทำให้ตัวกระตุ้นนั้นทำงานอัตโนมัติได้อย่างปลอดภัย ช่วยลดภาระของมนุษย์และยังคงมีการกำกับดูแลในจุดที่สำคัญอย่างแท้จริง
# Autonomy expansion strategy:
# Week 1: escalate for ALL destructive actions
# Week 2: auto-approve file writes to /tmp (low-risk), escalate others
# Week 4: auto-approve all file writes, escalate only email/DB changes
# Week 8: auto-approve emails under 10 recipients, escalate mass emails
# Track approval rates per trigger type:
# Tool: write_file -> 98% approve -> safe to automate
# Tool: send_email -> 89% approve -> near-automate with content check
# Tool: delete_records -> 43% approve -> always escalateการแทนที่ฉุกเฉินและการยกเลิกงาน
จัดให้มีกลไก การแทนที่ฉุกเฉิน เสมอ เพื่อให้มนุษย์สามารถยกเลิกงานของเอเจนต์ที่กำลังทำงานอยู่ได้ทันที หากเอเจนต์ทำงานผิดปกติ เช่น เรียกใช้เครื่องมือที่ไม่ควรใช้ หรือดำเนินการนอกขอบเขตที่กำหนดไว้ มนุษย์ต้องสามารถหยุดเอเจนต์ได้ภายในไม่กี่วินาที ให้ใช้สัญญาณยกเลิก (แฟล็กในฐานข้อมูลที่เอเจนต์ตรวจสอบในแต่ละขั้นตอน) และตรวจสอบให้แน่ใจว่าผลลัพธ์จากการเรียกใช้เครื่องมือถูกทิ้งไป หากเอเจนต์ถูกยกเลิกระหว่างขั้นตอน
async def run_agent_with_cancel(task_id: str, messages: list) -> str:
for step in range(MAX_ITERATIONS):
# Check cancel flag at start of every step
if redis_client.get(f'agent:cancel:{task_id}'):
save_final_status(task_id, 'cancelled')
return 'Task cancelled by operator.'
response = await get_next_action(messages)
if response.is_final:
return response.answer
result = await execute_tool(response.tool, response.args)
messages.append({'role': 'user', 'content': result})
save_checkpoint_after_step(task_id, step, messages)
return 'Max iterations reached'การปรับเทียบเกณฑ์การส่งต่อให้ตรวจสอบ
เกณฑ์การส่งต่อให้ตรวจสอบจำเป็นต้องได้รับการปรับ หากเกณฑ์ความมั่นใจสูงเกินไป เอเจนต์จะส่งต่อแทบทุกการดำเนินการจนผู้ตรวจสอบรับภาระไม่ไหว หากต่ำเกินไป การดำเนินการที่มีความเสี่ยงก็อาจหลุดผ่านไปได้ เริ่มต้นสัปดาห์แรกด้วยเกณฑ์ที่ระมัดระวัง ติดตามปริมาณการส่งต่อและอัตราการอนุมัติของผู้ตรวจสอบ แล้วจึงปรับค่า ระบบที่เสถียรควรส่งต่องาน 5–15% เนื่องจากปัญหาด้านความมั่นใจ และส่งต่อการดำเนินการที่ทำลายข้อมูลเกือบ 100% โดยมีอัตราการอนุมัติโดยรวมสูงกว่า 80%
# Threshold tuning guide:
# Escalation rate vs quality trade-off:
#
# confidence_threshold=0.8 -> 35% escalation rate (too many)
# confidence_threshold=0.6 -> 12% escalation rate (target)
# confidence_threshold=0.4 -> 4% escalation rate (too few)
#
# Weekly review of escalation decisions:
# - Approval rate > 90%: lower threshold (too conservative)
# - Approval rate < 70%: raise threshold (not catching real issues)
# - Target: 75-85% approval rateตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับการออกแบบการส่งต่อให้ตรวจสอบโดยมีมนุษย์อยู่ในวงจร
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า ตัวกระตุ้นการส่งต่อให้ตรวจสอบ จะกำหนดเงื่อนไขที่ชัดเจนว่าเมื่อใดเอเจนต์ต้องหยุดและขอคำแนะนำจากมนุษย์ แฟล็กการดำเนินการที่ทำลายข้อมูล บนเครื่องมือจะบังคับให้ต้องได้รับอนุมัติก่อนดำเนินการที่ย้อนกลับไม่ได้ และ การขยายความเป็นอิสระทีละน้อย ช่วยให้คุณเพิ่มการทำงานอัตโนมัติได้อย่างปลอดภัยเมื่อเอเจนต์สร้างความไว้วางใจได้มากขึ้น ต่อไปเราจะออกแบบสถาปัตยกรรมสำหรับใช้งานจริงของโครงงานสรุปยอด
คำถามที่พบบ่อย
บทเรียน “การส่งต่อให้มนุษย์มีส่วนร่วม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การส่งต่อให้มนุษย์มีส่วนร่วม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Engineering Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การส่งต่อให้มนุษย์มีส่วนร่วม”
กำหนดเงื่อนไขการส่งต่อที่ทำให้เอเจนต์หยุดชั่วคราวและขอคำแนะนำจากมนุษย์เมื่อความเชื่อมั่นต่ำ กำลังจะดำเนินการที่ทำลายข้อมูล หรือใช้โควตาการลองใหม่จนหมด คุณปฏิบัติ AI Engineering Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Engineering Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Engineering Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การส่งต่อให้มนุษย์มีส่วนร่วม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Engineering Academy นี้ได้ไหม
ได้ บทเรียน AI Engineering Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การจำแนกรูปแบบความล้มเหลวของเอเจนต์
- การแก้ไขตนเองและการเขียนพรอมต์แบบไตร่ตรอง
- การสร้างจุดตรวจสอบและดำเนินงานต่อ
- การส่งต่อให้มนุษย์มีส่วนร่วม