Kmemo, LLM 캐시 오류 방지
- •Kmemo는 의미 유사도 뒤에 10개 텍스트 가드를 추가해 잘못된 LLM 캐시 응답을 줄인다
- •Kotlin 라이브러리는 JDK 17+가 필요하며 의존성 1개를 둔 kmemo-core 1.0.0으로 배포된다
- •블라인드 검증에서 근접 오답 67%를 거부하고 의역 프롬프트 88%를 유지했다
Kmemo는 2026년 7월 25일 공개된 오픈소스 Kotlin 라이브러리로, LLM 호출용 의미 캐시(뜻이 비슷한 요청을 찾아 재사용하는 저장 방식)에 유사도 검색과 텍스트 가드를 함께 적용해 잘못된 캐시 답변을 줄인다. 저자는 정확히 같은 문장만 찾는 캐시가 "python list reverse"를 본 뒤 "how do I reverse a list in Python" 같은 프롬프트를 놓친다고 설명했다. 의미 캐시는 프롬프트를 임베딩하고 가장 가까운 기존 답변을 재생해 API 호출과 지연시간을 줄이지만, "Convert 100 USD to EUR"와 "Convert 250 USD to EUR"처럼 코사인 유사도가 약 0.99로 나오는 경우 임계값만 쓰는 캐시가 눈에 띄는 오류 없이 잘못된 환전 답변을 반환할 수 있다.
Kmemo는 유사도를 1차 필터로 사용한 뒤, 남은 후보를 10개 가드 체인에 통과시켜 프롬프트 사이의 구체적 차이를 찾는다. 가드는 바뀐 숫자, 불일치 단위, 다른 엔터티, 다른 시간 참조, 부정, 뒤집힌 반의어, 반대 방향 비교, 요청 답변 유형 차이를 검사한다. 라이브러리는 불확실한 일치를 기본적으로 거부하는데, 잘못된 거부는 API 호출 1번을 더 쓰는 비용에 그치지만 잘못된 수락은 틀린 답변을 반환하기 때문이다.
Kmemo는 JDK 17+가 필요하며 `io.github.nacode-studios:kmemo-core:1.0.0`으로 배포된다. `kmemo-core`는 `kotlinx-coroutines-core`만 의존성으로 선언하고, 임베딩 제공자는 포함하지 않으며 사용자가 제공하는 `String` to `FloatArray` 임베더를 받는다. `getOrPut`은 조회와 쓰기 모두에 대해 프롬프트를 1번만 임베딩하고, 같은 요청을 동시에 보낸 호출자는 하나로 묶여 첫 호출자가 계산하는 동안 나머지는 답변을 기다린다.
라이브러리는 조회 실패 이유를 `BELOW_THRESHOLD`, `REJECTED_BY_GUARD` 등으로 보고한다. 조회가 왜 실패했는지 모르면 4% 적중률을 조정하기 어렵기 때문이다. 읽기 전용 `cache.explain(prompt)` 호출은 모든 후보와 모든 가드 판정을 보여준다. Kmemo는 모델, temperature, 시스템 프롬프트, 테넌트, 언어처럼 정답을 바꿀 수 있는 값에 대한 스코프도 지원하며, 원문은 `gpt-4o|t=0.0|v3`를 예시 스코프로 제시했다.
Kmemo는 `MatchGuards.standard()`, `MatchGuards.strict()`, `MatchGuards.none()`을 제공한다. strict 모드는 적중률을 낮추는 대신 여유 폭을 키우고, none은 유사도만 쓰는 기준선이다. 가드는 영어 밖에서도 작동하며, 이탈리아어, 스페인어, 독일어, 프랑스어용 큐레이션 팩은 현지화된 근접 오답 말뭉치로 측정됐다. 강아지와 성견의 구충, 에탄올과 메탄올의 끓는점처럼 세계 지식이 필요한 경우에는 선택형 `Verifier`가 임계값과 가드를 통과한 뒤 저렴한 모델 호출을 할 수 있으며, 시간초과나 오류가 나면 후보를 거부한다.
원문에 따르면 Kmemo의 가드는 레이블이 붙은 말뭉치 3개로 테스트됐고, 블라인드 검증 분할은 모든 빌드에서 CI 회귀 게이트로 쓰인다. 블라인드 분할에서 근접 오답은 67% 거부됐고 의역은 88% 유지됐다. 저자는 남은 근접 오답 대부분이 검증기가 다루는 세계 지식 사례라고 설명했으며, 재현 명령으로 `./gradlew :kmemo-core:test --tests 'CorpusTest'`를 제시했다.
Kmemo에는 각 임베딩 모델에 맞는 임계값을 다른 설정에서 베끼지 않고 측정하는 `ThresholdCalibrator`가 포함된다. 저장 옵션은 인메모리, RediSearch KNN을 쓰는 Redis, pgvector를 쓰는 Postgres, 선택형 인프로세스 HNSW 저장소를 포함한다. 라이브러리는 `maxAttempts = 4`, `EmbedFailurePolicy.FALL_BACK_TO_COMPUTE`, `negativeCacheSize = 10_000`, FAQ 워밍, 이벤트 스트림 관측성, `kmemo-micrometer`, `Slf4jCacheListener`, Spring Boot 스타터, Spring AI `Advisor`, LangChain4j `ChatModel` 래퍼, Ktor 서버 플러그인, API 키가 필요 없는 예제, Apache-2.0 라이선스, `1.0` SemVer 안정성도 제공한다.