هوش مصنوعی

چگونه با LLM یک دستیار هوش مصنوعی برای توسعه پایتون بسازیم؟

با آموزش و دستوردهی مناسب، مدل‌های زبانی بزرگ (LLMها) می‌توانند به دستیارهای کدنویسی بسیار مؤثری تبدیل شوند. این راهنمای گام‌به‌گام، نحوه‌ی ایجاد یک فراخوانی به API خارجی را با استفاده از پایتون و API اوپن‌اِی‌آی (OpenAI API) نشان می‌دهد.

در سال‌های اخیر، هوش مصنوعی به شکلی گسترده بر فضای فناوری سلطه یافته و تأثیری دگرگون‌کننده بر تقریباً تمام صنایع ، از هنرهای خلاق گرفته تا امور مالی و مدیریت ، گذاشته است.مدل‌های زبانی بزرگ (LLM) مانند GPT از OpenAI و Gemini از Google با سرعتی خیره‌کننده در حال پیشرفت هستند و اکنون به بخشی ضروری از جعبه‌ابزار مهندسان نرم‌افزار تبدیل شده‌اند.

اگرچه نسل فعلی LLMها نمی‌تواند جایگزین برنامه‌نویسان انسانی شود، اما این مدل‌ها قادرند نقش دستیار دیجیتال هوشمند را ایفا کنند و در انجام وظایف ساده‌تر یا تکراریِ کدنویسی و رفع باگ‌ها کمک بزرگی باشند.در این مقاله، من با تکیه بر تجربه‌ی خود در توسعه‌ی راه‌حل‌های هوش مصنوعی و یادگیری ماشین (AI/ML)، به تشریح جزئیات استفاده از LLMها برای تولید کدی می‌پردازم که توانایی تعامل با منابع خارجی (مانند APIها) را دارد.

یک مدل زبانی بزرگ (Large Language Model) نوعی مدل یادگیری ماشین است که بر پایه‌ی حجم عظیمی از داده‌های متنی آموزش دیده تا بتواند زبان انسان را درک و تولید کند.LLM معمولاً بر اساس معماری ترنسفورمر (Transformer) ساخته می‌شود ، نوعی شبکه عصبی که از مکانیزم «توجه به خود» (Self-Attention) بهره می‌برد.
این مکانیزم باعث می‌شود مدل، ورودی را نه واژه‌به‌واژه بلکه به‌صورت کامل و هم‌زمان پردازش کند؛ بنابراین می‌تواند کل جمله را تحلیل کند و معنای پنهان و قصد نهفته در متن (latent semantics) را بفهمد. به طور خلاصه، LLMها قادرند زمینه و مفهوم را درک کنند و همین باعث می‌شود در تولید متنی با سبک طبیعی و انسانی بسیار مؤثر باشند.

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

به‌عنوان نمونه، برای آموزش GPT-3 از حدود ۴۵ ترابایت داده متنی فشرده از کتاب‌ها و محتوای اینترنت استفاده شده است. این مدل تقریباً ۱۷۵ میلیارد پارامتر دارد تا بتواند به پایگاه دانشی کنونی خود دست یابد. در کنار GPT-3 و GPT-4، مدل‌های دیگری مانند PaLM 2 از گوگل و LLaMA 2 از متا (فیسبوک) نیز پیشرفت‌های چشمگیری داشته‌اند.

از آنجا که داده‌های آموزشی این مدل‌ها شامل زبان‌های برنامه‌نویسی نیز بوده است، LLMها اکنون قادرند کد تولید کنند.
مدل‌های مدرن می‌توانند دستورات متنی طبیعی را به کد قابل اجرا در زبان‌ها و پشته‌های فناوری مختلف تبدیل کنند، البته استفاده‌ی مؤثر از این قابلیت نیازمند تسلط فنی مناسب است.

اگرچه کارهای پیچیده و حل مسائل دشوار همچنان به هوش و خلاقیت انسان نیاز دارند، اما LLMها می‌توانند به عنوان دستیارهای هوشمند برنامه‌نویسی در انجام وظایف ساده‌تر نقش مؤثری داشته باشند. واگذاری کارهای تکراری به مدل زبانی می‌تواند بهره‌وری توسعه‌دهندگان را افزایش داده و زمان توسعه در مراحل اولیه مانند نمونه‌سازی و اعتبارسنجی ایده را کاهش دهد.

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

  • LLMها فاقد مهارت‌های استدلالی و خلاقیت انسانی هستند.
  • در مسائل پیچیده‌ی تجاری یا منطق‌های خاص پروژه ممکن است عملکرد ضعیفی داشته باشند.
  • همچنین، مدل‌های عمومی معمولاً برای کار با فریم‌ورک‌های اختصاصی یا دامنه‌های تخصصی آموزش ندیده‌اند.

در مجموع، LLMها می‌توانند به‌عنوان دستیار مؤثر مورد استفاده قرار گیرند، اما نقش انسان در فرآیند توسعه همچنان حیاتی است.

یکی از مؤلفه‌های حیاتی در اغلب اپلیکیشن‌های مدرن، ارتباط با منابع خارجی است. برنامه‌نویسان معمولاً باید به APIها (Application Programming Interface) متصل شوند، مجموعه‌ای از دستورالعمل‌ها و پروتکل‌ها که روشی استاندارد برای تعامل بین نرم‌افزارها فراهم می‌کنند.

نوشتن کد برای مصرف API معمولاً نیازمند بررسی دقیق مستندات آن است؛ شامل قوانین نام‌گذاری، عملیات‌های پشتیبانی‌شده، فرمت داده‌های ورودی و خروجی، و الزامات امنیتی. در صورتی که تمام اطلاعات مورد نیاز در اختیار مدل قرار گیرد، LLM می‌تواند فرآیند نوشتن کد را بسیار سریع‌تر کند و کد لازم برای انجام درخواست API را تولید نماید.

در این مثال، گام‌به‌گام نشان می‌دهیم چگونه از ChatGPT برای تولید کد پایتون جهت فراخوانی API سرویس OpenWeather استفاده کنیم و سپس همین درخواست را از طریق API رسمی OpenAI ارسال کرده و تأثیر تغییر پارامترها را بر خروجی مشاهده کنیم.

نکته: سرویس OpenWeather API روزانه تا ۱۰۰۰ درخواست رایگان در اختیار کاربران قرار می‌دهد.

در مثال ما، نیاز داریم دمای فعلی و توضیح وضعیت هوا را نمایش دهیم. پرامپت زیر را به ChatGPT ارسال می‌کنیم:

«یک اسکریپت پایتون بنویس که از کتابخانه requests برای ارسال درخواست GET به API سرویس OpenWeather در مسیر http://api.openweathermap.org/data/2.5/weather استفاده کند. کلید API باید در پارامترهای Query با نام appid قرار گیرد. داده بازگشتی باید در قالب JSON باشد و تابع، دمای فعلی را برحسب فارنهایت برگرداند.»

ChatGPT در پاسخ، کد زیر را تولید می‌کند:

import requests

# کلید API خود را در این قسمت جایگزین کنید.
api_key = "YOUR_API_KEY"
api_url = "http://api.openweathermap.org/data/2.5/weather"

# شهر مورد نظر برای دریافت وضعیت آب‌وهوا
city_name = "London"

# پارامترهای درخواست API
params = {
    'q': city_name,
    'appid': api_key,
    'units': 'imperial'  # برای سلسیوس از metric و برای فارنهایت از imperial استفاده کنید.
}

try:
    # ارسال درخواست GET
    response = requests.get(api_url, params=params)

    # بررسی موفقیت‌آمیز بودن پاسخ (کد وضعیت 200)
    if response.status_code == 200:
        weather_data = response.json()
        print("Weather Data for", city_name)
        print("Temperature:", weather_data['main']['temp'], "°F")
        print("Description:", weather_data['weather'][0]["description"])
    else:
        print("Error:", response.status_code, response.text)

except Exception as e:
    print("An error occurred:", e)

در پرامپت اصلی محل مشخصی برای شهر تعیین نکرده بودیم، اما مدل متغیری با نام city_name ساخته و مقدار پیش‌فرض آن را London قرار داده است. همچنین باید کلید API شخصی خود را در قسمت "YOUR_API_KEY" جایگزین کنید. برای تست این کد، کافی است Python Interpreter را نصب کرده و کد را در محیطی مانند Visual Studio Code یا Command Line اجرا کنید.

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

Weather Data for London
Temperature: 53.08°F
Description: overcast clouds

در بسیاری از سیستم‌ها، داده‌های دریافتی از API باید در سیستم دیگری ذخیره شوند ، مثلاً در پایگاه داده یا حتی در API دیگر. در چنین شرایطی، داده‌ها باید به قالب‌های خاصی مانند XML، CSV یا SQL تبدیل شوند.

برای این منظور، جمله زیر را به انتهای پرامپت اضافه کردیم:

«خروجی باید در قالب دستور SQL برگردد که داده‌های بازگشتی را در جدول current_weather درج کند،
به‌طوری که ستون‌ها شامل city، temperature، weather_description و update_date باشند.»

ChatGPT با اضافه کردن چند import جدید و تغییر فرمت خروجی، کد زیر را بازمی‌گرداند:

import requests
import json
from datetime import datetime

try:
    response = requests.get(api_url, params=params)

    if response.status_code == 200:
        weather_data = response.json()

        city = city_name
        temperature = weather_data['main']['temp']
        weather_description = weather_data['weather'][0]['description']
        update_date = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')

        sql_command = f"INSERT INTO current_weather (city, temperature, weather_description, update_date) VALUES ('{city}', {temperature}, '{weather_description}', '{update_date}')"
        print(sql_command)
    else:
        print("Error:", response.status_code, response.text)

except Exception as e:
    print("An error occurred:", e)

اجرای این کد دستور SQL زیر را چاپ می‌کند:

INSERT INTO current_weather (city, temperature, weather_description, update_date)
VALUES ('London', 53.37, 'broken clouds', '2024-02-06 04:43:35')

اما هشدار زیر نیز نمایش داده می‌شود:

DeprecationWarning: datetime.datetime.utcnow() is deprecated
Use timezone-aware objects instead.

برای جلوگیری از استفاده از توابع منسوخ، جمله زیر را به پرامپت اضافه کردیم:

«لطفاً از هیچ تابعی که منسوخ شده (deprecated) است استفاده نکن.»

ChatGPT سپس کد را اصلاح کرده و بخش زیر را جایگزین می‌کند:

update_date = datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M:%S')

اکنون کد بدون هشدار اجرا شده و خروجی SQL صحیح را تولید می‌کند. دستور SQL را می‌توان در IDEهایی مانند VS Code یا ابزارهای مدیریت دیتابیس تست کرد. در یک اپلیکیشن وب واقعی، این دستور معمولاً بلافاصله پس از فراخوانی API اجرا می‌شود تا جدول مربوطه در پایگاه داده به‌صورت بلادرنگ به‌روزرسانی شود. به‌طور کلی، تا زمانی که پرامپت به‌درستی تنظیم شود، LLM می‌تواند خروجی خود را در قالب‌های متنوعی مانند SQL، JSON یا حتی فراخوانی API دیگر بازگرداند.

بسیاری از مدل‌های زبانی بزرگ (LLMها) دارای نسخه API نیز هستند، که به توسعه‌دهندگان اجازه می‌دهد به‌صورت برنامه‌نویسی‌شده با مدل تعامل کنند و آن را به‌طور یکپارچه درون اپلیکیشن‌های خود ادغام کنند. این قابلیت به شما اجازه می‌دهد تا دستیار هوش مصنوعی اختصاصی خود را بسازید، با امکاناتی مانند تکمیل خودکار کد (code autocompletion)، بازنویسی و بهینه‌سازی کد (refactoring & optimization) و پاسخ‌گویی هوشمند در محیط برنامه‌نویسی.

همچنین می‌توانید رابط کاربری را برای حوزه‌های خاص (domain-specific UI) شخصی‌سازی کنید تا با پرامپت‌های از پیش‌تعریف‌شده (predefined prompts) کار کند. ادغام LLMها از طریق API این امکان را می‌دهد که وظایف به‌صورت زمان‌بندی‌شده یا خودکار اجرا شوند، ویژگی‌ای که پایه‌گذار دستیار مجازی خودکار و هوشمند است.

در این مثال، همان وظیفه‌ی قبلی (دریافت وضعیت آب‌وهوا از OpenWeather API) را انجام می‌دهیم، اما این بار به جای ChatGPT، مستقیماً از OpenAI API استفاده می‌کنیم.

ابتدا باید کتابخانه‌ی openai را نصب کنیم:

pip install openai

برای استفاده از OpenAI API به یک کلید API اختصاصی نیاز دارید. این سرویس هزینه دارد، اما حساب‌های جدید معمولاً برای مدت محدودی دسترسی رایگان دارند. پس از نصب، کتابخانه را در کد خود ایمپورت کرده و درخواست را ارسال می‌کنیم. در کد زیر از همان پرامپت قبلی استفاده شده است (اما بخش مربوط به خروجی SQL حذف شده است).
مدلی که استفاده می‌کنیم gpt-3.5-turbo است:

import openai

openai.api_key = "YOUR_API_KEY"  # کلید API خود را جایگزین کنید.

response = openai.chat.completions.create(
  model='gpt-3.5-turbo',
  max_tokens=1024,
  temperature=0.3,
  top_p=0.9,
  messages=[
        {'role': 'system', 'content': 'You are an intelligent AI assistant.'},
        {'role': 'user', 'content': "Write a Python script that uses the Python 'requests' library to perform a GET request to the OpenWeather API at the endpoint 'http://api.openweathermap.org/data/2.5/weather'. The API call should include an API key in the query string parameters under the key 'appid.' The data returned by the API is in JSON format. Please do not use any functions that are deprecated."},
    ],
)

response_message = response.choices[0].message.content
print(response_message)

این کد یک پیام متنی شامل کد پایتون تولید‌شده توسط مدل GPT برمی‌گرداند. مدل LLM در پاسخ، کد زیر را تولید می‌کند که دمای لندن را از OpenWeather دریافت می‌کند:

import requests

# مسیر API و کلید API
url = "http://api.openweathermap.org/data/2.5/weather"
api_key = "YOUR_API_KEY"

# پارامترهای Query
params = {
    'q': 'London,uk',  # مثال برای شهر و کد کشور
    'appid': api_key
}

# ارسال درخواست GET
response = requests.get(url, params=params)

# بررسی موفقیت‌آمیز بودن پاسخ
if response.status_code == 200:
    data = response.json()

    # چاپ دما به سانتی‌گراد
    temperature = data['main']['temp'] - 273.15
    print(f"The temperature in London is {temperature:.2f}°C.")
else:
    print(f"Error: {response.status_code}")

در این نسخه، مدل بدون اشاره‌ی مستقیم به واحد دما، خودش داده‌ها را از کلوین به سانتی‌گراد تبدیل کرده است ،
به جای اینکه مانند قبل از پارامتر units در API استفاده کند. این نشان می‌دهد که مدل می‌تواند بر اساس درک خود از متن، تصمیم‌های منطقی (هرچند گاهی متفاوت) بگیرد.

هنگام کار با API، می‌توانید پارامترهای مدل را تنظیم کنید تا ویژگی‌های خروجی مانند خلاقیت، دقت یا طول پاسخ تغییر کند. برخی از این پارامترها میزان تصادفی بودن و خلاقیت پاسخ را کنترل می‌کنند، در حالی که برخی دیگر تکرار یا انسجام متن را تنظیم می‌کنند. اگرچه در تولید متن این پارامترها تأثیر بیشتری دارند، اما در تولید کد نیز می‌توانند نتایج متفاوتی ایجاد کنند.

در کد بالا، پارامترها در این بخش تنظیم شده‌اند:

max_tokens=1024, temperature=0.3, top_p=0.9

در ادامه‌ی مقاله، هر پارامتر و تأثیر آن بر تولید کد بررسی می‌شود.

پارامترهای مختلفی وجود دارند که می‌توان هنگام ارسال درخواست به API مدل‌های زبانی آن‌ها را تغییر داد. این پارامترها رفتار مدل را کنترل می‌کنند و مستقیماً بر روی نوع، دقت، خلاقیت و ساختار خروجی کد یا متن تأثیر می‌گذارند.

در مثال قبلی، پارامترهای زیر استفاده شده بودند:

max_tokens=1024, temperature=0.3, top_p=0.9

در ادامه، هر یک از این پارامترها و نحوه‌ی تأثیر آن‌ها بر تولید کد را بررسی می‌کنیم:

🔹 temperature — کنترل میزان خلاقیت و تصادفی بودن

پارامتر temperature میزان تصادفی بودن پاسخ مدل را تنظیم می‌کند. مقدار بالاتر، پاسخ‌های خلاق‌تر و غیرقابل پیش‌بینی‌تر تولید می‌کند، در حالی که مقدار پایین‌تر باعث تولید پاسخ‌های دقیق‌تر و قابل‌اعتمادتر می‌شود. این عدد معمولاً بین 0 تا 2 تنظیم می‌شود (مقدار پیش‌فرض بین 0.7 تا 1.0 است).

در تولید کد:

  • مقدار پایین (مثلاً 0.2 یا 0.3) منجر به کدی استاندارد و ایمن‌تر می‌شود.
  • مقدار بالا (مثلاً 1.5 یا 2) ممکن است کدهای غیرمتعارف یا خلاقانه تولید کند، اما احتمال خطا نیز افزایش می‌یابد.

🔹 max_tokens — تعیین حداکثر طول خروجی

این پارامتر تعداد توکن‌های (واژه‌ها یا بخش‌های زبانی) خروجی را محدود می‌کند. اگر مقدار آن بسیار پایین باشد، پاسخ ناقص خواهد بود؛ اگر بیش از حد بالا تنظیم شود، باعث هدر رفتن توکن و افزایش هزینه می‌گردد.

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

🔹 top_p — نمونه‌گیری هسته‌ای (Nucleus Sampling)

این پارامتر تعیین می‌کند که مدل تا چه حد از احتمال‌های برتر در انتخاب واژه بعدی استفاده کند. مقدار آن بین 0 تا 1 است.

  • مقدار top_p = 0.1 یعنی مدل تنها از ۱۰٪ محتمل‌ترین کلمات ممکن استفاده کند.
  • مقدار top_p = 0.5 یعنی تا ۵۰٪ محتمل‌ترین گزینه‌ها را در نظر بگیرد.

در تولید کد:

  • مقدار پایین‌تر باعث تولید کدهای منسجم‌تر و قابل پیش‌بینی‌تر می‌شود. مقدار بالاتر ممکن است تنوع بیشتری در ساختار کد ایجاد کند، اما خطر تولید کدهای غیرمرتبط یا نادرست را بالا می‌برد.

🔹 frequency_penalty — کاهش تکرار واژه‌ها یا الگوها

این پارامتر از تکرار بیش از حد کلمات یا عبارات در پاسخ مدل جلوگیری می‌کند. مقدار آن بین 0 تا 2 تنظیم می‌شود.

در تولید کد:

  • مقدار بالا (مثلاً 1.5) باعث می‌شود مدل از تکرار کدهای مشابه اجتناب کند و گاهی رویکردهای متفاوت‌تری ارائه دهد.
  • مقدار پایین (مثلاً 0 یا 0.3) ممکن است خروجی تکراری یا کدهای مشابه را تولید کند، اما اغلب پایدارتر و ایمن‌تر است.

🔹 presence_penalty — تشویق به تولید ساختارهای جدید

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

مقدار آن نیز بین 0 تا 2 تنظیم می‌شود.

در تولید کد:

  • مقدار بالا باعث تولید کدهای غیرتکراری و خلاقانه‌تر می‌شود (اما ممکن است ناکارآمد باشند).
  • مقدار پایین باعث تولید کدهای پایدارتر و ساده‌تر می‌شود.

🔹 stop — تعیین نقطه پایان تولید

پارامتر stop به مدل می‌گوید که در چه نقطه‌ای باید تولید پاسخ را متوقف کند. مثلاً مقدار stop="\n" باعث می‌شود مدل پس از اولین خط خالی متوقف شود.

در تولید کد:
می‌توان از stop برای جلوگیری از تولید خطوط اضافی یا توضیحات غیرضروری استفاده کرد — مثلاً در پایان یک تابع یا حلقه.

آزمایش عملی: تأثیر تغییر پارامترها در خروجی کد

برای مشاهده‌ی اثر واقعی این تنظیمات، پارامترهای frequency_penalty و presence_penalty را تغییر دادیم.

در این حالت، مدل بخشی از کد را بازنویسی کرد و مدیریت خطا (exception handling) را به صورت خودکار اضافه نمود:

try:
    response = requests.get(url, params=params)

    if response.status_code == 200:
        weather_data = response.json()
        print("City:", weather_data['name'])
        print("Temperature:", weather_data['main']['temp'], "K")

except requests.exceptions.RequestException as e:
   print("Error:", e)

افزودن مدیریت خطا مفید است، اما چون ما در پرامپت چنین درخواستی نکرده بودیم، این تغییر به نوعی حدس خلاقانه مدل بوده است. اجرای دوباره همان پرامپت احتمالاً خروجی متفاوتی تولید می‌کند.

در این حالت، مدل تصمیم گرفت کد را در قالب یک تابع (function) بازنویسی کند و کلید API را به‌عنوان آرگومان دریافت کند:

import requests

def get_weather(api_key):
    url = "http://api.openweathermap.org/data/2.5/weather"
    params = {
        'q': 'London,uk',
        'appid': api_key
    }

    if response.status_code == 200:
        data = response.json()
        return data
    else:
        print("Error:", response.status_code)

api_key = "YOUR_API_KEY"
weather_data = get_weather(api_key)
print(weather_data)

این نسخه از نظر ساختار تمیزتر است، اما دریافت api_key به عنوان آرگومان منطقی نیست ، معمولاً پارامتر ورودی باید شهر (city) باشد. چنین مواردی را می‌توان با اصلاح پرامپت تصحیح کرد.

به طور کلی، تغییر پارامترها نیازمند آزمون و خطا است. تأثیر آن‌ها همیشه قابل پیش‌بینی نیست و ممکن است بعضی تنظیمات ظاهراً بی‌اثر باشند.

  • پارامترهای پایین‌تر معمولاً خروجی قابل‌اعتمادتر و ساختاریافته‌تری می‌دهند.
  • مقادیر بالاتر باعث تولید ایده‌های خلاقانه‌تر اما بالقوه پرخطا می‌شوند.

زمانی که کد تولید‌شده توسط مدل زبانی (LLM) عملکرد درستی دارد و بهینه‌سازی شده است، گام بعدی ادغام آن در کد موجود پروژه است. اگر کد را مستقیماً در فایل‌های موجود کپی و پیست کنید، ممکن است باعث به‌هم‌ریختگی ساختار و دشواری در نگهداری شود.

روش بهتر این است که کد را به‌صورت توابع یا کلاس‌های قابل استفاده مجدد (Reusable Components) درآورید. مدل LLM می‌تواند در این زمینه نیز کمک کند ، تنها کافی است دستور (prompt) را دقیق بنویسید. در پرامپت باید آرگومان‌ها، فرمت خروجی و ساختار کلاس مشخص شود.

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

«فراخوانی API باید در یک آبجکت با نام Weather قرار گیرد که شامل تابعی به نام get_weather است. این تابع باید آرگومانی به نام city بپذیرد.»

مدل پس از دریافت این پرامپت، کد زیر را تولید می‌کند:

import requests

class Weather:
    def __init__(self, api_key):
        self.api_key = api_key
        self.temperature = None

    def get_weather(self, city):
        url = 'http://api.openweathermap.org/data/2.5/weather'
        params = {
            'q': city,
            'appid': self.api_key,
            'units': 'imperial'  # دما بر حسب فارنهایت
        }

        response = requests.get(url, params=params)
        data = response.json()

        if response.status_code == 200:
            self.temperature = data['main']['temp']
            print(f"The temperature in {city} is {self.temperature}°F.")
        else:
            print(f"Error: {data['message']}")

# جایگزینی کلید واقعی API
api_key = "YOUR_API_KEY"

weather = Weather(api_key)
weather.get_weather('London')

این کد نمونه، یک کلاس شیء‌گرا و کاربردی ایجاد می‌کند که به‌راحتی می‌توان آن را در هر پروژه‌ی بزرگ‌تر ادغام کرد.
با این حال، بهتر است برای پایداری بیشتر، مدیریت خطا (Error Handling) نیز به آن افزوده شود تا در شرایط خاص مانند قطعی سرور یا خطای اتصال، برنامه دچار شکست نشود.

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

در بسیاری از مثال‌های قبلی، مدل کدی تولید کرده بود که تنها بررسی می‌کرد وضعیت پاسخ HTTP برابر با 200 باشد.
اما این روش همه‌ی حالات ممکن را در نظر نمی‌گیرد — مانند قطع اتصال، خطای DNS یا زمان‌بر بودن بیش از حد درخواست‌ها (timeout).

برای بهبود کد، جمله زیر را به پرامپت اضافه کردیم:

«برای مدیریت خطا از یک بلوک try-catch استفاده کن. در صورت عدم دریافت پاسخ موفق (کد وضعیت 200)، پیام خطا را نمایش بده.»

مدل در پاسخ، کد زیر را تولید کرد:

class Weather:
    def __init__(self, api_key):
        self.api_key = api_key
        self.temperature = None

    def get_weather(self, city):
        try:
            url = "http://api.openweathermap.org/data/2.5/weather"
            params = {
                'q': city,
                'appid': self.api_key,
                'units': 'imperial'
            }

            response = requests.get(url, params=params)

            if response.status_code == 200:
                data = response.json()
                self.temperature = data['main']['temp']
            else:
                print(f"Error: {response.status_code} - {response.json()['message']}")
        except requests.exceptions.RequestException as e:
            print(f"Error: {e}")

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

  • ثبت (Log) کردن خطاها در سیستم نظارتی،
  • ارسال هشدار برای مدیران در صورت خطاهای مهم،
  • یا فراخوانی یک API پشتیبان در صورت خرابی سرویس اصلی.

پس از نهایی شدن کد، گام بعدی انجام تست جامع (Comprehensive Testing) است تا از پایداری آن در شرایط واقعی اطمینان حاصل شود. تست باید شامل سناریوهای متنوعی باشد: از ورودی‌های معمولی گرفته تا شرایط بحرانی و موارد لبه‌ای (edge cases).

برای افزایش سرعت و دقت، می‌توان تست‌ها را به‌صورت خودکار (Automated Tests) اجرا کرد. همچنین ارزیابی شاخص‌هایی مانند:

  • زمان اجرا (execution time)
  • مصرف حافظه و منابع سیستم (resource usage)
    به شناسایی نقاط ضعف و گلوگاه‌های احتمالی کمک می‌کند.

با تحلیل مداوم نتایج تست و تنظیم پرامپت‌ها یا پارامترهای مدل، می‌توان کیفیت خروجی LLM را به‌مرور زمان بهبود داد.

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

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

با واگذاری کارهای ساده‌تر به مدل، مهندسان می‌توانند روی طراحی، حل مسئله، و نوآوری تمرکز کنند. دستیارهای مبتنی بر LLM به‌ویژه در مراحل ابتدایی توسعه، نمونه‌سازی، و رفع باگ ارزش بالایی دارند. با این حال، استفاده از آن‌ها باید مسئولانه و اخلاقی باشد. توسعه‌دهندگان باید همیشه مراقب موارد زیر باشند:

  • حفظ حریم خصوصی داده‌ها،
  • رعایت حق مالکیت معنوی،
  • جلوگیری از سو‌ءاستفاده از خروجی مدل،
  • و شناسایی و کاهش سوگیری‌های احتمالی در داده‌های آموزشی مدل.

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

برای ساخت دستیار هوش مصنوعی که به نیازهای کسب‌وکار شما دقیقاً پاسخ دهد، به متخصص نیاز دارید؟
در لَنسریفای، فرصت همکاری با متخصصان AI فراهم است.
📈 ایجاد پروژه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا