AI 자동매매 시스템 만들기 #6 - 예외처리시간! (LLM 환각, WebSocket 재연결, API 비용 최적화)
·
일상다반사/개발
문제 1: LLM이 JSON 대신 마크다운을 뱉어버렸다AI 분석이 간혹 가다 실패하기 시작했습니다. JSON을 달라고 했는데 마크다운으로 답변하고 있었습니다.원인 분석Qwen3 14B 모델은 "thinking 모드"를 지원합니다. 사고 과정을 ... 태그 안에 쓰고, 그 다음에 JSON 응답을 줍니다. 그런데 간헐적으로 JSON 대신 마크다운으로 응답하는 경우가 생겼습니다.해결: 정규표현식 폴백 파서JSON 파싱 실패 시 마크다운에서 직접 데이터를 추출하는 폴백 로직을 추가했습니다. 정규표현식으로 "추천: BUY", "신뢰도: 75%" 같은 패턴을 찾아서 JSON으로 변환합니다.JSON 파싱 성공률이 82% → 98%로 올라갔습니다.문제 2: LLM 환각으로 감시 종목 절반을 매칭해버림"반도체 업황 호조..
AI 자동매매 시스템 만들기 #5 - RAG로 AI에게 기억력을 주다(pgvector)
·
일상다반사/개발
AI가 과거를 기억하지 못한다초기 시스템의 치명적인 약점이 있었습니다. AI가 실시간으로 들어오는 정보만 보고 판단한다는 거예요.예를 들어 텔레그램 채널에서 이런 메시지들이 왔다고 가정해봅시다:월요일 오전: "삼성전자 분석 - 반도체 업황 회복 조짐, 목표가 85,000원"월요일 오후: "삼성전자 실적 발표 예정, 컨센서스 상회 전망"화요일 오전: "삼성전자 추가 매수 의견, 기술적 지지선 돌파"수요일: "삼성전자" (단 3글자만) AI는 수요일 메시지를 볼 때 이전 3일간의 맥락을 전혀 모릅니다. 단순히 "삼성전자"라는 키워드만 보고 분석하죠. 당연히 정확도가 떨어질 수밖에 없습니다.RAG 구축RAG는 간단히 말하면 "관련 있는 과거 정보를 찾아서 AI에게 함께 제공하는 기술"입니다. 이를 위해선 벡터..
AI 자동매매 시스템 만들기 #4 - AI가 실제로 판단하는 방법
·
일상다반사/개발
나의 로컬 LLM은?사실 첫번째엔 Gemma3를 쓰고자 하였습니다.근데 AI가 Gemma3 보다는 qwen을 추천한데요... 저보다 똑똑한 AI가 하는 말을 믿고 모델을 변경하였습니다. 와 동시에 vLLM에서 Ollama로 프레임워크를 변경하였습니다.사유는 vLLM으로 동일 모델을 Windows 환경에서 구동하기 위해서는 WSL Linux에서 구동하거나 Docker를 이용하는 것이었습니다. 하지만 Docker로 구동을 하니 GPU 액셀러레이션을 제대로 활용하지 못해 속도가 굉장히 느렸습니다. (Linux OS 였다면 vLLM으로 했을 것입니다) 최종적으로 Ollama를 사용해서 Qwen3 14B 모델을 로컬 서버에서 실행합니다.ollama run qwen3:14b 응답 속도는 0.5초 이하, 비용은 전기..
AI 자동매매 시스템 만들기 #3 - 키움증권 API 연동과 실전 거래
·
일상다반사/개발
API 연동 삽질기 - 토큰 관리의 중요성키움 REST API는 OAuth 2.0 방식을 씁니다. access_token과 refresh_token을 발급받아서 쓰는 구조입니다.access_token은 24시간 유효, refresh_token은 30일 유효 문제는 토큰이 만료되면 자동매매가 멈춘다는 거죠. 그래서 토큰 갱신 로직을 반드시 구현해야 합니다.@Serviceclass KiwoomAuthService( private val kiwoomProperties: KiwoomProperties, private val webClient: WebClient,) { @Volatile private var accessToken: String? = null @Volatile pri..
AI 자동매매 시스템 만들기 #2 - 채널 모니터링과 5단계 매칭 시스템
·
일상다반사/개발
지난 글에서는 프로젝트 구조와 설계에 대해 이야기했는데요, 오늘은 가장 재미있었던 부분인 텔레그램 채널 모니터링 기능 구현에 대해 이야기해보려고 합니다. 왜 텔레그램 채널을 모니터링하나? 주식 투자를 하다 보면 여러 텔레그램 채널을 구독하게 됩니다. 증권사 리포트 채널, 뉴스 속보 채널, 개별 종목 분석 채널 등등... 문제는 이 채널들에서 쏟아지는 정보를 실시간으로 다 확인하기 어렵다는 거죠."내가 관심 있는 종목에 대한 소식만 골라서 알림을 받을 수 있다면?"이런 생각에서 시작했습니다. AI가 채널 메시지를 읽고, 내가 감시 중인 종목과 관련이 있는지 판단해서 알려주면 좋겠다는 거죠. TDLib - 텔레그램의 공식 라이브러리텔레그램 봇 API를 쓸까 하다가, 더 강력한 방법을 찾았습니다. 바로 TDL..
AI 자동매매 시스템 만들기 #1 - 프로젝트의 시작과 설계
·
일상다반사/개발
오늘부터 제가 만들고 있는 AI 자동매매 시스템 프로젝트 개발기를 연재하려고 합니다. 첫 번째 글에서는 프로젝트가 어떻게 시작되었고, 어떤 기술 스택을 선택했는지 이야기해볼게요. 왜 만들게 되었나?1. 요즘 핫한 AI. 어떻게든 활용 능력을 키워보고 싶었습니다. (그래도 내가 백엔드 개발자인데...)2. 과거 키움 증권의 Open API를 이용해서 구현을 시도하다가 32bit 프로그램을 포함한 다양한 디펜던시와 메인 PC에 깔아야 하는 보안 프로그램(매번 로그인도 번거로웠던).. 치를 떨고 줄행랑 쳤습니다. 그런데.... REST API가 나왔었더라구요!! "AI가 객관적으로 판단해서 자동으로 매매하면 어떨까?"물론 시중에 자동매매 프로그램들이 많이 있지만, 개발자로서 직접 만들어보고 싶었어요. 내가..
PageNotFound, No mapping for ... 로그 해결하기
·
Framework & Runtime/SpringBoot
서비스를 운영하다보면 뭔지 모를 요청을 마구잡이로 요청하는 놈들이 매일 매일 수천건씩 생긴다. 서비스가 AWS 위에서 올라가다보니 로그가 CloudWatch에 적재가 되는데 이 모든것은 비용이 발생한다. 해당 에러메시지를 없애보기로 하였다. 로깅 레벨 변경resources/application.ymllogging.level.org.springframework.web.servlet.PageNotFound: ERROR 위 코드를 properties에 위 처럼 추가하면 WARN 단계인 사진의 에러메시지는 앞으로 찍히지 않게 된다. 그리고관련된 방법을 찾다가 이러한 요청을 하는 Client의 IP 주소를 출력했으면 좋겠다는 질의가 StackOverflow에 올라온 적이 있다. 이 글을 참고하면 관련한 솔루션을 ..
java.lang.IllegalArgumentException: Malformed escape pair at index 해결
·
Framework & Runtime/SpringBoot
Error creating bean with name 'postConstructInitializeBean': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Malformed escape pair at index redis 서버와 연동을 테스트 하려던 중 발생한 오류이다. lettuce 에서 뿜어낸 에러 같은데, RedisClient 를 create 할 때 입력해주는 비밀번호에 있는 특정 문자를 제대로 입력 받지 못하는 것 같다. 로 되어 있는 코드를 URLEncoder.encode() 를 이용하여 주었고, UTF-8 로 인코딩 하도록 했다. 이후 에러가 해결되었다. 필자의 경우에는 sprin..
[Kotlin] Unexpected error occurred in scheduled task (how to solve or fix)
·
Framework & Runtime/SpringBoot
해당 에러가 발생했을 때 검색을 해보니, Serializable 를 implements 하라고 합니다. 하지만 인텔리제이는 이 인터페이스를 불러올 줄을 모르고 있습니다. 위 에러 메세지에 힌트가 있습니다. java.io.Serializable 에러가 해결되었습니다 :)
Initialized JPA EntityManagerFactory for persistence unit 'default' Stuct 문제 해결
·
Framework & Runtime/SpringBoot
2021-09-28 09:44:56.028 INFO 24956 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 위의 메세지는 에러가 아닙니다. 하지만 Spring Application 를 Run 또는 Debug 할 경우 저 부분에서 계속 멈춰있게 됩니다. 해결 빌드 결과물에 문제가 생겼던 것 같습니다. gradle clean -> build 이후에 해결 되었습니다.