了解如何通过适用于 Go 的 AWS 开发工具包在 Amazon Bedrock 上使用 Mistral AI
Mistral AI 提供的模型在性能、成本等方面具有不同的特征:
让我们逐步了解如何通过 Go 在 Amazon Bedrock 上使用这些 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 milistral.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 有特定的提示格式,其中:
在上面的输出日志中,查看 如何显示令牌被解释
这是具有所需属性的 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)
继续进行简单的对话交互。这就是 Mistral 所说的多回合提示,我们将添加 这是字符串结尾标记。
运行示例:
go run chat/main.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) 标记仅在对话开始时需要 一次,而 eos (字符串结束) 标记结束单个对话交换(用户和助理)。
如果您读过我以前的博客,我总是喜欢包含一个“流媒体”示例,因为:
完整代码可以参考这里
让我们试试这个。此示例使用 Mistral Large - 只需将模型 ID 更改为 milistral.mistral-large-2402-v1:0。运行示例:
go run chat-streaming/main.go
注意 InvokeModelWithResponseStream(而不是 Invoke)的用法:
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 开发工具包支持,您可以使用您选择的编程语言与 Amazon Bedrock 集成,并构建生成式 AI 解决方案。
您可以通过浏览 Mistral 官方文档以及 Amazon Bedrock 用户指南来了解更多信息。快乐建造!
以上是使用 Mistral AI 通过 Go 构建生成式 AI 应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!