ออกแบบซับเอเจนต์ที่หลีกเลี่ยงข้อความซ้ําซ้อน

Note

บทความนี้อธิบายคุณสมบัติและพฤติกรรมของสายรัดมาตรฐาน เรียนรู้วิธีเข้าถึงฟีเจอร์มาตรฐานใน Access standard agent และ agent flows

ข้อความซ้ําเกิดจากช่องว่างของบริบท การออกแบบเอเจนต์ต้องคํานึงถึงบริบทในทุกขั้นตอน

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

Tip

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

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

ปิดบริบทหลักสำหรับเอเจนต์ที่เชื่อมต่ออยู่

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

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

ภาพหน้าจอของตัวเลือก 'ส่งประวัติการสนทนาไปยังตัวแทนนี้' ที่เปิดใช้งาน โดยสังเกตว่าการยกเลิกการเลือกช่วยป้องกันการแชร์ประวัติระหว่างตัวแทน

เอเจนต์ย่อยไม่มีการตั้งค่าที่สอดคล้องกัน มันทํางานภายใน parent และรับบริบทสนทนาของ parent เสมอ

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

ใช้อินพุตการกําหนดขอบเขต

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

เพื่อปกป้องขอบเขตของซับเอเจนต์ ให้เพิ่มอินพุตที่มีคําอธิบายscopedRequestเช่น: The specific request this agent should fulfill ชั้นออร์เคสตราจะเติมข้อมูลนําเข้าเมื่อเรียกซับเอเจนต์ ตัวแทนแม่จะระบุส่วนที่เกี่ยวข้องของคําขอและส่งเฉพาะส่วนนั้น แม้ว่าบริบทของคําขอนั้นจะมีคําขอที่ยังไม่ได้รับการตอบกลับอีกชิ้นหนึ่ง

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

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

ตัวอย่างคําสั่งซับเอเจนต์:

Fulfill the request in the scopedRequest input. 
Treat it as your initial request and ignore any other initial requests in the conversation.

กําหนดค่าอินพุตและเอาต์พุต

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

สําคัญ

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

กําหนดค่าอินพุตและเอาต์พุตต่อไปนี้ และเขียนคําอธิบายของแต่ละรายการเพื่อให้ชั้นออร์เคสตราหลักอ่านได้:

อินพุตหรือเอาต์พุต คำอธิบาย วิธีการใช้
scopedRequest (ข้อมูลป้อนเข้า) คําขอเฉพาะที่ตัวแทนนี้ควรจะตอบสนอง แอปหลักจะเติมเฉพาะส่วนที่เกี่ยวข้องของคําขอของผู้ใช้เท่านั้น มันปกป้องซับเอเจนต์จากการตอบคําถามผิดเมื่อบริบทของพ่อแม่ยังคงมีคําขออื่นที่ยังไม่ได้คําตอบ ยึดคําสั่งของ subagent ไว้กับอินพุตนี้
answered (ผลลัพธ์) เป็นจริงเมื่อผู้ใช้ได้รับคําตอบสําหรับ scopedRequest แล้ว ตั้งค่าให้ใช้กับซับเอเจนต์ทุกตัว ไม่ว่าจะส่งข้อความถึงผู้ใช้หรือเงียบ คําสั่งระดับบนสุดที่แสดงถัดไปจะอ่านคําสั่งนี้เพื่อไม่ให้พาเรนต์ตอบคําขอเดิมอีก
scopedRequest (ผลลัพธ์) คำขอที่เอเจนต์นี้ดำเนินการ ทําซ้ําคําขอที่มีขอบเขตเพื่อให้ถึงชั้น orchestration ระดับบนสุด ซึ่งไม่สามารถเก็บข้อมูลนําเข้าที่สร้างขึ้นไว้ในบริบทของตัวเองได้อย่างน่าเชื่อถือ ในเทิร์นที่มีหลายเจตนาและต้องการซับเอเจนต์มากกว่าหนึ่งตัว ความสามารถนี้ช่วยให้ระดับบนวางแผนได้ถูกต้องและหลีกเลี่ยงการส่งซับเอเจนต์ผิดไปยังคําถามผิด
interactionSummary (ผลลัพธ์) สรุปสั้น ๆ ของคําตอบที่ส่งถึงผู้ใช้ คืนค่าเมื่อ subagent ส่งข้อความโดยตรงถึงผู้ใช้ เพื่อให้ parent รู้ว่าสื่อสารอะไรไปบ้างและไม่ต้องพูดซ้ํา
findings (ผลลัพธ์) คําตอบสําหรับ scopedRequest สําหรับพาเรนต์เพื่อส่งถึงผู้ใช้ ส่งคืนเมื่อ subagent ไม่ส่งข้อมูลตอบกลับ เพื่อให้ parent มีเนื้อหาสำหรับส่งต่อ
openQuestions (ผลลัพธ์) ส่วนใดส่วนหนึ่งของคําขอของผู้ใช้ที่ยังไม่ได้รับการตอบกลับ ส่งคืนจากซับเอเจนต์ใด ๆ ที่สามารถตอบสนองคําขอได้เพียงบางส่วน หรือเมื่อมีคําขอใหม่ปรากฏขึ้นในบทสนทนาของซับเอเจนต์ เพื่อให้เอเจนต์แม่สามารถดําเนินการที่เหลือและดําเนินการเชื่อมต่อเครื่องมือต่อไปได้ ซับเอเจนต์ไม่ควรเดาว่าเอเจนต์คนไหนจะดูแลส่วนที่เหลือ

เลือกส่วนประกอบที่สื่อสารกับผู้ใช้

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

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

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

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

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

เขียนคําอธิบายของ subagent สําหรับชั้น orchestration ของแม่ เพื่อให้มันรู้ว่าเมื่อใดควรใช้ subagent และวิธีอ่านผลลัพธ์ของมัน ตัวอย่าง

Handles payroll questions. 
If its answered output is true, the user has already received their response and it should not be answered again.

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

มอบหมายการสื่อสารของผู้ใช้ให้กับแม่

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

บอกซับเอเจนต์ให้เงียบและรายงานผลการสอบสวน ตัวอย่าง

Do NOT reply or communicate with the user directly. 
Only fulfill the scopedRequest provided in the input and respond with the result.

ซับเอเจนต์เงียบจะคืนค่า findings และ openQuestions, ทั้งสองอธิบายไว้ใน Configure inputs และ output เพื่อส่งคําตอบให้กับ parent และทําเครื่องหมายงานที่เหลืออยู่

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

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

Note

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

ซับเอเจนต์บางตัวต้องสื่อสารกันโดยตรง

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

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

ให้ซับเอเจนต์ส่งคําตอบยาวและส่งสรุป

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

Return answered และ interactionSummary, ทั้งสองอธิบายไว้ใน Configure inputs and outputs

ให้ซับเอเจนต์สนทนากับผู้ใช้

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

คืนค่า answered, scopedRequest, และ interactionSummary, ตามที่อธิบายไว้ใน กําหนดค่าอินพุตและเอาต์พุต

คําสั่งระดับบนสุดยังครอบคลุมกรณีการใช้งานนี้ด้วย