[Go][Open API] ChatGPT openai를 활용하여 ai 답변을 받아보자

Haeun Noh·2024년 4월 8일
0

Go Lang

목록 보기
3/3
post-thumbnail

0409

본 포스팅에서는 chatgpt api key 발급부터 계좌 등록, golang을 이용한 간단한 ai 답변 기능 구현을 다룹니다.


1. Open AI 시작하기

1.1. Open AI 로그인/회원가입

  1. Open AI에 들어가 로그인/회원가입을 진행합니다.
  2. 로그인 후 아래의 화면에서 API를 클릭합니다.

1.2. Open AI에서 계좌 등록하기

무료로 사용이 가능하다고도 알고 있지만 저는 계좌를 등록하지 않았을 때

you exceeded your current quota, please check your plan and billing details. for more information on this error, read the do

위와 같은 에러가 발생하였기 때문에 계좌를 등록해주겠습니다.

첫 번째로 계좌를 등록하고 난 뒤에는 5달러정도가 빠져나가는데 며칠이 지나면 돌아오게 되니 걱정하지 않으셔도 됩니다. 계좌 등록은 무료입니다.

Settings > Billing > Add to credit balance로 계좌를 등록해줍니다. 이 때 카드는 Visa 카드여야 합니다.

1.3. API Keys 발급받기

API keys > Create new secret key를 클릭하여 새 API Key를 발급받습니다. 이 것 또한 무료이나 api 사용을 시작하게 되면 그에 따라 요금이 지불되게 됩니다.

생성을 완료하면 key가 나오게 되는데 단 한 번만 보여주니 따로 저장해두시길 바라겠습니다.



2. GoLang 프로젝트 세팅하기

2.1. 프로젝트 생성하기

GoLand 또는 VSCode IDE를 사용하여 프로젝트를 하나 만든 후 main.go파일을 만들어주세요.
모든 실습은 main.go파일에서 할 것입니다.


2.2. go-openai 설치

go-openai란? 개발자들이 golang으로 openai를 사용하기 위해 직접 만든 라이브러리

Open AI 공식문서를 보면 PythonNode.js만 지원되는 것을 확인할 수 있습니다.

그래서 우리는 공식이 아니라 개발자들이 직접 만든 go open ai 라이브러리인 go-openai를 다운로드받아 사용할 것입니다.
go-openai github

go get github.com/sashabaranov/go-openai

위의 명령어를 터미널에 입력하세요.


2.3. godotenv 설치

godotenv란? Go 언어로 작성된 패키지 중 하나로, 프로젝트의 루트 디렉토리에 있는 .env 파일을 로드하여 환경 변수를 설정하는 기능을 제공한다.

.env 파일은 주로 민감한 정보나 환경별로 변경될 수 있는 설정을 저장하는 데 사용됩니다. 파일은 아래와 같이 key = valu형태로 작성됩니다.

API_KEY = "your api key"

이 때 github에 올릴 경우 정보의 유출을 막기 위해 .env파일은 반드시 .gitignore에 추가해주어야 합니다!


go get github.com/joho/godotenv

위의 명령어를 터미널에 입력하세요.

.env파일은 root 디렉토리 바로 아래에 위치시켜주었습니다.
여러분도 발급받은 api key.env파일에 변수로 추가해주세요.



3. GoLang으로 Chat GPT api 사용해보기

이제는 발급받은 key를 사용하여 chat gpt를 나의 터미널로 가져와 사용해볼 것입니다.

3.1. go-openai 라이브러리의 support context 코드 적용하기

라이브러리는 go-openai를 사용하였고 참고 코드는 go-openai githubChatGPT support context이며 아래의 코드와 같습니다.

package main

import (
	"bufio"
	"context"
	"fmt"
	"os"
	"strings"

	"github.com/sashabaranov/go-openai"
)

func main() {
	client := openai.NewClient("your token")
	messages := make([]openai.ChatCompletionMessage, 0)
	reader := bufio.NewReader(os.Stdin)
	fmt.Println("Conversation")
	fmt.Println("---------------------")

	for {
		fmt.Print("-> ")
		text, _ := reader.ReadString('\n')
		// convert CRLF to LF
		text = strings.Replace(text, "\n", "", -1)
		messages = append(messages, openai.ChatCompletionMessage{
			Role:    openai.ChatMessageRoleUser,
			Content: text,
		})

		resp, err := client.CreateChatCompletion(
			context.Background(),
			openai.ChatCompletionRequest{
				Model:    openai.GPT3Dot5Turbo,
				Messages: messages,
			},
		)

		if err != nil {
			fmt.Printf("ChatCompletion error: %v\n", err)
			continue
		}

		content := resp.Choices[0].Message.Content
		messages = append(messages, openai.ChatCompletionMessage{
			Role:    openai.ChatMessageRoleAssistant,
			Content: content,
		})
		fmt.Println(content)
	}
}

하지만 위의 코드는 api key가 코드에 보여지게 되고, 질문이 정해져 있어 활용도가 떨어집니다.


3.2. go-openai 라이브러리 코드 변경해보기

따라서 저는 api key.env파일에서 변수로 가져와 사용할 것이며, 사용자의 입력을 받아 Content값을 유동적으로 처리할 것입니다.

이에 아래와 같이 코드를 수정하였습니다.

package main

import (
	"bufio"
	"context"
	"fmt"
	"github.com/joho/godotenv"
	openai "github.com/sashabaranov/go-openai"
	"log"
	"os"
)

func main() {
	// .env파일을 찾습니다. 
	if err := godotenv.Load(); err != nil {
		log.Fatalf("Error loading .env file: %v", err)
	}

	// API_KEY 환경 변수를 가져옵니다.
	apiKey := os.Getenv("API_KEY")

	// api key로 OpenAI 클라이언트를 생성합니다.
	client := openai.NewClient(apiKey)

	// 사용자에게 입력을 받습니다.
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("사용자 입력: ")
	userInput, _ := reader.ReadString('\n')
    // 항상 비슷한 형태의 대답을 보여주기 위해 텍스트 프롬프트를 사용자의 입력 뒤에 추가합니다. 
	baseStr := "위에 대한 대답은 명확하며 반드시 발랄하게 ~요체를 쓰며, 친구같이 진심으로 위로해주며 취업, 학업, 인간관계, 건강, 금전, 개인 카테고리에 대한 고민을 듣고 친구가 친구에게 말하듯이 일상적인 말투로 진지하게 고민에 대한 조언을 스토리텔링으로 뻔하지 않게 답을 해줘"

	// 사용자의 입력을 OpenAI API로 전달하여 응답을 받습니다.
	resp, err := client.CreateChatCompletion(
		context.Background(),
		openai.ChatCompletionRequest{
        	// ai 모델로는 GPT3Dot5Turbo를 사용합니다. 
			Model: openai.GPT3Dot5Turbo,
			Messages: []openai.ChatCompletionMessage{
				{
                	// 사용자의 입력
					Role:    openai.ChatMessageRoleUser,
                    // 사용자가 입력한 내용에 기본 텍스트 프롬프트를 더하여 값을 전달합니다. 
					Content: userInput + baseStr,
				},
			},
		},
	)

	// 오류를 확인하고 출력합니다.
    // 만약 계좌가 연동되지 않았다면 이 곳에서 429 에러가 발생할 수 있습니다. 
	if err != nil {
		fmt.Printf("ChatCompletion error: %v\n", err)
		return
	}

	// 응답에서 첫 번째 선택의 내용을 출력합니다.
	fmt.Println("GPT-3.5 응답:", resp.Choices[0].Message.Content)
}

3.3. Chat GPT로 고민 해결해보기

이제 위의 코드를 실행하여 고민을 털어놓고 상담을 받아보겠습니다.
이렇게 따스한 조언을 구할 수 있게 되었네요!



profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글