AutoGen.NET 接入 Ollama:使用 OllamaAgent 与本地 LLaMA 模型对话
本文基于 AutoGen.NET 官方文档 Chat-with-llama 展开,讲解如何用 AutoGen.Ollama 包中的 OllamaAgent 连接本地 Ollama 服务器,并调用 llama3:latest 模型完成一次完整的智能体对话。读完本文,你将掌握 AutoGen.Ollama 的安装与初始化方式、OllamaAgent 各构造参数的含义,以及消息连接器等中间件在消息流转中的作用,并能对照源码理解请求发送与响应反序列化的底层实现。
运行前提
要运行本文示例,需要满足以下环境条件:
- 本机(或同网段)已启动一个 Ollama 服务器;
- 服务器中已安装
llama3:latest模型; - Ollama 默认监听地址为
http://localhost:11434,示例中的HttpClient即指向该地址。
第 1 步:安装 AutoGen.Ollama
在项目目录中执行以下命令安装 NuGet 包:
dotnet add package AutoGen.Ollama
安装的是仓库 dotnet/src/AutoGen.Ollama 下实现的 AutoGen.Ollama 项目。如需从 nightly build 源安装,可参考官方 Installation 文档。
第 2 步:添加 using 语句
示例代码(Chat_With_LLaMA.cs)需要引入两个命名空间:
using AutoGen.Core;
using AutoGen.Ollama.Extension;
AutoGen.Core提供OllamaAgent所实现的IStreamingAgent、IMessage等核心抽象;AutoGen.Ollama.Extension提供RegisterMessageConnector()、RegisterPrintMessage()等扩展方法,其实现位于 OllamaAgentExtension.cs。
第 3 步:创建 OllamaAgent 并发起对话
文档示例的完整代码如下:
using var httpClient = new HttpClient()
{
BaseAddress = new Uri("http://localhost:11434"),
};
var ollamaAgent = new OllamaAgent(
httpClient: httpClient,
name: "ollama",
modelName: "llama3:latest",
systemMessage: "You are a helpful AI assistant")
.RegisterMessageConnector()
.RegisterPrintMessage();
var reply = await ollamaAgent.SendAsync("Can you write a piece of C# code to calculate 100th of fibonacci?");
对照源码 OllamaAgent.cs,构造函数签名为:
public OllamaAgent(HttpClient httpClient, string name, string modelName,
string systemMessage = "You are a helpful AI assistant",
OllamaReplyOptions? replyOptions = null)
各参数含义:
| 参数 | 说明 |
|---|---|
httpClient |
指向 Ollama 服务器的 HttpClient,BaseAddress 必须是 Ollama 端点(默认 http://localhost:11434) |
name |
智能体名称,会作为消息信封(MessageEnvelope)的发送方标识 |
modelName |
要在 Ollama 中调用的模型名,本例为 llama3:latest |
systemMessage |
系统提示词,缺省值为 "You are a helpful AI assistant" |
replyOptions |
可选的 OllamaReplyOptions,用于向 Ollama 传递额外推理参数 |
两个中间件扩展的作用
RegisterMessageConnector():注册 OllamaMessageConnector,负责将 AutoGen 的核心消息类型(如TextChatMessage、FunctionCallMessage等)转换为 Ollama 请求体所需的ChatRequest消息格式,并在返回时把 Ollama 的ChatResponse还原为 AutoGen 消息类型;RegisterPrintMessage():注册打印中间件,将智能体收发到的消息打印到控制台,便于调试观察。
底层实现:请求如何发往 Ollama
从 OllamaAgent.cs 的源码结构看,OllamaAgent 实现了 IStreamingAgent 接口,核心路径为:
BuildChatRequest(messages, options)将消息列表与systemMessage、modelName组装为 Ollama 的ChatRequestDTO;BuildRequest(request)将其序列化为HttpRequestMessage,通过注入的HttpClient发送;- 非流式调用
GenerateReplyAsync将request.Stream置为false,读取完整响应体后反序列化为ChatResponse,并包装成MessageEnvelope<ChatResponse>返回; - 流式调用
GenerateStreamingReplyAsync将request.Stream置为true,逐行读取 NDJSON 格式的ChatResponseUpdate,在Done为false时持续产出增量消息。
也就是说,文档示例中的 SendAsync 走的是非流式路径,而同一智能体还可以直接用于流式对话场景,这正是 OllamaAgent : IStreamingAgent 的意义。相关 DTO(ChatRequest、ChatResponse、ChatResponseUpdate 等)定义在 dotnet/src/AutoGen.Ollama/DTOs 目录下。
运行示例项目
仓库中的完整可运行示例位于 AutoGen.Ollama.Sample,其入口 Program.cs 默认调用的是多模态版示例:
await Chat_With_LLaVA.RunAsync();
项目文件 AutoGen.Ollama.Sample.csproj 通过 ProjectReference 直接引用了 AutoGen.Ollama 与 AutoGen.SourceGenerator 等项目。运行前请确认:
- Ollama 服务器已启动且
llama3:latest已通过ollama pull llama3:latest拉取; HttpClient的BaseAddress与你的 Ollama 端点一致(远程部署时改为对应主机地址)。
若要将入口改为 LLaMA 文本对话,只需在 Program.cs 中改为调用 Chat_With_LLaMA.RunAsync() 即可。
测试验证
AutoGen.Ollama 的单元测试位于 dotnet/test/AutoGen.Ollama.Tests,其中 OllamaAgentTests.cs 覆盖了 OllamaAgent 的回复生成与流式行为,OllamaMessageTests.cs 验证了消息转换逻辑,可作为示例行为正确性的佐证。
延伸阅读
同一个文档目录下还有一篇姊妹文档 Chat-with-llava,演示如何用同一个 OllamaAgent 对接 llava:latest 多模态模型进行图文对话,对应的示例代码在 Chat_With_LLaVA.cs。掌握本文的 Ollama 接入方式后,可顺带了解多模态消息的构造方法。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00