แชร์ผ่าน


ทดสอบตัวแทนการสนทนาโดยใช้ 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 เป็นไปตามรูปแบบแบบอะซิงโครนัส เมื่อข้อความของผู้ใช้ถูกส่งโดยใช้คําขอ ส่งกิจกรรม การตอบกลับจะไม่ใช่ข้อความจากตัวแทน แต่เป็นเพียงการยืนยันว่าข้อความของผู้ใช้ถูก โพสต์สําเร็จแล้ว

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

    สกรีนช็อตแสดงเวลาตอบกลับระหว่างข้อความ

ระบุการตอบกลับล่าสุดของตัวแทน

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

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

โปรโตคอลพื้นฐานที่ Copilot Studio ใช้ไม่มีแนวคิดของ 'การตอบสนองครั้งสุดท้าย' เนื่องจากทั้งตัวแทนและผู้ใช้สามารถส่งข้อความได้ตลอดเวลา ดังนั้น สคริปต์การทดสอบประสิทธิภาพของคุณต้องสันนิษฐานว่าหากตัวแทนไม่ส่งข้อความภายในกรอบเวลาที่กําหนด จะไม่มีการส่งข้อความเพิ่มเติมจนกว่าจะมีการส่งข้อความของผู้ใช้รายถัดไป การใช้งานตรรกะนี้จะแตกต่างกันไปตามวิธีที่สคริปต์ของคุณสื่อสารกับ 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 ของคุณสมบัติของข้อความผู้ใช้
  • คุณสามารถคํานวณเวลาตอบกลับของตัวแทนเป็นความแตกต่างของเวลาระหว่างข้อความผู้ใช้และข้อความตัวแทนล่าสุดที่ตอบกลับข้อความผู้ใช้