اكتشف كيفية دمج نموذج OpenAI o1-preview الجديد في سكربت Python لإثراء مشاريعك في الذكاء الاصطناعي. يتيح لك هذا السكربت التفاعل مع واجهة برمجة تطبيقات OpenAI باستخدام النموذج o1-preview، مع إمكانية تضمين محتوى الويب في الـ prompts عبر وظيفة جلب محتوى الويب. بالإضافة إلى ذلك، يعالج السكربت تعابير LaTeX الرياضية في إجابات النموذج بشكل صحيح عن طريق تحويلها إلى نص Unicode قابل للقراءة في الطرفية.
مقدمة
في 12 سبتمبر 2024، أطلقت OpenAI سلسلة النماذج الجديدة المسماة OpenAI o1. تم تصميم هذه النماذج لإجراء استدلال أعمق قبل تقديم الإجابة، مما يمكنها من حل مشاكل معقدة في العلوم والبرمجة والرياضيات. يبرع نموذج o1-preview بشكل خاص في هذه المجالات، متفوقًا على النماذج السابقة مثل gpt-4o.
النقاط الأساسية للسكربت:
- دمج نموذج o1-preview: يستخدم السكربت النموذج o1-preview افتراضيًا، مما يوفر قدرات استدلال متقدمة.
- جلب محتوى الويب مدمج: يمكنه استخراج محتوى صفحات الويب لإثراء سياق الـ prompt.
- معالجة تعابير LaTeX: تُحوّل التعابير الرياضية في الإجابات إلى نص Unicode لسهولة القراءة في الطرفية.
- قابل للتخصيص: يتيح السكربت اختيار نموذج OpenAI ويمكن تكييفه لمختلف حالات الاستخدام.
في هذا المقال، سأعرض كود السكربت بالتفصيل، وأشرح كيف يعمل، وأنفّذ سلسلة من الـ prompts المعقدة.
المتطلبات
قبل البدء، تأكد من توفر العناصر التالية:
- Python 3.x مثبت على جهازك.
- مفتاح API من OpenAI. يمكنك الحصول عليه بالتسجيل على موقع OpenAI.
- بيئة افتراضية Python (موصى بها لعزل الاعتمادات).
- الحزم (الموديولات) اللازمة في Python.
إعداد البيئة الافتراضية
لعزل اعتماديات هذا المشروع، يوصى باستخدام بيئة افتراضية. فيما يلي كيفية إنشائها وتثبيت الاعتمادات المطلوبة :
python3 -m venv env
source env/bin/activate # Sur Windows, utilisez env\Scripts\activate
pip install openai selenium webdriver-manager pylatexenc
ضبط مفتاح API لـ OpenAI
عيّن مفتاح API الخاص بك كمتغير بيئة:
export OPENAI_API_KEY='votre_clé_api_ici'
استبدل 'votre_clé_api_ici' بمفتاح API الحقيقي الخاص بك.
الكود الكامل للسكربت
فيما يلي الكود الكامل للسكربت Python :
#!/usr/bin/env python3
import os
import sys
import argparse
import re
from openai import OpenAI
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from pylatexenc.latex2text import LatexNodes2Text
def get_web_content(url):
if not url:
return ""
try:
# Configure les options de Chrome
chrome_options = Options()
# Ne pas utiliser le mode headless pour éviter les problèmes de vérification humaine
# Utilise ChromeDriverManager pour gérer l\'installation de ChromeDriver
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()), options=chrome_options
)
# Charge la page web
driver.get(url)
# Récupère le contenu textuel de la page
web_content = driver.execute_script("return document.documentElement.innerText")
# Ferme le navigateur
driver.quit()
return web_content if web_content else None
except Exception as e:
return None
def convert_latex_to_text(latex_str):
# Convertit les expressions LaTeX en texte Unicode
return LatexNodes2Text().latex_to_text(latex_str)
def clean_output(content):
# Trouve toutes les expressions LaTeX dans le contenu et les convertit
patterns = [r"\\\\[.*?\\\\]", r"\\\(.*?\\\)", r"\$\$.*?\$\$", r"\$.*?\$"]
for pattern in patterns:
matches = re.findall(pattern, content, flags=re.DOTALL)
for match in matches:
plain_text = convert_latex_to_text(match)
content = content.replace(match, plain_text)
return content
def get_response(prompt, client, model="o1-preview"):
urls = re.findall(r"(https?://\S+)", prompt)
for url in urls:
web_content = get_web_content(url)
if web_content:
prompt = prompt.replace(url, web_content)
else:
return f"Erreur: Le contenu web pour {url} ne peut être récupéré."
try:
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": prompt,
},
],
)
first_choice_message = response.choices[0].message
content = first_choice_message.content
# Convertit les expressions LaTeX en texte lisible
cleaned_content = clean_output(content)
return cleaned_content
except Exception as e:
return f"Une erreur est survenue : {e}"
def main():
parser = argparse.ArgumentParser()
parser.add_argument("prompt", nargs="?", help="Le prompt contenant des URLs")
parser.add_argument(
"--model",
default="o1-preview",
choices=["gpt-4o", "o1-preview", "o1-mini"],
help="Le modèle OpenAI à utiliser (par défaut o1-preview)",
)
args = parser.parse_args()
openai_api_key = os.getenv("OPENAI_API_KEY")
if not openai_api_key:
raise ValueError(
"La clé API OPENAI_API_KEY n'est pas définie dans les variables d\'environnement."
)
with OpenAI(api_key=openai_api_key) as client:
prompt = args.prompt or sys.stdin.read()
response = get_response(prompt, client, model=args.model)
print(response)
if __name__ == "__main__":
main()
شرح الكود
استيراد الحزم اللازمة
يبدأ السكربت باستيراد الحزم الأساسية:
- os, sys, argparse, re: حزم قياسية لإدارة متغيرات البيئة، معاملات سطر الأوامر والتعابير النمطية.
- openai: الحزمة للتفاعل مع واجهة برمجة تطبيقات OpenAI.
- selenium و webdriver_manager: لأداء جلب محتوى الويب.
- pylatexenc: لتحويل تعابير LaTeX إلى نص Unicode قابل للعرض.
الدالة get_web_content
تسترجع هذه الدالة المحتوى النصي لصفحة ويب.
def get_web_content(url):
if not url:
return ""
try:
# Configure les options de Chrome
chrome_options = Options()
# Ne pas utiliser le mode headless pour éviter les problèmes de vérification humaine
# Utilise ChromeDriverManager pour gérer l\'installation de ChromeDriver
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()), options=chrome_options
)
# Charge la page web
driver.get(url)
# Récupère le contenu textuel de la page
web_content = driver.execute_script("return document.documentElement.innerText")
# Ferme le navigateur
driver.quit()
return web_content if web_content else None
except Exception as e:
return None
النقاط الرئيسية:
- خيارات Chrome: لا يستخدم السكربت وضع headless لتجنب مشكلات التحقق البشري التي تفرضها بعض الصفحات على المتصفحات في وضع headless.
- ChromeDriverManager: يدير تثبيت وتحديث ChromeDriver تلقائيًا.
- استخراج المحتوى: يستخدم JavaScript لاستخراج النص الكامل للصفحة.
- معالجة الاستثناءات: في حالة حدوث خطأ، تُعيد الدالة
None.
الدالة convert_latex_to_text
تحول هذه الدالة تعابير LaTeX إلى نص Unicode.
def convert_latex_to_text(latex_str):
# Convertit les expressions LaTeX en texte Unicode
return LatexNodes2Text().latex_to_text(latex_str)
النقاط الرئيسية:
- تستخدم المكتبة
pylatexencلتحويل تعابير LaTeX، مما يجعل الصيغ الرياضية قابلة للقراءة في الطرفية.
الدالة clean_output
تعالج هذه الدالة استجابة النموذج لتحويل تعابير LaTeX.
def clean_output(content):
# Trouve toutes les expressions LaTeX dans le contenu et les convertit
patterns = [r"\\\\[.*?\\\\]", r"\\\(.*?\\\)", r"\$\$.*?\$\$", r"\$.*?\$"]
for pattern in patterns:
matches = re.findall(pattern, content, flags=re.DOTALL)
for match in matches:
plain_text = convert_latex_to_text(match)
content = content.replace(match, plain_text)
return content
النقاط الرئيسية:
- البحث عن تعابير LaTeX: تستخدم تعابير نمطية للتعرّف على الصيغ.
- التحويل: تُحوّل كل صيغة إلى نص Unicode.
- الاستبدال: تُستبدل صيغ LaTeX بنظيراتها القابلة للقراءة.
الدالة get_response
تحضّر الـ prompt، تتعامل مع جلب محتوى الويب إذا لزم، تنادي API الخاصة بـ OpenAI وتنظف الاستجابة.
def get_response(prompt, client, model="o1-preview"):
urls = re.findall(r"(https?://\S+)", prompt)
for url in urls:
web_content = get_web_content(url)
if web_content:
prompt = prompt.replace(url, web_content)
else:
return f"Erreur: Le contenu web pour {url} ne peut être récupéré."
try:
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": prompt,
},
],
)
first_choice_message = response.choices[0].message
content = first_choice_message.content
# Convertit les expressions LaTeX en texte lisible
cleaned_content = clean_output(content)
return cleaned_content
except Exception as e:
return f"Une erreur est survenue : {e}"
النقاط الرئيسية:
- معالجة عناوين URL: إذا احتوى الـ prompt على عناوين URL، يُستخرج المحتوى ويُدرج.
- النداء إلى API: يرسل الـ prompt المعدّل إلى النموذج المحدد.
- تنظيف الاستجابة: تُحوّل تعابير LaTeX لتسهيل قراءتها.
الدالة main
تتعامل مع معاملات سطر الأوامر وتنفّذ السكربت.
def main():
parser = argparse.ArgumentParser()
parser.add_argument("prompt", nargs="?", help="Le prompt contenant des URLs")
parser.add_argument(
"--model",
default="o1-preview",
choices=["gpt-4o", "o1-preview", "o1-mini"],
help="Le modèle OpenAI à utiliser (par défaut o1-preview)",
)
args = parser.parse_args()
openai_api_key = os.getenv("OPENAI_API_KEY")
if not openai_api_key:
raise ValueError(
"La clé API OPENAI_API_KEY n'est pas définie dans les variables d\'environnement."
)
with OpenAI(api_key=openai_api_key) as client:
prompt = args.prompt or sys.stdin.read()
response = get_response(prompt, client, model=args.model)
print(response)
النقاط الرئيسية:
- المعاملات: يقبل السكربت prompt ونموذج كمعاملات.
- مفتاح API: يتحقق من أن مفتاح API تم تعيينه.
- التنفيذ: ينادي الدالة
get_responseويعرض الاستجابة.
تشغيل السكربت
if __name__ == "__main__":
main()
أمثلة على الاستخدام
طرح سؤال يتطلب استدلالًا
./openai_poc.py "Dans un triangle rectangle, si les côtés adjacents à l'angle droit mesurent 3 cm et 4 cm, calcule la longueur de l'hypoténuse."
لحساب طول الوتر في مثلث قائم إذا كان طولا الضلعين المتعامدين 3 سم و4 سم، نستخدم نظرية فيثاغورس :
باستبدال القيم المعطاة :
بأخذ الجذر التربيعي لكلا الطرفين :
إذاً، طول الوتر هو 5 سم.
طول الوتر هو 5 سم.
توليد ملخص لصفحة ويب
./openai_poc.py "Fais-moi un résumé de cette page : https://openai.com/index/introducing-openai-o1-preview/"
أعلنت OpenAI في 12 سبتمبر 2024 عن إدخال سلسلة جديدة من نماذج الذكاء الاصطناعي تسمى OpenAI o1، مصممة لأخذ وقت أطول للتفكير قبل الإجابة. هذه النماذج قادرة على الاستدلال عبر مهام معقدة وحل مشاكل أصعب من النماذج السابقة في مجالات العلم والبرمجة والرياضيات.
النموذج الأول في هذه السلسلة، o1-preview، متاح الآن على ChatGPT وعبر واجهة برمجة التطبيقات لـ OpenAI. كما تُقدّم نسخة أخف وأكثر اقتصادية تُسمى OpenAI o1-mini، وتوفر قدرات ترميز فعالة بتكلفة أقل بنحو 80% مقارنة بـ o1-preview.
حل ضرب بسيط
./openai_poc.py "Quel est le résultat de 15 x 12 ?"
نتيجة هي 180.
حل معادلة بسيطة
./openai_poc.py "Résous l'équation 2x + 5 = 15."
لحل المعادلة ، اتبع الخطوات التالية:
- اطرح 5 من طرفي المعادلة لعزل الحد المحتوي على المتغير:
- اقسم طرفي المعادلة على 2 لحل قيمة :
الحل : .
حساب نسبة مئوية
./openai_poc.py "Quel est 20% de 250 ?"
من يساوي 50.
الحساب :
حساب مساحة دائرة
./openai_poc.py "Calcule l'aire d'un cercle de rayon 5 cm."
لحساب مساحة دائرة نصف قطرها 5 سم، استخدم صيغة مساحة الدائرة :
حيث :
- هي مساحة الدائرة،
- هو نصف القطر.
باستبدال ب 5 سم :
إذن، مساحة الدائرة هي .
إذا رغبت بقيمة تقريبية مع :
وبالتالي، تكون المساحة تقريبًا 78,54 سم².
حساب تكامل بسيط
./openai_poc.py "Calcule l'intégrale de 0 à 1 de x^2 dx."
لحساب التكامل من 0 إلى 1 للدالة ، نقوم بتكامل بالنسبة إلى ثم نقيم التعبير بين الحدود 0 و1.
خطوات الحساب :
- تكامل الدالة :
حيث C ثابت التكامل.
- التقييم بين الحدين 0 و1 :
- حساب القيم عند الحدود :
- طرح القيم للحصول على الناتج النهائي :
الخلاصة :
قيمة التكامل من 0 إلى 1 للدالة هي .
حساب السرعة المتوسطة
./openai_poc.py "Si une voiture parcourt 150 km en 3 heures, quelle est sa vitesse moyenne ?"
لحساب السرعة المتوسطة لسيارة قطعت 150 كم في 3 ساعات، نستخدم صيغة السرعة المتوسطة :
بتطبيق القيم المعطاة :
إذن، السرعة المتوسطة للسيارة هي 50 كم/س.
الميكانيكا الكلاسيكية
./openai_poc.py "Un bloc de 5 kg est tiré sur une surface sans frottement par une force de 20 N. Calcule son accélération."
لحساب تسارع الكتلة، نستخدم القانون الثاني لنيوتن، الذي ينص على أن القوة المحصلة المؤثرة على جسم تساوي كتلة الجسم مضروبة في تسارعه ().
المعطيات :
- كتلة الكتلة،
- القوة المؤثّرة،
- سطح بدون احتكاك (بالتالي لا توجد قوة احتكاك معاكسة)
بإعادة ترتيب الصيغة للحصول على التسارع ()، نحصل على :
بإبدال القيم المعطاة :
الإجابة : تسارع الكتلة هو 4 أمتار في الثانية المربعة ().
حل المعادلات التفاضلية
./openai_poc.py "Résous l'équation différentielle dy/dx = x^2 + y^2 avec la condition initiale y(0) = 1."
لحل المعادلة التفاضلية :
مع شرط القيمة الابتدائية ، نلاحظ أن هذه المعادلة غير خطية ولا يمكن حلها بالطرق البسيطة مثل فصل المتغيرات أو عوامل التكامل القياسية. ومع ذلك، يمكن محاولة تحويل المعادلة إلى شكل أكثر قابلية للحل.
الخطوة 1 : التعرف على نوع المعادلة
المعادلة المعطاة هي معادلة ريكاتي الشكل العام :
في حالتنا، تكتب كالتالي :
الخطوة 2 : تحويل المعادلة إلى معادلة خطية من الرتبة الثانية
لحل معادلة ريكاتي، يمكن استخدام التعويض التالي :
حيث دالة مطلوب إيجادها، و مشتقها بالنسبة إلى .
حساب بالنسبة إلى :
بتطبيق قاعدة اشتقاق القسمة :
الخطوة 3 : التعويض في المعادلة الأصلية
نعوض عن و في المعادلة التفاضلية الأصلية :
نبسّط المعادلة :
الآن نضرب الطرفين في لإزالة المقامات :
نبسّط :
نقسّم على (بافتراض ) :
الخطوة 4 : حل المعادلة الخطية من الرتبة الثانية
نحصل على معادلة تفاضلية خطية متجانسة من الرتبة الثانية :
هذه المعادلة ذات معاملات متغيرة، وتُعرف بأنها تشبه معادلة آيري المعدّلة. حلول هذه المعادلة لا تُعبّر بدوال عنصرية، بل تُعطى بدوال خاصة تسمى دوال آيري.
حلول المعادلة :
الحلول العامة للمعادلة هي :
حيث و هما دوال آيري من النوع الأول والثاني، و الوحدة التخيلية بحيث .
الخطوة 5 : الرجوع إلى
نذكر أن :
بمعرفة ، يمكن إيجاد بحساب مشتقة وإجراء القسمة.
الخطوة 6 : تطبيق شرط القيمة الابتدائية
لتحديد ثوابت التكامل و ، يجب تطبيق الشرط الابتدائي . ومع ذلك، نظرًا لتعقيد دوال آيري ذات الحجج المركبة، يكون الحساب الصريح صعبًا.
الخلاصة
حل المعادلة التفاضلية المعطاة مع الشرط الابتدائي يُعبر عنه ضمنيًا بدوال آيري الخاصة، ولا يمكن كتابته بصيغة دوال عنصرية بسيطة.
الإجابة النهائية :
حل المعادلة التفاضلية مع يُعطى ضمنيًا بدوال آيري، ولا يمكن التعبير عنه بصراحة بدوال عنصرية.
الكهرومغناطيسية
./openai_poc.py "Calcule le champ électrique à une distance r d'une charge ponctuelle Q."
المجال الكهربائي الناتج عن شحنة نقطية على مسافة يُعطى بقانون كولومب. صيغة حساب المجال الكهربائي :
حيث :
- هو المجال الكهربائي (بوحدات فولت/متر، V/m),
- هي الشحنة النقطية (بالكولوم، C),
- هي المسافة إلى الشحنة (بالمتر، m),
- هي سماحية الفراغ، بقيمة تقريبية .
مثال حسابي :
افترض أن لديك شحنة (2 ميكروكولوم) وترغب في حساب المجال الكهربائي على بعد .
- احسب الثابت أمام الكسر :
- طبق الصيغة :
الخلاصة :
المجال الكهربائي على بعد من شحنة نقطية هو .
وبذلك، لحساب المجال الكهربائي عند مسافة معينة من شحنة نقطية، استخدم الصيغة أعلاه مع استبدال و بالقيم الخاصة بالمشكلة.
توازن كيميائي
./openai_poc.py "Explique comment le principe de Le Chatelier s'applique à l'équilibre suivant : N2 + 3H2 ⇌ 2NH3."
ينص مبدأ لوشاتيليه على أنه عندما يتعرض نظام في حالة توازن لتغيير (إجهاد) خارجي، فإنه يتصرف بحيث يقلل هذا الاضطراب ويستعيد توازنًا جديدًا. عند تطبيقه على التفاعل الكيميائي التالي :
يمكننا تحليل كيفية تأثير التغيرات المختلفة على موضع التوازن.
1. تغيير التركيز : - زيادة تركيز المتفاعلات (N₂ أو H₂) : إذا أُضيف النيتروجين (N₂) أو الهيدروجين (H₂) إلى النظام، يزيد تركيز هذه المتفاعلات. وفق مبدأ لو شاتلييه، سيتحرك التوازن في الاتجاه الذي يستهلك هذه المتفاعلات الإضافية، أي نحو اليمين، مما يفضّل تكوين الأمونيا (NH₃).
-
نقصان تركيز النواتج (NH₃) : إذا اُزيحت الأمونيا من النظام، ينخفض تركيز NH₃. سينتقل التوازن حينها نحو اليمين للتعويض عن هذا النقص، مفضلاً مرة أخرى تكوين الأمونيا.
-
زيادة تركيز النواتج (NH₃) : إذا أُضيفت الأمونيا إلى النظام، سيتحرك التوازن نحو اليسار لتقليل الفائض من NH₃، مما يفضّل تكوين N₂ و H₂.
2. تغير الضغط :
-
زيادة الضغط الكلي للنظام : بالنسبة للغازات، تؤدي زيادة الضغط (عن طريق تقليل الحجم) إلى تفضيل التفاعل الذي ينتج عددًا أقل من الجُزيئات الغازية. في هذا التفاعل، ننتقل من 4 مولات غازية (1 N₂ + 3 H₂) إلى 2 مول غازي (2 NH₃). لذا، تؤدي زيادة الضغط إلى إزاحة التوازن نحو اليمين، مفضلة تكوين الأمونيا.
-
انخفاض الضغط الكلي للنظام : على العكس، سيؤدي انخفاض الضغط إلى تفضيل التفاعل الذي ينتج أكبر عدد من المولات الغازية، مما يزيح التوازن نحو اليسار ويُفضّل تفكك NH₃ إلى N₂ و H₂.
3. تغير درجة الحرارة :
-
طبيعة التفاعل طاردة للحرارة : تخليق الأمونيا تفاعل طارد للحرارة ()، أي أنه يطلق حرارة.
-
زيادة درجة الحرارة : عند رفع درجة الحرارة، تُضاف حرارة إلى النظام. وفق مبدأ لو شاتلييه، سيتحرك التوازن في الاتجاه الذي يمتص هذه الحرارة الإضافية، أي نحو اليسار (التفاعل ماص للحرارة)، مفضلاً تفكك NH₃ إلى N₂ و H₂.
-
انخفاض درجة الحرارة : عند خفض درجة الحرارة، يتفاعل النظام بإنتاج حرارة للتعويض عن هذا الفقدان. لذا ينتقل التوازن نحو اليمين (التفاعل طارد للحرارة)، مفضلاً تكوين الأمونيا.
4. وجود مُحفِّز :
- تأثير المُحفِّز : إضافة محفز (مثل الحديد مقسّمًا ناعمًا مع محسّنات) تزيد من سرعة الوصول إلى التوازن، لكنها لا تغير موقع التوازن. فهي تُسرّع التفاعلين الأمامي والعكسي بنفس القدر.
ملخص :
يسمح مبدأ لو شاتلييه بالتنبؤ بالاتجاه الذي سيتحرك فيه الاتزان الكيميائي استجابةً لتغيير ظروف النظام. بالنسبة لتخليق الأمونيا :
- ضغط مرتفع يفضّل تكوين NH₃ (لأن عدد المولات الغازية أقل).
- درجة حرارة منخفضة تفضّل تكوين NH₃ (لأن التفاعل طارد للحرارة).
- زيادة تركيز N₂ أو H₂ تفضّل تكوين NH₃.
- إزالة NH₃ من النظام تفضّل تكوين المزيد من NH₃.
تُطبّق هذه المبادئ في عملية هابر-بوش لتحسين إنتاج الأمونيا صناعيًا.
الخلاصة
هذا السكربت بلغة بايثون يقدم تكاملًا عمليًا مع نموذج OpenAI o1-preview، مما يتيح استغلال قدراته المتقدمة في التفكير لمجموعة واسعة من الأسئلة، من أبسطها إلى أعقدها. سواءٌ كنت مبتدئًا فضوليًا أو خبيرًا يسعى لاختبار حدود النموذج، فهذا السكربت أداة مفيدة لمشاريعك في الذكاء الاصطناعي.
الموارد
- إعلان نموذج OpenAI o1-preview
- التوثيق الرسمي لواجهة برمجة تطبيقات OpenAI
- توثيق Selenium
- توثيق pylatexenc
- دليل حول البيئات الافتراضية في بايثون
تمت ترجمة هذا المستند من النسخة الفرنسية إلى اللغة العربية باستخدام النموذج gpt-5-mini. لمزيد من المعلومات حول عملية الترجمة، راجع https://gitlab.com/jls42/ai-powered-markdown-translator