Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

물론 ChatGpt와 비슷한 수준에 자연어를 통한 사용자의도 파악하는 AI기술이 있다고 하면 더 높은 수준으로 검색 기술과 연동할수 있습니다.

고성능 블락킹없는 이벤트 적재는 다음 AKKAStream을 참고



CRUD 전략

...

draw.io Diagram
bordertrue
diagramNamegptchche
simpleViewerfalse
width
linksauto
tbstyletop
lboxtrue
diagramWidth601
revision1

  • GPT의 분석을 실시간 제공이아닌~ 인덱스된 최근항목을 제공하고  요청이 있을시 GPT의 최신 정보가 추가되어 다음 요청시 준비된 데이터를 제공하는 전략
    • 유용한 고정 프롬프트가 100개이내이고 최근 정보를 효율적으로 전달할때 활용가능 전략


  • GPT의 응답값을 검색엔진에 업데이트~  

...


UnitTest 

Code Block
themeEmacs
            var elkCacheData = await _searchService.FindGptReultByFilter(gPTMetaData, 20);

            GPTResponse gPTResponse = new GPTResponse();

            if (elkCacheData.Count > 0)
            {
                gPTResponse.FromGPTResutEntity(elkCacheData[0]);
                gPTResponse.isCache = true;

                GPTResultEntityCmd gPTResultEntityCmd = new GPTResultEntityCmd()
                {
                    command = "save",
                    prompt = promptBuild.ToString(),
                    gPTMetaData = gPTMetaData
                };
                _actorBridge.Tell(gPTResultEntityCmd);
            }
            else
            {
                gPTResponse = await _gPTEngine.GetChatCompletions(promptBuild.ToString(), gPTMetaData);
                gPTResponse.isCache = false;
            }

            return gPTResponse;

...

  • CHATGPT를 활용하는 동일한 기능을 하는 유닛에 엘라스틱과 하이브리드로 적동하여 응답속도 1000ms 이하로 기능제공
  • 응답시간이 긴경우 부분결과를 중간에 업데이트하는 Stream기능을 OpenAPI에서 지원합니다. - 사용성 추가 스트리밍 전략 


API화

Image Added

  • A : 요청시 ELK에 있는 데이터를 조회하여 빠르게 응답 ( 1초이내 )
  • B : 요청시 GPT의 새로운 프롬프트를 저장 이벤트를 발생하여, GPT를 호출하고 그 결과를 저장하여 다음에 이용할수 있게 저장

이용된 Actor 기술및 소개

여기서 응답결과가 늦은 GPT를 호출하고 결과를 저장하기 위해 API 레벨에서 스레드를 생성하고 저장하는 방식을 이용하면 안되며

API의 라이프 사이클은 응답이 빠르게 완료된 시점 자원을 해제해야하기때문에 여기서 생성한 스레드에 대한 라이프를 책임질수 없으며 다양한 사이드 이펙트가 발생할수 있습니다.

액터는 AkkaSystem에 의해 백그라운드에서 ActorDispatch에 의해  이벤트가 발생할때 조건이 맞을때 작동을 하며 독립적으로  Task를  수행할수 있습니다. 


Code Block
themeEmacs
namespace MorphemeApi.Actors
{
    public class GptEntityActor : ReceiveActor
    {
        private readonly ILoggingAdapter logger = Context.GetLogger();

        private readonly GPTEngine _gPTEngine;

        public GptEntityActor(GPTEngine gPTEngine)
        {
            logger.Info($"Create GraphEventActor:{Context.Self.Path.Name}");

            _gPTEngine = gPTEngine;

            ReceiveAsync<GPTResultEntityCmd>(async message =>
            {
                try
                {
                    await _gPTEngine.SaveChatCompletions(message.prompt, message.gPTMetaData);
                }
                catch (Exception ex) 
                {
                    logger.Error(ex.Message);
                }
            });
        }
    }
}


Stream 연결

Code Block
themeEmacs
            var serviceScopeFactory = new Mock<IServiceScopeFactory>();
            serviceScopeFactory.Setup(x => x.CreateScope()).Returns(serviceScope.Object);

            IActorRef throttleWork = _actorSystem.ActorOf(Props.Create(() => new ThrottleActor(500, 30000)));
            GPTEngine gPTEngine = new GPTEngine(lightAkkaService, configuration);
            
            var gptEntityActor = _actorSystem.ActorOf(Props.Create(() => new GptEntityActor(gPTEngine)),
                "gptEntityActor");

            //Stream 연결  : throttleWork -> fsmActor -> batchActor
            throttleWork.Tell(new SetTarget(gptEntityActor));
			
			throttleWork.Tell(new GPTResultEntityCmd(){....});

Throttle(TPS제어) 에 연결하여 GPT를 호출하는 TPS를 제어할수도 있으며, 발생한 데이터를 이벤트별 저장이아닌 실시간에 가까운 데이터를 모아서 벌크처리도 가능하게 됩니다.


Akka Stream에 관련한 작동가능 코드는 다음 저장소에서 확인할수 있으며 자바/닷넷에서 동일한 컨셉으로 이용가능합니다.