ออกแบบแนวปฏิบัติที่ดีที่สุดเพื่อหลีกเลี่ยงข้อความซ้ําซ้อน

ใช้ได้เฉพาะกับ:ชุดสายรัดมาตรฐาน

ในฮาร์เนสมาตรฐาน มีหลายคอมโพเนนต์ที่สามารถรองรับคําขอของผู้ใช้ได้ และแต่ละคอมโพเนนต์จะทํางานจากมุมมองของตัวเอง หัวข้อสามารถแสดงข้อความหรือการ์ดแบบปรับเปลี่ยนได้ (Adaptive Card) เครื่องมือสามารถส่งคืนข้อมูล และเอเจนต์ย่อยหรือเอเจนต์ที่เชื่อมต่อสามารถตอบกลับตามบริบทของตนเอง ชั้นออร์เคสตราจะดําเนินแผนต่อไปจากบริบทที่อาจไม่ตรงกับการตอบสนองที่ผู้ใช้ได้รับ เมื่อมุมมองเหล่านั้นแยกจากกัน ผู้ใช้อาจเห็นข้อความซ้ําหรือคําตอบที่พลาดไป ผู้ผลิตมักเจอพฤติกรรมนี้บ่อยขึ้นกับรุ่นใหม่มากกว่ารุ่นเก่า

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

Note

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

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

หากต้องการดีบักอาการในเอเจนต์ที่ใช้งานจริง ให้เริ่มจากการ แก้ไขปัญหาข้อความซ้ําและคําตอบที่พลาด แล้วกลับมาที่บทความนี้เพื่อขอคําแนะนําในการออกแบบใหม่

ออกแบบโดยคํานึงถึงบริบท

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

  • หนึ่งองค์ประกอบ แล้วจบทุกหัวข้อ หัวข้อเดียว เครื่องมือ ตัวแทนลูก หรือตัวแทนที่เชื่อมต่อจะจัดการคําขอและเซสชันจะสิ้นสุดลง ถ้าคอมโพเนนต์นั้นเขียนคําตอบครบถ้วนและรายงานการเติมเต็มนั้น ชั้น orchestration จะไม่มีเหตุผลที่จะเขียนคําตอบใหม่
  • มีหลายองค์ประกอบในเซสชัน เซสชันสามารถรันหลายคอมโพเนนต์ก่อนจะให้คําตอบที่สมบูรณ์แก่ผู้ใช้ เซสชันหนึ่งครั้งยังสามารถครอบคลุมคําขอหลายรายการได้ องค์ประกอบหนึ่งอาจตอบบางส่วนของคําขอ ในขณะที่อีกองค์ประกอบหนึ่งต้องตอบส่วนที่เหลือ ทุกชิ้นส่วนที่ทํางานได้ต้องรายงานสิ่งที่มันทํา มิฉะนั้น ส่วนประกอบในภายหลังอาจทํางานกับบริบทที่ดูเหมือนไม่มีคําตอบและตอบสนองอีกครั้ง
เมื่อบริบทมีความสําคัญ ตัวอย่าง การออกแบบเสียง
ไม่มีการใช้บริบท หัวข้อจะแสดงคําตอบฉบับเต็มในข้อความหรือการ์ดปรับเปลี่ยน โหนด End all topics จะป้องกันไม่ให้ชั้น orchestration ตอบกลับอีก
ชั้นการประสานงานใช้บริบท หัวข้อจะแสดงตารางสําหรับส่วน A จากนั้นชั้นออร์เคสตรอเรชันจะตอบส่วน B โดยใช้ความรู้หรือเอเจนต์อื่น แต่ละคอมโพเนนต์จะรายงานสิ่งที่ตอบและคืนค่าที่ขั้นตอนถัดไปต้องการ ดังนั้นชั้นออร์เคสตราจึงไม่ตอบซ้ําสองครั้ง
คอมโพเนนต์ใช้บริบท หัวข้อจะตอบส่วน A ให้กับผู้ใช้ จากนั้นเอเจนต์อีกตัวจะจัดการส่วน B ถ้าเอเจนต์ได้รับบริบทแม่ที่ A ดูเหมือนไม่ได้รับคําตอบ มันจะตอบ A อีกครั้ง ยกเว้นบริบทแม่บนเอเจนต์ที่เชื่อมต่อเมื่อเป็นไปได้ และคอมโพเนนต์จะส่งผลลัพธ์ที่ยืนยันสิ่งที่ตอบไปและสิ่งที่เหลืออยู่

ออกแบบส่วนประกอบเพื่อรายงานสิ่งที่เกิดขึ้น

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

ใช้แนวทางปฏิบัติเหล่านี้ร่วมกันเป็นแนวทางการออกแบบเดียว:

  1. ส่งกลับผลลัพธ์ที่บันทึกสิ่งที่เกิดขึ้น แค่เอาต์พุตก็เพียงพอสําหรับรุ่นเก่า
  2. เพิ่มคําสั่งในคําอธิบายหัวข้อหรือซับเอเจนต์ ที่กําหนดความหมายของการรันที่สําเร็จ แนวทางนี้ทําให้การออกแบบมีความแข็งแกร่ง
  3. เพิ่มคําสั่งระดับบนสุด เพื่อให้ชั้น orchestration ตรวจสอบผลลัพธ์เหล่านั้นก่อนที่จะตอบกลับ รุ่นใหม่ๆ ได้รับประโยชน์มากที่สุดจากแนวทางนี้

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

ส่วนประกอบ รายงานกลับด้วย ซ่อม
หัวข้อ answered (จริง/เท็จ), choiceReceived (จริง/เท็จ), และผลลัพธ์ที่แสดงค่าหรือสรุป (ข้อความ) คืนผลลัพธ์และเพิ่มคําสั่งในคําอธิบายหัวข้อ ออกแบบหัวข้อเป็น mini-agent เพื่อหลีกเลี่ยงข้อความซ้ําซ้อน ให้คําอธิบายหัวข้อตัวอย่าง
Subagent (ตัวแทนลูกหรือเอเจนต์ที่เชื่อมต่อ) answered(จริง/เท็จ), interactionSummary (ข้อความ), (ข้อความ) openQuestions ให้ส่งคืนผลลัพธ์ เพิ่มอินพุตการกำหนดขอบเขต และเพิ่มคำสั่งลงในคำอธิบายของเอเจนต์ย่อย ออกแบบซับเอเจนต์ที่หลีกเลี่ยงข้อความซ้ําซ้อน ให้ตัวอย่างคําอธิบายซับเอเจนต์
ความรู้ (การเรียกหาความรู้) ไม่สามารถปรับแต่งบริบทได้ อาจจะตอบซ้ํา รักษาบริบทระดับบนสุดให้สะอาดและมีอิทธิพลต่อคําขอที่ส่งมา
โหนดคําตอบเชิงสร้างสรรค์ ไม่สามารถปรับแต่งบริบทได้ อาจต้องตอบซ้ํา คําตอบอาจถูกพูดซ้ําในภายหลัง รักษาบริบทระดับบนสุดให้สะอาด มีอิทธิพลต่อคําขอที่เขียนไปยังอินพุตของโหนด และให้หัวข้อโฮสต์ส่งผลลัพธ์หรือผลลัพธ์สถานะที่ตอบกลับ

ออกแบบคําสั่งระดับบนสุดที่แข็งแกร่งเพื่อหลีกเลี่ยงข้อความซ้ํา

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

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

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

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

จัดการหัวข้อ

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

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

เรียนรู้เพิ่มเติมเกี่ยวกับหัวข้อการออกแบบในฐานะมินิเอเจนต์ที่หลีกเลี่ยงข้อความซ้ําซ้อน

จัดการเอเจนต์ย่อยและเอเจนต์ที่เชื่อมต่อ

ออกแบบเอเจนต์ลูกและเอเจนต์ที่เชื่อมต่อเหมือนกับการออกแบบส่วนประกอบอื่น ๆ การโต้ตอบกับผู้ใช้จะไม่ปรากฏต่อพ่อแม่ ซึ่งจะรู้เหตุการณ์ผ่านผลลัพธ์ และหลังจากที่ตัวแทนเสร็จสิ้น

ตัวแทนย่อยและตัวแทนที่เชื่อมต่ออาจได้รับคำขอที่ยังไม่ได้รับการตอบกลับก่อนหน้านี้ ซึ่งยังคงอยู่ในบริบทของตัวแทนหลัก

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

เรียนรู้เพิ่มเติมในหัวข้อ Design subagent ที่หลีกเลี่ยงข้อความซ้ําซ้อน

จัดการความรู้

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

จัดการโหนดคำตอบแบบสร้างสรรค์

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

โหนดคําตอบเชิงสร้างสรรค์ไม่จําเป็นต้องมีการจัดการพิเศษใด ๆ นอกจากกฎที่ใช้กับทุกหัวข้อ: ส่งผลลัพธ์เป็นผลลัพธ์ของหัวข้อ หากโหนดตอบคําถามของผู้ใช้ในหัวข้อ ให้เพิ่มผลลัพธ์สถานะคําตอบและผลลัพธ์ที่แสดงค่า ผลลัพธ์เหล่านี้จะให้บันทึกกับชั้นออร์เคสตราว่าคําร้องได้รับการตอบกลับแล้ว และป้องกันไม่ให้ขั้นตอนถัดไปตอบกลับคําขออีกครั้ง

ตรวจสอบให้แน่ใจว่าคําอธิบายและคําแนะนําสอดคล้องกับมุมมอง

คําอธิบายและคําแนะนําก็เป็นส่วนหนึ่งของสัญญาบริบทเช่นกัน

คําแนะนํานี้นําไปสู่หัวข้อ:

When the user asks about their account balance, call the Account balance topic.

คําสั่งนี้จะกําหนดเส้นทางและกําหนดความเป็นเจ้าของคําตอบให้กับชั้นการจัดเรียง:

When the user asks about their account balance, call the Account balance topic and give the balance.

ถ้าหัวข้อแสดงยอดคงเหลือแล้ว คําสั่งที่สองจะสร้างเส้นทางคําตอบที่สอง หากทอปิกไม่ส่งคืน balanceValue ชั้น orchestration อาจเรียกทอปิกนั้นอีกครั้ง หรือตอบว่าไม่ทราบค่านั้น

ใช้คําอธิบายและคําแนะนําที่ตรงกับมุมมอง:

  • คําอธิบายหัวข้อช่วยให้ชั้นการจัดการออร์เคสตราตัดสินใจว่าจะใช้หัวข้อเมื่อใดและอย่างไร มันยังทําตามคําแนะนําเกี่ยวกับสิ่งที่ควรทําหรือส่งออกต่อไป
  • คําอธิบาย connected-agent มาจากมุมมองของตัวหลัก
  • คําสั่งตัวแทนที่เชื่อมต่อจะถูกอ่านจากมุมมองของตัวแทนที่เชื่อมต่อ
  • คําอธิบายผลลัพธ์ของหัวข้อหรือเอเจนต์ที่เชื่อมต่อจะบอกเลเยอร์ออร์เคสตรอเรชันว่าจะตีความค่าที่คืนมาอย่างไร

สําหรับหัวข้อที่แสดงคําตอบให้ผู้ใช้และตั้งค่า answered=true, อธิบายทั้งเวลาที่จะส่งไปยังหัวข้อและความหมายของการรันที่สําเร็จ:

This topic handles account balance requests.
If its answered output is true, the user has already received their response and it should not be answered again.

สําหรับหัวข้อที่เขียนเฉพาะผลลัพธ์ ให้อธิบายทั้งเวลาที่จะส่งไปยังหัวข้อและวิธีการตอบกลับ:

This topic handles account balance requests and responds with the balance value in italics.

กู้คืนบริบทในการสนทนายาว

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

ออกแบบสถานการณ์นี้โดยการส่งคืนและบันทึกบริบทสําคัญ และส่งกลับมาเมื่อจําเป็น:

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

  • บันทึกและเสิร์ฟค่าต่าง ๆ ในแต่ละเทิร์น ในช่วงเวลาที่เหมาะสม ก่อนหรือหลังการเรียกเครื่องมือ ให้ส่งเส้นทางไปยังหัวข้อที่สามารถเก็บหรือให้บริการค่าผ่านอินพุตและเอาต์พุต รวมถึงตัวแปรระดับโลก เพื่อไม่ให้แผนดึงค่าหรือขอค่านั้นซ้ํา

Tip

พฤติกรรมเอเจนต์ที่ไร้รอยต่อขึ้นอยู่กับการออกแบบเอเจนต์ที่คํานึงถึงบริบทในทุกขั้นตอนและทุกมุมมอง