Python의 해시(hash) 값으로 LLM 캐시 키가 다른 프로세스에서 달라지는 문제
요약
LLM 캐시 키를 다룰 때, 동일 문자열이라도 프로세스 간 해시 값 일치가 깨지는 문제가 발생할 수 있습니다. 이 문제를 해결하기 위해 JSON화 시 `sort_keys=True`와 SHA-256 같은 표준 해싱 알고리즘을 사용하여 안정적인 캐시 키 생성을 권장합니다.
핵심 포인트
- 프로세스 간 LLM 캐시 키의 해시 값 일치 보장이 어렵다.
- 안정적인 캐시 키를 위해 JSON화 시 `sort_keys=True` 사용이 필수적이다.
- SHA-256과 같은 표준 암호화 해싱을 사용하여 키 무결성을 확보해야 한다.
같은 문자열이라면 같은 해시 값이일 것이라고 생각했다. 나는 LLM의 캐시 키를 확인하고 있었는데, 다른 프로세스로 동일한 JSON을 전달했더니 hash()
의 일치 판정이 False가 되었다. 영구 캐시가 헛수고였다.
디스크나 Redis에 남길 키에는 입력을 정해진 형식으로 JSON화하고 SHA-256을 사용하고 싶다.
표준 설정에서는 문자열 해시에 무작위 시드(random seed)가 들어간다. 동일 프로세스 내에서는 고정되지만, 시작을 넘어서는 일치는 보장되지 않는다. 포함된 python3 --help-env에서도 PYTHONHASHSEED에 대한 설명을 확인했다. 이는 프로세스별 시드이다.
시드를 1과 2로 고정하여 차이를 재현해 본다. 외부 API는 호출하지 않고, 키만 비교했다.
그전에 JSON의 키 순서와 공백을 맞춘다. CPython에 포함된 json/encoder.py에서는 sort_keys=True를 사용하여 딕셔너리 항목을 정렬하고 있었다. 아래는 CPython 3.14.8에서 실행한 내용이다. cache_key.py에 저장하여, python3 cache_key.py로 동작한다.
import json, os, subprocess, sys
q = {"model": "demo-v1", "prompt": "요약해"}
s = json.dumps(q, sort_keys=True, ensure_ascii=False,
...
hash 일치: False
SHA-256 일치: True
키의 삽입 순서를 역순으로 한 딕셔너리에서도 위의 JSON화로 동일한 문자열이 되었다. JSON의 공백까지 키에 들어가는 것이 은근히 번거롭다.
실제 운영에서는 모델 버전이나 생성 설정도 입력에 포함한다. JSON화 규칙에도 버전을 붙여두면, 변경 시 오래된 캐시를 구별할 수 있다. 여기서 확인한 것은 키의 일치만으로는 LLM의 답변이 매번 같을 것이라는 보장은 없다는 점이다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기