现在越来越多的同学开始尝试本地大模型,一方面省钱,另一方面数据也更可控。那如果我们想把Ollama 自部署模型接入到 MAF(Microsoft Agents Framework) 里,做一个真正能“聊天”的 Agent,该怎么搞呢?
这篇文章就用一个翻译 Agent 的小例子,一步一步讲清楚思路,帮你快速跑起来。
整体思路先说清楚
这个案例其实做的事情很简单:
本地用 Ollama 跑一个模型(比如 ministral-3)
通过 OllamaSharp 连接到本地模型
再用 MAF 的 AIAgent 包一层
最后通过 RunStreamingAsync 实现流式聊天输出
一句话总结就是:Ollama 负责模型,MAF 负责 Agent 能力,代码负责把两者连起来
准备工作
在写代码之前,你需要先准备好这些东西:
安装并启动 Ollama
确保你本地已经装好了 Ollama,并且能正常访问:
http://localhost:11434
同时确认你已经拉好了模型,比如:
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. 模拟一次真实对话输入
// 前面是日文内容,后面是中文指令
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;
}
}
运行结果如下:
声明:来自硅基-桂迹,仅代表创作者观点。链接:https://eyangzhen.com/6017.html