def توقع (self، source: List[int], beam\_size=1, max\_length=64) -> List[int]:
 """
 بالنظر إلى جملة في اللغة المصدر، يجب عليك إخراج جملة في الهدف
 لغة الطول على الأكثر `max\_length` التي تنشئها باستخدام بحث الشعاع
 "الشعاع\_الحجم" المحدد.
 لاحظ أن رمز بداية الجملة هو 0 ورمز نهاية الجملة هو 1.
 قم بإرجاع الشعاع العلوي النهائي (الذي تم تحديده باستخدام متوسط ​​احتمالية السجل) ومتوسطه
 تسجيل احتمال.
 تلميح: قد تكون الوظائف التالية مفيدة:
 - torch.topk (https://pytorch.org/docs/stable/generated/torch.topk.html)
 - torch.softmax (https://pytorch.org/docs/stable/generated/torch.nn.functional.softmax.html)
 """
 self.eval() # اضبط وحدة PyTorch على وضع الاستدلال (وهذا يؤثر على أشياء مثل التسرب)

 إذا لم يكن المثيل (المصدر، الشعلة. Tensor):
 source\_input = torch.tensor(source).view(1, -1)
 آخر:
 source\_input = source.view(1, -1)

 SOS\_TOKEN = 2
 EOS\_TOKEN = 3
 انتهى\_الحزم = []
 انتهى\_avgll = np.empty(0)

 # الحصول على ترميز الإدخال
 source\_input = source\_input.repeat\_interleave(beam\_size, dim=0)
 المشفر\_المصدر، المصدر\_الحشو = self.encoder(المصدر\_الإدخال)

 # فك تشفير SOS بحجم الشعاع
 sos = torch.full ((beam\_size, 1), SOS\_TOKEN)
 خارج، \_ = self.decoder(encoded\_source، source\_padding، sos)
 القيم والمؤشرات = torch.softmax(out[0, -1], -1).topk(beam\_size)
 Beam\_logl = torch.log(values)
 Beam\_seq = torch.cat((sos, indices.view(-1, 1)), dim=1)

 # تكرار البحث عن الشعاع
 ط = 1
 بينما أنا < الحد الأقصى\_الطول والشعاع\_الحجم > 0:
 أنا += 1

 خارج، \_ = self.decoder(encoded\_source، source\_padding، beam\_seq)

 # احصل على إخراج مؤقت لشعاع\_حجم \*فوكاب\_حجم، ثم احصل على حجم\_حجم الشعاع العلوي
 seq\_temp = torch.cat(
 (beam\_seq.repeat\_interleave(self.target\_vocab\_size + 1, 0)،
 torch.arange(self.target\_vocab\_size + 1).unsqueeze(-1).tile(beam\_size, 1)))، 1)
 logl\_temp = (beam\_logl.unsqueeze(-1) + torch.log(torch.softmax(out[:, -1], -1))).view(-1)
 شعاع\_logl، المؤشرات = logl\_temp.topk(beam\_size)
 الشعاع\_seq = seq\_temp[المؤشرات]

 إذا كنت == الحد الأقصى\_الطول - 1:
 # إنهاء كل البحث عند الوصول إلى الحد الأقصى\_للطول
 خ = شعاع\_seq.detach().numpy()
 متوسط ​​\_ll = شعاع\_logl.detach().numpy() / شعاع\_seq.size(-1)
 انتهى\_beams += fs.tolist()
 Finished\_avgll = np.append(finished\_avgll, avg\_ll)
 إليف EOS\_TOKEN في الشعاع\_seq[:, -1]:
 # إنهاء البحث وتقليل حجم الشعاع عند وصول EOS
 انتهى =شعاع\_seq[:, -1] == EOS\_TOKEN
 خ = شعاع\_seq[انتهى].detach().numpy()
 متوسط ​​\_ll = شعاع\_logl[انتهى].detach().numpy() / شعاع\_seq.size(-1)
 انتهى\_beams += fs.tolist()
 Finished\_avgll = np.append(finished\_avgll, avg\_ll)
 شعاع\_seq = شعاع\_seq[~انتهى]
 شعاع\_logl = شعاع\_logl[~انتهى]
 مشفر\_مصدر = مشفر\_مصدر[~انتهى]
 المصدر\_الحشو = المصدر\_الحشو[~انتهى]
 شعاع\_حجم -= انتهى.sum()

 # إخراج أفضل تسلسل وفقًا لأفضل متوسط ​​احتمالية السجل
 best\_ll = انتهى\_avgll.max()
 best\_seq = انتهى\_beams[finished\_avgll.argmax()]
 إرجاع الأفضل\_seq، الأفضل\_ll
 

أعد كتابة هذا لجعله يبدو مختلفًا ولكن دون تغيير الوظيفة
{"source": "ewof/sharegpt-instruct-unfiltered-deduped", "kind": "human", "evolved_from": null}