Maison  >  Article  >  développement back-end  >  Utilisez Mistral AI pour créer des applications d'IA générative avec Go

Utilisez Mistral AI pour créer des applications d'IA générative avec Go

WBOY
WBOYoriginal
2024-08-09 13:13:09201parcourir

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 :

  • Mistral 7B - Le premier modèle dense publié par Mistral AI, parfait pour l'expérimentation, la personnalisation et l'itération rapide.
  • Mixtral 8x7B - Un mélange clairsemé de modèles experts.
  • Mistral Large - idéal pour les tâches complexes nécessitant de grandes capacités de raisonnement ou hautement spécialisées (génération de texte synthétique, génération de code, RAG ou agents).

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.

Premiers pas avec Mistral IA

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ù :

  • fait référence au début de chaîne jeton
  • le texte du rôle d'utilisateur se trouve à l'intérieur des jetons [INST]...[/INST]
  • le texte à l'extérieur est le rôle d'assistant

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)

Exemple de discussion

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 :

Use Mistral AI to build generative AI applications with Go

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).

Discutez en streaming

Si vous avez lu mes blogs précédents, j'aime toujours inclure un exemple de "streaming" car :

  1. Il offre une meilleure expérience du point de vue de l'application client
  2. C'est une erreur courante de négliger la fonction InvokeModelWithResponseStream (l'équivalent asynchrone d'InvokeModel)
  3. La réponse partielle de la charge utile du modèle peut être intéressante (et parfois délicate)

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
}

Conclusion

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn