

<?xml version="1.0" encoding="utf-8"?>

	<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">

	<channel>

	<title>پرشین تولز</title>

	<description>پرشین تولز Rss Feed</description>

	<link>https://persiantools.farsiblog.com/</link>

	<language>Fa</language>

	<generator>farsiblog.com</generator>

	<lastBuildDate>2026-07-19T11:35:52+03:30</lastBuildDate>
	<item>
		<title><![CDATA[چطور یک چت‌بات فارسی بسازیم که به یک سرویس هوش مصنوعی وابسته نباشد؟]]></title>
		<description><![CDATA[<!-- obsidian -->
<p>ساخت نسخه اولیه یک چت&zwnj;بات با مدل زبانی آسان است، اما پایدارکردن آن به چند تصمیم معماری نیاز دارد. اگر همه چیز مستقیماً به SDK و نام مدل یک Provider وصل شود، تغییر قیمت، محدودیت منطقه&zwnj;ای یا حذف مدل می&zwnj;تواند کل برنامه را متوقف کند.</p>
<p>راه بهتر این است که منطق چت&zwnj;بات را از Provider جدا کنیم.</p>
<h3 data-heading="چهار بخش اصلی چت&zwnj;بات">چهار بخش اصلی چت&zwnj;بات</h3>
<pre><code class="language-text">رابط کاربر
مدیریت گفتگو
سرویس LLM
Adapter مربوط به Provider
</code></pre>
<p>رابط کاربر می&zwnj;تواند ترمینال، سایت یا پیام&zwnj;رسان باشد. مدیریت گفتگو مسئول نگهداری چند پیام آخر است. سرویس LLM یک قرارداد ثابت ارائه می&zwnj;دهد و Adapter جزئیات Base URL، کلید و Model ID را می&zwnj;داند.</p>
<h3 data-heading="قرارداد ساده سرویس">قرارداد ساده سرویس</h3>
<pre><code class="language-python">from typing import Protocol


class ChatProvider(Protocol):
    def reply(self, messages: list[dict[str, str]]) -> str:
        ...
</code></pre>
<p>منطق برنامه فقط متد <code>reply</code> را صدا می&zwnj;زند. در نتیجه می&zwnj;توان Adapter مربوط به Provider اول را با Adapter دیگری جایگزین کرد.</p>
<h3 data-heading="مدیریت تاریخچه">مدیریت تاریخچه</h3>
<p>ارسال تمام پیام&zwnj;های گذشته باعث افزایش توکن و هزینه می&zwnj;شود. برای نسخه ساده می&zwnj;توان فقط چند پیام آخر را نگه داشت:</p>
<pre><code class="language-python">MAX_MESSAGES = 12
history = history[-MAX_MESSAGES:]
</code></pre>
<p>برای گفتگوهای طولانی&zwnj;تر، خلاصه&zwnj;سازی دوره&zwnj;ای یا ذخیره اطلاعات مهم در پایگاه داده بهتر است.</p>
<h3 data-heading="System Prompt فارسی">System Prompt فارسی</h3>
<p>System Prompt باید کوتاه و مشخص باشد. برای نمونه:</p>
<pre><code class="language-text">تو یک دستیار فارسی هستی. پاسخ&zwnj;ها را دقیق و روشن بنویس.
هنگام نبود اطلاعات کافی، حدس قطعی نزن.
اطلاعات محرمانه یا کلید API درخواست نکن.
</code></pre>
<p>دستورهای بسیار طولانی هم توکن بیشتری مصرف می&zwnj;کنند و هم احتمال تعارض را بالا می&zwnj;برند.</p>
<h3 data-heading="مدیریت خطا برای تجربه کاربری بهتر">مدیریت خطا برای تجربه کاربری بهتر</h3>
<p>نباید متن خام خطای Provider مستقیماً به کاربر نشان داده شود. بهتر است خطاها به چند گروه تبدیل شوند:</p>
<ul>
<li>احراز هویت: تنظیمات سرویس مشکل دارد؛</li>
<li>محدودیت مصرف: کمی بعد دوباره تلاش شود؛</li>
<li>مدل نامعتبر: Model ID نیاز به بازبینی دارد؛</li>
<li>شبکه: اتصال موقتاً برقرار نیست؛</li>
<li>خطای داخلی Provider: مسیر جایگزین فعال شود.</li>
</ul>
<p>Retry باید محدود و همراه Backoff باشد. تکرار نامحدود درخواست 429 فقط سهمیه را بدتر می&zwnj;کند.</p>
<h3 data-heading="امنیت API Key">امنیت API Key</h3>
<p>کلید باید فقط در Backend نگه&zwnj;داری شود. قراردادن کلید در JavaScript مرورگر، اپ موبایل بدون Backend، Repository عمومی یا تصویر آموزشی ناامن است.</p>
<p>برای محیط&zwnj;های مختلف از Secret Manager یا Environment Variable استفاده کنید و دسترسی کلید را حداقل نگه دارید.</p>
<h3 data-heading="Provider رایگان را چگونه انتخاب کنیم؟">Provider رایگان را چگونه انتخاب کنیم؟</h3>
<p>برای یک چت&zwnj;بات فارسی این معیارها مهم&zwnj;اند:</p>
<ul>
<li>کیفیت پاسخ فارسی؛</li>
<li>Context کافی؛</li>
<li>Rate limit مناسب؛</li>
<li>Streaming در صورت نیاز؛</li>
<li>دسترسی عملی از ایران؛</li>
<li>سازگاری با SDK موجود؛</li>
<li>امکان استفاده از مدل جایگزین.</li>
</ul>
<p>کیفیت فارسی را با چند Prompt واقعی پروژه بسنجید. نام یا اندازه مدل به&zwnj;تنهایی تضمین نمی&zwnj;کند که لحن، دستورپذیری یا نگارش فارسی مناسب باشد.</p>
<h3 data-heading="Fallback ساده">Fallback ساده</h3>
<p>برای شروع می&zwnj;توان دو Provider تعریف کرد. فقط خطاهای موقت مانند Timeout یا خطای ظرفیت باید مسیر دوم را فعال کنند. خطای Authentication نباید خودکار به Provider بعدی منتقل شود، چون ممکن است نشانه تنظیمات اشتباه یا مشکل امنیتی باشد.</p>
<p>آموزش کامل و نمونه Python برای چت&zwnj;بات قابل تعویض:</p>
<p><a class="external-link" href="https://llm.persiantoolbox.ir/guides/build-persian-chatbot-python-free-llm-api/?utm_source=farsiblog&utm_medium=article&utm_campaign=offsite_articles&utm_content=provider_independent_chatbot" target="_blank" rel="nofollow noopener noreferrer" data-tooltip-position="top">ساخت چت&zwnj;بات فارسی با API رایگان LLM</a></p>
<p>فهرست زنده Providerها و Source Code:</p>
<p><code>https://github.com/alirezasafaei-dev/awesome-free-llm-apis-ir</code></p>]]></description>
		<link><![CDATA[]]></link>
		<pubDate>2026-07-19T11:35:52+03:30</pubDate>
	</item>
</channel>
</rss>