4차 산업혁명은 2016년부터 본격적으로 주목받기 시작했습니다. 2024년 현재, 4차 산업은 여러 분야에 빠르게 확산되고 있지만, 많은 일반인들은 여전히 그 기술 동향에 대해 궁금증을 가지고 있습니다. 그러나 2022년 11월 OpenAI가 출시한 생성형 AI 서비스 이후, AI 시장은 급격히 변화하고 있으며, 이는 산업 전반을 넘어 우리의 일상 속으로 깊이 스며들고 있습니다. 4차 산업혁명 중에서도 모든 이의 삶에 가장 빠르게 녹아들게 될 기술로 기대를 모으고 있습니다.
Sellease는 기술 기반 기업으로 성장하기 위해 이러한 변화에 민감하게 대응하며, 새로운 기술이 우리의 비즈니스에 어떻게 적용될 수 있을지를 연구하고, 기존 비즈니스와 조화롭게 통합하기 위해 지속적으로 노력하고 있습니다.
우리는 OpenAI의 서비스를 적극 활용하여 생성형 AI를 비즈니스에 접목시키고 사용자가 원하는 데이터를 쉽게 질의할 수 있도록 하는 것을 목표로 하고 있습니다. 향후에는 멀티 모달을 지원하는 모델을 통해 모든 형태의 미디어로 질의 결과를 받을 수 있을 것으로 기대합니다.
이를 위해 RAG 시스템을 이해하는 것이 필수적입니다.
생성형 AI는 빠르게 발전하고 있지만 여전히 여러 문제를 안고 있습니다. 그 중 가장 큰 문제는 할루시네이션(hallucination)으로, 이는 AI가 존재하지 않거나 잘못된 정보를 생성하는 현상을 말합니다. 할루시네이션은 LLM 모델의 특성과 훈련 데이터의 부족, 맥락 이해의 부족 등 여러 이유로 발생합니다. 이로 인해 초기 생성형 AI의 신뢰성은 낮았으며, 신뢰성이 중요한 기업 프로세스에 도입하기 어려웠습니다.
RAG(Retrieval-Augmented Generation)는 생성형 AI가 보다 정확한 응답을 생성할 수 있도록 외부 정보를 검색하여 보완하는 방법으로, 다음과 같은 장점을 기대할 수 있습니다:
이번 PoC의 목표는 RAG를 통해 생성형 AI 응답의 신뢰성을 높이고, 더 많은 인공지능 기술을 비즈니스에 적용할 가능성을 검증하는 것입니다.
아래 시스템 아키텍처는 모범 사례로 작성된 것으로, 실제 테스트 과정에서는 간단히 구현되었습니다.
// 업로드
String resourceName = "sample-data/company-info.md";
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(Objects.requireNonNull(classLoader.getResource(resourceName)).getFile());
var uploadedFile = openAI.files()
.create(FileRequest.builder()
.file(file.toPath())
.purpose(PurposeType.ASSISTANTS)
.build())
.join();
String fileId = uploadedFile.getId();
System.out.println("File was created with id: " + fileId); // file-OIfrC1nJLgfjz4GyS3P3j3tJ
System.out.println();
var vectorStore = openAI.vectorStores()
.createAndPoll(VectorStoreRequest.builder()
.fileId("file-OIfrC1nJLgfjz4GyS3P3j3tJ")
.name("company-info")
.build());
String vectorStoreId = vectorStore.getId();
System.out.println("Vector Store was created with id: " + vectorStoreId); // vs_3fkPydWq3HnDkhxAKDqkopVF
// 함수의 정의 및 등록
var functionExecutor = new FunctionExecutor();
functionExecutor.enrollFunction(
FunctionDef.builder()
.name("get_stats_of_app_usage")
.description("Return the usage statistics for the requested department and app.")
.functionalClass(StatsOfAppUsage.class)
.build());
// 합수의 구현
public static class StatsOfAppUsageByCategory implements Functional {
@JsonPropertyDescription("Search start date")
@JsonProperty(required = true)
public String since;
@JsonPropertyDescription("Search end date")
@JsonProperty(required = true)
public String until;
@JsonPropertyDescription("search category names, for example: Document, Productivity, CRM ...etc (Optional)")
public Set<String> categories;
@Override
public Object execute() {
log.info("since: {}, until: {}, categories: {}", since, until, ArrayUtils.toString(categories));
try {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
Me me = (Me) request.getAttribute(ME);
if (me == null) {
return "로그인이 필요합니다.";
}
List<AppUsageByCategoryItem> insight = INSIGHT_SERVICE.getAppUsageByCategories(
1L, // me.getCompany().getId()
DateRange.builder().since(LocalDate.parse(since)).until(LocalDate.parse(until)).build());
return Map.of("data", insight, "dashboardUrl",
"https://dev.sellease.io/insight/usages/apps-by-categories?since=%s&until=%s".formatted(since, until));
} catch (Exception e) {
return "처리 중 오류가 발생했습니다.";
}
}
}
// 함수의 호출
var messages = new ArrayList<ChatMessage>();
messages.add(UserMessage.of("최근 일주일간 문서 카테고리의 사용 통계를 알려줘"));
var chatRequest = ChatRequest.builder()
.model("gpt-4o")
.messages(messages)
.tools(functionExecutor.getToolFunctions())
.build();
var futureChat = openAI.chatCompletions().create(chatRequest);
var chatResponse = futureChat.join();
var chatMessage = chatResponse.firstMessage();
var chatToolCall = chatMessage.getToolCalls().get(0);
var result = functionExecutor.execute(chatToolCall.getFunction());
messages.add(chatMessage);
messages.add(ToolMessage.of(result.toString(), chatToolCall.getId()));
chatRequest = ChatRequest.builder()
.model("gpt-4o")
.messages(messages)
.tools(functionExecutor.getToolFunctions())
.build();
futureChat = openAI.chatCompletions().create(chatRequest);
chatResponse = futureChat.join();
System.out.println(chatResponse.firstContent());
PoC의 주요 발견 사항:
향후 계획:
Sellease는 앞으로도 지속적인 연구와 개발을 통해 인공지능 기술을 비즈니스에 성공적으로 접목시킬 것입니다.