التحكم في إبداع الذكاء الاصطناعي: فهم وإعداد معاملات Temperature و Top-K برمجياً
ماذا سنتعلم اليوم؟ سنتعمق في كيفية التحكم بإبداع نماذج اللغة الكبيرة (LLMs) باستخدام معاملات Temperature و Top-K. سنتعلم برمجياً كيف تؤثر هذه المعاملات على استجابات النموذج وكيفية ضبطها للحصول على النتائج المرجوة.
ملاحظة تقنية: يُعد فهم هذه المعاملات أمراً بالغ الأهمية للمطورين الذين يسعون لضبط سلوك نماذج الذكاء الاصطناعي بدقة، سواء لمهام تتطلب الإبداع المطلق أو الدقة والاتساق.
المفاهيم الأساسية: Temperature و Top-K
قبل الغوص في الأكواد، دعونا نفهم ما هي هذه المعاملات:
-
Temperature (درجة الحرارة): تتحكم في عشوائية استجابات النموذج.
- قيمة منخفضة (مثل 0.0): تجعل النموذج أكثر حتمية وتكراراً، حيث يميل لاختيار الكلمات الأكثر احتمالاً. النتائج تكون متسقة ومباشرة.
- قيمة مرتفعة (مثل 1.0): تجعل النموذج أكثر إبداعاً وتنوعاً، حيث يسمح باختيار كلمات أقل احتمالاً، مما يؤدي إلى استجابات غير متوقعة وأكثر أصالة.
-
Top-K: تتحكم في مجموعة الكلمات المحتملة التي يمكن للنموذج الاختيار منها.
- تحدد عدد الكلمات ذات الاحتمالية الأعلى التي سيتم أخذها في الاعتبار عند توليد الكلمة التالية.
- على سبيل المثال، إذا كانت Top-K=1، سيختار النموذج دائماً الكلمة الأكثر احتمالاً. إذا كانت Top-K=5، سيختار من بين أعلى 5 كلمات احتمالاً.
- تساعد في التحكم في "عرض" مساحة البحث عن الكلمات، مما يؤثر على التنوع.
الخطوة 1: إعداد البيئة واستدعاء LLM الأساسي
سنبدأ بإعداد بيئة Python وتثبيت المكتبات المطلوبة، ثم نقوم باستدعاء نموذج اللغة الكبير بدون أي معاملات إضافية لنرى السلوك الافتراضي.
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from dotenv import load_dotenv
# تحميل المتغيرات البيئية من ملف .env (مثل مفتاح API الخاص بـ OpenAI)
load_dotenv()
# تهيئة نموذج ChatOpenAI بسلوك افتراضي (Temperature=0.7 تقريباً لمعظم النماذج)
# model_name يمكن أن يكون "gpt-3.5-turbo" أو "gpt-4"
llm = ChatOpenAI(model_name="gpt-3.5-turbo", openai_api_key=os.getenv("OPENAI_API_KEY"))
# إنشاء قالب موجه بسيط
prompt = ChatPromptTemplate.from_messages([
("system", "أنت مساعد إبداعي يقوم بتوليد أفكار فريدة."),
("user", "{topic}")
])
# ربط الموجه بالنموذج
chain = prompt | llm
# استدعاء النموذج بسلوك افتراضي
print("--- استجابة افتراضية (Temperature=0.7 تقريباً) ---")
response_default = chain.invoke({"topic": "اكتب قصيدة قصيرة عن الفضاء"})
print(response_default.content)
print("\n" + "="*50 + "\n")
في هذا الجزء، قمنا بتهيئة نموذج ChatOpenAI باستخدام مفتاح API الخاص بنا. لاحظ أننا لم نحدد temperature أو top_k بشكل صريح، مما يعني أن النموذج سيستخدم قيمه الافتراضية (عادةً 0.7 لـ Temperature).
الخطوة 2: التحكم في الإبداع باستخدام معامل Temperature
الآن، دعونا نرى كيف يؤثر تغيير معامل temperature على إبداع وتنوع الاستجابات. سنقوم بتجربة قيم منخفضة وعالية.
# تهيئة نموذج بقيمة Temperature منخفضة (أكثر حتمية)
llm_low_temp = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.0, openai_api_key=os.getenv("OPENAI_API_KEY"))
chain_low_temp = prompt | llm_low_temp
print("--- استجابة مع Temperature = 0.0 (أكثر حتمية) ---")
response_low_temp = chain_low_temp.invoke({"topic": "اكتب قصيدة قصيرة عن الفضاء"})
print(response_low_temp.content)
print("\n" + "="*50 + "\n")
# تهيئة نموذج بقيمة Temperature مرتفعة (أكثر إبداعاً)
llm_high_temp = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=1.0, openai_api_key=os.getenv("OPENAI_API_KEY"))
chain_high_temp = prompt | llm_high_temp
print("--- استجابة مع Temperature = 1.0 (أكثر إبداعاً) ---")
response_high_temp = chain_high_temp.invoke({"topic": "اكتب قصيدة قصيرة عن الفضاء"})
print(response_high_temp.content)
print("\n" + "="*50 + "\n")
عندما تكون temperature=0.0، يميل النموذج إلى توليد الاستجابات الأكثر احتمالاً وتماسكاً، مما يقلل من "المفاجآت". بينما temperature=1.0 يزيد من فرصة اختيار كلمات أقل احتمالاً، مما يؤدي إلى نتائج أكثر إبداعاً ولكن قد تكون أقل اتساقاً.
الخطوة 3: التحكم في تنوع الاختيار باستخدام معامل Top-K
معامل top_k يسمح لنا بتحديد عدد الكلمات المحتملة التي يمكن للنموذج الاختيار منها لكل رمز (token).
# تهيئة نموذج بقيمة Top-K منخفضة (يختار من عدد قليل من الاحتمالات)
# ملاحظة: بعض النماذج قد لا تدعم top_k مباشرة، أو قد يكون لها قيمة افتراضية داخلية.
# في LangChain، يتم تمريرها كـ model_kwargs.
llm_low_top_k = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0.7, # نثبت Temperature للمقارنة
model_kwargs={"top_k": 1}, # تحديد Top-K عبر model_kwargs
openai_api_key=os.getenv("OPENAI_API_KEY")
)
chain_low_top_k = prompt | llm_low_top_k
print("--- استجابة مع Top-K = 1 (أقل تنوعاً، يختار الأكثر احتمالاً) ---")
response_low_top_k = chain_low_top_k.invoke({"topic": "اكتب قصيدة قصيرة عن الفضاء"})
print(response_low_top_k.content)
print("\n" + "="*50 + "\n")
# تهيئة نموذج بقيمة Top-K مرتفعة (يختار من عدد أكبر من الاحتمالات)
llm_high_top_k = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0.7, # نثبت Temperature للمقارنة
model_kwargs={"top_k": 50}, # تحديد Top-K عبر model_kwargs
openai_api_key=os.getenv("OPENAI_API_KEY")
)
chain_high_top_k = prompt | llm_high_top_k
print("--- استجابة مع Top-K = 50 (أكثر تنوعاً) ---")
response_high_top_k = chain_high_top_k.invoke({"topic": "اكتب قصيدة قصيرة عن الفضاء"})
print(response_high_top_k.content)
print("\n" + "="*50 + "\n")
ملاحظة تقنية: في مكتبة
langchain-openai، يتم تمرير المعاملات مثلtop_kوtop_p(والتي تشبه Top-K ولكن بناءً على مجموع الاحتمالات) داخل قاموسmodel_kwargs. هذا يسمح بمرونة أكبر في تمرير المعاملات الخاصة بواجهة برمجة تطبيقات OpenAI الأساسية.
عندما تكون top_k=1، يختار النموذج الكلمة الأكثر احتمالاً فقط، مما يقلل التنوع بشكل كبير. بينما top_k=50 يسمح للنموذج بالنظر في 50 كلمة الأكثر احتمالاً، مما يزيد من التنوع المحتمل في الاختيار.
الكود النهائي الكامل
إليكم السكربت الكامل الذي يجمع كل الخطوات المذكورة أعلاه. تأكد من استبدال YOUR_OPENAI_API_KEY بمفتاحك الحقيقي أو إعداده كمتغير بيئة.
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from dotenv import load_dotenv
# تحميل المتغيرات البيئية من ملف .env
load_dotenv()
# تأكد من تعيين مفتاح API
if os.getenv("OPENAI_API_KEY") is None:
print("خطأ: لم يتم تعيين مفتاح API الخاص بـ OpenAI. يرجى إعداده في ملف .env أو كمتغير بيئة.")
exit()
# إنشاء قالب موجه بسيط
prompt = ChatPromptTemplate.from_messages([
("system", "أنت مساعد إبداعي يقوم بتوليد أفكار فريدة."),
("user", "{topic}")
])
# --- 1. استدعاء النموذج بسلوك افتراضي ---
llm_default = ChatOpenAI(model_name="gpt-3.5-turbo", openai_api_key=os.getenv("OPENAI_API_KEY"))
chain_default = prompt | llm_default
print("--- استجابة افتراضية (Temperature=0.7 تقريباً) ---")
response_default = chain_default.invoke({"topic": "اكتب قصيدة قصيرة عن الفضاء"})
print(response_default.content)
print("\n" + "="*50 + "\n")
# --- 2. التحكم في الإبداع باستخدام معامل Temperature ---
# Temperature منخفضة (أكثر حتمية)
llm_low_temp = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.0, openai_api_key=os.getenv("OPENAI_API_KEY"))
chain_low_temp = prompt | llm_low_temp
print("--- استجابة مع Temperature = 0.0 (أكثر حتمية) ---")
response_low_temp = chain_low_temp.invoke({"topic": "اكتب قصيدة قصيرة عن الفضاء"})
print(response_low_temp.content)
print("\n" + "="*50 + "\n")
# Temperature مرتفعة (أكثر إبداعاً)
llm_high_temp = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=1.0, openai_api_key=os.getenv("OPENAI_API_KEY"))
chain_high_temp = prompt | llm_high_temp
print("--- استجابة مع Temperature = 1.0 (أكثر إبداعاً) ---")
response_high_temp = chain_high_temp.invoke({"topic": "اكتب قصيدة قصيرة عن الفضاء"})
print(response_high_temp.content)
print("\n" + "="*50 + "\n")
# --- 3. التحكم في تنوع الاختيار باستخدام معامل Top-K ---
# Top-K منخفضة (أقل تنوعاً)
llm_low_top_k = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0.7, # نثبت Temperature للمقارنة
model_kwargs={"top_k": 1},
openai_api_key=os.getenv("OPENAI_API_KEY")
)
chain_low_top_k = prompt | llm_low_top_k
print("--- استجابة مع Top-K = 1 (أقل تنوعاً، يختار الأكثر احتمالاً) ---")
response_low_top_k = chain_low_top_k.invoke({"topic": "اكتب قصيدة قصيرة عن الفضاء"})
print(response_low_top_k.content)
print("\n" + "="*50 + "\n")
# Top-K مرتفعة (أكثر تنوعاً)
llm_high_top_k = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0.7, # نثبت Temperature للمقارنة
model_kwargs={"top_k": 50},
openai_api_key=os.getenv("OPENAI_API_KEY")
)
chain_high_top_k = prompt | llm_high_top_k
print("--- استجابة مع Top-K = 50 (أكثر تنوعاً) ---")
response_high_top_k = chain_high_top_k.invoke({"topic": "اكتب قصيدة قصيرة عن الفضاء"})
print(response_high_top_k.content)
print("\n" + "="*50 + "\n")
# --- 4. مثال على الجمع بين Temperature و Top-K (اختياري) ---
# نموذج يجمع بين Temperature معتدلة و Top-K متحكم بها
llm_combined = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0.5, # إبداع متوسط
model_kwargs={"top_k": 10}, # تنوع محدود من أفضل 10 كلمات
openai_api_key=os.getenv("OPENAI_API_KEY")
)
chain_combined = prompt | llm_combined
print("--- استجابة مع Temperature = 0.5 و Top-K = 10 ---")
response_combined = chain_combined.invoke({"topic": "اكتب قصيدة قصيرة عن الفضاء"})
print(response_combined.content)
print("\n" + "="*50 + "\n")
النتيجة المتوقعة
عند تشغيل السكربت، ستلاحظ مخرجات متعددة لكل تكوين من معاملات temperature و top_k.
-
الاستجابة الافتراضية: ستقدم قصيدة متوازنة في الإبداع، حيث أن
temperatureالافتراضية (عادةً 0.7) توفر مزيجاً من الاتساق والإبداع. -
Temperature = 0.0: ستكون القصيدة أكثر مباشرة، ربما تكرر بعض الأفكار أو العبارات، وستكون أقل ميلاً للمجازات أو الصور الشعرية غير المتوقعة. قد تكون القصائد متشابهة جداً بين كل تشغيل وآخر. -
Temperature = 1.0: ستكون القصيدة أكثر إبداعاً وتنوعاً، وقد تحتوي على صور شعرية فريدة أو غير تقليدية. قد تختلف القصائد بشكل كبير بين كل تشغيل وآخر. -
Top-K = 1: ستكون القصيدة شديدة التحديد وربما تبدو "روبوتية" أو غير طبيعية، لأن النموذج يختار الكلمة الأكثر احتمالاً فقط في كل خطوة، مما يحد بشدة من التدفق الطبيعي للغة. -
Top-K = 50: ستظهر القصيدة تنوعاً أكبر في الكلمات والعبارات مقارنة بـTop-K = 1، ولكن لا يزال بإمكانها الحفاظ على بعض الاتساق إذا كانتtemperatureمعتدلة. -
الجمع بين
Temperature = 0.5وTop-K = 10: ستحصل على قصيدة تجمع بين الإبداع المعتدل والتحكم في نطاق الكلمات المحتملة، مما قد ينتج عنه توازن جيد بين الأصالة والتماسك.
من خلال مقارنة هذه المخرجات، يمكنك فهم كيفية ضبط هذه المعاملات لتحقيق السلوك المطلوب من نموذج الذكاء الاصطناعي الخاص بك.