์ค๋ ์์นจ ์๋กญ๊ฒ ์ถ์๋ Google์ ์ ์คํ ์์ค LLM์ธ Gemma 4๋ฅผ ๋ฐ๋ก ํ ์คํธํด๋ณด๊ณ ์ถ์ด์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด๋ดค์ต๋๋ค.
MS Agent Framework, Ollama, ๊ทธ๋ฆฌ๊ณ MS Learn MCP ์๋ฒ ํด ์ฝ๋ง๊น์ง ํฉ์น ์จ์ ํ ์์ ๋ฅผ ์์ฝ๊ฒ ๋ง๋ค ์ ์์๊ณ ๋ก์ปฌ์์๋ ๊ฝค ์๋ฏธ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ์ ์์์ต๋๋ค. Edge ๋๋ฐ์ด์ค ์ฉ์ผ๋ก ๊ฒฝ๋ํ๋ ํ๊ฒฝ, ๊ทธ๋ฆฌ๊ณ ์ ํ M2 Air ์ ๋ ๋๋ ์ฌ์์์๋ ๊ทธ๋ญ์ ๋ญ ์ธ๋งํ ๊ฒฐ๊ณผ๊ฐ ๋์์ ํฅ๋ฏธ๋ก์ ์ต๋๋ค.
(์ด๋ฏธ ์ ์์๊ฒ ์ง๋ง, .NET์ ์ ํ ์ค๋ฆฌ์ฝ ๋งฅ์์๋ ๋๋ฌด๋ ์์ฐ์ค๋ฝ๊ฒ ์ ์๋ํฉ๋๋ค.)
์๋ ์ฝ๋๋ฅผ gemma4.cs ๋ก ์ ์ฅํ๊ณ dotnet run gemma4.cs ํน์ chmod +x gemma4.cs; ./gemma4.cs ๋ก Ollama๊ฐ ๋ ์๋ ์ํ์์ ์คํํ์๋ฉด Model Pull๋ถํฐ ํด ์ฝ๋ง๊น์ง ํ ๋ฒ์ ์ ๊ฐ๋๋ ๊ฒ์ ๋ณด์ค ์ ์์ ๊ฒ์
๋๋ค. ![]()
#!/usr/bin/env dotnet
#:package Microsoft.Agents.AI@1.*
#:package Microsoft.Extensions.AI@10.*
#:package OllamaSharp@5.*
#:package ModelContextProtocol@1.*
#:property PublishAot=false
using Microsoft.Extensions.AI;
using Microsoft.Agents.AI;
using OllamaSharp;
using ModelContextProtocol.Client;
var ollamaEndpoint = "http://localhost:11434";
var modelId = "gemma4";
var systemCard = "๋น์ ์ Ollama ์์์ ์คํ๋๋ ์ ๋ฅํ๊ณ ์ ์ฉํ ๋ก์ปฌ AI ์ด์์คํดํธ์
๋๋ค. ๋ชจ๋ ๋ฉ์์ง๋ ํ๊ตญ์ด๋ก ๋ตํด์ผ ํฉ๋๋ค.";
var prompt = "Windows Sandbox๋ฅผ XML ๋ฐฉ์์ผ๋ก ์ ์ดํ๋ ๋ฐฉ๋ฒ์ด ๊ถ๊ธํฉ๋๋ค.";
var option = new ChatClientAgentRunOptions()
{
ChatOptions = new()
{
Reasoning = new()
{
Effort = ReasoningEffort.High,
Output = ReasoningOutput.Full,
}
},
};
using var chatClient = new OllamaApiClient(ollamaEndpoint, modelId);
await foreach (var eachFragment in chatClient.PullModelAsync(modelId))
Console.WriteLine($"{eachFragment?.Status}: {eachFragment?.Percent}%");
var client = await McpClient.CreateAsync(new HttpClientTransport(new HttpClientTransportOptions() { Name = "microsoft_learn", Endpoint = new Uri("https://learn.microsoft.com/api/mcp"), }));
var agent = chatClient.AsAIAgent(
instructions: systemCard,
tools: (await client.ListToolsAsync()).Cast<AITool>().ToList());
var session = await agent.CreateSessionAsync().ConfigureAwait(false);
await foreach (var eachFragment in agent.RunStreamingAsync(prompt, session, option))
{
foreach (var eachContent in eachFragment.Contents)
{
if (eachContent is TextReasoningContent reasoning)
Console.Write(reasoning.Text);
else if (eachContent is TextContent text)
Console.Write(text.Text);
else
Console.WriteLine($"<< {eachContent.GetType()} >>");
}
}
