AIパーソナル・ラーニング
と実践的なガイダンス
豆包Marscode1

マイクロソフトAIエージェント入門講座:デザインパターンを使った(呼び出す)ツール

ツールが興味深いのは、AIインテリジェンスに幅広い能力を持たせることができるからだ。ツールを追加することで、AIインテリジェンスは実行できる操作が限定されなくなり、多種多様な操作を実行できるようになる。この章では、AIインテリジェンスが目標を達成するために特定のツールをどのように使用できるかを説明する「ツール使用デザイン・パターン」について検討する。

簡単

このコースでは、次のような疑問に答えたい:

  • ツール使用のデザインパターンとは?
  • どのようなユースケースに適用できるのか?
  • このデザイン・パターンを実装するために必要な要素/ビルディング・ブロックは何か?
  • デザインパターンを使用して信頼できるAIインテリジェンスを構築するためのツールを使用する際に、特に考慮すべき点は何か?

学習目標

このコースを修了すると、以下のことができるようになります:

  • ツールによるデザインパターンの使用とその目的を定義する。
  • ツール使用設計パターンが適用されるユースケースを特定する。
  • このデザイン・パターンを実装するために必要な主要要素を理解する。
  • このデザインパターンを使用する際に、AIインテリジェンスの信頼性を確保するための考慮事項を認識する。

 

ツール使用のデザインパターンとは?

デザインパターンを使用するためのツール ラージ・ランゲージ・モデル(LLM)に、特定の目標を達成するために外部ツールと相互作用する能力を与えることに重点を置いている。ツールとは、インテリジェンスがアクションを実行するために実行できるコードである。ツールは単純な関数(電卓など)であったり、サードパーティ・サービス(株価検索や天気予報など)へのAPIコールであったりする。AIインテリジェンスのコンテキストでは、ツールはインテリジェンスが次のようなアクションに応じて実行するように設計されている。 モデル生成のための関数呼び出し.

 

どのようなユースケースに適用できるのか?

AIインテリジェンスは、ツールを使って複雑なタスクを実行したり、情報を取得したり、意思決定を行ったりすることができる。Tool Usageデザイン・パターンは、データベース、ウェブ・サービス、コード・インタプリタなど、外部システムとの動的なインタラクションを必要とするシナリオで通常使用される。この機能は、以下のようなさまざまなユースケースで役立ちます:

  • 動的情報検索: Intelligentsiaは、外部のAPIやデータベースに最新のデータを照会することができます(例えば、データ分析のためにSQLiteデータベースに照会し、株価や天気情報を取得します)。
  • コードの実行と解釈: Intelligentsiaは、コードやスクリプトを実行して、数学的な問題を解いたり、レポートを生成したり、シミュレーションを実行したりすることができます。
  • ワークフローの自動化: タスクスケジューラ、メールサービス、データパイプラインなどのツールを統合することで、反復的なワークフローや複数ステップのワークフローを自動化します。
  • カスタマーサポート Intelligentsiaは、CRMシステム、ワークオーダープラットフォーム、またはナレッジベースと相互作用して、ユーザーからの問い合わせを解決することができます。
  • コンテンツの作成と編集 インテリジェンシアは、文法チェッカー、テキスト要約ツール、コンテンツ・セキュリティ評価ツールなどのツールを活用して、コンテンツ作成作業を支援します。

 

デザイン・パターンを利用するためのツールを実装するには、どのような要素/ビルディング・ブロックが必要か?

これらのビルディング・ブロックによって、AIインテリジェンスは多種多様なタスクを実行できるようになる。デザイン・パターンを使ったツールの実装に必要な主要要素を見てみよう:

  • 関数/ツール呼び出しこれは、大規模言語モデル(LLM)がツールと相互作用するための主な方法である。関数やツールは、インテリジェンスがタスクを実行するために使用する、再利用可能なコードのブロックである。単純な関数(電卓など)であったり、サードパーティのサービス(株価検索や天気予報など)へのAPIコールであったりする1 。
  • 動的情報検索インテリジェンスは、外部のAPIやデータベースに最新のデータを問い合わせることができる。これは、データ分析、株価や気象情報の取得などのタスクに便利です1。
  • コードの実行と解釈インテリジェンティアは、コードやスクリプトを実行して、数学的な問題を解いたり、レポートを作成したり、シミュレーションを実行したりすることができます 1.
  • ワークフローの自動化これは、タスクスケジューラー、メールサービス、データパイプラインなどのツールを統合することで、反復的または複数ステップのワークフローを自動化することである1。
  • カスタマーサポートインテリジェンスは、CRMシステム、ワークオーダープラットフォーム、またはナレッジベースと相互作用して、ユーザーからの問い合わせを解決することができる 1.
  • コンテンツの作成と編集:インテリジェンシアは、文法チェッカー、テキスト要約ツール、コンテンツセキュリティアセッサーなどのツールを活用して、コンテンツ作成作業を支援します。.

次に、関数やツールの呼び出しについて詳しく見てみよう。

関数/ツール呼び出し

関数呼び出しは、ラージ・ランゲージ・モデル(LLM)がツールと相互作用できるようにする主な方法です。ファンクション」(再利用可能なコードブロック)は、インテリジェンスがタスクを実行するために使用する「ツール」であるため、「ファンクション」と「ツール」はしばしば同じ意味で使われます。ツール」。関数のコードを呼び出すには、ラージ・ランゲージ・モデル(LLM)がユーザーのリクエストと関数の記述を比較しなければならない。この目的のために、すべての利用可能な関数記述を含むスキーマがLLMに送信されます。次に、ラージ言語モデル(LLM)は、タスクに最も適した関数を選択し、その名前とパラメータを返します。選択された関数は呼び出され、その応答がラージ言語モデル(LLM)に送り返され、ラージ言語モデル(LLM)はこの情報を使ってユーザーのリクエストに応答する。


インテリジェンスのファンクション・コールを実装する開発者には、それが必要だ:

  1. 関数コールをサポートする大規模言語モデル(LLM)モデル
  2. 機能説明を含むパターン
  3. 記述された各機能のコード

ある都市の現在時刻を取得する例で説明しよう:

  1. 関数呼び出しをサポートする大規模言語モデル(LLM)を初期化する:
    すべてのモデルが関数呼び出しをサポートしているわけではないので、使用している大規模言語モデル(LLM)がサポートしているかどうかを確認することが重要です。Azure OpenAI 関数呼び出しのサポート。Azure OpenAI クライアントの初期化から始めましょう。

    # Initialize the Azure OpenAI client
    client = AzureOpenAI(
    azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
    api_version="2024-05-01-preview"
    )
    
  2. 関数パターンの作成::
    次に、関数の名前、関数の機能の説明、関数のパラメータの名前と説明を含むJSONスキーマを定義する。そして、このスキーマを、先に作成したサンフランシスコの時刻を検索するクライアントへのユーザーのリクエストと一緒に渡します。ここで重要なのは ツールコールよりも 質問に対する最終的な答え前述したように、ラージ・ランゲージ・モデル(LLM)は、タスクのために選んだ関数の名前と、その関数に渡される引数を返します。
# Function description for the model to read
tools = [
{
"type": "function",
"function": {
"name": "get_current_time",
"description": "Get the current time in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name, e.g. San Francisco",
},
},
"required": ["location"],
},
}
}
]
# Initial user message
messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
# First API call: Ask the model to use the function
response = client.chat.completions.create(
model=deployment_name,
messages=messages,
tools=tools,
tool_choice="auto",
)
# Process the model's response
response_message = response.choices[0].message
messages.append(response_message)
print("Model's response:")  
print(response_message)
Model's response:
ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_pOsKdUlqvdyttYB67MOj434b', function=Function(arguments='{"location":"San Francisco"}', name='get_current_time'), type='function')])
  1. タスクを実行するために必要な関数のコード:
    大規模言語モデル(LLM)が実行する必要のある関数を選択したので、タスクを実行するコードを実装して実行する必要があります。Pythonで現在時刻を取得するコードを実装すればよい。また、最終的な結果を得るために、response_messageから名前とパラメータを抽出するコードを書く必要がある。

    def get_current_time(location):
    """Get the current time for a given location"""
    print(f"get_current_time called with location: {location}")  
    location_lower = location.lower()
    for key, timezone in TIMEZONE_DATA.items():
    if key in location_lower:
    print(f"Timezone found for {key}")  
    current_time = datetime.now(ZoneInfo(timezone)).strftime("%I:%M %p")
    return json.dumps({
    "location": location,
    "current_time": current_time
    })
    print(f"No timezone data found for {location_lower}")  
    return json.dumps({"location": location, "current_time": "unknown"})
    
    # Handle function calls
    if response_message.tool_calls:
    for tool_call in response_message.tool_calls:
    if tool_call.function.name == "get_current_time":
    function_args = json.loads(tool_call.function.arguments)
    time_response = get_current_time(
    location=function_args.get("location")
    )
    messages.append({
    "tool_call_id": tool_call.id,
    "role": "tool",
    "name": "get_current_time",
    "content": time_response,
    })
    else:
    print("No tool calls were made by the model.")  
    # Second API call: Get the final response from the model
    final_response = client.chat.completions.create(
    model=deployment_name,
    messages=messages,
    )
    return final_response.choices[0].message.content
    
    get_current_time called with location: San Francisco
    Timezone found for san francisco
    The current time in San Francisco is 09:24 AM.
    

関数呼び出しは、(すべてではないにせよ)ほとんどのスマート・ボディ・ツールの使用設計の中核をなすものだが、ゼロからそれを実装するのは時に困難な場合がある。私たちが レッスン2 我々が学んだように、Agenticフレームワークは、ツールの使用を可能にするために、あらかじめ構築されたビルディングブロックを提供してくれる。

 

Agenticフレームワークを使用したツールの使用例

ここでは、さまざまなエージェントフレームワーク実装ツールでデザインパターンを使用する方法の例をいくつか紹介する:

セマンティック・カーネル

Semantic Kernelは、大規模言語モデル(LLM)を使用する.NET、Python、Java開発者のためのオープンソースのAIフレームワークです。大規模言語モデル(LLM)を使用する.NET、Python、Java開発者のためのオープンソースのAIフレームワークです。 連載 プロセスは自動的に関数とその引数をモデルに記述し、関数呼び出しのプロセスを単純化します。また、モデルとあなたのコード間の前後の通信も処理します。Semantic Kernelのようなエージェントフレームワークを使うもう一つの利点は、以下のようなあらかじめ構築されたツールにアクセスできることです。 ドキュメント検索 歌で応える コードインタープリター.

次の図は、セマンティック・カーネルを使った関数呼び出しのプロセスを示している:

微软 AI Agent 入门课程:工具使用(调用)设计模式-1

セマンティック・カーネルでは、関数/ツールは次のように呼ばれる。 隔てるピース。これを行うには、先ほど見たものを get_current_time 関数をクラスにインポートし、その関数をそのクラスに配置することで、プラグインに変換することができる。また kernel_function デコレータを使用します。その後、GetCurrentTimePluginを使用してカーネルを作成すると、カーネルは自動的に関数とその引数をシリアライズし、プロセスのLarge Language Model(LLM)に送信するスキーマを作成します。

from semantic_kernel.functions import kernel_function
class GetCurrentTimePlugin:
async def __init__(self, location):
self.location = location
    @kernel_function(
description="Get the current time for a given location"
)
def get_current_time(location: str = ""):
...
from semantic_kernel import Kernel
# Create the kernel
kernel = Kernel()
# Create the plugin
get_current_time_plugin = GetCurrentTimePlugin(location)
# Add the plugin to the kernel
kernel.add_plugin(get_current_time_plugin)

Azure AIエージェントサービス

Azure AI Agent Serviceは、開発者が基盤となるコンピューティングやストレージリソースを管理することなく、高品質でスケーラブルなAIインテリジェンスを安全に構築、デプロイ、拡張できるように設計された新しいエージェントフレームワークである。エンタープライズグレードのセキュリティを備えたフルマネージドサービスであるため、エンタープライズアプリケーションに特に有用である。

Azure AI Agent Serviceは、Large Language Model (LLM) APIで直接開発するよりも、以下のようないくつかの利点があります:

  • ツール呼び出しの自動化 - ツール呼び出しの解析、ツールの呼び出し、レスポンスの処理は必要ありません!
  • データの安全な管理 - ダイアログの状態を自分で管理するのではなく、必要な情報をすべてスレッドに保存することができます。
  • すぐに使えるツール - Bing、Azure AI Search、Azure Functionsなどのデータソースとやり取りするために使用できるツール。

Azure AI Agent Serviceで利用できるツールは、2つのカテゴリーに分けられる:

  1. 知識ツール:
    • 基本的な処理のためのBing検索の使用
    • ドキュメント検索
    • Azure AIサーチ
  2. 操作ツール:
    • 関数呼び出し
    • コードインタープリター
    • OpenAIが定義するツール
    • Azure Functions

エージェント・サービスでは、これらのツールを次のように組み合わせて使用することができます。 toolset.また threads 特定の会話のメッセージ履歴を追跡する。

あなたは株式会社コントーソの販売代理店だとします。あなたは、販売データに関する質問に答えることができる対話エージェントを開発したいと考えています。

次の図は、Azure AI Agent Serviceを使って販売データを分析する方法を示しています:

微软 AI Agent 入门课程:工具使用(调用)设计模式-2

これらのツールのいずれかをサービスで使用するには、クライアントを作成し、ツールまたはツールセットを定義する。これを実際に行うには、以下のPythonコードを使用する。ラージ・ランゲージ・モデル(LLM)はツールセットを見て、ユーザーが作成した関数を使うかどうかを決めることができる。 fetch_sales_data_using_sqlite_query あるいは、ユーザーの要求に応じて、あらかじめ組み込まれたコード・インタープリター。

import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from fecth_sales_data_functions import fetch_sales_data_using_sqlite_query # fetch_sales_data_using_sqlite_query function which can be found in a fetch_sales_data_functions.py file.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool
project_client = AIProjectClient.from_connection_string(
credential=DefaultAzureCredential(),
conn_str=os.environ["PROJECT_CONNECTION_STRING"],
)
# Initialize function calling agent with the fetch_sales_data_using_sqlite_query function and adding it to the toolset
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset = ToolSet()
toolset.add(fetch_data_function)
# Initialize Code Interpreter tool and adding it to the toolset. 
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset = ToolSet()
toolset.add(code_interpreter)
agent = project_client.agents.create_agent(
model="gpt-4o-mini", name="my-agent", instructions="You are helpful agent", 
toolset=toolset
)

 

デザインパターンを使用して信頼できるAIインテリジェンスを構築するためのツールを使用する際に、特に考慮すべき点は何か?

大規模言語モデル(LLM)のために動的に生成されるSQLの一般的な問題は、セキュリティ、特にSQLインジェクションやデータベースの削除や改ざんなどの悪意のある操作のリスクです。これらの懸念は正当なものですが、データベースのアクセス権を適切に設定することで効果的に軽減することができます。ほとんどのデータベースでは、データベースを読み取り専用に設定します。PostgreSQLやAzure SQLのようなデータベースサービスでは、アプリケーションに読み取り専用(SELECT)ロールを割り当てる必要があります。

セキュアな環境でアプリケーションを実行することで、保護はさらに強化される。企業のシナリオでは、データは運用システムから抽出され、ユーザーフレンドリーなスキーマを持つ読み取り専用のデータベースやデータウェアハウスに変換されることが多い。このアプローチにより、データの安全性が確保され、パフォーマンスとアクセシビリティが最適化され、アプリケーションの読み取り専用アクセスが制限されます。

無断転載を禁じます:チーフAIシェアリングサークル " マイクロソフトAIエージェント入門講座:デザインパターンを使った(呼び出す)ツール
ja日本語