프로그래밍 419

직접 RAG를 구축할 필요없게 해주는 Gemini File Search API

Chatbot을 만들면서 가장 귀찮았던건 RAG였다. RAG를 구현하기 위해 VectorDB라는 관리 포인트가 생기며, 임베딩 정책 및 모델 설정, 임베딩할 파일들을 관리하는 컴포넌트까지...RAG 구축 하나로 프로젝트가 복잡해지는 것은 순식간이다. 지난 11월 6일, Google이 Gemini 3, Nano Banana Pro와 함께 Gemini File Search API를 발표했다. Gemini File Search API는 Gemini API에 구축된 RAG 시스템이다. 텍스트 파일 종류라면 대부분 지원하며, File Store를 생성하고 파일을 업로드하는 간단한 절차만으로 검색 기능을 추가할 수 있다. 나는 사내 API 문서를 바탕으로 API에 대한 질의를 할 수 있는 하는 MCP서버를 만들어보..

[Android] Room이 생성한 Dao 구현체 확인방법

오늘 @Upsert 어노테이션을 사용해서 Collection 데이터를 넘겼을때 과연 "트랜잭션처리가 되는가?"에 대해서 검증해야할 일이 있었다. Room을 당연한듯이 사용하고는 했지만 너무 추상화되어있어서 내부 동작을 알지 못했다. 당연히- 트랜잭션처리가 될거라고, 되어야만 한다고 생각했지만, 어림짐작으로 그치지 않고 코드로 확실하게 보고싶었다. 안드로이드 빌드를 한번 끝내면 generated/build에 내 Dao이름 + _Impl 이름으로 Dao의 구현체에대한 Java Class가 생성되어있는 것을 볼 수 있다. upsert 함수가 이렇게 트랜잭션으로 감싸져 있는것을 확인했고, Room에 대한 흐릿한 불신을 지울 수 있게 되었다.@Override public Object upsert(fina..

OAuth 2.0 관련 용어 공부

인가(Authorization)확인된 사용자가 특정 자원에 접근할 권한이 있는지 확인 (권한 확인) 인증(Authentication)사용자가 누구인지 확인 (로그인)따라서 일반적인 순서: Authentication → Authorization 인증 서버(Authorization server)OAuth 2.0 프레임워크의 구성요소로, 클라이언트가 인증 및 인가에 성공하면 Access Token을 발급한다. Bearer 인증OAuth 2.0 프레임워크에서 사용하는 토큰 인증 방식. HTTP 통신시 Header에 “Authorization: Bearer ”과 같은 형식으로 사용한다. Basic 인증방식만으로는 사용자의 권한을 정교하게 제어할 수 없기 때문에 등장했다. 형식은 *불투명한(Opaque) 문자열일수..

Gevent 알아보기

gevent는 동시성과 네트워크 관련 작업들을 위한 다양한 API를 제공하는 동시성 라이브러리다. gevent에서는 Greenlet이라고하는 경량 코루틴을 사용한다. 한 번에 오직 하나의 greenlet만이 실행되기에, multiprocessing이나 threading을 이용한 병렬처리와는 다르다.yield를 통해 컨텍스트 스위칭이 이루어지며, 네트워크, I/O bound 작업을 처리할때 그 힘이 발휘된다. gevent는 네트워크 라이브러리들이 컨텍스트 스위칭이 가능한 시점에 yield하도록 보장해준다. Monkey patchasyncio를 사용하는 것 보다 gevent가 나은 점 중에 하나는 바로 monkey patch로 gevent를 사용하지 않는 다른 라이브러리들도 동시처리를 가능하도록 만들어준다는..

나노바나나로 피규어 만드는 방법 (더 상세한 설정 가능)

ChatGPT의 "지브리" 이미지 생성 열풍에 이어 Google의 나노 바나나가 피규어 만들기로 화제다.나노 바나나는 Gemini 2.5 Flash Image의 이름인데, 구글의 최신 이미지 생성 모델이다. 이미지의 맥락, 빛과 그림자를 이해하고, 일관성을 유지하는데 탁월한 모습을 보이고있다. 나노 바나나로 피규어 이미지를 만드는 방법은 LMArena에서 진행하는 방법이 널리 알려져있으나, LMArena는 서드파티 앱이기때문에 기본 설정밖에 사용하지 못한다. 나노 바나나는 Google 제품이기 때문에 Google Ai Studio를 활용하면 훨씬 더 자유로운 설정을 할 수 있고, 대화편집도 가능해서 일관된 이미지 생성에 더 유리하다. Google AI StudioGoogle AI Studio에 들어온 ..

[Python] Pipeline Pattern 구현

코드 베이스에대한 위키 문서를 작성하는 토이 프로젝트를 만드는 중, 선형적으로 진행되는 작업에 대해 깔끔하게 처리해야할 경우를 발견했다. 작업은 다음 순서대로 이어진다. 1. 코드 베이스를 다운받는다.2. 코드 베이스의 구조를 참고하여 작성할 위키 문서의 뼈대를 생성한다.3. 만들어진 뼈대의 각 페이지들을 생성한다.4. 전체 문서에 대한 인덱스 페이지를 생성한다.5. 변경사항을 다시 업로드한다. 이전 스텝의 진행이 실패하면 멈춰야하며, 각 스텝은 이전 스텝의 출력 또는 맥락을 필요로 한다.구현에 앞서, 어떻게 쓰고싶은지부터 정하면 늘 도움이 된다.pipeline = ( Pipeline.with_context(context) .register(Download) .register(Genera..

missing required module ‘GRDBSQLite’ 해결방법

Framework에서 GRDB를 사용할 경우, 빌드시 Swift Interface가 생성되면서 GRDBSQLite를 찾을 수 없다는 오류가 뜬다. Framework 내부에서만 GRDB를 사용한다면 import GRDB 대신에 internal import GRDB 로 GRDB를 사용한다면 Swift Interface에서 불필요한 GRDB 의존성이 노출되지않아 오류를 해결할 수 있다.Swift 6 이전 문법으로는 @_implementationOnly 라고 한다.@_implementationOnly import GRDB

프로그래밍/iOS 2025.07.31

실생활 예시로 이해하는 스윕 라인 알고리즘 (Sweep line Algorithm)

Sweep은 “쓸다”라는 의미를 가지고있는데, 스윕 라인 알고리즘은 빗자루로 먼지를 쓸어내듯이 특정 방향을 따라 스위핑하면서 점 또는 선을 확인하며 답을 찾아가는 알고리즘이다. 선분의 교차 여부, 구간 겹, 점의 분포등을 계산할 수 있기때문에 주로 시/공간의 겹침, 자원할당, 스케쥴링 문제를 다룰때 해결할 수 있는다. 나도 마찬가지로 회의실 예약 관련 Tool을 만들다 접하게되었다. 스윕 라인 알고리즘의 문제 해결과정은 대부분 이렇다:모든 데이터를 특정 기준에따라 정렬한다.스위핑 라인을 이동시키며 데이터를 하나씩 처리한다. 내 경우 회의실이 비는 시간을 파악하기 위해서 사용했는데, 이를 단순화한 예시로 스윕 라인 알고리즘을 알아보자. 3개의 회의실이 있고, 이미 예약된 회의가 있다.이미 예약된 회의가 ..

LLM Tool을 만들다 식겁한 이야기

Tool을 만들면서 정말 등골이 서늘했었을때가 한 번 있었다.그 일을 기념(?)하기 위해...그리고 나같은 바보가 더 이상 등장하지 않았으면 좋겠다는 마음에서 포스팅한다. Tool Calling중 오류가 났을때, LLM에게 전달되는 메세지에 굳이 정확한 오류를 전달할 필요 없다. 사진은 내가 f"{e!s}" 같은 방법으로 Exception 메세지를 출력하려고 하다 디코드에러를 만나서 LLM에게 전달된 메세지내용이다. 내용이 Word도 아니라서 엄청나게 많은 토큰이 한 순간에 소비되었고, 단 한번의 Tool Calling으로 $44를 날려버리게 되었다... 정확한 오류는 Logger로 따로 로깅하고, LLM에게는 "실패했다", "파일이 없다" 정도로만 오류 메세지를 출력해야한다. 또한 FileTree나..

LLM이 자연스러운 슬랙 메세지를 출력하게 하는 소소한 팁

AI를 이용한 자동화 작업을 하면서 Slack 메세지를 통합해본 경험이 있는 분들이라면 한번쯤 이쁜 출력에 대해 고민해봤을 것이다. 구조화된 출력을 하게하고 직접 포맷팅하는 방법이 가장 마음에 들겠지만, 구조화된 출력을 위해 낭비되는 토큰들이 아깝거나, 사내공유 Slack 메세지처럼 딱히 정확한 출력을 원하지 않을때 내가 사용하는 방법이있다. LLM에게는 마크다운으로 작성하라고하고, 그걸 Slack 메세지 포맷으로 바꾸는 방법이다.처음부터 LLM에게 Slack 메세지 포맷으로 해달라고하면 메세지 포맷이 지켜지지 않기가 일쑤다. (특히, Google Gemini 2.0 Flash는 **를 엄청나게 쓴다.) 마크다운 문법은 모든 LLM이 거의 완벽하게 구사하기때문에 일관된 결과를 출력할 수 있다.https:..