๊ฐœ๋ฐœ๐Ÿ’ป/C#

[C#] ChatGPT ์ฑ„ํŒ… ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ค๊ธฐ

VIP 2023. 6. 6. 02:36
728x90
๋ฐ˜์‘ํ˜•

 
ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์€ ์•„๋ž˜ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ๋จ
IDE : VisualStudio 2022
Framework : .NET 7.0
Laguage : C# 11
 

1. OpenAI API Key ๋ฐœ๊ธ‰

  • OpenAI API Key ๋ฐœ๊ธ‰ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ๊ฒŒ์‹œ๊ธ€์„ ์ฐธ๊ณ 
 

[Python] ChatGPT #1 OpenAI API Key ๋ฐœ๊ธ‰

ChatGPT ChatGPT๋Š” ๋ฏธ๊ตญ์˜ AI ์—ฐ๊ตฌ์žฌ๋‹จ OpenAI๊ฐ€ 2022๋…„ 11์›” ๊ณต๊ฐœํ•œ ์ดˆ๊ฑฐ๋Œ€ ์–ธ์–ด ๋ชจ๋ธ GPT-3.5 ๊ธฐ๋ฐ˜ ๋Œ€ํ™”ํ˜• ์ธ๊ณต์ง€๋Šฅ ์ฑ—๋ด‡์ด๋‹ค. GPT๋Š” "Generative Pre-trained Transformer'์˜ ์•ฝ์–ด์ด๋ฉฐ ๋จธ์‹ ๋Ÿฌ๋‹์œผ๋กœ ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ

ssvip.tistory.com

 

2. Betalgo.OpenAI.GPT3 ์„ค์น˜

  • ํ”„๋กœ์ ํŠธ ์šฐํด๋ฆญ ํ›„, Nuget ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ํด๋ฆญ
  • Betalgo.OpenAI.GPT3 ์„ค์น˜

NuGet ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ
Betalgo.OpenAI.GPT3 ์„ค์น˜

 

3. ์†Œ์Šค์ฝ”๋“œ

  • ์„ค์น˜๋œ Betalgo.OpenAI.GPT3 ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ฐฉ์‹์˜ ChatGPT ์ฑ„ํŒ… ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

 

3.1 Using๋ฌธ ์ถ”๊ฐ€

  • Betalgo.OpenAI.GPT3์— ์ •์˜๋˜์–ด์žˆ๋Š” 4๊ฐœ์˜ namespace๋ฅผ ์ถ”๊ฐ€
/*ChatGPT ์ถ”๊ฐ€*/
using OpenAI.GPT3;
using OpenAI.GPT3.Managers;
using OpenAI.GPT3.ObjectModels;
using OpenAI.GPT3.ObjectModels.RequestModels;

 

3.2 ๋น„๋™๊ธฐ Request ๋ฉ”์„œ๋“œ ์ •์˜

  • ChatGPT์™€ ๋น„๋™๊ธฐ๋กœ ํ†ต์‹ ํ•˜๋Š” Request ๋ฉ”์„œ๋“œ ์ •์˜
  • ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›์€ prompt ๊ฐ’์„ ChatGPT์— ์š”์ฒญ ๋ฐ string ํ˜•ํƒœ๋กœ ๋ฆฌํ„ด
private async Task<string> RequestGPT(string prompt)
{
    string result = "";

    var gpt3 = new OpenAIService(new OpenAiOptions()
    {
        ApiKey = OPENAI_API_KEY
    });

    var completionResult = await gpt3.Completions.CreateCompletion(new CompletionCreateRequest()
    {
        Prompt = prompt,
        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๋ฒˆ ๋‹ค๋ฅธ ํšŒ์‹ ์„ ๋ฐฐ์—ด์— ๋‹ด์•„์คŒ
    });

    if (completionResult.Successful)
    {
        foreach (var choice in completionResult.Choices)
        {
            result = choice.Text.Replace("\n", "");
        }
    }
    else
    {
        if (completionResult.Error == null)
        {
            throw new Exception("Unknown Error");
        }
    }

    return result;
}

 

3.3 RequestGPT() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ด๋ฒคํŠธ

  • Button Click ์ด๋ฒคํŠธ์— RequestGPT()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ ์ž‘์„ฑ
  • C#์˜ ๋น„๋™๊ธฐ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€ ์ฐธ๊ณ 
  • ์งˆ๋ฌธ์€ Color.Blue, ์‘๋‹ต์€ Color.Red๋กœ ํ…์ŠคํŠธ ํ‘œ์‹œ
private async void btnSendMessage_Click(object sender, EventArgs e)
{
    try
    {
        string prompt = txtMessage.Text.Trim(); // ์งˆ๋ฌธ

        richTxtResult.SelectionFont = new(richTxtResult.Font, FontStyle.Bold);
        richTxtResult.SelectionColor = Color.Blue;
        richTxtResult.AppendText("Q : " + prompt + "\n");
        txtMessage.Text = "";

        var task1 = Task<string>.Run(() => RequestGPT(prompt)); // ChatCPT์— ์š”์ฒญ

        string result = await task1;
        richTxtResult.SelectionFont = new(richTxtResult.Font, FontStyle.Bold);
        richTxtResult.SelectionColor = Color.Red;
        richTxtResult.AppendText("GPT : " + result + "\n");
    }
    catch(Exception ex)
    {
        richTxtResult.AppendText(ex.ToString());
    }
}

 

3.4 ChatGPT - ์งˆ๋ฌธํ•˜๊ธฐ

  • ChatGPT์— ์งˆ์˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  • ์งˆ๋ฌธ : ์ธ๊ฐ„์ด ํ™”์„ฑ์— ์ •์ฐฉํ•œ๋‹ค๋ฉด ๊ฑด์ถ•๋ฌผ์˜ ๋ชจ์Šต์€ ์–ด๋–ค ๋ชจ์Šต์ผ์ง€ ์ž์œ ๋กญ๊ฒŒ ์ƒ์ƒํ•ด์„œ ์™ธํ˜•์„ ๋ฌ˜์‚ฌํ•ด์ฃผ์„ธ์š”.

์‹คํ–‰ ๊ฒฐ๊ณผ

 

3.5 ์ „์ฒด ์†Œ์Šค์ฝ”๋“œ

  • ์ „์ฒด ์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Œ
๋”๋ณด๊ธฐ
/*ChatGPT ์ถ”๊ฐ€*/
using Microsoft.Extensions.Configuration;
using OpenAI.GPT3;
using OpenAI.GPT3.Managers;
using OpenAI.GPT3.ObjectModels;
using OpenAI.GPT3.ObjectModels.RequestModels;
using System.Windows.Forms;

namespace ChatGPT_DOTNET
{
    public partial class ChatGPT : Form
    {
        private string OPENAI_API_KEY = ""; // OpenAI API Key

        /// <summary>
        /// ์ƒ์„ฑ์ž
        /// </summary>
        public ChatGPT()
        {
            InitializeComponent();

            OPENAI_API_KEY = "OpenAI API Key ์ž…๋ ฅ";
        }

        /// <summary>
        /// ํผ ๋กœ๋“œ ์ด๋ฒคํŠธ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ChatGPT_Load(object sender, EventArgs e)
        { }

        /// <summary>
        /// ์ „์†ก ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void btnSendMessage_Click(object sender, EventArgs e)
        {
            try
            {
                string prompt = txtMessage.Text.Trim();

                richTxtResult.SelectionFont = new(richTxtResult.Font, FontStyle.Bold);
                richTxtResult.SelectionColor = Color.Blue;
                richTxtResult.AppendText("Q : " + prompt + "\n");
                txtMessage.Text = "";

                var task1 = Task<string>.Run(() => RequestGPT(prompt)); // ChatCPT์— ์š”์ฒญ

                string result = await task1;
                richTxtResult.SelectionFont = new(richTxtResult.Font, FontStyle.Bold);
                richTxtResult.SelectionColor = Color.Red;
                richTxtResult.AppendText("GPT : " + result + "\n");
            }
            catch(Exception ex)
            {
                richTxtResult.AppendText(ex.ToString());
            }
        }

        /// <summary>
        /// ChatGPT Request ๋ฉ”์„œ๋“œ
        /// </summary>
        /// <param name="prompt"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        private async Task<string> RequestGPT(string prompt)
        {
            string result = "";

            var gpt3 = new OpenAIService(new OpenAiOptions()
            {
                ApiKey = OPENAI_API_KEY
            });

            var completionResult = await gpt3.Completions.CreateCompletion(new CompletionCreateRequest()
            {
                Prompt = prompt,
                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๋ฒˆ ๋‹ค๋ฅธ ํšŒ์‹ ์„ ๋ฐฐ์—ด์— ๋‹ด์•„์คŒ
            });

            if (completionResult.Successful)
            {
                foreach (var choice in completionResult.Choices)
                {
                    result = choice.Text.Replace("\n", "");
                }
            }
            else
            {
                if (completionResult.Error == null)
                {
                    throw new Exception("Unknown Error");
                }
            }

            return result;
        }

        private void txtMessage_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnSendMessage.PerformClick();
            }
        }
    }
}

 


 

[C#][Chat GPT] Chat GPT API๋ฅผ ์ด์šฉํ•œ ๊ฐ„๋‹จ ์ฑ„ํŒ… ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„

๋‰ด์Šค์—์„œ Chat GPT API๊ฐ€ ๊ณต๊ฐœ๋˜์—ˆ๋‹ค๋Š” ์†Œ์‹์„ ๋“ฃ๊ณ  Chat GPT๋กœ ์ฑ„ํŒ… ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค (์˜ˆ์ „์— ์ฝ”๋“œ ํ•˜์ด๋ผ์ดํŠธ? ํ•˜๋Š” ๋ฐฉ๋ฒ• ์•Œ์•˜๋Š”๋ฐ.. ์ด๊ฒƒ๋„ ๊นŒ๋จน์—ˆ๋„ค์š”. ์‚ฌ๋กœ์ž๋ฐ” ๋ฏธ์•ˆํ•ด) # ์ฐธ๊ณ ์‚ฌํ•ญ 1

topnanis.tistory.com

728x90
๋ฐ˜์‘ํ˜•