تشغيل نموذج محلي (Ollama) داخل Oracle APEX
ذكاء اصطناعي خاص ومحلي لـ APEX — استدعِ نموذج Ollama محليًا من PL/SQL أو سجّله كخدمة ذكاء اصطناعي توليدي في APEX، فلا تغادر الموجّهات شبكتك.
للأعباء الحساسة قد لا ترغب بإرسال البيانات إلى نموذج سحابي. يشغّل Ollama نماذج مفتوحة الأوزان على جهازك أو خادمك ويتيحها عبر واجهة HTTP محلية. يستطيع Oracle APEX استدعاء هذه الواجهة من PL/SQL — أو، بدءًا من APEX 26.1، استخدامها كمزوّد ذكاء اصطناعي مدمج — فيبقى الاستدلال على بنية تتحكّم بها.
شغّل Ollama
ثبّت Ollama واسحب نموذجًا صغيرًا (llama3.2 هو نموذج 3B بحجم 2 جيجابايت تقريبًا). يعمل تطبيق ويندوز في الخلفية بعد التثبيت؛ وعلى لينكس يعمل الخادم عادةً كخدمة systemd — وإن لم يكن يعمل فشغّله بالأمر ollama serve. في الحالتين يقدّم واجهة HTTP على http://localhost:11434.
# ثبّت Ollama من https://ollama.com/download (يعمل في الخلفية)، ثم: ollama pull llama3.2 ollama run llama3.2 "Say hello in one sentence" curl.exe http://localhost:11434/api/version
⚠ هل تستطيع قاعدة البيانات الوصول إلى Ollama فعلًا؟
127.0.0.1:11434. تستخدم الأمثلة أدناه host.docker.internal، وهو يعمل عندما تكون قاعدة البيانات في حاوية على Docker Desktop (على Docker Engine في لينكس شغّل الحاوية مع --add-host=host.docker.internal:host-gateway — عندها يشير هذا الاسم إلى بوابة شبكة Docker وليس إلى loopback، لذا يجب أن يستمع Ollama أيضًا خارج 127.0.0.1: نفّذ systemctl edit ollama.service وأضف Environment="OLLAMA_HOST=0.0.0.0:11434" تحت [Service]، ثم أعد تحميل systemd وأعد تشغيل Ollama). إن كانت قاعدة البيانات على خادم آخر فاستخدم اسم أو عنوان IP لمضيف Ollama واضبط OLLAMA_HOST=0.0.0.0:11434 نفسه عليه. خادم Ollama المحلي لا يتحقّق من مفاتيح API، لذا أبقِ المنفذ 11434 على شبكة موثوقة ولا تكشفه للإنترنت أبدًا.اسمح لقاعدة البيانات بالاتصال
الاتصالات الشبكية الصادرة محجوبة حتى تسمح بها قائمة تحكّم شبكية (ACL). تُجري APEX_WEB_SERVICE وميزات الذكاء الاصطناعي في APEX الاتصال باسم مخطط محرّك APEX (مثل APEX_260100 في APEX 26.1) — وليس APEX_PUBLIC_USER ولا مخطط تطبيقك. كثير من التثبيتات تمنحه هذه الصلاحية أثناء الإعداد، فتحقّق أولًا. اتصل كمسؤول قاعدة بيانات بقاعدة PDB المثبّت فيها APEX — فـ Oracle AI Database 26ai قاعدة حاويات (CDB) دائمًا، ولا يوجد APEX في CDB$ROOT، لذا يفشل المنح أدناه هناك بالخطأ PLS-00201 على APEX_APPLICATION. استبدل FREEPDB1 باسم قاعدة PDB لديك:
ALTER SESSION SET CONTAINER = FREEPDB1; SELECT host, lower_port, upper_port, principal, privilege FROM dba_host_aces ORDER BY host, principal;
إن لم تجد إدخالًا مطابقًا، فامنح صلاحية connect على مضيف Ollama ومنفذه فقط. نفّذ ذلك كمستخدم SYS (أو أي مستخدم مسموح له بتشغيل DBMS_NETWORK_ACL_ADMIN) في جلسة PDB الخاصة بـ APEX نفسها؛ تُرجع APEX_APPLICATION.g_flow_schema_owner اسم مخطط محرّك APEX الحالي، فيبقى السكربت صالحًا بعد ترقيات APEX:
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'host.docker.internal',
lower_port => 11434,
upper_port => 11434,
ace => xs$ace_type(privilege_list => xs$name_list('connect'),
principal_name => APEX_APPLICATION.g_flow_schema_owner,
principal_type => xs_acl.ptype_db));
END;
/ℹ تستدعي UTL_HTTP بنفسك؟
UTL_HTTP مباشرة بدل APEX_WEB_SERVICE، فامنح الإدخال نفسه لمخطط تطبيقك أيضًا — وإلا ستظهر ORA-24247: network access denied by access control list (ACL). قواعد الشبكة في Autonomous Database مختلفة (يجب أن تكون الاتصالات الصادرة عبر HTTPS)، لذا يستهدف هذا الدليل قاعدة بيانات تديرها بنفسك.استدعِ النموذج من PL/SQL
أرسل الطلب إلى نقطة /api/generate في Ollama. اضبط "stream": false — فالواجهة تبثّ الرد على دفعات افتراضيًا — واقرأ النص المولَّد من الحقل response. بناء جسم الطلب بـ JSON_OBJECT_T يهرّب علامات الاقتباس في مدخلات المستخدم تلقائيًا.
DECLARE
l_req json_object_t := json_object_t();
l_resp CLOB;
l_answer CLOB;
BEGIN
l_req.put('model', 'llama3.2');
l_req.put('prompt', 'Summarize in one sentence: order 1001 shipped two days late because of a customs hold.');
l_req.put('stream', false);
apex_web_service.set_request_headers(
p_name_01 => 'Content-Type',
p_value_01 => 'application/json');
l_resp := apex_web_service.make_rest_request(
p_url => 'http://host.docker.internal:11434/api/generate',
p_http_method => 'POST',
p_body => l_req.to_clob,
p_transfer_timeout => 120);
IF apex_web_service.g_status_code <> 200 THEN
raise_application_error(-20001,
'Ollama returned HTTP ' || apex_web_service.g_status_code || ': ' ||
dbms_lob.substr(l_resp, 500, 1));
END IF;
-- النص المولَّد موجود في الحقل "response"
l_answer := json_object_t.parse(l_resp).get_clob('response');
dbms_output.put_line(l_answer);
END;
/للمحادثات متعددة الأدوار استخدم /api/chat مع مصفوفة messages بدلًا من ذلك. يوفّر Ollama أيضًا واجهة متوافقة مع OpenAI على http://localhost:11434/v1 (مثل /v1/chat/completions)، وهي مفيدة إن كانت شيفرتك تتعامل أصلًا مع صيغة OpenAI.
أو: سجّل Ollama كخدمة ذكاء اصطناعي توليدي في APEX (APEX 26.1 فأحدث)
بدءًا من APEX 26.1 أصبح Ollama والنقاط المتوافقة مع OpenAI مزوّدين مدمجين. في App Builder اذهب إلى Workspace Utilities ← Generative AI، واضغط Create، واختر مزوّد Ollama، وأدخل عنوان خادم Ollama في Base URL، واضبط AI Model على llama3.2، وأعطه Static ID مثل LOCAL_OLLAMA، ثم اضغط Test Connection. تنطبق صلاحية الشبكة نفسها. تعتمد واجهة Ollama التي يستدعيها APEX على الإصدار: يستخدم APEX 26.1 النقطتين الأصليتين /api/chat و/api/embed؛ أما في APEX 26.2 فتستخدم خدمات Ollama الجديدة Responses API افتراضيًا (وChat Completions مهملة)، ويمكن اختيارها من Advanced ← Provider API. أضاف Ollama نقطته المتوافقة مع OpenAI /v1/responses في الإصدار v0.13.3، لذا رقِّ تثبيتات Ollama الأقدم قبل استخدام هذا الافتراضي. بعدها يمكن أن تخدم الميزات التصريحية أو تُستدعى عبر APEX_AI من PL/SQL يعمل داخل تطبيقات مساحة العمل نفسها:
DECLARE
l_answer CLOB;
BEGIN
l_answer := apex_ai.generate(
p_prompt => 'Summarize in one sentence: order 1001 shipped two days late because of a customs hold.',
p_system_prompt => 'You are a concise assistant for an order-management app.',
p_service_static_id => 'LOCAL_OLLAMA');
dbms_output.put_line(l_answer);
END;
/💡 ابقِ الموجّهات مستندة للبيانات
اختبر فهمك
Check your understanding
0% · 0/3ما السبب الرئيسي لتشغيل نموذج محلي؟
كيف يصل PL/SQL إلى Ollama؟
أي مستخدم يحتاج صلاحية الشبكة لاستدعاءات APEX_WEB_SERVICE؟
تحتاج إلى تنفيذها؟
اطلب عرضًا