본문 바로가기

delphi

ChatGPT API 사용하기

반응형
SMALL

참고 자료

https://welcome.devgear.co.kr/topic/963-%EB%8D%B8%ED%8C%8C%EC%9D%B4%EB%A1%9C-%EB%A7%8C%EB%93%A0-chatgpt-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%98%ED%94%8C-%EC%86%8C%EA%B0%9C/

 

델파이로 만든 ChatGPT 프로젝트 샘플 소개.

ChatGPT 에서 제공하는 Open API 를 활용하면 델파이로 ChatGPT 앱을 쉽게 만들 수 있습니다. 최근에는 한글로 질문 답변이 가능해져서 번역기를 사용하지 않고도 바로 한글로 질문을 하고 한글로 답변

welcome.devgear.co.kr

한글로 질문하면 한글로 대답해 주지만 느리기 때문에 파파고로 영어로 번역 후 질문하고, 답변을 다시 한글로 파파고 번역.

파파고 참고 자료

https://welcome.devgear.co.kr/topic/230-rest-client-%ED%99%9C%EC%9A%A9-naver-papago-%EB%B2%88%EC%97%AD%EC%84%9C%EB%B9%84%EC%8A%A4-open-api-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%86%8C%EA%B0%9C/

 

REST Client 활용 Naver Papago (번역서비스) OPEN API 사용법 소개

네이버에서 제공하는 다양한 OPEN API 중 활용도가 놓은 Papago 번역 서비스의 활용법을 소개 합니다. 사용환경은 Rad Studio 11 이며 Post 호출 방식입니다. REST API를 이용한 사용법을 알면 다른 여러가

welcome.devgear.co.kr

한글질문 -> 파파로API 번역 -> ChatGPT -> 영문답변 -> 파파고 API 번역 -> 한글답변

 

이렇게 만들어 봤다.

unit uMainCGPT;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.JSON,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types, FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox,
  FMX.Memo, System.Net.URLClient, System.Net.HttpClient, System.Net.HttpClientComponent, FMX.Layouts, System.Diagnostics
  ;

type
  TfMain = class(TForm)
    Memo_Ans: TMemo;
    Memo_HanQ: TMemo;
    BT_Question: TButton;
    NetHTTPClient: TNetHTTPClient;
    NetHTTPRequest: TNetHTTPRequest;
    Layout1: TLayout;
    Layout2: TLayout;
    Layout3: TLayout;
    Layout4: TLayout;
    Layout5: TLayout;
    SpeedButton1: TSpeedButton;
    NetHTTPClientPaPaGo: TNetHTTPClient;
    NetHTTPRequestPaPaGo: TNetHTTPRequest;
    btnPaPaGo: TButton;
    StyleBook1: TStyleBook;
    SpeedButton2: TSpeedButton;
    ckbTrans: TCheckBox;
    procedure BT_QuestionClick(Sender: TObject);
    procedure NetHTTPClientRequestCompleted(const Sender: TObject; const AResponse: IHTTPResponse);
    procedure Memo_HanQDblClick(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure btnPaPaGoClick(Sender: TObject);
    procedure NetHTTPRequestPaPaGoRequestCompleted(const Sender: TObject;
      const AResponse: IHTTPResponse);
    procedure NetHTTPRequestRequestCompleted(const Sender: TObject;
      const AResponse: IHTTPResponse);
    procedure SpeedButton2Click(Sender: TObject);
  private
    function Response_To_GetPapagoData(rData: string): string;
    procedure PaPaGoTrans(nString, nSource, nTarget: string);
    procedure Delay(ms: Integer);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fMain: TfMain;
    _PapagoAns, _GPTAns : string; // 파파고 번역후 받은 메세지, GPT 답변
    _PapagoAnsAll : string; // 계속 대화를 더해 나간다.
    _Time_out : integer;
  // ChatGPT 개인키 받는곳 :  https://beta.openai.com/account/api-keys
  Const MyGPTKey = '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';   // 발급 받은 개인키를 이곳에 할당




implementation


{$R *.fmx}

procedure TfMain.Delay(ms: Integer);
var
  StopWatch: TStopWatch;
begin
  StopWatch := TStopWatch.Create;

  StopWatch.Start;
  repeat
    Application.ProcessMessages;
    Sleep(1);
  until StopWatch.ElapsedMilliseconds >= ms;
end;


procedure TfMain.Memo_HanQDblClick(Sender: TObject);
begin
  Memo_HanQ.Lines.Clear;
end;

// 질문 하기 *********************************************
procedure TfMain.btnPaPaGoClick(Sender: TObject);
begin
//  AndroidTTS1.Speak('I am good');
  exit;
  _PapagoAns := '';
  PaPaGoTrans(Memo_HanQ.Text, 'ko','en');
  _Time_out := 0;
  repeat
    if _Time_out > 500 then exit;

    inc(_Time_out);
    delay(10);
  until _PapagoAns <> '' ;

  if _PapagoAns <> '' then begin
    Memo_HanQ.Text := _PapagoAns;
    _PapagoAns := '';
  end;
end;

procedure TfMain.PaPaGoTrans(nString, nSource, nTarget : string);
var
  sParam : TStringList;
  sURL : string;
begin
  sURL := 'https://openapi.naver.com/v1/papago/n2mt';

  NetHTTPClientPaPaGo.Accept        :=  'application/json';
  NetHTTPClientPaPaGo.ContentType   :=  'application/x-www-form-urlencoded; charset=UTF-8;';
  NetHTTPClientPaPaGo.AcceptCharSet :=  'UTF-8';

  NetHTTPClientPaPaGo.CustomHeaders['X-Naver-Client-Id']     := 'kOlZPHwk8XGvcO99TYyV';     // 애플리케이션 등록 시 발급받은 클라이언트 아이디 값
  NetHTTPClientPaPaGo.CustomHeaders['X-Naver-Client-Secret'] := 'WXSzJpfcVi';  // 애플리케이션 등록 시 발급받은 클라이언트 시크릿 값


  sParam := TStringList.Create;
  sParam.Add( 'source=' + nSource );
  sParam.Add( 'target=' + nTarget );
  sParam.Add( 'text=' + nString );


  NetHTTPRequestPaPaGo.Post(  sURL, sParam ) ;
end;

procedure TfMain.BT_QuestionClick(Sender: TObject);
var
  LPostdata: string;
  LPostDataStream: TStringStream;
begin
  try
    _PapagoAns := '';
    PaPaGoTrans(Memo_HanQ.Text, 'ko','en');
    _Time_out := 0;
    repeat
      if _Time_out > 500 then exit;

      inc(_Time_out);
      delay(10);
    until _PapagoAns <> '' ;

    if _PapagoAns <> '' then begin
      Memo_HanQ.Text := _PapagoAns;
      _PapagoAnsAll := _PapagoAnsAll + _PapagoAns;
  //    _PapagoAns := '';
    end;

    _GPTAns := '';

    LPostData := '{' +
      '"model": "text-davinci-003",'+
      '"prompt": "' + _PapagoAnsAll + '",'+
      '"max_tokens": 2048,'+
      '"temperature": 0'+
      '}';

    LPostDataStream := TStringStream.Create( LPostData, TEncoding.UTF8);

    NetHTTPClient.CustomHeaders['Authorization'] := 'Bearer ' + MyGPTKey;
    NetHTTPClient.CustomHeaders['Content-Type'] := 'application/json';

    LPostDataStream.Position := 0;
    NetHTTPClient.Post('https://api.openai.com/v1/completions', LPostDataStream );

    _Time_out := 0;
    repeat
      if _Time_out > 1000 then exit;

      inc(_Time_out);
      delay(10);
    until _GPTAns <> '' ;


    if ckbTrans.IsChecked = False then exit; // 번역 체크가 아니면 끝냄.

    if _GPTAns <> '' then begin
      _PapagoAns := '';
      PaPaGoTrans(_GPTAns, 'en','ko');
      _Time_out := 0;
      repeat
        if _Time_out > 500 then exit;

        inc(_Time_out);
        delay(10);
      until _PapagoAns <> '' ;

      if _PapagoAns <> '' then begin
        Memo_Ans.Text := _PapagoAns;
  //      _PapagoAns := '';
      end;
    end;
  except
  end;
end;


// 답변 받기 *******************************************************************************************
procedure TfMain.NetHTTPClientRequestCompleted(const Sender: TObject; const AResponse: IHTTPResponse);
var
  LString, ansStr : string;
  LJson: TJsonObject;
begin
  if AResponse.StatusCode = 200 then
  begin
     LString := AResponse.ContentAsString;
     LJson := TJSONObject.ParseJSONValue(LString) as TJSONObject;
     try
       ansStr := LJson.GetValue('choices').A[0].FindValue('text').Value;
       _GPTAns := ansStr;
     finally
       LJson.Free;
     end;
  end  else begin
    ansStr := 'HTTP response code: ' + AResponse.StatusCode.ToString;
  end;
  Memo_Ans.Lines.Clear;
  Memo_Ans.Lines.Add( ansStr );
end;

procedure TfMain.NetHTTPRequestPaPaGoRequestCompleted(const Sender: TObject;
  const AResponse: IHTTPResponse);
begin
//  Memo_HanQ.Lines.Clear;
//  Memo_HanQ.Lines.Add(  AResponse.ContentAsString() );   // 응답받은 전체 Json 데이터

  _PapagoAns := Response_To_GetPapagoData( AResponse.ContentAsString());
//  Memo_HanQ.Lines.Clear;
//  Memo_HanQ.Lines.Add(  Response_To_GetPapagoData( AResponse.ContentAsString() ) );  // 번역된 내용
end;

procedure TfMain.NetHTTPRequestRequestCompleted(const Sender: TObject;
  const AResponse: IHTTPResponse);
var
  LString, ansStr : string;
  LJson: TJsonObject;
begin
//  if AResponse.StatusCode = 200 then
//  begin
//     LString := AResponse.ContentAsString;
//     LJson := TJSONObject.ParseJSONValue(LString) as TJSONObject;
//     try
//       ansStr := LJson.GetValue('choices').A[0].FindValue('text').Value;
//     finally
//       LJson.Free;
//     end;
//  end
//  else
//    ansStr := 'HTTP response code: ' + AResponse.StatusCode.ToString;
//
//  Memo_Ans.Lines.Clear;
//  Memo_Ans.Lines.Add( ansStr );
end;

function TfMain.Response_To_GetPapagoData( rData : string ) : string;
var
  jSONValue : TJSONValue;
begin
// https://developers.naver.com/docs/papago/papago-nmt-api-reference.md
// 결과 Json 데이터 샘플
// {
//    "message": {
//        "@type": "response",
//        "@service": "naverservice.nmt.proxy",
//        "@version": "1.0.0",
//        "result": {
//            "srcLangType":"ko",
//            "tarLangType":"en",
//            "translatedText": "tea"      <<<<< 번역된 결과 값 항목.
//        }
//    }
// }

   JsonValue := TJSonObject.ParseJSONValue( rData );
   result := JsonValue.GetValue<string>('message.result.translatedText');

   JsonValue.Free;
end;

procedure TfMain.SpeedButton1Click(Sender: TObject);
begin
  Memo_HanQ.Text := '';
end;

procedure TfMain.SpeedButton2Click(Sender: TObject);
begin
  _PapagoAns := '';
  _PapagoAnsAll := '';
  Memo_HanQ.Text := '';
end;

end.

그리고 휴대폰에서 가능하도록 안드로이드 apk로 생성

 

[결과]

답변을 받는데까지 5~10초 걸림. 너무 답답해서 못쓸 것 같음.

 

많은 사람들이 아이언맨 자비스가 멀지 않았다고 생각할 것 같으네... 아직 멀었다.

 

다음에는 Clova API를 이용하여 음성인식하고 음성으로 답변하도록 해봐야 겠다.

그리고 답변이 느린 것에 대해 대책을 새워야 겠다.

 

반응형
LIST