본문 바로가기
2_ 바삭바삭 프로그래밍/C# and Visual C++

[C#][Chat GPT] Chat GPT API를 이용한 간단 채팅 프로그램 구현

by 준환이형님_ 2023. 3. 12.

 

뉴스에서 Chat GPT API가 공개되었다는 소식을 듣고

Chat GPT로 채팅 프로그램을 구현해보았습니다

(예전에 코드 하이라이트? 하는 방법 알았는데.. 이것도 까먹었네요. 사로자바 미안해)

 

# 참고사항 
1. 코드참고 : 데일리 메이커 님의 블로그 (https://blog.naver.com/dmaker123/223028359254)
2. [Chat GPT] Chat GPT 시작하기 / 간단 가입 (sign up) 방법 : https://topnanis.tistory.com/236

 

 

1. API를 사용하기 위해서는 우선 API키를 발급받아야 합니다

https://platform.openai.com/ 사이트에서 다음과 같이 API 키를 발급받아주세요

 

 

2. 비주얼스튜디오에서 프로젝트를 만든 뒤, NuGet 으로 Betalgo.OpenAI.GPT3 를 설치해 줍니다.

    (하지만 해당 라이브러리 설치를 위해서는 닷넷프레임워크 6.0이상이 필요했고, 닷넷프레임워크 6.0이상을 설치하기 위해서는 Studio 2022를 설치해야 하더군요 (난 옛날사람이라 VS 2019에 닷넷 4.0 쓰고 있었음)

 

Visual Studio 2022 다운로드 사이트(무료) : https://visualstudio.microsoft.com/ko/vs/community/

 

▼ 프로젝트 내 라이브러리 설치 방법


3. 아래 코드 참고 해 주세요.

using Microsoft.Extensions.Configuration;
using OpenAI.GPT3;
using OpenAI.GPT3.Managers;
using OpenAI.GPT3.ObjectModels;
using OpenAI.GPT3.ObjectModels.RequestModels;
using System;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinFormsChatGPT
{
    public partial class Form1 : Form
    {
        IConfiguration configuration;
        string apiKey;

        public Form1()
        {
            InitializeComponent();
            apiKey = "여기 API키를 입력해주세요";
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            RequestGPT();
        }

        async Task RequestGPT()
        {
            var gpt3 = new OpenAIService(new OpenAiOptions()
            {
                ApiKey = apiKey
            });

            WrapAPI.SetConsoleTextColor(ConTextColor.LIGHT_WHITE);
            Console.Write("You : ");
            string q = Console.ReadLine();

            var completionResult = await gpt3.Completions.CreateCompletion(new CompletionCreateRequest()
            {
                Prompt = q,
                Model = Models.TextDavinciV3, //모델명. GPT한테 물어보니 다빈치V3이 가장 좋은 버젼이라고 했음. 하지만.. GPT 3.5 tubo가 또 나왔다고 함
                Temperature = 0.5F,      //대답의 자유도(다양성 - Diversity)). 자유도가 낮으면 같은 대답, 높으면 좀 아무말?
                MaxTokens = 1000,      //이게 길수록 글자가 많아짐. 짧은 답장은 상관없으나 이게 100,200으로 짧으면 말을 짤라버림 (시간제약이 있거나 썸네일식으로 확인만 할때는 낮추면 좋을 듯. 추가로 토큰은 1개 단어라고 생각하면 편한데, 정확하게 1개 단어는 아닌 (1개 단어가 될수도 있고 긴단어는 2개 단어가 될수 있음. GPT 검색의 단위가된다고 함. 이 토큰 단위를 기준으로 트래픽이 매겨지고, (유료인경우) 과금 책정이 됨)
                N = 1   //경우의 수(대답의 수). N=3으로 하면 3번 다른 회신을 배열에 담아줌
            });

            WrapAPI.SetConsoleTextColor(ConTextColor.LIGHT_GREEN);

            if (completionResult.Successful)
            {
                foreach (var choice in completionResult.Choices)
                {
                    Console.WriteLine("\n"+"GPT : "+choice.Text.Replace("\n",""));
                }
                Console.WriteLine();
            }
            else
            {
                if (completionResult.Error == null)
                {
                    throw new Exception("Unknown Error");
                }
                Console.WriteLine($"{completionResult.Error.Code}: {completionResult.Error.Message}");
            }
            RequestGPT();
        }
    }

//아래는 글자 색 바꿔주는 부분
    public enum ConTextColor
    {
        LACK, BLUE, GREEN, JADE, RED,
        PURPLE, YELLOW, WHITE, GRAY, LIGHT_BLUE, LIGHT_GREEN,
        LIGHT_JADE, LIGHT_RED, LIGHT_PURPLE,
        LIGHT_YELLOW, LIGHT_WHITE
    };

    public static class WrapAPI
    {
        [DllImport("Kernel32.dll")]
        static extern int SetConsoleTextAttribute(IntPtr hConsoleOutput, short wAttributes);

        [DllImport("Kernel32.dll")]
        static extern IntPtr GetStdHandle(int nStdHandle);

        const int STD_OUTPUT_HANDLE = -11;
        public static void SetConsoleTextColor(ConTextColor color)
        {
            IntPtr handle = GetStdHandle(STD_OUTPUT_HANDLE);
            SetConsoleTextAttribute(handle, (short)color);
        }
    }
}