การติดตามการเรียกใช้เครื่องมือ AI Agent: บันทึกอะไรบ้างในทุกคำขอ

"เรียกใช้เครื่องมือ, ได้ 200" ไม่ได้อธิบายอะไรเลย เรียนรู้ว่าควรบันทึกอะไรในการเรียกใช้เครื่องมือของเอเจนต์ทุกครั้ง สิ่งที่ควรปกปิด และวิธีเปลี่ยนร่องรอยที่ล้มเหลวให้กลายเป็นการทดสอบการถดถอย

Ashley Innocent

Ashley Innocent

26 August 2026

การติดตามการเรียกใช้เครื่องมือ AI Agent: บันทึกอะไรบ้างในทุกคำขอ

Apidog สำหรับองค์กร

การติดตั้งแบบ On-Premises

SSO & RBAC

รองรับมาตรฐาน SOC 2

สำรวจ Apidog Enterprise

ผู้ใช้รายงานว่าเอเจนต์ “ทำอะไรแปลกๆ” เมื่อบ่ายวานนี้ คุณเปิดดูบันทึกและพบสิ่งนี้:

INFO  agent run started
INFO  calling tool: updateOrder
INFO  tool returned 200
INFO  agent run completed

เอเจนต์เรียกใช้ updateOrder คุณไม่ทราบว่าใช้พารามิเตอร์ใด คำสั่งซื้อใด เหตุใดจึงเลือกเครื่องมือดังกล่าว หรือได้ผลลัพธ์อะไรกลับมา การทำงานสำเร็จตามทุกมาตรวัดที่คุณบันทึกไว้ และคุณไม่สามารถสร้างการตัดสินใจใดๆ ที่มันทำขึ้นมาใหม่ได้เลย

ระบบเอเจนต์ล้มเหลวในลักษณะที่เข้าใจได้เมื่อมองย้อนกลับไปเท่านั้น ซึ่งหมายความว่าบันทึกคือผลผลิต คู่มือนี้ครอบคลุมสิ่งที่จะต้องบันทึกในการเรียกใช้เครื่องมือแต่ละครั้ง วิธีเชื่อมโยงการตัดสินใจของโมเดลกับคำขอ HTTP ที่สร้างขึ้น สิ่งที่ต้องปกปิด และวิธีเปลี่ยนร่องรอยการทำงาน (traces) ให้เป็นชุดทดสอบ โพสต์ของเราเกี่ยวกับ ความสามารถในการสังเกต API ครอบคลุมด้านบริการ ส่วนนี้ครอบคลุมชั้นเอเจนต์ที่อยู่เหนือมัน

Apidog มีประโยชน์เมื่อคุณมีร่องรอยการทำงานแล้ว เพราะวิธีที่เร็วที่สุดในการทำความเข้าใจการเรียกใช้ที่ผิดพลาดคือการเล่นซ้ำกับปลายทางเดิมและดูว่าเกิดอะไรขึ้น

สามชั้น หนึ่งร่องรอยการทำงาน

เอเจนต์สร้างเหตุการณ์ในสามระดับ และทีมส่วนใหญ่บันทึกแค่ระดับกลางเท่านั้น

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

ชั้นเครื่องมือ คือตัวดำเนินการของคุณ มันตรวจสอบพารามิเตอร์, ใช้บังคับนโยบาย, แมปการเรียกใช้กับคำขอ HTTP และจัดการผลลัพธ์

ชั้น HTTP คือการสื่อสารผ่านเครือข่าย เมธอด, URL, ส่วนหัว (headers), เนื้อหา (body), สถานะ, ความหน่วง

การดีบักมักจะข้ามชั้นต่างๆ เสมอ “เอเจนต์ส่ง ID ลูกค้าผิด” เป็นปัญหาด้านการให้เหตุผลที่มองเห็นได้เฉพาะที่ชั้น HTTP เท่านั้น “API ส่งคืนโค้ด 200 พร้อมเนื้อหาว่างเปล่า” เป็นปัญหา HTTP ที่ปรากฏเป็นการให้เหตุผลที่แปลกประหลาดในอีกสามขั้นตอนต่อมา หากสามชั้นนี้ไม่เชื่อมโยงกันด้วยตัวระบุร่วม คุณจะติดอยู่กับการเชื่อมโยงด้วยการประทับเวลา ซึ่งจะหยุดทำงานทันทีเมื่อมีการทำงานสองรายการทับซ้อนกัน

ดังนั้นกฎข้อแรกคือ: หนึ่ง Trace ID ต่อการทำงานของเอเจนต์หนึ่งครั้ง, หนึ่ง Span ID ต่อการเรียกใช้เครื่องมือหนึ่งครั้ง, และทั้งสองอย่างจะถูกประทับบนทุกบันทึกในทุกชั้น OpenTelemetry traces จำลองรูปแบบนี้ไว้อย่างแม่นยำอยู่แล้ว และมีชุด GenAI semantic conventions ที่เพิ่มขึ้นเรื่อยๆ สำหรับการตั้งชื่อแอตทริบิวต์เพื่อให้ข้อมูลของคุณเคลื่อนย้ายได้

สิ่งที่ต้องบันทึกในการเรียกใช้เครื่องมือแต่ละครั้ง

บันทึกที่ตอบคำถามที่แท้จริงได้มีรูปร่างประมาณนี้:

{
  "trace_id": "run_01J8ZK3M2Q",
  "span_id": "call_004",
  "parent_span_id": "call_003",
  "timestamp": "2026-08-26T14:03:11.482Z",
  "agent": "billing",
  "step": 4,

  "tool_name": "refundOrder",
  "tool_args": { "orderId": "ord_92", "amount": 1200, "reason": "duplicate" },
  "tools_available": ["getOrder", "listOrders", "refundOrder", "voidInvoice"],

  "http": {
    "method": "POST",
    "url": "/v1/orders/ord_92/refund",
    "request_body_hash": "sha256:1f4c...",
    "status": 200,
    "duration_ms": 412,
    "retry_count": 1,
    "idempotency_key": "9f2b7c14-6d3a-4b18"
  },

  "outcome": "success",
  "tokens": { "prompt": 8420, "completion": 96 },
  "policy": { "approval_required": true, "approved_by": "user_31", "dry_run": false }
}

ห้าฟิลด์ทำงานอย่างมีนัยสำคัญ

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

tools_available อธิบายการเลือก หากโมเดลเลือกเครื่องมือแปลกๆ คำถามแรกคือมีตัวเลือกอื่นอะไรอีกบ้าง ฟิลด์นี้ใช้พื้นที่เพียงไม่กี่ไบต์และให้คำตอบได้ทันที

retry_count แยกความแตกต่างระหว่าง “API ช้า” กับ “API ล้มเหลวสองครั้งแล้วจึงทำงานได้” หากไม่มีฟิลด์นี้ การพยายามสามครั้งจะดูเหมือนเป็นการเรียกใช้ครั้งเดียว

outcome ควรกำหนดเป็น enum ที่ชัดเจน ไม่ใช่สิ่งที่อนุมานจากรหัสสถานะ เช่น success, failed, timed_out, blocked_by_policy, rejected_by_human สองตัวสุดท้ายมีความสำคัญเนื่องจากการเรียกใช้ที่ถูกบล็อกเป็นการทำงานของ guardrail ไม่ใช่ข้อผิดพลาด และการนำมารวมกันจะทำให้ อัตราความล้มเหลวของคุณผิดเพี้ยนไป

policy คือบันทึกการตรวจสอบของคุณ เมื่อมีคนถามว่าการกระทำที่ก่อให้เกิดความเสียหายได้รับการอนุมัติหรือไม่ นี่คือคำตอบ มันจับคู่กับการบังคับใช้ที่อธิบายไว้ในโพสต์ของเราเกี่ยวกับ AI agent guardrails

บันทึกการตัดสินใจ ไม่ใช่แค่การกระทำ

ข้อผิดพลาดของเอเจนต์ที่ยากที่สุดคือการเลือก ดังนั้นให้บันทึกข้อมูลให้เพียงพอที่จะสร้างการตัดสินใจเหล่านั้นขึ้นมาใหม่ได้

เก็บคำจำกัดความของเครื่องมือที่ใช้ในการทำงาน หรือแฮชของมัน เมื่อความแม่นยำในการเลือกเปลี่ยนไป ผู้ต้องสงสัยแรกคือคำอธิบายที่บางคนแก้ไข และแฮชจะบอกคุณได้ทันทีว่าชุดเครื่องมือเปลี่ยนแปลงไปหรือไม่ระหว่างการทำงานที่ดีและการทำงานที่ผิดพลาด โพสต์ของเราเกี่ยวกับ การออกแบบ tool schema ครอบคลุมว่าทำไมข้อความนั้นถึงมีผลต่อพฤติกรรมมากขนาดนั้น

บันทึกโมเดลและการตั้งค่าของมัน รหัสโมเดล (Model ID), อุณหภูมิ (temperature) และเวอร์ชันของพรอมต์ (prompt version) ควรอยู่ในบันทึกการทำงาน พฤติกรรมจะเปลี่ยนแปลงไปตามเวอร์ชันของโมเดล และหากไม่มีฟิลด์นี้ คุณอาจต้องใช้เวลาทั้งวันในการตรวจสอบโค้ดของคุณเอง

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

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

ปกปิดข้อมูลก่อนที่คุณจะจัดเก็บ

ร่องรอยการทำงานของเอเจนต์อันตรายเป็นพิเศษเพราะมันมีทั้งคำขอและการให้เหตุผลที่เกี่ยวข้อง และพรอมต์มักจะเก็บรวบรวมข้อมูลส่วนบุคคล

สี่กฎนี้จะช่วยให้จัดการได้

เปลี่ยนร่องรอยการทำงานให้เป็นชุดทดสอบ

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

การทำงานที่ล้มเหลวทุกครั้งคือสถานการณ์หนึ่ง นำการเรียกใช้เครื่องมือจากร่องรอยการทำงานที่ผิดพลาด มาเล่นซ้ำกับ API ของคุณ แล้วคุณจะได้การจำลองสถานการณ์ เมื่อมีการแก้ไข ให้เก็บการเล่นซ้ำนั้นไว้เป็นชุดทดสอบการถดถอย ใน Apidog คุณสามารถสร้างคำขอที่ล้มเหลวขึ้นมาใหม่เป็นกรณีที่บันทึกไว้, ยืนยันพฤติกรรมที่ถูกต้อง และเรียกใช้ใน CI ซึ่งเป็นวิธีที่เหตุการณ์ครั้งเดียวกลายเป็นความครอบคลุมถาวร

ร่องรอยการทำงานยังบอกคุณด้วยว่าควรจำลอง (mock) อะไร ปลายทางที่เอเจนต์ของคุณเรียกใช้บ่อยที่สุด และสถานะความล้มเหลวที่มันพบเจอจริงๆ มาจากข้อมูลโดยตรง ไม่ใช่จากการคาดเดา สร้าง mocks ขึ้นมาโดยอิงจากข้อมูลเหล่านั้น โดยทำตามโพสต์ของเราเกี่ยวกับ การรันเอเจนต์กับ mocks แทนที่จะเป็น production

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

สามการสอบสวนที่ร่องรอยการทำงานต้องอยู่รอด

สังเกตว่าสิ่งเหล่านี้มีอะไรที่เหมือนกัน ไม่มีคำถามใดที่ตอบได้ด้วย “เครื่องมือส่งคืน 200” ทั้งสามคำถามตอบได้ด้วยฟิลด์ที่แทบไม่มีค่าใช้จ่ายในการเขียนและไม่สามารถกู้คืนได้หลังจากเกิดเหตุการณ์ขึ้นแล้ว

การสุ่มตัวอย่าง และสิ่งที่ไม่ควรสุ่มตัวอย่างโดยเด็ดขาด

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

เก็บการทำงานที่ล้มเหลวทุกครั้ง, การทำงานทุกครั้งที่ชนบล็อกนโยบาย และการทำงานทุกครั้งที่มีการเขียนข้อมูลไว้เสมอ การทำงานเหล่านี้คือสิ่งที่ทุกคนจะสอบถามถึง สุ่มตัวอย่างการทำงานที่สำเร็จซึ่งเป็นแบบอ่านอย่างเดียว เนื่องจากเป็นปริมาณส่วนใหญ่และน่าสนใจน้อยที่สุดในแต่ละครั้ง แม้ว่าคุณยังคงต้องการข้อมูลเหล่านั้นเพียงพอเพื่อคำนวณค่าพื้นฐานของคุณ

บทในหนังสือ SRE ของ Google เรื่อง การตรวจสอบระบบแบบกระจาย ยังคงเป็นคำอธิบายที่ชัดเจนที่สุดว่าทำไมคุณจึงควรสุ่มตัวอย่างเพื่อสัญญาณไม่ใช่ปริมาณ และเหตุผลนั้นก็ใช้ได้โดยตรงกับกรณีนี้

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

คำเตือนหนึ่งเกี่ยวกับการสุ่มตัวอย่างส่วนท้าย (tail sampling): หากคุณตัดสินใจว่าจะเก็บอะไรไว้หลังจากที่การทำงานเสร็จสิ้นแล้ว ให้แน่ใจว่าการตัดสินใจนั้นเกิดขึ้นหลังจากทราบผลลัพธ์แล้ว การทำงานที่ดูเหมือนจะดีในขั้นตอนที่สามแต่ล้มเหลวในขั้นตอนที่เก้าจะต้องถูกเก็บรักษาไว้ทั้งหมด ซึ่งหมายถึงการบัฟเฟอร์ข้อมูลไว้แทนที่จะทิ้งไปเรื่อยๆ

ร่องรอยการทำงานควรอยู่ที่ไหน

ทุกสิ่งที่กล่าวมาข้างต้นสมมติว่าคุณเป็นเจ้าของพื้นที่จัดเก็บข้อมูล นั่นคือข้อสันนิษฐานที่ถูกต้องเมื่อเอเจนต์เป็นบริการของคุณเองที่เรียกใช้ API ของคุณเอง มันไม่เหมาะสมนักเมื่อเอเจนต์เป็นรันไทม์การเขียนโค้ดบนเครื่องของนักพัฒนา เพราะร่องรอยการทำงานจะอยู่บนเทอร์มินัลใดก็ตามที่รันมันไป

Sharkly ใช้วิธีอื่น: ร่องรอยการทำงานจะถูกแนบไปกับ Task ที่เอเจนต์ได้รับมอบหมาย ประวัติการทำงาน, บันทึกการดำเนินการ และผลลัพธ์จะอยู่ถัดจากเป้าหมาย, สถานะ และกระทู้ความคิดเห็นที่มนุษย์ได้ตรวจสอบงานนั้น ความแตกต่างในทางปฏิบัติคือการเรียกดูข้อมูล “ทำไมเอเจนต์ถึงทำแบบนั้น” กลายเป็นคำถามที่คุณตอบได้โดยการเปิด Task แทนที่จะต้องไปหาเครื่อง, เซสชัน และย้อนดูข้อมูล

มันไม่ได้มาแทนที่การติดตามที่อธิบายไว้ที่นี่ และก็ไม่ได้มาแทนที่รันไทม์ด้วยเช่นกัน; Claude Code และ Codex ยังคงทำงานอยู่ สิ่งที่มันเปลี่ยนไปคือที่ที่บันทึกจะไปอยู่เมื่อเอเจนต์ไม่ใช่บริการที่คุณได้ติดตั้งใช้งาน

เฝ้าดูสี่ตัวเลข

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

รายการตรวจสอบ

เป้าหมายนั้นเรียบง่าย: เมื่อมีคนถามว่าทำไมเอเจนต์ถึงทำเช่นนั้น คุณสามารถตอบได้จากบันทึกแทนที่จะเป็นการคาดเดา ดาวน์โหลด Apidog เพื่อเล่นซ้ำการเรียกใช้ในร่องรอยการทำงานและเก็บการจำลองสถานการณ์ไว้เป็นชุดทดสอบ

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

ฝึกการออกแบบ API แบบ Design-first ใน Apidog

ค้นพบวิธีที่ง่ายขึ้นในการสร้างและใช้ API