본문으로 건너뛰기
r/LangChain조회 1

LangChain 에이전트의 동일 호출 캐싱

LangChain 에이전트의 동일 모델 호출을 exact-match 캐시로 줄이는 withOhm 구현과 측정 과제

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

retry-on-error가 있는 AgentExecutor, 노드를 반복 방문하는 LangGraph 루프, 동일 프롬프트를 여러 번 샘플링하는 체인은 같은 messages 배열을 모델에 다시 보내도 LangChain 모델 호출 계층에서 중복 제거하지 않습니다. withOhm은 OpenAI 호환 base_url 앞단에서 요청을 정규화하고 해시해 exact-match 캐시를 Redis에 저장하며, 같은 요청만 모델 호출 없이 재생합니다. 의미 기반 캐시를 배제해 다른 입력의 응답이 섞이는 정확성 문제를 피하고, SSE 캐시 재생과 BYOK 키 전달도 유지합니다. 작성자는 자신의 체인에서 얻은 중복 호출 비율을 넘어 다양한 에이전트 설계의 측정값을 요청했습니다.

실용적 조언

  • 동일한 messages 배열과 도구 정의가 재시도마다 반복되는지 모델 호출 직전에 요청을 기록하고, 정규화된 요청 해시별 호출 횟수와 캐시 적중률을 집계하는 방식으로 먼저 비용 구조를 측정하는 것이 좋습니다. 의미가 비슷하지만 입력이 다른 요청까지 재사용하면 에이전트의 정확성이 흔들릴 수 있으므로 exact-match 기준부터 적용해야 합니다. 스트리밍 체인을 사용하는 경우에는 캐시 적중 응답도 SSE로 재생되는지 확인해야 기존 콜백 동작을 유지할 수 있습니다.
  • 기존 ChatOpenAI 기반 체인에서는 모델 호출 코드와 에이전트 로직을 바꾸기보다 OpenAI 호환 프록시의 base_url을 교체하는 방식으로 실험할 수 있습니다. upstream API 키가 프록시에 저장되지 않고 요청마다 전달되는지 확인해야 하며, 실제 운영 전에는 캐시 키에 시스템 프롬프트, 대화 기록, tool definitions가 모두 반영되는지 검증해야 합니다. 웹 콘텐츠를 체인에 주입한다면 robots.txt 준수, PII 삭제, 리디렉션 기반 SSRF 차단을 fetch 단계에 함께 배치해야 합니다.

섹션별 상세

01
작성자는 retry-on-error가 설정된 AgentExecutor, 같은 노드를 다시 방문하는 LangGraph 루프, 동일 프롬프트를 여러 번 샘플링하는 self-consistency 체인이 시도마다 underlying chat model을 다시 호출한다고 지적합니다. LangChain은 모델 호출 계층에서 동일한 messages 배열을 자동으로 중복 제거하지 않으므로 시스템 프롬프트, 대화 기록, 도구 정의가 모두 같은 요청도 OpenAI나 Anthropic에 별도 과금됩니다. 체인 자체는 정상 완료되기 때문에 기능 오류가 아니라 실제로 의미가 다른 호출 수보다 청구 항목이 늘어나는 비용 문제라는 설명입니다.
02
작성자는 withOhm을 OpenAI 호환 엔드포인트로 배치해 기존 ChatOpenAI의 base_url만 교체하는 방식을 구현했습니다. 요청을 정규화하고 해시한 뒤 동일한 해시가 나오면 Redis에서 응답을 재생하며, 코드 블록 내부 내용은 정규화 과정에서 건드리지 않는다고 밝혔습니다. 사용자의 upstream API 키는 X-Ohm-Upstream-Key 헤더로 요청마다 전달하고 저장하지 않는 BYOK 방식을 사용합니다.
03
캐싱 기준은 의미적 유사성이 아니라 exact match로 제한했습니다. 비슷한 요청을 같은 것으로 간주하는 semantic cache가 에이전트 루프에서 다른 입력의 응답을 재사용하면 정확성 오류가 되기 때문에, 동일한 입력에만 캐시 적중을 허용하는 선택입니다. 원래 호출이 SSE 스트리밍이었다면 캐시 적중 응답도 SSE로 다시 전송해 LangChain의 스트리밍 콜백이 실시간 호출과 캐시 재생을 구분하지 않도록 만들었습니다.
04
withOhm에는 웹 콘텐츠를 체인 컨텍스트로 가져오는 compliant-fetch 도구도 함께 포함됩니다. 이 도구는 fetch 시점에 robots.txt를 준수하고, 모델에 전달하기 전에 명백한 PII를 삭제하며, 리디렉션이 내부 주소를 가리키지 못하도록 SSRF를 방어합니다. 작성자는 자신의 체인에서 측정한 수치보다 서로 다른 에이전트 설계를 사용하는 더 큰 표본에서 exact repeat 호출 비율을 측정하는 일이 중요하다고 보고 커뮤니티의 검증을 요청했습니다.

용어 해설

정확히 일치하는 요청 캐싱(Exact-match Caching)
요청 메시지와 도구 정의 등 입력이 완전히 같은 경우에만 이전 응답을 재사용하는 캐싱 방식입니다. 요청을 정규화한 뒤 해시로 식별하며, 의미가 비슷하지만 다른 요청은 캐시 적중으로 처리하지 않아 잘못된 응답 재사용을 막습니다.
의미 기반 캐시(Semantic Cache)
문자열이 완전히 같지 않아도 의미가 유사한 요청을 찾아 기존 응답을 반환하는 캐시입니다. 비용과 지연을 줄일 수 있지만, 에이전트 재시도처럼 정확성이 중요한 흐름에서 다른 입력의 응답을 돌려주는 오류가 발생할 수 있습니다.
서버 전송 이벤트(Server-Sent Events)
서버가 생성한 데이터를 HTTP 연결을 통해 클라이언트로 순차 전송하는 스트리밍 방식입니다. 원래 요청이 SSE였다면 캐시된 응답도 같은 형식으로 다시 내보내 기존 LangChain 스트리밍 콜백과의 호환성을 유지합니다.
사용자 키 전달 방식(BYOK)
서비스가 자체 모델 키를 대신 보유하지 않고 사용자의 API 키를 요청마다 상위 제공자에게 전달하는 운영 방식입니다. 본문에서는 X-Ohm-Upstream-Key 헤더를 통해 키를 전달하며 저장하지 않는 구조로 제시됩니다.
서버 측 요청 위조(SSRF)
외부 콘텐츠를 가져오는 서버가 공격자의 리디렉션을 따라 내부 네트워크 주소까지 요청하게 되는 보안 문제입니다. 본문에 포함된 fetch 도구는 리디렉션 목적지가 내부 주소를 가리키지 못하도록 SSRF를 차단합니다.

코드 예제

python
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    base_url="https://api.withohm.dev/v1",
    api_key="sk-your-real-key",
    default_headers={"X-Ohm-Upstream-Key": "sk-your-real-key"},  # BYOK, forwarded per-call, never stored
    model="gpt-4o-mini",
)

기존 ChatOpenAI의 base_url을 withOhm의 OpenAI 호환 엔드포인트로 바꾸고, 사용자 키를 요청별 헤더로 전달하는 설정입니다.

언급된 도구

withohm-mcp중립

Cursor에서 withOhm의 캐시 기능과 모델 호출 경로를 연결하는 MCP 서버로 사용됩니다.

ChatOpenAI중립

withOhm의 OpenAI 호환 엔드포인트를 연결하는 LangChain 채팅 모델 인터페이스입니다.

Redis중립

동일 요청 해시에 대응하는 모델 응답을 저장하고 캐시 적중 시 재생하는 저장소입니다.

언급된 리소스

AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 08. 14.수집 2026. 08. 14.출처 타입 REDDIT

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.