🦙

Microsoft Agent Framework(Python)をollama+GPT-OSSで試してみる

に公開

Microsoft Agent Framework(Python)をollama+GPT-OSSで試してみる

サムネイル

Microsoft Agent Frameworkとは

Microsoft Agent Frameworkは、AIエージェントを用いたワークフローを構築するためのライブラリです。
似たようなライブラリにセマンティックカーネルAutoGenがありますが、Agent Frameworkはこれらの知見を元に改良・拡張された新しいフレームワークになります。

主に Azure OpenAI や Azure AI Foundry といった Microsoft 製のモデルを利用することを前提としていますが、仕組み自体は柔軟であり、Azure 以外の LLM(大規模言語モデル)とも接続可能です。
今回は、その柔軟性を活かして、ローカル環境で動作する OpenAI 互換 LLM ― ollama + GPT-OSS-20b ― を組み合わせて試してみたいと思います。

インストール方法

  • 環境: Python >= 3.11
  • ollama + gpt-oss:20b (インストール方法は、こちらを参考。)
  1. 以下のコマンドでライブラリをインストールします。
pip install agent-framework

これで準備完了です。

ollama用ChatClientの設定

まずは、ollama 用の ChatClient を設定します。
Agent Framework は OpenAI 互換 API に対応しているため、OpenAIChatClient を使うことで簡単に接続できます。

from agent_framework.openai import OpenAIChatClient


def ollama_chat_client():
    chat_client = OpenAIChatClient(
        api_key="ollama", # ollamaにはAPI keyが無いので、ダミー値でOK
        model_id="gpt-oss:20b", #ollamaでpullしたモデル名を指定
        base_url="http://localhost:11434/v1"
    )
    return chat_client

わずか数行で接続設定が完了します。

シンプルなチャット応答を試す

接続確認を兼ねて、まずは基本的なチャット応答を実装してみましょう。

import asyncio
from agent_framework import ChatAgent

async def main():
    agent = ChatAgent(
        chat_client=ollama_chat_client(),
        instructions="""
        筋肉3原則
        1. 筋肉は負荷なくして成長しない。
        2. 筋肉は休息なくして回復しない。
        3. 筋肉は栄養なくして維持されない。
        """
    )

    result = await agent.run("上記を短い言葉で要約して")
    print(result)

asyncio.run(main())

出力例:

筋肉は「負荷・休息・栄養」の3要素が揃って初めて成長・回復・維持できる。

ChatAgentクラスに、先ほど定義したollama_chat_client()を渡します。
実際のチャットメッセージについては、instructions引数に値を入力します。
これで基本動作の確認ができました。

.create_agent()を使ったエージェント生成

もう少しシンプルに書きたい場合は、create_agent() メソッドを使って直接エージェントを生成することも可能です。

import asyncio

async def main():
    agent = ollama_chat_client().create_agent(
        instructions="あなたは世界最高峰のボディビルのトレーナーです",
        name="Trainer"
    )
    result = await agent.run("世界一の筋肉系エンジニアになるための心得を教えてください。")
    print(result.text)

asyncio.run(main())

.create_agent()関数を用いることで、エージェントの即時生成が可能です。スクリプトがより簡潔になるため、こちらの方がシンプルかも知れません。
また、上述の例は、非ストリーミング出力ですが、run_stream()メソッドを使うことで、streamingでの出力も可能です。
その場合には、for文を用いて、適宜出力させる処理を入れます。

async def main():
    async for update in agent.run_stream("世界一の筋肉系エンジニアになるための心得を教えてください。"):
        if update.text:
            print(update.text, end="", flush=True)
    print()

asyncio.run(main())

リアルタイム応答を表示できるため、インタラクティブなチャットUIとの相性も良好です。

関数ツール(Function Calling)の利用

さて、AIエージェントの重要な機能とも言える「関数ツールの使用」を試してみましょう。
Agent Framework では、関数を明示的に登録してエージェントから呼び出せるようにできます。
関数またはそのパラメーターに関する追加の説明をエージェントに提供する必要がある場合は、Python の型注釈と Annotated と Pydantic の Field を使用して説明を用意しておくと良いでしょう。
また、ai_functionデコレーターを使用して、関数の名前と説明を明示的に指定することも可能です。

from agent_framework import ai_function

@ai_function(name="bench_press_tool", description="ベンチプレスのMAX重量を回答する")
def get_bench_max_weight(
    person_name: Annotated[str, Field(description="ベンチプレスのMAXを回答するトレーニーの名前")],
) -> str:
    return f"{person_name}のベンチプレスのMAX重量は120kgです。"

上記のように、関数を定義したら、次は、エージェントを作成します。
この際に、toolsパラメーターに関数を引き渡すことで、エージェントが関数を呼び出しできるようになります。

agent = ollama_chat_client().create_agent(
    instructions="You are a helpful assistant",
    name="John",
    tools=get_bench_max_weight)


async def main():
    result = await agent.run("筋肉太郎さんのベンチプレスのMAX重量はいくつですか?")
    print(result.text)

asyncio.run(main())

出力例:

筋肉太郎さんのベンチプレスのMAX重量は120kgです。

モデルがツールの呼び出しを自動的に判断し、関数経由で回答を生成していることがわかります。

まとめ

今回は、Microsoft Agent Framework を、ollamaで試してみました。
OpenAI互換APIを採用しているため、ローカルLLM環境でも問題なく動作することが確認できたと思います。

実際に試してみると、Agent Frameworkは、設計が直感的で非常に使いやすいです。設定やエージェント生成も数行で完結しますし、構成の一貫性も高いと感じました。

また驚いたのは、GPT-OSS:20b が関数呼び出し(function calling)を想定通りに実行できたことです。多くのローカルLLMや中規模モデルでは関数呼び出し時の構文やパラメータ解釈が不安定なことが多いのですが、このモデルは非常に安定しており、指示への忠実度も高い点が印象的でした。

軽量な構成で LLM エージェントを動かしてみたい開発者には、非常に有用な選択肢になるでしょう。

Discussion