مقارنة المخرجات المهيكلة بين مزودي نماذج LLM الشائعة - OpenAI، وGemini، وAnthropic، وMistral، وAWS Bedrock
تتطلب واجهات برمجة التطبيقات الخفيفة المختلفة نهجًا خاصًا.
هنا مقارنة دعم جانبي بين الإخراج المهيكل (الحصول على 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)
روابط مفيدة
- https://platform.openai.com/docs/guides/structured-outputs
- https://ai.google.dev/gemini-api/docs/structured-output
- https://docs.mistral.ai/capabilities/structured-output/json_mode/
- https://aws.amazon.com/blogs/machine-learning/structured-data-response-with-amazon-bedrock-prompt-engineering-and-tool-use
- https://github.com/aws-samples/anthropic-on-aws/blob/main/complex-schema-tool-use/README.md
- https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html
- كيفية طلب الإخراج المهيكل من نموذج LLM المضيف على Ollama
- قائمة مصطلحات Python
- AWS SAM + AWS SQS + Python PowerTools
- مقارنة أداء AWS Lambda: JavaScript vs Python vs Golang