(原) Golang调用Ollama API实现AI

原创文章,请后转载,并注明出处。

最新在Win或Linux下部署一个Ollama都很简单,在Github上也有介绍和资料,Linux下 curl -fsSL https://ollama.com/install.sh | sh 即可。

要服务器上安装,其它客户端调用,主要是修改环境变量 OLLAMA_HOST=“0.0.0.0” 这样的地址即可,问答中也有介绍。环境变量 OLLAMA_MODELS 应该是指定模型的地址。

注意修改后要重载并启动

sudo systemctl daemon-reload
sudo service ollama restart

网友的示例代码,应该大同小异。
结合之前的TTS,再加上语音识别,估计能整合一个智能AI。加上博客的聊天窗,也是不复杂的。

package main

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

type Question struct {
	Model  string `json:"model"`
	Prompt string `json:"prompt"`
}

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

func main() {
	client := &http.Client{Timeout: 100 * time.Second}

	url := "http://localhost:11434/api/generate"
	jsonStr, _ := json.Marshal(Question{
		Model:  "codeqwen",
		Prompt: "为什么天空是蓝色的?",
	})

	contentType := "application/json"
	requestBody := bytes.NewReader(jsonStr)
	req, _ := http.NewRequest("POST", url, requestBody)
	req.Header.Set("Content-Type", contentType)

	// 发送HTTP请求
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}

	//按行流式读取数据
	reader := bufio.NewReader(resp.Body)
	for {
		line, err := reader.ReadBytes('\n')
		if err != nil {
			if err == io.EOF {
				break
			}
			panic(err)
		}

		Anwser := Anwser{}
		err = json.Unmarshal(line, &Anwser)
		if err != nil {
			panic(err)
		}

		fmt.Print(Anwser.Response)

		if Anwser.Done {
			fmt.Println("")
			break
		}
	}
}

在官方的Github中,也有Golang的示例代码,例如以下这个流工反馈:

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/ollama/ollama/api"
)

func main() {
	client, err := api.ClientFromEnvironment()
	if err != nil {
		log.Fatal(err)
	}

	// 默认情况下就是流式反馈.
	req := &api.GenerateRequest{
		Model:  "gemma:7b",
		Prompt: "godot的最新版本是多少?",
		// Stream: new(bool),  // 不用流式

	}

	ctx := context.Background()
	respFunc := func(resp api.GenerateResponse) error {
		fmt.Print(resp.Response)  // 若需要,AI自动会带上换行
		return nil
	}

	err = client.Generate(ctx, req, respFunc)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println()
}

若需要一次性输出结果,只需要Stream设置为False即可。

相关文章