유니티에서 ChatGPT사용하여 레시피추천 앱 만들기(OpenAI API) - 1 : https://zizh.tistory.com/94
새로운 씬을 만들어 UI를 구성한다.
이전 스크립트를 목적에 맞게 수정한다
<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;
public GameObject Recipe;
public TMP_Text recipeNameField;
public TMP_Text recipeField;
public TMP_Text ingredientsNeededField;
public TMP_Text cautionField;
private OpenAIAPI api;
private List<ChatMessage> messages;
void Start()
{
api = new OpenAIAPI("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");
StartConversation();
okBtn.onClick.AddListener(() => GetResponse());
}
private void StartConversation()
{
messages = new List<ChatMessage>
{
new ChatMessage(ChatMessageRole.System, "너는 가지고 있는 재료를 입력하면 아이에게 해 줄 영양식을 추천해주는 시스템이야. 레시피 이름: 레시피: 필요한 재료: 아이가 먹을 때 주의할 점: 의 형식을 꼭 맞춰서 대답해.")//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(UIManager.ingredients == null)
{
//Log가 아닌 아래문구를 포함한 경고창 띄워주는 작업 필요
Debug.Log("무슨 재료를 가지고 계신가요? 알려주시면 그에 맞는 건강한 레시피를 추천해드릴게요.");
return;
}
/* if (inputField.text.Length < 1)
{
return;
}*/
okBtn.enabled = false;
//유저 메세지에 inputField를
ChatMessage userMessage = new ChatMessage();
userMessage.Role = ChatMessageRole.User; //이 userMessage는 role이 User.
//userMessage.Content = inputField.text;
//입력받은 재료기반으로 묻게끔 변환
userMessage.Content = UIManager.ingredients + "으로 만들 수 있는 아이에게 해 줄 건강식 레시피 추천해줘";
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.9,
MaxTokens = 400,
Messages = messages
});
//응답 가져오기
ChatMessage responseMessage = new ChatMessage();
responseMessage.Role = chatResult.Choices[0].Message.Role;
responseMessage.Content = chatResult.Choices[0].Message.Content;
Recipe.SetActive(true);
UpdateText(responseMessage);
Debug.Log(string.Format("{0}: {1}", responseMessage.rawRole, responseMessage.Content));
//응답을 message리스트에 추가
messages.Add(responseMessage);
okBtn.enabled = true;
}
public void UpdateText(ChatMessage responseMessage)
{
//string형식으로 사용하려면 responMessage.ToString()이 아니라, responMessage.Content를 사용하면 된다
string[] splitText = responseMessage.Content.Split(new string[] { "레시피 이름:", "레시피:", "필요한 재료:", "아이가 먹을 때 주의할 점:" }, StringSplitOptions.None);
string recipeName = splitText[1];
string recipe = splitText[2];
string ingredients = splitText[3];
string caution = splitText[4];
Debug.Log("recipeName:" +recipeName);
Debug.Log("recipe:" +recipe);
Debug.Log("ingredients:"+ingredients);
Debug.Log("caution:" +caution);
recipeNameField.text = recipeName;
recipeField.text = string.Format("레시피: \n\n{0}", recipe);
ingredientsNeededField.text = string.Format("필요한 재료: \n\n{0}", ingredients);
cautionField.text = string.Format("아이가 먹을 때 주의할 점: \n\n{0}", caution);
}
}
StartConversation():
message리스트에 System메세지를 추가하여 활용할 ChatGpt시스템을 앱의 목적에 맞게 구성한다. ChatGpt의 기본목적을 가지고 있는 재료를 입력하면 아이에게 해 줄 영양식을 추천해주는 시스템으로 구성하고,
받은 응답 내용을 하나의 텍스트로 출력하는게 아닌 항목별로 나누어 사용자에게 보여지는 작업이 가능하도록
구분할레시피 이름, 레시피, 필요한 재료, 주의할 점의 형식을 맞춰서 응답할 수 있도록 한다.
GetResponse()에서 "가지고있는재료들 + 로 할 수 있는 레시피" 형태의 질문을(role: User) 받으면 message리스트에 추가하고 , 전체 채팅을 openAI 서버에전송하여 다음 메시지(응답)를 가져오도록 하는 과정
ChatMessasge responseMessage = new ChatMessage();
여기서 ChatMessage형식 responseMessage를 String 형식으로 사용하고 싶다면,
responseMessage.ToString(); 이 아니라
responseMessage.Content; (String 형식)를 이용한다.
UpdateText()
레시피 이름, 레시피, 필요한 재료, 주의해야 할 점 형태로 생성하도록 한 응답을 Split()메소드로 각 항목별로 나누어 5개의 string변수에 할당. 해당되는 텍스트 필드에 응답이 표시되도록 구현
실행결과