Content-type 의 값을 application/json Authorization을 bearer (openai키값) 을 넣어준다.
모델은 gpt-3.5-turbo 버전으로 세팅한뒤 보낼 json body를 작성한다.
post 이후 받은데이터
api가 어떤식으로 보내지고 받아지는지 확인했다. 이제 Unity code를 짜보자
우선 class를 json형식에 맞게 형식을 잡아준다.
받은 json형식의 string을 알맞게 디시리얼라이징을 해줘야 하기때문에 Response class 역시 만들어준다
Http 요청방법은 마이크로 소프트의 HttpCilent 를 사용하였다.
CreateHttpClient 함수에서 client를 생성해주며 헤더설정과 주소를 세팅 body를 이전에 만들었던 class를 json 형식으로 serializeing 해준뒤 Client.postAsync로 전송 순서 1. cilent 생성및 해더 세팅 2.일전에 설정했던 데이터class 를 json형식으로 변경 3.Post로 전송후 대기 4.받아온 데이터를 다시 만들어두었던 형식으로 디시리얼라이징
private string API_Url = "";
private const string AuthorizationHeader = "Bearer";
private const string UserAgentHeader = "User-Agent";
//httpclient 세팅
private void CreateHttpClient()
{
client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(AuthorizationHeader, OpenAI_Key);
client.DefaultRequestHeaders.Add(UserAgentHeader, "okgodoit/dotnet_openai_api");
}
//받은 class를 post 하는 함수
private async Task<string> ClieantResponse<SendData>(SendData request)
{
if (client == null)
{
CreateHttpClient();
}
//class마다 URL 이라는 인터페이스로 공통 url불러올수있는 함수사용
API_Url = ((URL)request).Get_API_Url();
//json 시리얼라이징
string jsonContent = JsonConvert.SerializeObject(request, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore });
var stringContent = new StringContent(jsonContent, UnicodeEncoding.UTF8, "application/json");
Debug.Log(API_Url);
Debug.Log(stringContent);
//데이터 전송후 대기
using (var response = await client.PostAsync(API_Url, stringContent))
{
if (response.IsSuccessStatusCode)
{
//데이터 정상적으로 받은경우 json string 반환
return await response.Content.ReadAsStringAsync();
}
else
{
throw new HttpRequestException("Error calling OpenAi API to get completion. HTTP status code: " + response.StatusCode.ToString() + ". Request body: " + jsonContent);
}
}
}
만든 CilentResponse 를 좀더 편하게 사용하기위한 함수 제작 및 캡슐화
테스트용 코드
만들었던 Request class 생성후 세팅 보내는 함수 실행후 로그확인
chat의 경우
api는 Role이 3가지로 나뉜다 우선 system Gpt의 기본 설정을 해주는 message이다 User는 사람 assistant는 대답이다.
대화한 내용을 user와 assistant로 계속 추가해서 보내면 대화내용을 전부 확인하고 대답을 출력하기에 대답을 기억하게 하고싶은경우 chatRequest class에 ChatMessage를 계속 추가해주면서 보내면 된다.
미리 대화를 어느정도 입력하는것으로 학습시킬수있다. 위의 예시처럼 대화를 미리 넣어두는경우 다음대화를 어느정도 추출이가능하다.
새로운 기능들이 추가되어 코드를 수정하였다..
일전의 베이스 대화세팅, 대화 데이터 유지 기능은 다른기능을 포함하며 삭제하였다. 하나의 기능으로 묶어버릴시 너무 난잡해지기 때문이다.
위의 코드로 테스트한 음성생성과 이미지 생성이다.
이들도 크게 다르지않게 보내는 class 받는 class를 만든뒤 그에맞게 설정하고 json으로 파싱하여 사용하는 방식이다.