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 (インストール方法は、こちらを参考。)
- 以下のコマンドでライブラリをインストールします。
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