ماژول ۰۶: پروژه‌های API و RAG

← قبلی | 🏠 خانه | بعدی →

معماری RAG و APIهای هوش مصنوعی

قدرت هوش مصنوعی برنامه‌ریزی شده

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

با استفاده از APIها، می‌توانید به صورت برنامه‌نویسی شده (Programmatically) متن، تصویر یا صدا را به یک مدل هوش مصنوعی ارسال کنید و داده‌های ساختاریافته را دریافت کنید. این امر به شما امکان می‌دهد هوش مصنوعی را در نرم‌افزارهای موجود ادغام کنید، عامل‌های خودمختار (Autonomous Agents) بسازید، یا ابزارهای داخلی تخصصی برای شرکت خود ایجاد کنید.

بررسی عمیق: ارائه‌دهندگان هوش مصنوعی و APIها

انتخاب ارائه‌دهنده مناسب API به مورد استفاده خاص، بودجه و الزامات حریم خصوصی شما بستگی دارد.

ارائه‌دهنده / مدل نقاط قوت نقاط ضعف بهترین کاربرد
OpenAI (GPT-4o) استاندارد صنعت، بسیار قابل اعتماد، عالی در فراخوانی ابزار (Function Calling)، بینایی چندوجهی (Multimodal). فیلترینگ سختگیرانه محتوا، هزینه بالا برای حجم زیاد. چت‌بات‌های همه‌منظوره، استدلال پیچیده، خروجی JSON ساختاریافته.
OpenAI (GPT-4o-mini) فوق‌العاده سریع، بسیار ارزان، استدلال قابل قبول. در منطق‌های بسیار پیچیده نسبت به مدل 4o ضعیف‌تر است. کارهای با حجم بالا، دسته‌بندی ساده، تحلیل احساسات.
Anthropic (Claude 3.5 Sonnet) توانایی کدنویسی بی‌نظیر، پنجره زمینه بزرگ 200k، لحن نگارش انسانی و ظریف. محدودیت‌های نرخ (Rate Limits) API برای اکانت‌های جدید سخت‌گیرانه است. تولید کد، تحلیل اسناد بزرگ، نگارش خلاقانه.
Google (Gemini 1.5 Pro) پنجره زمینه عظیم (تا ۲ میلیون توکن). می‌تواند کل کتاب‌ها یا ساعت‌ها ویدیو را همزمان پردازش کند. گاهی اوقات در معماهای منطقی نسبت به GPT-4 کمی بیشتر دچار توهم می‌شود. ترکیب اسناد، RAG بر روی دیتاست‌های عظیم، تحلیل ویدیو.
متن‌باز (Ollama/Llama-3) ۱۰۰٪ رایگان، اجرای محلی (Local)، حریم خصوصی کامل داده‌ها. برای اجرای سریع به سخت‌افزار قدرتمند (GPU) نیاز دارد. مراقبت‌های بهداشتی، امور مالی، محیط‌های ایزوله (Air-gapped).

مفاهیم ضروری API برای مبتدیان

معماری ارتباط وب API و کلاینت-سرور

نمودار معماری ارتباط Web API، تبادل درخواست‌ها (Request) و پاسخ‌ها (Response) میان کلاینت و مدل

قبل از نوشتن کد، باید اصطلاحات را درک کنید:

  1. کلید API (API Key): یک رشته طولانی از کاراکترها (مثلاً sk-proj-12345...) که همزمان به عنوان نام کاربری و رمز عبور شما عمل می‌کند. قانون امنیتی حیاتی: هرگز کلید API خود را در GitHub آپلود نکنید. هکرها به صورت ۲۴ ساعته گیت‌هاب را اسکن می‌کنند. اگر کلید شما را پیدا کنند، در عرض چند ساعت ۵۰ هزار دلار صورتحساب روی دست شما می‌گذارند. همیشه از فایل‌های .env برای ذخیره محلی کلیدها استفاده کنید.
  2. نقطه پایانی (Endpoint): آدرس URL خاصی که داده‌ها را به آن ارسال می‌کنید. برای چت OpenAI، این آدرس https://api.openai.com/v1/chat/completions است.
  3. قالب JSON: زبان جهانی APIها. یک روش ساختاریافته برای ارسال داده با استفاده از جفت‌های کلید-مقدار (مثلاً {"role": "user", "content": "Hello"}).
  4. توکن‌ها (Tokens): هوش مصنوعی کلمات را نمی‌خواند؛ بلکه توکن‌ها را می‌خواند. یک توکن تقریباً معادل ۳/۴ یک کلمه انگلیسی است. صورتحساب شما بر اساس هر ۱۰۰۰ یا ۱ میلیون توکن محاسبه می‌شود. توکن‌های خروجی (تولید متن) گران‌تر از توکن‌های ورودی (خواندن متن) هستند.
  5. دما (Temperature): پارامتری که در درخواست خود ارسال می‌کنید (از ۰.۰ تا ۲.۰).
    _ Temperature = 0.0: کاملاً قطعی، تحلیلی، مبتنی بر واقعیت. بهترین برای کدنویسی یا استخراج داده.
    _ Temperature = 0.8: خلاقانه، متنوع، کمی غیرقابل پیش‌بینی. بهترین برای طوفان فکری یا نگارش خلاقانه.

آموزش عملی: فراخوانی API با پایتون

بیایید به نمونه کدهای عملی برای سه ارائه‌دهنده برتر نگاه کنیم.

۱. راه‌اندازی OpenAI

ابتدا SDK را نصب کنید: pip install openai python-dotenv
یک فایل .env در پوشه خود ایجاد کنید: OPENAI_API_KEY=sk-your-key-here

import os
from dotenv import load_dotenv
from openai import OpenAI

# بارگذاری متغیرهای محیطی از فایل .env
load_dotenv()

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

response = client.chat.completions.create(
    model="gpt-4o-mini",
    temperature=0.5,
    messages=[
        {"role": "system", "content": "You are a sarcastic but helpful coding tutor."},
        {"role": "user", "content": "Explain what a 'while' loop is."}
    ]
)

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

۲. راه‌اندازی Anthropic (Claude)

pip install anthropic

import os
from dotenv import load_dotenv
from anthropic import Anthropic

load_dotenv()
client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

message = client.messages.create(
    model="claude-3-5-sonnet-20240620",
    max_tokens=1000,
    temperature=0,
    system="You are an expert editor.",
    messages=[
        {"role": "user", "content": "Proofread this sentence: Their going to the store, over their."}
    ]
)

print(message.content[0].text)

درک عمیق RAG (Retrieval-Augmented Generation)

اگر از ChatGPT بپرسید: “سیاست بازپرداخت (Refund policy) شرکت ما چیست؟”، او پاسخی را از خود اختراع (Hallucinate) می‌کند زیرا دفترچه راهنمای کارمندان شما را نخوانده است. شما نمی‌توانید هر بار که سیاست‌های شرکت تغییر می‌کند یک مدل جدید را از ابتدا آموزش دهید — این کار میلیون‌ها دلار هزینه دارد.

راه‌حل، سیستم RAG (تولید تقویت‌شده با بازیابی) است. به جای آموزش مجدد مغز (LLM)، ما قبل از پاسخ دادن، یک کتاب باز به مغز می‌دهیم تا آن را بخواند.

معماری سیستم RAG

شماتیک جریان داده در معماری تولید تقویت‌شده با بازیابی (RAG): از اسناد مبدأ و بازیابی تا تزریق پرامپت و تولید پاسخ LLM

معماری RAG (گام به گام)

فاز ۱: جذب داده‌ها (Ingestion)

  1. بارگذاری اسناد: شما PDF خود را لود می‌کنید (مثلاً یک راهنمای منابع انسانی ۱۰۰ صفحه‌ای).
  2. خرد کردن (Chunking): شما نمی‌توانید به راحتی ۱۰۰ صفحه را به هوش مصنوعی بفرستید. شما سند را به “قطعات” ۵۰۰ کلمه‌ای خرد می‌کنید.
  3. امبدینگ (Embedding): شما هر قطعه را به یک مدل Embedding (مانند text-embedding-3-small شرکت OpenAI) می‌فرستید. این مدل قطعه را می‌خواند و معنای متن را به یک آرایه عظیم از اعداد اعشاری (یک بردار یا Vector) تبدیل می‌کند. * تشبیه: تصور کنید کلمات را روی یک نمودار نگاشت می‌کنیم. “سگ” و “توله سگ” مختصات بسیار نزدیکی به هم خواهند داشت. “سگ” و “سفینه فضایی” بسیار از هم دور خواهند بود.
  4. دیتابیس برداری (Vector Database): شما این آرایه‌های عددی را در یک پایگاه داده برداری تخصصی (مانند Pinecone, ChromaDB, یا Qdrant) ذخیره می‌کنید.
فرآیند تبدیل اسناد به بردارهای معنایی و دیتابیس برداری

نحوه قطعه‌بندی اسناد متنی، استخراج امبدینگ‌های چندبعدی و ذخیره‌سازی در پایگاه داده برداری (Vector Database)

فاز ۲: بازیابی و تولید (Retrieval & Generation)

  1. پرسش کاربر: کاربر می‌پرسد: “من چند روز مرخصی دارم؟”
  2. امبدینگ پرسش: سیستم RAG سؤال کاربر را با استفاده از همان مدل Embedding دقیقاً به یک بردار تبدیل می‌کند.
  3. جستجوی معنایی (Cosine Similarity): سیستم پایگاه داده برداری را برای قطعاتی که از نظر ریاضی نزدیک‌ترین به بردار سؤال هستند جستجو می‌کند. و ۳ پاراگراف برتر مرتبط را بازیابی می‌کند.
  4. تقویت و پرامپتینگ: سیستم در پس‌زمینه یک پرامپت می‌سازد: * پرامپت سیستم: “به سؤال کاربر فقط با استفاده از متن (Context) ارائه شده پاسخ بده.” * متن زمینه (Context): [متن پیست شده از ۳ پاراگراف بازیابی شده] * سؤال کاربر: “من چند روز مرخصی دارم؟”
  5. تولید (Generation): مدل زبانی (LLM) متن را می‌خواند، پاسخ را پیدا می‌کند و یک پاسخ به زبان طبیعی تولید می‌کند.

استراتژی‌های خرد کردن (Chunking)

نحوه برش متن شما اهمیت فوق‌العاده‌ای دارد.

  • برش ساده (Naive): برش دقیقاً هر ۵۰۰ کاراکتر. مشکل: ممکن است یک جمله را از وسط نصف کنید و معنی را از بین ببرید.
  • برش بر اساس جمله: استفاده از کتابخانه‌هایی مانند LangChain یا NLTK برای برش تمیز در نقاط پایان جمله.
  • برش معنایی (Semantic): استفاده از هوش مصنوعی برای گروه‌بندی متن بر اساس تغییرات موضوعی.

آموزش کامل RAG در پایتون (با استفاده از LangChain و Chroma)

این اسکریپت یک راه‌اندازی پایه RAG را با استفاده از یک پایگاه داده برداری متن‌باز محلی (Chroma) و OpenAI نشان می‌دهد.

پیش‌نیازها: pip install langchain langchain-openai chromadb tiktoken

import os
from dotenv import load_dotenv
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma

load_dotenv()

# ۱. بارگذاری سند
# فرض کنید یک فایل متنی به نام 'company_policy.txt' داریم
loader = TextLoader("company_policy.txt")
documents = loader.load()

# ۲. خرد کردن سند (Chunking)
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)

# ۳. ایجاد امبدینگ‌ها و ذخیره در دیتابیس برداری Chroma
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# این یک دیتابیس برداری محلی مبتنی بر SQLite در پوشه ایجاد می‌کند
db = Chroma.from_documents(chunks, embeddings)

# ۴. ایجاد یک بازیاب (Retriever)
retriever = db.as_retriever(search_kwargs={"k": 2}) # دریافت ۲ نتیجه برتر

# ۵. پرسش کاربر
query = "سیاست دورکاری در این شرکت چیست؟"

# ۶. بازیابی قطعات مرتبط
relevant_docs = retriever.invoke(query)
context = "\n\n".join([doc.page_content for doc in relevant_docs])

# ۷. درخواست از LLM برای تولید پاسخ نهایی
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
prompt = f"""
شما یک دستیار منابع انسانی مفید هستید. به سؤالات فقط بر اساس متن (context) زیر پاسخ دهید.
اگر پاسخ در متن نیست، بگویید "من بر اساس سیاست‌های شرکت نمی‌دانم."

متن:
{context}

سؤال: {query}
"""

response = llm.invoke(prompt)
print("AI Response:\n", response.content)

جایگزین‌های RAG بدون کد / کم‌کد (No-Code/Low-Code)

اگر نمی‌خواهید کد پایتون بنویسید، می‌توانید سیستم‌های RAG در سطح سازمانی را به صورت بصری بسازید:

  1. Flowise / LangFlow: این‌ها ابزارهای ساخت مبتنی بر گره (node) هستند. شما یک کادر “PDF Loader” را می‌کشید، آن را به یک کادر “Text Splitter” متصل می‌کنید، آن را به “Chroma” متصل می‌کنید و یک “مدل چت OpenAI” را به یک “زنجیره بازیابی مکالمه‌ای” وصل می‌کنید. شما می‌توانید یک RAG پیچیده را در ۱۰ دقیقه بسازید و روی سرور خود میزبانی کنید.
  2. Dify.ai: یک پلتفرم متن‌باز قدرتمند که پردازش اسناد و ذخیره‌سازی برداری را مدیریت می‌کند و یک رابط کاربری وب زیبا برای چت کاربران با ربات فراهم می‌کند.
  3. Custom GPTs: ساده‌ترین نوع RAG. فقط یک PDF را در رابط Custom GPT مربوط به OpenAI آپلود کنید. با این حال، شما هیچ کنترلی بر فرآیند خرد کردن (chunking) و امبدینگ ندارید، به این معنی که دقت در اسناد بسیار بزرگ ممکن است کاهش یابد.
معماری پیشرفته GraphRAG و تلفیق دانش ساختاریافته

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

مدیریت هزینه API و نکات محیط پروداکشن

  • پیاده‌سازی کش (Caching): اگر برنامه شما یک سؤال را چندین بار دریافت می‌کند، پاسخ را در Redis یا یک دیتابیس محلی کش کنید. ابزارهایی مانند langchain-cache این کار را آسان می‌کنند.
  • پاسخ‌های جریانی (Streaming): هنگام ساخت رابط کاربری (UI)، کاربران از ۱۰ ثانیه انتظار برای پاسخ متنفرند. از پارامتر stream=True در API استفاده کنید تا متن را به صورت تکه‌تکه به فرانت‌اند ارسال کنید و حالت “تایپ کردن” مشابه ChatGPT را ایجاد کنید.
  • خروجی‌های ساختاریافته (Structured Outputs): اگر نیاز دارید API برای سیستم دیگری (مثلاً دیتابیس) داده برگرداند، فقط به مهندسی پرامپت تکیه نکنید. از ویژگی response_format={"type": "json_object"} در OpenAI یا ویژگی جدید خروجی‌های ساختاریافته با مدل‌های Pydantic استفاده کنید تا تضمین کنید همیشه یک JSON معتبر دریافت می‌کنید.

اشتباهات رایج که باید از آن‌ها اجتناب کنید

  • اعتماد کورکورانه به RAG: فقط به این دلیل که RAG از اسناد شما استفاده می‌کند به معنای بی‌نقص بودن آن نیست. اگر بازیاب (retriever) نتواند قطعه درست را در پایگاه داده پیدا کند، LLM با اطمینان می‌گوید “سند به این موضوع اشاره نکرده است.” همیشه دقت بازیابی خود را ارزیابی کنید.
  • گمشده در وسط (Lost in the Middle): مدل‌های LLM از پدیده‌ای رنج می‌برند که در آن به ابتدا و انتهای متن ارائه شده توجه زیادی می‌کنند، اما اطلاعات مدفون در وسط یک بلوک عظیم متنی را نادیده می‌گیرند. متن بازیابی شده خود را مختصر نگه دارید.
  • حلقه‌های بی‌نهایت در عامل‌ها (Agents): اگر عامل‌های خودمختار (با استفاده از LangChain یا AutoGPT) می‌سازید، اطمینان حاصل کنید که محدودیت سخت‌گیرانه max_iterations را تنظیم کرده‌اید. در غیر این صورت، عاملی که گیج شده است ممکن است در طول شب ۵۰ هزار بار API را در یک حلقه فراخوانی کند.

منابع منتخب

← قبلی | 🏠 خانه | بعدی →

پیمایش به بالا