تحسين LLM: RAG، وبحث المتجهات، والحافة
يعد تشغيل نموذج المعلمة 70B على واجهة المتجر بمثابة انتحار. كيفية تصميم ميزات الذكاء الاصطناعي التي تكون سريعة ورخيصة ومفيدة بالفعل.
في عام 2024، تساءل كل مدير تنفيذي للتجارة الإلكترونية: “كيف نضيف الذكاء الاصطناعي؟” في عام 2025، يجيب كل مدير تنفيذي للتكنولوجيا: “من الناحية المثالية، دون الإفلاس”. نماذج اللغة الكبيرة (LLMs) ثقيلة وبطيئة ومهلوسة. لا يرغب العملاء في الدردشة مع الروبوت الذي يعتقد أن محمصة الخبز عبارة عن ميكروويف. إنهم يريدون البحث الدلالي والتخصيص المفرط. يتطلب هذا بنية محددة: RAG (جيل الاسترجاع المعزز) عند الحافة.
لماذا يناقش Maison Code هذا الأمر
في Maison Code Paris، نعمل بمثابة الضمير المعماري لعملائنا. غالبًا ما نرث الأكوام “الحديثة” التي تم إنشاؤها دون فهم أساسي للحجم. نرى واجهات برمجة تطبيقات بسيطة تستغرق 4 ثوانٍ للرد بسبب مشكلات استعلام N+1، و”الخدمات الصغيرة” التي تكلف 5000 دولار شهريًا كرسوم سحابية خاملة.
نناقش هذا الموضوع لأنه يمثل نقطة محورية حاسمة في النضج الهندسي. إن تنفيذ هذا بشكل صحيح يميز MVP الهش عن النظام الأساسي المرن على مستوى المؤسسات والذي يمكنه التعامل مع حركة مرور الجمعة السوداء دون بذل أي جهد.
المشكلة: الكمون والتكلفة
مثال: يسأل أحد المستخدمين: “هل لديك أي فساتين صيفية مناسبة لحفل زفاف في إيطاليا؟”
-
النهج الساذج: أرسل كتالوج المنتج بالكامل (CSV) إلى نافذة سياق GPT-4.
- التكلفة: 2.00 دولار لكل استعلام (رموز الإدخال).
- زمن الوصول: 15 ثانية.
- النتيجة: يغادر المستخدم قبل تحميل الإجابة.
-
** المنهج الهندسي **: بحث المتجهات + RAG.
- التكلفة: 0.002 دولار لكل استعلام.
- زمن الوصول: 400 مللي ثانية.
- النتيجة: التحويل.
الهندسة المعمارية: خط أنابيب RAG
نحن لا نطلب من LLM “معرفة” منتجاتنا. نطلب منه “تلخيص” نتائج البحث لدينا.
مخطط تسلسل
المستخدم المشارك
حافة المشارك كوظيفة الحافة (Vercel)
ناقل المشارك كـ Vector DB (Pinecone)
مشارك LLM كـ GPT-4o-mini
المستخدم->>الحافة: "فستان أحمر لحفل زفاف في إيطاليا"
ملاحظة على الحافة: 1. إنشاء التضمينات
الحافة->>LLM: طلب التضمين (تضمين النص-3-صغير)
LLM-->>الحافة: [0.12، 0.98، -0.4...]
ملاحظة على الحافة: 2. البحث الدلالي
الحافة->>المتجه: الاستعلام عن أقرب المتجهات (أعلى 5)
المتجه-->>الحافة: إرجاع 5 منتجات JSONs
ملاحظة على الحافة: 3. التوليف
Edge->>LLM: "إليك 5 فساتين. أوصي بواحدة لإيطاليا."
LLM-->>Edge: "فستان أمالفي الحريري مثالي لأن..."
الحافة-->>المستخدم: استجابة JSON (المنتج + النص)
الخطوة 1: توجيه الكتالوج
لا يمكنك البحث عن النص. يجب عليك البحث عن “المعنى”. نقوم بتحويل كل وصف منتج إلى Vector Embedding (مجموعة مكونة من 1536 رقمًا عائمًا). “فستان أحمر” و”فستان قرمزي” لهما نص مختلف ولكن متجهات متشابهة (المسافة <0.2).
نص العرض (Node.js)
نحن ندير هذا في مهمة كرون كل ليلة.
استيراد {OpenAI} من "openai"؛
استيراد { Pinecone } من "@pinecone-database/pinecone";
const openai = new OpenAI();
const pinecone = new Pinecone();
دالة غير متزامنة VectorizeProduct(product) {
// 1. أنشئ "سلسلة دلالية"
// نحن نجمع بين العنوان والوصف والمراجعات
محتوى ثابت = `
العنوان: ${product.title}
الوصف: ${product.description}
القماش: ${product.tags.join(', ')}
الأجواء: ${product.metafields.custom.vibe}
`.trim();
// 2. إنشاء التضمين
تضمين const = انتظار openai.embeddings.create({
النموذج: "تضمين النص-3-صغير"،
الإدخال: المحتوى،
});
// 3. قم بالترقية إلى قاعدة بيانات Vector
في انتظار pinecone.index("maison-products").upsert([{
المعرف: معرف المنتج،
القيم: embedding.data[0].embedding،
البيانات الوصفية: {
العنوان: عنوان المنتج،
السعر: سعر المنتج،
المقبض: المنتج. المقبض،
الصورة: صورة المنتج
}
}]);
}
الخطوة الثانية: استعلام الحافة
السرعة أمر بالغ الأهمية. نحن نستخدم وظائف Vercel Edge أو Cloudflare Workers. نحن لا نستخدم واجهة بايثون الخلفية. إنها بطيئة جدًا في البداية الباردة. نحن نستخدم TypeScript مكتوبًا بدقة على الحافة.
يتم الاستعلام على مرحلتين:
- الاسترجاع: ابحث عن المنتجات ذات الصلة.
- “الزفاف في إيطاليا” -> الخريطة الدلالية -> كتان، مسامي، زهري، أنيق.
- إرجاع Vector DB: فستان أمالفي، تنورة توسكانا، صنادل روما.
- الجيل: اشرح السبب.
- رسالة مطالبة: “أنت مصمم أزياء. اشرح سبب ملاءمة هذه العناصر الثلاثة لطلب المستخدم. كن مختصرًا.”
تقنيات التحسين
معالجة الرموز تكلف المال. وإليكم كيفية خفض التكاليف بنسبة 90%.
1. التصفية الصعبة (البحث المختلط)
إذا قام المستخدم بالتصفية حسب “الحجم: S”، فلا تبحث في مساحة المتجه بالكامل.
قم بتطبيق مرشح البيانات الوصفية على Pinecone FIRST.
vector_search(query_vector, filter={ الحجم: "S"، in_stock: صحيح })
وهذا يقلل من مساحة البحث ويحسن الدقة.
2. تخزين الإجابات مؤقتًا
80% من المستخدمين يسألون نفس الأسئلة. “ما هي سياسة الإرجاع الخاصة بك؟” “هل تشحن إلى كندا؟” نقوم بتخزين استجابة LLM في Redis، والتي يتم مفتاحها بواسطة نسخة مجزأة من Query Vector. إذا كان السؤال الجديد مشابهًا لغويًا (المسافة < 0.1) لسؤال مخبأ، قم بإرجاع الإجابة المخزنة مؤقتًا. الكمون 0 مللي ثانية.
3. النماذج الصغيرة (SLM)
هل تحتاج إلى GPT-4 لهذا؟ لا. GPT-4o-mini أو Claude Haiku أرخص وأسرع بـ 20 مرة. بالنسبة لتوصيات التجارة الإلكترونية، تعتبر “الذكاء” أقل أهمية من “السياق”. إذا قمت بتوفير المنتجات المناسبة في نافذة السياق، فحتى النموذج الصغير يقدم إجابة رائعة.
واجهة المستخدم: “واجهة المستخدم التوليدية”
لا تقم فقط ببث النص. تيار المكونات.
عندما يقترح LLM فستانًا، قم بعرض مكون <ProductCard /> مباشرة في الدردشة.
نحن نستخدم Vercel AI SDK لدفق حالات واجهة المستخدم.
// واجهة الدردشة
استيراد { useChat } من "ai/react"؛
وظيفة التصدير ShopAssistant() {
const { messages, input, HandleInputChange, HandleSubmit } = useChat();
العودة (
<div className="chat-window">
{messages.map(م => (
<div key={m.id} className={m.role}>
{م.المحتوى}
{/* إذا قامت الأداة باستدعاء المنتجات بإرجاع المنتجات، فقم بعرضها */
{m.toolInvocations?.map(tool => (
<ProductCarousel Products={tool.result} />
))}
</div>
))}
</div>
);
}
12. التخزين المؤقت الدلالي (Redis/Momento)
إذا سأل 100 شخص “هل القميص قطن؟”، فلا تدفع لـ OpenAI 100 مرة. ادفع لهم مرة واحدة.
- استعلام المستخدم -> Vectorize ->
[0.1، 0.2، ...]. - تحقق من Redis:
الحصول على المتجهات: الأقرب([0.1, 0.2]). - إذا كانت المسافة < 0.05، قم بإرجاع الإجابة المخزنة مؤقتًا. وهذا يقلل من تكاليف LLM بنسبة 60% في عمليات النشر ذات حركة المرور العالية. كما أنه يقلل زمن الوصول من 2 ثانية إلى 50 مللي ثانية.
13. التخزين المؤقت السريع (أنثروبولوجي)
الجديد في عام 2025: التخزين المؤقت الفوري. إذا قمت بإرسال مطالبة نظام مكونة من 50 صفحة (“أنت وكيل مبيعات… إليك الكتالوج الخاص بنا…”)، فإنك تدفع مقابل هذه الرموز المميزة في كل مرة. باستخدام التخزين المؤقت للسياق، تدفع مرة واحدة مقابل “تحميل” السياق إلى واجهة برمجة التطبيقات. تشير الاستدعاءات اللاحقة إلى “cache_id”. يؤدي هذا إلى تقليل تكاليف رمز الإدخال بنسبة 90% ومضاعفة السرعة (الملء المسبق فوري).
14. التكميم (GGUF / AWQ)
النماذج عادة ما تكون FP16 (نقطة عائمة 16 بت). إنها ضخمة (14 جيجابايت لمعلمات 7B). التكميم يسحقهم إلى INT4 (أعداد صحيحة 4 بت). انخفض الحجم إلى 4 جيجا بايت. فقدان الدقة لا يكاد يذكر (<1%). تزيد السرعة 3x. نقوم بتشغيل نماذج كمية 4 بت على الأجهزة الاستهلاكية (MacBook Pros) للتطوير المحلي واستدلال الحافة.
15. فك التشفير التخميني
تقوم LLMs بإنشاء رمز مميز واحد في كل مرة. هذا مسلسل وبطيء. ** يستخدم فك التشفير التخميني ** “مسودة نموذج” صغيرة (سريعة) لتخمين الكلمات الخمس التالية. النموذج الكبير (البطيء) يتحقق منها بالتوازي. إذا كانت المسودة صحيحة (عادة ما تكون للقواعد البسيطة)، فستحصل على 5 رموز مقابل تكلفة تمريرة أمامية واحدة. يؤدي ذلك إلى مضاعفة سرعة التوليد دون تغيير أوزان النموذج.
16. الاستنتاج
الذكاء الاصطناعي ليس سحرًا. إنها هندسة. يتطلب خطوط أنابيب البيانات وقواعد البيانات المتجهة والتخزين المؤقت للحافة. إذا قمت ببساطة “بتغليف ChatGPT”، فسوف تحرق النقود. إذا قمت ببناء خط أنابيب RAG، فإنك تبني خندقًا تنافسيًا.