ملء النماذج باستخدام Gemini 1.5 Pro

6 دقيقة قراءة

تم النشر:

ملء النماذج يمكن أن يكون مملًا ويستغرق وقتًا طويلًا. هذا غالبًا ما يؤدي إلى إحباط المستخدمين وتقديمات غير مكتملة. ولكن، الذكاء الاصطناعي التفاعلي، مثل نموذج اللغة Gemini 1.5 Pro، يغير كيفية تفاعلنا مع النماذج.

باستخدام Gemini 1.5 Pro مع LangChain، يصبح ملء النماذج سهلًا وممتعًا. بدلاً من التعامل مع نماذج معقدة، يمكن للمستخدمين ببساطة تقديم المعلومات من خلال واجهة دردشة.

في هذا الدليل، سأريك كيف تستفيد من Gemini 1.5 Pro لتحسين تجربة المستخدم من خلال استبدال الطريقة التقليدية لملء النماذج بتجربة ملء نماذج تفاعلية ومريحة. يمكن للذكاء الاصطناعي التفاعلي تحسين رضا المستخدم بشكل كبير وجعل جمع البيانات أكثر كفاءة. لنرى كيف يمكن لـ Gemini 1.5 Pro أن يغير طريقة تفاعل المستخدمين مع النماذج.

Form Filling GIF


المتطلبات الأساسية

قبل البدء، تأكد من تثبيت المكتبات الضرورية. قم بتشغيل الأمر التالي لتثبيت الحزم المطلوبة:

!pip -q install langchain  langchain_community langchain_google_genai  gradio > /dev/null 2>&1

الخطوة 1: استيراد المكتبات، تعيين مفتاح API، وتهيئة Gemini 1.5 Pro

أولاً، سنقوم باستيراد المكتبات الضرورية وتكوين البيئة.

# استيراد المكتبات
import os
import getpass
import gradio as gr
import random
from typing import Optional, List
from pydantic import BaseModel, Field
from langchain.prompts import PromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from langchain_google_genai import ChatGoogleGenerativeAI

تعيين مفتاح Google API وتهيئة Gemini 1.5 Pro

# تعيين مفتاح API
os.environ["GOOGLE_API_KEY"] = getpass.getpass(prompt="GOOGLE_API_KEY")
# تهيئة Gemini 1.5 Pro
llm = ChatGoogleGenerativeAI(model="gemini-1.5-pro", temperature=0)

الخطوة 2: تعريف فئة بيانات المستخدم

بعد ذلك، سنقوم بإنشاء فئة UserDetails لتمثيل معلومات المستخدم. هذه الفئة ستستخدم Pydantic للتحقق من صحة البيانات وتوفير حقول اختيارية لتفاصيل المستخدم المختلفة.

# نموذج بيانات لتفاصيل المستخدم
class UserDetails(BaseModel):
    language: Optional[str] = Field(
        None, enum=["arabic", "english"],
        description="اللغة المفضلة لدى المستخدم."
    )
    first_name: Optional[str] = Field(
        None,
        description="الاسم الأول للمستخدم.",
    )
    last_name: Optional[str] = Field(
        None,
        description="اسم العائلة أو اللقب للمستخدم.",
    )
    city: Optional[str] = Field(
        None,
        description="المدينة التي يعيش فيها المستخدم.",
    )
    email: Optional[str] = Field(
        None,
        description="عنوان البريد الإلكتروني للمستخدم.",
    )

الخطوة 3: استخراج تفاصيل المستخدم من النص

سنقوم بتعريف دالة لاستخراج تفاصيل المستخدم من نص المدخلات. سنستخدم نموذج Gemini 1.5 Pro من خلال LangChain لإنشاء سلسلة تعالج نص المدخلات وتستخرج التفاصيل ذات الصلة.

# سلسلة لاستخراج التفاصيل من النص
def extract_user_details(input_text: str) -> UserDetails:
    parser = JsonOutputParser(pydantic_object=UserDetails)

    extraction_prompt = PromptTemplate(
        template="""Extract the following personal details from the text and provide them:
        {input}   \n \n {format_instructions}""",
        input_variables=["input"],
        partial_variables={"format_instructions": parser.get_format_instructions()},
    )
    chain = extraction_prompt | llm | parser
    return chain.invoke(input_text)

الخطوة 4: تحديث ودمج تفاصيل المستخدم

سنقوم بإنشاء دالة لتحديث تفاصيل المستخدم الحالية بمعلومات جديدة. هذه الدالة ستقوم بدمج التفاصيل الجديدة مع التفاصيل الحالية، لضمان عدم الكتابة فوق البيانات بشكل غير ضروري.

# تحديث التفاصيل الحالية بمعلومات جديدة
def merge_user_details(current_details: UserDetails, new_details: dict) -> UserDetails:
        print("البيانات المستلمة:", new_details)
        try:
            personal_details = new_details
        except KeyError as e:
            print(f"خطأ: {e}. المفتاح 'personaldetails' غير موجود في قاموس البيانات.")
            personal_details = {}

        # تحديث الحقول الفارغة فقط في التفاصيل الحالية
        updated_details = {
            'language': personal_details.get('language', current_details.language) if not current_details.language else current_details.language,
            'first_name': personal_details.get('first_name', current_details.first_name) if not current_details.first_name else current_details.first_name,
            'last_name': personal_details.get('last_name', current_details.last_name) if not current_details.last_name else current_details.last_name,
            'city': personal_details.get('city', current_details.city) if not current_details.city else current_details.city,
            'email': personal_details.get('email', current_details.email) if not current_details.email else current_details.email
            }

        return UserDetails(language=updated_details.get('language'),
                                         first_name=updated_details.get('first_name'),
                              last_name=updated_details.get('last_name'),
                              city=updated_details.get('city'),
                              email=updated_details.get('email')
                              )

الخطوة 5: العثور على التفاصيل الناقصة

لضمان جمع جميع المعلومات الضرورية، سنقوم بإنشاء دالة للعثور على أي تفاصيل ناقصة في معلومات المستخدم.

# العثور على التفاصيل الناقصة
def find_missing_details(user_details: UserDetails) -> List[str]:
    empty_fields = []
    for field in vars(user_details):
        value = getattr(user_details, field)
        if value in [None, "", 0]:
            print(f"الحقل '{field}' فارغ.")
            empty_fields.append(field)
    return empty_fields

الخطوة 6: مطالبة المستخدم بالمعلومات الناقصة

سنقوم بإنشاء دالة لمطالبة المستخدم بأي معلومات ناقصة بطريقة تفاعلية. هذه الدالة ستولد مطالبة بناءً على الحقول الناقصة ومدخلات المستخدم.

# مطالبة المستخدم بالمعلومات الناقصة
def prompt_for_missing_info(missing_fields: List[str], user_input: str) -> str:
    system_prompt = """You are a chatbot that collect user data that needs for registration. You talk to the user in a friendly way.
    Interact with user message:
    {user_input}
    If use write arabic you must reply in Arbic. if use write english you must reply in English.
    Here are some things to ask the user for in a conversational way:
    ### Missing fields list: {missing_fields}

    Only ask one question at a time, even if you don't get all the info.
    If there are four items in the list, say hello.
    If there are less than four items and the list is not empty , make the conversation seem continuous.
    If the list is empty, thank the user, tell them you've collected their registration data, and say goodbye.
    """
    prompt = PromptTemplate(template=system_prompt, input_variables=['missing_fields', "user_input"])

    chain = prompt | llm
    ai_response = chain.invoke({"missing_fields": missing_fields, "user_input": user_input})
    return ai_response.content

الخطوة 7: دالة الروبوت الرئيسية

سنقوم بتهيئة كائن UserDetails فارغ وتعريف الدالة الرئيسية للروبوت. هذه الدالة ستستخرج تفاصيل المستخدم من نص المدخلات، وتدمجها مع التفاصيل الحالية، وتبحث عن أي معلومات ناقصة، ثم تطالب المستخدم بناءً على ذلك.

# تهيئة كائن UserDetails فارغ
current_user_details = UserDetails()

# الدالة الرئيسية للروبوت.
def chatbot_response(text_input: str) -> str:
    global current_user_details

    extracted_details = extract_user_details(text_input)
    current_user_details = merge_user_details(current_user_details, extracted_details)
    missing_fields = find_missing_details(current_user_details)
    if not missing_fields:

          messages = [
              "شكرًا، لقد جمعت بياناتك التي نحتاجها للتسجيل. نراك قريبًا!",
              "شكرًا! تم تسجيل معلوماتك. يومك سعيد!",
              "تم حفظ البيانات! كل شيء جاهز. نراك في المرة القادمة!",
              "كل شيء مكتمل! تسجيلك تم بنجاح. نراك قريبًا!",
              "تم! بياناتك آمنة معنا. نراك في المرة القادمة!"]
          Thanks_message = random.choice(messages)
          return Thanks_message
    return prompt_for_missing_info(missing_fields, text_input)
# قبل تشغيل الدردشة، تحقق من بيانات المستخدم التي تم تهيئتها للتو.


print("التفاصيل الحالية بعد الدمج الأولي: ", current_user_details)

الخطوة 8: واجهة Gradio

أخيرًا، سنقوم بإنشاء واجهة Gradio لتجربة الروبوت التفاعلي لملء النموذج. يمكن للمستخدمين تقديم المدخلات والحصول على ردود في الوقت الفعلي.

# إنشاء واجهة Gradio
interface = gr.Interface(
    fn=chatbot_response,
    inputs=gr.inputs.Textbox(lines=7, label="ادخل بيانات التسجيل"),
    outputs="text",
    title="التسجيل التفاعلي",
    description="أدخل بياناتك لتسجيل سريع وسهل!"
)

# تشغيل الواجهة
interface.launch()

الخطوة 9: تحقق مما إذا تم حفظ جميع البيانات

تحقق مما إذا تم حفظ جميع بيانات المستخدم

print(current_user_details)

الختام:

من خلال دمج Gemini 1.5 Pro في تطبيقاتك، يمكنك تحويل طريقة تفاعل المستخدمين مع النماذج، مما يجعل العملية أكثر سلاسة ومتعة. هذا لا يعزز فقط تجربة المستخدم، بل يضمن أيضًا جمع بيانات أكثر اكتمالًا ودقة. استثمر في قوة الذكاء الاصطناعي التفاعلي لتحسين عملية ملء النماذج إلى المستوى التالي.

على الرغم من وجود أفكار مشابهة، إلا أن هذه الحلول تميزت باستقلالها عن وظائف محددة مثل create_tagging_chain_pydantic من LangChain، التي ترتبط بنماذج معينة مثل ChatGPT. بدلاً من ذلك، تم تصميمها لتشمل Gemini 1.5 Pro وجميع النماذج كذلك.

روابط:

مثال لتطبيق الفكرة في مشروع: