본문 바로가기
Toy

ChatGPT API (OpenAI API) 시작하기 (2) - C# 으로 튜토리얼 실행

by 크라크라 2024. 8. 18.

안녕하세요. 이제 openAI API 키를 발급받았으니 실제로 호출을 해보려고 합니다. 

단, 일반적으로 제공하는 언어 버전 (python, javascript)는 아니고 C# 으로요. 

 

오늘자 기준으로 주로 언급되는 라이브러리는 총 3개인 것 같습니다. 

- betalgo/openai

https://github.com/betalgo/openai

 

GitHub - betalgo/openai: OpenAI .NET sdk - Azure OpenAI, ChatGPT, Whisper, and DALL-E

OpenAI .NET sdk - Azure OpenAI, ChatGPT, Whisper, and DALL-E - GitHub - betalgo/openai: OpenAI .NET sdk - Azure OpenAI, ChatGPT, Whisper, and DALL-E

github.com

 

- openai/dot-net

https://github.com/openai/openai-dotnet

 

GitHub - openai/openai-dotnet: The official .NET library for the OpenAI API

The official .NET library for the OpenAI API. Contribute to openai/openai-dotnet development by creating an account on GitHub.

github.com

 

- rageagainstthepixel/dot-net

https://github.com/RageAgainstThePixel/OpenAI-DotNet

 

GitHub - RageAgainstThePixel/OpenAI-DotNet: A Non-Official OpenAI RESTful API Client for DotNet

A Non-Official OpenAI RESTful API Client for DotNet - RageAgainstThePixel/OpenAI-DotNet

github.com

 

 

공식 버전은 2번째 openai-dotnet 인데, 아직 이용자가 많지는 않은 것 같고 현재까지 가장 많은 관심을 가지고 있는 라이브러리는 1번째 betalgo 입니다. 

 

이번 글에서는 betalgo 기준으로 간단하게 실행만 시켜보도록 하겠습니다. (물론 자세한 내용은 위 링크의 Readme 를 참고합시다.)

 


 

일단 필요한 것부터 챙겨옵시다. 

https://platform.openai.com/api-keys

 

위의 페이지에 접근하고 로그인을 하면 실제로 사용가능한 프로젝트별  API Key 를 확인할 수 있습니다. 

기본적인 접근 순서는  Home > Dashboard > Api Keys 입니다. 

만약에 프로젝트를 여러 개 생성해두셨다면 왼쪽 위의 Personal 옆에서 프로젝트를 교체해가면서 확인이 가능합니다.

만약에 API Key 를 만들어두지 않았다면 오른쪽 상단의 초록색 버튼 (Create new secret key) 를 눌러서 진행해주시면 됩니다.

우리는 저 API Key의 "SECRET KEY" 값을 사용합니다.

 


 

이제 준비가 되었다면 간단한 콘솔 프로젝트를 생성해서 호출해보도록 하겠습니다. 

닷넷이 설치되어 있고, Visual Studio Code 에서 커맨드 라인으로 프로젝트를 생성한다고 가정하겠습니다. 

(Visual Studio 기준으로는 콘솔앱 생성이 되겠습니다. )

 

-- 프로젝트 생성
dotnet new console -n OpenAITestConsole
-- Betalgo 라이브러리 추가
dotnet add package Betalgo.OpenAI

 

 

이제 Program.cs 파일에서 간단한 응답을 받아서 출력을 해보도록 하겠습니다. 

 

위에서 추가한 라이브러리를 가지고 OpenAIService 를 새로 생성해줍니다.

MY-OPEN-API-KEY 자리에는 위에서 생성한 SECRET-KEY 를 사용해주시면 됩니다.

using OpenAI;
using OpenAI.Managers;
using OpenAI.ObjectModels;
using OpenAI.ObjectModels.RequestModels;

var openAiService = new OpenAIService(new OpenAiOptions()
{
    ApiKey = "MY-OPEN-API-KEY",
    DefaultModelId = Models.Gpt_3_5_Turbo
});

 

비용 이슈로 기본 모델을 GPT3.5 Turbo 로 지정했지만, 실제로 사용하면서 Model 를 직접 지정할 수도 있고, 기본 모델을 4.0으로 가져가셔도 무방합니다. 

 

홈페이지 및 라이브러리에서 기본적으로 제공하는 튜토리얼을 따라해봅시다. 

실제 상황에 대한 테스트는 https://platform.openai.com/playground/ 에서 바로 해볼 수 있습니다. 

아래의 스크린샷은 플레이그라운드에서 튜토리얼을 동일하게 재연해본 내용입니다. 

 

 

기본적인 흐름은 아래와 같습니다.

 

1. SYSTEM 의 역할을 지정하고

2. USER (사용자, 여러분) 이 질문을 던지면

3. ASSISTANT ( ChatGPT , OpenAPI) 가 답변하고

4. USER 가 다시 질문을 던진 상황에서

5. ASSISTANT 의 답변을 API로부터 받아온다. => API의 응답은?

 

 

 

채팅에 대한 요소는 ChatCompletion 을 사용합니다. 

CreateCompletion 으로 채팅을 생성한다음, API에 전달할 메시지 쌍을 리스트로 감쌉니다. 

그리고 실제 이것에 대한 응답을 만들어낼 모델을 정의합니다. 정의하지 않으면 초기 생성시에 사용한 모델을 그대로 사용합니다. 

 

만약에 성공한다면 첫 번째 Choice의 Message -> Content 를 가져오면 실제 응답 메시지를 확인할 수 있습니다.

try
{
    var completionResult = await openAiService.ChatCompletion.CreateCompletion(new ChatCompletionCreateRequest
    {

        Messages = new List<ChatMessage>
        {
            ChatMessage.FromSystem("You are a helpful assistant."),
            ChatMessage.FromUser("Who won the world series in 2020?"),
            ChatMessage.FromAssistant("The Los Angeles Dodgers won the World Series in 2020."),
            ChatMessage.FromUser("Where was it played?")
        },
        //Model = Models.Gpt_4o,
    });
    Console.WriteLine(completionResult.Error?.Message);

    if (completionResult.Successful)
    {
        Console.WriteLine(completionResult.Choices.First().Message.Content);
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

 

플레이그라운드에서 실행한 결과와 API 를 가지고 실행한 결과가 동일한 것을 확인할 수 있습니다.

 

실제 모델의 응답은 다음 구조로 정의되어 있습니다. 

만약에 실제 토큰의 사용량까지 체크해야한다면 usage 아래의 token 들을 같이 체크해주시면 좋을 것입니다.

{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "The 2020 World Series was played in Texas at Globe Life Field in Arlington.",
        "role": "assistant"
      },
      "logprobs": null
    }
  ],
  "created": 1677664795,
  "id": "chatcmpl-7QyqpwdfhqwajicIEznoc6Q47XAyW",
  "model": "gpt-4o-mini",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 17,
    "prompt_tokens": 57,
    "total_tokens": 74
  }
}

 

 

일단 검토를 하고 싶다면 플레이그라운드로 먼저 어떤 식으로 프롬프트를 지정할지 검토해본 후에 코드로 구현하면 훨씬 더 가성비 있게 일을 진행할 수 있을 것 같습니다. 다음에는 다른 기능도 확인해보겠습니다.

댓글