Vector DB를 버리고 SQLite BM25로 전환한 이유와 3.6ns Rust sentinel 작성기: 다중 에이전트 루프 실행에서 얻은
요약
다중 에이전트 헤지펀드 시스템의 신뢰성 향상을 위해 아키텍처를 재구축했습니다. LLM에 원시 지표 공급 시 환각을 막기 위해 요인 온톨로지 스키마를 도입했으며, Vector DB 대신 SQLite FTS5 BM25를 사용하여 검색 지연 시간을 획기적으로 줄였습니다. 또한 실시간 위험 감지를 위해 Python의 한계를 극복하는 Rust Sentinel 코드를 개발했습니다.
핵심 포인트
- LLM에 원시 정량적 요인을 직접 제공하면 환각성 추론이 발생할 수 있다.
- 요인 온톨로지 스키마를 구현하여 메트릭의 명시적인 극성을 부여하는 것이 효과적이다.
- Vector DB보다 SQLite FTS5 BM25가 낮은 지연 시간과 높은 키워드 관련성을 제공한다.
- 실시간 위험 감지는 GIL 경합 문제 때문에 Rust와 같은 저수준 언어가 필요하다.
며칠 전, 저는 저희의 오픈 소스 다중 에이전트 헤지 펀드 실험에 대해 게시했고 여기서 많은 날카롭고 솔직한 피드백을 받았습니다. 댓글들은 특히 LLM 추론 한계, 지연 시간(latency), 상태 관리(state management) 측면에서 잔인할 정도로 정확했습니다. 저희는 지난 며칠 동안 그 조언을 바탕으로 아키텍처의 일부를 완전히 재구축했으며, 벤치마크 결과는 솔직히 우리를 놀라게 했습니다. 자율 에이전트 파이프라인에서 세 가지 주요 실패 모드를 수정하면서 배운 점들을 공유합니다.
LLM에 원시 지표(raw metrics)를 던지는 것은 환각성 추론을 보장한다
댓글 중 한 사용자가 지적했습니다: 온톨로지 없이 LLM이 원시 정량적 요인(raw quantitative factors)을 해석하도록 절대 두지 마라. 그들은 100% 옳았습니다. 저희가 PER = 85.0 또는 20일 역사적 변동성(historical volatility) = 65%와 같은 원시 숫자를 모델에 공급했을 때, 에이전트들은 빈번하게 긍정적인 근거를 환각했습니다. 예를 들어, 한 모델은 “변동성의 대규모 급증은 확장되는 비즈니스 활동과 강력한 매수 모멘텀을 보여준다”고 주장했는데, 이는 기본적인 위험 관리와는 정반대입니다. 이를 수정하기 위해, 저희는 엄격한 요인 온톨로지 스키마(Factor Ontology Schema)를 구현했습니다. 저희는 명시적인 극성 계약(polarity contracts)을 가진 11가지 핵심 정량적 요인을 정의했습니다: HIGHER_IS_BULLISH (예: ROE, 주문 흐름 불균형), LOWER_IS_BULLISH (예: PER, 부채 비율), 그리고 EXTREME_IS_RISK (예: 변동성). 어떤 에이전트가 데이터를 보기 전, 이 스키마는 메트릭을 결정론적으로 사전 평가하고 상태에 명시적인 신호(BULLISH, BEARISH 또는 RISK)를 첨부합니다. 이렇게 한 이후로, 저희 투자 위원회에서 극성 환각은 말 그대로 0%로 떨어졌습니다.
에이전트 성찰 기억을 위한 Vector 데이터베이스는 과도한 오버킬이다
처음에는 이전의 잘못된 거래로부터 “배운 교훈”을 검색하기 위해 임베딩 API와 로컬 Vector DB를 사용하는 것을 고려했습니다(Reflexion 패턴). 또 다른 댓글 작성자는 임베딩 자체를 완전히 포기하고 SQLite WAL과 FTS5 BM25를 사용하라고 제안했습니다.
우리는 두 가지 접근 방식 모두를 Linux 서버에서 벤치마킹했습니다.
- 임베딩 API + 벡터 유사도: 왕복 지연 시간(round-trip latency)이 200ms에서 450ms 사이였으며, 외부 API 비용과 간헐적인 속도 제한(rate limiting) 문제가 발생했습니다.
- SQLite FTS5 BM25: 0.35ms였습니다. 외부 의존성이나 API 비용이 전혀 들지 않았습니다. 더욱 중요한 것은, 트레이딩 사후 분석(post-mortems)은 특정 맥락적 키워드, 예를 들어 “반도체 실적 발표 전”, “트레일링 스톱 스윕”, “급격한 거래량 급증”, 또는 “약세 다이버전스”와 같은 것에 의존한다는 점입니다. 테스트 결과, BM25의 키워드 관련성은 고차원 임베딩 공간에서의 모호한 코사인 유사도(fuzzy cosine similarity)보다 훨씬 더 신뢰성 있게 정확히 일치하는 과거 교훈을 검색해냈습니다.
Python은 안전장치가 될 수 없습니다 (3.6ns Rust Sentinel)
Python은 고수준 에이전트 오케스트레이션(LangGraph, 상태 그래프, API 호출)에는 훌륭하지만, 갑작스러운 시장 플래시 크래시 동안 실시간 위험 감시를 위해 Python 루프에 의존하는 것은 GIL 경합(GIL contention)과 분산된 객체 포인터로 인한 L1/L2 캐시 미스(cache misses) 때문에 위험하다는 것이 입증되었습니다. 우리는 실행 안전장치(execution safety sentinel) 코드를 Struct-of-Arrays (SoA) 메모리 레이아웃과 #![forbid(unsafe_code)]를 사용하여 순수 Rust로 다시 작성했습니다. 가격, 손절매 트리거, 트레일링 임계값을 연속적인 플랫 슬라이스에 유지함으로써, CPU는 포인터 추적을 피하고 캐시 라인 내부에 머무를 수 있습니다.
다음은 Ubuntu 서버에서 측정한 실제 벤치마크 결과입니다:
- 단일 포지션 손익 평가: 3.63 나노초(nanoseconds)
- 1,000개 포지션 배치 평가: 3.62 마이크로초(microseconds)
- 1,000봉 거래량 클럭 변환: 3.90 마이크로초
- Python-to-Rust 영구 파이프 IPC 왕복: 2.88 마이크로초
Python은 느리고 깊은 사고(15분 에이전트 회의)를 처리하는 동안, Rust 센티넬은 나노초 단위로 포트폴리오를 감시합니다.
결론
실시간 시스템과 상호 작용하는 자율 에이전트를 구축하는 과정에서 우리는 LLM이 자신이 가장 뛰어난 분야인 맥락적 합성 및 반박 논쟁에만 집중해야 한다는 것을 배웠습니다. 하드 손절매, 팩터 극성(factor polarity), 빠른 메모리 조회와 같이 결정론적인 모든 것은 엄격한 스키마, 빠르고 로컬한 데이터베이스, 그리고 컴파일된 시스템 언어에 속해야 합니다.
모든 코드와 벤치마크는 GitHub (lumina-ai-hedge-fund)에서 오픈 소스로 공개되어 있습니다. 누구나 Rust SoA sentinel이나 온톨로지 스키마를 확인해 볼 수 있습니다. (참고: 영어는 제 모국어가 아니므로, 원본 노트를 정리하고 다듬는 데 LLM을 사용했습니다!) /u/OpenComplaint524가 제출했으며 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 Reddit AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기