onyx-ai-4gemma

أول مساعد ذكي متخصص بـ اللهجة السورية الشاميّة، مصمم ليكون سريعاً جداً وذكياً في التعامل مع السياق المحلي والعالمي.


🎮 Live Demo

استمتع بتجربة سرعة ONYX-AI-Syrian الآن على Hugging Face Spaces:

Try it on Spaces


🏗 بنية النظام (Architecture Layers)

يعتمد الموديل على 5 طبقات أساسية لضمان الدقة والسرعة:

  1. طبقة المحرك الأساسي (Core Model Layer): تحمل الموديل الضخم (Qwen 3.5). هي "الدماغ" المسؤول عن فهم اللغة وتوليد الكلام. تم استخدام تقنية device_map="auto" و float16 لتسريع الأداء وتقليل استهلاك الذاكرة (VRAM).

  2. طبقة الذاكرة القريبة (Edge Memory Layer - FAISS): وحدة التخزين المحلي باستخدام مكتبة FAISS و SentenceTransformer. يقوم النظام بتحويل المحادثات السابقة لمتجهات (Vectors)، وعند السؤال، يبحث في الذاكرة عما يشبهه ليمنح الموديل "ذاكرة قصيرة المدى" قوية.

  3. طبقة البحث والوصول للمعلومات (Search Layer - Tavily): "نافذة النظام على العالم". تسمح لـ ONYX بعمل بحث لحظي على الإنترنت لجلب معلومات جديدة (أخبار، طقس، تقنيات حديثة) وتقديمها كـ Context للموديل.

  4. طبقة القواعد السريعة (Rule Engine Layer): طبقة "الاستجابة الفورية" للرد على التحيات والأسئلة الشائعة فوراً دون استهلاك موارد الموديل الكبير، مما يوفر سرعة وكلفة.

  5. طبقة بناء السياق (Prompt Builder): المطبخ الذي يجمع سياق الذاكرة + معلومات البحث + سؤال المستخدم، ويغلفهم بـ "System Prompt" احترافي يجبر الموديل على التحدث باللهجة الشامية وبأسلوب ONYX.


💻 المتطلبات والأداء (Performance)

  • استهلاك الرام: خفيف جداً، يستهلك تقريباً من 7 إلى 10 غيغا فقط.
  • السرعة: يشتغل بسرعة الضوء على الـ GPU فقط، مع أداء ممتاز جداً واستجابة لحظية.
  • تنبيه : في حال استخدمت ال CPU فهذه نتيجة الاستهلاك وسيكون بطيء

image


🛠 التثبيت (Installation)

fastapi
uvicorn
python-multipart
transformers>=4.40.0
accelerate
sentencepiece
protobuf
huggingface_hub
tavily-python

🚀 كود التشغيل (Usage Guide)

1. تحميل الموديل (Model Loading)

import os
from transformers import AutoTokenizer, AutoModelForCausalLM

# 🔹 معرف الموديل على HuggingFace
MODEL_ID = "ONYX-APP-AI/onyx-ai-syrian-0.1"

# 🔹 توكن الوصول (إذا الموديل خاص)
HF_TOKEN = os.environ.get("HF_TOKEN")

print("⏳ Loading ONYX Engine...")

# 🔹 تحميل الـ Tokenizer (مسؤول عن تحويل النص لأرقام)
tokenizer = AutoTokenizer.from_pretrained(
    MODEL_ID,
    token=HF_TOKEN,
    trust_remote_code=True  # يسمح باستخدام كود مخصص من الموديل
)

# 🔹 تحميل الموديل نفسه
model = AutoModelForCausalLM.from_pretrained(
    MODEL_ID,
    token=HF_TOKEN,
    torch_dtype=torch.bfloat16,   # تقليل استهلاك الذاكرة
    low_cpu_mem_usage=True,       # تحسين استهلاك RAM
    device_map="auto"             # توزيع تلقائي على CPU/GPU
)

2. إعداد API باستخدام FastAPI

from fastapi import FastAPI, Request
from fastapi.responses import StreamingResponse
from threading import Thread
from transformers import TextIteratorStreamer
import asyncio
import json

# 🔹 إنشاء تطبيق FastAPI
app = FastAPI()

# 🔹 Endpoint لاستقبال الرسائل
@app.post("/chat")
async def chat(request: Request):
    
    # 🔹 قراءة البيانات القادمة من المستخدم
    data = await request.json()
    message = data.get("message", "")

    # 🔹 تحديد نوع الرد (سريع أو باستخدام البحث)
    if should_skip_search(message):
        system_content = "أنت ONYX، مساعد ذكي سوري بلهجة شاميّة. جاوب باختصار ودقة."
    else:
        system_content = "أنت ONYX، مساعد ذكي سوري بلهجة شاميّة."

    # 🔹 بناء الرسائل بصيغة Chat
    messages = [
        {"role": "system", "content": system_content},
        {"role": "user", "content": message}
    ]

    # 🔹 تحويل الرسائل إلى Prompt يفهمه الموديل
    prompt = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )

    # 🔹 تحويل النص إلى Tensor
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

    # 🔹 إعداد نظام Streaming (إرسال الرد تدريجياً)
    streamer = TextIteratorStreamer(
        tokenizer,
        skip_prompt=True,
        skip_special_tokens=True
    )

    # 🔹 إعدادات التوليد
    generate_kwargs = dict(
        **inputs,
        streamer=streamer,
        max_new_tokens=512,       # الحد الأقصى لطول الرد
        do_sample=True,           # تفعيل العشوائية
        temperature=0.7,          # درجة الإبداع
        repetition_penalty=1.15   # تقليل التكرار
    )

    # 🔹 تشغيل التوليد في Thread منفصل
    Thread(target=model.generate, kwargs=generate_kwargs).start()

    # 🔹 إرسال الرد للمستخدم Token by Token
    async def event_generator():
        try:
            for new_token in streamer:
                
                # 🔹 إيقاف إذا المستخدم قطع الاتصال
                if await request.is_disconnected():
                    break

                if new_token:
                    yield f"data: {json.dumps({'token': new_token}, ensure_ascii=False)}\\n\\n"
                    await asyncio.sleep(0.005)

        except Exception:
            pass

    # 🔹 إعادة الرد كـ Streaming
    return StreamingResponse(
        event_generator(),
        media_type="text/event-stream",
        headers={"X-Accel-Buffering": "no"}  # تعطيل buffering لتحسين السرعة
    )


# 🔹 تحديد إذا السؤال يحتاج بحث أو لا
def should_skip_search(message):
    skip_keywords = ["خطة", "برنامج", "كيف اتعلم", "نصيحة", "احكيلي عن", "شرح"]
    return any(word in message for word in skip_keywords)

💎 Credits

Developed by RUI Company Project: ONYX AI System

Downloads last month
7
Safetensors
Model size
4B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Space using ONYX-APP-AI/onyx-ai-syrian-0.1 1

Collection including ONYX-APP-AI/onyx-ai-syrian-0.1