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. 解决问题,点亮赞同

相关推荐
2的n次方_1 分钟前
CANN Ascend C 编程语言深度解析:异构并行架构、显式存储层级与指令级精细化控制机制
c语言·开发语言·架构
java干货32 分钟前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
_F_y33 分钟前
C语言重点知识总结(含KMP详细讲解)
c语言·开发语言
毕设源码-郭学长34 分钟前
【开题答辩全过程】以 基于python的二手房数据分析与可视化为例,包含答辩的问题和答案
开发语言·python·数据分析
无小道1 小时前
Qt——常用控件
开发语言·qt
大空大地20261 小时前
流程控制语句--switch多分支语句使用、while循环语句的使用、do...while语句、for循环
c#
aini_lovee1 小时前
MATLAB基于小波技术的图像融合实现
开发语言·人工智能·matlab
R1nG8631 小时前
多线程安全设计 CANN Runtime关键数据结构的锁优化
开发语言·cann
初次见面我叫泰隆1 小时前
Qt——5、Qt系统相关
开发语言·qt·客户端开发
亓才孓2 小时前
[Class的应用]获取类的信息
java·开发语言