ทดสอบเอเจนต์สนทนาโดยใช้ Direct Line

Direct Line API ทำหน้าที่เป็นอินเทอร์เฟซการสื่อสารสำหรับแอปพลิเคชันไคลเอ็นต์เพื่อโต้ตอบกับเอเจนต์สนทนาที่พัฒนาโดย Copilot Studio Direct Line API อำนวยความสะดวกในการรับส่งข้อความระหว่างแอปพลิเคชันไคลเอนต์และเอเจนต์ผ่านสตรีม WebSocket หรือการร้องขอ HTTP สำหรับการทดสอบประสิทธิภาพ Direct Line ช่วยให้เครื่องมือทดสอบโหลดสามารถจำลองพฤติกรรมของผู้ใช้จริง

สื่อสารกับ Direct Line ผ่าน WebSockets

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

แอปพลิเคชันไคลเอ็นต์ที่ใช้ Direct Line และ WebSocket ควรดำเนินการตามขั้นตอนต่อไปนี้:

  1. เมื่อต้องการเริ่มต้นการสนทนา แอปพลิเคชันไคลเอ็นต์ต้องได้รับโทเค็นการสนทนาก่อน หากเอเจนต์ของคุณถูกตั้งค่าด้วย ข้อมูลลับ Direct Line ให้รับโทเค็นโดยการเรียก ปลายทางระดับภูมิภาคของ Direct Line โทเค็นสำหรับเอเจนต์ที่ไม่ได้ใช้ข้อมูลลับสามารถรับได้จาก จุดปลายทางโทเค็น
  2. แอปพลิเคชันไคลเอ็นต์ เริ่มต้นการสนทนาโดยใช้โทเค็น, และจะได้รับรหัสการสนทนาและ URL สตรีม WebSocket
  3. ข้อความของผู้ใช้จะถูกส่งโดยการส่ง คำขอ HTTP POST พร้อมรหัสการสนทนา
  4. ข้อความจากเอเจนต์สนทนาได้รับผ่านสตรีม WebSocket

ภาพหน้าจอแสดงขั้นตอนการสื่อสาร Direct Line โดยใช้ WebSockets

สื่อสารกับ Direct Line โดยใช้ HTTP GET

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

ภาพหน้าจอแสดงลำดับขั้นตอนของการสื่อสาร Direct Line โดยใช้ HTTP GET

การวัดเวลาตอบสนอง

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

ขั้นตอน ผลกระทบต่อประสบการณ์ของผู้ใช้
สร้างโทเค็น เวลาที่ใช้ในการเริ่มต้นการสนทนาใหม่
เริ่มการสนทนา เวลาที่ใช้ในการเริ่มต้นการสนทนาใหม่
ส่งกิจกรรม เวลาที่ใช้ในการส่งข้อความผู้ใช้ใหม่ (ไม่รวมการตอบของเอเจนต์)
รับกิจกรรม/เรียกดูกิจกรรม เวลาที่ใช้ในการตอบกลับของเอเจนต์

การติดตามเวลาการตอบสำหรับ Generate Token, Start Conversation และ Send Activity นั้นตรงไปตรงมาสำหรับเครื่องมือทดสอบการโหลด เนื่องจากขั้นตอนเหล่านี้ใช้คำขอ HTTP มาตรฐาน อย่างไรก็ตาม การวัดเวลาที่เอเจนต์ใช้ในการตอบข้อความของผู้ใช้นั้นซับซ้อนกว่า เนื่องจากเหตุผลดังต่อไปนี้:

  • การส่งและรับกิจกรรมผ่าน Direct Line เป็นไปตามรูปแบบอะซิงโครนัส เมื่อข้อความของผู้ใช้ถูกส่งโดยใช้คำขอ Send Activity การตอบกลับจะไม่ใช่ข้อความจากเอเจนต์ แต่เป็นเพียงการยืนยันว่าข้อความของผู้ใช้ถูกโพสต์สำเร็จแล้ว

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

    ภาพหน้าจอแสดงเวลาการตอบระหว่างข้อความ

ระบุการตอบล่าสุดของเอเจนต์

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

  • ระบุข้อความเอเจนต์ล่าสุดที่ตามหลังข้อความของผู้ใช้
  • คำนวณความแตกต่างของเวลาระหว่างสองค่า

โปรโตคอลพื้นฐานที่ Copilot Studio ใช้ไม่มีแนวคิดเรื่อง “last response” เพราะทั้งเอเจนต์และผู้ใช้สามารถส่งข้อความได้ทุกเมื่อ ดังนั้น สคริปต์ทดสอบประสิทธิภาพของคุณต้องสันนิษฐานว่า หากเอเจนต์ไม่ส่งข้อความภายในระยะเวลาที่กำหนด จะไม่มีข้อความเพิ่มเติมจากเอเจนต์จนกว่าจะมีข้อความใหม่จากผู้ใช้ การนำตรรกะนี้ไปใช้จะแตกต่างกันไปตามวิธีที่สคริปต์ของคุณสื่อสารกับ Direct Line

ใช้ WebSockets

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

ใช้ HTTP GET

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

เพย์โหลดแบบง่ายต่อไปนี้แสดงถึงการตอบสนองที่กลับมาจากปลายทางกิจกรรม:

[
  {
    "type": "message",
    "id": "98SryQaHr2rGthOGpChPK2-us|0000012",
    "timestamp": "2025-01-07T09:12:22.0329242Z",
    "from": {
      "id": "a688eb7d-092a-42a8-8ef5-73123b9c2aaa",
      "name": ""
    },
    "conversation": {
      "id": "98SryQaHr2rGthOGpChPK2-us"
    },
    "text": "I also want to set up a new account",
  },
  {
    "type": "message",
    "id": "98SryQaHr2rGthOGpChPK2-us|0000017",
    "timestamp": "2025-01-07T09:12:24.5478686Z",
    "from": {
      "id": "4b56bfa5-5574-5bb3-7aa3-99b8798b9d90",
      "name": "Load Testing",
      "role": "bot"
    },
    "conversation": {
      "id": "98SryQaHr2rGthOGpChPK2-us"
    },
    "text": "Sure, please bear with me as I set up your new account",
    "replyToId": "98SryQaHr2rGthOGpChPK2-us|0000012",
  },
  {
    "type": "message",
    "id": "98SryQaHr2rGthOGpChPK2-us|0000018",
    "timestamp": "2025-01-07T09:12:33.1960413Z",
    "from": {
      "id": "4b56bfa5-5574-5bb3-7aa3-99b8798b9d90",
      "name": "Load Testing",
      "role": "bot"
    },
    "conversation": {
      "id": "98SryQaHr2rGthOGpChPK2-us"
    },
    "text": "Almost done! Thank you for your patience",
    "replyToId": "98SryQaHr2rGthOGpChPK2-us|0000012",
  },
  {
    "type": "message",
    "id": "98SryQaHr2rGthOGpChPK2-us|0000019",
    "timestamp": "2025-01-07T09:12:41.9166159Z",
    "from": {
      "id": "4b56bfa5-5574-5bb3-7aa3-99b8798b9d90",
      "name": "Load Testing",
      "role": "bot"
    },
    "conversation": {
      "id": "98SryQaHr2rGthOGpChPK2-us"
    },
    "text": "All done! Your new account is now active.",
    "inputHint": "acceptingInput",
    "replyToId": "98SryQaHr2rGthOGpChPK2-us|0000012"
  }
]

เมื่อคุณแยกวิเคราะห์เพย์โหลดและคำนวณเวลาการตอบ ให้พิจารณาแนวทางต่อไปนี้:

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