خطوات تطوير تطبيق RAG استرجاع بيانات مخصصة باستخدام نموذج GPT-4o


شرحت في مقال سابق إطلاق النموذج الجديد GPT-4o الذي أطلقته شركة أوبن أيه آي والذي يوفر العديد من الميزات للمستخدمين والمطورين وهو أرخص بنسبة 50% من النموذج الحالي GPT-4 وأسرع منه بكثير.

وسأشرح في مقال اليوم  كيفية استخدام تقنية RAG وواجهة النموذج GPT-4o  البرمجية في محتواك الخاص. 


ما معنى RAG؟

إن مصطلح RAG هو اختصار  لعبارة Retrieval-Augmented Generation وهي تقنية تجمع بين تقنيات الاسترجاع (Retrieval) والذكاء الاصطناعي التوليدي (Generative AI) بحيث تستفيد من الوصول إلى كم هائل من المعلومات المحددة واستغلال قدرات النماذج اللغوية الكبيرة (LLMs) لإنشاء إجابات ذكية ومفصلة.

تتكون عملية استرجاع المعلومات بتقنية RAG من مرحلتين أساسيتين: المرحلة الأولى هي الاسترجاع (Retrieval) ففي هذه المرحلة، يتم البحث في قاعدة بيانات معرفية مخصصة أو مجموعة من المستندات لاسترجاع المعلومات ذات الصلة بالسؤال المطروح فعندما يطرح المستخدم  سؤال ما، يتم البحث في قاعدة المعرفة للحصول على مستندات أو مقاطع نصية ذات صلة بالموضوع.

والمرحلة الثانية هي مرحلة توليد النتائج (Generation) فبعد استرجاع المعلومات ذات الصلة، تمرر هذه المعلومات فقط إلى نموذج لغوي كبير (LLM) مثل GPT-4o ليستفيد منها في إنشاء إجابة مفصلة ومركبة تجمع بين المعلومات المسترجعة وقدرة النموذج على توليد الإجابات.

على سبيل المثال تخيل أنك تستخدم RAG للإجابة على سؤال تاريخي من قبيل "من فتح الأندلس" عندها سيبحث النظام في قاعدة بيانات معينة عن مستندات أو نصوص تحتوي على معلومات حول تاريخ الأندلس. ويمكن أن يسترجع مقاطع من عدة كتب تاريخية أو مقالات ذات صلة، بعد ذلك سيأخذ النموذج التوليدي (في حالتنا GPT-4o) هذه المعلومات المسترجعة ويستخدمها لإنشاء إجابة مفصلة ودقيقة لك.

خطوات تطوير تطبيق بايثون لاسترجاع البيانات باستخدام GPT-4o

لإنجاز هذا التطبيق علينا القيام بالخطوات التالية

خطوة1. إعداد حساب OpenAI والحصول على مفتاح الواجهة البرمجية  API Key الخاص بك


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

الخطوة2. توليد رمز API  

ستجده في صفحة حسابك في منصة OpenAI  مفتاحك الخاص للتعامل مع الواجهة البرمجية، وإذا كانت هذه هي المرة الأولى التي تقوم فيها بإعداد حسابك، ستحتاج إلى التحقق من رقم هاتفك وبعدها سيفعل زر Create new secret key لتوليد مفتاحك الخاص.

بعد الضغط على Create، سيتم إنشاء مفتاح سرّي فريد ويجب عليك تخزينه في مكان آمن إذ يمكنك رؤيته مرة واحدة فقط.


ملاحظة: تكون مفاتيح OpenAI مستندة إلى المشاريع مما يعني أنك ستُعيّن مشروعًا كمضيف لهذا المفتاح المولد على حسابك ولتسهيل العملية من الأفضل تسمية مفتاح API الخاص بك حسب المشروع لتذكره. 

يمكنك استخدام المفتاح بعدة طرق وفي حالتنا سنشرح استخدامه مع واجهة  إكمال الدردشة الخاصة بنموذج GPT-4o، مما يتيح لك استخدامه مع تطبيق Dialog الذي يسهل نشر وكلاء النماذج اللغوية الكبيرة (LLM agents). 

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

وLangchain هو إطار مصمم للعمل مع نماذج اللغة الكبيرة (LLMs) مثل GPT-4o يتيح للمطورين إنشاء تطبيقات تتفاعل مع هذه النماذج بطريقة مرنة وقابلة للتوسيع، عبر ما يعرف بالسلاسل (chains) حيث تتكون السلاسل من عناصر متعددة مثل أوامر مدخلة (prompts)، ونماذج (LLMs)، ومكونات أخرى يمكن تخصيصها حسب الاستخدام.

الخطوة3. استخدام نهج Langchain في talkdai/dialog

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

أما talkdai/dialog، أو ببساطة Dialog، هو تطبيق يساعد المستخدمين في نشر أي وكيل LLM بسهولة. الهدف الرئيسي من talkdai/dialog هو تمكين المطورين من نشر LLMs في أقل من يوم واحد دون الحاجة إلى معرفة DevOps.

لإعداد Dialog في جهازك الطرفي، استنسخ مستودعه  في المجلد الذي تختاره باستخدام الأمر التالي:

git clone https://github.com/talkdai/dialog


ستحتاج إلى إضافة 3 ملفات في المستودع وهي:

1. ملف .env، حيث سيتم تخزين مفتاح OpenAI API (لا تقم بتحميل هذا الملف في بيئة التشغيل الخاصة بك). إذ يعتمد هذا الملف على ملف .env.sample الموجود في جذر المستودع.

2. الملف الذي ستحدد فيه الموجه الخاص بك (يمكنك تسميته prompt.toml في الوثائق، ولكن يمكنك تسميته كما تشاء).

3. ملف CSV يحتوي على محتواك الخاص.

الخطوة4. إعداد ملف .env

انسخ والصق محتوى الملف .env.sample إلى دليل الجذر للمستودع وعدله  باستخدام بياناتك الخاصة بك.

PORT=8000 # نوصي باستخدام هذا المنفذ افتراضيًا محليًا

OPENAI_API_KEY= # مفتاح API 

DIALOG_DATA_PATH=./know.csv # المسار النسبي لملف csv داخل دليل الجذر

PROJECT_CONFIG=./prompt.toml # المسار النسبي لإعداد الموجه

DATABASE_URL=postgresql://talkdai:talkdai@db:5432/talkdai # استبدل القيمة الموجودة بهذا السطر

STATIC_FILE_LOCATION=static # يجب تركه  static

LLM_CLASS=dialog.llm.agents.lcel.runnable # هذا إعداد يحدد نموذج Dialog الذي نقوم بتشغيله، في هذه الحالة نشغل على إصدار LCEL الأحدث

الخطوة5. إعداد ملف  prompt.toml وتخصيص الموجه والنموذج الخاص بك

 يسمح لك هذا الملف بتحديد خصائص النموذج والأمر الأولي الذي سندخله له، على سبيل المثال سنخصصه كما يلي:

[model]

model_name = "gpt-4o"

temperature = 0.1

[prompt]

prompt = """أنت روبوت لطيف، قل شيئًا لطيفًا للمستخدم وساعده في سؤاله، ولكن أخبر المستخدم أيضًا أنك قد لا تعرف تمامًا عن المحتوى الذي سأل عنه."""

هذا الملف بسيط جدًا، يحتوي على قسمين: أحدهما لتحديد تفاصيل النموذج مثل اسم النموذج ودرجة حرارته (التي تعبر عن مدى عشوائية النتائج أو دقتها)

والقسم الثاني  هو المكان الذي ستحدد فيه الموجه الأولي لوكيلك

معظم التعديلات ستتم عن طريق تغيير نص الموجه ودرجة حرارة النموذج.

الخطوة6. إعداد قاعدة المعرفة من خلال ملف CSV 

إذا كنت ترغب في إضافة المزيد من المعرفة المحددة جدًا للسياق الخاص بك في LLM، سيسمح لك ملف CSV بذلك.

حاليًا، يجب أن يحتوي ملف CSV على التنسيق التالي:

    category: فئة تلك المعرفة

    subcategory; الفئة الفرعية لتلك المعرفة

    question: العنوان أو السؤال الذي يجيب عنه المحتوى في هذا السطر

    content: المحتوى نفسه. سيتم حقنه في الموجه كلما كان هناك تشابه في مدخلات المستخدم مع التضمينات التي تم إنشاؤها بواسطة هذا المحتوى.

إليك مثالًا بسيطًا:

category,subcategory,question,content

faq,football,"ما هو فريق كرة القدم المفضل لديك","فريقي المفضل هو ريال مدريد. يخسر بعض المباريات، لكنه فريق جيد."

الخطوة7. استخدام Langchain  

في هذا الدليل، سنستخدم مثيلًا لوكيل Dialog يستند إلى LCEL من Langchain. الكود أدناه متاح في المستودع الذي استنسخته.


# For the sake of simplicity, I've removed some imports and comments

chat_model = ChatOpenAI(

    model_name="gpt-3.5-turbo",

    temperature=0,

    openai_api_key=Settings().OPENAI_API_KEY,

).configurable_fields(

    model_name=ConfigurableField(

        id="model_name",

        name="GPT Model",

        description="The GPT model to use"

    ),

    temperature=ConfigurableField(

        id="temperature",

        name="Temperature",

        description="The temperature to use"

    )

)


prompt = ChatPromptTemplate.from_messages(

    [

        (

            "system",

            Settings().PROJECT_CONFIG.get("prompt").get("prompt", "What can I help you with today?")

        ),

        MessagesPlaceholder(variable_name="chat_history"),

        (

            "system",

            "Here is some context for the user request: {context}"

        ),

        ("human", "{input}"),

    ]

)


def get_memory_instance(session_id):

    return generate_memory_instance(

        session_id=session_id,

        dbsession=next(get_session()),

        database_url=Settings().DATABASE_URL

    )


retriever = DialogRetriever(

    session = next(get_session()),

    embedding_llm=EMBEDDINGS_LLM

)


def format_docs(docs):

    return "\n\n".join([d.page_content for d in docs])


chain = (

    {

        "context": itemgetter("input") | retriever | format_docs,

        "input": RunnablePassthrough(),

        "chat_history": itemgetter("chat_history")

    }

    | prompt

    | chat_model

)


runnable = RunnableWithMessageHistory(

    chain,

    get_memory_instance,

    input_messages_key='input',

    history_messages_key="chat_history"

)

يحدد السطر الأول درجة حرارة النموذج واسمه. افتراضيًا، سيكون النموذج gpt-3.5-turbo ودرجة الحرارة 0، لكن بما أننا حددناها في ملف إعداد الموجه، سيتم تغييرها إلى gpt-4o ودرجة الحرارة 0.1.

لإرسال موجه داخل Langchain، تحتاج إلى استخدام القالب الخاص به، وهو ما نفعله بعد ذلك في مثيل ChatPromptTemplate.from_messages.

في الأسطر التي بعدها نحدد الذاكرة، وكيف يجب استهلاكها ومثيل المسترجع (حيث سنحصل على بياناتنا المخصصة).

الخطوة 8. استخدام GPT-4o في محتواك

بعد هذا الإعداد حان الوقت لتشغيل تطبيقنا واختباره. للقيام بذلك، فقط قم بكتابة أمر التشغيل التالي:

docker-compose up --build

مع هذا الأمر، يجب أن يكون docker قيد التشغيل بعد بناء الصورة.

بعد أن تشير السجلات إلى: Application startup complete.، انتقل إلى متصفحك وضع العنوان الذي استخدمته لاستضافة API الخاص بك، في الحالة الافتراضية، هو: [http://localhost:8000](http://localhost:8000).

كل ما عليك هو الانتقال إلى تويثق نقطة النهاية ask/، وملء JSON بالرسالة التي تريد طرحها على GPT وستحصل على الإجابة التي ولدها النموذج لك.

كيفية استخدام نقطة النهاية ask/

نقطة النهاية ask/ هي واجهة برمجية (API endpoint) تتيح للمستخدمين إرسال استفساراتهم إلى النموذج اللغوي (مثل GPT-4o) والحصول على إجابات منه. في السياق الذي تحدثنا عنه، يتم استخدام نقطة النهاية /ask للتفاعل مع التطبيق الذي تم إعداده باستخدام talkdai/dialog.

عليك بداية إعداد الطلب (Request) أي إرسال طلب HTTP POST إلى نقطة النهاية /ask مع بيانات الاستفسار. يجب أن يحتوي الطلب على JSON يتضمن الرسالة أو السؤال الذي تريد طرحه على النموذج.

ثم عليك تنسيق الطلب بتنسيق JSON ويحتوي عادة على الحقل "message" الذي يحمل السؤال أو الرسالة. مثال على ذلك:

   {

       "message": "من فتح الأندلس"

   }

أنت جاهز الآن للتفاعل مع النموذج فعند استلام الطلب، يقوم النموذج بمعالجة الرسالة باستخدام نهج RAG (استرجاع المعلومات وتوليد الإجابة) لإعطاء إجابة مفصلة بناءً على قاعدة المعرفة المتاحة والمعلومات التي يمكنه توليدها 

أخيرًا تأتي مرحلة استلام الرد (Response) فبعد معالجة الطلب، يرسل النموذج الرد بتنسيق JSON يحتوي على الإجابة عن السؤال. وهذا مثال على الرد:

   {

       "response": "فتح الأندلس تم بقيادة القائد المسلم طارق بن زياد في عام 711 ميلادي. قاد طارق بن زياد جيشًا من المسلمين عبر مضيق جبل طارق، الذي سمي لاحقًا باسمه، من شمال إفريقيا إلى شبه الجزيرة الإيبيرية."

   }

افترض أنك قمت بتشغيل التطبيق على جهازك المحلي باستخدام Docker، وأن التطبيق يعمل على المنفذ 8000. يمكنك إرسال طلب إلى نقطة النهاية ask/ باستخدام cURL أو أي أداة أخرى مشابهة:

curl -X POST http://localhost:8000/ask -H "Content-Type: application/json" -d '{"message": "  من فتح الأندلس؟"}'

سيكون الرد من النموذج بشكل JSON  كما وضحت سابقًا. 


الخاتمة

تعرفت في مقال اليوم على طريقة تنفيذ نهج RAG باستخدام النموذج الجديد GPT-4o من OpenAI وكيفية البدء في إعداد حسابك على OpenAI والحصول على مفتاح API، بالإضافة إلى استخدام نهج Langchain على منصة talkdai/dialog وتطبيق GPT-4o في توليد المحتوى.

Next Post Previous Post
No Comment
Add Comment
comment url