Découvrez comment utiliser Mistral AI sur Amazon Bedrock avec AWS SDK for Go
Mistral AI propose des modèles avec des caractéristiques variables en termes de performances, de coût et plus :
Voyons comment utiliser ces modèles d'IA Mistral sur Amazon Bedrock avec Go et, ce faisant, obtenons également une meilleure compréhension de ses jetons d'invite.
Commençons par un exemple simple utilisant Mistral 7B.
Reportez-vous à la section **Avant de commencer* de cet article de blog pour remplir les conditions préalables à l'exécution des exemples. Cela inclut l'installation de Go, la configuration de l'accès à Amazon Bedrock et la fourniture des autorisations IAM nécessaires.*
Vous pouvez vous référer au code complet ici
Pour exécuter l'exemple :
git clone https://github.com/abhirockzz/mistral-bedrock-go cd mistral-bedrock-go go run basic/main.go
La réponse peut (ou non) être légèrement différente dans votre cas :
request payload: {"prompt":"\u003cs\u003e[INST] Hello, what's your name? [/INST]"} response payload: {"outputs":[{"text":" Hello! I don't have a name. I'm just an artificial intelligence designed to help answer questions and provide information. How can I assist you today?","stop_reason":"stop"}]} response string: Hello! I don't have a name. I'm just an artificial intelligence designed to help answer questions and provide information. How can I assist you today?
Vous pouvez vous référer au code complet ici.
Nous commençons par créer la charge utile JSON - elle est modélisée sous forme de structure (MistralRequest). Notez également l'ID du modèle mistral.mistral-7b-instruct-v0:2
const modelID7BInstruct = "mistral.mistral-7b-instruct-v0:2" const promptFormat = "<s>[INST] %s [/INST]" func main() { msg := "Hello, what's your name?" payload := MistralRequest{ Prompt: fmt.Sprintf(promptFormat, msg), } //...
Mistral a un format d'invite spécifique, où :
Dans les journaux de sortie ci-dessus, voyez comment le le jeton est interprété
Voici la structure MistralRequest qui possède les attributs requis :
type MistralRequest struct { Prompt string `json:"prompt"` MaxTokens int `json:"max_tokens,omitempty"` Temperature float64 `json:"temperature,omitempty"` TopP float64 `json:"top_p,omitempty"` TopK int `json:"top_k,omitempty"` StopSequences []string `json:"stop,omitempty"` }
InvokeModel est utilisé pour appeler le modèle. La réponse JSON est convertie en structure (MistralResponse) et la réponse texte en est extraite.
output, err := brc.InvokeModel(context.Background(), &bedrockruntime.InvokeModelInput{ Body: payloadBytes, ModelId: aws.String(modelID7BInstruct), ContentType: aws.String("application/json"), }) var resp MistralResponse err = json.Unmarshal(output.Body, &resp) fmt.Println("response string:\n", resp.Outputs[0].Text)
Passons à une simple interaction conversationnelle. C'est ce que Mistral appelle une invite multi-tours et nous ajouterons le qui est le jeton de fin de chaîne.
Pour exécuter l'exemple :
go run chat/main.go
Voici mon interaction :
Vous pouvez vous référer au code complet ici
Le code lui-même est excessivement simplifié pour les besoins de cet exemple. Mais ce qui est important, c'est la manière dont les jetons sont utilisés pour formater l'invite. Notez que nous utilisons Mixtral 8X7B (mistral.mixtral-8x7b-instruct-v0:1) dans cet exemple.
const userMessageFormat = "[INST] %s [/INST]" const modelID8X7BInstruct = "mistral.mixtral-8x7b-instruct-v0:1" const bos = "<s>" const eos = "</s>" var verbose *bool func main() { reader := bufio.NewReader(os.Stdin) first := true var msg string for { fmt.Print("\nEnter your message: ") input, _ := reader.ReadString('\n') input = strings.TrimSpace(input) if first { msg = bos + fmt.Sprintf(userMessageFormat, input) } else { msg = msg + fmt.Sprintf(userMessageFormat, input) } payload := MistralRequest{ Prompt: msg, } response, err := send(payload) fmt.Println("[Assistant]:", response) msg = msg + response + eos + " " first = false } }
Le jeton début de chaîne (bos) n'est nécessaire que une fois au début de la conversation, tandis que eos (fin de chaîne) marque la fin d'un seul échange de conversation (utilisateur et assistant).
Si vous avez lu mes blogs précédents, j'aime toujours inclure un exemple de "streaming" car :
Vous pouvez vous référer au code complet ici
Essayons ça. Cet exemple utilise Mistral Large - remplacez simplement l'ID du modèle par mistral.mistral-large-2402-v1:0. Pour exécuter l'exemple :
go run chat-streaming/main.go
Remarquez l'utilisation de InvokeModelWithResponseStream (au lieu d'Invoke) :
output, err := brc.InvokeModelWithResponseStream(context.Background(), &bedrockruntime.InvokeModelWithResponseStreamInput{ Body: payloadBytes, ModelId: aws.String(modelID7BInstruct), ContentType: aws.String("application/json"), }) //...
Pour traiter sa sortie, nous utilisons :
//... resp, err := processStreamingOutput(output, func(ctx context.Context, part []byte) error { fmt.Print(string(part)) return nil })
Voici quelques extraits de la fonction processStreamingOutput - vous pouvez vérifier le code ici. La chose importante à comprendre est comment les réponses partielles sont rassemblées pour produire le résultat final (MistralResponse).
func processStreamingOutput(output *bedrockruntime.InvokeModelWithResponseStreamOutput, handler StreamingOutputHandler) (MistralResponse, error) { var combinedResult string resp := MistralResponse{} op := Outputs{} for event := range output.GetStream().Events() { switch v := event.(type) { case *types.ResponseStreamMemberChunk: var pr MistralResponse err := json.NewDecoder(bytes.NewReader(v.Value.Bytes)).Decode(&pr) if err != nil { return resp, err } handler(context.Background(), []byte(pr.Outputs[0].Text)) combinedResult += pr.Outputs[0].Text op.StopReason = pr.Outputs[0].StopReason //... } op.Text = combinedResult resp.Outputs = []Outputs{op} return resp, nil }
Rappelez-vous : créer des applications IA/ML à l'aide de grands modèles de langage (comme Mistral, Meta Llama, Claude, etc.) n'implique pas que vous deviez utiliser Python. Les plates-formes gérées comme Amazon Bedrock donnent accès à ces modèles puissants à l'aide d'API flexibles dans une variété de langages de programmation, notamment Go! Grâce à la prise en charge du SDK AWS, vous pouvez utiliser le langage de programmation de votre choix pour intégrer Amazon Bedrock et créer des solutions d'IA générative.
Vous pouvez en savoir plus en explorant la documentation officielle de Mistral ainsi que le guide de l'utilisateur d'Amazon Bedrock. Bonne construction !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!