목록프로젝트 (15)
yongsa0221의 고물상

Springboot에서 ThreadPoolExecutor는 java.util.concurrent.ThreadPoolExecutor 에 기반한다. java.util.concurrent.ThreadPoolExecutor 요녀석은 어떻게 동작 하는 것일까?java doc에 따르면 ,,,요런 식으로 동작한다고 한다재미있는 사실은 corePoolSize만큼 항상 먼저 스레드풀을 할당하지 않는 다는 것.https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/util/concurrent/ThreadPoolExecutor.html ThreadPoolExecutor (Java SE 23 & JDK 23)An ExecutorService that execute..

생성형 ai를 호출하는 과정은 비동기적으로 이루어 진다. 시간이 많이 걸리기 때문. 스프링부트를 통해 async메서드를 만드려면 threadpool설정을 해주어야 한다.프로젝트 내에서 사용자의 한번의 요청에 비동기적으로 두가지 메서드를 한번에 실행시킨다.이 작업이 꽤나 반복되니 threadpool을 적절하게 설정하고 관리 하는 것이 굉장히 중요한 부분.한번의 요청이 들어오면 generateImage와 generateContextQuestion에 해당하는 두가지 요청을 동시에 gpt에게 보낸다. 비동기적으로 실행할 녀석들의 특징은...네트워크 작업임( open-ai api호출)대기시간이 엄청 길어질수 있다(생성속도가 보통 10초 ~)이자식들을 어떻게 하면 좋을가,,,, 먼저 프로그램이 실행될 서버의 사양을..

리팩터링 하며 패키지 구조와 역할분리를 조금 더 확실하게 하려고 하였다.중점사항은.. 도메인은 그 누구에게도 의존적이지 않아야 한다 메인의 다른 계층에 의존적이지 않게 하기 위해 infrastructure 계층을 인터페이스를 통해 사용하는 **의존성 역전(Dependency Inversion)**을 구현하였다. 이를 통해 도메인 계층은 구체적인 구현(infrastructure)에 의존하지 않고 추상화된 인터페이스에 의존하게 되어 저수준 모듈(ai관련 호출 로직)이 고수준 모듈의 구현(contextAndQuestionGenerator)에 의존하게 된다. 추가로 Adapter패턴을 사용하여 adpater에서 도메인 로직에서 사용되는 BookToProgress라는 녀석과 aiApi 호출을 위한 dto녀석간의..

프로젝트내의 패키징을 고민하면서 프로젝트 시작부터 괴롭혔던 질문이 다시 떠오른다.'생성형 ai는 도메인인가?' 여태껏 당연히 그렇다고 생각했다. 프롬프트라는 것이 생성형 ai에게 특정한 역할을 부여해주고, 이를 통해 도메인 내에서 특정 역할을 수행한다고 생각하고 접근하였다.그런데 이제와서 생각해보니 생성형 ai에 너무 집착한 나머지 도메인 계층에서의 추상화를 제대로 못했다고 생각이 든다. 각 기능을 추상화해놓고 이녀석을 다시 생성형 Ai라는 범주에 넣어버린 것이다. 도메인 계층에서 존재해야 될 녀석은 생성형 Ai가 아닌 이미지 생성기, 동화 생성기 등의 생성기 였던 것.생성형 Ai에 너무 매몰되어 이녀석을 '수단'으로서 생각하지 못햇던 것이다.결국 설계 단계에서 제대로 추상화해내지 못해 끈적끈적하게 얽..

기존의 Ai 관련 도메인을 전략패턴을 사용하여 수정하였다.AiModelBehavior라는 인터페이스를 통해 생성형 Ai를 통해 어떤 것을 생성할지 동작을 구현하는 부분을 분리하였다.외부 생성형 Ai api를 직접적으로 호출하는 부분을 오롯이 AiModelBehavior의 구현체를 통해서 구현하도록 수정하였다.이를 통해서 생성형 Ai를 사용하는 부분을 최대한 다른 도메인과 구분하여 관리하고자 한다. 왜 전략패턴인가?생성형 Ai가 프로그램 내에서 특정한 클래스로써 존재 할 수 있게 하는 속성은 “어떤 입력을 통해 어떤 출력을 생성하는가” 라고 생각한다.삽화 생성기는 사용자 텍스트와 사전설정된 프롬프트를 통해 특정 화풍의 이미지를 생성한다.전략 패턴을 사용함으로서 이러한 Ai에게 사전 설정값과 출력 타입을 설..
졸업 프로젝트를 리팩터링 해야한다.시작에 앞서 목표를 정하고 가보자. controller 코드 줄이기불필요한 의존성 줄이기유닛 테스트spring security더 공부하기패키징 신경쓰기theokanning 뚝배기 깨기( openAiservice구현하기)api key 입력해야 사용할수 있게 하기(돈 감당 안됨)과금요소 다 삭제하기(돈 감당 안됨)6번은 프로젝트 내에서 사용하던 openAi 써드파티 라이브러리가 24.6월로 지원 종료되어서 안타깝게 되었다. Azure openai를 통해 사용할 수 있다고 한다. (현재 공식적으로 java지원 되는 라이브러리)그냥 직접 구현하는 방식도 고려해보아야 할듯.. 7, 8 번을 수행하려면 사실상 도메인이 변경이 불가피하다.그래서 더이상 리팩터링이 아니라 다른 프로젝트..
프로젝트가 완료된 시점에서 리팩터링 해야 할 부분이 꽤나 많다.도메인 변경이 프로젝트는 졸업 전시의 일환으로서, 서비스 보다는 전시의 목적에 더 알맞았던 프로젝트였다.생성형 AI를 사용하는 부분에서 비용이 굉장히 많이 나왔기 때문에 개인적으로 리팩터링을 해서 프로젝트를 지속적으로 수정해나가기에는 문제가 있다.stable diffusion 삭제stablediffusion을 사용하여 캐릭터를 그리는 부분은 분명 이 프로젝트의 핵심 도메인이나 유지비용이 너무 많이 나온다. models lab에 한달에 47달러씩 비용을 내야 하며 그렇지 않다면 gpu서버를 구축해야 하지만 이마저도 비용이 만만치 않다. 실질적으로 stable-diffusion을 지속적으로 사용하기는 불가능하다고 판단하였다.이에 따라 캐릭터를 생..

동화만들기는 다음과 같이 동작한다. 위의 과정을 반복하며 사용자가 동화 만들기를 완료하는 형태의 구조이다. 여기서 gpt를 사용하여 동화 문장 생성 시 이전 내용 즉, 현재까지 진행되고 있는 동화의 내용을 같이 보내주어야 한다. 이 때문에 프로젝트에서 초기 설계한 엔티티 외에도 임시적으로 현재 진행되고 있는 동화 내용을 저장해야하는 기능이 필요하게 되었다. mysql사용하기프로젝트에 사용중인 rdbms인 mysql을 사용하는 방법이 있다. 현재 진행중인 동화에 대한 테이블을 만들고 필요할 때 불러와 사용하는 방법도 있으나 잦은 트랙잭션에 따른 성능 저하을 피하기 위하여 이 방법은 고려하지 않았다. 클라이언트의 로컬 저장소 사용하기api 요청 시 클라이언트에서 이전 동화 내용에 관한 정보를 저장하고 ..

프로젝트의 가장큰 핵심 도메인은 생성형 AI에 관련한 기능이다. 생성형 AI를 사용하여 사용자 입력을 가공해야 하며 이 과정에서 여러 다른 생성형 AI와 응답을 가져와야 한다.AI를 통해 응답받아야 할 기능은 ...스케치를 이미지로 변환간단한 문장을 동화 문장 형태로 바꾸기진행되고 있는 동화 내용에 관한 질문 생성하기특정 단어에 관련한 응답 생성하기이다. 이제껏 생성형 AI를 사용하여 원하는 응답을 높은 확률로 얻을 수 있는 방법에 관하여 계속해서 생각해보았다. 요즘 흔히 이야기하는 프롬프팅 엔지니어링에 관련한 내용인 것이다. 그러나 이러한 생성형 AI를 프로젝트 내에서 어떻게 관리하고 사용해야 하는지는 또 다른 문제이다. 프로젝트를 진행하며 가장 흥미로웠던 요소는 생성형 AI는 어떤 기능도 다 수..
프로젝트명은 Little-writer-api이다.little-writer-api프로젝트에서 필수적으로 구현되어야 할 요소는 다음과 같다. 로그인일반 로그인소셜 로그인 - kakao 동화 주인공 생성사용자 입력 스케치 기반으로 생성되어야 한다사용자가 그리고 AI가 완성등장인물의 이름, 성격을 입력받아야 함 만들어진 캐릭터를 바탕으로 동화 생성사용자 입력 변형 - 짤막한 한줄 입력을 받고 동화처럼 길게 생성해야 한다입력된 내용 기반의 삽화 생성입력된 내용 기반의 질문 3개 생성 - 질문은 다음 내용을 창작 하기 쉽도록 길라잡이가 되어주어야 한다 단어 질문 응답생성된 질문이나 변환된 내용에서 모르는 단어가 있다면 물어보고 이에 대한 설명을 응답해야 함 기타동화 기록 조회하기캐릭터 기록 조회하기 배포환..