首页  >  文章  >  后端开发  >  使用 Mistral AI 通过 Go 构建生成式 AI 应用程序

使用 Mistral AI 通过 Go 构建生成式 AI 应用程序

WBOY
WBOY原创
2024-08-09 13:13:09326浏览

了解如何通过适用于 Go 的 AWS 开发工具包在 Amazon Bedrock 上使用 Mistral AI

Mistral AI 提供的模型在性能、成本等方面具有不同的特征:

  • Mistral 7B - Mistral AI 发布的第一个密集模型,非常适合实验、定制和快速迭代。
  • Mixtral 8x7B - 专家模型的稀疏混合。
  • Mistral Large - 非常适合需要大量推理能力或高度专业化的复杂任务(合成文本生成、代码生成、RAG 或代理)。

让我们逐步了解如何通过 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 有特定的提示格式,其中:

  • 字符串的开头标记
  • 用户角色的文本位于 [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)

聊天示例

继续进行简单的对话交互。这就是 Mistral 所说的多回合提示,我们将添加 这是字符串结尾标记。

运行示例:

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) 标记仅在对话开始时需要 一次,而 eos (字符串结束) 标记结束单个对话交换(用户和助理)。

与流媒体聊天

如果您读过我以前的博客,我总是喜欢包含一个“流媒体”示例,因为:

  1. 从客户端应用程序的角度来看,它提供了更好的体验
  2. 忽略 InvokeModelWithResponseStream 函数(InvokeModel 的异步对应函数)是一个常见错误
  3. 部分模型负载响应可能很有趣(有时也很棘手)

完整代码可以参考这里

让我们试试这个。此示例使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn