0Pricing
AI Engineering Academy · บทเรียน

การส่งต่อให้มนุษย์มีส่วนร่วม

กำหนดเงื่อนไขการส่งต่อที่ทำให้เอเจนต์หยุดชั่วคราวและขอคำแนะนำจากมนุษย์เมื่อความเชื่อมั่นต่ำ กำลังจะดำเนินการที่ทำลายข้อมูล หรือใช้โควตาการลองใหม่จนหมด

การส่งต่อให้มนุษย์มีส่วนร่วม เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การจำแนกรูปแบบความล้มเหลวของเอเจนต์
  2. การแก้ไขตนเองและการเขียนพรอมต์แบบไตร่ตรอง
  3. การสร้างจุดตรวจสอบและดำเนินงานต่อ
  4. การส่งต่อให้มนุษย์มีส่วนร่วม
← กลับไปที่ AI Engineering Academy