<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Local LLM on kenji.blog</title><link>http://kenji.blog/ar/tags/local-llm/</link><description>Recent content in Local LLM on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ar</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 02:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ar/tags/local-llm/index.xml" rel="self" type="application/rss+xml"/><item><title>الإعداد السهل وبناء واجهة برمجة التطبيقات (API) لـ LLM المحلي باستخدام Ollama</title><link>http://kenji.blog/ar/p/ollama-local-llm-api-guide/</link><pubDate>Fri, 11 Sep 2026 02:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/ollama-local-llm-api-guide/</guid><description>&lt;img src="http://kenji.blog/p/ollama-local-llm-api-guide/img/eyecatch.jpg" alt="Featured image of post الإعداد السهل وبناء واجهة برمجة التطبيقات (API) لـ LLM المحلي باستخدام Ollama" />&lt;h1 id="مقدمة-لماذا-نحتاج-إلى-llm-المحلي">مقدمة: لماذا نحتاج إلى LLM المحلي؟
&lt;/h1>&lt;p>مع ظهور النماذج اللغوية الكبيرة (LLM)، شهدت حياتنا وأساليب تطويرنا تغييرات جذرية. تستمر خدمات الذكاء الاصطناعي القوية المستندة إلى السحابة مثل ChatGPT و Claude و Gemini في التطور يومًا بعد يوم، وتقدم قدرات استنتاج متقدمة للغاية. ومع ذلك، فإن النماذج اللغوية الكبيرة السحابية ليست دائمًا الحل الأمثل لجميع حالات الاستخدام. تواجه نماذج LLM السحابية التحديات التالية:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>مشكلات الخصوصية والأمان&lt;/strong>: في العديد من الحالات، لا يُسمح بإرسال البيانات التي تحتوي على معلومات سرية أو شخصية إلى خوادم خارجية من منظور الامتثال المؤسسي والأمان.&lt;/li>
&lt;li>&lt;strong>عدم اليقين في التكلفة&lt;/strong>: نظرًا لأن رسوم استخدام واجهة برمجة التطبيقات تعتمد على عدد الرموز (Tokens)، فإن الأنظمة التي تعالج كميات كبيرة من البيانات أو تجري طلبات متكررة تواجه خطر التكاليف التشغيلية المفتوحة.&lt;/li>
&lt;li>&lt;strong>زمن الوصول والاعتماد على الشبكة&lt;/strong>: بالنسبة للاستخدام في البيئات غير المتصلة بالإنترنت أو التشغيل على أجهزة الحافة التي تتطلب زمن وصول منخفضًا للغاية، يصبح اتصال الشبكة عنق الزجاجة.&lt;/li>
&lt;li>&lt;strong>تقييد المورد (Vendor Lock-in)&lt;/strong>: الاعتماد على نموذج مزود معين قد يجعلك عرضة للتغييرات غير المقصودة في السلوك بسبب إغلاق الخدمة في المستقبل، أو التغييرات في شروط الخدمة، أو تحديثات النموذج.&lt;/li>
&lt;/ol>
&lt;p>&amp;ldquo;LLM المحلي&amp;rdquo; يجذب الانتباه كوسيلة لحل هذه التحديات. من خلال تشغيل النموذج على أجهزتك الخاصة، يمكنك الاستفادة من الذكاء الاصطناعي بحرية دون إرسال أي بيانات إلى الخارج ودون القلق بشأن التكاليف الشهرية.&lt;/p>
&lt;p>في هذه المقالة، سنشرح بالتفصيل &amp;ldquo;&lt;strong>Ollama&lt;/strong>&amp;quot;، وهي أداة تسمح لك بإدخال نماذج LLM المحلية وإدارتها وربطها بواجهات برمجة التطبيقات بسهولة مذهلة، من أساسياتها وبنيتها الداخلية، إلى تكامل API المتقدم باستخدام Python و Node.js، وحتى صيغ حساب ضبط الأداء.&lt;/p>
&lt;hr>
&lt;h1 id="ما-هو-ollama-بنيته-الداخلية">ما هو Ollama؟ بنيته الداخلية
&lt;/h1>&lt;p>Ollama هي منصة تتيح التنفيذ والإدارة السهلة للنماذج اللغوية الكبيرة مفتوحة المصدر (مثل Llama 3 و Phi-3 و Mistral و Gemma) في بيئتك المحلية. في الماضي، كان إعداد بيئة LLM محلية يتطلب خطوات معقدة للغاية مثل إعداد بيئة Python، وتثبيت أدوات CUDA، وحل تبعيات PyTorch، وتنزيل ملفات النماذج الضخمة من Hugging Face وتحويل تنسيقها (مثل من Safetensors إلى GGUF).&lt;/p>
&lt;p>يقوم Ollama بإخفاء هذه التعقيدات ويتيح لك التعامل مع نماذج LLM بسهولة مماثلة لـ Docker. باستخدام أمر واحد، يمكنك تنزيل النموذج (&lt;code>pull&lt;/code>)، وتشغيله (&lt;code>run&lt;/code>)، وإطلاقه كخادم HTTP.&lt;/p>
&lt;h2 id="التكنولوجيا-الأساسية-غلاف-wrapper-لـ-llamacpp">التكنولوجيا الأساسية: غلاف (Wrapper) لـ llama.cpp
&lt;/h2>&lt;p>يعمل كمحرك استدلال خلفي لـ Ollama مكتبة &amp;ldquo;&lt;strong>llama.cpp&lt;/strong>&amp;quot;، وهي مكتبة استدلال LLM سريعة مكتوبة بلغة C/C++. تتمتع llama.cpp بالقدرة على تنفيذ النماذج عن طريق الاستفادة القصوى من أداء الأجهزة، سواء كان ذلك على Apple Silicon (Metal) أو NVIDIA GPU (CUDA) أو AMD GPU (ROCm) أو حتى في البيئات التي تعتمد على وحدة المعالجة المركزية (CPU) فقط.&lt;/p>
&lt;p>يتضمن Ollama نظام llama.cpp بداخله، ويتبنى بنية حيث توفر عملية الخادم المكتوبة بلغة Go واجهة برمجة تطبيقات REST، وتستدعي محرك استدلال llama.cpp في الخلفية.&lt;/p>
&lt;p>يوضح مخطط Mermaid التالي البنية العامة لـ Ollama.&lt;/p>
&lt;div class="mermaid">graph TD
A["تطبيقات العميل (Python / Node.js)"] -- "HTTP/REST API" --> B["خادم Ollama (Go)"]
B --> C["مدير النماذج (معالجة GGUF)"]
B --> D["محرك الاستدلال (llama.cpp)"]
D --> E["تسريع وحدة المعالجة الرسومية (CUDA / Metal / ROCm)"]
D --> F["بديل وحدة المعالجة المركزية (AVX2 / AVX-512)"]
C --> G["تخزين النماذج المحلي"]&lt;/div>
&lt;p>تسمح هذه البنية للمطورين بالوصول إلى قدرات الاستدلال المتقدمة من خلال طلبات HTTP القياسية دون الحاجة إلى القلق بشأن بناء C++ أو الإعدادات الدقيقة لبرامج تشغيل وحدة المعالجة الرسومية (GPU).&lt;/p>
&lt;hr>
&lt;h1 id="تثبيت-ollama-والإعداد-الأولي">تثبيت Ollama والإعداد الأولي
&lt;/h1>&lt;p>تثبيت Ollama بسيط للغاية. يتم توفير ملفات تنفيذية محسنة لكل نظام تشغيل.&lt;/p>
&lt;h2 id="macos--windows">macOS / Windows
&lt;/h2>&lt;p>كل ما عليك فعله هو تنزيل المثبت من الموقع الرسمي (&lt;a class="link" href="https://ollama.com/" target="_blank" rel="noopener"
>https://ollama.com/&lt;/a>) وتشغيله. يتعرف إصدار macOS تلقائيًا على واجهة برمجة تطبيقات Metal لـ Apple Silicon، ويتعرف إصدار Windows على NVIDIA GPU (CUDA)، ويقوم بتمكين تسريع الأجهزة إذا كان متاحًا.&lt;/p>
&lt;h2 id="linux">Linux
&lt;/h2>&lt;p>في بيئات Linux (مثل Ubuntu)، سيؤدي تنفيذ أمر السطر الواحد التالي إلى تثبيت المكونات الضرورية وبدء خادم Ollama كخدمة systemd.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -fsSL https://ollama.com/install.sh &lt;span class="p">|&lt;/span> sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>بمجرد اكتمال التثبيت، دعنا نتحقق من الإصدار في الجهاز الطرفي (Terminal).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ollama --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>إذا تم عرض معلومات الإصدار، فقد تم التثبيت بنجاح.&lt;/p>
&lt;h2 id="التشغيل-باستخدام-docker">التشغيل باستخدام Docker
&lt;/h2>&lt;p>إذا كنت لا ترغب في تلويث بيئتك الحالية أو كنت ترغب في دمجه في بنية أساسية قائمة على الحاويات، يمكنك أيضًا استخدام صورة Docker الرسمية. إذا كنت تستخدم وحدة معالجة رسومية (GPU)، فستحتاج إلى تثبيت NVIDIA Container Toolkit.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># للتشغيل باستخدام وحدة المعالجة المركزية (CPU) فقط&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># لاستخدام NVIDIA GPU&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run -d --gpus&lt;span class="o">=&lt;/span>all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>بشكل افتراضي، يستمع خادم Ollama على الرابط &lt;code>http://localhost:11434&lt;/code>.&lt;/p>
&lt;hr>
&lt;h1 id="إدارة-النماذج-وأوامر-cli-الأساسية">إدارة النماذج وأوامر CLI الأساسية
&lt;/h1>&lt;p>أكبر جاذبية لـ Ollama هي أن إدارة النماذج بديهية للغاية. يمكنك تجربة نماذج مختلفة بنفس الشعور بالتعامل مع صور Docker.&lt;/p>
&lt;h2 id="1-تشغيل-النموذج-run">1. تشغيل النموذج (&lt;code>run&lt;/code>)
&lt;/h2>&lt;p>هذا هو الأمر الأكثر استخدامًا. إذا لم يكن النموذج المحدد موجودًا، فسيتم تنزيله تلقائيًا (&lt;code>pull&lt;/code>)، ثم سيتم تشغيل موجه (prompt) تفاعلي.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ollama run llama3.1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>سيؤدي تشغيل الأمر أعلاه إلى بدء تشغيل أحدث طراز من Meta وهو Llama 3.1 (إصدار 8B Parameters). عند إدخال رسالة في الموجه، سيتم عرض رد النموذج في شكل دفق (Streaming). للخروج، اكتب &lt;code>/bye&lt;/code> أو اضغط على &lt;code>Ctrl+D&lt;/code>.&lt;/p>
&lt;h2 id="2-تنزيل-النماذج-pull">2. تنزيل النماذج (&lt;code>pull&lt;/code>)
&lt;/h2>&lt;p>استخدم الأمر &lt;code>pull&lt;/code> إذا كنت تريد تنزيل النموذج في الخلفية مسبقًا.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ollama pull phi3:instruct
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ollama pull mistral:v0.3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>في مكتبة نماذج Ollama، يمكنك تحديد الإصدار ومستوى التكميم (Quantization) بتنسيق &lt;code>ModelName:Tag&lt;/code>. إذا حذفت العلامة، فسيتم تطبيق &lt;code>latest&lt;/code>، ولكن يمكنك أيضًا تحديد نموذج تكميم معين بشكل صريح (مثل: &lt;code>llama3:8b-instruct-q4_0&lt;/code>).&lt;/p>
&lt;h3 id="ما-هو-التكميم-quantization">ما هو التكميم (Quantization)؟
&lt;/h3>&lt;p>لنتطرق قليلاً إلى التكميم هنا. عادةً ما يحتفظ LLM بمعلمة وزن (weight parameter) واحدة كفاصلة عائمة بحجم 16 بت (FP16). في حالة نموذج يحتوي على 8 مليار (8B) معلمة، ستستهلك الأوزان وحدها حوالي 16 غيغابايت من VRAM. التكميم هو تقنية لضغط هذا إلى أنواع أعداد صحيحة 4 بت (Q4) أو 8 بت (Q8).&lt;/p>
&lt;p>يتيح لك التكميم تقليل متطلبات الذاكرة وعرض النطاق الترددي للذاكرة بشكل كبير مع تقليل تدهور دقة النموذج. يتم توزيع النماذج في Ollama بشكل افتراضي بتنسيق GGUF مع التكميم الأمثل (غالبًا 4 بت).&lt;/p>
&lt;h2 id="3-عرض-قائمة-النماذج-list">3. عرض قائمة النماذج (&lt;code>list&lt;/code>)
&lt;/h2>&lt;p>يعرض قائمة بالنماذج التي تم تنزيلها محليًا وأحجامها.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ollama list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>مثال على الإخراج:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">NAME ID SIZE MODIFIED
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">llama3.1:latest 43f7a214e532 4.7 GB 2 hours ago
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">phi3:instruct a2c89ceaed85 2.3 GB 3 days ago
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="4-حذف-النماذج-rm">4. حذف النماذج (&lt;code>rm&lt;/code>)
&lt;/h2>&lt;p>احذف النماذج التي لم تعد هناك حاجة إليها لتحرير مساحة القرص.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ollama rm phi3:instruct
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h1 id="تخصيص-النماذج-باستخدام-modelfile">تخصيص النماذج باستخدام Modelfile
&lt;/h1>&lt;p>في Ollama، يمكنك إنشاء نماذجك المخصصة عن طريق حقن مطالبات النظام (System Prompts) وضبط المعلمات الفائقة (Hyperparameters) للنماذج الحالية باستخدام آلية تسمى &amp;ldquo;&lt;strong>Modelfile&lt;/strong>&amp;rdquo;. هذا المفهوم مطابق تمامًا لـ Dockerfile في Docker.&lt;/p>
&lt;p>يوضح المخطط التالي كيف يُشتق النموذج المخصص من النموذج الأساسي.&lt;/p>
&lt;div class="mermaid">graph LR
A["النموذج الأساسي (llama3.1)"] -->|"إضافة موجه النظام"| B["تكوين وسيط"]
B -->|"تعيين Temperature &amp; Top_p"| C["نموذج مخصص (kansai-coder)"]
C -->|"تشغيل"| D["واجهة سطر الأوامر التفاعلية / واجهة برمجة التطبيقات"]&lt;/div>
&lt;p>كمثال، دعنا ننشئ نموذج مساعد برمجة يجيب بلهجة منطقة كانساي (Kansai) في اليابان.&lt;/p>
&lt;p>قم بإنشاء ملف نصي يسمى &lt;code>Modelfile&lt;/code> في دليل العمل الخاص بك واكتب ما يلي:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># تحديد النموذج الأساسي
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">FROM llama3.1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># تعيين المعلمات الفائقة مثل الإبداع (temperature)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PARAMETER temperature 0.7
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PARAMETER top_p 0.9
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PARAMETER repeat_penalty 1.1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PARAMETER num_ctx 4096
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># تعيين موجه النظام
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">SYSTEM &amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">أنت مهندس برمجيات متقدم على مستوى عالمي.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">يرجى الإجابة دائمًا على أسئلة المستخدمين التقنية بلهجة &amp;#34;كانساي&amp;#34; الودودة.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">عند تقديم أمثلة التعليمات البرمجية، قم بتوفير تعليمات برمجية حديثة تتبع أفضل الممارسات.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>قم ببناء (إنشاء) نموذج جديد من هذا الملف Modelfile.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ollama create kansai-coder -f Modelfile
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>بمجرد اكتمال الإنشاء، قم بتشغيله لاختباره.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ollama run kansai-coder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt;&amp;gt;&amp;gt; Pythonでリストをソートするにはどうすればええの？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>سيُظهر بعد ذلك سلوكًا مخصصًا مثل &amp;ldquo;هذا سهل، يمكنك فقط استخدام دالة &lt;code>sorted()&lt;/code> أو دالة &lt;code>sort()&lt;/code> في Python!&amp;rdquo;. يتيح لك هذا إنشاء وإدارة عدد لا يحصى من الوكلاء (Agents) المتخصصين لحالات الاستخدام المختلفة محليًا.&lt;/p>
&lt;hr>
&lt;h1 id="شرح-تفصيلي-لـ-ollama-rest-api">شرح تفصيلي لـ Ollama REST API
&lt;/h1>&lt;p>في حين أن التفاعل عبر CLI مناسب، فإن القيمة الحقيقية لـ Ollama في تطوير التطبيقات الفعلية تكمن في واجهة برمجة تطبيقات REST القوية الخاصة بها. عن طريق إرسال طلبات HTTP إلى عملية الخادم (افتراضيًا &lt;code>http://localhost:11434&lt;/code>)، يمكنك الحصول على نتائج الاستدلال.&lt;/p>
&lt;p>النقاط النهائية (Endpoints) الرئيسية الثلاث هي:&lt;/p>
&lt;ol>
&lt;li>&lt;code>/api/generate&lt;/code>: توليد نص من موجه (prompt) واحد&lt;/li>
&lt;li>&lt;code>/api/chat&lt;/code>: توليد دردشة (محادثة) بتنسيق مشابه لـ OpenAI API&lt;/li>
&lt;li>&lt;code>/api/embeddings&lt;/code>: توليد تضمينات المتجهات (Embeddings)&lt;/li>
&lt;/ol>
&lt;h2 id="توليد-النص-باستخدام-apigenerate">توليد النص باستخدام /api/generate
&lt;/h2>&lt;p>هذه هي نقطة نهاية التوليد الأساسية. دعنا نرسل طلبًا باستخدام cURL.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -X POST http://localhost:11434/api/generate -d &lt;span class="s1">&amp;#39;{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;model&amp;#34;: &amp;#34;llama3.1&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;prompt&amp;#34;: &amp;#34;Explain the concept of quantum entanglement in simple terms.&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;stream&amp;#34;: false
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>من خلال تحديد &lt;code>&amp;quot;stream&amp;quot;: false&lt;/code>، سيتم إرجاع ملف JSON مرة واحدة بعد اكتمال التوليد بأكمله. في حالة الافتراضي (&lt;code>true&lt;/code>)، يتم إرسال الرموز (Tokens) التي تم إنشاؤها بشكل متتابع بتنسيق JSON Lines، وهو مناسب لتنفيذ واجهات مستخدم متدفقة (Streaming UI).&lt;/p>
&lt;p>مثال على الاستجابة (تم حذف بعض الأجزاء):&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;llama3.1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;created_at&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2026-09-11T10:00:00.000Z&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;response&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Quantum entanglement is like having a pair of magical dice...&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;done&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;context&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">128006&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">882&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">128007&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">271&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10445&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;total_duration&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4567890000&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;load_duration&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1234000&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prompt_eval_count&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">14&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;eval_count&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">256&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;eval_duration&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4321000000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>يتم تشفير حالة المحادثة السابقة في مصفوفة &lt;code>context&lt;/code>، ومن خلال تضمين ذلك في الطلب التالي، يمكنك الحفاظ على السياق. ومع ذلك، لإدارة سجل المحادثة بسهولة أكبر، يتم استخدام نقطة النهاية التالية &lt;code>/api/chat&lt;/code>.&lt;/p>
&lt;h2 id="توليد-محادثة-باستخدام-apichat">توليد محادثة باستخدام /api/chat
&lt;/h2>&lt;p>نظرًا لأن نماذج LLM الحديثة يتم ضبطها (fine-tuned) بتنسيق الدردشة، يوصى باستخدام &lt;code>/api/chat&lt;/code> في تطوير التطبيقات.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -X POST http://localhost:11434/api/chat -d &lt;span class="s1">&amp;#39;{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;model&amp;#34;: &amp;#34;llama3.1&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;messages&amp;#34;: [
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> { &amp;#34;role&amp;#34;: &amp;#34;system&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;You are a helpful AI assistant.&amp;#34; },
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> { &amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;What is the capital of France?&amp;#34; },
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> { &amp;#34;role&amp;#34;: &amp;#34;assistant&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;The capital of France is Paris.&amp;#34; },
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> { &amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;What is its famous tower?&amp;#34; }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> ],
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;stream&amp;#34;: false
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>من خلال تمرير مصفوفة من كائنات الرسائل التي لها دور &lt;code>role&lt;/code> (النظام، المستخدم، المساعد)، يمكنك بسهولة التعامل مع سياقات المحادثة المعقدة.&lt;/p>
&lt;hr>
&lt;h1 id="التكامل-مع-تطبيقات-python">التكامل مع تطبيقات Python
&lt;/h1>&lt;p>Python هي اللغة القياسية لتطوير الذكاء الاصطناعي. هناك عدة طرق لاستخدام Ollama من Python، ولكن استخدام حزمة &lt;code>ollama-python&lt;/code> الرسمية هي الطريقة الأسهل والأكثر موثوقية.&lt;/p>
&lt;h2 id="التثبيت">التثبيت
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install ollama
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="استخدام-واجهة-برمجة-التطبيقات-المتزامنة-synchronous-api">استخدام واجهة برمجة التطبيقات المتزامنة (Synchronous API)
&lt;/h2>&lt;p>هذا هو الكود الأساسي لإنشاء محادثة.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">ollama&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># قائمة للاحتفاظ بسجل المحادثة&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">messages&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>&lt;span class="s1">&amp;#39;role&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;system&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;content&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;أنت مساعد ممتاز.&amp;#39;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">chat_with_ollama&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">user_input&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messages&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s1">&amp;#39;role&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;user&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;content&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">user_input&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># استدعاء Ollama API&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ollama&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chat&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;llama3.1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messages&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">messages&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">assistant_reply&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;message&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s1">&amp;#39;content&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messages&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s1">&amp;#39;role&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;assistant&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;content&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">assistant_reply&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">assistant_reply&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chat_with_ollama&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;يرجى شرح المناهج الثلاثة الرئيسية في التعلم الآلي.&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="استخدام-البث-غير-المتزامن-async-streaming">استخدام البث غير المتزامن (Async Streaming)
&lt;/h2>&lt;p>عند تطوير تطبيقات ويب (مثل FastAPI أو Starlette) أو روبوتات Discord / Slack، من المهم استخدام واجهات برمجة التطبيقات غير المتزامنة والبث لتجنب الحظر (Blocking).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">asyncio&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">ollama&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">AsyncClient&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">async&lt;/span> &lt;span class="k">def&lt;/span> &lt;span class="nf">generate_stream&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">client&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AsyncClient&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># تحديد stream=True يرجع مولدًا غير متزامن&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">async&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">chunk&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="n">client&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chat&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;llama3.1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messages&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[{&lt;/span>&lt;span class="s1">&amp;#39;role&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;user&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;content&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;اشرح مصممي الديكور (Decorators) في Python بالتفصيل.&amp;#39;&lt;/span>&lt;span class="p">}],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">stream&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># عرض كل قطعة (chunk) تدريجيًا على الإخراج القياسي&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">chunk&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;message&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s1">&amp;#39;content&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">end&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">flush&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># سطر جديد في النهاية&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># تشغيل الدالة غير المتزامنة&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">asyncio&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">generate_stream&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>من خلال كتابة الكود بهذه الطريقة، يمكنك بسهولة تنفيذ تجربة مستخدم (UX) حيث تظهر الشخصيات تباعًا، على غرار واجهة مستخدم ChatGPT.&lt;/p>
&lt;h2 id="التكامل-مع-langchain-و-llamaindex">التكامل مع LangChain و LlamaIndex
&lt;/h2>&lt;p>يتم دعم Ollama أصلاً في LangChain و LlamaIndex، والتي تُستخدم غالبًا عند بناء أنظمة RAG (التوليد المعزز بالاسترجاع).&lt;/p>
&lt;p>مثال مع LangChain:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langchain_community.llms&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Ollama&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">llm&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Ollama&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;llama3.1&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">llm&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">invoke&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Explain dark matter.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>يمكنك تشغيل سلاسل LangChain القوية وميزات الوكلاء (Agents) محليًا دون الحاجة إلى تكوين أي مفاتيح API خارجية.&lt;/p>
&lt;hr>
&lt;h1 id="التكامل-مع-تطبيقات-nodejs">التكامل مع تطبيقات Node.js
&lt;/h1>&lt;p>بالنسبة لمهندسي الواجهة الأمامية والمطورين المتكاملين (Full-stack)، تعد القدرة على استدعاء LLMs المحلية من بيئة TypeScript/Node.js ميزة كبيرة. سنستخدم حزمة NPM الرسمية &lt;code>ollama&lt;/code>.&lt;/p>
&lt;h2 id="التثبيت-1">التثبيت
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm install ollama
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="مثال-على-تنفيذ-روبوت-محادثة-chatbot-باستخدام-typescript">مثال على تنفيذ روبوت محادثة (Chatbot) باستخدام TypeScript
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="nx">ollama&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">Message&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;ollama&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">async&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">runChatbot() {&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">messages&lt;/span>: &lt;span class="kt">Message&lt;/span>&lt;span class="p">[]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nx">role&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;system&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">content&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;You are a concise expert.&amp;#39;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nx">role&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;user&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">content&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;Explain RESTful APIs.&amp;#39;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="nx">ollama&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">chat&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">model&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;llama3.1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">messages&lt;/span>: &lt;span class="kt">messages&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">stream&lt;/span>: &lt;span class="kt">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Assistant:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">response&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">message&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">content&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">error&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">error&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Error communicating with Ollama:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">error&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">runChatbot&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="بناء-خادم-express-يدعم-البث-streaming">بناء خادم Express يدعم البث (Streaming)
&lt;/h2>&lt;p>هذا مثال على تنفيذ واجهة برمجة تطبيقات خلفية ترجع استجابة متدفقة إلى واجهة الويب الأمامية. يتم إرسال القطع (Chunks) باستخدام SSE (الأحداث المرسلة من الخادم) أو البث العادي عبر HTTP.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="nx">express&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;express&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">Ollama&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;ollama&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">app&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">express&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">app&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">use&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">express&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">json&lt;/span>&lt;span class="p">());&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">ollama&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Ollama&lt;/span>&lt;span class="p">({&lt;/span> &lt;span class="nx">host&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;http://127.0.0.1:11434&amp;#39;&lt;/span> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">app&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;/api/stream-chat&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kr">async&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">req&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">res&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">prompt&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">req&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">body&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// إعداد رأس استجابة HTTP (النقل المجزأ - Chunked)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">res&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">setHeader&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Content-Type&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;text/plain; charset=utf-8&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">res&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">setHeader&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Transfer-Encoding&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;chunked&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">stream&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">await&lt;/span> &lt;span class="nx">ollama&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">generate&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">model&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;llama3.1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">prompt&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">prompt&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">stream&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="kr">await&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kr">const&lt;/span> &lt;span class="nx">chunk&lt;/span> &lt;span class="k">of&lt;/span> &lt;span class="nx">stream&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">res&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">chunk&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">response&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">res&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">end&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">err&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">res&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">status&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">500&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Error generating response.&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">res&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">end&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">app&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">listen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3000&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Server is running on port 3000&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h1 id="مقاييس-الأداء-والتحليل-الرياضي">مقاييس الأداء والتحليل الرياضي
&lt;/h1>&lt;p>من أجل توفير نماذج LLM المحلية على مستوى يمكن أن يتحمل العمليات الفعلية، من الضروري تحليل زمن الوصول (Latency) والإنتاجية (Throughput). تتضمن استجابات Ollama API مقاييس مفصلة تتعلق بالأداء.&lt;/p>
&lt;h2 id="نموذج-حساب-سرعة-توليد-الرموز-tokens">نموذج حساب سرعة توليد الرموز (Tokens)
&lt;/h2>&lt;p>يمكن تقسيم وقت استجابة LLM، الذي يرتبط ارتباطًا مباشرًا بتجربة المستخدم، إلى قسمين رئيسيين: &amp;ldquo;&lt;strong>الوقت حتى الرمز الأول (TTFT - Time To First Token)&lt;/strong>&amp;rdquo; و &amp;ldquo;&lt;strong>الوقت لكل رمز إخراج (TPOT - Time Per Output Token)&lt;/strong>&amp;rdquo;.&lt;/p>
&lt;p>يتم صياغة إجمالي وقت التوليد $T_{total}$، بافتراض أن عدد الرموز المولدة هو $N$، على النحو التالي:&lt;/p>
$$
T_{total} = t_{ttft} + \sum_{i=1}^{N-1} t_{tpot}^{(i)}
$$
&lt;p>هنا، بتقريب متوسط الوقت المستغرق لتوليد كل رمز كـ $\bar{t}_{tpot}$، يمكن تبسيط المعادلة:&lt;/p>
$$
T_{total} \approx t_{ttft} + (N - 1) \times \bar{t}_{tpot}
$$
&lt;p>المراسلات مع حقول الاستجابة في Ollama API هي كما يلي:&lt;/p>
&lt;ul>
&lt;li>&lt;code>prompt_eval_duration&lt;/code>: هذا يتوافق تقريبًا مع $t_{ttft}$ (وقت تقييم الموجه). يتم إرجاعه بوحدة النانو ثانية.&lt;/li>
&lt;li>&lt;code>eval_duration&lt;/code>: الوقت المستغرق لعملية التوليد بأكملها.&lt;/li>
&lt;li>&lt;code>eval_count&lt;/code>: عدد الرموز التي تم إنشاؤها $N$.&lt;/li>
&lt;/ul>
&lt;p>لذلك، يمكن حساب سرعة توليد الرموز في الثانية (TPS - Tokens Per Second) بالصيغة التالية:&lt;/p>
$$
TPS = \frac{eval\_count}{(eval\_duration / 10^9)} \quad [\text{tokens/sec}]
$$
&lt;p>على سبيل المثال، في حالة &lt;code>eval_count: 256&lt;/code> و &lt;code>eval_duration: 4321000000&lt;/code> (حوالي 4.32 ثانية):
&lt;/p>
$$
TPS = \frac{256}{4.321} \approx 59.24 \text{ tokens/sec}
$$
&lt;p>
إذا تجاوزت السرعة 50 رمزًا / ثانية في بيئة محلية، فهي أسرع بكثير من سرعة القراءة البشرية، لذلك يمكن القول إنها توفر تجربة استجابة مريحة للغاية.&lt;/p>
&lt;h2 id="معادلة-تقدير-سعة-vram-المطلوبة">معادلة تقدير سعة VRAM المطلوبة
&lt;/h2>&lt;p>عند تشغيل نموذج محليًا، فإن ما إذا كان النموذج يتناسب مع VRAM لوحدة المعالجة الرسومية يحمل المفتاح للأداء. إذا لم يتسع لـ VRAM وتم الرجوع (Fallback) إلى الذاكرة الرئيسية للنظام (RAM)، فإن سرعة التوليد ستنخفض بشكل كبير.&lt;/p>
&lt;p>الصيغة البسيطة لتقدير سعة الذاكرة المطلوبة $M$ (بالغيغابايت) هي كما يلي:&lt;/p>
$$
M \approx \frac{P \times Q}{8 \times 1024} + C
$$
&lt;ul>
&lt;li>$P$: عدد معلمات النموذج (مثل: 8B = $8000 \times 10^6$)&lt;/li>
&lt;li>$Q$: عدد بتات التكميم (مثل: 4-bit, 8-bit, 16-bit)&lt;/li>
&lt;li>$C$: ذاكرة إضافية لنافذة السياق (مثل ذاكرة التخزين المؤقت KV. تعتمد على النموذج والإعدادات، ولكن توقع بشكل عام حوالي 1 إلى 2 غيغابايت)&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>مثال حسابي&lt;/strong>: عند تشغيل Llama 3 (8B معلمات) بتكميم 4 بت:
&lt;/p>
$$
M_{model} = \frac{8,000 \times 4}{8 \times 1024} = \frac{32,000}{8192} \approx 3.9 \text{ GB}
$$
&lt;p>
بإضافة ذاكرة السياق إلى هذا، نجد أنه إذا كان لديك حوالي 5 إلى 6 غيغابايت من VRAM، فيمكنك إلغاء تحميل (Full Offload) النموذج بالكامل على وحدة المعالجة الرسومية. حتى مع وحدات المعالجة الرسومية من الفئة المتوسطة في السنوات الأخيرة المزودة بـ 8 غيغابايت من ذاكرة VRAM (مثل RTX 4060)، يمكن تشغيل نماذج LLM قوية بما يكفي.&lt;/p>
&lt;hr>
&lt;h1 id="حالات-الاستخدام-المتقدمة-والملخص">حالات الاستخدام المتقدمة والملخص
&lt;/h1>&lt;p>من خلال كشف Ollama كواجهة برمجة تطبيقات (API) داخل شبكتك المحلية، ستصبح العديد من التطبيقات التي تتجاوز مجرد روبوت محادثة (Chatbot) ممكنة.&lt;/p>
&lt;h3 id="1-بناء-نظام-rag-التوليد-المعزز-بالاسترجاع-محلي">1. بناء نظام RAG (التوليد المعزز بالاسترجاع) محلي
&lt;/h3>&lt;p>من خلال الجمع بين قواعد بيانات المتجهات المحلية مثل ChromaDB أو Qdrant ونقطة النهاية &lt;code>/api/embeddings&lt;/code> الخاصة بـ Ollama (باستخدام نماذج تضمين مثل &lt;code>nomic-embed-text&lt;/code>)، يمكنك بناء نظام RAG آمن وغير متصل بالإنترنت تمامًا يسمح لك بتحميل مستندات الشركة السرية للإجابة على الأسئلة.&lt;/p>
&lt;h3 id="2-مساعد-الذكاء-الاصطناعي-لبيئات-التطوير-المتكاملة-ide-والمحررين">2. مساعد الذكاء الاصطناعي لبيئات التطوير المتكاملة (IDE) والمحررين
&lt;/h3>&lt;p>من خلال تعيين Ollama كخلفية (backend) لإضافات VS Code (مثل Continue.dev) أو المكونات الإضافية لـ Neovim، يمكنك الحصول على إكمال التعليمات البرمجية وتفسير التعليمات البرمجية مثل GitHub Copilot مجانًا باستخدام النماذج المحلية (مثل &lt;code>codellama&lt;/code> أو &lt;code>deepseek-coder&lt;/code>).&lt;/p>
&lt;h3 id="3-التضمين-في-البرامج-النصية-للأتمتة-automation-scripts">3. التضمين في البرامج النصية للأتمتة (Automation Scripts)
&lt;/h3>&lt;p>من خلال دمج طلبات Ollama API في نصوص Python النصية (Scripts) أو نصوص Shell النصية، يمكنك ضخ قوة الذكاء الاصطناعي في كل جزء من سير عملك اليومي، مثل التلخيص التلقائي للسجلات، والتوليد التلقائي لرسائل الالتزام (Commit messages) في Git، ومهام تصنيف الجمل النمطية.&lt;/p>
&lt;h2 id="الخاتمة">الخاتمة
&lt;/h2>&lt;p>مع ظهور Ollama، انخفض حاجز الاعتماد على نماذج LLM المحلية بشكل كبير. إن المزيج بين نظام الأوامر البسيط (يشبه التعامل مع حاويات Docker) وواجهة برمجة تطبيقات REST التي يمكن استخدامها بسهولة من التطبيقات الخارجية هو المعيار الواقعي الحالي في تطوير الذكاء الاصطناعي المحلي.&lt;/p>
&lt;p>إذا كنت مطورًا يعاني من قيود التكلفة أو الأمان لـ LLM السحابي، فيرجى الرجوع إلى الخطوات المقدمة في هذه المقالة، وإعداد بيئة LLM محلية باستخدام Ollama، ومحاولة دمجها في تطبيقاتك. من المؤكد أنك ستتمكن من الشعور بإمكانيات الذكاء الاصطناعي بحرية وقرب أكبر.&lt;/p></description></item></channel></rss>