أنظمة متعددة الوكلاء مع ميسترال للذكاء الاصطناعي وميلفوس و Llama-agents
الهدف من هذا الدفتر
سنستكشف في هذا الدفتر أفكارًا مختلفة:
1️⃣ تخزين البيانات في ميلفوس: تعلم كيفية تخزين البيانات في ميلفوس، وهي قاعدة بيانات متجهة فعالة مصممة لعمليات البحث عن التشابه عالية السرعة وتطبيقات الذكاء الاصطناعي.
2️⃣ استخدام فهرس اللاما مع نماذج ميسترال للاستعلام عن البيانات: اكتشف كيفية استخدام فهرس اللاما مع نماذج ميسترال للاستعلام عن البيانات المخزنة في ملفوس.
3️⃣ إنشاء وكلاء بحث وقراءة مؤتمتة للبيانات: إنشاء وكلاء يمكنهم البحث عن البيانات وقراءتها تلقائيًا بناءً على استعلامات المستخدم. ستعمل هذه الوكلاء المؤتمتة على تحسين تجربة المستخدم من خلال تقديم استجابات سريعة ودقيقة، مما يقلل من جهد البحث اليدوي.
4️⃣ تطوير وكلاء لتصفية البيانات الوصفية استنادًا إلى استفسارات المستخدم: تنفيذ وكلاء يمكنهم إنشاء عوامل تصفية البيانات الوصفية تلقائيًا من استفسارات المستخدم، مما يؤدي إلى تنقيح نتائج البحث ووضعها في سياقها، وتجنب الالتباس وتعزيز دقة المعلومات المسترجعة، حتى بالنسبة للاستفسارات المعقدة.
🔍 ملخص بنهاية هذا الدفتر، سيكون لديك فهم شامل لاستخدام Milvus، وlama-index مع وكلاء llama، ونماذج Mistral لبناء نظام استرجاع بيانات قوي وفعال.
ميلفوس
Milvus عبارة عن قاعدة بيانات متجهة مفتوحة المصدر تعمل على تشغيل تطبيقات الذكاء الاصطناعي مع تضمينات المتجهات والبحث عن التشابه.
في هذا الدفتر، نستخدم Milvus Lite، وهو نسخة خفيفة الوزن من Milvus.
باستخدام Milvus Lite، يمكنك البدء في إنشاء تطبيق ذكاء اصطناعي مع البحث عن التشابه المتجه في غضون دقائق! ميلفوس لايت جيد للتشغيل في البيئة التالية:
- Jupyter Notebook / Google Colab
- أجهزة الكمبيوتر المحمولة
- أجهزة الحافة
image.png
لاما-وكلاء
llama-agents
يجعل من الممكن تشغيل الوكلاء كخدمات مصغرة. وهذا يجعل من الممكن توسيع نطاق الخدمات لأعلى ولأسفل.
لاما إندكس
LlamaIndex هو إطار عمل بيانات لتطبيق LLM الخاص بك. يوفر أدوات مثل:
- موصلات البيانات تستوعب بياناتك الحالية من مصدرها وتنسيقها الأصلي.
- تقوم فهارس البيانات بهيكلة بياناتك في تمثيلات وسيطة يسهل على LLMs استهلاكها وأداءها.
- توفر المحركات وصولاً لغوياً طبيعياً إلى بياناتك.
- الوكلاء هم عاملون معرفيون مدعومون بأدوات مدعومة من LLM، بدءًا من الوظائف المساعدة البسيطة إلى تكامل واجهة برمجة التطبيقات والمزيد.
image.png
ميسترال للذكاء الاصطناعي
Mistral AI هو مختبر أبحاث يقوم ببناء نماذج LLM ونماذج التضمينات، وقد أصدروا مؤخرًا إصدارات جديدة من نماذجهم، Mistral Nemo و Mistral Large التي أظهرت أنها جيدة بشكل خاص في RAG واستدعاء الدوال. ولهذا السبب، سنستخدمهما في هذه المذكرة
تثبيت التبعيات
$ pip install llama-agents pymilvus openai python-dotenv
$ pip install llama-index-vector-stores-milvus llama-index-readers-file llama-index-llms-ollama llama-index-llms-mistralai llama-index-embeddings-mistralai
# NOTE: This is ONLY necessary in jupyter notebook.
# Details: Jupyter runs an event-loop behind the scenes.
# This results in nested event-loops when we start an event-loop to make async queries.
# This is normally not allowed, we use nest_asyncio to allow it for convenience.
import nest_asyncio
nest_asyncio.apply()
احصل على مفتاح واجهة برمجة التطبيقات لـ Mistral
يمكنك الحصول على مفتاح Mistral API من وحدة التحكم السحابية لـ Mistral Cloud Console.
"""
load_dotenv reads key-value pairs from a .env file and can set them as environment variables.
This is useful to avoid leaking your API key for example :D
"""
from dotenv import load_dotenv
import os
load_dotenv()
True
تنزيل البيانات
$ mkdir -p 'data/10k/'
$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/10k/uber_2021.pdf'
$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/lyft_2021.pdf' -O 'data/10k/lyft_2021.pdf'
إعداد نموذج التضمين
نحدد نموذج التضمين الذي سيتم استخدامه في هذا الدفتر. نحن نستخدم mistral-embed
، وهو نموذج تضمين تم تطويره من قبل Mistral، وقد تم تدريبه مع وضع عمليات الاسترجاع في الاعتبار، مما يجعله نموذجًا جيدًا جدًا لنظام RAG العميل الخاص بنا. للحصول على التفاصيل، يُرجى الرجوع إلى صفحة التضمين على وثائق ميسترال.
from llama_index.core import Settings
from llama_index.embeddings.mistralai import MistralAIEmbedding
# Define the default Embedding model used in this Notebook.
# We are using Mistral Models, so we are also using Mistral Embeddings
Settings.embed_model = MistralAIEmbedding(model_name="mistral-embed")
تعريف نموذج LLM
يستخدم فهرس Llama Index نماذج LLM للرد على المطالبات والاستعلامات، وهو مسؤول عن كتابة استجابات اللغة الطبيعية. نعرّف Mistral Nemo على أنه النموذج الافتراضي. يوفر Nemo نافذة سياق كبيرة تصل إلى 128 ألف رمز. ويُعد استدلاله ومعرفته بالعالم ودقة ترميزه من أحدث ما توصلت إليه التكنولوجيا في فئته من حيث الحجم.
from llama_index.llms.ollama import Ollama
Settings.llm = Ollama("mistral-nemo")
تثبيت ميلفوس وتحميل البيانات
Milvus عبارة عن قاعدة بيانات متجهية مفتوحة المصدر شائعة وشائعة الاستخدام، تعمل على تشغيل تطبيقات الذكاء الاصطناعي من خلال بحث تشابه المتجهات عالي الأداء وقابل للتطوير.
- يعد تعيين uri كملف محلي، على سبيل المثال
./milvus.db
، الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف. - إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون متجه، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام uri الخادم، على سبيل المثال
http://localhost:19530
، كـ uri الخاص بك. - إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، قم بتعديل uri والرمز المميز، اللذين يتوافقان مع نقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات في Zilliz Cloud.
from llama_index.vector_stores.milvus import MilvusVectorStore
from llama_index.core import (
SimpleDirectoryReader,
VectorStoreIndex,
StorageContext,
load_index_from_storage,
)
from llama_index.core.tools import QueryEngineTool, ToolMetadata
input_files = ["./data/10k/lyft_2021.pdf", "./data/10k/uber_2021.pdf"]
# Create a single Milvus vector store
vector_store = MilvusVectorStore(
uri="./milvus_demo.db", dim=1024, overwrite=False, collection_name="companies_docs"
)
# Create a storage context with the Milvus vector store
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# Load data
docs = SimpleDirectoryReader(input_files=input_files).load_data()
# Build index
index = VectorStoreIndex.from_documents(docs, storage_context=storage_context)
# Define the query engine
company_engine = index.as_query_engine(similarity_top_k=3)
تحديد الأدوات
إحدى الخطوات الرئيسية في بناء وكيل فعّال هي تحديد الأدوات التي يمكنه استخدامها لأداء مهامه. هذه الأدوات هي في الأساس وظائف أو خدمات يمكن للوكيل أن يستدعيها لاسترداد المعلومات أو تنفيذ الإجراءات.
فيما يلي، سنحدد أدناه أداتين يمكن لوكيلنا استخدامهما للاستعلام عن المعلومات المالية حول ليفت وأوبر من عام 2021. سيتم دمج هذه الأدوات في وكيلنا، مما يسمح له بالرد على استعلامات اللغة الطبيعية بمعلومات دقيقة وذات صلة.
إذا نظرت إلى الرسم البياني الذي لدينا في الأعلى، فهذا هو "خدمة الوكيل".
# Define the different tools that can be used by our Agent.
query_engine_tools = [
QueryEngineTool(
query_engine=company_engine,
metadata=ToolMetadata(
name="lyft_10k",
description=(
"Provides information about Lyft financials for year 2021. "
"Use a detailed plain text question as input to the tool."
"Do not attempt to interpret or summarize the data."
),
),
),
QueryEngineTool(
query_engine=company_engine,
metadata=ToolMetadata(
name="uber_10k",
description=(
"Provides information about Uber financials for year 2021. "
"Use a detailed plain text question as input to the tool."
"Do not attempt to interpret or summarize the data."
),
),
),
]
from llama_index.llms.ollama import Ollama
from llama_index.llms.mistralai import MistralAI
# Set up the agent
llm = Ollama(model="mistral-nemo")
response = llm.predict_and_call(
query_engine_tools,
user_msg="Could you please provide a comparison between Lyft and Uber's total revenues in 2021?",
allow_parallel_tool_calls=True,
)
# Example usage without metadata filtering
print("Response without metadata filtering:")
print(response)
Response without metadata filtering:
The revenue for Lyft in 2021 was $3.84 billion.
Uber's total revenue for the year ended December 31, 2021 was $17,455 million.
تصفية البيانات الوصفية
يدعمMilvus تصفية البيانات الوصفية، وهي تقنية تتيح لك تنقيح نتائج البحث وتضييق نطاقها بناءً على سمات أو علامات محددة مرتبطة ببياناتك. يعد هذا مفيدًا بشكل خاص في السيناريوهات التي يكون لديك فيها الكثير من البيانات وتحتاج إلى استرداد المجموعة الفرعية ذات الصلة فقط من البيانات التي تطابق معايير معينة.
حالات استخدام تصفية البيانات الوصفية للبيانات الوصفية
الدقة في نتائج البحث: من خلال تطبيق فلاتر البيانات الوصفية يمكنك التأكد من أن نتائج البحث وثيقة الصلة باستعلام المستخدم. على سبيل المثال، إذا كان لديك مجموعة من المستندات المالية، يمكنك تصفيتها بناءً على اسم الشركة أو السنة أو أي بيانات وصفية أخرى ذات صلة.
الكفاءة: تساعد تصفية البيانات الوصفية في تقليل كمية البيانات التي يجب معالجتها، مما يجعل عمليات البحث أكثر كفاءة. وهذا مفيد بشكل خاص عند التعامل مع مجموعات البيانات الكبيرة.
التخصيص: قد يكون للمستخدمين أو التطبيقات المختلفة متطلبات مختلفة. تسمح لك تصفية البيانات الوصفية بتخصيص نتائج البحث لتلبية احتياجات محددة، مثل استرداد المستندات من سنة أو شركة معينة.
مثال على الاستخدام
في كتلة التعليمات البرمجية أدناه، يتم استخدام تصفية البيانات الوصفية أدناه لإنشاء محرك استعلام تمت تصفيته يسترجع المستندات بناءً على زوج محدد من البيانات الوصفية ذات القيمة الرئيسية: file_name
: lyft_2021.pdf
QueryEngineTool
المحدد أدناه هو أكثر عمومية من المحدد أعلاه، في المحدد أعلاه، كان لدينا أداة لكل شركة (أوبر وليفت)، أما في هذا المحرك فهو أكثر عمومية. نحن نعلم فقط أن لدينا مستندات مالية عن الشركات ولكن هذا كل شيء. بإضافة تصفية البيانات الوصفية (Metadata Filtering)، يمكننا بعد ذلك التصفية للحصول على البيانات من مستند معين فقط.
from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters
# Example usage with metadata filtering
filters = MetadataFilters(
filters=[ExactMatchFilter(key="file_name", value="lyft_2021.pdf")]
)
print(f"filters: {filters}")
filtered_query_engine = index.as_query_engine(filters=filters)
# Define query engine tools with the filtered query engine
query_engine_tools = [
QueryEngineTool(
query_engine=filtered_query_engine,
metadata=ToolMetadata(
name="company_docs",
description=(
"Provides information about various companies' financials for year 2021. "
"Use a detailed plain text question as input to the tool."
"Use this tool to retrieve specific data points about a company. "
"Do not attempt to interpret or summarize the data."
),
),
),
]
filters: filters=[MetadataFilter(key='file_name', value='lyft_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
استدعاء الوظائف
يدعم ميسترال نيمو وكبير استدعاء الدالة الأصلية. هناك تكامل سلس مع أدوات LlamaIndex، من خلال الدالة predict_and_call
على الدالة LLM. يتيح ذلك للمستخدم إرفاق أي أدوات والسماح لـ LLM بتحديد الأدوات التي يجب استدعاؤها (إن وجدت).
يمكنك معرفة المزيد عن الوكلاء على موقع llama-index الإلكتروني.
# Set up the LLM we will use for Function Calling
llm = Ollama(model="mistral-nemo")
التفاعل مع الوكيل
الآن يمكننا الآن تصفية البيانات الوصفية أثناء العمل:
- في الأولى، يجب ألا يتمكن الوكيل من العثور على أي شيء لاستعلام المستخدم لأنه يتعلق بأوبر ونقوم بتصفية المستندات المتعلقة بـ Lyft فقط.
- في الثانية، يجب أن يكون الوكيل قادرًا على العثور على معلومات حول Lyft لأننا سنبحث فقط في المستندات التي تتعلق بـ Lyft.
response = llm.predict_and_call(
query_engine_tools,
user_msg="How many employees does Uber have?",
allow_parallel_tool_calls=True,
)
print(response)
I'm unable to provide information about Uber's employee count as it's outside the given Lyft context.
response = llm.predict_and_call(
query_engine_tools,
user_msg="What are the risk factors for Lyft?",
allow_parallel_tool_calls=True,
)
print(response)
Investing in Lyft carries significant risks. These include general economic factors like impacts from pandemics or crises, operational factors such as competition, pricing changes, and driver/ride growth unpredictability, insurance coverage issues, autonomous vehicle technology uncertainties, reputational concerns, potential security breaches, reliance on third-party services, and challenges in expanding platform offerings. Lyft's business operations are subject to numerous other risks not explicitly mentioned here, which could also harm its financial condition and prospects.
مثال على الارتباك بدون تصفية البيانات الوصفية
> Question: What are the risk factors for Uber?
> Response without metadata filtering:
Based on the provided context, which pertains to Lyft's Risk Factors section in their Annual Report, some of the potential risk factors applicable to a company like Uber might include:
- General economic factors such as the impact of global pandemics or other crises on ride-sharing demand.
- Operational factors like competition in ride-hailing services, unpredictability in results of operations, and uncertainty about market growth for ridesharing and related services.
- Risks related to attracting and retaining qualified drivers and riders.
في هذا المثال، يقدم النظام بشكل غير صحيح معلومات عن Lyft بدلاً من Uber، مما يؤدي إلى استجابة مضللة. يبدأ النظام بالقول إنه لا يملك المعلومات ولكن بعد ذلك يستمر في البحث أكثر فأكثر.
استخدام وكيل لاستخراج مرشحات البيانات الوصفية
لمعالجة هذه المشكلة، يمكننا استخدام وكيل لاستخراج مرشحات البيانات الوصفية تلقائيًا من سؤال المستخدم وتطبيقها أثناء عملية الإجابة على السؤال. وهذا يضمن استرجاع النظام للمعلومات الصحيحة وذات الصلة.
مثال على الكود
فيما يلي مثال برمجي يوضّح كيفية إنشاء محرك استعلام تمت تصفيته باستخدام وكيل لاستخراج مرشحات البيانات الوصفية من سؤال المستخدم:
الشرح
قالب موجه: تُستخدم فئة PromptTemplate لتعريف قالب لاستخراج مرشحات البيانات الوصفية من سؤال المستخدم. يوجه القالب نموذج اللغة للنظر في أسماء الشركات والسنوات والسمات الأخرى ذات الصلة.
LLM: يُستخدم نموذجاللغة لاستخراج مرشحات البيانات الوصفية بناءً على سؤال المستخدم. تتم مطالبة النموذج بالسؤال والقالب لاستخراج المرشحات ذات الصلة.
مرشحات البيانات الوصفية: يتم تحليل الاستجابة من LLM لإنشاء كائن
MetadataFilters
. إذا لم يتم ذكر أي مرشحات محددة، يتم إرجاع كائنMetadataFilters
فارغ.محرك الاستعلام المصفى: يقوم الأسلوب
index.as_query_engine(filters=metadata_filters)
بإنشاء محرك استعلام يطبق مرشحات البيانات الوصفية المستخرجة على الفهرس. وهذا يضمن استرجاع المستندات المطابقة لمعايير التصفية فقط.
from llama_index.core.prompts.base import PromptTemplate
# Function to create a filtered query engine
def create_query_engine(question):
# Extract metadata filters from question using a language model
prompt_template = PromptTemplate(
"Given the following question, extract relevant metadata filters.\n"
"Consider company names, years, and any other relevant attributes.\n"
"Don't write any other text, just the MetadataFilters object"
"Format it by creating a MetadataFilters like shown in the following\n"
"MetadataFilters(filters=[ExactMatchFilter(key='file_name', value='lyft_2021.pdf')])\n"
"If no specific filters are mentioned, returns an empty MetadataFilters()\n"
"Question: {question}\n"
"Metadata Filters:\n"
)
prompt = prompt_template.format(question=question)
llm = Ollama(model="mistral-nemo")
response = llm.complete(prompt)
metadata_filters_str = response.text.strip()
if metadata_filters_str:
metadata_filters = eval(metadata_filters_str)
print(f"eval: {metadata_filters}")
return index.as_query_engine(filters=metadata_filters)
return index.as_query_engine()
response = create_query_engine(
"What is Uber revenue? This should be in the file_name: uber_2021.pdf"
)
eval: filters=[MetadataFilter(key='file_name', value='uber_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
## Example usage with metadata filtering
question = "What is Uber revenue? This should be in the file_name: uber_2021.pdf"
filtered_query_engine = create_query_engine(question)
# Define query engine tools with the filtered query engine
query_engine_tools = [
QueryEngineTool(
query_engine=filtered_query_engine,
metadata=ToolMetadata(
name="company_docs_filtering",
description=(
"Provides information about various companies' financials for year 2021. "
"Use a detailed plain text question as input to the tool."
),
),
),
]
# Set up the agent with the updated query engine tools
response = llm.predict_and_call(
query_engine_tools,
user_msg=question,
allow_parallel_tool_calls=True,
)
print("Response with metadata filtering:")
print(response)
eval: filters=[MetadataFilter(key='file_name', value='uber_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
Response with metadata filtering:
Uber's total revenue for the year ended December 31, 2021, is $17.455 billion.
تنسيق الخدمات المختلفة باستخدام ميسترال لارج
Mistral Large هو النموذج الرئيسي لـ Mistral مع قدرات تفكير ومعرفة وترميز جيدة جدًا. وهو مثالي للمهام المعقدة التي تتطلب قدرات استدلالية كبيرة أو عالية التخصص. لديه قدرات استدعاء دالة متقدمة، وهو بالضبط ما نحتاجه لتنسيق وكلائنا المختلفين.
لماذا نحتاج إلى نموذج أكثر ذكاءً؟
السؤال الذي تتم الإجابة عليه أدناه يمثل تحديًا خاصًا لأنه يتطلب تنسيق خدمات ووكلاء متعددين لتوفير استجابة متماسكة ودقيقة. يتضمن ذلك تنسيق أدوات ووكلاء مختلفين لاسترجاع ومعالجة المعلومات من مصادر مختلفة، مثل البيانات المالية من شركات مختلفة.
ما الصعوبة في ذلك؟
- التعقيد: يتضمن السؤال وكلاء وخدمات متعددة، لكل منها وظائفها ومصادر البيانات الخاصة بها. يعد تنسيق هذه الوكلاء للعمل معًا بسلاسة مهمة معقدة.
تكامل البيانات: يتطلب السؤال دمج البيانات من مصادر مختلفة، الأمر الذي قد يكون صعبًا بسبب الاختلافات في تنسيقات البيانات وهياكلها وبياناتها الوصفية.
الفهم السياقي: قد يتطلب السؤال فهم السياق والعلاقات بين أجزاء مختلفة من المعلومات، وهي مهمة صعبة من الناحية المعرفية.
لماذا قد يساعد ميسترال لارج في هذه الحالة؟
يعتبر Mistral Large مناسبًا تمامًا لهذه المهمة نظرًا لقدراته المتقدمة في الاستدلال واستدعاء الوظائف. إليك كيف يساعدك:
الاستدلال المتقدم: يمكن لميسترال لارج التعامل مع مهام الاستدلال المعقدة، مما يجعله مثاليًا لتنسيق العديد من الوكلاء والخدمات. يمكنه فهم العلاقات بين أجزاء المعلومات المختلفة واتخاذ قرارات مستنيرة.
قدرات استدعاء الوظائف: تتمتع Mistral Large بقدرات متقدمة لاستدعاء الوظائف، وهي ضرورية لتنسيق إجراءات الوكلاء المختلفين. وهذا يسمح بالتكامل والتنسيق السلس بين الخدمات المختلفة.
المعرفة المتخصصة: تم تصميم Mistral Large للمهام المتخصصة للغاية، مما يجعله مناسبًا تمامًا للتعامل مع الاستعلامات المعقدة التي تتطلب معرفة عميقة بالمجال.
لكل هذه الأسباب، قررت أن استخدام Mistral Large بدلاً من Mistral Nemo هو الأنسب هنا.
from llama_agents import (
AgentService,
ToolService,
LocalLauncher,
MetaServiceTool,
ControlPlaneServer,
SimpleMessageQueue,
AgentOrchestrator,
)
from llama_index.core.agent import FunctionCallingAgentWorker
from llama_index.llms.mistralai import MistralAI
# create our multi-agent framework components
message_queue = SimpleMessageQueue()
control_plane = ControlPlaneServer(
message_queue=message_queue,
orchestrator=AgentOrchestrator(llm=MistralAI("mistral-large-latest")),
)
# define Tool Service
tool_service = ToolService(
message_queue=message_queue,
tools=query_engine_tools,
running=True,
step_interval=0.5,
)
# define meta-tools here
meta_tools = [
await MetaServiceTool.from_tool_service(
t.metadata.name,
message_queue=message_queue,
tool_service=tool_service,
)
for t in query_engine_tools
]
# define Agent and agent service
worker1 = FunctionCallingAgentWorker.from_tools(
meta_tools, llm=MistralAI("mistral-large-latest")
)
agent1 = worker1.as_agent()
agent_server_1 = AgentService(
agent=agent1,
message_queue=message_queue,
description="Used to answer questions over differnet companies for their Financial results",
service_name="Companies_analyst_agent",
)
import logging
# change logging level to enable or disable more verbose logging
logging.getLogger("llama_agents").setLevel(logging.INFO)
## Define Launcher
launcher = LocalLauncher(
[agent_server_1, tool_service],
control_plane,
message_queue,
)
query_str = "What are the risk factors for Uber?"
result = launcher.launch_single(query_str)
INFO:llama_agents.message_queues.simple - Consumer AgentService-27cde4ed-5163-4005-90fc-13c158eda7e3: Companies_analyst_agent has been registered.
INFO:llama_agents.message_queues.simple - Consumer ToolService-b73c500a-5fbe-4f57-95c7-db74e173bd1b: default_tool_service has been registered.
INFO:llama_agents.message_queues.simple - Consumer 62465ab8-32ff-436e-95fa-74e828745150: human has been registered.
INFO:llama_agents.message_queues.simple - Consumer ControlPlaneServer-f4c27d43-5474-43ca-93ca-a9aeed4534d7: control_plane has been registered.
INFO:llama_agents.services.agent - Companies_analyst_agent launch_local
INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.NEW_TASK'
INFO:llama_agents.message_queues.simple - Launching message queue locally
INFO:llama_agents.services.agent - Processing initiated.
INFO:llama_agents.services.tool - Processing initiated.
INFO:llama_agents.message_queues.base - Publishing message to 'Companies_analyst_agent' with action 'ActionTypes.NEW_TASK'
INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
INFO:llama_agents.services.agent - Created new task: 0720da2f-1751-4766-a814-ba720bc8a467
INFO:llama_agents.message_queues.simple - Successfully published message 'Companies_analyst_agent' to consumer.
INFO:llama_agents.message_queues.simple - Consumer MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41: MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41 has been registered.
INFO:llama_agents.message_queues.base - Publishing message to 'default_tool_service' with action 'ActionTypes.NEW_TOOL_CALL'
INFO:llama_agents.message_queues.simple - Successfully published message 'default_tool_service' to consumer.
INFO:llama_agents.services.tool - Processing tool call id f4c270a4-bc47-4bbf-92fe-e2cc80757943 with company_docs
INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.COMPLETED_TASK'
INFO:llama_agents.message_queues.base - Publishing message to 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' with action 'ActionTypes.COMPLETED_TOOL_CALL'
INFO:llama_agents.message_queues.base - Publishing message to 'Companies_analyst_agent' with action 'ActionTypes.NEW_TASK'
INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
INFO:llama_agents.message_queues.simple - Successfully published message 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' to consumer.
INFO:llama_agents.services.agent - Created new task: 0720da2f-1751-4766-a814-ba720bc8a467
INFO:llama_agents.message_queues.simple - Successfully published message 'Companies_analyst_agent' to consumer.
INFO:llama_agents.message_queues.base - Publishing message to 'default_tool_service' with action 'ActionTypes.NEW_TOOL_CALL'
INFO:llama_agents.message_queues.simple - Successfully published message 'default_tool_service' to consumer.
INFO:llama_agents.services.tool - Processing tool call id f888f9a8-e716-4505-bfe2-577452e9b6e6 with company_docs
INFO:llama_agents.message_queues.base - Publishing message to 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' with action 'ActionTypes.COMPLETED_TOOL_CALL'
INFO:llama_agents.message_queues.simple - Successfully published message 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' to consumer.
INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.COMPLETED_TASK'
INFO:llama_agents.message_queues.base - Publishing message to 'human' with action 'ActionTypes.COMPLETED_TASK'
INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
INFO:llama_agents.message_queues.simple - Successfully published message 'human' to consumer.
print(result)
[{"name": "finalize", "arguments": {"input": "Uber faces several risk factors, including general economic impacts such as pandemics or downturns, operational challenges like competition, market growth uncertainty, attracting and retaining drivers and riders, insurance adequacy, autonomous vehicle technology development, maintaining its reputation and brand, and managing growth. Additionally, reliance on third-party providers for various services can introduce further risks to its operations."}}]
الخاتمة
في هذا الدفتر، رأيت كيف يمكنك استخدام عوامل اللاما لتنفيذ إجراءات مختلفة عن طريق استدعاء الأدوات المناسبة. من خلال استخدام ميسترال لارج مع ميسترال نيمو، أوضحنا كيفية تنظيم أنظمة ذكية وفعالة من حيث الموارد بشكل فعال من خلال الاستفادة من نقاط القوة في مختلف أدوات لاما. رأينا أن الوكيل يمكنه اختيار المجموعة التي تحتوي على البيانات التي يطلبها المستخدم.