반응형

0. 3주차 실습 (저장소 링크)

3주차 실습은 Azure OpenAI 챗봇 API를 만드는 것이다.

올해 10~11월부터 닷넷 8.0버전이 출시 될 예정으로, 레거시인 Inproc 버전은 없어질 것이기 때문에 앞으로의 실습이나 과제 등은 닷넷 7.0 & Outproc 버전을 사용할 것이다.

1. Azure Functions Application 생성

2주차부터 시작했던 것과 마찬가지로 원하는 경로에 func init을 통해 애저 펑션을 만들어준다.

- 2주차 애저펑션 애플리케이션 만드는법 참고

https://dlwns7267.tistory.com/771

 

2. Program.cs 파일 소스 코드 변경

ConfigureFunctionsWorkerDefaults를 아래와 같이 변경한다.

⇒ ConfigureFunctionsWorkerDefaults(worker => worker.UseNewtonsoftJson())

 

3. launch.Settings.json 포트 변경

launch.Settings.json

json 파일에서 port 번호를 7071로 변경해준다.

 

4. message 출력 해보기.

AI챗봇을 하기에 앞서 response body message에 hello world가 잘 출력되는지 확인해본다.

 

5. openai dotnet nuget package 설치

4번 실습이 잘 된다면, Azure OpenAI를 사용하기 위해 패키지를 설치한다.

https://www.nuget.org/packages/Azure.AI.OpenAI/1.0.0-beta.6

nuget dotnet package 설치 : openai

명령어 : dotnet add package Azure.AI.OpenAI --version 1.0.0-beta.6

 

6. OpenAI 챗봇 샘플

openai 챗봇을 사용하기 위한 챗봇 샘플 깃허브 저장소를 참고할 수 있다.

Openai 챗봇 샘플 : https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/openai/Azure.AI.OpenAI/tests/Samples

 

7. local.settings.json에 openai 관련 value 추가

"AOAI_Endpoint": "https://aoai-common-eus.openai.azure.com/",
"AOAI_ApiKey": "a6d19c5c9b6f432a9da934476d3adaba",
"AOAI_DeploymentId": "model-gpt35turbo16k",
"AOAI_ApiVersion": "2023-06-01-preview"

여기서 ApiKey는 당일밖에 사용할 수 없는 key였으며, 개인이 받기엔 아직 한계가 있고 회사 기준으로 받을 수 있다.

8. payload 가져오기

해당 부분은 HttpTrigger.cs 파일 소스코드이다. 

이 코드는 즉, OpenAI ChatGPT 클라이언트를 가져오는 코드 및 prompt를 보내기 위한 옵션 등을 설정한다.

using System.Net;
using Azure;
using Azure.AI.OpenAI;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Attributes;
using Microsoft.Extensions.Logging;

namespace OpenAIBot
{
    public class CompletionHttpTrigger
    {
        private readonly ILogger _logger;

        public CompletionHttpTrigger(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<CompletionHttpTrigger>();
        }

        [Function("CompletionHttpTrigger")]

        [OpenApiOperation(operationId: nameof(CompletionHttpTrigger.Run), tags: new[] { "name" })]
        [OpenApiRequestBody(contentType: "text/plain", bodyType: typeof(string), Required = true, Description = "The request body")]
        [OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "text/plain", bodyType: typeof(string), Description = "The OK response")]

        public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Anonymous, "POST", Route = "completions")] HttpRequestData req)
        {
            _logger.LogInformation("C# HTTP trigger function processed a request.");

            var prompt = req.ReadAsString(); // 요청 payload 읽어들인 것


            // 호출하기 위한 인스턴스를 만드는 부분
            var endpoint = new Uri(Environment.GetEnvironmentVariable("AOAI_Endpoint"));
            var credential = new AzureKeyCredential(Environment.GetEnvironmentVariable("AOAI_ApiKey"));
            var client = new OpenAIClient(endpoint, credential);

            // 실제 메세지 완성하는 부분
            var chatCompletionsOptions = new ChatCompletionsOptions()
            {
                Messages =
                {
                    new ChatMessage(ChatRole.System, "You are a helpful assistant. You are very good at summarizing the given text into 2-3 bullet points."),
                    new ChatMessage(ChatRole.User, prompt)
                },
                MaxTokens = 800,
                Temperature = 0.7f,
            };

            // azure openai 서비스의 어떤 모델을 사용할 지
            var deploymentId = Environment.GetEnvironmentVariable("AOAI_DeploymentId");
            var result = await client.GetChatCompletionsAsync(deploymentId, chatCompletionsOptions);
            // 메시지 가져옴
            var message = result.Value.Choices[0].Message.Content;

            var response = req.CreateResponse(HttpStatusCode.OK);
            response.Headers.Add("Content-Type", "text/plain; charset=utf-8");

            response.WriteString(message);

            return response;
        }
    }
}

 

9. 실습 결과

- 영어

- 한글

 

답변이 2~3줄만 나오는 이유는 위 HttpTrigger를 자세히 보면

2-3 bullet points로 작성하라고 가스라이팅을 했기 때문이다.

 

과제

지금까지 azure openai 서비스를 해봤다. 우리는 azure.sdk 패키지를 사용해서 했는데, 우리는 이걸 사용하지 말고 chatgpt실제 api 호출을 해서 동일한 결과를 내는 과제를 수행해본다.

즉, 실제로 json객체를 만들어서 날려야한다.

+ Recent posts