ホームページ  >  記事  >  バックエンド開発  >  Mistral AI を使用して Go で生成 AI アプリケーションを構築する

Mistral AI を使用して Go で生成 AI アプリケーションを構築する

WBOY
WBOYオリジナル
2024-08-09 13:13:09322ブラウズ

AWS SDK for Go を使用して Amazon Bedrock で Mistral AI を使用する方法を学びます

Mistral AI は、パフォーマンス、コストなどのさまざまな特性を持つモデルを提供します。

  • Mistral 7B - Mistral AI によってリリースされた最初の高密度モデル。実験、カスタマイズ、素早い反復に最適です。
  • Mixtral 8x7B - 専門家のまばらな混合モデル。
  • Mistral Large - 大規模な推論機能を必要とする複雑なタスク、または高度に専門化されたタスク (合成テキスト生成、コード生成、RAG、またはエージェント) に最適です。

Go を使用して Amazon Bedrock でこれらの Mistral AI モデルを使用する方法を見てみましょう。また、その過程でプロンプト トークンについてもよく理解できます。

Mistral AI を始める

Mistral 7B を使用した簡単な例から始めましょう。

サンプルを実行するための前提条件を完了するには、このブログ投稿の **始める前に* セクションを参照してください。これには、Go のインストール、Amazon Bedrock アクセスの構成、必要な IAM 権限の付与が含まれます。*

完全なコードはここで参照できます

例を実行するには:

git clone https://github.com/abhirockzz/mistral-bedrock-go
cd mistral-bedrock-go

go run basic/main.go

あなたの場合、応答は若干異なる場合があります (または異なる場合があります):

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?

完全なコードはここで参照できます。

まず、JSON ペイロードを作成します。これは構造体 (MistralRequest) としてモデル化されています。また、モデル ID misstral.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 には特定のプロンプト形式があります。

  • 文字列の先頭トークン
  • を参照します
  • ユーザー ロールのテキストは [INST]...[/INST] トークン内にあります
  • 外側のテキストはアシスタントの役割です

上記の出力ログで、 がどのように変化するかを確認してください。トークンが解釈されます

必要な属性を持つ MistralRequest 構造体は次のとおりです。

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 はモデルを呼び出すために使用されます。 JSON 応答は構造体 (MistralResponse) に変換され、そこからテキスト応答が抽出されます。

    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)

チャットの例

簡単な会話のやり取りに移ります。これは、ミストラルが マルチターン プロンプト と呼ぶもので、 を追加します。これは文字列の終わりトークンです。

例を実行するには:

go run chat/main.go

これが私のやり取りです:

Use Mistral AI to build generative AI applications with Go

完全なコードはここで参照できます

コード自体は、この例の目的のために過度に単純化されています。ただし、重要なのは、トークンを使用してプロンプトをフォーマットする方法です。この例では Mixtral 8X7B (mistral.mixtral-8x7b-instruct-v0:1) を使用していることに注意してください。

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
    }
}

文字列の始まり (bos) トークンは会話の開始時に 1 回のみ必要ですが、eos (文字列の終わり) は終了を示します。単一の会話交換 (ユーザーとアシスタント)。

ストリーミングでチャットする

私の以前のブログを読んでいるなら、私は常に「ストリーミング」の例を含めたいと思っています。その理由は次のとおりです。

  1. クライアント アプリケーションの観点からより優れたエクスペリエンスを提供します
  2. InvokeModelWithResponseStream 関数 (InvokeModel の非同期関数) を見落とすのはよくある間違いです
  3. 部分モデルのペイロード応答は興味深い場合があります (時には注意が必要です)

完全なコードはここで参照できます

これを試してみましょう。この例では、Mistral Large を使用します。モデル ID を mistral.mistral-large-2402-v1:0 に変更するだけです。例を実行するには:

go run chat-streaming/main.go

(Invoke の代わりに) InvokeModelWithResponseStream を使用していることに注意してください。

    output, err := brc.InvokeModelWithResponseStream(context.Background(), &bedrockruntime.InvokeModelWithResponseStreamInput{
        Body:        payloadBytes,
        ModelId:     aws.String(modelID7BInstruct),
        ContentType: aws.String("application/json"),
    })
    //...

その出力を処理するには、以下を使用します:

    //...
    resp, err := processStreamingOutput(output, func(ctx context.Context, part []byte) error {
        fmt.Print(string(part))
        return nil
    })

ここに processStreamingOutput 関数の一部を示します。コードはここで確認できます。理解しておくべき重要なことは、部分応答がどのように収集されて最終出力 (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
}

結論

覚えておいてください - 大規模言語モデル (Mistral、Meta Llama、Claude など) を使用して AI/ML アプリケーションを構築することは、Python を使用する必要があることを意味するものではありません。 Amazon Bedrock のようなマネージド プラットフォームでは、Go! を含むさまざまなプログラミング言語の柔軟な API を使用して、これらの強力なモデルへのアクセスが提供されます。 AWS SDK サポートのおかげで、選択したプログラミング言語を使用して Amazon Bedrock と統合し、生成型 AI ソリューションを構築できます。

Mistral の公式ドキュメントや Amazon Bedrock ユーザーガイドを参照すると、さらに詳しく知ることができます。楽しく建築しましょう!

以上がMistral AI を使用して Go で生成 AI アプリケーションを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。