>  기사  >  백엔드 개발  >  Mistral AI를 사용하여 Go로 생성 AI 애플리케이션 구축

Mistral AI를 사용하여 Go로 생성 AI 애플리케이션 구축

WBOY
WBOY원래의
2024-08-09 13:13:09322검색

Go용 AWS SDK와 함께 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 mistral.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를 mistral.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 SDK 지원 덕분에 원하는 프로그래밍 언어를 사용하여 Amazon Bedrock과 통합하고 생성적 AI 솔루션을 구축할 수 있습니다.

공식 Mistral 문서와 Amazon Bedrock 사용자 가이드를 탐색하여 자세히 알아볼 수 있습니다. 즐거운 빌딩 되세요!

위 내용은 Mistral AI를 사용하여 Go로 생성 AI 애플리케이션 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.