본 포스팅에서는 chatgpt api key 발급부터 계좌 등록, golang을 이용한 간단한 ai 답변 기능 구현을 다룹니다.
API
를 클릭합니다.무료로 사용이 가능하다고도 알고 있지만 저는 계좌를 등록하지 않았을 때
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 카드여야 합니다.
API keys > Create new secret key
를 클릭하여 새 API Key
를 발급받습니다. 이 것 또한 무료이나 api 사용을 시작하게 되면 그에 따라 요금이 지불되게 됩니다.
생성을 완료하면 key
가 나오게 되는데 단 한 번만 보여주니 따로 저장해두시길 바라겠습니다.
GoLand
또는 VSCode
IDE
를 사용하여 프로젝트를 하나 만든 후 main.go
파일을 만들어주세요.
모든 실습은 main.go
파일에서 할 것입니다.
go-openai란? 개발자들이 golang으로 openai를 사용하기 위해 직접 만든 라이브러리
Open AI
공식문서를 보면 Python
과 Node.js
만 지원되는 것을 확인할 수 있습니다.
그래서 우리는 공식이 아니라 개발자들이 직접 만든 go open ai
라이브러리인 go-openai
를 다운로드받아 사용할 것입니다.
go-openai github
go get github.com/sashabaranov/go-openai
위의 명령어를 터미널에 입력하세요.
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
파일에 변수로 추가해주세요.
이제는 발급받은 key
를 사용하여 chat gpt
를 나의 터미널로 가져와 사용해볼 것입니다.
라이브러리는 go-openai
를 사용하였고 참고 코드는 go-openai github의 ChatGPT 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
가 코드에 보여지게 되고, 질문이 정해져 있어 활용도가 떨어집니다.
따라서 저는 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)
}
이제 위의 코드를 실행하여 고민을 털어놓고 상담을 받아보겠습니다.
이렇게 따스한 조언을 구할 수 있게 되었네요!