GROUP BY와 FETCH JOIN을 같이 쓰면 안되는 이유
2025. 8. 21. 13:45
Error
queryDSL 로 쿼리를 짜다보면 다음과 같은 에러를 마주할 때가 많다 Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) group by와 fetch join을 쓰면 이런 에러가 생기곤 하는데 원인과 이 둘을 같이 쓰면 안되는 이유와 해결법을 알아보자 fetch join의 동작 원리 먼저 fetch join은 n+1을 방지하기 위해 많이 쓰며, 쿼리 내에서 연관된 엔티티..
[RAG]Metadata/Chunking
2025. 6. 27. 02:15
카테고리 없음
이전 포스팅에서RAG를 이용한 민법 챗봇을 개발하고LangServe로 배포까지 해보았다. 이제 청킹과 메타데이터를 이용해 조금 더 효율적으로 다뤄볼 것이다. Chunking 기존에는 각 판례 전체를 하나의 덩어리로 처리했지만 이럴경우 큰 문제가 있다.한 판례가 수백 줄에 걸쳐 이어지는 긴 텍스트로 존재할수도 있다.하지만 GPT 계열 LLM은 토큰 한도가 존재하므로, 이렇게 긴 텍스트를 그대로 임베딩하거나 검색에 사용하는 건 비효율적이다.그래서 판례별로 잘게 나누면 데이터를 효율적으로 임베딩하고 검색 정확도를 높일 수 있다.즉 청킹(Chunking) 이 필요하다. LangChain의 RecursiveCharacterTextSplitter 사용하여 청킹할것이다. Metadata이떄 또다시 ..
LangServe 사용해보기
2025. 6. 25. 14:18
etc
랭체인(LangChain) 프레임워크는 LLM 애플리케이션 개발에 도움이 되는 여러 구성 요소로 이루어져 있다. 랭체인의 주요 구성 요소는 다음과 같다. 랭체인 라이브러리(LangChain Libraries): 파이썬과 자바스크립트 라이브러리를 포함하며, 다양한 컴포넌트의 인터페이스와 통합, 이 컴포넌트들을 체인과 에이전트로 결합할 수 있는 기본 런타임, 그리고 체인과 에이전트의 사용 가능한 구현이 가능. 랭체인 템플릿(LangChain Templates): 다양한 작업을 위한 쉽게 배포할 수 있는 참조 아키텍처 모음. 개발자들이 특정 작업에 맞춰 빠르게 애플리케이션을 구축할 수 있도록 돕는다. 랭서브(LangServe): 랭체인 체인을 REST API로 배포할 수 있게 하는 라이브러리. 이를 통해 개..

[RAG] 민법 챗봇 만들기 (with LangChain)
2025. 6. 23. 00:13
etc
법률적 질문에 대해 답을 주는 챗봇을 구현해보려고 한다. 이 챗봇을 만들게 된 이유는실생활과 가장 밀접하게 사용할 수 있으면서 RAG 구조의 장점을 살리기에 적합하다고 생각했기 때문이다. 법률 분야는 정답이 명확하고 판례와 조문에 근거한 설명이 요구되기 때문에,생성형 AI의 대표적인 한계인 hallucination(사실과 다른 내용을 생성하는 문제)을 완화하는 데 RAG 구조가 특히 유리하다.RAG에 대한 자세한 개념은 따로 정리하였다. 또한, 법학전문대학원협의회 사이트에서 제공하는 PDF 기반의 민법 표준판례연구자료는법률적 질문에 대해 보다 신뢰성 있는 답변을 생성하는 데 적합한 기반이 되었다. 법학전문대학원협의회 먼저 필요한 라이브러리들을 설치한다.pip install langchain ..
[RAG] 개념이해 (Retriever와 Generator, Embedding, Vector Search)
2025. 6. 16. 17:34
etc
목표: AI 분야에서 주목받고 있는 RAG(Retrieval-Augmented Generation) 기술을 학습하고, 이를 기반으로 챗봇 서비스 만들어보기 일단 나는 Spring JPA 중심의 백엔드 개발자로,AI 경험은 간단한 프롬프트 기반 API 연동이 전부이다. 그래서 AI관련 용어도 잘 모른다.그래서 이 글은 AI 초심자의 눈높이에서, RAG의 개념을 아주 쉽게 풀어가며 공부하려 한다. 🧠 RAG란?RAG (Retrieval-Augmented Generation)는 생성형 AI가 모르는데 아는 척 하는 것(hallucination)을 줄이기 위해 등장한 구조이다. 일반적인 GPT 같은 생성형 모델은 자신이 학습한 데이터만 가지고 답을 한다. 그래서 GPT에게“우리 회사 사내 문서 기반으..

동시성 문제 해결 - 수강신청하기
2025. 6. 2. 16:58
Spring
수강인원이 있는 강의의 수강신청 기능을 개발하며잔여인원을 알맞게 카운팅 할 필요가 있었다. 이 때, 사용자가 같은 버튼을 여러번 누를 때 같은 주문이 여러 번 발생하거나,A와 B가 동시에 1개 남은 잔여 강의 구매 시-> 재고가 마이너스되는 등의 오류가 발생할 수 있다. 위와같은 문제를 동시성 문제라고 한다. 이런 동시성 문제를 해결하려면, 데이터에 하나의 스레드만 접근이 가능하도록 해야한다.그렇다면 어떻게 데이터에 동시에 하나의 스레드만 접근이 가능하게 할 수 잇을까? 동시성 문제를 해결하는 방법들과, 각각의 장단점에 대해 알아보자. 1. JAVA의 synchronized 자바에서는 Synchronized 키워드를 통해 데이터에 하나의 스레드만 접근이 가능하도록 만들어준다. 작동 ..

[백준 16236] 아기상어
2025. 5. 12. 15:40
Algorithm
문제NXN (2 물고기 M 마리 크기 (1~6)상어 1마리(초기 크기 2), 1초에 상하좌우 인접 한칸씩 이동가능자신보다 작은 물고기 먹을 수 있음작거나 같은 물고기 있는 칸 지나갈 수 있음먹을 수 잇는 물고기 없으면 끝먹을 수 있는 물고기 1마리 이상 -> 1. 가까운 물고기부터, 2. 가장 위에 있는 물고기부터, 3. 가장 왼쪽에 있는 물고기부터 먹는다이동과 동시에 물고기를 먹음(빈칸됨)자신의 크기만큼의 물고기 수를 먹을 때 1씩 증가 기존 코드 static int n; static int[][] map; static boolean[][] visited; //상 0,-1 좌-1,0 우1,0 하0,1 static int[] dx = new int[]{0,-1,1,0}; static int..

[NestJS] Pipes
2024. 12. 2. 16:55
NestJS
🛠️NestJS의 lifecycle 요청이 왔을 때 NestJS에서의 lifecycle을 보면 다음과 같다. 1. Requset2. Middleware 2.1. Globally bound middleware 2.2. Module bound middleware3.Guards4. Interceptor(컨트롤러 앞단) 4.1. Golbal interceptor 4.2 Controller interceptor 4.3 Route interceptor5. Pipes 📌 오늘 공부할 내용6. Controller(method handler)7. Service(존재한다면)8. Interceptor(컨트롤러 뒷단) 8.1. Route interceptor 8.2 Controller interc..

[NestJS] Exception
2024. 11. 28. 22:00
NestJS
🛠️NestJS의 lifecycle 요청이 왔을 때 NestJS에서의 lifecycle을 보면 다음과 같다. 1. Requset2. Middleware 2.1. Globally bound middleware 2.2. Module bound middleware3.Guards4. Interceptor(컨트롤러 앞단) 4.1. Golbal interceptor 4.2 Controller interceptor 4.3 Route interceptor5. Pipes6. Controller(method handler)7. Service(존재한다면)8. Interceptor(컨트롤러 뒷단) 8.1. Route interceptor 8.2 Controller interceptor 8.3 G..