기획설명 : OpenAI 의 API를 활용해 재료를 입력받아 아이에게 해줄 영양식 레시피를 추천해주는 앱
과정은 정말 간단하다 ChatGPT가 다해준다...
방식만 알아도 레시피 추천 외에 구현하고자 하는 앱 목적에 맞게 얼마든지 활용가능하다
결과화면:
OpenAI API key 발급
먼저 OpenAI사이트에서 회원가입을 한다.
Developers -> Documentation
그리고 나의 계정을 클릭하면 나오는 드롭다운바에서 ViewAPIkeys선택
처음엔 Key가 없으므로 Create new secret Key를 눌러 Key를 생성하고 이 때 알려주는 키를
반드시 복사해서 따로 보관해야한다. 이 시점 이후로는 전체키를 보여주지 않기 때문.
이 키는 요금청구에 직접적으로 반영되므로 유출되지 않도록 해야한다.
필요한 라이브러리 다운로드
https://www.youtube.com/watch?v=gI9QSHpiMW0
OkGoDoIt깃허브
https://github.com/OkGoDoIt/OpenAI-API-dotnet
여기서 아래 Releases를 눌러 버전을 확인한다.
그리고 버전 1.6의 Source Code(.zip)파일을 받고 압축 해제 후 유니티 프로젝트에 넣어준다. (1.7.2 일수도 둘 중 하나였는데 잘 기억이..)
그러면 넣고 컴파일이 돌아가면 JSON오류가 뜰 텐데, 이를 해결하고 JSON을 사용하기 위해 Newtonsoft JSON을 다운로드 받는다.
JSON사용
https://wergia.tistory.com/163
위 블로그와 다른점은
1. Json130r2 버전을 사용한것과
2. 블로그는 net35를 사용했지만, 우리는 net45를 사용하면 된다.
net45폴더안의 NewtonSoft.Json.dll파일을 유니티 프로젝트에 포함시킨다
유니티 UI 설정
제대로 UI 를 구성하기에 앞서 ChatGPT API를 테스트해보기 위해 다음과 같이 UI를 구성한다
유니티 c# 스크립트
ChatGpt에는 크게 role과 content가 있다
사용할 수 있는 역할(role)은 1. System, 2. User, 3. Assistants 세가지가 있다.
1.System: 유저에게 메세지를 받기 전에 모델을 초기화하거나 구성하려는 경우에 사용.
2. Assistants: 이전에 ChatGPT가 보낸 메시지가 무엇인지 알려줄 수 있다
유저와 어시스턴트 사이의 대화를 저장하고, 어시스턴트에게 이전 대화를 전달하여 응답값 조절할 수 있다.
3. User : 직접적으로 ChatCPT에게 질문을 하는 부분
<OpenAIController>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using OpenAI_API;
using OpenAI_API.Chat;
using System;
using OpenAI_API.Models;
public class OpenAIController : MonoBehaviour
{
public TMP_Text textField;
public TMP_InputField inputField;
public Button okBtn;
private OpenAIAPI api;
private List<ChatMessage> messages;
void Start()
{
api = new OpenAIAPI("본인의 API키를 입력하시면 됩니다");
StartConversation();
okBtn.onClick.AddListener(() => GetResponse());
}
private void StartConversation()
{
messages = new List<ChatMessage>
{
new ChatMessage(ChatMessageRole.System, "너는 기업의 CEO를 알려주는 시스템이야. 만약 기업의 ceo를 물어보면, 너는 CEO이름 : 이름 CEO의 자산: 금액 CEO의 성별: 성별 의 형식을 꼭 맞추고 모든 대답을 단답형으로 하도록해")
//레시피용
//"You are an artificial intelligence that recommends nutritious meals for your child when you input the ingredients you have. Divide the recipe name, recipe, and required ingredients into descriptions.")//You are an artificial intelligence that recommends nutritious meals for your child when you input the ingredients you have. Divide the recipe name, recipe, and required ingredients into descriptions.
};
inputField.text = "";
string startString = "안녕하세요 기업인에 대해 알려드리겠습니다.";
textField.text = startString;
Debug.Log(startString);
}
private async void GetResponse()
{
if (inputField.text.Length < 1)
{
return;
}
//버튼 Disable
okBtn.enabled = false;
//유저 메세지에 inputField를
ChatMessage userMessage = new ChatMessage();
userMessage.Role = ChatMessageRole.User;
userMessage.Content = inputField.text;
if (userMessage.Content.Length > 100)
{
userMessage.Content = userMessage.Content.Substring(0, 100);
}
Debug.Log(string.Format("{0} : {1}", userMessage.Role, userMessage.Content));
//list에 메세지 추가
messages.Add(userMessage);
//textField에 userMessage표시
textField.text = string.Format("You: {0}", userMessage.Content);
//inputField 초기화
inputField.text = "";
// 전체 채팅을 openAI 서버에전송하여 다음 메시지(응답)를 가져오도록
var chatResult = await api.Chat.CreateChatCompletionAsync(new ChatRequest()
{
Model = Model.ChatGPTTurbo,
Temperature = 0.1,
MaxTokens = 200,
Messages = messages
});
//응답 가져오기
ChatMessage responseMessage = new ChatMessage();
responseMessage.Role = chatResult.Choices[0].Message.Role;
responseMessage.Content = chatResult.Choices[0].Message.Content;
Debug.Log(string.Format("{0}: {1}", responseMessage.rawRole, responseMessage.Content));
//응답을 message리스트에 추가
messages.Add(responseMessage);
//textField를 응답에 따라 Update
textField.text = string.Format("You: {0}\n\nChatGPT:\n{1}", userMessage.Content, responseMessage.Content);
//Okbtn다시 활성화
okBtn.enabled = true;
}
}
간단한 테스트를 위해 " 너는 기업의 시스템을 알려주는..." 의 문구를 System메세지에 추가한다. ChatGPT는 유저에게 메세지를 받기 전에 이 메세지를 받고 기본 시스템을 구성한다.
이제 필드에 구성해준 UI 게임오브젝트를 알맞게 할당해준다
실행결과 :
(TextMeshPro에서 한글을 사용하는 방법:
유니티에서 ChatGPT사용하여 레시피추천 앱 만들기(OpenAI API) - 2 https://zizh.tistory.com/95