هندسة المطالبات مع DSPy

Joshua Noble

Data Scientist

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

وتكمن قوة DSPy في أنها تستخدم الذكاء الاصطناعي التوليدي لإنشاء نصوص طبيعية، ثم اختبار النتائج لإنشاء أكثر المطالبات فاعلية. يُتيح لك هذا إنشاء نظام ذكاء اصطناعي محسَّن ذاتيًا. وهو يدعم مجموعة متنوعة من الواجهات لنماذج الاسترجاع والنماذج اللغوية. يمكنك تشغيل النماذج محليًا من خلال أنظمة مثل ollama أو huggingface أو يمكنك تشغيلها باستخدام واجهة برمجة تطبيقات إذا كنت تستخدم ChatGPT أو GPT-4 من OpenAI. يدعم DSPy مجموعة واسعة من حالات الاستخدام مثل سلسلة الأفكار (CoT) والتوليد المعزز بالاسترجاع (RAG) بالإضافة إلى التلخيص. 

في هذا البرنامج التعليمي، سوف تتعرف على سير العمل لإنشاء تطبيق إجابة عن أسئلة قائم على RAG باستخدام DSPy على IBM watsonx. ستستخدم Llama 3 كنموذج لُغوي وColberT كنموذج الاسترجاع. سيمكِّنك DSPy من ضبط المطالبات والمساعدة على تنظيم عدة أساليب مختلفة للإجابة عن الأسئلة، لاكتشاف كيفية الحصول على إجابات أفضل حتى مع الأسئلة المعقدة جدًا.

إعداد بيئتك.

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

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

أنشئ مشروع watsonx.ai.

يمكنك الحصول على معرِّف المشروع من داخل مشروعك.

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

بعد ذلك، أنشئ Jupyter Notebook في البيئة التي تختارها. ستنسخ الكود من هذا البرنامج التعليمي إلى دفتر الملاحظات الجديد. وبدلًا من ذلك، يمكنك تنزيل هذا الدفتر من GitHub إلى نظامك المحلي وتحميله إلى مشروع watsonx.ai الخاص بك كأصل.

إعداد مثيل خدمة Watson Machine Learning ومفتاح واجهة برمجة التطبيقات.

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

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

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

تثبيت مكتبة DSPy وإعداد بيانات الاعتماد الخاصة بك.

لاستخدام DSP، عليك إجراء تثبيت pip بسيط. ستثبِّت أيضًا dotenv لإدارة متغيرات بيئتك:

!pip install dspy-ai python-dotenv;

بعد ذلك، ستستورد المكتبات اللازمة لبقية هذا البرنامج التعليمي:

import dspy
from dspy import LM
from dspy.datasets import HotPotQA
from dspy.teleprompt import BootstrapFewShot
import json
import os

from dotenv import load_dotenv
load_dotenv(os.getcwd()+’/.env’, override=True)

لتعيين بيانات الاعتماد الخاصة بك، تحتاج إلى WATSONX_APIKEY وPROJECT_ID التي أنشأتها في الخطوة 1. يمكنك تخزينها في ملف .env في الدليل الخاص بك أو استبدال نص العنصر النائب. يمكنك أيضًا تعيين عنوان URL الذي يعمل كنقطة نهاية لواجهة برمجة التطبيقات.

os.environ[‘WX_URL’] = “https://us-south.ml.cloud.ibm.com”
os.environ[‘WX_APIKEY’] = os.getenv(“WATSONX_APIKEY”, “”)

WATSONX_APIKEY= os.getenv(“WATSONX_APIKEY”, “”)
PROJECT_ID = os.getenv(“PROJECT_ID”,””)

استخدام watsonx مع DSPy

الآن، ستعمل على تكوين dSpy للعمل مع نماذج watsonx مع فئة dSpy LM. تُتيح لك هذه الفئة استدعاء واجهات برمجة تطبيقات watsonx لإنشاء مطالبات جديدة وإنشاء ردود على تلك المطالبات التي يمكنك اختبارها. في الخلفية، تستخدم DSPy مكتبة أخرى تُسمَّى LiteLLM للوصول إلى خدمات watsonx. توفِّر LiteLLM غلافًا بسيطًا لاستدعاء مجموعة واسعة جدًا من واجهات برمجة التطبيقات للنماذج اللغوية الكبيرة باستخدام صيغة OpenAI، بما في ذلك Hugging Face وAzure وwatsonx.

قبل أن تتمكن من الوصول إلى حسابك في watsonx، تحتاج إلى تخزين رمز مميز من خدمة watsonx مع مفتاح واجهة برمجة التطبيقات الذي أنشأته في الخطوة الأولى. استدعِ مكتبة os للوصول إلى "https://iam.cloud.ibm.com/identity/token"، واسترجِع رمزك المميز واحفظه لاستخدامه لاحقًا.

token = os.popen(‘curl -k -X POST \
    --header “Content-Type: application/x-www-form-urlencoded” \
    --header “Accept: application/json” \
    --data-urlencode “grant_type=urn:ibm:params:oauth:grant-type:apikey” \
    --data-urlencode “apikey=’ + WATSONX_APIKEY + ‘” \
    “https://iam.cloud.ibm.com/identity/token”’).read()

الآن يمكنك إنشاء مثيل LanguageModel الذي يستخدم watsonx.  استخدِم الرمز المميز الذي استرجعته سابقًا كمفتاح واجهة برمجة التطبيقات وسنستخدم نموذج "llama-3-8b-instruct" من Meta كالنموذج اللغوي الخاص بك. يمكنك تمرير المسار إلى هذا النموذج إلى DSPy لاستخدامه كنموذج لغوي مع درجة الحرارة التي تريد أن يستخدمها النموذج اللغوي. يتوفر مزيد من المعلومات حول تكوين LiteLLM لاستخدام watsonx في وثائق GitHub. في هذه الحالة، يمنحك 0.7 بعض الإبداع دون هلوسة.

lm = dspy.LM(‘watsonx/meta-llama/llama-3-8b-instruct’, api_key=WATSONX_APIKEY, api_base=”https://us-south.ml.cloud.ibm.com”)

dspy.configure(lm=lm, trace=[], temperature=0.7, experimental=True)

إضافة نموذج استرجاع

بعد ذلك، يتم تحميل نموذج الاسترجاع الذي يمثل الجزء R من نظام RAG. استخدِم ColberTV2 لتحميل المقتطفات من مجموعة بيانات Wikipedia 2017. يُعَد ColBERT نموذج استرجاع سريعًا ودقيقًا، يمكِّن من إجراء بحث قابل للتوسع يعتمد على BERT عبر مجموعات نصية كبيرة خلال عشرات المللي ثانية. يُعَد ColBERT مجرد أحد الخيارات العديدة التي يمكن استخدامها لاسترجاع المعلومات من قاعدة بيانات متجهات. ويمكن مقارنته بقواعد بيانات المتجهات الأخرى مثل Qdrant أو Milvus أو Pinecone أو Chroma أو Weaviate.

ستحتوي قاعدة بيانات المتجهات على مجموعة محددة من المعلومات التي يمكن للنموذج اللغوي الوصول إليها بسرعة. في هذه الحالة، ستستخدم مجموعة من الملخصات من Wikipedia 2017 لتوفير مجموعة واسعة من الحقائق لنموذجك اللغوي لاستخدامه في التوليد. هذا المزيج من ColBERT ومجموعة بيانات Wiki 17 مفيد أيضًا بشكل خاص لأن نسخة من هذه المجموعة مستضافة مجانًا من قِبَل فريق DSPy ليستخدمها أي شخص. فهو يوفر إمكانية الوصول إلى مجموعة كبيرة من المعلومات دون الحاجة إلى استيعاب البيانات أو إعداد نظام قاعدة بيانات متجهات خاص بك. إحدى السلبيات في هذه المجموعة أن بياناتها لا تتضمن أي أحداث بعد عام 2017، لكنها تظل مفيدة جدًا لأغراض العرض والتوضيح.

إذا كنت مهتمًا بتشغيل نسخة خاصة بك من ColBERT باستخدام بياناتك الخاصة أو مجموعة بيانات محدَّثة، فالبرامج التعليمية هنا ستكون مفيدة.

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

colbertv2_wiki17_abstracts = dspy.ColBERTv2(url=’http://20.102.90.50:2017/wiki17_abstracts’)
dspy.configure(rm=colbertv2_wiki17_abstracts)

اختبار ضمان الجودة الأساسي

بعد ذلك، ستُنشئ توقيعًا يتم استخدامه للمثال الأول الخاص بك. التوقيع هو فئة تحدِّد أنواع المدخلات والمخرجات لوحدة معينة، ما يضمن التوافق بين الوحدات المختلفة في برنامج DSPy. يجمع التوقيع بين عدة مهام مثل استلام سؤال وتقديم إجابة وعرض استدلال النموذج. التوقيع الذي ستستخدمه هنا يأخذ فقط سؤالًا ويقدِّم استجابة:

class BasicQA(dspy.Signature):
    “””Answer questions with short factoid answers.”””

    question = dspy.InputField()
    answer = dspy.OutputField(desc=”often between 1 and 5 words”)

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

# Define the predictor.
generate_answer = dspy.Predict(BasicQA)

الآن، ستُنشئ سؤالًا يتطلب عدة معلومات للإجابة عنه بشكل صحيح، وتجرّبه باستخدام بنية تعتمد على نموذج لغوي فقط. ستستخدم دالة generate_answer التي أنشأتها للتو للإجابة عن السؤال.

# Call the predictor on a particular input.
test_question = “What country was the winner of the Nobel Prize in Literature in 2006 from and what was their name?”

pred = generate_answer(question=test_question)

if pred == None:
    print(“ no answer “)
else:
    # Print the input and the prediction.
    print(f”Answer: Turkey, Orhan Pamuk”)
    print(f”Predicted Answer: {pred.answer}”)

سيُظهر الكود النتيجة التالية (قد تختلف النتيجة لديك):

Answer: Turkey, Orhan Pamuk
Predicted Answer: The winner was France and the author was Orhan Pamuk.

كان Orhan Pamuk هو الفائز بجائزة نوبل للأدب عام 2006، لكنه ليس من فرنسا، وطريقة صياغة الإجابة غير صحيحة. الآن، ستعزز النموذج باستخدام الاسترجاع عبر تقنية التوليد المعزز بالاسترجاع، وسيحسِّن DSPy المطالبات لرفع مستوى الأداء.

التوليد المعزَّز بالاسترجاع (RAG)

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

في DSPy، يمكنك استخدام بنية RAG عن طريق إضافة خطوة السياق في فئة التوقيع (Signature). تجمع هذه الخطوة السياق من نموذج الاسترجاع وتضيفه إلى المطالبة إلى النموذج اللغوي على أمل الحصول على استجابة أفضل.

class GenerateAnswer(dspy.Signature):
    “””Answer questions with short factoid answers.”””

    context = dspy.InputField(desc=”may contain relevant facts”)
    question = dspy.InputField()
    answer = dspy.OutputField(desc=”often between 1 and 5 words”)

يمكن استخدام التوقيع newGenerateAnswer مع نموذج RAG الخاص بك. مرِّر GenerateAnswer إلى وحدة ChainOfThought بحيث يستخدم كلٌّ من السياق المسترجَع والسؤال والإجابة نهج سلسلة الأفكار.

كما تحدِّث دالة forward لتوليد مقاطع سياقية من RAG واستخدام هذه المقاطع السياقية لإنتاج الإجابات. ستستدعي DSPy هذه الدالة forward في كل مرة يتم فيها توليد إجابة جديدة عن سؤال، حيث تجمع السياق من مجموعة ملخصات ColBERT Wiki 17 ثم تمرره إلى النموذج اللغوي، وفي هذه الحالة Llama 3.1. مع توليد كل إجابة، سيقارن DSPy الناتج بالإجابة المرغوب فيها لضمان أن المطالبات تساعد النموذج على إنتاج الاستجابات الصحيحة.

class RAG(dspy.Module):
    def __init__(self, num_passages=3):
        super().__init__()

        self.retrieve = dspy.Retrieve(k=num_passages)
        self.generate_answer = dspy.ChainOfThought(GenerateAnswer)
   
    def forward(self, question):
        context = self.retrieve(question).passages
        prediction = self.generate_answer(context=context, question=question)
        return dspy.Prediction(context=context, answer=prediction.answer)

من أجل مساعدة DSPy على تصميم أفضل المطالبات، تحتاج إلى مجموعة بيانات اختبار يمكن استخدامها لاختبار المطالبات ثم تقييمها.

لتزويد DSPy بأسئلة اختبار، ستحمِّل مجموعة البيانات HotPotQA. تُعَد HotPotQA مجموعة بيانات للإجابة عن الأسئلة تحتوي على أسئلة طبيعية متعددة الخطوات تتطلب عدة استرجاعات واستنتاجات للوصول إلى الإجابة الصحيحة. وهي أداة رائعة لاختبار مدى جودة النماذج في توليد الحقائق الداعمة لتدريب واختبار أنظمة الإجابة عن الأسئلة الأكثر قابلية للتفسير. 

على سبيل المثال، أحد الأسئلة من مجموعة البيانات هو: "من الذي عينه الرئيس Franklin Roosevelt وكان مسؤولًا عن نقل أصوات المجمع الانتخابي إلى الكونجرس؟" يمكنك أن ترى أن هذا السؤال يتطلب عدة أجزاء من المعلومات للإجابة بشكل صحيح.

The answer is: “Robert Digges Wimberly Connor”.

يأتي السياق الداعم من صفحات Wikipedia حول Robert Digges Wimberly Connor وعن إدارة الأرشيف والسجلات الوطنية.

تم جمع ونشر مجموعة بيانات HotPotQA بواسطة فريق من باحثي معالجة اللغة الطبيعية في جامعة كارنيجي ميلون، وجامعة ستانفورد، وجامعة مونتريال. يتوفر مزيد من المعلومات حول HotPotQA في موقعهم على GitHub.

بعد تحميل مجموعة البيانات، قسِّمها إلى مجموعات تدريب واختبار. يُتيح لك هذا اختبار سلسلة الاسترجاع ومساعدة DSPy على تحديد أفضل المطالبات للنموذج اللغوي.

# Load the dataset.
dataset = HotPotQA(train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0)

# Tell DSPy that the ‘question’ field is the input. Any other fields are labels and/or metadata.
trainset = [x.with_inputs(‘question’) for x in dataset.train]
devset = [x.with_inputs(‘question’) for x in dataset.dev]

بعد ذلك، ستمهِّد المزيد من الأمثلة لإتاحة فرص أكثر لإطار عمل DSPy لإنشاء المطالبات وتقييمها. استدعاء دالة compile هو ما يستخدم كل البنية التي كوَّنتها بالإضافة إلى مجموعة بيانات HotPotQA لتوليد المطالبات واختبارها وتحقيق أفضل أداء من النموذج اللغوي الخاص بك.

  from dspy.teleprompt import BootstrapFewShot

# Validation logic: check that the predicted answer is correct.
# Also check that the retrieved context does actually contain that answer.
def validate_context_and_answer(example, pred, trace=None):
    answer_EM = dspy.evaluate.answer_exact_match(example, pred)
    answer_PM = dspy.evaluate.answer_passage_match(example, pred)
    return answer_EM and answer_PM

# Set up a basic DSPy optimizer, which will compile your RAG program.
bfs_optimizer = BootstrapFewShot(metric=validate_context_and_answer)

# Compile!
compiled_rag = bfs_optimizer.compile(RAG(), trainset=trainset)

والآن، بعد أن أنجز DSPy هندسة المطالبات نيابةً عنك، ستختبره بالسؤال المخصص حول جائزة نوبل لعام 2006 الذي استخدمته سابقًا. ونظرًا لأن نموذج الاسترجاع يستخدم مقتطفات من Wikipedia لعام 2017، فإن أداءه سيكون أفضل مع المعلومات الموجودة في تلك المجموعة من البيانات:

# Get the prediction. This contains `pred.context` and `pred.answer`.
pred = compiled_rag(test_question)

# Print the contexts and the answer.
print(f”Question: {test_question}”)
print(f”Predicted Answer: {pred.answer}”)

الآن تحصل على الإجابة الصحيحة. 

    السؤال: من أي بلد كان الفائز بجائزة نوبل للأدب عام 2006 وما اسمه؟
    الإجابة المتوقعة: تركيا، Orhan Pamuk

Orhan Pamuk من تركيا لِذا فإن هذه الإجابة صحيحة. النسخة المحوَّلة برمجيًا من DSPy لم تُجب بشكل صحيح فحسب، بل صاغت الإجابة أيضًا بطريقة صحيحة، وقدَّمت ردًا قصيرًا وواضحًا. دعنا نرَ سياق هذه الاستجابة المتوقعة لنرى كيف وصل النموذج إلى الإجابة الصحيحة:

pred.context

يُظهر هذا:

    ["Orhan Pamuk | Ferit Orhan Pamuk (generally known simply as Orhan Pamuk; born 7 June 1952) is a Turkish novelist, screenwriter, academic and recipient of the 2006 Nobel Prize in Literature. One of Turkey's most prominent novelists, his work has sold over thirteen million books in sixty-three languages, making him the country's best-selling writer.",
     '2006 Palanca Awards | The Carlos Palanca Memorial Awards for Literature winners in the year 2006 (rank, title of winning entry, name of author).',
     "Miguel Donoso Pareja | Miguel Donoso Pareja (July 13, 1931 – March 16, 2015) was an Ecuadorian writer and 2006 Premio Eugenio Espejo Award-winner (Ecuador's National Prize in literature, given by the President of Ecuador)."]

الجواب في الجزء الأول من السياق الذي تم إرجاعه. يمكنك معرفة كيفية تصميم DSPy للمطالبات المُثلى من خلال النظر إلى تاريخ النموذج اللغوي باستخدام دالة inspect_history() للنموذج اللغوي.

lm.inspect_history()

هذا السجل طويل جدًا لأنه يشمل جميع الأمثلة من عملية التجميع حيث اختبَر DSPy المطالبات التي أنشأها. يوضِّح الجزء الأخير من السجل كيف توصَّل النموذج إلى الإجابة الصحيحة وبالصياغة المناسبة:

    [[ ## context ## ]]
    [1] «Orhan Pamuk | Ferit Orhan Pamuk (generally known simply as Orhan Pamuk; born 7 June 1952) is a Turkish novelist, screenwriter, academic and recipient of the 2006 Nobel Prize in Literature. One of Turkey's most prominent novelists, his work has sold over thirteen million books in sixty-three languages, making him the country's best-selling writer.»
    [2] «2006 Palanca Awards | The Carlos Palanca Memorial Awards for Literature winners in the year 2006 (rank, title of winning entry, name of author).»
    [3] «Miguel Donoso Pareja | Miguel Donoso Pareja (July 13, 1931 – March 16, 2015) was an Ecuadorian writer and 2006 Premio Eugenio Espejo Award-winner (Ecuador's National Prize in literature, given by the President of Ecuador).»
    
    [[ ## question ## ]]
    What country was the winner of the Nobel Prize in Literature in 2006 from and what was their name?
    
    Respond with the corresponding output fields, starting with the field `[[ ## reasoning ## ]]`, then `[[ ## answer ## ]]`, and then ending with the marker for `[[ ## completed ## ]]`.
    
    
    [31mResponse:[0m
    
    [32m[[ ## reasoning ## ]]
    The text mentions the 2006 Nobel Prize in Literature and states that Orhan Pamuk, a Turkish novelist, was the winner.
    
    [[ ## answer ## ]]
    Turkey, Orhan Pamuk
    
    [[ ## completed ## ]][0m
    

يمكنك أن ترى أن DSPy استخدَم النموذج لتوليد المطالبة:

Respond with the corresponding output fields, starting with the field [[ ## reasoning ## ]] , then [[ ## answer ## ]] , and then ending with the marker for [[ ## completed ## ]] .

هذا يؤدي إلى الحصول على الإجابة الصحيحة والصياغة المناسبة.

ملخص

في هذا البرنامج التعليمي، استخدمتَ DSPy للمساعدة على الضبط الدقيق لوكيل RAG باستخدام منصة watsonx. يتكون وكيل RAG الخاص بك من نموذج لغوي، Llama 3 ونموذج استرجاع، ColBERT. ثم استخدمتَ DSPy لتنفيذ هندسة المطالبات لمهمة الإجابة عن الأسئلة من خلال تجميع النموذج الخاص بك وإنشاء مطالبة محسَّنة.

يمكنك معرفة المزيد حول DSPy في مستودع GitHub حيث يستضيفون البرامج التعليمية والعروض التوضيحية والمستندات الخاصة بها.

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

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

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

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

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

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

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

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

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