ChatGPT API（gpt-3.5-turbo）を GoLang から使ってみる

# はじめに
こんにちは！この記事では、OpenAIが提供するChatGPT APIを使い、Golangで実装した方法について紹介します。このAPIは、自然言語に対する返答を生成する機械学習モデルを提供します。

以下は、ChatGPT APIの使い方のリンクです。ここで提供されている情報に沿って、Golangのサンプルプログラムを作成しました。

https://platform.openai.com/docs/api-reference/chat/create

こちらがGithubのリポジトリになります。ご自由にご活用ください。

https://github.com/bluewolfali/chatgpt-turbo-sample-code


以下のはChatGPTのAPIの使い方です。
https://platform.openai.com/docs/api-reference/chat/create

### main.go
```go:main.go
package main

import (
	"bufio"
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"os"
	"strings"
)

const openaiURL = "https://api.openai.com/v1/chat/completions"

var messages []Message

func main() {
	apiKey := "YOUR_API_KEY"

	reader := bufio.NewReader(os.Stdin)

	for {
		fmt.Print("Ask a question: ")
		question, _ := reader.ReadString('\n')
		question = strings.TrimSpace(question)

		if question == "exit" {
			break
		}

		messages = append(messages, Message{
			Role:    "user",
			Content: question,
		})

		response := getOpenAIResponse(apiKey)
		fmt.Println(response.Choices[0].Messages.Content)
		print("\n")
	}
}

func getOpenAIResponse(apiKey string) OpenaiResponse {
	requestBody := OpenaiRequest{
		Model:    "gpt-3.5-turbo",
		Messages: messages,
	}

	requestJSON, _ := json.Marshal(requestBody)

	req, err := http.NewRequest("POST", openaiURL, bytes.NewBuffer(requestJSON))
	if err != nil {
		panic(err)
	}

	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "Bearer "+apiKey)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer func(Body io.ReadCloser) {
		err := Body.Close()
		if err != nil {
			panic(err)
		}
	}(resp.Body)

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}

	var response OpenaiResponse
	err = json.Unmarshal(body, &response)
	if err != nil {
		println("Error: ", err.Error())
		return OpenaiResponse{}
	}

	messages = append(messages, Message{
		Role:    "assistant",
		Content: response.Choices[0].Messages.Content,
	})

	return response
}
```
### structs.go
```go:structs.go
package main

type OpenaiRequest struct {
	Model    string    `json:"model"`
	Messages []Message `json:"messages"`
}

type OpenaiResponse struct {
	ID      string   `json:"id"`
	Object  string   `json:"object"`
	Created int      `json:"created"`
	Choices []Choice `json:"choices"`
	Usages  Usage    `json:"usage"`
}

type Choice struct {
	Index        int     `json:"index"`
	Messages     Message `json:"message"`
	FinishReason string  `json:"finish_reason"`
}

type Message struct {
	Role    string `json:"role"`
	Content string `json:"content"`
}

type Usage struct {
	PromptTokens     int `json:"prompt_tokens"`
	CompletionTokens int `json:"completion_tokens"`
	TotalTokens      int `json:"total_tokens"`
}

```
### makefile
```makefile:makefike
APP_NAME=chatgpt-turbo-sample-code

all: clean build

build:
	go build -o $(APP_NAME)

clean:
	rm -f $(APP_NAME)

run:
	./$(APP_NAME)

.PHONY: all build clean run
```

## 実行方法
```bash:bash
make
./chatgpt-turbo-sample-code
```

## 結果 

![demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3216374/68390915-0fb2-6556-2a80-ce950d0da9df.png)