milvus-logo
LFAI
フロントページへ
  • 統合

Mistral、Milvus、Llamaエージェントによるマルチエージェントシステム

このノートブックの目的

このノートブックでは、様々なアイデアを探求する:

  • 1️⃣ Milvusにデータを格納する:高速な類似検索やAIアプリケーションのために設計された効率的なベクトルデータベースであるMilvusにデータを格納する方法を学ぶ。

  • 2️⃣ llama-indexをMistralモデルと組み合わせてデータクエリに使う: llama-indexとMistralモデルを組み合わせてMilvusに保存されたデータをクエリする方法を学ぶ。

  • 3️⃣ 自動データ検索・読み込みエージェントの作成: ユーザークエリに基づいて自動的にデータを検索・読み込みできるエージェントを構築します。これらの自動化されたエージェントは、迅速かつ正確なレスポンスを提供し、手作業による検索作業を軽減することで、ユーザーエクスペリエンスを向上させます。

  • 4️︓ユーザークエリに基づくメタデータフィルタリングエージェントの開発: ユーザークエリからメタデータフィルタを⾃動⽣成するエージェントを実装する。

  • ᔍ まとめ このノートブックの終わりには、堅牢で効率的なデータ検索システムを構築するために、Milvus、llama-indexとllama-agents、Mistralモデルの使い方を包括的に理解していることでしょう。

Milvus

Milvus はオープンソースのベクトルデータベースで、ベクトル埋め込みと類似検索でAIアプリケーションを強化します。

このノートブックでは、Milvusの軽量版であるMilvus Liteを使用します。

Milvus Liteを使えば、ベクトル類似性検索を使ったAIアプリケーションを数分で作り始めることができます!Milvus Liteは以下の環境で動作します:

  • Jupyter Notebook / Google Colab
  • ラップトップ
  • エッジデバイス

image.png 画像.png

llama-エージェント

llama-agents はエージェントをマイクロサービスとして動作させることができる。これにより、サービスのスケールアップやスケールダウンが可能になる。

ラマインデックス

LlamaIndex は LLM アプリケーションのためのデータフレームワークです。以下のようなツールを提供します:

  • データコネクタは既存のデータをネイティブなソースとフォーマットから取り込みます。
  • データインデックスは、LLMが利用しやすくパフォーマンスの高い中間表現でデータを構造化します。
  • エンジンは、データへの自然言語アクセスを提供します。
  • エージェントは、シンプルなヘルパー機能からAPI統合など、ツールによって強化されたLLM搭載のナレッジワーカーです。

image.png image.png

ミストラルAI

Mistral AIはLLMとエンベッディング・モデルを構築している研究ラボで、最近Mistral NemoとMistral Largeという新バージョンのモデルをリリースしました。そのため、このノートブックではMistral NemoとMistral Largeを使います。

依存関係のインストール

$ 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のAPIキーを取得する

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 システムに非常に適しています。詳細はMistral DocumentationのEmbeddingのページを参照してください。

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は最大128kトークンの大きなコンテキストウィンドウを提供する。その推論、世界知識、コーディングの精度は、そのサイズのカテゴリーでは最先端である。

from llama_index.llms.ollama import Ollama

Settings.llm = Ollama("mistral-nemo")

Milvusをインストールしてデータをロードする。

Milvusは、高性能でスケーラブルなベクトル類似性検索でAIアプリケーションを強化する、人気のあるオープンソースのベクトルデータベースである。

  • uriをローカルファイル、例えば./milvus.db に設定するのが最も便利な方法です。このファイルにはMilvus Liteが自動的に利用され、すべてのデータが保存されます。
  • もし100万ベクトル以上の大規模なデータがある場合、DockerやKubernetes上でより高性能なMilvusサーバを構築することができます。このセットアップでは、サーバのURI、例えばhttp://localhost:19530 をURIとして使用してください。
  • MilvusのフルマネージドクラウドサービスであるZilliz Cloudを利用する場合は、Zilliz CloudのPublic EndpointとAPI Keyに対応するuriとtokenを調整してください。
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)

ツールの定義

効果的なエージェントを構築するための重要なステップの1つは、タスクを実行するために使用できるツールを定義することです。これらのツールは、基本的にエージェントが情報を取得したりアクションを実行するために呼び出すことができる関数やサービスです。

以下では、エージェントが2021年からのLyftとUberの財務情報を照会するために使用できる2つのツールを定義します。これらのツールはエージェントに統合され、自然言語によるクエリに正確で関連性のある情報で応答できるようになります。

一番上のグラフを見ると、これが「エージェントサービス」です。

# 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 、上で定義したものよりも汎用的である。上で定義したものでは、企業(UberとLyft)ごとにツールを持っていたが、今回はより汎用的である。メタデータ・フィルタリングを追加することで、特定の文書からのデータ取得のみをフィルタリングすることができる。

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'>

関数呼び出し

Mistral NemoとLargeはネイティブの関数呼び出しに対応しています。LlamaIndexのツールとは、llmのpredict_and_call 関数を通してシームレスに統合されています。これにより、ユーザーは任意のツールをアタッチすることができ、どのツールを呼び出すかは(もしあれば)LLMが決定します。

エージェントについての詳細はllama-indexウェブサイトをご覧ください。

# Set up the LLM we will use for Function Calling

llm = Ollama(model="mistral-nemo")

エージェントと対話する

それでは、メタデータフィルタリングを実際に使ってみましょう:

  1. 最初の例では、ユーザーのクエリがUberに関するものであるため、エージェントは何も見つけることができないはずです。
  2. 2つ目では、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.

この例では、システムはUberの代わりにLyftに関する情報を誤って提供し、誤解を招くような応答をしています。まず、その情報は持っていないと言いますが、その後延々と続きます。

メタデータフィルターを抽出するエージェントの使用

この問題に対処するために、ユーザーの質問からメタデータフィルタを自動的に抽出し、質問の回答プロセス中に適用するエージェントを使用することができます。これにより、システムは正しく関連性のある情報を確実に取得します。

コード例

以下は、ユーザの質問からメタデータフィルタを抽出するエージェントを使用して、フィルタリングクエリエリエンジンを作成する方法を示すコード例です:

説明

  • プロンプトテンプレートPromptTemplateクラスは、ユーザの質問からメタデータフィルタを抽出するためのテンプレートを定義するために使用されます。このテンプレートは言語モデルに会社名、年、その他の関連する属性を考慮するように指示します。

  • LLM: Mistral Nemoは、ユーザーの質問に基づいてメタデータフィルタを生成するために使用されます。モデルには質問とテンプレートが入力され、関連するフィルターが抽出されます。

  • メタデータフィルター: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 LargeはMistralのフラッグシップモデルで、非常に優れた推論、知識、コーディング機能を備えています。大規模な推論能力を必要とする複雑なタスクや、高度に専門化されたタスクに最適です。高度な関数呼び出し機能を備えており、様々なエージェントのオーケストレーションにまさに必要なものです。

なぜよりスマートなモデルが必要なのか?

以下に回答する質問は、首尾一貫した正確な回答を提供するために、複数のサービスとエージェントのオーケストレーションが必要であるため、特に困難です。これには、様々なツールやエージェントを調整して、異なるソース、例えば異なる会社の財務データから情報を取得し、処理することが含まれます。

何がそんなに難しいのか?

  • 複雑さだ:この問題には、それぞれが独自の機能とデータソースを持つ複数のエージェントとサービスが関わっている。これらのエージェントがシームレスに連携するように調整するのは複雑な作業だ。
  • データの統合:この問題では、異なるソースからのデータを統合する必要があり、データ形式、構造、メタデータが異なるため、困難が伴う。

  • 文脈の理解:この質問では、異なる情報間のコンテキストと関係を理解する必要があります。

なぜMistral Largeがこのような場合に役立つのでしょうか?

Mistral Largeは高度な推論機能と関数呼び出し機能を備えているため、このタスクに適しています。どのように役立つかは以下の通りです:

  • 高度な推論:Mistral Large は複雑な推論タスクを処理できるので、複数のエージェントやサービスのオーケストレーションに最適です。異なる情報間の関係を理解し、情報に基づいた意思決定を行うことができます。

  • 関数呼び出し機能:Mistral Large は、異なるエージェントのアクションを調整するのに不可欠な、高度な関数呼び出し機能を持っています。これにより、様々なサービスのシームレスな統合とオーケストレーションが可能になります。

  • 専門知識:Mistral Large は高度に専門化されたタスクのために設計されており、深いドメイン知識を必要とする複雑なクエリを処理するのに適しています。

これらの理由から、ここではMistral Nemoの代わりにMistral Largeを使う方が適していると判断しました。

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."}}]

結論

このノートブックでは、llama-agents を使って適切なツールを呼び出し、様々なアクションを実行する方法を見てきました。Mistral Large と Mistral Nemo を組み合わせることで、異なる LLM の強みを活かして、インテリジェントでリソース効率の高いシステムを効果的にオーケストレーションする方法を示しました。エージェントは、ユーザが要求したデータを含むコレクションを選ぶことができました。