Motivation
Nach meinen „Urlaubs“-Tests (vorherige Beiträge…) zur Verwendung von Golang und LLMs suchte ich nach einer einfachen Möglichkeit, LangChain-Aufrufe in Go zu implementieren, und verwende dabei vorzugsweise watsonx.ai.
Glücklicherweise habe ich das folgende Github-Repository gefunden: https://github.com/tmc/langchaingo (knicks vor Travis Cline https://github.com/tmc).
In seinem Repository gibt es diesen speziellen Ordner: https://github.com/tmc/langchaingo/blob/main/examples/watsonx-llm-example/watsonx_example.go, der meine Aufmerksamkeit erregt hat!
Also habe ich wie immer ein Projekt aufgebaut und versucht, es umzusetzen und auch meine eigenen Ideen einzubringen (à ma Sauce?).
Durchführung
Wie üblich, da Umgebungsvariablen benötigt werden, habe ich eine .env-Datei eingerichtet, die später in der App verwendet wird.
export WATSONX_API_KEY="your-watsonx-api-key" export WATSONX_PROJECT_ID="your-watsonx-projectid" # I used the US-SOUTH, could be any other region of IBM Cloud export SERVICE_URL="https://us-south.ml.cloud.ibm.com"
In einem früheren Beitrag habe ich den Versuch erwähnt, die Anzahl der an ein LLM gesendeten und von einem LLM empfangenen Token zu zählen. Da diese Arbeit noch in Arbeit ist, habe ich direkt die „tiktoken-go“-Bibliothek in meiner App verwendet, mit der Idee, einige Änderungen daran vorzunehmen (in naher Zukunft?). Wie dem auch sei, im Falle meines aktuellen Fortschritts funktioniert es nicht wirklich, aber es ist da.
Für die App selbst habe ich den Code von Travis aus seinem Repository fast so verwendet, wie er ist, und ihn mit den folgenden Funktionen versehen und umschlossen:
- Verwenden eines Dialogfelds für die Eingabeaufforderung (? Ich liebe Dialogfelder?)
- „Versuch“, um die Anzahl der „Tokens“ zu zählen, die an das LLM gesendet und von diesem zurückerhalten wurden. Der Code selbst ist der folgende;
package main import ( "context" "fmt" "log" "os" "os/exec" "runtime" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/widget" "github.com/joho/godotenv" "github.com/pkoukk/tiktoken-go" "github.com/tmc/langchaingo/llms" "github.com/tmc/langchaingo/llms/watsonx" ) const ( _tokenApproximation = 4 ) const ( _gpt35TurboContextSize = 4096 _gpt432KContextSize = 32768 _gpt4ContextSize = 8192 _textDavinci3ContextSize = 4097 _textBabbage1ContextSize = 2048 _textAda1ContextSize = 2048 _textCurie1ContextSize = 2048 _codeDavinci2ContextSize = 8000 _codeCushman1ContextSize = 2048 _textBisonContextSize = 2048 _chatBisonContextSize = 2048 _defaultContextSize = 2048 ) // nolint:gochecknoglobals var modelToContextSize = map[string]int{ "gpt-3.5-turbo": _gpt35TurboContextSize, "gpt-4-32k": _gpt432KContextSize, "gpt-4": _gpt4ContextSize, "text-davinci-003": _textDavinci3ContextSize, "text-curie-001": _textCurie1ContextSize, "text-babbage-001": _textBabbage1ContextSize, "text-ada-001": _textAda1ContextSize, "code-davinci-002": _codeDavinci2ContextSize, "code-cushman-001": _codeCushman1ContextSize, } var tokens int func runCmd(name string, arg ...string) { cmd := exec.Command(name, arg...) cmd.Stdout = os.Stdout cmd.Run() } func ClearTerminal() { switch runtime.GOOS { case "darwin": runCmd("clear") case "linux": runCmd("clear") case "windows": runCmd("cmd", "/c", "cls") default: runCmd("clear") } } func promptEntryDialog() string { var promptEntry string // Create a new Fyne application myApp := app.New() myWindow := myApp.NewWindow("Prompt Entry Dialog") // Variable to store user input var userInput string // Button to show the dialog button := widget.NewButton("Click to Enter your prompt's text", func() { entry := widget.NewEntry() dialog.ShowCustomConfirm("Input Dialog", "OK", "Cancel", entry, func(confirm bool) { if confirm { userInput = entry.Text promptEntry = userInput fmt.Println("User Input:", userInput) // Print to the console myWindow.Close() } }, myWindow) }) // Add the button to the window myWindow.SetContent(container.NewVBox( widget.NewLabel("Click the button below to enter text:"), button, )) // Set the window size and run the application myWindow.Resize(fyne.NewSize(400, 200)) myWindow.ShowAndRun() return promptEntry } func CountTokens(model, text string, inorout string) int { var txtLen int e, err := tiktoken.EncodingForModel(model) if err != nil { e, err = tiktoken.GetEncoding("gpt2") if err != nil { log.Printf("[WARN] Failed to calculate number of tokens for model, falling back to approximate count") txtLen = len([]rune(text)) fmt.Println("Guessed tokens for the "+inorout+" text:", txtLen/_tokenApproximation) return txtLen } } return len(e.Encode(text, nil, nil)) } func GetModelContextSize(model string) int { contextSize, ok := modelToContextSize[model] if !ok { return _defaultContextSize } return contextSize } func CalculateMaxTokens(model, text string) int { return GetModelContextSize(model) - CountTokens(model, text, text) } func main() { var prompt, model string // read the '.env' file err := godotenv.Load() if err != nil { log.Fatal("Error loading .env file") } ApiKey := os.Getenv("WATSONX_API_KEY") if ApiKey == "" { log.Fatal("WATSONX_API_KEY environment variable is not set") } ServiceURL := os.Getenv("SERVICE_URL") if ServiceURL == "" { log.Fatal("SERVICE_URL environment variable is not set") } ProjectID := os.Getenv("WATSONX_PROJECT_ID") if ProjectID == "" { log.Fatal("WATSONX_PROJECT_ID environment variable is not set") } // LLM from watsonx.ai model = "ibm/granite-13b-instruct-v2" // model = "meta-llama/llama-3-70b-instruct" llm, err := watsonx.New( model, //// Optional parameters: to be implemented if needed - Not used at this stage but all ready // wx.WithWatsonxAPIKey(ApiKey), // wx.WithWatsonxProjectID("YOUR WATSONX PROJECT ID"), ) if err != nil { log.Fatal(err) } ctx := context.Background() prompt = promptEntryDialog() // for the output visibility on the consol - getting rid of system messages ClearTerminal() // Use the entry variable here fmt.Println("Calling the llm with the user's prompt:", prompt) tokens = CountTokens(model, prompt, "input") completion, err := llms.GenerateFromSinglePrompt( ctx, llm, prompt, llms.WithTopK(10), llms.WithTopP(0.95), llms.WithSeed(25), ) // Check for errors if err != nil { log.Fatal(err) } fmt.Println(completion) tokens = CountTokens(model, completion, "output") }
Was gut funktioniert, da die Ausgabe unten gezeigt wird.
Calling the llm with the user's prompt: What is the distance in Kilmometers from Earth to Moon? 2024/12/31 11:08:04 [WARN] Failed to calculate number of tokens for model, falling back to approximate count Guessed tokens for the input text: 13 The distance from Earth to the Moon is about 384,400 kilometers. 2024/12/31 11:08:04 [WARN] Failed to calculate number of tokens for model, falling back to approximate count Guessed tokens for the output text: 16 ##### Calling the llm with the user's prompt: What is the name of the capital city of France? 2024/12/31 11:39:28 [WARN] Failed to calculate number of tokens for model, falling back to approximate count Guessed tokens for the input text: 11 Paris 2024/12/31 11:39:28 [WARN] Failed to calculate number of tokens for model, falling back to approximate count Guessed tokens for the output text: 1
Voilà!
Nächste Schritte
Ich würde die folgenden Funktionen für die Version 0.2 implementieren;
- Vorschlagen des Modells, das der Benutzer verwenden möchte,
- Eine genauere Methode zur Bestimmung der Anzahl der Token
- Einige echte LangChain-Implementierung.
Abschluss
Dies ist eine sehr einfache Darstellung meiner Arbeit rund um den Aufruf von LangChain aus einer Go-Anwendung.
Bleiben Sie gespannt auf weitere Neuigkeiten?
Das obige ist der detaillierte Inhalt vonLangChain von Go aus aufrufen (Teil 1). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Sie sollten sich um das "Zeichenfolgen" -Paket in Go kümmern, da es Tools zum Umgang mit Textdaten und dem Spleißen von grundlegenden Zeichenfolgen bis hin zu erweiterten regulären Ausdrucksanpassungen bietet. 1) Das "Zeichenfolgen" -Paket bietet effiziente String -Operationen, z. B. Join -Funktionen, die zum Spleißen von Zeichenfolgen verwendet werden, um Leistungsprobleme zu vermeiden. 2) Es enthält erweiterte Funktionen, wie z. B. die entsprechende Funktion, um zu überprüfen, ob eine Zeichenfolge einen bestimmten Zeichensatz enthält. 3) Die Ersatzfunktion wird verwendet, um Substrings in einer Zeichenfolge zu ersetzen, und die Aufmerksamkeit sollte auf die Ersatzauftrag und die Fallempfindlichkeit geschenkt werden. 4) Die Split -Funktion kann Zeichenfolgen entsprechend dem Trennzeichen teilen und wird häufig für die regelmäßige Expressionsverarbeitung verwendet. 5) Die Leistung muss bei der Verwendung berücksichtigt werden, wie z.

Das "Coding/Binary" PackageingoSential ForHandlingBinaryData, das die Bills-Forreading und WritingBinaryDataEffictionly anbietet

Das Beherrschen des Bytes -Pakets in Go kann dazu beitragen, die Effizienz und Eleganz Ihres Codes zu verbessern. 1) Das Bytes -Paket ist entscheidend für die Analyse binärer Daten, Verarbeitungsnetzwerkprotokolle und Speicherverwaltung. 2) Bytes verwenden. 3) Das Bytes -Paket bietet die Funktionen des Suchens, Ersetzens und Segmentierens von Bytescheiben. 4) Der Typ Bytes.reader eignet sich zum Lesen von Daten aus Bytescheiben, insbesondere in E/A -Operationen. 5) Das Bytes -Paket arbeitet in Zusammenarbeit mit Go's Müllsammler zusammen und verbessert die Effizienz der Big -Data -Verarbeitung.

Sie können das "Saiten" -Paket verwenden, um Saiten zu manipulieren. 1) Verwenden Sie Strings.trimspace, um Whitespace -Zeichen an beiden Enden der Zeichenfolge zu entfernen. 2) Verwenden Sie Strings. 3) Fucken Sie die Stringschnitte in eine Zeichenfolge durch Strings.join. 4) Verwenden Sie Strings.Contains, um zu überprüfen, ob die Zeichenfolge ein bestimmtes Substring enthält. 5) Verwenden Sie Strings.replaceall, um den globalen Ersatz durchzuführen. Achten Sie bei der Verwendung auf Leistung und potenzielle Fallstricke.

ThytespackageingoishighryeffectiveforByteslicemanipulation, AngebotsfunktionenForssearching, Spalten, Beiträge und Buffern.1) useBytes.ContainSearchForByTeSequences.2) Bytes.SsplithelpreakdownByTeslicesuseusedelimiter.3) durchtes

Thealternativestogo'SByTeSpackageIncludethestringspackage, bufiopackage und CustomStructs.1) thestringeSpackageCanBeUTForByTemanipulationByConvertingByTestOstoStoStackback.2) theBufiPackageIssidealForHandlinglargestreamStreamStreamStreamStreamStreamStreamStreamsEdTeffictionly

Die "Bytes" PackageingoSessentialFoictumingLyManipulationsByteslices, Crucial ForBinaryData, NetworkProtocols und Fileei/O.itoffersfunctions LikeIneIntexForsarching, pufferforhandlinglargedatasets, LeserforsimulatingStreamReAding und Joinseffizienz

Go'sStringSpackageScrucialForFicientStringManipulation, Offeringtoolslikestrings.Split (), Strings.join (), Strings.Replaceall (), und Strings.Contains (). 1) Strings


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

WebStorm-Mac-Version
Nützliche JavaScript-Entwicklungstools

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

mPDF
mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHPStorm Mac-Version
Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool
