0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第三篇:Ollama を使って MAF のチャットケースを構築する

0
Posted at

現在、ローカル大規模モデルを試す同学がますます増えています。ひとつにはコスト削減、もうひとつにはデータをより制御しやすいからです。では、Ollama のセルフホストモデルを MAF(Microsoft Agents Framework) に接続して、本当に「会話できる」Agent を作りたい場合、どうすればよいのでしょうか?

この記事では、翻訳 Agent の小さな例を使って、考え方を一歩ずつ解説し、すぐに動かせるように手助けします。

全体の考え方を先に明確にする

このケースでやっていることは、実はとてもシンプルです。

  1. ローカルで Ollama を使ってモデルを実行する(たとえば ministral-3)
  2. OllamaSharp を通してローカルモデルに接続する
  3. さらに MAF の AIAgent でラップする
  4. 最後に 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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?