ترجمة مدونتي إلى 7 لغات مقابل بنسات مع OpenAI
كيف أقدم المحتوى لجمهور متنوع
Categories: Professional Development Computational
تمت ترجمة هذه المشاركة بواسطة الذكاء الاصطناعي وتم التحقق منها بشكل سطحي فقط من خلال الترجمة العكسية.
لماذا نهتم بالتدوين متعدد اللغات
عندما قمت بتحديث مدونتي آخر مرة، قمت بإعادة تصميمها خصيصًا لتوفير محتوى بعدة لغات. نظرًا لأن معظم محتواي يتعلق بعلم الأحياء الاصطناعي، والبرمجة، وأحيانًا الدراسات العليا الأمريكية، أتوقع أن معظم قرائي سيكونون على الأرجح بارعين إلى حد ما في اللغة الإنجليزية، وهي لغتي الأم. حوالي 90% من الأدبيات الأكاديمية تُنشر باللغة الإنجليزية. البرمجة في وضع مشابه، حيث تُبرمج اللغات الرئيسية مثل Java وC وPython إلى حد كبير (لكن ليس حصريًا) باللغة الإنجليزية. لا أعلم عن برامج دراسات عليا في علم الأحياء في الولايات المتحدة تقدم مقررات دراسية خارج اللغة الإنجليزية.
ومع ذلك، فإن مجموعة فرعية من قرائي ستكون أقل راحة في اللغة الإنجليزية مقارنةً بلغتهم الأم. على سبيل المثال، يبلغ عدد كبير من الباحثين الكولومبيين عن رفض أوراقهم بسبب القواعد اللغوية. من المؤكد أن بعض القراء المحتملين لن يكونوا قادرين على قراءة اللغة الإنجليزية على الإطلاق. قد يكون هؤلاء طلاب جامعيين أو قراء فضوليين غير علميين. من أجل الوصول إلى جمهور أكبر وجعل محتواي أكثر سهولة لهذه المجتمعات، أحتاج إلى وسيلة لترجمة محتواي بسرعة وبشكل نظيف إلى لغات أخرى.
اختيار اللغات المستهدفة
أتمنى أن أقول إنني اخترت اللغات التي اخترتها لسبب معقد، لكن الحقيقة هي أن الأمر يتعلق في الغالب بالوصول. اللغة الإنجليزية هي لغتي الأم والمحتوى الذي أكتب به، لذا فإن ذلك تلقائي. كما أردت تضمين الألمانية والفرنسية والإسبانية كلغات قريبة من الإنجليزية توفر معيارًا جيدًا للمقارنة. تم تضمين الهندية والصينية المبسطة بسبب العدد الكبير من الأشخاص الذين يتحدثون تلك اللغات. أضفت العربية لأنني اعتقدت أنه سيكون من المثير إضافة لغة تُكتب من اليمين إلى اليسار، مع نية مستقبلية لبرمجتها لتتوافق مع الاتجاه الصحيح. لدي أيضًا زملاء يتحدثون كل من هذه اللغات يمكنني الحصول على تعليقات منهم.
بناء خط الأنابيب
الاستفادة من الذكاء الاصطناعي في الترجمة
هناك الكثير من الأدبيات حول سبب اختيار الذكاء الاصطناعي التوليدي (مثل OpenAI) مقابل نظام قائم على القواعد (مثل Google Translate) لبناء الترجمة الآلية. السبب الرئيسي الذي جعلني أختار OpenAI هو التجربة الشخصية. عند ترجمة المحتوى من لغات أخرى إلى الإنجليزية، لاحظت أن الترجمات القائمة على القواعد غالبًا ما تعيد لي قواعد نحوية غير مريحة. لا أستطيع أن أتخيل أن اللغات الأخرى ستحصل على تجربة أفضل. من خلال استخدام الذكاء الاصطناعي، آمل أن أحصل على ترجمات تبدو أكثر طبيعية.
إعداد خط أنابيب OpenAI
يمتلك OpenAI بالفعل حزمة بايثون بسيطة ومُوثقة جيدًا تغلف واجهة برمجة التطبيقات الخاصة بهم. وبما أنني ذو خبرة جيدة في بايثون، كان استخدامه لإعداد الترجمة الخاصة بي قرارًا بسيطًا.
أولاً، ستحتاج إلى التأكد من إعداد مفتاح OpenAI الخاص بك. سيتطلب ذلك أيضًا تحميل أموال في حسابك، ومع ذلك، وجدت أن ترجمة منشورات المدونات بهذه الطريقة تكلفني أقل من سنت واحد مع الأسعار الحالية ونماذج 4o-mini. من الواضح أن هذه الواجهة موجهة أكثر نحو الخدمات المستمرة التي ستجري الكثير من استدعاءات واجهة برمجة التطبيقات بمرور الوقت، بدلاً من تطبيقنا الذي يتطلب فقط استدعاءها من حين لآخر للترجمة.
لإعداد مفتاحك، قم بزيارة منصة مطوري OpenAI، وانتقل إلى لوحة التحكم الخاصة بك، ثم مفاتيح واجهة برمجة التطبيقات، وأنشئ مفتاح سري جديد. ستحتاج إلى حفظ هذا المفتاح لاحقًا. احتفظ به في مكان آمن وخاص، حيث سيسمح لأي شخص لديه هذا المفتاح باستخدام أموال OpenAI الخاصة بك لأي غرض يريده.
يمكننا اختبار المفتاح باستخدام برنامج بايثون بسيط للتأكد من أننا قمنا بإعداده بشكل صحيح.
"""اختبر ما إذا كان مفتاح واجهة برمجة تطبيقات OpenAI صالحًا."""
key = get_openapi_key()
client = OpenAI(api_key=key)
completion = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": "أنت واجهة برمجة تطبيقات فحص الصحة. فقط رد بـ 'حسناً'",
},
{"role": "user", "content": "تحقق"},
],
)
if completion.choices[0].message.content == "OK":
print("مفتاح OpenAI صالح ويعمل")
else:
print(completion.choices[0].message)
الآن بعد أن تحققنا من أن المفتاح يعمل، يمكننا إعداد خط الأنابيب. نحن لا نقدم خدمة مباشرة، لذا يمكننا استخدام واجهة برمجة تطبيقات الدفعة من OpenAI لتوفير الكثير من المال. تم تصميم واجهة برمجة تطبيقات الدفعة لاستخدامها في كميات كبيرة من الطلبات التي لا تتطلب استجابات فورية، لذا يمكن أن تكون أبطأ. ومع ذلك، فهي لا تهتم فعليًا بعدد الطلبات التي ترسلها وهي نصف السعر في وقت كتابة هذه السطور. هذا يقلل التكلفة إلى جزء من سنت لترجمة منشور مدونة إلى كل لغة نهتم بها.
تتطلب OpenAPI أن تكون طلباتها بتنسيق محدد. نحتاج إلى إخبار الذكاء الاصطناعي بما هو (أداة ترجمة)، النموذج الذي نستخدمه، واللغة التي نترجم إليها. لقد قرأت أنه من المفيد أيضًا إخبارها باستخدام لهجة معينة، لذا سنضيف هذا الخيار أيضًا.
def openai_format(
id: str, model: str, language: str, dialect: str, content: str
) -> dict:
if dialect:
system_message = f"""أنت واجهة برمجة تطبيقات الترجمة.
ترجم إدخال المستخدم إلى {language} باستخدام لهجة {dialect}
فقط. أعد الترجمة مع الحفاظ على
هيكل markdown. من الممكن أنك بدأت
في منتصف كتلة الكود."""
else:
system_message = f"""أنت واجهة برمجة تطبيقات الترجمة.
ترجم إدخال المستخدم إلى {language}. فقط أعد
الترجمة بالتنسيق markdown المطابق. من الممكن أنك بدأت
في منتصف كتلة الكود."""
formatted_prompt = {
"custom_id": id,
"method": "POST",
"url": "/v1/chat/completions",
"body": {
"model": model,
"messages": [
{"role": "system", "content": system_message},
{"role": "user", "content": content},
],
"temperature": 0.1,
},
}
return formatted_prompt
الآن بعد أن أصبح لدينا دالة لمساعدتنا في تنسيق طلباتنا، يمكننا تجميعها معًا باستخدام حزمة بايثون الخاصة بـ OpenAI. تفضل واجهة برمجة التطبيقات طلباتها بتنسيق JSON، لذا سنستخدم دليلًا مؤقتًا لكتابة طلباتنا إلى ملف، ثم نستخدم حزمة بايثون لإرسال الطلبات إلى واجهة برمجة التطبيقات. سيعطينا هذا معرف دفعة يجب أن نتابعه، حيث سيكون هذا هو كيفية استرجاع النتائج.
import json
from tempfile import TemporaryDirectory
from openai import OpenAI
def send_openai_batch(formatted_prompts: list, description=None):
key = get_openapi_key()
client = OpenAI(api_key=key)
if not description:
description = "دفعة ترجمة بتنسيق Markdown"
with TemporaryDirectory() as tmpdirname:
with open(f"{tmpdirname}/batchinput.json", "a") as f:
for prompt in formatted_prompts:
f.write(json.dumps(prompt) + "\n")
batch_input_file = client.files.create(
file=open(f"{tmpdirname}/batchinput.json", "rb"),
purpose="batch"
)
batch_input_file_id = batch_input_file.id
batch = client.batches.create(
input_file_id=batch_input_file_id,
endpoint="/v1/chat/completions",
completion_window="24h",
metadata={"description": description},
)
return batch
الآن بعد أن أرسلنا طلبنا، نحتاج إلى الانتظار حتى تنتهي الدفعة. على الرغم من أننا نستخدم واجهة برمجة التطبيقات الأبطأ للدفعات، إلا أن هذه العملية عادةً ما تستغرق بضع دقائق فقط. إذا حاولنا الحصول على النتائج قبل الانتهاء، فسوف نحصل على خطأ. يمكننا استخدام المعرف للتحقق من الدفعة في حلقة بدلاً من ذلك، ثم سحب النتائج بعد ذلك.
from time import sleep
def openai_check_results(batch_id: str):
key = get_openapi_key()
client = OpenAI(api_key=key)
result = client.batches.retrieve(batch_id)
return result
def wait_for_openai(batch_id: str):
while True:
result = openai_check_results(batch_id)
if result.status in ["validating", "in_progress"]:
print(f"في انتظار OpenAI (الدفعة في حالة {result.status})")
sleep(5)
continue
else:
break
if result.status in ["failed", "expired",
"canceling", "canceled"]:
raise ValueError(f"دفعة OpenAI {batch_id} فشلت")
الحصول على النتيجة الفعلية سهل للغاية. بمجرد أن نحصل على الضوء الأخضر، يمكننا فقط أخذ النص من كائن النتيجة. القيمة المعادة هي سلسلة من السلاسل بتنسيق JSON بطريقة مشابهة لتلك التي استخدمناها في الطلب. بمجرد تحميل JSON، تكون استجابة OpenAI مدفونة في result["response"]["body"]["choices"][0]["message"]["content"]
.
from collections import defaultdict
def build_openai_results(batch_id: str):
key = get_openapi_key()
client = OpenAI(api_key=key)
result = openai_check_results(batch_id)
file_response = client.files.content(result.output_file_id
).text.split("\n")
result_dict = defaultdict(dict)
for json_str in file_response:
if json_str == "":
continue
result = json.loads(json_str)
id = result["custom_id"]
result_dict[id] = result["response"]["body"][
"choices"][0]["message" ]["content"]
return result_dict
الخاتمة
وهذا كل شيء! يمكننا الآن استخدام OpenAI لترجمة منشورات المدونة الخاصة بنا (أو أي محتوى آخر) إلى أي لغة نريدها. تأكد من إجراء أي تحرير نصي مسبقًا قبل تشغيل الترجمات، حيث لا أستطيع ضمان كيفية تصرف النموذج. لقد أخذت هذا خطوة أبعد من خلال أتمتة المزيد من العملية. نظامي يأخذ تلقائيًا ملفات Markdown. كما أنه يقسم الملفات إلى أجزاء أصغر، حيث لاحظت أن الذكاء الاصطناعي يمكن أن يتشتت قليلاً إذا تم إعطاؤه ملفًا كبيرًا لترجمته. لقد وضعت هذا في مستودع منفصل يمكنك العثور عليه هنا. الكود مرخص بموجب MIT، لذا لا تتردد في استخدامه كما تريد.