آموزش هوش مصنوعی

ساخت برنامه تولید متن با هوش مصنوعی؛ آموزش عملی با پایتون

متوسط مطالعه در ۱۲ دقیقه
mahdyar

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

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

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

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

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

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

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

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

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

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

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

دامنه‌ی کاربرد بسیار گسترده است. سه نمونه‌ی رایج این‌هاست:

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

هر سه نمونه یک هسته‌ی مشترک دارند: فرستادن پرامپت و گرفتن متن. تفاوتشان در پرامپت، داده‌ی ورودی و شیوه‌ی نمایش خروجی است.

اتصال به مدل زبانی؛ API یا کتابخانه؟

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

کتابخانه‌ها هم دو سطح دارند. برخی مثل openai فقط اتصال به مدل را ساده می‌کنند. برخی دیگر مثل LangChain و Semantic Kernel سطح بالاترند و امکاناتی مثل زنجیره‌سازی، حافظه و اتصال به ابزار دارند. در این آموزش از openai استفاده می‌کنیم.

کتابخانهسطحزبان‌هامناسب برای
openaiپایهPython، JavaScript و دیگر زبان‌هاشروع کار و کنترل کامل
LangChainسطح بالاPython و JavaScriptزنجیره‌ها، RAG و ایجنت
Semantic Kernelسطح بالاC#، Python و Javaپروژه‌های سازمانی مایکروسافتی

اولین برنامه تولید متن با پایتون

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

نصب کتابخانه در محیط مجازی

بهتر است هر پروژه‌ی پایتون محیط مجازی خودش را داشته باشد. این کار نسخه‌ی کتابخانه‌ها را از پروژه‌های دیگر جدا می‌کند. با دستورهای زیر محیط را بسازید و کتابخانه را نصب کنید:

bash
python -m venv venv
source venv/bin/activate      # در ویندوز: venv\Scripts\activate
pip install openai python-dotenv

کتابخانه‌ی python-dotenv را هم نصب کردیم تا بعداً کلید API را از یک فایل جداگانه بخوانیم. اگر Python ندارید، آن را از سایت رسمی Python نصب کنید.

گرفتن کلید API و آدرس سرویس

برای استفاده از مدل به یک کلید دسترسی نیاز دارید. اگر مستقیم از OpenAI استفاده می‌کنید، کلید را از پنل حساب کاربری می‌گیرید. در Azure OpenAI باید یک منبع (Resource) بسازید و کلید و آدرس سرویس را از بخش Keys and Endpoint بردارید.

در Azure هر منبع دو کلید دارد و یکی کافی است. کلید دوم برای زمانی است که بخواهید کلید اول را عوض کنید، بدون اینکه برنامه قطع شود. آدرس سرویس (Endpoint) را هم کپی کنید؛ کتابخانه به هر دو نیاز دارد.

تصویر زیر همین بخش را در پرتال Azure نشان می‌دهد. کلیدها و آدرس سرویس با کادر قرمز مشخص شده‌اند.

بخش Keys and Endpoint در پرتال Azure برای گرفتن کلید API برنامه تولید متن

نوشتن اولین درخواست

حالا فایل app.py را بسازید. در کد زیر کلاینت ساخته می‌شود، پرامپت با متد responses.create فرستاده می‌شود و متن پاسخ از output_text خوانده می‌شود:

python
import os
from openai import OpenAI

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

prompt = "این داستان را ادامه بده: روزی روزگاری در یک روستای کوچک"
response = client.responses.create(model="gpt-5-mini", input=prompt, store=False)

print(response.output_text)

اگر از Azure استفاده می‌کنید، هنگام ساخت کلاینت یک base_url هم بدهید که به آدرس سرویس شما و مسیر /openai/v1/ ختم می‌شود. به‌جای نام مدل هم نام استقرار (deployment) خودتان را بنویسید. با اجرای برنامه، چند جمله در ادامه‌ی داستان چاپ می‌شود.

پروژه‌ی عملی؛ برنامه‌ی پیشنهاد دستور پخت

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

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

در ساده‌ترین حالت، پرامپت را مستقیم در کد می‌نویسیم. مثلاً «پنج دستور پخت با مرغ، سیب‌زمینی و هویج پیشنهاد بده و برای هر کدام همه‌ی مواد لازم را فهرست کن». مدل پنج غذا با فهرست کامل مواد برمی‌گرداند.

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

گرفتن ورودی از کاربر

قدم بعدی این است که تعداد دستور پخت و فهرست مواد را از کاربر بگیریم و در پرامپت قرار دهیم. این کار با یک f-string ساده در پایتون انجام می‌شود:

python
no_recipes = input("تعداد دستور پخت (مثلاً ۵): ")
ingredients = input("مواد موجود (مثلاً مرغ، سیب‌زمینی، هویج): ")

prompt = (
    f"{no_recipes} دستور پخت با این مواد پیشنهاد بده: {ingredients}. "
    "برای هر دستور، همه‌ی مواد لازم را فهرست کن."
)

حالا با ورودی «۳» و «شیر، توت‌فرنگی» برنامه چیزهایی مثل شیک توت‌فرنگی و کیک توت‌فرنگی پیشنهاد می‌دهد. پرامپت شما در واقع یک قالب با دو جای خالی شده است؛ همان مفهومی که در قسمت اول دیدیم.

فیلتر مواد و ساخت فهرست خرید

دو بهبود دیگر هم می‌خواهیم. اول، کاربر بتواند موادی را که دوست ندارد یا به آن حساسیت دارد حذف کند. کافی است یک ورودی دیگر بگیرید و آن را به انتهای پرامپت اضافه کنید؛ مثلاً «بدون سیر». فقط دقت کنید فیلتر باید روشن باشد. کسی که لاکتوز را تحمل نمی‌کند، احتمالاً پنیر را هم نمی‌خواهد، نه فقط شیر را.

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

python
old_result = response.output_text
prompt = "برای این دستورها فهرست خرید بساز و موادی را که در خانه دارم نیاور."
response = client.responses.create(
    model="gpt-5-mini",
    input=f"{old_result}\n\n{prompt}",
    max_output_tokens=1200,
    store=False,
)
print("فهرست خرید:")
print(response.output_text)

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

بهبود تنظیمات برنامه

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

کلید API را از کد جدا کنید

کلید API جایش داخل کد نیست. کد معمولاً در گیت ذخیره یا با همکاران به اشتراک گذاشته می‌شود. اگر کلید داخل کد باشد، دیر یا زود لو می‌رود و هر کسی می‌تواند به حساب شما هزینه بسازد.

راه‌حل ساده، فایل .env است. کلید را در این فایل بنویسید و فایل را به .gitignore اضافه کنید. بعد در کد با load_dotenv() آن را بخوانید:

python
import os
from dotenv import load_dotenv
from openai import OpenAI

load_dotenv()
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

مصرف توکن را کنترل کنید

هزینه‌ی مدل بر اساس توکن محاسبه می‌شود؛ هم توکن‌های پرامپت و هم توکن‌های پاسخ. پس هرچه پرامپت کوتاه‌تر و دقیق‌تر باشد، هزینه کمتر است. قبل از افزودن توضیحات طولانی بپرسید: آیا واقعاً لازم است؟

با پارامتر max_output_tokens هم سقف طول پاسخ را تعیین می‌کنید. در مثال فهرست خرید این عدد را ۱۲۰۰ گذاشتیم، چون پاسخ اول بخشی از ورودی شده بود. برای پاسخ‌های کوتاه، عدد کوچک‌تری کافی است.

temperature و مدل‌های استدلالی

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

اما یک تغییر مهم را باید بدانید. مدل‌های استدلالی جدید، مثل خانواده‌ی GPT-5، پارامترهای temperature و top_p را پشتیبانی نمی‌کنند. اگر این پارامتر را بفرستید، خطای «پارامتر پشتیبانی نمی‌شود» می‌گیرید. در این مدل‌ها کیفیت را با پرامپت دقیق، مثال و قالب خروجی کنترل می‌کنید. تنظیم‌هایی مثل میزان استدلال هم تعادل بین دقت، سرعت و هزینه را مشخص می‌کنند.

تمرین؛ یک دستیار کوچک برای خودتان بسازید

حالا نوبت شماست. یکی از این سه پروژه را انتخاب کنید و با همان کد پایه بسازید:

  1. برنامه‌ی دستور پخت را کامل‌تر کنید و با پرامپت‌ها و تنظیمات مختلف آزمایش کنید.
  2. یک «هم‌درس» بسازید که درباره‌ی یک موضوع، مثلاً پایتون، درس کوتاه همراه تمرین و پاسخ پیشنهاد دهد.
  3. یک ربات تاریخ بسازید که نقش یک شخصیت تاریخی را بازی کند و با لحن همان دوره جواب دهد.

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

سخن پایانی

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

در قسمت چهارم همین برنامه را به یک چت‌بات تبدیل می‌کنیم که گفت‌وگو را به خاطر می‌سپارد و رفتار مشخصی دارد.

این آموزش بر پایه‌ی درس Building Text Generation Applications از مجموعه‌ی آزاد Generative AI for Beginners مایکروسافت (مجوز MIT) به فارسی بازنویسی و تکمیل شده است.

پرسش‌های پرتکرار

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

آشنایی مقدماتی با پایتون، نصب Python روی سیستم و یک کلید API از سرویس مدل زبانی مثل OpenAI یا Azure OpenAI. بقیه‌ی کار با نصب کتابخانه‌ی openai و چند خط کد انجام می‌شود.

فرق استفاده از API و کتابخانه چیست؟

در روش API خودتان درخواست وب را می‌سازید و پاسخ را می‌خوانید. کتابخانه‌ها همین درخواست‌ها را در چند تابع ساده بسته‌بندی می‌کنند و کار را سریع‌تر و کم‌خطاتر می‌کنند.

چرا نباید کلید API را داخل کد بنویسم؟

کد معمولاً در گیت ذخیره یا با دیگران به اشتراک گذاشته می‌شود. کلیدی که داخل کد باشد به‌راحتی لو می‌رود و هر کسی می‌تواند به حساب شما هزینه بسازد. کلید را در متغیر محیطی یا فایل .env نگه دارید.

چرا مدل‌های جدید پارامتر temperature را قبول نمی‌کنند؟

مدل‌های استدلالی مثل خانواده‌ی GPT-5 پارامترهای نمونه‌گیری مثل temperature و top_p را پشتیبانی نمی‌کنند. در این مدل‌ها کیفیت خروجی را با پرامپت دقیق و تنظیم‌های مخصوص استدلال کنترل می‌کنید.

max_output_tokens چه کاربردی دارد؟

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

دیدگاه‌ها

هنوز دیدگاهی ثبت نشده است. شروع‌کننده باشید — پرسش و اصلاح را با آغوش باز می‌پذیریم.

دیدگاه بگذارید

برای **پررنگ**، *مورب*، `کد` و لینک از Markdown استفاده کنید. لینک‌ها nofollow هستند.

پنج رقم داخل تصویر را وارد کنید. اعداد فارسی و انگلیسی پذیرفته می‌شوند.

تصویر کد امنیتی پنج‌رقمی

در حال دریافت کد امنیتی…

مهلت کد تمام شد. روی «کد جدید» بزنید.