ساخت ربات پرسش و پاسخ هوش مصنوعی برای صفحات وب با استفاده از مدل‌های هوش مصنوعی متن‌باز

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

این آموزش شما را در ساخت یک سیستم پرسش و پاسخ هوش مصنوعی کاربردی راهنمایی می‌کند که می‌تواند محتوای صفحات وب را تجزیه و تحلیل کرده و به سوالات خاص پاسخ دهد. به جای تکیه بر سرویس‌های API گران‌قیمت، ما از مدل‌های متن‌باز (open-source) از Hugging Face برای ایجاد راهکاری استفاده خواهیم کرد که:

  • کاملاً رایگان است
  • در Google Colab اجرا می‌شود (نیازی به تنظیمات محلی نیست)
  • قابل تنظیم بر اساس نیازهای خاص شما است
  • بر پایه فناوری پیشرفته پردازش زبان طبیعی (NLP) ساخته شده است

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

چه چیزی خواهیم ساخت؟

ما سیستمی ایجاد خواهیم کرد که:

  1. یک URL را به عنوان ورودی می‌گیرد
  2. محتوای صفحه وب را استخراج و پردازش می‌کند
  3. سوالات به زبان طبیعی درباره محتوا را می‌پذیرد
  4. پاسخ‌های دقیق و مبتنی بر زمینه را بر اساس صفحه وب ارائه می‌دهد

پیش‌نیازها

  • یک حساب گوگل برای دسترسی به Google Colab
  • دانش پایه پایتون (Python)
  • نیازی به دانش قبلی یادگیری ماشین (Machine Learning) نیست

گام ۱: راه‌اندازی محیط

ابتدا، بیایید یک نوت‌بوک جدید Google Colab ایجاد کنیم. به Google Colab بروید و یک نوت‌بوک جدید بسازید.

بیایید با نصب کتابخانه‌های لازم شروع کنیم:

# نصب بسته‌های مورد نیاز

!pip install transformers torch beautifulsoup4 requests

این دستور موارد زیر را نصب می‌کند:

  • transformers: کتابخانه Hugging Face برای مدل‌های پیشرفته NLP
  • torch: چارچوب یادگیری عمیق PyTorch
  • beautifulsoup4: برای تجزیه HTML و استخراج محتوای وب
  • requests: برای ارسال درخواست‌های HTTP به صفحات وب

گام ۲: وارد کردن کتابخانه‌ها و تنظیم توابع پایه

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

import torch
from transformers import AutoModelForQuestionAnswering, AutoTokenizer
import requests
from bs4 import BeautifulSoup
import re
import textwrap

# بررسی در دسترس بودن GPU

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"Using device: {device}")

# تابعی برای استخراج متن از یک صفحه وب

def extract_text_from_url(url):
    try:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, 'html.parser')

        # حذف تگ‌های script, style, header, footer, nav
        for script_or_style in soup(['script', 'style', 'header', 'footer', 'nav']):
            script_or_style.decompose()

        # استخراج متن
        text = soup.get_text()

        # تمیز کردن متن
        lines = (line.strip() for line in text.splitlines())
        chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
        text = 'n'.join(chunk for chunk in chunks if chunk)

        # جایگزینی چندین فاصله با یک فاصله
        text = re.sub(r's+', ' ', text).strip()

        return text

    except Exception as e:
        print(f"Error extracting text from URL: {e}")
        return None

این کد:

  1. تمام کتابخانه‌های لازم را وارد می‌کند
  2. دستگاه ما را تنظیم می‌کند (GPU در صورت موجود بودن، در غیر این صورت CPU)
  3. تابعی برای استخراج محتوای متنی قابل خواندن از URL یک صفحه وب ایجاد می‌کند

گام ۳: بارگذاری مدل پرسش و پاسخ

حالا بیایید یک مدل پرسش و پاسخ از پیش آموزش‌دیده را از Hugging Face بارگذاری کنیم:

# بارگذاری مدل و توکنایزر از پیش آموزش‌دیده

model_name = "deepset/roberta-base-squad2"

print(f"Loading model: {model_name}")
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForQuestionAnswering.from_pretrained(model_name).to(device)
print("Model loaded successfully!")

ما از مدل deepset/roberta-base-squad2 استفاده می‌کنیم که:

  • بر پایه معماری RoBERTa (یک رویکرد BERT بهینه شده قوی) است
  • بر روی مجموعه داده SQuAD 2.0 (مجموعه داده پرسش و پاسخ استنفورد) تنظیم دقیق (fine-tune) شده است
  • تعادل خوبی بین دقت و سرعت برای وظیفه ما برقرار می‌کند

گام ۴: پیاده‌سازی تابع پرسش و پاسخ

اکنون، بیایید قابلیت اصلی را پیاده‌سازی کنیم – توانایی پاسخ به سوالات بر اساس محتوای استخراج شده از صفحه وب:

def answer_question(question, context, max_length=512):
    # محاسبه حداکثر اندازه تکه بر اساس طول سوال
    max_chunk_size = max_length - len(tokenizer.encode(question)) - 5  
    all_answers = []

    # پردازش متن در تکه‌های کوچکتر
    for i in range(0, len(context), max_chunk_size):
        chunk = context[i:i + max_chunk_size]

        # آماده‌سازی ورودی‌ها برای مدل
        inputs = tokenizer(
            question,
            chunk,
            add_special_tokens=True,
            return_tensors="pt",
            max_length=max_length,
            truncation=True  # کوتاه کردن ورودی اگر طولانی‌تر از max_length باشد
        ).to(device)

        # اجرای مدل بدون محاسبه گرادیان
        with torch.no_grad():
            outputs = model(**inputs)

        # یافتن توکن‌های شروع و پایان پاسخ با بالاترین امتیاز
        answer_start = torch.argmax(outputs.start_logits)
        answer_end = torch.argmax(outputs.end_logits)

        # دریافت امتیازات شروع و پایان
        start_score = outputs.start_logits[0][answer_start].item()
        end_score = outputs.end_logits[0][answer_end].item()
        score = start_score + end_score # امتیاز کلی

        # تبدیل IDهای ورودی به توکن‌ها
        input_ids = inputs.input_ids.tolist()[0]
        tokens = tokenizer.convert_ids_to_tokens(input_ids)

        # استخراج پاسخ با استفاده از توکن‌های شروع و پایان
        answer = tokenizer.convert_tokens_to_string(tokens[answer_start:answer_end+1])

        # تمیز کردن پاسخ
        answer = answer.replace("[CLS]", "").replace("[SEP]", "").strip()

        # اضافه کردن پاسخ معتبر به لیست
        if answer and len(answer) > 2:  # فیلتر کردن پاسخ‌های خالی یا خیلی کوتاه
            all_answers.append((answer, score))

    # مرتب‌سازی پاسخ‌ها بر اساس امتیاز و بازگرداندن بهترین پاسخ
    if all_answers:
        all_answers.sort(key=lambda x: x[1], reverse=True)
        return all_answers[0][0]
    else:
        return "نتوانستم پاسخی در محتوای ارائه شده پیدا کنم."

این تابع:

  1. یک سوال و محتوای صفحه وب را به عنوان ورودی می‌گیرد
  2. با پردازش محتوای طولانی در تکه‌های (chunks) کوچک، آن را مدیریت می‌کند
  3. از مدل برای پیش‌بینی محدوده پاسخ (موقعیت‌های شروع و پایان) استفاده می‌کند
  4. چندین تکه را پردازش کرده و پاسخی را که بالاترین امتیاز اطمینان را دارد، بازمی‌گرداند

گام ۵: تست و مثال‌ها

بیایید سیستم خود را با چند مثال آزمایش کنیم. در اینجا کد کامل آمده است:

# URL صفحه وب مورد نظر
url = "https://en.wikipedia.org/wiki/Artificial_intelligence"
webpage_text = extract_text_from_url(url)

# نمایش نمونه‌ای از متن استخراج شده
print("نمونه‌ای از متن استخراج شده:")
print(webpage_text[:500] + "...")

# لیستی از سوالات برای پرسیدن
questions = [
    "When was the term artificial intelligence first used?", # اصطلاح هوش مصنوعی اولین بار چه زمانی استفاده شد؟
    "What are the main goals of AI research?",             # اهداف اصلی تحقیقات هوش مصنوعی چیست؟
    "What ethical concerns are associated with AI?"        # چه نگرانی‌های اخلاقی با هوش مصنوعی مرتبط است؟
]

# پرسیدن هر سوال و چاپ پاسخ
for question in questions:
    print(f"nQuestion: {question}")
    answer = answer_question(question, webpage_text)
    print(f"Answer: {answer}")

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

نمونه خروجی کد پایتون برای ربات پرسش و پاسخ هوش مصنوعی
خروجی کد بالا

محدودیت‌ها و بهبودهای آینده

پیاده‌سازی فعلی ما دارای محدودیت‌هایی است:

  1. به دلیل محدودیت طول زمینه (context length)، ممکن است با صفحات وب بسیار طولانی مشکل داشته باشد
  2. مدل ممکن است سوالات پیچیده یا مبهم را درک نکند
  3. بهترین عملکرد را با محتوای واقعی (factual) دارد تا نظرات یا مطالب ذهنی (subjective)

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

  • پیاده‌سازی جستجوی معنایی (semantic search) برای مدیریت بهتر اسناد طولانی
  • افزودن قابلیت‌های خلاصه‌سازی اسناد
  • پشتیبانی از چندین زبان
  • پیاده‌سازی حافظه برای سوالات و پاسخ‌های قبلی
  • تنظیم دقیق مدل بر روی حوزه‌های خاص (مانند پزشکی، حقوقی، فنی)

نتیجه‌گیری

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

  • اطلاعات خاص را از مقالات طولانی استخراج کنید
  • به طور مؤثرتری تحقیق کنید
  • پاسخ‌های سریع از اسناد پیچیده دریافت کنید

با استفاده از مدل‌های قدرتمند Hugging Face و انعطاف‌پذیری Google Colab، شما یک برنامه کاربردی ساخته‌اید که قابلیت‌های NLP مدرن را نشان می‌دهد. با خیال راحت این پروژه را برای رفع نیازهای خاص خود سفارشی و گسترش دهید.

منابع مفید


این هم نوت‌بوک Colab است.