C# Ollama 实战聊天小案例实现

我们上一期在各大AI模型中最终选中纯免费版加可离线的Ollama模型 这一期我们来基于这个模型来做个更加深入的了解和实战使用以及后期我们来对这个模型来实现一个稍微复杂的批量图片操作功能,来看看这款模型是否能满足我们要求

我们打开Ollama官网后会发现使用Ollama有三种请求方式分别是Ollama 的 JavaScript 库、Python 库和 cURL 调用都是与 Ollama 服务交互的方式,但它们在使用场景、功能和易用性上有明显区别:

1. cURL (命令行工具)

  • 定位:最底层的 HTTP 请求工具

  • 特点

    • 直接调用 REST API 端点

    • 无需安装额外库(系统自带)

    • 适合测试、调试和简单脚本

  • 示例

    curl http://localhost:11434/api/generate -d '{
    "model": "llama3.2",
    "prompt": "Hello"
    }'

2. Python 库 (ollama)

  • 定位:官方 Python SDK

  • 特点

    • 高级封装,使用更简单

    • 支持流式响应、对话管理

    • 自动处理 JSON 序列化/反序列化

    • 支持文件上传、多模态

  • 示例

    import ollama

    同步调用

    response = ollama.chat(model='llama3.2', messages=[{'role': 'user', 'content': 'Hello'}])

    流式响应

    for chunk in ollama.chat(model='llama3.2', messages=[...], stream=True):
    print(chunk['message']['content'], end='')

3. JavaScript/Node.js 库 (ollama)

  • 定位:官方 JavaScript SDK

  • 特点

    • 支持浏览器和 Node.js 环境

    • Promise-based API,适合异步操作

    • 与前端框架集成方便

  • 示例

    import { Ollama } from 'ollama'

    const ollama = new Ollama({ host: 'http://localhost:11434' })

    // 异步调用
    const response = await ollama.chat({
    model: 'llama3.2',
    messages: [{ role: 'user', content: 'Hello' }]
    })

主要区别对比

特性 cURL Python 库 JavaScript 库
安装复杂度 无需安装 pip install ollama npm install ollama
易用性 手动构造 JSON 高级 API,简单直观 高级 API,简单直观
流式响应 需要手动处理 内置支持 内置支持
错误处理 手动解析 异常机制 Promise catch
多模态 支持但复杂 简单 API 简单 API
适用场景 脚本测试、调试 后端服务、AI应用 前端应用、全栈
类型安全 有类型提示 TypeScript 支持

选择建议

使用 cURL 当:

  • 快速测试 API 是否工作

  • 调试和查看原始响应

  • 编写简单的 Shell 脚本

使用 Python 库 当:

  • 开发 AI 后端服务

  • 需要复杂的对话管理

  • 数据处理和科学计算

  • 与其他 Python AI 库集成

使用 JavaScript 库 当:

  • 开发 Web 前端应用

  • 构建浏览器扩展

  • Node.js 后端服务

  • 需要实时流式更新的应用

共同点

无论使用哪种方式,底层都是通过 HTTP 与 Ollama 的 REST API 通信,核心功能(模型推理、对话等)都是一致的。

简单总结:cURL 是工具,Python/JS 库是 SDK。SDK 提供了更友好、更强大的开发体验,而 cURL 更适合快速验证和底层操作。

结合我们的一个使用需求以及Ollama的介绍我们根据不同场景选择对应的使用方式 我这边着重使用cURL

这里我们要本地使用Ollama 第一步首先先拉取Ollama 的模型 因为Ollama经过不断版本更新已经有很多种不同版本的模型 不同模型的功能也大不一样

模型

在使用模型之前,先局部拉取:ollama pull

复制代码
ollama pull llama3.2

默认型号名称

对于依赖默认OpenAI模型名称(如)的工具,可以将现有模型名称复制到临时名称:gpt-3.5-turbo``ollama cp

复制代码
ollama cp llama3.2 gpt-3.5-turbo

安装启用这个模型后我们就可以来测试一下这个模型 测试之前我们一定要确认自己Ollama服务是否已经启动否则会导致报错

第一步打开这个羊驼应用

启动一下 也可以使用控制台启动服务

接下来浏览器输入检测服务地址 :localhost:11434/api/tags

如果返回如图证明服务启动正常

我们可以用测试工具 如PostMam 或其他请求工具来测试一下Ollama接口是否正常,如果不正常我们优先解决问题不然直接开始写程序一切都是徒劳

正常响应如下

如果能正常回复200响应 则表明接口正常

接下来我们创建C# 控制台程序

创建接收参数实体类GenerateResponse

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OllamaTest.Model
{
    public class GenerateResponse
    {
        public string Model { get; set; }
        public DateTime Created_At { get; set; }
        public string Response { get; set; }
        public bool Done { get; set; }
    }
}

我们这个案例就只做一个用处熟悉加简单理解所以越简单越好

编写 Program类

复制代码
using Newtonsoft.Json;
using OllamaTest.Model;
using System.Net.Http.Json;
using System.Reflection;
using System.Text;
using System.Text.Json.Serialization;

namespace OllamaTest
{
    public class Program
    {
        public static async Task Main(string[] args)
        {
            Console.WriteLine("Ollama Gemma3 聊天助手");
            Console.WriteLine("输入 'exit' 退出\n");

            using var client = new HttpClient();
            string[] modelsToTry =
           {
                "gemma3:latest",
                "gemma3",
                "gemma3:4b",
                "gemma3:12b",
                "llama3.2:3b",
                "llama3.2:1b"
            };
            while (true)
            {
                Console.Write("你: ");
                var input = Console.ReadLine();

                if (input?.ToLower() == "exit") break;
                if (string.IsNullOrEmpty(input)) continue;

                try
                {
                    // 准备请求
                    var request = new
                    {
                        model = "llama3.2",
                        prompt = "hello",
                        stream = false
                    };

                    var json = System.Text.Json.JsonSerializer.Serialize(request);
                    var content = new StringContent(json, Encoding.UTF8, "application/json");

                    // 发送请求
                    var response = await client.PostAsync(
                        "http://localhost:11434/api/generate",
                        content
                    );

                    if (response.IsSuccessStatusCode)
                    {
                        var responseJson = await response.Content.ReadAsStringAsync();
                        var list = JsonConvert.DeserializeObject<GenerateResponse>(responseJson);
                        //using var doc = System.Text.Json.JsonDocument.Parse(responseJson);

                        //if (doc.RootElement.TryGetProperty("response", out var responseText))
                        //{
                        //    Console.WriteLine($"\nGemma3: {responseText.GetString()}\n");
                        //}
                    }
                    else
                    {
                        Console.WriteLine($"错误: {response.StatusCode}");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"异常: {ex.Message}");
                }
            }

         }
        }
}

打完收工我们来执行一下看下效果

目前已收到AI的回复 但是是英文后面我们再逐步的看看哪些模型支持中文来更换模型来测试 案例实例下载链接:https://download.csdn.net/download/weixin_41365995/92447803

  1. 干货,值得一赞

  2. 技术认同

  3. 实用?点赞收藏

  4. 解决问题,点亮赞同

相关推荐
奋斗者1号2 分钟前
MQTT连接失败定位步骤
开发语言·机器学习·网络安全
33三 三like10 分钟前
毕设任务分析
开发语言
vyuvyucd15 分钟前
Linux线程编程:POSIX与C++实战指南
java·开发语言
Kratzdisteln18 分钟前
【MVCD 3】
开发语言·php
癫狂的兔子18 分钟前
【Python】【NumPy】random.rand和random.uniform的异同点
开发语言·python·numpy
先做个垃圾出来………28 分钟前
Python整数存储与位运算
开发语言·python
leiming633 分钟前
c++ find_if 算法
开发语言·c++·算法
zxy284722530136 分钟前
利用C#的BotSharp本地部署第一个大模型AI Agent示例(1)
人工智能·c#·对话·ai agent·botsharp
广州服务器托管1 小时前
[2026.1.6]WINPE运维版20260106,带网络功能的PE维护系统
运维·开发语言·windows·计算机网络·个人开发·可信计算技术
a努力。1 小时前
京东Java面试被问:双亲委派模型被破坏的场景和原理
java·开发语言·后端·python·面试·linq