【Golang玩转本地大模型实战(一):ollma部署模型及流式调用】

文章目录


前言

近年来,AI技术迅猛发展,作为后端程序员,掌握基本的AI应用开发能力变得尤为重要。即使不深入研究模型底层原理,具备快速部署模型并在应用中调用的能力,也能极大地扩展自身技能边界。

本系列文章将从AI模型的本地部署后端调用接口 ,再到前端交互展示,以最简化的方式,带领大家完成一个完整的AI应用开发流程。

本文作为系列的第一篇,主要内容是:使用Ollama部署本地模型 ,并通过Golang实现非流式和流式的API调用


一、Ollama准备

1. 什么是Ollama?

Ollama是一个本地大模型部署工具,极其易用,非常适合快速上手体验AI应用开发。

2. 安装Ollama

Ollama的安装方式在网上有很多教程,这里推荐一篇讲解非常详细的文章:通过Ollama本地部署DeepSeek R1以及简单使用的教程(超详细)

可以直接参考文中步骤完成安装。

3. 部署模型

安装完成后,我们可以从Ollama官网的Model库中选择模型。页面上提供了不同规模的模型,模型名称中的b(例如8b)代表参数量,参数量越大,对显卡显存要求越高。

本文选择了DeepSeek R1 8B版本进行演示。

在命令行执行以下命令启动模型(首次执行会自动下载,需耐心等待):

bash 复制代码
ollama run deepseek-r1:8b

启动成功后,Ollama会监听本地的11434端口,等待接收请求。


二、Golang调用本地模型API

模型部署完成后,我们就可以通过Golang编写代码与模型进行交互了。下面分别介绍非流式调用流式调用两种方式。

1. 非流式调用

非流式调用,意味着发送请求后,等待模型一次性返回完整的回复。

示例代码:

go 复制代码
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

type Message struct {
	Role    string `json:"role"`
	Content string `json:"content"`
}

type ChatRequest struct {
	Model    string    `json:"model"`
	Messages []Message `json:"messages"`
	Stream   bool      `json:"stream"` // 设为false,表示非流式
}

type ChatResponse struct {
	Message Message `json:"message"`
	Done    bool    `json:"done"`
}

func main() {
	reqBody := ChatRequest{
		Model:  "deepseek-r1:8b",
		Stream: false,
		Messages: []Message{
			{
				Role:    "user",
				Content: "介绍一下Golang的优势",
			},
		},
	}

	jsonData, err := json.Marshal(reqBody)
	if err != nil {
		panic(err)
	}

	resp, err := http.Post("http://localhost:11434/api/chat", "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	var result ChatResponse
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		panic(err)
	}

	fmt.Println("AI回复:", result.Message.Content)
}

非流式调用效果演示:

特点总结:

  • 简单直接,一次请求返回完整内容;
  • 不适合长文本、大内容生成,等待时间较长。

2. 流式调用

流式调用则是模型边生成边返回,每次返回一小块数据,直到全部完成。

示例代码:

go 复制代码
package main

import (
	"bufio"
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

type ChatRequest struct {
	Model    string `json:"model"`
	Stream   bool   `json:"stream"`
	Messages []struct {
		Role    string `json:"role"`
		Content string `json:"content"`
	} `json:"messages"`
}

func main() {
	reqData := ChatRequest{
		Model:  "deepseek-r1:8b",
		Stream: true,
	}
	reqData.Messages = append(reqData.Messages, struct {
		Role    string `json:"role"`
		Content string `json:"content"`
	}{
		Role:    "user",
		Content: "介绍一下Golang的优势",
	})

	jsonData, err := json.Marshal(reqData)
	if err != nil {
		panic(err)
	}

	resp, err := http.Post("http://localhost:11434/api/chat", "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	scanner := bufio.NewScanner(resp.Body)
	for scanner.Scan() {
		line := scanner.Text()
		if line == "" {
			continue
		}

		var chunk struct {
			Message struct {
				Content string `json:"content"`
			} `json:"message"`
			Done bool `json:"done"`
		}
		if err := json.Unmarshal([]byte(line), &chunk); err != nil {
			fmt.Println("解析失败:", err)
			continue
		}

		fmt.Print(chunk.Message.Content)
		if chunk.Done {
			break
		}
	}

	if err := scanner.Err(); err != nil {
		fmt.Println("读取失败:", err)
	}
}

流式调用效果演示:

流式处理要点

  • stream: true 告诉Ollama返回流式数据;

  • 每行返回一段小的JSON数据:

  • 每段数据里包含生成的文本内容;

  • 最后一条数据的done: true表示输出结束;

  • 使用bufio.Scanner一行一行读取流式响应。

流式调用的体验非常接近于市面上主流的AI聊天应用(比如ChatGPT Web版),响应速度更快,用户体验更好。


总结

在本篇文章中,我们学习了:

  • 如何安装并使用Ollama快速部署本地大模型;
  • 如何使用Golang通过HTTP接口调用模型,支持非流式流式两种交互模式;
  • 非流式适合短文本请求,流式更适合实时、大文本输出。

至此,我们已经掌握了本地大模型部署后端调用 的基本操作。

在下一篇文章中,我将继续带大家结合前端网页界面流式传输技术 ,实现一个简洁的AI对话小应用,让我们的模型真正"动起来"!


参考文献

【通过Ollama本地部署DeepSeek R1以及简单使用的教程(超详细)】
【简单搭建 Ollama 模型的流式响应】

相关推荐
笑口常开xpr12 分钟前
C 语 言 - - - 文 件 操 作
c语言·开发语言
种时光的人19 分钟前
【Java多线程】计时器Timer/ScheduledExecutorService的使用
java·开发语言
旺代19 分钟前
CSS 预处理器 Sass
开发语言·sass
计算机毕设指导61 小时前
基于Springboot旅游网站系统【附源码】
java·开发语言·spring boot·后端·mysql·spring·旅游
code_shenbing1 小时前
python常用科学计算库及使用示例
开发语言·python
Wabi_sabi_x1 小时前
C++设计模式:面向对象的八大设计原则之二
开发语言·c++·设计模式
●^●1 小时前
Python 部分内置函数及其用法详解
开发语言·python
caihuayuan51 小时前
关于vue+iview中tabs嵌套及实际应用
java·大数据·spring boot·后端·课程设计
꧁坚持很酷꧂2 小时前
C++的基础知识(引用、类、封装、继承、多态、函数重载)
开发语言·c++
sunly_2 小时前
Flutter:组件10、倒计时
开发语言·javascript·flutter