→ بازگشت به هوش مصنوعی مولد

ساخت برنامه‌های تولید متن

شما تا به حال در این برنامه درسی متوجه شده‌اید که مفاهیم اصلی مانند پرسش‌ها و حتی یک رشته تخصصی به نام "مهندسی پرسش" وجود دارد. بسیاری از ابزارهایی که می‌توانید با آنها تعامل داشته باشید، مانند ChatGPT، Office 365، مایکروسافت پاور پلتفرم و غیره، از شما می‌خواهند که با استفاده از پرسش‌ها کاری را انجام دهید.

برای اینکه چنین تجربه‌ای را به یک برنامه اضافه کنید، باید مفاهیمی مانند پرسش‌ها، تکمیل‌ها را درک کنید و یک کتابخانه برای کار کردن انتخاب کنید. دقیقاً همین موارد را در این فصل خواهید آموخت.

مقدمه

در این فصل، شما:

  • با کتابخانه openai و مفاهیم کلیدی آن آشنا خواهید شد.
  • یک برنامه تولید متن با استفاده از openai ایجاد خواهید کرد.
  • یاد خواهید گرفت که چگونه از مفاهیمی مانند پرسش، دما و نشانه‌ها برای ساخت یک برنامه تولید متن استفاده کنید.

اهداف یادگیری

در پایان این درس، شما خواهید توانست:

  • توضیح دهید که برنامه تولید متن چیست.
  • یک برنامه تولید متن با استفاده از openai بسازید.
  • برنامه خود را طوری پیکربندی کنید که از نشانه‌های بیشتری یا کمتری استفاده کند و همچنین دما را تغییر دهد تا خروجی‌های متنوع‌تری ایجاد کند.

برنامه تولید متن چیست؟

به طور معمول، هنگامی که شما یک اپلیکیشن را می‌سازید، آن اپلیکیشن دارای نوعی رابط کاربری است، مانند موارد زیر:

  • مبتنی بر دستور. برنامه‌های کنسول، اپلیکیشن‌هایی معمولی هستند که در آن‌ها شما یک دستور را تایپ می‌کنید و این دستور یک کار را انجام می‌دهد. به عنوان مثال، git یک اپلیکیشن مبتنی بر دستور است.
  • رابط کاربری (UI). برخی اپلیکیشن‌ها دارای رابط‌های گرافیکی کاربری (GUI) هستند که در آن‌ها شما دکمه‌ها را کلیک می‌کنید، متن را وارد می‌کنید، گزینه‌ها را انتخاب می‌کنید و بیشتر.

محدودیت‌های برنامه‌های کنسول و UI

یک اپلیکیشن مبتنی بر دستور که در آن شما یک دستور را تایپ می‌کنید:

  • محدود است. شما نمی‌توانید هر دستوری را تایپ کنید، فقط آن‌هایی که اپلیکیشن پشتیبانی می‌کند.
  • زبان خاص. برخی از اپلیکیشن‌ها از زبان‌های بسیاری پشتیبانی می‌کنند، اما به طور پیش‌فرض، اپلیکیشن برای زبانی خاص ساخته شده است، حتی اگر بتوانید پشتیبانی از زبان‌های بیشتری را اضافه کنید.

مزایای برنامه‌های تولید متن

پس چگونه یک برنامه تولید متن متفاوت است؟

در یک برنامه تولید متن، شما انعطاف‌پذیری بیشتری دارید، به مجموعه‌ای از دستورات یا یک زبان ورودی خاص محدود نیستید. در عوض، می‌توانید از زبان طبیعی برای تعامل با اپلیکیشن استفاده کنید. یکی دیگر از مزایا این است که چون شما در حال تعامل با یک منبع داده‌ای هستید که بر روی یک مجموعه وسیع از اطلاعات آموزش دیده است، در حالی که یک اپلیکیشن سنتی ممکن است در آنچه در یک پایگاه داده وجود دارد محدود باشد.

چه چیزی می‌توانم با یک اپلیکیشن تولید متن بسازم؟

شما می‌توانید پروژه‌های زیادی بسازید. برای مثال:

  • یک چت‌بات. یک چت‌بات که به سوالات مربوط به موضوعاتی مانند شرکت و محصولات آن پاسخ می‌دهد می‌تواند گزینه خوبی باشد.
  • دستیار. مدل‌های زبان بزرگ در کارهایی مانند خلاصه‌سازی متن، استخراج نکات از متن، تولید متنی مانند رزومه و بیشتر مهارت دارند.
  • دستیار کد. بسته به مدل زبانی که استفاده می‌کنید، می‌توانید یک دستیار کد بسازید که به شما در نوشتن کد کمک کند. برای مثال، می‌توانید از محصولی مانند GitHub Copilot به همراه ChatGPT برای کمک به نوشتن کد استفاده کنید.

چگونه می‌توانم شروع کنم؟

خوب، شما باید راهی برای ادغام با یک مدل زبانی بزرگ پیدا کنید که معمولاً شامل دو رویکرد زیر است:

  • استفاده از API. در اینجا شما درخواست‌های وب را با پرسش خود ساخته و متن تولید شده را دریافت می‌کنید.
  • استفاده از یک کتابخانه. کتابخانه‌ها کمک می‌کنند تا تماس‌های API را محصور کرده و استفاده از آن‌ها را آسان‌تر کنند.

کتابخانه‌ها/SDKها

چند کتابخانه معروف برای کار با مدل‌های زبانی بزرگ وجود دارد مانند:

  • openai، این کتابخانه استفاده از مدل شما و ارسال درخواست‌ها را آسان می‌کند.

سپس کتابخانه‌هایی وجود دارند که در سطح بالاتر عمل می‌کنند مانند:

  • Langchain. Langchain به خوبی شناخته شده و از پایتون پشتیبانی می‌کند.
  • Semantic Kernel. Semantic Kernel یک کتابخانه از مایکروسافت است که از زبان‌های C#، پایتون و جاوا پشتیبانی می‌کند.

اولین برنامه با استفاده از OpenAI

بیایید ببینیم چگونه می‌توانیم اولین برنامه خود را بسازیم، چه کتابخانه‌هایی نیاز داریم، هزینه‌ها چقدر است و غیره.

نصب openai

کتابخانه‌های زیادی برای تعامل با OpenAI وجود دارد. می‌توان از زبان‌های برنامه‌نویسی متعددی مانند C#، Python، JavaScript، Java و غیره استفاده کرد. ما تصمیم گرفته‌ایم از کتابخانه openai در پایتون استفاده کنیم، بنابراین از pip برای نصب آن استفاده خواهیم کرد.

pip install openai

تولید متن

راه تولید متن استفاده از کلاس Completion است. در اینجا یک مثال وجود دارد:

prompt = "Complete the following: Once upon a time there was a"

completion = openai.Completion.creat(model="davinci-002", prompt=prompt)
print(completion.choices[0].text)

در کد بالا، ما یک شیء تکمیل ایجاد می‌کنیم و مدل مورد نظر و پرسش را به آن منتقل می‌کنیم. سپس متن تولید شده را چاپ می‌کنیم.

تکمیل چت

تا به حال، شما دیده‌اید که چگونه از Completion برای تولید متن استفاده می‌کنیم. اما یک کلاس دیگر به نام ChatCompletion وجود دارد که برای چت‌بات‌ها بیشتر مناسب است. در اینجا یک مثال از استفاده از آن است:

import openai

openai.api_key = "sk-..."

completion = openai.ChatCompletion.create(model="gpt-4o-mini", messages=[{"role": "user", "content": "Hello world"}])
print(completion.choices[0].message.content)

جزئیات بیشتری درباره این قابلیت در فصل آینده ارائه خواهد شد.

تمرین - اولین برنامه تولید متن شما

حالا که یاد گرفتیم چطور openai را راه‌اندازی و پیکربندی کنیم، وقت آن است که اولین برنامه تولید متن خود را بسازیم. برای ساختن برنامه‌تان، مراحل زیر را دنبال کنید:

  1. یک محیط مجازی ایجاد کنید و openai را نصب کنید:

    python -m venv venv
    source venv/bin/activate
    pip install openai
    

    [یادداشت] اگر از ویندوز استفاده می‌کنید، به جای source venv/bin/activate از venv\Scripts\activate استفاده کنید.

  2. یک فایل به نام app.py بسازید و کد زیر را در آن قرار دهید:

    import openai
    
    openai.api_key = "<replace this value with your open ai key or Azure OpenAI key>"
    
    openai.api_type = 'azure'
    openai.api_version = '2023-05-15'
    openai.api_base = "<endpoint found in Azure Portal where your API key is>"
    deployment_name = "<deployment name>"
    
    # add your completion code
    prompt = "Complete the following: Once upon a time there was a"
    messages = [{"role": "user", "content": prompt}]
    
    # make completion
    completion = client.chat.completions.create(model=deployment, messages=messages)
    
    # print response
    print(completion.choices[0].message.content)
    

شما باید خروجی مشابه زیر را مشاهده کنید:

 very unhappy _____.

Once upon a time there was a very unhappy mermaid.

انواع مختلف پرسش‌ها برای کارهای متفاوت

پرسش‌ها می‌توانند برای انواع مختلف وظایف استفاده شوند. به عنوان مثال:

  • تولید نوع خاصی از متن. به عنوان مثال، می‌توانید یک شعر، سوالاتی برای یک آزمون و غیره تولید کنید.
  • جستجوی اطلاعات. می‌توانید از پرسش‌ها برای جستجوی اطلاعات مانند مثال زیر استفاده کنید 'Cache در توسعه وب به چه معناست؟'.
  • تولید کد. می‌توانید از پرسش‌ها برای تولید کد استفاده کنید، برای مثال، یک regular expression برای اعتبارسنجی ایمیل‌ها یا حتی تولید یک برنامه کامل، مانند یک وب‌اپلیکیشن؟

یک مورد استفاده عملی‌تر: تولیدکننده دستور غذا

تصور کنید که در خانه مواد غذایی دارید و می‌خواهید چیزی بپزید. برای این کار، به یک دستور غذا نیاز دارید. یکی از راه‌های پیدا کردن دستور غذا این است که از یک موتور جستجو استفاده کنید یا می‌توانید از یک مدل زبانی بزرگ (LLM) برای این کار استفاده کنید.

شما می‌توانید یک پرسش به شکل زیر بنویسید:

"Show me 5 recipes for a dish with the following ingredients: chicken, potatoes, and carrots. Per recipe, list all the ingredients used"

"۵ دستور غذا برای یک وعده با مواد زیر نشان بده: مرغ، سیب‌زمینی و هویج. برای هر دستور، تمام مواد لازم را فهرست کن"

با توجه به پرسش فوق، ممکن است پاسخ شبیه به این باشد:

1. Roasted Chicken and Vegetables:
Ingredients:
- 4 chicken thighs
- 2 potatoes, cut into cubes
- 2 carrots, cut into cubes
- 2 tablespoons olive oil
- 2 cloves garlic, minced
- 1 teaspoon dried thyme
- 1 teaspoon dried oregano
- Salt and pepper, to taste

1. Chicken and Potato Stew:
Ingredients:
- 2 tablespoons olive oil
- 1 onion, diced
- 2 cloves garlic, minced
- 2 chicken breasts, cut into cubes
- 2 potatoes, cut into cubes
- 2 carrots, cut into cubes
- 1 teaspoon dried oregano
- 1 teaspoon dried thyme
- 1 cup chicken broth
- Salt and pepper, to taste

1. Chicken and Potato Bake:
Ingredients:
- 2 tablespoons olive oil
- 2 chicken breasts, cut into cubes
- 2 potatoes, cut into cubes
- 2 carrots, cut into cubes
- 1 onion, diced
- 2 cloves garlic, minced
- 1 teaspoon dried oregano
- 1 teaspoon dried thyme
- 1 cup chicken broth
- Salt and pepper, to taste

1. Chicken and Potato Soup:
Ingredients:
- 2 tablespoons olive oil
- 1 onion, diced
- 2 cloves garlic, minced
- 2 chicken breasts, cut into cubes
- 2 potatoes, cut into cubes
- 2 carrots, cut into cubes
- 1 teaspoon dried oregano
- 1 teaspoon dried thyme
- 4 cups chicken broth
- Salt and pepper, to taste

1. Chicken and Potato Hash:
Ingredients:
- 2 tablespoons olive oil
- 2 chicken breasts, cut into cubes
- 2 potatoes, cut into cubes
- 2 carrots, cut into cubes
- 1 onion, diced
- 2 cloves garlic, minced
- 1 teaspoon dried oregano

این نتیجه عالی است، من می‌دانم چه چیزی بپزم. در این مرحله، چه بهبودهای مفیدی می‌تواند وجود داشته باشد:

  • فیلتر کردن مواد اولیه‌ای که دوست ندارم یا به آنها آلرژی دارم.
  • تولید یک لیست خرید، در صورتی که همه مواد اولیه را در خانه نداشته باشم.

برای موارد فوق، بیایید یک درخواست اضافی اضافه کنیم:

"Please remove recipes with garlic as I'm allergic and replace it with something else. Also, please produce a shopping list for the recipes, considering I already have chicken, potatoes and carrots at home."

"لطفاً دستورهای پختی را که حاوی سیر هستند حذف کنید چون به آن آلرژی دارم و آن را با چیزی دیگر جایگزین کنید. همچنین، لطفاً یک لیست خرید برای دستورهای پخت ارائه دهید، با در نظر گرفتن اینکه من قبلاً مرغ، سیب‌زمینی و هویج در خانه دارم."

حالا شما یک نتیجه جدید دارید:

1. Roasted Chicken and Vegetables:
Ingredients:
- 4 chicken thighs
- 2 potatoes, cut into cubes
- 2 carrots, cut into cubes
- 2 tablespoons olive oil
- 1 teaspoon dried thyme
- 1 teaspoon dried oregano
- Salt and pepper, to taste

1. Chicken and Potato Stew:
Ingredients:
- 2 tablespoons olive oil
- 1 onion, diced
- 2 chicken breasts, cut into cubes
- 2 potatoes, cut into cubes
- 2 carrots, cut into cubes
- 1 teaspoon dried oregano
- 1 teaspoon dried thyme
- 1 cup chicken broth
- Salt and pepper, to taste

1. Chicken and Potato Bake:
Ingredients:
- 2 tablespoons olive oil
- 2 chicken breasts, cut into cubes
- 2 potatoes, cut into cubes
- 2 carrots, cut into cubes
- 1 onion, diced
- 1 teaspoon dried oregano
- 1 teaspoon dried thyme
- 1 cup chicken broth
- Salt and pepper, to taste

1. Chicken and Potato Soup:
Ingredients:
- 2 tablespoons olive oil
- 1 onion, diced
- 2 chicken breasts, cut into cubes
- 2 potatoes, cut into cubes
- 2 carrots, cut into cubes
- 1 teaspoon dried oregano
- 1 teaspoon dried thyme
- 4 cups chicken broth
- Salt and pepper, to taste

1. Chicken and Potato Hash:
Ingredients:
- 2 tablespoons olive oil
- 2 chicken breasts, cut into cubes
- 2 potatoes, cut into cubes
- 2 carrots, cut into cubes
- 1 onion, diced
- 1 teaspoon dried oregano

Shopping List:
- Olive oil
- Onion
- Thyme
- Oregano
- Salt
- Pepper

این پنج دستور غذا شماست، بدون ذکر سیر و همچنین یک لیست خرید با توجه به آنچه که در خانه دارید.

تمرین - ساخت یک تولید‌کننده دستور غذا

حالا که یک سناریو را اجرا کرده‌ایم، بیایید کدی بنویسیم تا با سناریوی نشان داده شده مطابقت داشته باشد. برای انجام این کار، مراحل زیر را دنبال کنید:

  1. Use the existing app.py file as a starting point

  2. Locate the prompt variable and change its code to the following:

    prompt = "Show me 5 recipes for a dish with the following ingredients: chicken, potatoes, and carrots. Per recipe, list all the ingredients used"
    

    اگر اکنون کد را اجرا کنید، باید خروجی مشابه زیر را ببینید:

    -Chicken Stew with Potatoes and Carrots: 3 tablespoons oil, 1 onion, chopped, 2 cloves garlic, minced, 1 carrot, peeled and chopped, 1 potato, peeled and chopped, 1 bay leaf, 1 thyme sprig, 1/2 teaspoon salt, 1/4 teaspoon black pepper, 1 1/2 cups chicken broth, 1/2 cup dry white wine, 2 tablespoons chopped fresh parsley, 2 tablespoons unsalted butter, 1 1/2 pounds boneless, skinless chicken thighs, cut into 1-inch pieces
    -Oven-Roasted Chicken with Potatoes and Carrots: 3 tablespoons extra-virgin olive oil, 1 tablespoon Dijon mustard, 1 tablespoon chopped fresh rosemary, 1 tablespoon chopped fresh thyme, 4 cloves garlic, minced, 1 1/2 pounds small red potatoes, quartered, 1 1/2 pounds carrots, quartered lengthwise, 1/2 teaspoon salt, 1/4 teaspoon black pepper, 1 (4-pound) whole chicken
    -Chicken, Potato, and Carrot Casserole: cooking spray, 1 large onion, chopped, 2 cloves garlic, minced, 1 carrot, peeled and shredded, 1 potato, peeled and shredded, 1/2 teaspoon dried thyme leaves, 1/4 teaspoon salt, 1/4 teaspoon black pepper, 2 cups fat-free, low-sodium chicken broth, 1 cup frozen peas, 1/4 cup all-purpose flour, 1 cup 2% reduced-fat milk, 1/4 cup grated Parmesan cheese
    
    -One Pot Chicken and Potato Dinner: 2 tablespoons olive oil, 1 pound boneless, skinless chicken thighs, cut into 1-inch pieces, 1 large onion, chopped, 3 cloves garlic, minced, 1 carrot, peeled and chopped, 1 potato, peeled and chopped, 1 bay leaf, 1 thyme sprig, 1/2 teaspoon salt, 1/4 teaspoon black pepper, 2 cups chicken broth, 1/2 cup dry white wine
    
    -Chicken, Potato, and Carrot Curry: 1 tablespoon vegetable oil, 1 large onion, chopped, 2 cloves garlic, minced, 1 carrot, peeled and chopped, 1 potato, peeled and chopped, 1 teaspoon ground coriander, 1 teaspoon ground cumin, 1/2 teaspoon ground turmeric, 1/2 teaspoon ground ginger, 1/4 teaspoon cayenne pepper, 2 cups chicken broth, 1/2 cup dry white wine, 1 (15-ounce) can chickpeas, drained and rinsed, 1/2 cup raisins, 1/2 cup chopped fresh cilantro
    

    توجه، مدل زبان بزرگ شما غیرقطعی است، بنابراین ممکن است هر بار که برنامه را اجرا کنید، نتایج متفاوتی را دریافت کنید.

    عالی، بیایید ببینیم چگونه می‌توانیم اوضاع را بهبود ببخشیم. برای بهبود اوضاع، می‌خواهیم مطمئن شویم که کد انعطاف‌پذیر است، بنابراین می‌توان مواد و تعداد دستورها را بهبود داد و تغییر داد.

  3. کد را مطابق زیر تغییر می‌دهیم:

    no_recipes = input("No of recipes (for example, 5: ")
    
    ingredients = input("List of ingredients (for example, chicken, potatoes, and carrots: ")
    
    # interpolate the number of recipes into the prompt an ingredients
    prompt = f"Show me {no_recipes} recipes for a dish with the following ingredients: {ingredients}. Per recipe, list all the ingredients used"
    

    آزمایش کد به شکل زیر می‌تواند به نظر برسد:

    No of recipes (for example, 5: 3
    List of ingredients (for example, chicken, potatoes, and carrots: milk,strawberries
    
    -Strawberry milk shake: milk, strawberries, sugar, vanilla extract, ice cubes
    -Strawberry shortcake: milk, flour, baking powder, sugar, salt, unsalted butter, strawberries, whipped cream
    -Strawberry milk: milk, strawberries, sugar, vanilla extract
    

بهبود با اضافه کردن فیلتر و لیست خرید

ما اکنون یک اپلیکیشن عملی داریم که قادر به تولید دستور پخت است و به خاطر اینکه به ورودی‌های کاربر وابسته است، انعطاف‌پذیری بالایی دارد، هم از نظر تعداد دستور پخت‌ها و هم مواد اولیه‌ای که استفاده می‌شود.

برای بهبود بیشتر، می‌خواهیم موارد زیر را اضافه کنیم:

  • فیلتر کردن مواد اولیه. ما می‌خواهیم قادر به فیلتر کردن مواد اولیه‌ای که دوست نداریم یا به آنها آلرژی داریم، باشیم. برای انجام این تغییر، می‌توانیم پرسش موجود را ویرایش کرده و یک شرط فیلتر به انتهای آن اضافه کنیم:

    filter = input("Filter (for example, vegetarian, vegan, or gluten-free: ")
    
    prompt = f"Show me {no_recipes} recipes for a dish with the following ingredients: {ingredients}. Per recipe, list all the ingredients used, no {filter}"
    

    بالا، ما {filter} را به انتهای پرسش اضافه می‌کنیم و همچنین مقدار فیلتر را از کاربر دریافت می‌کنیم. یک ورودی نمونه از اجرای برنامه اکنون می‌تواند به صورت زیر باشد:

    No of recipes (for example, 5: 3
    List of ingredients (for example, chicken, potatoes, and carrots: onion,milk
    Filter (for example, vegetarian, vegan, or gluten-free: no milk
    
    1. French Onion Soup
    
    Ingredients:
    
    -1 large onion, sliced
    -3 cups beef broth
    -1 cup milk
    -6 slices french bread
    -1/4 cup shredded Parmesan cheese
    -1 tablespoon butter
    -1 teaspoon dried thyme
    -1/4 teaspoon salt
    -1/4 teaspoon black pepper
    
    Instructions:
    
    1. In a large pot, sauté onions in butter until golden brown.
    2. Add beef broth, milk, thyme, salt, and pepper. Bring to a boil.
    3. Reduce heat and simmer for 10 minutes.
    4. Place french bread slices on soup bowls.
    5. Ladle soup over bread.
    6. Sprinkle with Parmesan cheese.
    
    2. Onion and Potato Soup
    
    Ingredients:
    
    -1 large onion, chopped
    -2 cups potatoes, diced
    -3 cups vegetable broth
    -1 cup milk
    -1/4 teaspoon black pepper
    
    Instructions:
    
    1. In a large pot, sauté onions in butter until golden brown.
    2. Add potatoes, vegetable broth, milk, and pepper. Bring to a boil.
    3. Reduce heat and simmer for 10 minutes.
    4. Serve hot.
    
    3. Creamy Onion Soup
    
    Ingredients:
    
    -1 large onion, chopped
    -3 cups vegetable broth
    -1 cup milk
    -1/4 teaspoon black pepper
    -1/4 cup all-purpose flour
    -1/2 cup shredded Parmesan cheese
    
    Instructions:
    
    1. In a large pot, sauté onions in butter until golden brown.
    2. Add vegetable broth, milk, and pepper. Bring to a boil.
    3. Reduce heat and simmer for 10 minutes.
    4. In a small bowl, whisk together flour and Parmesan cheese until smooth.
    5. Add to soup and simmer for an additional 5 minutes, or until soup has thickened.
    

    همان‌طور که می‌بینید، هر دستور پختی که حاوی شیر باشد، فیلتر شده است. اما، اگر به لاکتوز حساس باشید، ممکن است بخواهید دستورهای دیگری که حاوی پنیر هستند را نیز فیلتر کنید، بنابراین در هنگام فیلتر کردن نیاز به وضوح وجود دارد.

  • تهیه یک لیست خرید. ما می‌خواهیم یک لیست خرید تهیه کنیم، با توجه به آنچه در خانه داریم.

برای این قابلیت، می‌توانیم یا سعی کنیم همه چیز را در یک پرسش حل کنیم یا آن را به دو پرسش تقسیم کنیم. بیایید رویکرد دومی را امتحان کنیم. در اینجا ما پیشنهاد می‌دهیم که یک پرسش اضافی اضافه کنیم، اما برای اینکه این کار کند، باید نتیجه پرسش اول را به عنوان ورودی به پرسش دوم اضافه کنیم.

قسمت کد را که نتیجه پرسش اول را چاپ می‌کند پیدا کنید و کد زیر را در زیر آن اضافه کنید:

old_prompt_result = completion.choices[0].message.content
prompt = "Produce a shopping list for the generated recipes and please don't include ingredients that I already have."

new_prompt = f"{old_prompt_result} {prompt}"
messages = [{"role": "user", "content": new_prompt}]
completion = openai.Completion.create(engine=deployment_name, messages=messages, max_tokens=1200)

# print response
print("Shopping list:")
print(completion.choices[0].message.content)

توجه به موارد زیر:

  1. ما در حال ساخت یک پرسش جدید هستیم که نتیجه‌ی پرسش اول را به پرسش جدید اضافه می‌کند:

    new_prompt = f"{old_prompt_result} {prompt}"
    
  2. ما یک درخواست جدید می‌سازیم، اما همچنین تعداد توکن‌هایی که در درخواست اول خواسته بودیم را در نظر می‌گیریم، بنابراین این بار می‌گوییم max_tokens برابر با 1200 است.

    completion = openai.Completion.create(engine=deployment_name, prompt=new_prompt, max_tokens=1200)
    
کد مربوطه را امتحان کرده و در نهایت به خروجی زیر رسیده‌ایم:
 ```output
 No of recipes (for example, 5: 2
 List of ingredients (for example, chicken, potatoes, and carrots: apple,flour
 Filter (for example, vegetarian, vegan, or gluten-free: sugar


 -Apple and flour pancakes: 1 cup flour, 1/2 tsp baking powder, 1/2 tsp baking soda, 1/4 tsp salt, 1 tbsp sugar, 1 egg, 1 cup buttermilk or sour milk, 1/4 cup melted butter, 1 Granny Smith apple, peeled and grated
 -Apple fritters: 1-1/2 cups flour, 1 tsp baking powder, 1/4 tsp salt, 1/4 tsp baking soda, 1/4 tsp nutmeg, 1/4 tsp cinnamon, 1/4 tsp allspice, 1/4 cup sugar, 1/4 cup vegetable shortening, 1/4 cup milk, 1 egg, 2 cups shredded, peeled apples
 Shopping list:
 -Flour, baking powder, baking soda, salt, sugar, egg, buttermilk, butter, apple, nutmeg, cinnamon, allspice
 ```

بهبود کیفیت کد

آنچه تا اینجا داریم کدی است که کار می‌کند، اما برخی تغییرات وجود دارد که باید انجام دهیم تا اوضاع بهتر شود. برخی از کارهایی که باید انجام دهیم عبارتند از:

  • جدا کردن مقادیر سری از کد، مانند کلید API. مقادیر سری نباید در کد قرار داشته باشند و باید در مکان امن ذخیره شوند. برای جداسازی مقادیر سری از کد، می‌توانیم از متغیرهای محیطی و کتابخانه‌هایی مانند python-dotenv استفاده کنیم تا آنها را از یک فایل بارگذاری کنیم. این نحوه‌ای است که این کار به کد مربوط می‌شود:

    1. Create a .env file with the following content:

      OPENAI_API_KEY=sk-...
      

    در کد، می‌توانید متغیرهای محیطی را به این صورت بارگذاری کنید:

    from dotenv import load_dotenv
    
    load_dotenv()
    
    openai.api_key = os.environ["OPENAI_API_KEY"]
    
  • یک کلمه درباره طول توکن. ما باید در نظر داشته باشیم که چه تعداد توکن نیاز داریم تا متنی که می‌خواهیم را تولید کنیم. توکن‌ها هزینه دارند، بنابراین هر جا که ممکن است، باید تلاش کنیم تا تعداد توکن‌هایی که استفاده می‌کنیم، صرفه‌جویی کنیم. به عنوان مثال، آیا می‌توانیم پرسش را به گونه‌ای بیان کنیم که بتوانیم از توکن‌های کمتری استفاده کنیم؟

برای تغییر توکن‌های استفاده شده، می‌توانید از پارامتر max_tokens استفاده کنید. به عنوان مثال، اگر می‌خواهید از 100 توکن استفاده کنید، می‌توانید این کار را انجام دهید:

completion = client.chat.completions.create(model=deployment, messages=messages, max_tokens=100)
  • آزمایش با دما. دما چیزی است که تاکنون به آن اشاره نکرده‌ایم اما یک زمینه مهم برای نحوه عملکرد برنامه ماست. هر چه مقدار دما بالاتر باشد، خروجی تصادفی‌تر خواهد بود. برعکس، هر چه مقدار دما پایین‌تر باشد، خروجی قابل پیش‌بینی‌تر خواهد بود. در نظر داشته باشید آیا می‌خواهید در خروجی خود تنوع داشته باشید یا نه.

    برای تغییر دما، می‌توانید از پارامتر temperature استفاده کنید. به عنوان مثال، اگر می‌خواهید از دمای 0.5 استفاده کنید، می‌توانید:

    completion = client.chat.completions.create(model=deployment, messages=messages, temperature=0.5)
    

    به یاد داشته باشید، هر چه به ۱.۰ نزدیک‌تر باشد، خروجی متنوع‌تری خواهید داشت.