จุดอนุมัติโดยมนุษย์ในวงจรการทำงาน
รูปแบบหยุดชั่วคราว-ร้องขอ-อนุมัติสำหรับการกระทำของเอเจนต์ที่มีความเสี่ยงสูง
จุดอนุมัติโดยมนุษย์ในวงจรการทำงาน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การบันทึกการกระทำของเอเจนต์แบบแก้ไขไม่ได้
- การบังคับใช้นโยบายกับการกระทำของเอเจนต์
- การปฏิบัติตามข้อกำหนด: GDPR และ SOC2
- จุดอนุมัติโดยมนุษย์ในวงจรการทำงาน