Semantic Kernel: Phi-4 mini のツール


Phi4-mini はツールのサポートを開始しましたが、最初の試用では理想的ではありませんでした。kenfey が最近、この問題を解決するための記事を公開しました。詳細はこちらをご覧ください: [https://techcommunity.microsoft.com/blog/educatordeveloperblog/building-ai-agents-on-edge-devices-using-ollama--phi-4-mini-function-calling/4391029](https://techcommunity.microsoft.com/blog/educatordeveloperblog/building-ai-agents-on-edge-devices-using-ollama--phi-4-mini-function-calling/4391029)。この記事では、SKを使った具体的な例を詳しく説明します。

まず、ollama をインストールし、次に phi4-mini をインストールします。コマンドは以下の通りです：

```perl
ollama pull phi4-mini
```

もともと生成された phi4-mini にはツールのサポートに問題がありました。ここでは modelfile を交換する必要があります。以下のコマンドで元の modelfile を確認し、FROM のアドレス情報を取得します：

```perl
ollama show phi4-mini --modelfile
```

次に、修正済みの Modefile を保存するディレクトリを見つけてください。このファイルには拡張子がありません。

```plaintext
FROM C:\Users\axzxs\.ollama\models\blobs\sha256-3c168af1dea0a414299c7d9077e100ac763370e5a98b3c53801a958a47f0a5db
TEMPLATE """{{- if or .System .Tools }}
{{ if .System }}{{ .System }}{{ end }}{{- if .Tools }}{{- if not .System }}You may call one or more functions to assist with the user query. You are provided with function signatures.{{- end }}
[{{- range .Tools }}{{ .Function }}{{ end }}]<|/tool|>
{{- end }}{{- end }}{{- range $i, $_ := .Messages }}{{- $last := eq (len (slice $.Messages $i)) 1 -}}{{- if ne .Role "system" }}<|{{ .Role }}|>{{ .Content }}{{- if .ToolCalls }}
[{{ range .ToolCalls }}{"name":"{{ .Function.Name }}","arguments":{{ .Function.Arguments }}}{{ end }}]<|/tool_call|>{{- end }}{{- if not $last }}
{{- end }}{{- if and (ne .Role "assistant") $last }}

{{ end }}{{- end }}{{- end }}"""
```

次に、以下のコマンドを使用して Modelfile を書き換えます：

```perl
ollama create phi4-mini -f "あなたのModelfileのパス"
```

SK が Phi4-mini ツールを呼び出すコードは以下の通りです：

```csharp
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.Ollama;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using OllamaSharp;
using OllamaSharp.Models;
using OpenAI.RealtimeConversation;
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
#pragma warning disable

await Call();
Console.ReadLine();

async Task Call()
{
    var builder = Kernel.CreateBuilder();
    var modelId = "phi4-mini";
    var endpoint = new Uri("http://localhost:11434");
    builder.Services.AddOllamaChatCompletion(modelId, endpoint);
    builder.Plugins.AddFromType<OrderPlugin>();
    var kernel = builder.Build();
    var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
    var settings = new OllamaPromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.None() };
    Console.Write(">>> ");
    string? input = "受注番号SN0000111の注文総額を取得しますか？";
    Console.WriteLine(input);
    try
    {
        ChatMessageContent chatResult = await chatCompletionService.GetChatMessageContentAsync(input, settings, kernel);
        Console.Write($"\n>>> Result: {chatResult}\n\n> ");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error: {ex.Message}\n\n> ");
    }
}

public class OrderPlugin
{
    [KernelFunction]
    [Description("受注総額を取得する")]
    public decimal GetOrderAmount([Description("受注番号")] string orderNo)
    {
        Console.WriteLine($"受注番号：{orderNo}，受注金額：12345.67");
        return 12345.67m;
    }
}
```

実行結果は以下の通りです：

![画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRAwNIcHmSFiaic8Z6WBR9cEPHv5lRxR0qXQLZJEE5QgBibIHibBW7IBQ4G43zmGavibhHByysRRyxt0Yog/640?wx_fmt=png&from=appmsg)

試用結果を見ても、毎回期待通りにはいかず、ツールの呼び出し成功率はまだ理想的とはいえません。公式のさらなる改善と成功率向上を期待したいと思います。

(Translated by GPT)
元のリンク：https://mp.weixin.qq.com/s/fWEaem_bxCTjxxWrRoYnDA?token=1135395277&lang=zh_CN&wt.mc_id=MVP_325642