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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2024-08-09 13:13:09
原创
411 人浏览过

了解如何通过适用于 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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板