العمل مع نماذج GPT-3.5-Turbo وGPT-4

نماذج GPT-3.5-Turbo وGPT-4 هي نماذج لغة محسنة لواجهات المحادثة. تتصرف النماذج بشكل مختلف عن نماذج GPT-3 القديمة. كانت النماذج السابقة عبارة عن نص ونصوص، ما يعني أنها قبلت سلسلة مطالبة وأرجعت إكمالا لإلحاق المطالبة. ومع ذلك، فإن نماذج GPT-3.5-Turbo وGPT-4 هي محادثة ورسالة للخارج. تتوقع النماذج إدخالا منسقا بتنسيق نسخة محددة تشبه الدردشة. وهي ترجع إكمالا يمثل رسالة مكتوبة بنموذج في الدردشة. تم تصميم هذا التنسيق خصيصا للمحادثات متعددة الأدوار، ولكن يمكن أن يعمل أيضا بشكل جيد لسيناريوهات عدم الدردشة.

ترشدك هذه المقالة خلال بدء استخدام نماذج GPT-3.5-Turbo وGPT-4. للحصول على أفضل النتائج، استخدم التقنيات الموضحة هنا. لا تحاول التفاعل مع النماذج بنفس الطريقة التي قمت بها مع سلسلة النماذج القديمة لأن النماذج غالبا ما تكون مطولة وتوفر استجابات أقل فائدة.

العمل مع نماذج GPT-3.5-Turbo وGPT-4

يوضح مقتطف التعليمات البرمجية التالي الطريقة الأساسية لاستخدام نماذج GPT-3.5-Turbo وGPT-4 مع واجهة برمجة تطبيقات إكمال الدردشة. إذا كانت هذه هي المرة الأولى التي تستخدم فيها هذه النماذج برمجيا، نوصيك بالبدء بالتشغيل السريع GPT-3.5-Turbo وGPT-4.

إشعار

في وثائق Azure OpenAI، نشير إلى GPT-3.5-Turbo وGPT-35-Turbo بالتبادل. الاسم الرسمي للنموذج على OpenAI هو gpt-3.5-turbo. بالنسبة إلى Azure OpenAI، بسبب قيود الأحرف الخاصة ب Azure، يكون اسم النموذج الأساسي هو gpt-35-turbo.

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
)

response = client.chat.completions.create(
    model="gpt-35-turbo", # model = "deployment_name".
    messages=[
        {"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
        {"role": "user", "content": "Who were the founders of Microsoft?"}
    ]
)

#print(response)
print(response.model_dump_json(indent=2))
print(response.choices[0].message.content)
{
  "id": "chatcmpl-8GHoQAJ3zN2DJYqOFiVysrMQJfe1P",
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "Microsoft was founded by Bill Gates and Paul Allen. They established the company on April 4, 1975. Bill Gates served as the CEO of Microsoft until 2000 and later as Chairman and Chief Software Architect until his retirement in 2008, while Paul Allen left the company in 1983 but remained on the board of directors until 2000.",
        "role": "assistant",
        "function_call": null
      },
      "content_filter_results": {
        "hate": {
          "filtered": false,
          "severity": "safe"
        },
        "self_harm": {
          "filtered": false,
          "severity": "safe"
        },
        "sexual": {
          "filtered": false,
          "severity": "safe"
        },
        "violence": {
          "filtered": false,
          "severity": "safe"
        }
      }
    }
  ],
  "created": 1698892410,
  "model": "gpt-35-turbo",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 73,
    "prompt_tokens": 29,
    "total_tokens": 102
  },
  "prompt_filter_results": [
    {
      "prompt_index": 0,
      "content_filter_results": {
        "hate": {
          "filtered": false,
          "severity": "safe"
        },
        "self_harm": {
          "filtered": false,
          "severity": "safe"
        },
        "sexual": {
          "filtered": false,
          "severity": "safe"
        },
        "violence": {
          "filtered": false,
          "severity": "safe"
        }
      }
    }
  ]
}
Microsoft was founded by Bill Gates and Paul Allen. They established the company on April 4, 1975. Bill Gates served as the CEO of Microsoft until 2000 and later as Chairman and Chief Software Architect until his retirement in 2008, while Paul Allen left the company in 1983 but remained on the board of directors until 2000.

إشعار

لا تتوفر المعلمات التالية مع نماذج GPT-35-Turbo وGPT-4 الجديدة: logprobsو best_ofو echo. إذا قمت بتعيين أي من هذه المعلمات، فستحصل على خطأ.

تتضمن finish_reasonكل استجابة . القيمة الممكنة لـ finish_reason هي:

  • stop: أرجعت واجهة برمجة التطبيقات إخراج النموذج الكامل.
  • الطول: إخراج نموذج غير مكتمل بسبب المعلمة max_tokens أو حد الرمز المميز.
  • content_filter: حذف المحتوى بسبب علامة من عوامل تصفية المحتوى.
  • null: لا تزال استجابة واجهة برمجة التطبيقات قيد التقدم أو غير مكتملة.

ضع في اعتبارك الإعداد max_tokens إلى قيمة أعلى قليلا من المعتاد، مثل 300 أو 500. تضمن القيمة الأعلى أن النموذج لا يتوقف عن إنشاء النص قبل أن يصل إلى نهاية الرسالة.

إنشاء إصدار النموذج

إشعار

الإصدار gpt-35-turbo يعادل النموذج من gpt-3.5-turbo OpenAI.

على عكس نماذج GPT-3 وGPT-3.5 السابقة، gpt-35-turbo سيستمر تحديث النموذج والنماذج و gpt-4gpt-4-32k . عند إنشاء توزيع هذه النماذج، تحتاج أيضا إلى تحديد إصدار نموذج.

يمكنك العثور على تواريخ إيقاف النموذج لهذه النماذج في صفحة النماذج .

العمل مع واجهة برمجة تطبيقات إكمال الدردشة

درب OpenAI نماذج GPT-35-Turbo وGPT-4 لقبول الإدخال المنسق كمحادثة. تأخذ معلمة الرسائل صفيفا من عناصر الرسائل مع محادثة منظمة حسب الدور. عند استخدام واجهة برمجة تطبيقات Python، يتم استخدام قائمة القواميس.

تنسيق إكمال الدردشة الأساسية هو:

{"role": "system", "content": "Provide some context and/or instructions to the model"},
{"role": "user", "content": "The users messages goes here"}

قد تبدو محادثة مع مثال واحد للإجابة متبوعة بسؤال كما يلي:

{"role": "system", "content": "Provide some context and/or instructions to the model."},
{"role": "user", "content": "Example question goes here."},
{"role": "assistant", "content": "Example answer goes here."},
{"role": "user", "content": "First question/message for the model to actually respond to."}

دور النظام

يتم تضمين دور النظام، المعروف أيضا باسم رسالة النظام، في بداية الصفيف. توفر هذه الرسالة الإرشادات الأولية للنموذج. يمكنك توفير معلومات مختلفة في دور النظام، مثل:

  • وصف موجز للمساعد.
  • سمات شخصية المساعد.
  • الإرشادات أو القواعد التي تريد أن يتبعها المساعد.
  • البيانات أو المعلومات المطلوبة للنموذج، مثل الأسئلة ذات الصلة من الأسئلة المتداولة.

يمكنك تخصيص دور النظام لحالة الاستخدام الخاصة بك أو تضمين إرشادات أساسية. دور/رسالة النظام اختيارية، ولكن نوصي بتضمين واحدة أساسية على الأقل للحصول على أفضل النتائج.

الرسائل

بعد دور النظام، يمكنك تضمين سلسلة من الرسائل بين user و assistant.

 {"role": "user", "content": "What is thermodynamics?"}

لتشغيل استجابة من النموذج، انتهي برسالة مستخدم للإشارة إلى أنه دور المساعد للاستجابة. يمكنك أيضا تضمين سلسلة من الرسائل المثال بين المستخدم والمساعد كطريقة للقيام بالتعلم ببضع صور.

أمثلة على موجه الرسائل

يعرض القسم التالي أمثلة على أنماط مختلفة من المطالبات التي يمكنك استخدامها مع نماذج GPT-35-Turbo وGPT-4. هذه الأمثلة ليست سوى نقطة بداية. يمكنك تجربة مطالبات مختلفة لتخصيص السلوك لحالات الاستخدام الخاصة بك.

مثال أساسي

إذا كنت تريد أن يتصرف نموذج GPT-35-Turbo بشكل مشابه chat.openai.com، يمكنك استخدام رسالة نظام أساسية مثل Assistant is a large language model trained by OpenAI.

{"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
{"role": "user", "content": "Who were the founders of Microsoft?"}

مثال مع إرشادات

بالنسبة لبعض السيناريوهات، قد تحتاج إلى إعطاء المزيد من الإرشادات للنموذج لتحديد حواجز الحماية لما يمكن للنموذج القيام به.

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer their tax related questions.
Instructions: 
- Only answer questions related to taxes. 
- If you're unsure of an answer, you can say "I don't know" or "I'm not sure" and recommend users go to the IRS website for more information. "},
{"role": "user", "content": "When are my taxes due?"}

استخدام البيانات للأرضية

يمكنك أيضا تضمين البيانات أو المعلومات ذات الصلة في رسالة النظام لمنح النموذج سياقا إضافيا للمحادثة. إذا كنت بحاجة إلى تضمين كمية صغيرة فقط من المعلومات، يمكنك ترميزها في رسالة النظام. إذا كان لديك كمية كبيرة من البيانات التي يجب أن يكون النموذج على علم بها، يمكنك استخدام التضمينات أو منتج مثل Azure الذكاء الاصطناعي Search لاسترداد المعلومات الأكثر صلة في وقت الاستعلام.

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer technical questions about Azure OpenAI Serivce. Only answer questions using the context below and if you're not sure of an answer, you can say 'I don't know'.

Context:
- Azure OpenAI Service provides REST API access to OpenAI's powerful language models including the GPT-3, Codex and Embeddings model series.
- Azure OpenAI Service gives customers advanced language AI with OpenAI GPT-3, Codex, and DALL-E models with the security and enterprise promise of Azure. Azure OpenAI co-develops the APIs with OpenAI, ensuring compatibility and a smooth transition from one to the other.
- At Microsoft, we're committed to the advancement of AI driven by principles that put people first. Microsoft has made significant investments to help guard against abuse and unintended harm, which includes requiring applicants to show well-defined use cases, incorporating Microsoft’s principles for responsible AI use."
},
{"role": "user", "content": "What is Azure OpenAI Service?"}

التعلم ببضع صور مع إكمال الدردشة

يمكنك أيضا إعطاء أمثلة قليلة على النموذج. تغير نهج التعلم ذي اللقطات القليلة قليلا بسبب تنسيق المطالبة الجديد. يمكنك الآن تضمين سلسلة من الرسائل بين المستخدم والمساعد في المطالبة كأمثلة قليلة اللقطات. باستخدام هذه الأمثلة، يمكنك تقديم إجابات على الأسئلة الشائعة لرئيس النموذج أو تعليم سلوكيات معينة للنموذج.

يوضح هذا المثال كيف يمكنك استخدام التعلم ببضع صور مع GPT-35-Turbo وGPT-4. يمكنك تجربة أساليب مختلفة لمعرفة ما يصلح بشكل أفضل لحالة الاستخدام الخاصة بك.

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer their tax related questions. "},
{"role": "user", "content": "When do I need to file my taxes by?"},
{"role": "assistant", "content": "In 2023, you will need to file your taxes by April 18th. The date falls after the usual April 15th deadline because April 15th falls on a Saturday in 2023. For more details, see https://www.irs.gov/filing/individuals/when-to-file."},
{"role": "user", "content": "How can I check the status of my tax refund?"},
{"role": "assistant", "content": "You can check the status of your tax refund by visiting https://www.irs.gov/refunds"}

استخدام إكمال الدردشة لسيناريوهات عدم الدردشة

تم تصميم واجهة برمجة تطبيقات إكمال الدردشة للعمل مع المحادثات متعددة الأدوار، ولكنها تعمل أيضا بشكل جيد مع سيناريوهات عدم الدردشة.

على سبيل المثال، بالنسبة لسيناريو استخراج الكيان، قد تستخدم المطالبة التالية:

{"role": "system", "content": "You are an assistant designed to extract entities from text. Users will paste in a string of text and you will respond with entities you've extracted from the text as a JSON object. Here's an example of your output format:
{
   "name": "",
   "company": "",
   "phone_number": ""
}"},
{"role": "user", "content": "Hello. My name is Robert Smith. I'm calling from Contoso Insurance, Delaware. My colleague mentioned that you are interested in learning about our comprehensive benefits policy. Could you give me a call back at (555) 346-9322 when you get a chance so we can go over the benefits?"}

إنشاء حلقة محادثة أساسية

توضح الأمثلة حتى الآن الآليات الأساسية للتفاعل مع واجهة برمجة تطبيقات إكمال الدردشة. يوضح لك هذا المثال كيفية إنشاء حلقة محادثة تنفذ الإجراءات التالية:

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

في كل مرة يتم فيها طرح سؤال جديد، يتم إرسال نسخة قيد التشغيل من المحادثة حتى الآن مع أحدث سؤال. نظرا لعدم وجود ذاكرة للنموذج، تحتاج إلى إرسال نسخة محدثة مع كل سؤال جديد أو سيفقد النموذج سياق الأسئلة والأجوبة السابقة.

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")  # Your Azure OpenAI resource's endpoint value.
)

conversation=[{"role": "system", "content": "You are a helpful assistant."}]

while True:
    user_input = input("Q:")      
    conversation.append({"role": "user", "content": user_input})

    response = client.chat.completions.create(
        model="gpt-35-turbo", # model = "deployment_name".
        messages=conversation
    )

    conversation.append({"role": "assistant", "content": response.choices[0].message.content})
    print("\n" + response.choices[0].message.content + "\n")

عند تشغيل التعليمات البرمجية السابقة، تحصل على نافذة وحدة تحكم فارغة. أدخل سؤالك الأول في النافذة ثم حدد Enter المفتاح. بعد إرجاع الاستجابة، يمكنك تكرار العملية ومتابعة طرح الأسئلة.

إدارة المحادثات

يتم تشغيل المثال السابق حتى تصل إلى حد الرمز المميز للنموذج. مع كل سؤال تم طرحه، والإجابة المستلمة messages ، يزداد حجم القائمة. حد الرمز المميز ل gpt-35-turbo هو 4096 رمزا مميزا. حدود الرمز المميز ل gpt-4 و gpt-4-32k هي 8192 و 32768 على التوالي. تتضمن هذه الحدود عدد الرموز المميزة من كل من قائمة الرسائل المرسلة واستجابة النموذج. يجب أن يظل عدد الرموز المميزة في قائمة الرسائل جنبا إلى جنب مع قيمة المعلمة max_tokens ضمن هذه الحدود أو تتلقى خطأ.

تقع على عاتقك مسؤولية التأكد من أن المطالبة والإكمال تقع ضمن حد الرمز المميز. للحصول على محادثات أطول، تحتاج إلى تعقب عدد الرموز المميزة وإرسال مطالبة للنموذج فقط تقع ضمن الحد الأقصى.

إشعار

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

يظهر نموذج التعليمات البرمجية التالي مثالا بسيطا لحلقة الدردشة مع تقنية للتعامل مع عدد 4096 رمزا مميزا باستخدام مكتبة Tiktoken الخاصة ب OpenAI.

تستخدم التعليمات البرمجية tiktoken 0.5.1. إذا كان لديك إصدار أقدم، فقم بتشغيل pip install tiktoken --upgrade.

import tiktoken
import os
from openai import AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")  # Your Azure OpenAI resource's endpoint value.
)

system_message = {"role": "system", "content": "You are a helpful assistant."}
max_response_tokens = 250
token_limit = 4096
conversation = []
conversation.append(system_message)

def num_tokens_from_messages(messages, model="gpt-3.5-turbo-0613"):
    """Return the number of tokens used by a list of messages."""
    try:
        encoding = tiktoken.encoding_for_model(model)
    except KeyError:
        print("Warning: model not found. Using cl100k_base encoding.")
        encoding = tiktoken.get_encoding("cl100k_base")
    if model in {
        "gpt-3.5-turbo-0613",
        "gpt-3.5-turbo-16k-0613",
        "gpt-4-0314",
        "gpt-4-32k-0314",
        "gpt-4-0613",
        "gpt-4-32k-0613",
        }:
        tokens_per_message = 3
        tokens_per_name = 1
    elif model == "gpt-3.5-turbo-0301":
        tokens_per_message = 4  # every message follows <|start|>{role/name}\n{content}<|end|>\n
        tokens_per_name = -1  # if there's a name, the role is omitted
    elif "gpt-3.5-turbo" in model:
        print("Warning: gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0613.")
        return num_tokens_from_messages(messages, model="gpt-3.5-turbo-0613")
    elif "gpt-4" in model:
        print("Warning: gpt-4 may update over time. Returning num tokens assuming gpt-4-0613.")
        return num_tokens_from_messages(messages, model="gpt-4-0613")
    else:
        raise NotImplementedError(
            f"""num_tokens_from_messages() is not implemented for model {model}."""
        )
    num_tokens = 0
    for message in messages:
        num_tokens += tokens_per_message
        for key, value in message.items():
            num_tokens += len(encoding.encode(value))
            if key == "name":
                num_tokens += tokens_per_name
    num_tokens += 3  # every reply is primed with <|start|>assistant<|message|>
    return num_tokens
while True:
    user_input = input("Q:")      
    conversation.append({"role": "user", "content": user_input})
    conv_history_tokens = num_tokens_from_messages(conversation)

    while conv_history_tokens + max_response_tokens >= token_limit:
        del conversation[1] 
        conv_history_tokens = num_tokens_from_messages(conversation)

    response = client.chat.completions.create(
        model="gpt-35-turbo", # model = "deployment_name".
        messages=conversation,
        temperature=0.7,
        max_tokens=max_response_tokens
    )


    conversation.append({"role": "assistant", "content": response.choices[0].message.content})
    print("\n" + response.choices[0].message.content + "\n")

في هذا المثال، بعد الوصول إلى عدد الرموز المميزة، تتم إزالة أقدم الرسائل في نص المحادثة. للكفاءة، del يتم استخدام بدلا من pop(). نبدأ من الفهرس 1 للحفاظ دائما على رسالة النظام وإزالة رسائل المستخدم أو المساعد فقط. بمرور الوقت، يمكن أن تؤدي هذه الطريقة لإدارة المحادثة إلى تدهور جودة المحادثة حيث يفقد النموذج تدريجيا سياق الأجزاء السابقة من المحادثة.

نهج بديل هو تحديد مدة المحادثة إلى الحد الأقصى لطول الرمز المميز أو عدد معين من الأدوار. بعد الوصول إلى الحد الأقصى للرمز المميز، سيفقد النموذج السياق إذا كنت ستسمح بمتابعة المحادثة. يمكنك مطالبة المستخدم ببدء محادثة جديدة ومسح قائمة الرسائل لبدء محادثة جديدة مع حد الرمز المميز الكامل المتاح.

جزء عد الرمز المميز من التعليمات البرمجية الموضح سابقا هو نسخة مبسطة من أحد أمثلة كتاب التعليمات الخاص ب OpenAI.

استكشاف الأخطاء وإصلاحها

إليك تلميح استكشاف الأخطاء وإصلاحها.

لا تستخدم بناء جملة ChatML أو الرموز المميزة الخاصة مع نقطة نهاية إكمال الدردشة

يحاول بعض العملاء استخدام بناء جملة ChatML القديم مع نقاط نهاية إكمال الدردشة والنماذج الأحدث. كانت ChatML إمكانية معاينة تعمل فقط مع نقطة نهاية الإكمال القديمة gpt-35-turbo مع نموذج الإصدار 0301. من المقرر أن يتقاعد هذا النموذج. إذا حاولت استخدام بناء جملة ChatML مع نماذج أحدث ونقطة نهاية إكمال الدردشة، فقد يؤدي ذلك إلى أخطاء وسلوك استجابة نموذج غير متوقع. لا نوصي بهذا الاستخدام. يمكن أن تحدث هذه المشكلة نفسها عند استخدام الرموز المميزة الخاصة الشائعة.

رمز الخطأ رسالة الخطأ حل
400 400 - "فشل في إنشاء الإخراج بسبب الرموز المميزة الخاصة في الإدخال." تحتوي مطالبتك على رموز مميزة خاصة أو رموز ChatML المميزة القديمة التي لم يتم التعرف عليها أو دعمها من قبل النموذج/نقطة النهاية. تأكد من أن صفيف المطالبة/الرسائل لا يحتوي على أي رموز ChatML المميزة/الرموز المميزة الخاصة القديمة. إذا كنت تقوم بالترقية من نموذج قديم، فاستبعد جميع الرموز المميزة الخاصة قبل إرسال طلب واجهة برمجة التطبيقات إلى النموذج.

فشل إنشاء الإكمال لأن النموذج أنشأ إخراج Unicode غير صالح

رمز الخطأ رسالة الخطأ الطرق البديلة
500 500 - InternalServerError: رمز الخطأ: 500 - {'error': {'message': 'Failed to create completion as the model generated invalid Unicode output}}. يمكنك تقليل حدوث هذه الأخطاء عن طريق تقليل درجة حرارة مطالباتك إلى أقل من 1 والتأكد من أنك تستخدم عميلا بمنطق إعادة المحاولة. غالبا ما تؤدي إعادة استجابة الطلب إلى استجابة ناجحة.

الخطوات التالية