Spring AI와 SSE(Flux)로 구현한 스트리밍 AI 챗봇 설계
·
spring & java
이번에 동아리에서 프로젝트를 진행하면서 AI 챗봇 기능 구현이 필요했다.기능을 설계하는 과정에서, LLM API 연동을 위해 고민했던 점들을 정리해보려고 한다. 만들고자 한 서비스는 단순히 답을 제공하는 챗봇이 아니라,사용자가 스스로 생각을 확장할 수 있도록 질문을 던지는 용도였다. 따라서 선택 기준에서 중요했던 것은 성능이 아니라 비용 구조였다. 상대적으로 저렴한 gpt-4o-mini 모델을 선택하여 진행하였다. 챗봇 서비스를 설계하기 위해 웹소켓과 SSE를 고려했다.독서 감상을 나누는 데 필요한 챗봇 서비스 였기 때문에, 양방향 실시간 통신이 필수가 아니라고 생각했다.따라서 리소스 소모가 큰 소켓 대신, 단방향 통신인 SSE를 채택하여 진행했다. 챗봇에는 요구조건이 있었다.답변 생성이 끝난..
정렬 문제에서 시간초과를 막는 Comparator [JAVA 백준 20920]
·
Algorithm
백준 20920번https://www.acmicpc.net/problem/20920 ⭐️ 문제화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다. 화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.자주 나오는 단어일수록 앞에 배치한다.해당 단어의 길이가 길수록 앞에 배치한다.알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다 $M$보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가 $M$이상인 단어들만 외운다고 한다. 화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.입력첫째 줄에는 영어 지문에..
[알고리즘] 시뮬레이션 어려웠던 문제 (백준 14503)
·
Algorithm
백준 14503번 : 로봇청소기 처음에 문제만 읽고, 그동안 많이 풀었던 좌표를 이용한 BFS문제로 방향을 잡았는데 풀리지 않았다.이 문제의 유형은 시뮬레이션 문제이다. 시뮬레이션이란?시뮬레이션의 핵심은 문제의 규칙을 그대로 따라가야 한다는 것에 있다. 위 문제는 로봇이 모든 곳을 탐색하는게 아니라, 정해진 규칙대로만 움직이는 특징이 있다. 왼쪽 확인 없으면 또 왼쪽 4번 다 확인 뒤로 이동 로봇청소기는 이 규칙을 가진다. // 북 동 남 서int[] dy = {-1, 0, 1, 0};int[] dx = {0, 1, 0, -1}; 먼저 방향을 숫자로 표현하기 위해 좌표를 잡는다. y = 행 (위 아래), x=열(좌우) 예를 들면 북쪽으로 이동할경우 행이 줄어든다. (1,1) → (0,1)따라서d..
[알고리즘] BFS / DFS 접근 방식 정리
·
Algorithm
DFS / BFS 알고리즘의 특징은 이전 글에서 정리한 적 있다.코테 준비를 하면서, 어떤 유형에서 어떤 알고리즘을 써야할지 헷갈리는 부분이 많아 정리해보려고 한다. DFS일반적으로 재귀함수를 이용하여 구현한다. 정점 v를 방문한다.정점 v에서 인접한 정점 중에 방문하지 않은 정점 w가 있다면 w를 v로 하여 1부터 재귀함수를 반복한다.인접한 정점을 모두 방문했다면 스택에서 정점을 꺼내 위를 반복한다. import java.util.LinkedList;public class DFS_Graph { private int V; private LinkedList adj[]; DFS_Graph(int v){ V = v; adj = new LinkedList[v]; ..
[프로젝트] 댓글 조회시 N+1 문제 해결
·
project
상품/ 레퍼런스 댓글 관련 기능을 구현하기 위해 Jpa 연관관계 설정과 조회 로직을 구성하였다.그러나 실제로 API를 호출해본 결과, 단순 조회임에도 불구하고 예상보다 많은 수의 쿼리가 발생하는 것을 확인할 수 있었으며,사용자의 데이터 양이 증가할수록 쿼리 수가 급격히 늘어나 성능 저하로 이어지는 구조임을 확인할 수 있었다. N+1 문제란?-> 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상 기존 코드 방식public List getComments(Long userId, CommentableType type, Long commentableId) { // 1. 부모 댓글 목록 조회 (쿼리 1회) L..
[코테/알고리즘] 탐색 알고리즘 - DFS와 백트래킹
·
Algorithm
깊이 우선 탐색이란루트 노드 (혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법이다.넓게 탐색하기 전에, 깊게 탐색하는것이다.더 이상 갈곳이 없는 정점에 도착했다면 마지막에 따라왔던 간선을 따라 뒤로 돌아간다. 깊이 우선 탐색이 너비 우선 탐색보다 좀 더 간단하다. 검색 속도는 너비 우선 탐색보다 느리다. DFS의 가장 큰 특징 ➡️ 재귀적인 특징으로 구현을 한다.그래서 각 원소를 포함시킬지 말지 여부를 다 시도해야 하는 완전 탐색의 경우 재귀호출이나 DFS로 짜는것이 쉽다. 다음은 그래프 형식의 DFS 이다.노드 간 연결을 리스트로 관리한다.import java.util.LinkedList;public class DFS_study {..
[우아한테크코스 8기] 1주차 프리코스 회고
·
experience
1주차 미션은 문자열 덧셈 계산기 구현이었다. 1주차 미션과 시험이 겹쳐서, 미션 마감 하루전 미션을 시작하게 되었다.미션을 진행하면서 처음에 눈에 들어온 것은, '기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다.' 는 것이었다.간단해 보였지만 어떻게 요구사항을 분석해 나가느냐에 따라 차이가 큰 미션이라고 생각했다. 기능 목록을 작성하고, 기능 목록을 기준으로 커밋하라는 요구사항이 있었다. 먼저 구현할 기능을 정리하고 순서대로 기능을 추가하였다. 처음에 고민하면서 기능 목록을 꼼꼼하게 정리하고 미션을 시작하니까 수월했던것 같다. 발생할 수 있는 예외에 대해서도 README에 정리해 보았다. 고민했던점 ! 1.입력값의 범위입력값의 타입과 범위를 어떻게 설정할지 고민하였다.요구..
[코테/알고리즘] Java - Deque를 이용한 알고리즘 풀이
·
Algorithm
Deque란? 양쪽 끝에서 삭제와 삽입이 전부 가능하다. 스택과 큐를 덱의 특수한 예시라고 생각할 수 있다. 원소의 추가가 O(1)원소의 제거가 O(1)제일 앞/뒤의 원소 확인이 O(1)제일 앞/뒤가 아닌 나머지 원소들의 확인/변경이 원칙적으로 불가능 배열과 연결리스트 둘다 구현할 수 있지만, 배열을 이용하는 방식이 훨씬 더 편리하다.head ➡️ 가장 앞에 있는 원소의 인덱스tail ➡️ 가장 뒤에 있는 원소의 인덱스 +1 큐와 다르게 양쪽으로 삭제와 삽입이 모두 가능하기 때문에, 초기값을 max로 둔다! Deque의 자주 쓰이는 메서드offerLast(E e)뒤에 원소 추가큐 삽입pollFirst()앞에서 원소 꺼내고 제거큐 삭제peekFirst()앞 원소 확인 (삭제 X)큐 조회offerFirst(..