مقارنة المخرجات المهيكلة بين مزودي نماذج LLM الشائعة - OpenAI، وGemini، وAnthropic، وMistral، وAWS Bedrock

تتطلب واجهات برمجة التطبيقات الخفيفة المختلفة نهجًا خاصًا.

Page content

هنا مقارنة دعم جانبي بين الإخراج المهيكل (الحصول على JSON موثوق به) عبر مزودي LLM الشائعة, مع أمثلة بسيطة جداً من Python

الأعمدة الملونة المتدلية

لقد نظرنا بالفعل إلى كيفية طلب الإخراج المهيكل من نموذج LLM المضيف على Ollama. هنا نراجع كيفية طلب نفس الشيء من مزودين آخرين.

TL;DR matrix

المزود “وضع JSON” الأصلي إجبار JSON Schema المفتاح النموذجي الملاحظات
OpenAI نعم نعم (أولوية) response_format={"type":"json_schema", ...} يعمل عبر واجهة API للردود أو التكملات الخاصة بالمحادثة؛ يمكن أيضاً إجراء دعوات الوظائف.
Google Gemini نعم نعم (أولوية) response_schema= + response_mime_type="application/json" يعيد JSON مُحقق التحقق منه بشكل صارم عندما يتم تعيين النموذج.
Anthropic (Claude) غير مباشر نعم (عبر استخدام الأدوات مع JSON schema) tools=[{input_schema=...}] + tool_choice إجبار النموذج على “استدعاء” أداة مُعرفة مسبقاً حسب نموذجك؛ ينتج معلمات تتوافق مع النموذج.
Mistral نعم جزئي (JSON فقط؛ لا يوجد نموذج خادم) response_format={"type":"json_object"} يضمن JSON، ولكنك تتحقق من النموذج الخاص بك من الجانب العميل.
AWS Bedrock (منصة) يختلف حسب النموذج نعم (عبر أداة/نموذج Converse) toolConfig.tools[].toolSpec.inputSchema يتحقق من واجهة أداة الإدخال من خلال نموذج JSON.

الإخراج المهيكل من LLM - معلومات عامة

الإخراج المهيكل من نماذج LLM يشير إلى القدرة على نماذج اللغة الكبيرة (LLMs) على إنتاج ردود تلتزم بشكل صارم بتنسيق أو هيكل محدد مسبقًا، بدلًا من إنتاج نص خالٍ من القيود. يمكن أن يكون هذا الإخراج المهيكل في تنسيقات مثل JSON، XML، الجداول، أو النماذج، مما يجعل البيانات قابلة للقراءة من قبل الآلات، وثابتة، وسهلة التحليل من قبل البرمجيات لاستخدامها في تطبيقات مختلفة.

يختلف الإخراج المهيكل عن الإخراج التقليدي من LLM، الذي ينتج عادةً نصًا طبيعيًا مفتوحًا. بدلًا من ذلك، يفرض الإخراج المهيكل نموذجًا أو تنسيقًا، مثل كائنات JSON مع مفاتيح محددة ونوع قيم، أو فئات محددة في الإخراج (مثل إجابات متعددة الخيارات، فئات المشاعر، أو تنسيقات صفوف قاعدة البيانات). هذه الطريقة تحسن الموثوقية، وتقلل الأخطاء والهلوسات، وتُبسط التكامل مع أنظمة مثل قواعد البيانات، وواجهات برمجة التطبيقات، أو العمليات.

تُستخدم تقنيات مثل:

  • تحديد تعليمات مفصلة في المطالبة لإرشاد النموذج لإنتاج الإخراج بالتنسيق المطلوب.
  • استخدام أدوات التحقق والتحليل مثل Pydantic في Python لضمان توافق الإخراج مع النموذج.
  • أحيانًا إجبار قيود التشفير بناءً على القواعد أو الآلات الحالة النهائية لضمان الامتثال للتنسيق على مستوى الرموز.

الفوائد من الإخراج المهيكل من LLM تشمل:

  • قابلية القراءة من قبل الآلات وسهولة التكامل.
  • تقليل التباين والأخطاء.
  • تحسين التنبؤ والتحقق من المهام التي تتطلب تنسيقات بيانات ثابتة.

التحديات تشمل تصميم نماذج فعالة، التعامل مع البيانات المعقدة المتشابكة، والحدود المحتملة في القدرة على التفكير مقارنة بإنتاج النصوص الخالية من القيود.

بشكل عام، يمكّن الإخراج المهيكل LLMs من أن تكون أكثر فائدة في التطبيقات التي تتطلب بيانات دقيقة ومُهيكلة بدلًا من النصوص البشرية فقط.

أمثلة من Python على الإخراج المهيكل

كل الأجزاء تُستخرج معلومات الحدث كـ JSON: {title, date, location}. استبدل المفاتيح/النماذج حسب رغبتك.

1) OpenAI — JSON Schema (صارم)

from openai import OpenAI
import json

client = OpenAI()

schema = {
    "name": "Event",
    "schema": {
        "type": "object",
        "properties": {
            "title": {"type": "string"},
            "date":  {"type": "string", "description": "YYYY-MM-DD"},
            "location": {"type": "string"}
        },
        "required": ["title", "date", "location"],
        "additionalProperties": False
    },
    "strict": True
}

resp = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "user", "content": "Extract the event from: 'PyData Sydney is on 2025-11-03 at Darling Harbour.'"}
    ],
    response_format={"type": "json_schema", "json_schema": schema},
)

data = json.loads(resp.choices[0].message.content)
print(data)

يفرض ميزة الإخراج المهيكل من OpenAI هذا النموذج من جانب الخادم.


2) Google Gemini — نموذج الاستجابة + MIME JSON

import google.generativeai as genai
from google.genai import types

# تكوين باستخدام مفتاح API الخاص بك
# genai.configure(api_key="your-api-key")

schema = types.Schema(
    type=types.Type.OBJECT,
    properties={
        "title": types.Schema(type=types.Type.STRING),
        "date": types.Schema(type=types.Type.STRING),
        "location": types.Schema(type=types.Type.STRING),
    },
    required=["title", "date", "location"],
    additional_properties=False,
)

resp = genai.generate_content(
    model="gemini-2.0-flash",
    contents="Extract the event from: 'PyData Sydney is on 2025-11-03 at Darling Harbour.'",
    generation_config=genai.GenerationConfig(
        response_mime_type="application/json",
        response_schema=schema,
    ),
)

print(resp.text)  # JSON صارم بالفعل وفقًا لنموذج الاستجابة

سيعيد Gemini JSON صارم يتوافق مع response_schema.


3) Anthropic (Claude) — استخدام الأدوات مع JSON schema

from anthropic import Anthropic
import json

client = Anthropic()

tool = {
    "name": "extract_event",
    "description": "إرجاع تفاصيل الحدث.",
    "input_schema": {
        "type": "object",
        "properties": {
            "title": {"type": "string"},
            "date": {"type": "string"},
            "location": {"type": "string"}
        },
        "required": ["title", "date", "location"],
        "additionalProperties": False
    }
}

msg = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=256,
    tools=[tool],
    tool_choice={"type": "tool", "name": "extract_event"},  # إجبار النموذج
    messages=[{"role": "user", "content":
        "Extract the event from: 'PyData Sydney is on 2025-11-03 at Darling Harbour.'"}],
)

# Claude سيقوم "باستخدام الأداة"؛ احصل على المعلمات (التي تتوافق مع نموذجك)
tool_use = next(b for b in msg.content if b.type == "tool_use")
print(json.dumps(tool_use.input, indent=2))

Claude لا يحتوي على مفتاح “وضع JSON” عام، بدلًا من ذلك، استخدام الأدوات مع input_schema يمنحك معلمات مُحقق التحقق منها (ويمكنك إجبار استخدامها).


4) Mistral — وضع JSON (التحقق من جانب العميل)

from mistralai import Mistral
import json

client = Mistral()

resp = client.chat.complete(
    model="mistral-large-latest",
    messages=[{"role":"user","content":
        "Return JSON with keys title, date (YYYY-MM-DD), location for: "
        "'PyData Sydney is on 2025-11-03 at Darling Harbour.'"}],
    response_format={"type": "json_object"}  # يضمن JSON صارم
)

data = json.loads(resp.choices[0].message.content)
print(data)
# نصيحة: قم بإجراء التحقق من `data` ضد نموذج JSON الخاص بك محليًا.

يفرض Mistral json_object شكل JSON (ليس نموذجك الدقيق) — قم بالتحقق من جانب العميل.


5) AWS Bedrock — أداة Converse API (نموذج مستقل)

import boto3, json

bedrock = boto3.client("bedrock-runtime", region_name="us-east-1")
model_id = "anthropic.claude-3-5-sonnet-20240620-v1:0"

tools = [{
    "toolSpec": {
        "name": "extract_event",
        "inputSchema": {
            "json": {
                "type": "object",
                "properties": {
                    "title": {"type": "string"},
                    "date": {"type": "string"},
                    "location": {"type": "string"}
                },
                "required": ["title","date","location"],
                "additionalProperties": False
            }
        }
    }
}]

resp = bedrock.converse(
    modelId=model_id,
    toolConfig={"tools": tools},
    toolChoice={"tool": {"name": "extract_event"}},  # إجبار النموذج
    messages=[{"role":"user","content":[{"text":
        "Extract the event from: 'PyData Sydney is on 2025-11-03 at Darling Harbour.'"}]}],
)

# استخراج محتوى الأداة
tool_use = next(
    c["toolUse"] for c in resp["output"]["message"]["content"] if "toolUse" in c
)
print(json.dumps(tool_use["input"], indent=2))

يتحقق Bedrock من إدخال الأداة حسب نموذج JSON الخاص بك، ويدعم العديد من النماذج المضيفة (مثل Claude) عبر Converse.


الإرشادات العملية والتحقق

  • إذا كنت ترغب في أقوى ضمانات جانب الخادم: الإخراج المهيكل من OpenAI أو نموذج الاستجابة من Gemini.
  • إذا كنت تستخدم Claude/Bedrock: حدد أداة مع نموذج JSON واجبر استخدامها؛ اقرأ المعلمات للأداة ككائن مُحدد.
  • إذا كنت تستخدم Mistral: أقرّ json_object وتحقق محليًا (مثلًا باستخدام Pydantic).

نمط التحقق (يعمل مع جميعهم)

from pydantic import BaseModel, ValidationError

class Event(BaseModel):
    title: str
    date: str
    location: str

try:
    event = Event.model_validate(data)  # `data` من أي مزود
except ValidationError as e:
    # التعامل مع / إعادة المحاولة / طلب النموذج لتصحيح باستخدام e.errors()
    print(e)

روابط مفيدة