Dieser Artikel beschreibt, wie man die Ollama Dieses Dokument soll Entwicklern helfen, sich einzuarbeiten und die Möglichkeiten von Ollama voll auszuschöpfen. Ollama selbst wird in der Sprache Golang entwickelt, und der Schnittstellencode für die Golang-Sprachversion ist im offiziellen Repository-Verzeichnis unter https://github.com/ollama/ollama/tree/main/api verfügbar, und die offizielle Dokumentation ist unter Die offizielle Dokumentation finden Sie unter https://pkg.go.dev/github.com/ollama/ollama/api. Wenn Sie dieses Dokument studieren, können Sie Ollama leicht in Ihre Projekte integrieren.
Das offizielle Repository https://github.com/ollama/ollama/tree/main/api/examples提供了一些示例代 Code, und der unten stehende Code verweist auf diese Beispiele und ändert sie. Alle Beispiele sind verfügbar in der
notebook/C4/Golang_API_example
Mitte
Vorbereitung der Umwelt
Bevor Sie beginnen, stellen Sie sicher, dass Ihre Entwicklungsumgebung die folgenden Bedingungen erfüllt:
- Golang-Entwicklungsumgebung, über die
go version
Überprüfen Sie die Golang-Version, die in diesem Artikel verwendete Version istgo1.23.6
Referenz https://golang.google.cn/doc/install进行安装
- Erstellen Sie ein Projektverzeichnis und initialisieren Sie es
mkdir ollama-demo && cd ollama-demo
go mod init ollama-demo
- Installation von Abhängigkeiten
go get github.com/ollama/ollama/api
Verwendung
Einen Katalog erstellenchat
eine Datei im Katalog anlegenmain.go
die wie folgt lautet (das Beispiel verwendet das Modell 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)
}
}
in Bewegung sein go run chat/main.go
Streaming-Ausgang
Einen Katalog erstellengenerate-streaming
eine Datei im Katalog anlegenmain.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()
}
in Bewegung sein go run generate-streaming/main.go
Strukturierte Ausgabe
Einen Katalog erstellenstructured_output
eine Datei im Katalog anlegenmain.go
Die folgenden
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)
}
}
Durch die Angabe vonChatRequest
angefordertFormat: []byte(
"json"),
Parameter, der es dem Modell ermöglicht, strukturierte Daten zurückzugeben, die dann durch denjson.Unmarshal
Analysiert die zurückgegebenen Daten.
in Bewegung sein go run structured_output/main.go
Die folgende Ausgabe kann erhalten werden:
{"capital": "Washington, D.C.", "population": 3.672e6, "area": 7.058e6}
首都: Washington, D.C.,人口: 3672000.000000,面积: 7058000.000000