現在、ローカル大規模モデルを試す同学がますます増えています。ひとつにはコスト削減、もうひとつにはデータをより制御しやすいからです。では、Ollama のセルフホストモデルを MAF(Microsoft Agents Framework) に接続して、本当に「会話できる」Agent を作りたい場合、どうすればよいのでしょうか?
この記事では、翻訳 Agent の小さな例を使って、考え方を一歩ずつ解説し、すぐに動かせるように手助けします。
全体の考え方を先に明確にする
このケースでやっていることは、実はとてもシンプルです。
- ローカルで Ollama を使ってモデルを実行する(たとえば ministral-3)
- OllamaSharp を通してローカルモデルに接続する
- さらに MAF の AIAgent でラップする
- 最後に RunStreamingAsync でストリーミング形式のチャット出力を実現する
ひと言でまとめると、Ollama がモデルを担当し、MAF が Agent 機能を担当し、コードがその両者をつなぐ、ということです。
準備作業
コードを書く前に、まず次のものを準備する必要があります。
Ollama のインストールと起動
ローカルに Ollama がすでにインストールされており、正常にアクセスできることを確認してください。
同時に、次のようにモデルをすでに取得していることも確認します。
ollama pull ministral-3
Ollama には多くのモデルがあります。自分のハードウェア性能に応じて、適切なモデルを選んで使用できます。
プロジェクトに必要な NuGet パッケージ
サンプルコードでは、次のコアライブラリを使用しています。
- OllamaSharp
- Microsoft.Agents.AI
- Microsoft.Extensions.AI
完全なコード例
以下のコードは、そのまま最小限の Chat サンプルとして見ることができます。重要なポイントはすべてコメントに示しています。
using Azure.AI.OpenAI;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
using OllamaSharp;
using System.ClientModel;
class Program
{
static async Task Main()
{
// 1. Ollama ベースの翻訳 Agent を作成する
var translatorAgent = CreateOllamaAgent();
// 2. 実際の会話入力を1回シミュレーションする
// 前半は日本語の内容、後半は中国語の指示
var content = """
環境省の調査によると、花粉を飛散させるスギの雄花の芽の数は、今シーズンは全国26の道府県で過去の平均値よりも多くなっています。
特に北海道や大阪など9の道府県では平均の2倍から3倍以上の多さだということで、早めの対策の徹底を呼びかけています。
-----
上記の日本語を中国語に翻訳してください。
""";
// 3. ストリーミング方式で Agent を実行する
// モデルが生成するのに合わせて、ここで逐次出力する
await foreach (var responseUpdate in translatorAgent.RunStreamingAsync(content))
{
Console.Write(responseUpdate);
}
}
/// <summary>
/// Ollama ベースの AIAgent を作成する
/// </summary>
static AIAgent CreateOllamaAgent()
{
// Ollama ローカルサービスのアドレス
var ollamaEndpoint = "http://localhost:11434";
// 使用するモデル名(事前に pull が必要)
var ollamaModel = "ministral-3:latest";
// OllamaSharp を通じて Chat Client を作成する
// その後、AsAIAgent で MAF の AIAgent にラップする
var agent = new OllamaApiClient(ollamaEndpoint, ollamaModel)
.AsAIAgent(new ChatClientAgentOptions
{
// Agent の名前
Name = "Translator",
// Agent 全体の説明(メタ情報寄り)
Description = "一人の専門的なキャリアコーチAIアシスタントとして、文脈に基づいて親切かつ忍耐強く質問に答える。",
// Chat 関連の設定
ChatOptions = new ChatOptions
{
// ここは本質的に System Prompt
// Agent の役割、能力の境界、出力ルールを定義する
Instructions = """
あなたは専門の翻訳者です。源言語と目標言語に精通しており、優れた言語理解能力と表現能力を備えています。
あなたの任務は:
私が提供するテキストを【源言語】から正確かつ明瞭に【目標言語】へ翻訳することです。
翻訳要件:
- 原文の意味に忠実で、情報を漏らさず、追加せず、曲解しないこと
- 逐語訳ではなく、目標言語の表現習慣に合った自然で流暢な表現にすること
- 原文の語調とスタイル(正式、口語、学術、ビジネスなど)を保持すること
- 固有名詞、技術用語、人名、地名は正確に翻訳するか原文のまま保持すること(必要に応じて括弧で説明を付ける)
- 要約、説明、言い換えは行わず、翻訳結果のみを出力すること
出力形式:
- 翻訳後のテキストのみを出力し、余分な説明は一切追加しないこと
"""
}
});
return agent;
}
}
実行結果は以下のとおりです。
[画像]
(Translated by GPT)
元のリンク:https://mp.weixin.qq.com/s/RXVcMtPoSHKSRNj5xJNB6g?token=84678518&lang=zh_CN&wt.mc_id=MVP_325642