golang本地运行大型语言模型插件库Ollama的使用

Golang本地运行大型语言模型插件库Ollama的使用

Ollama是一个轻量级、可扩展的框架,用于在本地机器上构建和运行大型语言模型。它提供了简单的API来创建、运行和管理模型,以及一系列预构建模型库。

ollama

安装Ollama

macOS

下载安装包直接安装

Windows

下载安装包直接安装

Linux

curl -fsSL https://ollama.com/install.sh | sh

Docker

使用官方Docker镜像ollama/ollama

Golang使用Ollama示例

下面是一个完整的Golang示例,展示如何通过Ollama的REST API与模型交互:

package main

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

// GenerateRequest 定义生成请求的结构体
type GenerateRequest struct {
	Model  string `json:"model"`
	Prompt string `json:"prompt"`
}

// ChatRequest 定义聊天请求的结构体
type ChatRequest struct {
	Model    string    `json:"model"`
	Messages []Message `json:"messages"`
}

// Message 定义消息结构体
type Message struct {
	Role    string `json:"role"`
	Content string `json:"content"`
}

func main() {
	// 1. 生成文本示例
	generateText()

	// 2. 聊天示例
	chatWithModel()
}

func generateText() {
	// 准备生成请求
	request := GenerateRequest{
		Model:  "llama3.2",
		Prompt: "为什么天空是蓝色的?",
	}

	// 将请求转换为JSON
	requestBody, err := json.Marshal(request)
	if err != nil {
		fmt.Println("Error marshaling request:", err)
		return
	}

	// 发送POST请求到Ollama的生成API
	resp, err := http.Post(
		"http://localhost:11434/api/generate",
		"application/json",
		bytes.NewBuffer(requestBody),
	)
	if err != nil {
		fmt.Println("Error sending request:", err)
		return
	}
	defer resp.Body.Close()

	// 读取响应
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Error reading response:", err)
		return
	}

	fmt.Println("生成响应:")
	fmt.Println(string(body))
}

func chatWithModel() {
	// 准备聊天请求
	request := ChatRequest{
		Model: "llama3.2",
		Messages: []Message{
			{
				Role:    "user",
				Content: "为什么天空是蓝色的?",
			},
		},
	}

	// 将请求转换为JSON
	requestBody, err := json.Marshal(request)
	if err != nil {
		fmt.Println("Error marshaling request:", err)
		return
	}

	// 发送POST请求到Ollama的聊天API
	resp, err := http.Post(
		"http://localhost:11434/api/chat",
		"application/json",
		bytes.NewBuffer(requestBody),
	)
	if err != nil {
		fmt.Println("Error sending request:", err)
		return
	}
	defer resp.Body.Close()

	// 读取响应
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Error reading response:", err)
		return
	}

	fmt.Println("\n聊天响应:")
	fmt.Println(string(body))
}

使用Ollama的Go库

社区提供了多个Go语言的Ollama客户端库,下面是使用jonathanhecl/gollama库的示例:

package main

import (
	"fmt"
	"log"

	"github.com/jonathanhecl/gollama"
)

func main() {
	// 创建Ollama客户端
	client := gollama.NewClient("http://localhost:11434")

	// 列出所有模型
	models, err := client.ListModels()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("可用模型:")
	for _, model := range models.Models {
		fmt.Printf("- %s\n", model.Name)
	}

	// 生成文本
	response, err := client.Generate(gollama.GenerateRequest{
		Model:  "llama3.2",
		Prompt: "解释量子计算的基本概念",
	})
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("\n生成响应:")
	fmt.Println(response.Response)
}

自定义模型

你可以使用Modelfile自定义模型行为:

  1. 创建Modelfile文件:
FROM llama3.2

# 设置温度为1 [越高越有创意,越低越连贯]
PARAMETER temperature 1

# 设置系统消息
SYSTEM """
你是一个乐于助人的AI助手,用简单易懂的方式回答问题。
"""
  1. 创建自定义模型:
ollama create mymodel -f Modelfile
  1. 在Go代码中使用自定义模型:
response, err := client.Generate(gollama.GenerateRequest{
    Model:  "mymodel",
    Prompt: "解释量子计算的基本概念",
})

注意事项

  • 运行7B模型至少需要8GB RAM
  • 运行13B模型至少需要16GB RAM
  • 运行33B模型至少需要32GB RAM

通过上述示例,你可以在Golang应用中轻松集成Ollama提供的本地大型语言模型能力。


更多关于golang本地运行大型语言模型插件库Ollama的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang本地运行大型语言模型插件库Ollama的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用Ollama在Golang中运行大型语言模型

Ollama是一个强大的工具,允许开发者在本地运行和管理大型语言模型(LLMs)。下面我将介绍如何在Golang中使用Ollama。

安装Ollama

首先,你需要在本地安装Ollama:

  1. 前往Ollama官网下载并安装
  2. 安装完成后,可以通过命令行测试是否安装成功:
    ollama --version
    

基本使用方法

Ollama提供了REST API和命令行两种交互方式。在Golang中,我们主要通过HTTP客户端与Ollama的API交互。

1. 启动Ollama服务

安装后,Ollama会默认启动一个本地服务,监听11434端口。

2. 拉取模型

你可以通过命令行拉取需要的模型:

ollama pull llama2

Golang集成示例

下面是一个完整的Golang示例,展示如何与Ollama交互:

package main

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

type OllamaRequest struct {
	Model  string `json:"model"`
	Prompt string `json:"prompt"`
	Stream bool   `json:"stream"`
}

type OllamaResponse struct {
	Model     string `json:"model"`
	CreatedAt string `json:"created_at"`
	Response  string `json:"response"`
	Done      bool   `json:"done"`
}

func main() {
	// 1. 检查Ollama服务是否运行
	resp, err := http.Get("http://localhost:11434")
	if err != nil {
		fmt.Println("Ollama服务未运行,请先启动Ollama")
		os.Exit(1)
	}
	defer resp.Body.Close()

	// 2. 准备请求数据
	requestData := OllamaRequest{
		Model:  "llama2",
		Prompt: "为什么天空是蓝色的?",
		Stream: false,
	}

	jsonData, err := json.Marshal(requestData)
	if err != nil {
		fmt.Println("JSON编码错误:", err)
		return
	}

	// 3. 发送请求到Ollama API
	resp, err = http.Post(
		"http://localhost:11434/api/generate",
		"application/json",
		bytes.NewBuffer(jsonData),
	)
	if err != nil {
		fmt.Println("请求Ollama API失败:", err)
		return
	}
	defer resp.Body.Close()

	// 4. 读取并解析响应
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("读取响应失败:", err)
		return
	}

	var ollamaResp OllamaResponse
	err = json.Unmarshal(body, &ollamaResp)
	if err != nil {
		fmt.Println("解析响应失败:", err)
		return
	}

	// 5. 输出结果
	fmt.Println("模型:", ollamaResp.Model)
	fmt.Println("回答:", ollamaResp.Response)
}

流式响应处理

Ollama支持流式响应,这对于处理长文本或实时交互非常有用。下面是流式处理的示例:

func streamResponse() {
	requestData := OllamaRequest{
		Model:  "llama2",
		Prompt: "解释量子计算的基本概念",
		Stream: true,
	}

	jsonData, err := json.Marshal(requestData)
	if err != nil {
		fmt.Println("JSON编码错误:", err)
		return
	}

	resp, err := http.Post(
		"http://localhost:11434/api/generate",
		"application/json",
		bytes.NewBuffer(jsonData),
	)
	if err != nil {
		fmt.Println("请求失败:", err)
		return
	}
	defer resp.Body.Close()

	decoder := json.NewDecoder(resp.Body)
	for {
		var chunk OllamaResponse
		if err := decoder.Decode(&chunk); err != nil {
			if err == io.EOF {
				break
			}
			fmt.Println("解码错误:", err)
			return
		}

		fmt.Print(chunk.Response)
		if chunk.Done {
			break
		}
	}
	fmt.Println()
}

高级功能

1. 自定义模型参数

type AdvancedRequest struct {
	Model    string  `json:"model"`
	Prompt   string  `json:"prompt"`
	Stream   bool    `json:"stream"`
	Options  Options `json:"options"`
}

type Options struct {
	Temperature float64 `json:"temperature"`
	TopP        float64 `json:"top_p"`
}

func customOptions() {
	requestData := AdvancedRequest{
		Model:  "llama2",
		Prompt: "写一首关于秋天的诗",
		Stream: false,
		Options: Options{
			Temperature: 0.7,
			TopP:        0.9,
		},
	}

	// 其余代码与前面示例类似...
}

2. 模型管理

func listModels() {
	resp, err := http.Get("http://localhost:11434/api/tags")
	if err != nil {
		fmt.Println("获取模型列表失败:", err)
		return
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("读取响应失败:", err)
		return
	}

	fmt.Println("可用模型列表:")
	fmt.Println(string(body))
}

最佳实践

  1. 错误处理:始终检查HTTP请求和响应的错误
  2. 超时设置:为HTTP客户端设置合理的超时
  3. 资源清理:确保关闭响应体
  4. 并发控制:如果需要并发请求,考虑使用连接池

总结

通过Ollama,Golang开发者可以轻松地在本地运行大型语言模型。本文展示了基本的交互方法、流式处理以及高级配置选项。你可以根据项目需求扩展这些基础代码,构建更复杂的AI应用。

记得在使用前确保Ollama服务已启动,并且已下载所需的模型。对于生产环境,你可能需要考虑添加认证、日志记录和性能监控等额外功能。

回到顶部