Spaces:
Paused
Paused
Create z_teacher2.js
Browse files- z_teacher2.js +90 -0
z_teacher2.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// ملف z_teacher2.js المطوّر - نظام البحث الذكي (RAG) اللحظي
|
| 2 |
+
(async function() {
|
| 3 |
+
let knowledgeChunks =[]; // مصفوفة لتخزين فقرات المعلومات
|
| 4 |
+
|
| 5 |
+
try {
|
| 6 |
+
// جلبنا الملف بالاسم الجديد training_data2.txt
|
| 7 |
+
const response = await fetch('/static/training_data2.txt');
|
| 8 |
+
if (response.ok) {
|
| 9 |
+
const rawText = await response.text();
|
| 10 |
+
// تقطيع النص الضخم إلى فقرات منفصلة بناءً على الفراغات المزدوجة (Enter مرتين)
|
| 11 |
+
knowledgeChunks = rawText.split(/\n\s*\n/).map(chunk => chunk.trim()).filter(chunk => chunk.length > 10);
|
| 12 |
+
console.log("✅[Z Teacher 2]: تم تحميل وتقطيع المعرفة إلى", knowledgeChunks.length, "فقرة.");
|
| 13 |
+
} else {
|
| 14 |
+
console.warn("⚠️ [Z Teacher 2]: لم يتم العثور على ملف training_data2.txt");
|
| 15 |
+
}
|
| 16 |
+
} catch (e) {
|
| 17 |
+
console.error("❌[Z Teacher 2]: خطأ في قراءة ملف المعرفة", e);
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
// دالة للبحث عن الفقرات التي لها علاقة بسؤال المستخدم
|
| 21 |
+
function findRelevantKnowledge(userQuery) {
|
| 22 |
+
if (!userQuery || knowledgeChunks.length === 0) return "";
|
| 23 |
+
|
| 24 |
+
// تحويل السؤال إلى كلمات مفتاحية (وتجاهل الكلمات القصيرة)
|
| 25 |
+
let keywords = userQuery.toLowerCase().split(/\s+/).filter(w => w.length > 3);
|
| 26 |
+
|
| 27 |
+
if (keywords.length === 0) return "";
|
| 28 |
+
|
| 29 |
+
// إعطاء تنقيط لكل فقرة بناءً على عدد الكلمات المفتاحية الموجودة فيها
|
| 30 |
+
let scoredChunks = knowledgeChunks.map(chunk => {
|
| 31 |
+
let score = 0;
|
| 32 |
+
let lowerChunk = chunk.toLowerCase();
|
| 33 |
+
keywords.forEach(kw => {
|
| 34 |
+
if (lowerChunk.includes(kw)) score++;
|
| 35 |
+
});
|
| 36 |
+
return { chunk, score };
|
| 37 |
+
});
|
| 38 |
+
|
| 39 |
+
// ترتيب الفقرات من الأعلى نقاطاً إلى الأقل، وأخذ أفضل 3 فقرات فقط
|
| 40 |
+
let topChunks = scoredChunks
|
| 41 |
+
.filter(item => item.score > 0)
|
| 42 |
+
.sort((a, b) => b.score - a.score)
|
| 43 |
+
.slice(0, 3) // يمكنك تغيير الرقم إذا أردت إرسال معلومات أكثر
|
| 44 |
+
.map(item => item.chunk);
|
| 45 |
+
|
| 46 |
+
if (topChunks.length === 0) return "";
|
| 47 |
+
|
| 48 |
+
return topChunks.join("\n\n---\n\n");
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
// اعتراض الطلب الذاهب للذكاء الاصطناعي
|
| 52 |
+
const originalGroqFetch = window.groqFetch;
|
| 53 |
+
|
| 54 |
+
window.groqFetch = async function(url, options) {
|
| 55 |
+
try {
|
| 56 |
+
if (options && options.body && knowledgeChunks.length > 0) {
|
| 57 |
+
let bodyObj = JSON.parse(options.body);
|
| 58 |
+
|
| 59 |
+
if (bodyObj && bodyObj.messages) {
|
| 60 |
+
// العثور على آخر رسالة كتبها المستخدم
|
| 61 |
+
let lastUserMsg = bodyObj.messages.slice().reverse().find(m => m.role === 'user');
|
| 62 |
+
|
| 63 |
+
if (lastUserMsg && lastUserMsg.content) {
|
| 64 |
+
// استخراج المعلومات ذات الصلة
|
| 65 |
+
let relevantInfo = findRelevantKnowledge(lastUserMsg.content);
|
| 66 |
+
|
| 67 |
+
if (relevantInfo !== "") {
|
| 68 |
+
console.log("🔍 [Z Teacher 2]: تم العثور على معلومات مفيدة وحقنها!");
|
| 69 |
+
|
| 70 |
+
let sysMsg = bodyObj.messages.find(m => m.role === 'system');
|
| 71 |
+
let injection = `\n\n══════════════════════════════════════════\n⚠️ قاعدة بيانات (Z TEACHER 2) - معلومات مستخرجة خصيصاً للموقف الحالي:\nاستخدم هذه المعلومات للإجابة على سؤال المستخدم بدقة إذا كانت تفيده:\n${relevantInfo}\n══════════════════════════════════════════\n`;
|
| 72 |
+
|
| 73 |
+
if (sysMsg) {
|
| 74 |
+
sysMsg.content += injection;
|
| 75 |
+
} else {
|
| 76 |
+
bodyObj.messages.unshift({ role: 'system', content: injection });
|
| 77 |
+
}
|
| 78 |
+
}
|
| 79 |
+
}
|
| 80 |
+
options.body = JSON.stringify(bodyObj);
|
| 81 |
+
}
|
| 82 |
+
}
|
| 83 |
+
} catch (e) {
|
| 84 |
+
console.error("[Z Teacher 2]: خطأ أثناء محاولة البحث والحقن", e);
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
// إرسال الطلب بشكل طبيعي بعد التعديل الخفي
|
| 88 |
+
return originalGroqFetch.apply(this, arguments);
|
| 89 |
+
};
|
| 90 |
+
})();
|