golang本地运行大型语言模型插件库Ollama的使用
Golang本地运行大型语言模型插件库Ollama的使用
Ollama是一个轻量级、可扩展的框架,用于在本地机器上构建和运行大型语言模型。它提供了简单的API来创建、运行和管理模型,以及一系列预构建模型库。
安装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自定义模型行为:
- 创建
Modelfile
文件:
FROM llama3.2
# 设置温度为1 [越高越有创意,越低越连贯]
PARAMETER temperature 1
# 设置系统消息
SYSTEM """
你是一个乐于助人的AI助手,用简单易懂的方式回答问题。
"""
- 创建自定义模型:
ollama create mymodel -f Modelfile
- 在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
更多关于golang本地运行大型语言模型插件库Ollama的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用Ollama在Golang中运行大型语言模型
Ollama是一个强大的工具,允许开发者在本地运行和管理大型语言模型(LLMs)。下面我将介绍如何在Golang中使用Ollama。
安装Ollama
首先,你需要在本地安装Ollama:
- 前往Ollama官网下载并安装
- 安装完成后,可以通过命令行测试是否安装成功:
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))
}
最佳实践
- 错误处理:始终检查HTTP请求和响应的错误
- 超时设置:为HTTP客户端设置合理的超时
- 资源清理:确保关闭响应体
- 并发控制:如果需要并发请求,考虑使用连接池
总结
通过Ollama,Golang开发者可以轻松地在本地运行大型语言模型。本文展示了基本的交互方法、流式处理以及高级配置选项。你可以根据项目需求扩展这些基础代码,构建更复杂的AI应用。
记得在使用前确保Ollama服务已启动,并且已下载所需的模型。对于生产环境,你可能需要考虑添加认证、日志记录和性能监控等额外功能。