صمم وكلاء فرعيين يتجنب الرسائل المكررة

ملحوظة

تصف هذه المقالة ميزات وسلوك الحزام القياسي. تعرّف على كيفية الوصول إلى الميزات القياسية في الوصول إلى الوكلاء القياسيين وتدفقات الوكلاء.

تأتي الرسائل المكررة من فجوات في السياق. يجب أن يأخذ تصميم الوكيل السياق في الاعتبار في كل خطوة.

يعمل الوكيل الفرعي، سواء كان وكيلا فرعيا أو وكيلا متصلا، على طبقة تنسيق خاصة به داخل خطة الوكيل الأم. يتلقى طلبا من الجهة الأم ويكمل المهمة. ينتج الوكيل الفرعي ثلاثة أنواع من المخرجات: المحتوى الذي يعرضه للمستخدم، والقيم التي يعيدها من خلال المخرجات المعرفة، والاستجابة الضمنية التي يرسلها إلى الوكيل المستدعي. لا يمكن للوالد رؤية تبادل الوكيل الفرعي مع المستخدم ويتعلم النتيجة فقط من خلال المخرجات المعرفة والاستجابة الضمنية. هذا الرؤية المحدودة غالبا ما يسبب تكرار الرسائل والإجابات المفقودة.

نصيحة

للحصول على إرشادات حول متى يجب تقسيم العمل بين الوكلاء وأفضل الممارسات العامة لعدة وكلاء، استشر أنماط تنسيق الوكلاء المتعددين وأفضل الممارساتوأنماط الوكلاء المتعددين. تشرح هذه المقالة كيف تتوافق المدخلات والمخرجات مع إجابة الوكيل الفرعي مع سياق الوكيل الأم.

تبني هذه المقالة على نموذج السياق الموصوف في توزيع السياق في الحزمة القياسية وقرارات التصميم في أفضل ممارسات التصميم لتجنب الرسائل المكررة.

إيقاف سياق الأصل للوكيل المتصل

يمكن للوكيل الفرعي الذي يستقبل سياق محادثة الوالد أن يتصرف بناء عليه. إذا احتوى ذلك السياق على طلب لم يرد عليه الوالد بعد، قد يجيب الوكيل الفرعي عليه، أو يكرر شيئا تعاملت معه الأم بالفعل، أو يتولى الدور الخطأ. هذه الإجراءات عادة ما تسبب رسائل مكررة.

الوكيل المتصل لديه إعداد يسمى تمرير سجل المحادثة لهذا الوكيل، يتحكم فيما إذا كان يستقبل سياق محادثة الوالد. يتم تمكين هذا الإعداد افتراضيًا. قم بإلغاء تحديده بحيث يعمل الوكيل المتصل فقط من المدخلات التي يرسلها الوالد، وليس من المحادثة كاملة.

لقطة شاشة لخيار 'تمرير سجل المحادثة إلى هذا الوكيل' مفعل، مع ملاحظة أن إلغاء الاختيار يمنع مشاركة التاريخ بين الوكلاء.

الوكيل الفرعي ليس له إعداد مكافئ. تدور داخل الوالد ودائما ما تستقبل سياق محادثة الوالد.

بالنسبة للوكلاء المتصلين الذين يحتاجون إلى الاحتفاظ بالسياق للعمل الذي تم تكليفه به، وللوكلاء الفرعيين الذين لديهم سياق افتراضي، استخدم مدخل تحديد النطاق لحماية نطاق الوكيل الفرعي.

استخدم مدخل تحديد النطاق

أحيانا يحتاج الوكيل الفرعي إلى سياق الوكيل الأم لإكمال مهامه. عندما تمر بهذا السياق، أضف مدخلا للتحديد النطاقي—فهو يخبر الوكيل الفرعي بالضبط ما الذي يجب أن يعمل عليه، حتى لا تؤدي الطلبات المتبقية وغير الإجابة إليها في السياق إلى إنجاز المهمة. إذا لم تتجاوز السياق، فلن تحتاج إلى مدخل تحديد النطاق لأن الوكيل الفرعي لديه فقط الطلب الذي وجهه الوالد إليه.

لحماية نطاق الوكيل الفرعي، أضف مدخلا مسمى scopedRequest مع وصف مثل: The specific request this agent should fulfill. تُعبِّئ طبقة التنسيق الإدخال عند استدعاء الوكيل الفرعي. يقوم الوكيل الأم بتحديد الجزء ذي الصلة من الطلب ويمرر ذلك الجزء فقط، حتى لو احتوى سياقه على طلب آخر لم يتم الرد عليه.

مدخل النطاق هو تصميم قوي حتى عندما لا تحتفظ بالسياق الأصلي. يمنح المدخل الصانع مزيدا من التحكم في محتويات الطلب المرسل إلى الوكيل الفرعي.

تثبيت تعليمات الوكيل الفرعي على ذلك الإدخال بحيث يعمل من الطلب المحدد ويتجاهل أي شيء آخر يشبه الطلب الأولي.

أمثلة على تعليمات الوكيل الفرعي:

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

تكوين المدخلات والمخرجات

المدخلات والمخرجات هي العقد بين الشركة الأم والوكيل الفرعي. المدخلات تحدد نطاق ما يعمل عليه الوكيل الفرعي، والمخرجات تخبر الوالد بما حدث ليتمكن من تنظيم بقية المحادثة. لا يمكن للجهة الأم رؤية تبادل الوكيل الفرعي مع المستخدم، لذا فإن هذا العقد هو الإشارة الوحيدة الموثوقة التي لديها.

مهم

الوكيل الفرعي الذي لا يعيد أي مخرجات هو علامة تحذير. من دون مخرجات، لا يملك الوكيل الأساسي أي سجل لما أجاب به الوكيل الفرعي أو لما تبقى. يمكنه تكرار إجابة قدمها الوكيل الفرعي بالفعل، أو التخلي عن الجزء من الطلب الذي لم يتعامل معه الوكيل الفرعي.

قم بتكوين المدخلات والمخرجات التالية، واكتب وصف كل واحدة منها ليقرأها طبقة التوزيع الأم:

الإدخال أو الإخراج الوصف كيفية الاستخدام
scopedRequest (إدخال) الطلب المحدد الذي يجب أن يلبي هذا الوكيل. يملأ الوالد الملف بالجزء المناسب فقط من طلب المستخدم. تحمي الوكيل الفرعي من الإجابة على السؤال الخطأ عندما لا تزال سياق الوالد يحمل طلبات أخرى لم تتم الرد عليها. اربط تعليمات الوكيل الفرعي بهذا الإدخال.
answered (الإخراج) صحيح عندما يكون المستخدم قد تلقى بالفعل إجابة على طلب scopedRequest. ضبطه على كل وكيل فرعي، سواء أرسل رسالة للمستخدم أو بقي صامتا. التعليمات العليا المعروضة بعد ذلك تقرأها حتى لا يرد الوالد على نفس الطلب مرة أخرى.
scopedRequest (الإخراج) الطلب الذي عمل عليه هذا العميل. كرر الطلب المحدد بحيث يصل إلى طبقة التوزيع العلوية، التي لا تحتفظ بالمدخلات التي تنشئها في سياقها بشكل موثوق. في الأدوار متعددة النوايا التي تحتاج إلى أكثر من وكيل فرعي واحد، تتيح هذه القدرة للمستوى الأعلى التخطيط بشكل صحيح وتجنب توجيه الوكيل الفرعي الخطأ إلى سؤال خاطئ.
interactionSummary (الإخراج) ملخص قصير للرد الذي تم تقديمه للمستخدم. أعد الملف عندما يرسل الوكيل الفرعي رسالة مباشرة للمستخدم، حتى يعرف الوالد ما تم التواصل معه ولا يكرره.
findings (الإخراج) الإجابة على طلب scopedRequest، ليقدمها الوالد للمستخدم. أعدها عندما يبقى الوكيل الفرعي صامتا، حتى يكون لدى الوالد المحتوى لتسليمه.
openQuestions (الإخراج) أي جزء من طلب المستخدم يبقى دون إجابة. أعده من أي وكيل فرعي يمكنه تنفيذ جزء فقط من الطلب، أو عندما ظهر طلب جديد في محادثة الوكيل الفرعي، حتى يتمكن الوكيل الأصلي من إكمال الباقي ومواصلة سلسلة الأدوات. لا ينبغي للوكيل الفرعي أن يخمن أي وكيل يتعامل مع الباقي.

اختر أي مكون يتواصل مع المستخدم

يقرر ما إذا كان الوكيل الأم أو الوكيل الفرعي يتواصل مع المستخدم. في معظم الحالات، دع الوكيل الأم يتواصل مع المستخدم حتى يتمكن من دمج النتائج في استجابة واحدة. دع الوكيل الفرعي يتواصل مباشرة عندما يحتاج إلى تقديم رد طويل أو إجراء محادثة متعددة الأدوار. أعد معلومات كافية ليتعامل الوالد مع بقية المحادثة مع السياق.

أيا كان المكون الذي يتواصل معه، أضف تعليمة واحدة على المستوى العلوي بحيث تتحقق طبقة التنسيق من مخرجات كل وكيل فرعي قبل أن تجيب.

تعمل هذه التعليمات النموذجية على المستوى الأعلى في كل حالة، سواء كان الوكيل الفرعي يرسل رسالة مباشرة للمستخدم أو يبقى صامتا. قم بتعديلها وتخصيصها حسب الحاجة.

عند استدعاء أي موضوع أو وكيل، تحقّق دائمًا من قيمة الإخراج المنطقية 'answered' قبل أن تقرر بماذا ترد. للمواضيع والوكلاء قنوات تواصل خاصة بهم مع المستخدم. إذا كان 'تمت الرد' صحيحا، افترض دائما أن الطلب قد تم الرد عليه بشكل مناسب باستخدام متغير واحد على الأقل من المتغيرات المخرجة، وتحقق من أي منها بناء على وصف المخرج. لا تعطي اعترافا محرجا بالمحتوى الذي تم الرد عليه. قدم فقط النتائج التي لم تجب، واستمر في المحادثة بشكل طبيعي مع الخطوة التالية.

مصطلح القناة لا يشير إلى قناة تكامل. إنه جهاز توجيه يخبر طبقة التنسيق أن المستخدم ربما رأى الإجابة بالفعل من خلال مكون آخر.

اكتب وصف الوكيل الفرعي لطبقة التنسيق الأم، حتى يعرف متى يستخدم الوكيل الفرعي وكيف يقرأ مخرجاته. على سبيل المثال:

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، وكلاهما موصوف في تكوين المدخلات والمخرجات، لتسليم إجابته إلى الوالد وتحديد أي عمل متبقي.

أعد مخرجا openQuestions . تسمح لطبقة التنسيق بإكمال بقية طلب المستخدم ومواصلة سلسلة الأدوات عندما يستطيع الوكيل الفرعي تنفيذ جزء فقط مما طلب منه.

إبقاء الوكيل الفرعي صامتا يتطلب تعليمات صريحة. افتراضيا، يمكن للوكيل الفرعي أن يرسل رسالة للمستخدم بمفرده أثناء التشغيل. إعداد "بعد إكمال التشغيل " لا يمنع هذه الرسائل لأنه يخبر الوالد فقط بما يجب فعله عند انتهاء الوكيل الفرعي.

ملحوظة

إخبار الوكيل الأصلي "أنت الوكيل الوحيد الذي يتحدث مع المستخدم" لا ينجح. لا يمكن للوكيل الأم إيقاف الوكيل الفرعي الجار، ويمكن للوكيل الفرعي إرسال رسالة للمستخدم بنفسه. بدلا من ذلك، طلب من الوكيل الفرعي أن يبقى صامتا، ثم اختبر للتأكد.

يجب أن يتواصل بعض الوكلاء الفرعيين مباشرة

الوكيل الفرعي الذي يرسل رسالة مباشرة للمستخدم هو خيار صالح، وليس انتهاكا لقاعدة، لكنه يتطلب تصميما متعمدا لتجنب تكرار الرسائل من الشركة الأم.

تتطلب بعض حالات الاستخدام من الوكيل الفرعي الرد مباشرة على المستخدم، إما لتقديم رد طويل دون نسخه إلى السياق الأصلي أو لإجراء محادثة. لتجنب تكرار الرسائل وفقدان السياق، قم بتمرير السياق إلى الجهة الأم في المخرجات.

اطلب من الوكيل الفرعي إجابته مطولا وإعادة ملخص

يقدم الوكيل الفرعي رده الكامل مباشرة للمستخدم ويعيد فقط ملخصا موجزا أو ملاحظة تفيد بأنه قدم الإجابة. استخدم هذا النهج للردود الطويلة، مثل التحليلات التفصيلية، وحدد المعلومات التي تعاد إلى سياق الوالد. الهدف هو إبقاء سياق الوالدين صغيرا لكنه مطلع.

الإرجاع answered و interactionSummary، وكلاهما موصوف في إعداد المدخلات والمخرجات.

اجعل الوكيل الفرعي يجري محادثة مع المستخدم

يقوم الوكيل الفرعي بتبادل عدة رسائل مع المستخدم عبر عدة خطوات لإكمال الطلب المحدد للنطاق. الخطر الرئيسي هو أن الوالد غير مدرك لخطوات المحادثة الوسيطة، أو عمل الوكيل الفرعي، أو أي إجابات مقدمة، أو أي طلبات جديدة ظهرت. نتيجة لذلك، لا يستطيع الوالد التصرف بناء على الطلبات الجديدة أو الرد بشكل صحيح في الخطوات اللاحقة.

أعِد interactionSummary و وscopedRequest، كما هو موضح في answered.

التعليمات العليا تغطي أيضا هذه الحالة المستخدمة.