0Pricing
AI Agents · บทเรียน

จุดอนุมัติโดยมนุษย์ในวงจรการทำงาน

รูปแบบหยุดชั่วคราว-ร้องขอ-อนุมัติสำหรับการกระทำของเอเจนต์ที่มีความเสี่ยงสูง

จุดอนุมัติโดยมนุษย์ในวงจรการทำงาน เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

เมื่อเอเจนต์ต้องได้รับการอนุมัติจากมนุษย์

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

นี่คือรูปแบบมนุษย์ร่วมในกระบวนการ (HITL)

การกำหนดการดำเนินการที่มีความเสี่ยงสูง

กำหนดฟังก์ชันจัดประเภทเพื่อระบุว่าการดำเนินการใดต้องได้รับการอนุมัติจากมนุษย์ โดยสามารถปรับเกณฑ์ตามการนำไปใช้งานแต่ละครั้งได้ตามระดับความเสี่ยงที่ยอมรับได้

HIGH_STAKES_ACTIONS = {
    'send_email',
    'delete_records',
    'publish_content',
    'transfer_funds',
    'modify_production_config',
    'export_all_data',
    'send_push_notification_to_all'
}

HIGH_STAKES_THRESHOLDS = {
    'transfer_funds':    1000,    # USD — require approval above this
    'delete_records':    10,      # rows
    'send_email':        50,      # recipients
    'push_notification': 1000     # users
}

def requires_approval(action: str, parameters: dict) -> bool:
    if action not in HIGH_STAKES_ACTIONS:
        return False
    threshold = HIGH_STAKES_THRESHOLDS.get(action)
    if threshold is None:
        return True   # all instances require approval
    # Check parameter against threshold
    amount = parameters.get('amount') or parameters.get('count') or 0
    return float(amount) >= threshold

if __name__ == '__main__':
    print('Small transfer:', requires_approval('transfer_funds', {'amount': 200}))
    print('Large transfer:', requires_approval('transfer_funds', {'amount': 5000}))
    print('Publish content:', requires_approval('publish_content', {}))

การสร้างคำขออนุมัติ

เมื่อจำเป็นต้องได้รับการอนุมัติ เอเจนต์จะสร้างระเบียนคำขออนุมัติและระงับการทำงานไว้ คำขอนี้จะระบุรายละเอียดสิ่งที่จะเกิดขึ้น ค่าพารามิเตอร์ และกำหนดเวลา

import uuid, time

approval_requests: dict[str, dict] = {}   # approval_id -> request

def create_approval_request(agent_id: str, user_id: str, action: str,
                             parameters: dict, timeout_minutes: int = 30) -> str:
    approval_id = str(uuid.uuid4())
    approval_requests[approval_id] = {
        'approval_id':  approval_id,
        'agent_id':     agent_id,
        'user_id':      user_id,
        'action':       action,
        'parameters':   parameters,
        'status':       'pending',     # pending / approved / rejected / timed_out
        'created_at':   time.time(),
        'expires_at':   time.time() + timeout_minutes * 60,
        'decided_by':   None,
        'decided_at':   None
    }
    return approval_id

if __name__ == '__main__':
    approval_id = create_approval_request(
        'agent-1', 'user-42', 'delete_records', {'count': 50}
    )
    print('Created approval request:', approval_id)
    print('Status:', approval_requests[approval_id]['status'])

การแจ้งเตือนผ่าน Slack

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

import requests

SLACK_WEBHOOK = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
APPROVAL_BASE_URL = 'https://your-agent-dashboard.com/approvals'

def notify_approver_slack(approval_id: str, approver_slack_id: str):
    req = approval_requests[approval_id]
    import time as t
    from datetime import datetime
    expires = datetime.fromtimestamp(req['expires_at']).strftime('%H:%M UTC')

    payload = {
        'text': f'<@{approver_slack_id}> Agent approval required',
        'attachments': [{
            'color': '#ff9900',
            'fields': [
                {'title': 'Action',      'value': req['action'],    'short': True},
                {'title': 'Requested by','value': req['user_id'],   'short': True},
                {'title': 'Parameters',  'value': str(req['parameters'])[:200]},
                {'title': 'Expires',     'value': expires,          'short': True}
            ],
            'actions': [
                {'type': 'button', 'text': 'Approve',
                 'url': f'{APPROVAL_BASE_URL}/{approval_id}/approve'},
                {'type': 'button', 'text': 'Reject',
                 'url': f'{APPROVAL_BASE_URL}/{approval_id}/reject'}
            ]
        }]
    }
    requests.post(SLACK_WEBHOOK, json=payload)

การแจ้งเตือนผ่านอีเมล

ในฐานะช่องทางสำรอง หรือช่องทางหลักสำหรับองค์กรที่ไม่มีสแลค ให้ส่งคำขออนุมัติทางอีเมลพร้อมลิงก์อนุมัติหรือปฏิเสธที่ชัดเจน

import smtplib
from email.mime.text import MIMEText

SMTP_HOST  = 'smtp.yourcompany.com'
SMTP_PORT  = 587
SMTP_USER  = 'agent-noreply@yourcompany.com'
SMTP_PASS  = 'YOUR_SMTP_PASSWORD'

def notify_approver_email(approval_id: str, approver_email: str):
    req = approval_requests[approval_id]
    body = (
        f'An AI agent is requesting approval for:\n\n'
        f'Action: {req["action"]}\n'
        f'Parameters: {req["parameters"]}\n\n'
        f'Approve: {APPROVAL_BASE_URL}/{approval_id}/approve\n'
        f'Reject:  {APPROVAL_BASE_URL}/{approval_id}/reject\n\n'
        f'This request expires in 30 minutes.'
    )
    msg = MIMEText(body)
    msg['Subject'] = f'Agent Approval Required: {req["action"]}'
    msg['From']    = SMTP_USER
    msg['To']      = approver_email

    with smtplib.SMTP(SMTP_HOST, SMTP_PORT) as server:
        server.starttls()
        server.login(SMTP_USER, SMTP_PASS)
        server.send_message(msg)

การตรวจสอบการตัดสินใจอนุมัติเป็นระยะ

หลังส่งการแจ้งเตือนแล้ว เอเจนต์จะรอการตัดสินใจ ให้ใช้วงจรตรวจสอบสถานะเป็นระยะโดยกำหนดช่วงพักสั้น ๆ หยุดตรวจสอบเมื่อสถานะเปลี่ยนจาก 'รอดำเนินการ' หรือเมื่อพ้นกำหนดเวลา

import time

def wait_for_approval(approval_id: str, poll_interval: float = 5.0) -> dict:
    while True:
        req = approval_requests.get(approval_id)
        if not req:
            return {'decision': 'error', 'reason': 'Approval request not found'}

        if req['status'] == 'approved':
            return {'decision': 'approved', 'decided_by': req['decided_by']}

        if req['status'] == 'rejected':
            return {'decision': 'rejected', 'decided_by': req['decided_by']}

        if time.time() > req['expires_at']:
            req['status'] = 'timed_out'
            return {'decision': 'timed_out', 'reason': 'No decision within deadline'}

        time.sleep(poll_interval)

การบันทึกการตัดสินใจอนุมัติ

เมื่อผู้อนุมัติคลิกอนุมัติหรือปฏิเสธ ให้บันทึกว่าใครเป็นผู้ตัดสินใจและตัดสินใจเมื่อใด การทำเช่นนี้จะสร้างร่องรอยการตรวจสอบการอนุมัติอย่างครบถ้วน: ร้องขอ → แจ้งเตือน → ตัดสินใจ → ดำเนินการหรือยกเลิก

def record_decision(approval_id: str, decision: str,
                    decided_by: str) -> dict:
    req = approval_requests.get(approval_id)
    if not req:
        return {'error': 'Approval request not found'}

    if req['status'] != 'pending':
        return {'error': f'Request already in state: {req["status"]}'}

    if time.time() > req['expires_at']:
        req['status'] = 'timed_out'
        return {'error': 'Request has expired'}

    req['status']     = decision   # 'approved' or 'rejected'
    req['decided_by'] = decided_by
    req['decided_at'] = time.time()
    return {'ok': True, 'decision': decision}

การจัดการเมื่อหมดเวลา: ยกเลิกอัตโนมัติ

หากไม่มีการตัดสินใจภายในช่วงเวลารอ เอเจนต์จะยกเลิกการดำเนินการโดยอัตโนมัติและแจ้งผู้ร้องขอเดิม วิธีนี้ช่วยป้องกันไม่ให้การดำเนินการถูกระงับอย่างถาวรเนื่องจากผู้อนุมัติไม่ตอบสนอง

def handle_timeout(approval_id: str, agent_session: dict) -> str:
    req = approval_requests.get(approval_id, {})
    action  = req.get('action', 'unknown')
    user_id = req.get('user_id', 'unknown')

    # Log the timeout
    import logging
    logging.warning(
        'Approval timeout: action=%s user=%s approval_id=%s',
        action, user_id, approval_id
    )

    # Tell the user
    timeout_message = (
        f'The "{action}" action was automatically cancelled because '
        f'no approver responded within the 30-minute window. '
        f'Please request again or contact your administrator.'
    )
    return timeout_message

การประสานขั้นตอนประตูการอนุมัติอย่างครบวงจร

รวมทุกขั้นตอนเข้าด้วยกัน ได้แก่ ตรวจสอบว่าจำเป็นต้องอนุมัติหรือไม่ สร้างคำขอ แจ้งเตือน รอ แล้วดำเนินการต่อหรือยกเลิกตามการตัดสินใจ

def execute_with_approval_gate(agent_id: str, user_id: str, action: str,
                                parameters: dict, approver_email: str,
                                execute_fn) -> dict:
    # Step 1: Check if approval needed
    if not requires_approval(action, parameters):
        result = execute_fn(action, parameters)
        return {'approved': True, 'auto': True, 'result': result}

    # Step 2: Create approval request
    approval_id = create_approval_request(agent_id, user_id, action, parameters)

    # Step 3: Notify approver
    notify_approver_email(approval_id, approver_email)
    print(f'Approval requested: {approval_id}. Waiting...')

    # Step 4: Wait for decision
    decision = wait_for_approval(approval_id)

    # Step 5: Act on decision
    if decision['decision'] == 'approved':
        result = execute_fn(action, parameters)
        return {'approved': True, 'decided_by': decision['decided_by'], 'result': result}
    elif decision['decision'] == 'rejected':
        return {'approved': False, 'reason': 'Rejected by approver'}
    else:
        msg = handle_timeout(approval_id, {})
        return {'approved': False, 'reason': msg}

ร่องรอยการตรวจสอบการอนุมัติ

ต้องบันทึกเหตุการณ์ทุกช่วงของวงจรการอนุมัติไว้ในบันทึกการตรวจสอบ ได้แก่ การสร้างคำขอ การส่งการแจ้งเตือน การตัดสินใจ และการดำเนินการหรือยกเลิก การบันทึกนี้จำเป็นต่อการปฏิบัติตาม SOC 2

import logging, json, time

approval_logger = logging.getLogger('agent.approvals')

def audit_approval_event(event: str, approval_id: str, details: dict):
    entry = {
        'timestamp':   time.time(),
        'event':       event,
        'approval_id': approval_id,
        **details
    }
    approval_logger.info(json.dumps(entry))

# Usage flow:
# audit_approval_event('request_created', approval_id, {'action': 'delete_records', 'user': 'u123'})
# audit_approval_event('notification_sent', approval_id, {'channel': 'email', 'approver': 'admin@co.com'})
# audit_approval_event('decision_received', approval_id, {'decision': 'approved', 'by': 'admin@co.com'})
# audit_approval_event('action_executed',  approval_id, {'result': 'success'})

if __name__ == '__main__':
    import sys
    approval_logger.setLevel(logging.INFO)
    approval_logger.addHandler(logging.StreamHandler(sys.stdout))
    audit_approval_event('request_created', 'appr-1', {'action': 'delete_records', 'user': 'u123'})

การยกระดับเมื่อผู้อนุมัติหลักไม่พร้อมใช้งาน

หากผู้อนุมัติหลักไม่ตอบกลับภายในครึ่งหนึ่งของช่วงเวลารอ ให้ยกระดับคำขอไปยังผู้อนุมัติสำรอง วิธีนี้ช่วยป้องกันไม่ให้คำขออนุมัติทั้งหมดติดขัดเพราะบุคคลเดียวไม่อยู่ปฏิบัติงาน

def escalate_if_needed(approval_id: str, secondary_email: str,
                        escalation_at_pct: float = 0.5):
    req = approval_requests.get(approval_id)
    if not req or req['status'] != 'pending':
        return

    total_window  = req['expires_at'] - req['created_at']
    elapsed       = time.time() - req['created_at']
    escalation_at = req['created_at'] + total_window * escalation_at_pct

    if time.time() >= escalation_at and not req.get('escalated'):
        req['escalated'] = True
        notify_approver_email(approval_id, secondary_email)
        print(f'Escalated approval {approval_id} to {secondary_email}')

จะเกิดอะไรขึ้นกับคำขออนุมัติที่รอดำเนินการเมื่อหมดเวลารอ

พฤติกรรมเมื่อหมดเวลาเป็นส่วนสำคัญของการออกแบบ HITL การเลือกค่าเริ่มต้นที่ไม่เหมาะสมอาจส่งผลแตกต่างกันต่อความปลอดภัยและความสะดวกในการใช้งาน

ทบทวนประตูการอนุมัติแบบมนุษย์ร่วมในกระบวนการ

ประตูการอนุมัติแบบ HITL ทำงานโดย: จัดประเภทการดำเนินการที่มีความเสี่ยงสูง สร้างคำขออนุมัติที่ระงับการทำงานไว้ แจ้งผู้อนุมัติ ผ่านสแลคหรืออีเมล ตรวจสอบการตัดสินใจเป็นระยะ ยกเลิกอัตโนมัติเมื่อหมดเวลา และ บันทึกทุกเหตุการณ์ในวงจร ไว้ในร่องรอยการตรวจสอบ

การยกระดับไปยังผู้อนุมัติสำรองช่วยป้องกันภาวะคำขออนุมัติติดขัดเนื่องจากผู้อนุมัติไม่พร้อมใช้งาน

คำถามที่พบบ่อย

บทเรียน “จุดอนุมัติโดยมนุษย์ในวงจรการทำงาน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “จุดอนุมัติโดยมนุษย์ในวงจรการทำงาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “จุดอนุมัติโดยมนุษย์ในวงจรการทำงาน”

รูปแบบหยุดชั่วคราว-ร้องขอ-อนุมัติสำหรับการกระทำของเอเจนต์ที่มีความเสี่ยงสูง คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “จุดอนุมัติโดยมนุษย์ในวงจรการทำงาน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การบันทึกการกระทำของเอเจนต์แบบแก้ไขไม่ได้
  2. การบังคับใช้นโยบายกับการกระทำของเอเจนต์
  3. การปฏิบัติตามข้อกำหนด: GDPR และ SOC2
  4. จุดอนุมัติโดยมนุษย์ในวงจรการทำงาน
← กลับไปที่ AI Agents