【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 模型的流式响应】

相关推荐
码智社6 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海6 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖7 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
weixin_446260859 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
人邮异步社区9 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大10 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai10 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
用户83562907805110 小时前
Python 实现 Excel 页面布局与打印设置自动化
后端·python