تنفيذ التخزين المؤقت للمطالبة باستخدام LangChain لبناء تطبيقات LLM فعَّالة

مؤلف

Shalini Harkar

Lead AI Advocate

ما المقصود بالتخزين المؤقت للمطالبات؟

يُعَد التخزين المؤقت للمطالبات طريقة لتخزين ثم إعادة استخدام الاستجابات الناتجة عن المطالبات التي تم تنفيذها عند العمل مع النماذج اللغوية مثل IBM Granite. إذا تكرَّر نفس الإدخال (المطالبة)، فبدلًا من إجراء استدعاء جديد لواجهة API، سيسترجع التطبيق الاستجابة المخزَّنة مسبقًا في ذاكرة التخزين المؤقت للمطالبات.

فكِّر في التخزين المؤقت للمطالبات كنوع من "الذاكرة" للتطبيق. يحتفظ النظام بنتائج الاستعلامات السابقة لتوفير وقت المعالجة من خلال عدم الاضطرار إلى تكرار الطلبات للإدخال نفسه.

لماذا يُعَد مهمًا؟

يُعَد تخزين المطالبات مهمًا لأنه يتجنَّب تكرار استدعاءات واجهة برمجة التطبيقات (API) من خلال إعادة استخدام الاستجابات الموجودة للمطالبات المتكررة المتطابقة. تؤدي هذه القدرة إلى وقت استجابة أسرع، ومخرجات متسقة، واستخدام أقل لواجهة برمجة التطبيقات، ما يساعد على البقاء ضمن حدود المعدل. كما تساعد على توسيع نطاق التدفق وتحقيق المرونة أثناء الانقطاعات. يُعد تخزين المطالبات ميزة أساسية تضيف قيمة لأي تطبيق ذكاء اصطناعي فعَّال من حيث التكلفة، وعالي الكفاءة، وسهل الاستخدام.

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

  1. تحتاج إلى حساب IBM Cloud لإنشاء مشروع watsonx.ai.

  2. تحتاج أيضًا إلى إصدار Python 3.12.7.

الخطوات 

الخطوة 1: إعداد البيئة.

رغم توفُّر عدة أدوات للاختيار منها، يُرشدك هذا الدليل خلال خطوات إعداد حساب IBM لاستخدام Jupyter Notebook.

  1. سجِّل الدخول إلى watsonx.ai باستخدام حساب IBM Cloud الخاص بك.

  2. أنشئ مشروع watsonx.ai. يمكنك الحصول على معرِّف المشروع من داخل مشروعك. انقر على علامة التبويب الإدارة (Manage)، ثم انسخ معرِّف المشروع من قسم التفاصيل (Details) في صفحة عام (General). ستحتاج إلى هذا المعرِّف في هذا البرنامج التعليمي.

  3. أنشئ Jupyter Notebookتفتح هذه الخطوة بيئة Jupyter Notebook حيث يمكنك نسخ الكود من هذا البرنامج التعليمي. وبدلًا من ذلك، يمكنك تنزيل هذا الدفتر إلى نظامك المحلي ورفعه إلى مشروعك في watsonx.ai كأصل. لعرض المزيد من برامج IBM® Granite التعليمية، تفضَّل بزيارة مجتمع IBM Granite.

الخطوة 2: إعداد مثيل watsonx.ai Runtime ومفتاح واجهة برمجة التطبيقات.

  1. أنشئ مثيل خدمة watsonx.ai Runtime (اختَر خطة Lite، وهي مثيل مجاني).

  2. أنشئ مفتاح واجهة برمجة التطبيقات.

  3. اربط مثيل خدمة watsonx.ai Runtime بالمشروع الذي أنشأته في watsonx.ai.

الخطوة 3. تثبيت الحزم.

نحن بحاجة إلى المكتبات للعمل باستخدام إطار العمل langchain وWatsonxLLM. لنبدأ أولًا بتثبيت الحزم المطلوبة. تم بناء هذا البرنامج التعليمي باستخدام Python 3.12.7.

ملاحظة: إذا كنت تستخدم إصدارًا قديمًا من pip، يمكنك استخدام الأمر pip install --upgrade pip لتسهيل تثبيت أحدث الحزم التي قد لا تكون متوافقة مع الإصدارات القديمة. أما إذا كنت تستخدم بالفعل أحدث إصدار أو أجريتَ مؤخرًا ترقية للحِزَم، فيمكنك تخطي هذا الأمر.

!pip install -q langchain langchain-ibm langchain_experimental langchain-text-splitters langchain_chroma transformers bs4 langchain_huggingface sentence-transformers

الخطوة 4: استيراد المكتبات المطلوبة.

تُستخدم وحدة نظام التشغيل للوصول إلى متغيرات البيئة، مثل بيانات اعتماد المشروع أو مفاتيح واجهة برمجة التطبيقات.

يُعَد WatsonxLLLM وحدة نمطية من langchain_ibm تدمج IBM Watson LLM لتوليد مخرجات من نماذج الذكاء الاصطناعي التوليدي.

تُتيح ChatWatsonx التفاعلات القائمة على الدردشة باستخدام IBM watsonx من خلال LangChain.

يتم استخدام SimpleDirectoryReader لتحميل وقراءة المستندات من دليل للفهرسة باستخدام LlamaIndex.

يحتوي GenParams على مفاتيح بيانات وصفية مخصصة لضبط مَعلمات توليد النصوص في Watsonx.

يُتيح SQLiteCache إعداد قاعدة بيانات محلية باسم ‎.cache.db‎ باستخدام SQLite لتفادي استدعاءات API المكررة وتسريع التطوير والاختبار.

نحن بحاجة إلى عدد قليل من المكتبات والوحدات لهذا البرنامج التعليمي. تأكَّد من استيراد المكتبات التالية، وإذا لم تكن مثبَّتة، يمكنك تثبيتها بسرعة باستخدام pip.

import os
import getpass
import requests
import random
import json
from typing import Dict, List
from langchain_ibm import WatsonxLLM
from ibm_watsonx_ai.metanames import GenTextParamsMetaNames as GenParams
from langchain_ibm import WatsonxLLM
from langchain_ibm import ChatWatsonx
from llama_index.core import SimpleDirectoryReader

الخطوة 5: قراءة البيانات النصية.

from llama_index.core import SimpleDirectoryReader

documents = SimpleDirectoryReader(
input_files=["~/Artificial Intelligence/Generative_AI/files/FIle2.txt"],
).load_data()

document_text = documents[0].text
print(document_text[:200] + "...")

الخطوة 6: إعداد بيانات الاعتماد.

يضبط هذا الكود بيانات الاعتماد للوصول إلى واجهة برمجة تطبيقات IBM Watson Machine Learning (WML) ويضمن تكوين معرِّف المشروع بشكل صحيح.

  • يتم إنشاء بيانات اعتماد القاموس باستخدام عنوان URL لخدمة WML ومفتاح واجهة برمجة التطبيقات. يتم جمع مفتاح واجهة برمجة التطبيقات بشكل آمن باستخدام getpass.getpass لتجنُّب الكشف عن المعلومات الحساسة.
  • يحاول الكود جلب PROJECT_ID من متغيّرات البيئة باستخدام os.environ. إذا لم يتم العثور على PROJECT_ID، تتم مطالبة المستخدم بإدخاله عبر إدخال.
credentials = {
"url": "https://us-south.ml.cloud.ibm.com", # Replace with the correct region if needed
"apikey": getpass.getpass("Please enter your WML API key (hit enter): ")
}

# Set up project_id
try:
project_id = os.environ["PROJECT_ID"]
except KeyError:
project_id = input("Please enter your project_id (hit enter): ")

الخطوة 7: تهيئة النموذج اللغوي الكبير.

يُهيئ IBM Watson LLM للاستخدام في التطبيق:

  1. يُنشئ هذا الكود نسخة من WatsonxLLM باستخدام نموذج ibm/granite-3-8b-instruct (Granite-3.1-8B-Instruct) المصمم لمهام الذكاء الاصطناعي التوليدي القائمة على التعليمات.
  2. يتم استخدام قيم url وapikey وproject_id من بيانات الاعتماد التي تم إعدادها سابقًا للمصادقة والاتصال بخدمة IBM Watson LLM.
  3. يضبط مَعلمة max_new_tokens لتقييد عدد الرموز المميزة التي يولِّدها النموذج في كل استجابة (2,000 رمز مميز في هذه الحالة).

لمعرفة المزيد عن مَعلمات النموذج مثل الحد الأدنى والحد الأقصى للرموز المميزة، راجِع الوثائق.

llm = WatsonxLLM(
model_id= "ibm/granite-3-8b-instruct",
url=URL,
apikey=WATSONX_APIKEY,
project_id=WATSONX_PROJECT_ID,
params={
GenParams.DECODING_METHOD: "greedy",
GenParams.TEMPERATURE: 0,
GenParams.MIN_NEW_TOKENS: 5,
GenParams.MAX_NEW_TOKENS: 2000,
GenParams.REPETITION_PENALTY:1.2,
GenParams.STOP_SEQUENCES: ["\n\n"]
}
)

الخطوة 8: إعداد ذاكرة التخزين المؤقت SQLite لاستجابات LLM أسرع.

تُعَد SQLiteCache أداة تخزين مؤقت دائم من LangChain، تخزِّن استجابات استدعاءات LLM في ملف قاعدة بيانات SQLite. تعمل SQLiteCache على تقليل وقت استخدام وحدة المعالجة المركزية بذكاء عبر تخزين العمليات الحسابية المكلفة، ما يعني أنها تركِّز على استرجاع البيانات بدلًا من إعادة حسابها. بدلًا من إعادة تنفيذ العملية بأكملها، تسحب فقط النتائج من القرص، ما يجعلها أكثر كفاءة وموثوقية وقابلية لإعادة الاستخدام.

سير عمل التخزين المؤقت للمطالبات

يوضح الشكل كيف يتم تحميل النتائج فورًا من القرص عند استخدام التخزين المؤقت للمطالبات، أما في غيابه فإن كل استعلام يستهلك وقتًا في حسابات زائدة.

from langchain.cache import SQLiteCache
from langchain.globals import set_llm_cache
set_llm_cache(SQLiteCache(database_path=".langchain.db"))
%%time
prompt = "System: You are a helpful assistant.\nUser: Why did Paul Graham start YC?\nAssistant:"
resp = llm.invoke(prompt)
print(resp)

في هذه الحالة عمِلت وحدة المعالجة المركزية لمدة 22 ميللي ثانية فقط، لكن الزمن الفعلي المنقضي كان 1.43 ثانية.

يُشير هذا المثال إلى أن معظم الوقت قد تم استهلاكه في الانتظار، ويرجَّح أن ذلك كان بسبب عمليات الإدخال والإخراج (مثل قراءة وكتابة القرص، أو الوصول إلى الشبكة، أو استدعاء واجهة برمجة التطبيقات).

الآن، دعنا نشغِّل النموذج مرة ثانية مع المطالبة ونرى وقت الاستجابة.

%%time
llm.predict(resp)

من الواضح أنه باستخدام SQLiteCache، تم استخدام وحدة المعالجة المركزية لمدة 7.26 ميللي ثانية فقط، في حين كان زمن التنفيذ الكلي 6.15 ثوانٍ.

يُشير هذا بوضوح إلى حظر التبعيات الخارجية (مثل انتظار استجابة من الخادم).

الخاتمة

يُسهم التخزين المؤقت للمطالبات في تسريع طلبات واجهة برمجة التطبيقات إلى النماذج اللغوية الكبيرة مثل GPT-4o، وتقليل تكلفتها. تخزِّن المطالبات في الذاكرة محتوى مثل الرموز المميزة للإدخال والرموز المميزة للإخراج والتضمينات والرسائل من المستخدم أو مطالبات النظام أو مخرجات وظيفة، والتي أصبحت الآن تُستَخدم من المحتوى المخزَّن بدلًا من طلبات الشبكة لإصدار جديد. توفِّر هذه الطريقة تسعيرًا أقل، وزمن انتقال أفضل، ومؤشرات أداء رئيسية محسَّنة.

يمكن أن يكون التخزين المؤقت المطالبات مفيدًا لروبوتات المحادثة وأنظمة RAG والضبط الدقيق ومساعدي التعليمات البرمجية. ستُسهم استراتيجية التخزين المؤقت الفعَّالة التي تتضمن وظائف مثل القراءة من الذاكرة المؤقتة والكتابة إليها ورسالة النظام والتحكم في التخزين المؤقت وتحديد زمن صلاحية مناسب (TTL) في تحسين معدلات النجاح في التخزين المؤقت وتقليل معدلات الإخفاق.

إن الاستخدام المتسق لرموز المطالبة نفسها وبادئة المطالبة وتعليمات النظام، يساعد على ضمان أداء ثابت للمطالبات في المحادثات متعددة الأدوار والطلبات اللاحقة. سواء أكنت تستخدم Python أم حزمة SDK أم تعمل مع OpenAI أم مزوِّد آخر، فإن فهم آلية عمل التخزين المؤقت للمطالبات سيمكِّنك بشكل أفضل من تطبيقه في العديد من حالات الاستخدام.

حلول ذات صلة
®IBM® watsonx.ai

تدريب الذكاء الاصطناعي التوليدي والتحقق من صحته وضبطه ونشره، وكذلك قدرات نماذج الأساس والتعلم الآلي باستخدام IBM watsonx.ai، وهو استوديو الجيل التالي من المؤسسات لمنشئي الذكاء الاصطناعي. أنشئ تطبيقات الذكاء الاصطناعي في وقت قصير وباستخدام جزء بسيط من البيانات.

استكشف watsonx.ai
حلول الذكاء الاصطناعي

استفِد من الذكاء الاصطناعي في عملك بالاستعانة بخبرة IBM الرائدة في مجال الذكاء الاصطناعي ومحفظة حلولها التي ستكون بجانبك.

استكشف حلول الذكاء الاصطناعي
الاستشارات والخدمات في مجال الذكاء الاصطناعي

تساعد خدمات IBM Consulting AI في إعادة تصور طريقة عمل الشركات باستخدام حلول الذكاء الاصطناعي من أجل النهوض بأعمالها.

استكشف خدمات الذكاء الاصطناعي
اتخِذ الخطوة التالية

باستخدام الذكاء الاصطناعي، يكشف IBM Concert عن رؤى مهمة حول عملياتك ويقدم توصيات خاصة بالتطبيق من أجل التحسين. اكتشف كيف يمكن لمنصة Concert تعزيز نمو أعمالك.

استكشف Concert® استكشف حلول أتمتة عمليات الأعمال