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

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

Aug 09, 2024 pm 01:13 PM

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang vs. Python:パフォーマンスとスケーラビリティ Golang vs. Python:パフォーマンスとスケーラビリティ Apr 19, 2025 am 12:18 AM

Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

Golang and C:Concurrency vs. Raw Speed Golang and C:Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

ゴーを始めましょう:初心者のガイド ゴーを始めましょう:初心者のガイド Apr 26, 2025 am 12:21 AM

goisidealforforbeginnersandsutable forcloudnetworkservicesduetoitssimplicity、andconcurrencyfeatures.1)installgofromtheofficialwebsiteandverify with'goversion'.2)

Golang vs. C:パフォーマンスと速度の比較 Golang vs. C:パフォーマンスと速度の比較 Apr 21, 2025 am 12:13 AM

Golangは迅速な発展と同時シナリオに適しており、Cは極端なパフォーマンスと低レベルの制御が必要なシナリオに適しています。 1)Golangは、ごみ収集と並行機関のメカニズムを通じてパフォーマンスを向上させ、高配列Webサービス開発に適しています。 2)Cは、手動のメモリ管理とコンパイラの最適化を通じて究極のパフォーマンスを実現し、埋め込みシステム開発に適しています。

Golang vs. Python:重要な違​​いと類似点 Golang vs. Python:重要な違​​いと類似点 Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

GolangとC:パフォーマンスのトレードオフ GolangとC:パフォーマンスのトレードオフ Apr 17, 2025 am 12:18 AM

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

パフォーマンスレース:ゴラン対c パフォーマンスレース:ゴラン対c Apr 16, 2025 am 12:07 AM

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

Golang vs. Python:長所と短所 Golang vs. Python:長所と短所 Apr 21, 2025 am 12:17 AM

GolangisidealforBuildingsCalables Systemsduetoitsefficiency andConcurrency、Whilepythonexcelsinquickscriptinganddataanalysisduetoitssimplicityand vastecosystem.golang'ssignencouragesclean、readisinediteNeditinesinedinediseNabletinedinedinedisedisedioncourase

See all articles