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

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

Aug 09, 2024 pm 01:13 PM

了解如何通过适用于 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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1672
14
CakePHP 教程
1428
52
Laravel 教程
1333
25
PHP教程
1277
29
C# 教程
1257
24
Golang vs. Python:性能和可伸缩性 Golang vs. Python:性能和可伸缩性 Apr 19, 2025 am 12:18 AM

Golang在性能和可扩展性方面优于Python。1)Golang的编译型特性和高效并发模型使其在高并发场景下表现出色。2)Python作为解释型语言,执行速度较慢,但通过工具如Cython可优化性能。

Golang和C:并发与原始速度 Golang和C:并发与原始速度 Apr 21, 2025 am 12:16 AM

Golang在并发性上优于C ,而C 在原始速度上优于Golang。1)Golang通过goroutine和channel实现高效并发,适合处理大量并发任务。2)C 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

开始GO:初学者指南 开始GO:初学者指南 Apr 26, 2025 am 12:21 AM

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.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的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。

表演竞赛:Golang vs.C 表演竞赛:Golang vs.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

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t

See all articles