Utiliser l'API Ollama dans Golang

吐司AI

Cet article décrit comment utiliser la fonction Ollama Ce document est conçu pour aider les développeurs à se familiariser avec les fonctionnalités d'Ollama et à en tirer le meilleur parti. Ollama est développé en langage Golang, et le code de l'interface pour la version en langage Golang est disponible dans le répertoire du dépôt officiel à l'adresse https://github.com/ollama/ollama/tree/main/api, ainsi que dans la documentation officielle à l'adresse La documentation officielle est disponible à l'adresse https://pkg.go.dev/github.com/ollama/ollama/api. En étudiant ce document, vous pourrez facilement intégrer Ollama dans vos projets.

Le dépôt officiel https://github.com/ollama/ollama/tree/main/api/examples提供了一些示例代 code, et le code ci-dessous fait référence et modifie ces exemples. Tous les exemples sont disponibles dans la base de donnéesnotebook/C4/Golang_API_examplemilieu

 

Préparation de l'environnement

Avant de commencer, assurez-vous que votre environnement de développement remplit les conditions suivantes :

  1. L'environnement de développement Golang, via l'optiongo versionVérifiez la version de golang, la version utilisée dans cet article est la suivantego1.23.6

    Référence https://golang.google.cn/doc/install进行安装

  2. Créer un répertoire de projet et l'initialiser
mkdir ollama-demo && cd ollama-demo
go mod init ollama-demo
  1. Installation des dépendances
go get github.com/ollama/ollama/api

 

Utilisation

Créer un cataloguechatcréer un fichier dans le cataloguemain.goqui se lit comme suit (l'exemple utilise le modèle deepseek-r1:7b) :

package main
import (
"context"
"fmt"
"log"
"github.com/ollama/ollama/api"
)
func main() {
client, err := api.ClientFromEnvironment()
if err != nil {
log.Fatal(err)
}
messages := []api.Message{
api.Message{
Role:    "user",
Content: "为什么天空是蓝色的?",
},
}
ctx := context.Background()
req := &api.ChatRequest{
Model:    "deepseek-r1:7b",
Messages: messages,
}
respFunc := func(resp api.ChatResponse) error {
fmt.Print(resp.Message.Content)
return nil
}
err = client.Chat(ctx, req, respFunc)
if err != nil {
log.Fatal(err)
}
}

être en mouvement go run chat/main.go

 

sortie en continu

Créer un cataloguegenerate-streamingcréer un fichier dans le cataloguemain.go

package main
import (
"context"
"fmt"
"log"
"github.com/ollama/ollama/api"
)
func main() {
client, err := api.ClientFromEnvironment()
if err != nil {
log.Fatal(err)
}
// By default, GenerateRequest is streaming.
req := &api.GenerateRequest{
Model:  "deepseek-r1:7b",
Prompt: "为什么天空是蓝色的?",
}
ctx := context.Background()
respFunc := func(resp api.GenerateResponse) error {
// Only print the response here; GenerateResponse has a number of other
// interesting fields you want to examine.
// In streaming mode, responses are partial so we call fmt.Print (and not
// Println) in order to avoid spurious newlines being introduced. The
// model will insert its own newlines if it wants.
fmt.Print(resp.Response)
return nil
}
err = client.Generate(ctx, req, respFunc)
if err != nil {
log.Fatal(err)
}
fmt.Println()
}

être en mouvement go run generate-streaming/main.go

 

Sortie structurée

Créer un cataloguestructured_outputcréer un fichier dans le cataloguemain.goLe texte suivant

package main
import (
"context"
"encoding/json"
"fmt"
"log"
"strings"
"github.com/ollama/ollama/api"
)
type CountryInfo struct {
Capital    string  `json:"capital"`
Population float64 `json:"population"`
Area       float64 `json:"area"`
}
func main() {
client, err := api.ClientFromEnvironment()
if err != nil {
log.Fatal(err)
}
messages := []api.Message{
api.Message{
Role:    "user",
Content: "请介绍美国的首都、人口、占地面积信息,并以 JSON 格式返回。",
},
}
ctx := context.Background()
req := &api.ChatRequest{
Model:    "deepseek-r1:7b",
Messages: messages,
Stream:   new(bool), // false
Format:   []byte(`"json"`),
Options: map[string]interface{}{
"temperature": 0.0,
},
}
respFunc := func(resp api.ChatResponse) error {
fmt.Printf("%s\n", strings.TrimSpace(resp.Message.Content))
var info CountryInfo
err := json.Unmarshal([]byte(resp.Message.Content), &info)
if err != nil {
log.Fatal(err)
}
fmt.Printf("首都: %s,人口: %f,面积: %f", info.Capital, info.Population, info.Area)
return nil
}
err = client.Chat(ctx, req, respFunc)
if err != nil {
log.Fatal(err)
}
}

En spécifiantChatRequestdemandéeFormat: []byte("json"), qui permet au modèle de renvoyer des données structurées, qui peuvent ensuite être passées par la fonctionjson.UnmarshalAnalyse les données renvoyées.

être en mouvement go run structured_output/main.go Le résultat suivant peut être obtenu :

{"capital": "Washington, D.C.", "population": 3.672e6, "area": 7.058e6}
首都: Washington, D.C.,人口: 3672000.000000,面积: 7058000.000000
© déclaration de droits d'auteur
AiPPT

Articles connexes

Pas de commentaires

aucun
Pas de commentaires...