Go + Ollama = 简单的本地 AI

Go + Ollama = 简单的本地 AI

使用Go 和 Ollama,让可以在本地轻松运行 AI 模型,构建强大、灵活的应用。

Ollama 是什么?

Ollama 是一个本地运行的 AI 模型管理工具,旨在让开发者轻松部署和使用 AI 模型。与传统依赖云端的方式不同,Ollama 的本地化运行具备以下优势:

  • 隐私保护:数据无需离开本地,减少隐私泄露风险。
  • 离线能力:无需依赖网络,在任何环境都能使用。
  • 成本节约:省去了云端计算的昂贵开销。

同时,Ollama 提供简洁的 API 和命令行工具,支持多种模型加载和运行,适合快速开发和迭代。

为什么选择 Go?

Go 语言以其简洁、高效、并发性强等特点,深受开发者喜爱。特别是在构建高性能、可扩展的后端服务时,Go 是一个不可忽视的选择。

将 Go 与 Ollama 结合,可以发挥两者的优势:

  • 使用 Go 的并发特性,高效处理 AI 推理请求。
  • 借助 Go 的简单语法和强大工具链,快速开发生产级应用。

实战案例:构建一个本地 AI 聊天应用

接下来,通过一个简单的案例,展示如何用 Go 和 Ollama 构建一个本地 AI 聊天应用。

环境准备

  1. 安装 Ollama

    前往 Ollama 官方网站 下载并安装适合你操作系统的版本。

  2. 安装 Go

    如果尚未安装 Go,可参考 Go 官方指南 进行安装。

  3. 下载模型

    使用 Ollama 下载所需的模型,例如 llama3.1:

    1
    ollama pull llama3.1

编写代码

以下是用 Go 实现的一个简单聊天应用:

1
2
3
4
mkdir go-ollama
cd go-ollama
go mod init go-ollama

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package main

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

type Request struct {
Model string `json:"model"`
Messages []Message `json:"messages"`
Stream bool `json:"stream"`
}

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

type Response struct {
Model string `json:"model"`
CreatedAt time.Time `json:"created_at"`
Message Message `json:"message"`
Done bool `json:"done"`
TotalDuration int64 `json:"total_duration"`
LoadDuration int `json:"load_duration"`
PromptEvalCount int `json:"prompt_eval_count"`
PromptEvalDuration int `json:"prompt_eval_duration"`
EvalCount int `json:"eval_count"`
EvalDuration int64 `json:"eval_duration"`
}

func main() {
client := &http.Client{}
reader := bufio.NewReader(os.Stdin)
// start := time.Now()
fmt.Println("欢迎使用本地 AI 聊天应用!输入 'exit' 退出。")

for {
fmt.Print("你: ")
input, _ := reader.ReadString('\n')
input = input[:len(input)-1]

if input == "exit" {
fmt.Println("再见!")
break
}

message := Message{
Role: "user",
Content: input,
}

requestBody, _ := json.Marshal(Request{
Model: "llama3.1",
Messages: []Message{message},
Stream: false,
})

req, _ := http.NewRequest("POST", "http://localhost:11434/api/chat", bytes.NewBuffer(requestBody))
req.Header.Set("Content-Type", "application/json")

resp, err := client.Do(req)
if err != nil {
fmt.Println("请求失败:", err)
continue
}
defer resp.Body.Close()

response := Response{}
err = json.NewDecoder(resp.Body).Decode(&response)
fmt.Println(response.Message.Content)
// fmt.Printf("Completed in %v", time.Since(start))
}
}

代码解析

  1. 定义请求和响应结构体

    通过 RequestResponse 结构体定义请求和响应的数据格式。

    Request 结构体中

    • Model 字段指定使用的 AI 模型。
    • Messages 字段包含用户输入的对话内容。
    • Stream 字段表示是否启用流式处理。

运行代码

  1. 启动 Ollama 服务:

    1
    ollama serve
  2. 运行 Go 程序:

    1
    go run main.go
  3. 尝试与 AI 对话,享受本地 AI 带来的便捷体验!

效果展示

以下是一个运行效果的示例:

实用建议

  • 优化性能

    • 对高频调用的场景,可以通过 Go 的 sync.Pool 复用请求对象。
    • 考虑使用更轻量的模型以降低本地计算压力。
  • 扩展功能

    • 集成数据库,记录用户交互。
    • 使用 Web 框架(如 Gin)将聊天应用升级为 Web 服务。
  • 安全性

    • 确保本地服务端口未暴露在公网上。
    • 使用防火墙或其他安全措施保护运行环境。

总结

通过 Go 和 Ollama,可以快速构建本地 AI 应用,既保障了用户数据隐私,又降低了开发和运行成本。这种组合为开发者提供了无限的可能性,无论是构建聊天机器人、智能问答系统,还是其他创新型应用。

赶紧尝试吧,用 Go 和 Ollama 打造属于你的本地 AI 应用!


版权声明

  • 本文作者: PFinal南丞
  • 本文链接:
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

相关阅读