إنشاء نظام إدارة عقود متعدد الوكلاء باستخدام BeeAI وGranite

مؤلف

Anna Gutowska

AI Engineer, Developer Advocate

IBM

في هذا البرنامج التعليمي، ستعمل على بناء نظام متعدد الوكلاء محليًا بالكامل من خلال IBM Granite باستخدام BeeAI في Python. سيتعاون هؤلاء الوكلاء للتفاوض على اتفاقية تعاقدية لخدمات تنسيق الحدائق بين شركتين، مع مراعاة توجهات السوق وقيود الميزانية الداخلية. سيتكون سير العمل من وكيل مستشار الميزانية، ووكيل إنشاء العقود، ووكيل البحث على الويب، ووكيل مستشار المشتريات. بناءً على العقد وبيانات الميزانية وصناعة الخدمات وأسماء الشركات المقدَّمة من المستخدم، يتعاون الوكلاء لإعداد بريد إلكتروني للتفاوض على شروط العقد لصالح العميل.

ما BeeAI؟

BeeAI، الذي أصدرته IBM Research وتم التبرع به الآن لمؤسسة Linux، هو منصة مفتوحة المصدر للذكاء الاصطناعي الوكيل توفِّر للمطورين القدرة على بناء وكلاء الذكاء الاصطناعي من أي إطار عمل.1

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

السلف التقني لـ BeeAI هو Bee Agent Framework، وهو إطار عمل مفتوح المصدر مخصص لبناء وكلاء LLM فرديين. وعلى العكس من ذلك، يوفر BeeAI نظامًا بيئيًا أكثر تقدمًا لبناء وتنظيم مهام سير العمل متعددة الوكلاء.

يتميز BeeAI بأنه:

  • مستقل عن إطار العمل.
  • متوفر باللغتين TypeScript وPython.
  • يعتمد على بروتوكول اتصال الوكلاء (ACP) المصمم من قِبَل IBM Research، والذي يطوِّر بروتوكول سياق النموذج (MCP) من خلال توحيد آلية تواصل الوكلاء فيما بينهم. يجمع ACP الوكلاء من أطر متعددة مثل LangGraph وcrewAI وBeeAI ضمن بيئة تشغيل موحَّدة وثابتة.2
  • متكامل مع Arize Phoenix، وهي أداة مفتوحة المصدر لتتبُّع سلوك العميل، ما يُتيح إمكانية قابلية الملاحظة. يمكنك العثور على المزيد من المعلومات حول تصحيح أخطاء الوكلاء من خلال التسجيل والقياس عن بُعد المتاحَين في الوثائق الرسمية.
  • يمكن تشغيله بالكامل محليًا على جهازك. يمكن أيضًا نشر الوكلاء إلى بيئات مشتركة.
  • يوفر واجهات موحَّدة لمختلَف الوظائف، بما في ذلك الدردشة والتضمينات والمخرجات المنظمة، مثل JSON، ما يسمح بتبديل النموذج بسلاسة دون الحاجة إلى أي تغييرات في الكود الحالي.

الخطوات

يمكن العثور على هذا الدليل التفصيلي خطوة بخطوة في مستودعنا على GitHub على شكل Jupyter Notebook.

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

نحتاج أولًا إلى إعداد بيئتنا من خلال استيفاء بعض المتطلبات الأساسية.
1. في هذا البرنامج التعليمي، لن نستخدم واجهة برمجة التطبيقات (API) مثل تلك المتوفرة من خلال IBM watsonx.ai وOpenAI. بدلًا من ذلك، يمكننا تثبيت أحدث إصدار من Ollama لتشغيل النموذج محليًا.
إن أبسط طريقة لتثبيت Ollama لأنظمة التشغيل macOS وLinux وWindows هي من خلال صفحة الويب الخاصة بهم: https://ollama.com/download. ستعمل هذه الخطوة على تثبيت تطبيق شريط القوائم لتشغيل خادم Ollama في الخلفية وإبقائك مطلعًا دومًا على أحدث الإصدارات.
كبديل، يمكنك تثبيت Ollama باستخدام أداة Homebrew من خلال المحطة الطرفية لديك:

brew install ollama

في حالة التثبيت من brew، أو البناء من المصدر، تحتاج إلى تشغيل الخادم المركزي:

ollama serve

2. هناك العديد من النماذج اللغوية الكبيرة التي تدعم استدعاء الأدوات، مثل أحدث نماذج Llama من Meta ونماذج Mistral من Mistral AI. في هذا البرنامج التعليمي، سنستخدم نموذج Granite 3.3 مفتوح المصدر من IBM. يتميز هذا النموذج بقدرات استدلال متقدمة واتباع التعليمات.3 يمكنك تنزيل أحدث إصدار من نموذج من Granite 3.3 عن طريق تشغيل الأمر التالي في المحطة الطرفية.

ollama pull granite3.3:8b

3. لتجنُّب تعارض تبعيات الحزم، سنعمل على إعداد بيئة افتراضية. لإنشاء بيئة افتراضية باستخدام Python الإصدار 3.11.9، شغِّل الأمر التالي في المحطة الطرفية لديك.

python3.12 -m venv .venv

بعد ذلك، لتنشيط البيئة، شغِّل:

source .venv/bin/activate

4. يجب أن يحتوي ملف requirements.txt على الحزم التالية. هذه الحزم ضرورية لبناء الوكلاء باستخدام إطار عمل BeeAI ودمج فئات LangChain اللازمة لتهيئة الأدوات.

beeai-framework
beeai-framework[duckduckgo]
langchain-core
langchain-community
pandas

لتثبيت هذه الحزم، نفِّذ الأمر التالي في المحطة الطرفية لديك.

pip install -r requirements.txt

5. إنشاء ملف Python جديد بعنوان bee-script.py من خلال تنفيذ هذا الأمر في المحطة الطرفية لديك:

touch bee-script.py

في الجزء العلوي من ملف Python الجديد، قم بتضمين عبارات الاستيراد للمكتبات والوحدات الضرورية.

import asyncio
import pandas as pd
import os
import traceback
import sys

from beeai_framework.backend import ChatModel
from beeai_framework.tools.search.duckduckgo import DuckDuckGoSearchTool
from beeai_framework.workflows.agent import AgentWorkflow, AgentWorkflowInput
from beeai_framework.errors import FrameworkError
from beeai_framework.adapters.langchain import LangChainTool
from langchain_core.tools import StructuredTool
from typing import Any

الخطوة 2. إنشاء الوكيل وسير العمل.

في دالة رئيسية غير متزامنة باستخدام asyncio ، دعنا ندمج فئتَي ChatModel وAgentWorkflow لإنشاء نموذج Granite LLM وسير العمل الخاص بنا. يمكننا ببساطة تقديم معرف نموذج Ollama بالإضافة إلى اسم سير العمل. يُتيح لنا إنشاء سير العمل هذا إضافة الوكلاء وبناء نظام متعدد الوكلاء. أضِف هذه الدالة الرئيسية إلى ملف Python الخاص بك.

async def main() -> None:
    llm = ChatModel.from_name("ollama:granite3.3:8b")
    workflow = AgentWorkflow(name="Procurement")

للاطلاع على تمثيل مرئي لسير العمل الوكيلي، راجِع المخطط التالي.

سير العمل الوكيل لإدارة العقود سير العمل الوكيل لإدارة العقود

سنعمل على تجميع كل عنصر من عناصر سير العمل هذا في الخطوات التالية.

الخطوة 3. توجيه المستخدم للإدخال.

يعتمد سير العمل لدينا على إدخال المستخدم. الإدخالات الأولية المطلوبة هي أسماء كلٍّ من العميل والشركات المتعاقدة. سيظهر للمستخدم النص التالي عند تنفيذ سير العمل في خطوة لاحقة. أضِف الكود التالي إلى الدالة الرئيسية.

client_company = input("Please enter the client company: ") #Example: Company A
contractor_company = input("Please enter the contractor company: ") #Example: Company B

سنحتاج أيضًا إلى أسماء الملفات التي تحتوي على تقرير ميزانية شركة العميل،budget-data.csv وكذلك الملف الذي يحتوي على العقد المُبرم بين الشركتين، contract.txt . في مثالنا، يتعلق العقد بخدمات تنسيق الحدائق التي تقدمها الشركة المتعاقدة إلى شركة العميل. يمكنك العثور على نماذج الملفات في مستودع GitHub الخاص بنا. يجب أن يشبه بنية المشروع ما يلي:

├── .venv/ # Virtual environment
├── bee-script.py # The Python script
├── contract.txt # The contract
└── budget-data.csv # Client's budget report

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

client_budget_file = input(f"Enter the file name of the budget report for {client_company} (in the same directory level): ") #Example: budget_data.csv
while os.path.splitext(client_budget_file)[1].lower() != ".csv":
    client_budget_file = input(f"Budget report must be in .csv format, please try again: ")

contract_file = input(f"Enter the file name of the contract between {client_company} and {contractor_company} (in the same directory level): ") #Example: contract.txt
while os.path.splitext(contract_file)[1].lower() != ".txt":
    contract_file = input(f"Contract must be in .txt format, please try again: ")

آخر إدخال مطلوب من المستخدم هو قطاع الخدمة الموضَّحة في العقد. يمكن أن يكون هذا الإدخال متعلقًا بالمالية، أو البناء، أو غيرها.

service_industry = input(f"Enter the industry of the service described in this contract (e.g., finance, construction, etc.): ") #Example: landscaping

الخطوة 4. إعداد أداة الميزانية.

الأداة الأولى التي يمكننا تطويرها في النظام متعدد الوكلاء هي وكيل مستشار الميزانية. هذا الوكيل مسؤول عن قراءة بيانات ميزانية العميل. الدالة المقدَّمة للوكيل هيget_budget_data ، حيث تتم قراءة ملف CSV الذي يحتوي على بيانات الميزانية، ويتم عرض رسالة خطأ إذا لم يكن الملف موجودًا أو حدث خطأ غير متوقع. للوصول إلى الملف باستخدام اسم الملف الذي قدَّمه المستخدم، نحتاج أولًا إلى استرداد الدليل الحالي. يمكننا تنفيذ ذلك باستخدام الدالةos التالية.

current_directory = os.getcwd()

الآن، لنعمل على إعداد القوة الدافعة للوكيل، وهي دالة get_budget_data ، والتي تستخدم الدليل الحالي بالإضافة إلى إدخال المستخدم للوصول إلى الملف وقراءته.

def get_budget_data():
    try:
        budget = pd.read_csv(os.path.join(current_directory, client_budget_file))
    except FileNotFoundError:
        return client_budget_file + " not found. Please check correct file name."
    except Exception as e:
        return f"An error occurred: {e}"
    return budget

لضمان الاستخدام الصحيح لهذه الأداة، لنستخدم فئة StructuredTool من LangChain. هنا، نعمل على تحديد الدالة واسم الأداة ووصفها، مع ضبط مَعلمة return_direct لتكون true أو false. تحدِّد هذه المَعلمة الأخيرة ببساطة للوكيل إذا ما كان يجب إرجاع ناتج الأداة مباشرةً أم معالجته وتجميعه.

get_budget = StructuredTool.from_function(
    func=get_budget_data,
    name="GetBudgetData",
    description=f"Returns the budget data for {client_company}.",
    return_direct=True,
)

باستخدام LangChainTool، محوِّل LangChain من BeeAI، يمكننا إتمام تهيئة أداتنا الأولى.

budget_tool = LangChainTool[Any](get_budget)

الخطوة 5. إعداد أداة العقد.

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

def get_contract_data():
    try:
        with open(os.path.join(current_directory, contract_file), 'r') as file:
            content = file.read()
    except FileNotFoundError:
        return contract_file + " not found. Please check correct file name."
    except Exception as e:
        return f"An error occurred: {e}"
    return content
get_contract = StructuredTool.from_function(
    func=get_contract_data,
    name="GetContractData",
    description=f"Returns the contract details.",
    return_direct=True,
)
contract_tool = LangChainTool[Any](get_contract)

الخطوة 6. إنشاء سير العمل الوكيل.

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

workflow.add_agent(
    name="Budget Advisor",
    role="A diligent budget advisor",
    instructions="You specialize in reading internal budget data in CSV format.",
    tools=[budget_tool],
    llm=llm,
)

workflow.add_agent(
    name="Contract Synthesizer",
    role="A diligent contract synthesizer",
    instructions=f"You specialize in reading contracts.",
    tools=[contract_tool],
    llm=llm,
)

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

workflow.add_agent(
    name="Web Search",
    role="A web searcher.",
    instructions=f"You can search the web for market trends, specifically in the {service_industry} industry.",
    tools=[DuckDuckGoSearchTool()],
    llm=llm,
)

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

workflow.add_agent(
    name="Procurement Advisor",
    role="A procurement advisor",
    instructions=f"You write professional emails to {contractor_company} with convincing negotiations that factor in market trends and internal budget constraints. You represent {client_company}.",
    llm=llm,
)

الخطوة 7. تنفيذ سير العمل الوكيل.

يمكننا الآن إنهاء الطريقة الرئيسية بجميع الأكواد التي كتبناها حتى الآن. في نهاية الطريقة الرئيسية، يمكننا تضمين تنفيذ سير العمل الخاص بالوكيل. وباستخدام الكلمة المفتاحيةawait ، يمكننا إدارة تنفيذ المهام المتزامنة بكفاءة، والانتظار لإنجاز كل مهمة على حدة. يجب أن يحتوي ملف Python الخاص بك على الكود التالي.

import asyncio
import pandas as pd
import os
import traceback
import sys

from beeai_framework.backend import ChatModel
from beeai_framework.tools.search.duckduckgo import DuckDuckGoSearchTool
from beeai_framework.workflows.agent import AgentWorkflow, AgentWorkflowInput
from beeai_framework.errors import FrameworkError
from beeai_framework.adapters.langchain import LangChainTool
from langchain_core.tools import StructuredTool
from typing import Any

async def main() -> None:

    llm = ChatModel.from_name("ollama:granite3.3:8b")

    workflow = AgentWorkflow(name="Procurement Agent")

    client_company = input("Please enter the client company: ")
    contractor_company = input("Please enter the contractor company name: ")

    client_budget_file = input(f"Enter the file name of the budget report for {client_company} (in the same directory level): ")
while os.path.splitext(client_budget_file)[1].lower() != ".csv":
        client_budget_file = input(f"Budget report must be in .csv format, please try again: ")

    contract_file = input(f"Enter the file name of the contract between {client_company} and {contractor_company} (in the same directory level): ")
while os.path.splitext(contract_file)[1].lower() != ".txt":
        contract_file = input(f"Contract must be in .txt format, please try again: ")

    service_industry = input(f"Enter the industry of the service described in this contract (e.g., finance, construction, etc.): ")
current_directory = os.getcwd()
def get_budget_data():
        try:
            budget = pd.read_csv(os.path.join(current_directory, client_budget_file))
        except FileNotFoundError:
            return client_budget_file + " not found. Please check correct file name."
        except Exception as e:
            return f"An error occurred: {e}"
        return budget

    get_budget = StructuredTool.from_function(
            func=get_budget_data,
            name="GetBudgetData",
            description=f"Returns the budget data for {client_company}.",
            return_direct=True,
        )

    budget_tool = LangChainTool[Any](get_budget)

    def get_contract_data():
        try:
            with open(os.path.join(current_directory, contract_file), 'r') as file:
                content = file.read()
        except FileNotFoundError:
            return contract_file + " not found. Please check correct file name."
        except Exception as e:
            return f"An error occurred: {e}"
        return content

    get_contract = StructuredTool.from_function(
            func=get_contract_data,
            name="GetContractData",
            description=f"Returns the contract details.",
            return_direct=True,
        )

    contract_tool = LangChainTool[Any](get_contract)

    workflow.add_agent(
        name="Budget Advisor",
        role="A diligent budget advisor",
        instructions="You specialize in reading internal budget data in CSV format.",
        tools=[budget_tool],
        llm=llm,
    )

    workflow.add_agent(
        name="Contract Synthesizer",
        role="A diligent contract synthesizer",
        instructions=f"You specialize in reading contracts.",
        tools=[contract_tool],
        llm=llm,
    )

    workflow.add_agent(
        name="Web Search",
        role="A web searcher.",
        instructions=f"You can search the web for market trends, specifically in the {service_industry} industry.",
        tools=[DuckDuckGoSearchTool()],
        llm=llm,
    )

    workflow.add_agent(
        name="Procurement Advisor",
        role="A procurement advisor",
        instructions=f"You write professional emails to {contractor_company} with convincing negotiations that factor in market trends and internal budget constraints. You represent {client_company}.",
        llm=llm,
    )

    response = await workflow.run(
        inputs=[
            AgentWorkflowInput(
                prompt=f"Extract and summarize the key obligations, deliverables, and payment terms from the contract between {client_company} and {contractor_company}.",
            ),
            AgentWorkflowInput(
                prompt=f"Analyze the internal budget data for {client_company}.",
            ),
            AgentWorkflowInput(
                prompt=f"Write a formal email to {contractor_company}. In the email, negotiate the contract terms in favor of {client_company}, factoring in market trends and internal budget constraints.",
            ),
        ]
    ).on(
        "success",
        lambda data, event: print(
            f"-> Step '{data.step}' has been completed with the following outcome.\n\n{data.state.final_answer}"     
        ),
    )

    print("Final email: ")
    print(response.state.final_answer)

if __name__ == "__main__":
    try:
        asyncio.run(main())
    except FrameworkError as e:
        traceback.print_exc()
        sys.exit(e.explain())

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

python bee-script.py

استخدِم نموذج إدخال المستخدم هذا:

  • يُرجى إدخال الشركة العميل: الشركة أ.
  • يُرجى إدخال اسم شركة المقاول: الشركة ب.
  • أدخِل اسم ملف تقرير الميزانية الخاص بالشركة أ (في نفس مستوى الدليل): budget_data.csv.
  • أدخِل اسم ملف اسم العقد المبرم بين الشركة "أ" والشركة "ب" (في نفس مستوى الدليل): contract.txt.
  • أدخِل صناعة الخدمة الموصوفة في هذا العقد (على سبيل المثال، التمويل أو البناء أو غيرها): تنسيق الحدائق.

يوضِّح النص التالي مثالًا على المخرجات التي حصلنا عليها من تشغيل سير العمل متعدد الوكلاء.

المخرجات:


→ تم إكمال خطوة "مستشار الميزانية" بالنتيجة التالية.

تُظهر ميزانية الشركة أ للفترة وجود فرق إجمالي قدره -12,700 دولار أمريكي. أكبر الفروقات كانت في رواتب الموظفين (-5,000 دولار أمريكي)، والإعلانات عبر الإنترنت (-3,000 دولار أمريكي)، والإعلانات المطبوعة (-2,000 دولار أمريكي)، وأعمال الصيانة والإصلاحات (-1,000 دولار أمريكي). كما توجد فروقات أصغر في الإيجار والكهرباء والمياه والتنسيق والبستنة وخدمات النظافة. → تم إكمال خطوة "أداة تجميع العقود" بالنتيجة التالية.

العقد بين الشركة أ والشركة ب مخصص لخدمات تنسيق الحدائق في ممتلكات العميل في ولاية ديلاوير. ويبلغ مجموع الدفعة التي يتعين على الشركة أ دفعها 5,500 دولار أمريكي عند الانتهاء من العمل. اتفق الطرفان على الامتثال للقوانين واللوائح المعمول بها في ولاية ديلاوير.

→ تم إكمال خطوة "البحث على الويب" بالنتيجة التالية.

الموضوع: مقترح تفاوض لخدمات تنسيق الحدائق

فريق الشركة ب العزيز،

نأمل أن تصلكم رسالتنا وأنتم بخير.

بعد مراجعة دقيقة لبيانات ميزانيتنا الداخلية وتوجهات السوق في صناعة تنسيق الحدائق، حددنا المجالات التي نرى إمكانية إجراء تعديلات فيها لتحقيق توافق أفضل مع قيودنا المالية، مع الاستمرار في الحفاظ على معايير الخدمة العالية.

  1. نطاق العمل: نقترح تقليل نطاق العمل ليتركز على الخدمات الأساسية التي تؤثِّر مباشرةً في جاذبية المبنى وقيمة العقار. قد يشمل ذلك تقليم الأشجار، وتشذيب الشجيرات، وصيانة المسطحات الخضراء، مع إضافة بعض النباتات الملونة من حين لآخر لتعزيز الجاذبية البصرية.

  2. شروط الدفع: نظرًا لتوجهات السوق الحالية التي تُشير إلى انخفاض طفيف في تكاليف تنسيق الحدائق نتيجة زيادة المنافسة، نرجو منكم إعادة النظر في إجمالي مبلغ الدفع. نقترح دفع إجمالي معدَّل قدره 4,800 دولار أمريكي عند الانتهاء من العمل، بما يعكس تخفيضًا بنسبة 12%.

  3. الجدول الزمني: لتحسين تخصيص الموارد وتقليل تعطيل عملياتنا إلى الحد الأدنى، نقترح تمديد الجدول الزمني للمشروع لمدة أسبوعين. سيُتيح لنا هذا التعديل إدارة قيود ميزانيتنا الداخلية بشكل أفضل دون المساس بجودة الخدمة.

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

نشكركم على اهتمامكم بهذا الموضوع. يُرجى إعلامنا إذا كانت هذه التعديلات المقترحة مقبولة، أو إذا كانت لديكم أي مقترحات بديلة.

مع أطيب التحيات،

[اسمك]

الشركة أ

→ تم إكمال خطوة "مستشار المشتريات" بالنتيجة التالية.

تم إرسال الإجابة النهائية إلى الشركة ب، مقترحين فيها دفع إجمالي معدَّل قدره 4,800 دولار أمريكي عند إتمام العمل، بما يعكس تخفيضًا بنسبة 12%. يشمل الاقتراح أيضًا تقليل نطاق العمل وتمديد الجدول الزمني للمشروع.

الرسالة الإلكترونية النهائية: تم إرسال الإجابة النهائية إلى الشركة ب، مقترحين فيها دفع إجمالي معدَّل قدره 4,800 دولار أمريكي عند إتمام العمل، بما يعكس تخفيضًا بنسبة 12%. يشمل الاقتراح أيضًا تقليل نطاق العمل وتمديد الجدول الزمني للمشروع.


 

من الواضح أن الوكلاء استخدموا أدواتهم المتاحة بشكل صحيح لقراءة وتجميع بيانات العقد والميزانية، ثم صياغة رسالة بريد إلكتروني فعَّالة يتم فيها التفاوض على شروط العقد لصالح العميل. يمكننا الاطلاع على مخرجات كل وكيل داخل سير العمل وعلى أهمية دور كل وكيل. تم تسليط الضوء في رسالة البريد الإلكتروني على التفاصيل الأساسية مثل نطاق أعمال تنسيق الحدائق، وشروط الدفع، والجدول الزمني للعقد. كما يمكننا ملاحظة أن التفاوض يستفيد أيضًا من توجهات السوق في مجال تنسيق الحدائق لصالح العميل. أخيرًا، يقع المبلغ الإجمالي المعدَّل المقترح في البريد الإلكتروني وقدره 4,800 دولار أمريكي ضمن ميزانية العميل لأعمال تنسيق الحدائق البالغة 5,200 دولار أمريكي. هذا يبدو رائعًا!

ملخص

من خلال هذا البرنامج التعليمي، تمكَّنت من بناء العديد من وكلاء BeeAI، كل منهم بأدوات مخصصة. أدى كل وكيل دورًا مهمًا في حالة استخدام نظام إدارة العقود. يمكن أن تتضمن بعض الخطوات التالية استكشاف مستودعات GitHub المختلفة المتاحة في مجموعة i-am-bee GitHub وبناء المزيد من الأدوات المخصصة. في المستودعات، ستجد أيضًا دفاتر ملاحظات Python التمهيدية لفهم عناصر BeeAI الأساسية بشكل أفضل، مثل PromptTemplates , Messages , الذاكرة و Emitter ، من أجل قابلية الملاحظة. 

حلول ذات صلة
تطوير وكلاء الذكاء الاصطناعي من IBM 

تمكين المطورين من إنشاء وكلاء الذكاء الاصطناعي ونشرهم ومراقبتهم باستخدام استوديو IBM watsonx.ai.

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

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

استكشِف وكلاء الذكاء الاصطناعي
IBM Granite

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

استكشف Granite
اتخِذ الخطوة التالية

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

استكشف تطوير وكلاء watsonx.ai استكشف watsonx Orchestrate