본문으로 건너뛰기

[Open WebUI] replaceTokens 함수에 early return 추가로 스트리밍 성능 개선

PR 링크: open-webui/open-webui#23161 상태: Merged | 변경: +1 / -0

들어가며

replaceTokens 함수는 LLM 응답을 스트리밍할 때 매 프레임마다 호출됩니다. 이 함수는 {{char}}, {{user}} 같은 템플릿 토큰을 치환하는 역할인데, 실제 LLM 출력에는 이런 토큰이 거의 포함되지 않습니다. 그런데도 매번 코드 펜스 분리, 배열 생성, 4개의 정규식 매칭을 수행하고 있었습니다. 이 PR은 단 한 줄의 early return으로 이 낭비를 제거합니다.

핵심 코드 분석

한 줄의 early return

Before:

export const replaceTokens = (content, char, user) => {
  const tokens = [
    { regex: /{{char}}/gi, replacement: char },
    { regex: /{{user}}/gi, replacement: user },
    // ... 추가 토큰들
  ];
  // replaceOutsideCode로 코드 펜스 분리 후 각 segment에 정규식 적용
};

After:

export const replaceTokens = (content, char, user) => {
  if (!content.includes('{{')) return content;
  const tokens = [
    // ... 동일
  ];
};

왜 이게 좋은가

  1. O(1)에 가까운 검사: String.includes()는 단순 부분 문자열 검색으로, 정규식이나 배열 조작보다 훨씬 빠릅니다.
  2. 스트리밍 핫 패스 최적화: LLM 응답이 토큰 단위로 도착할 때마다 호출되므로, 호출 빈도가 매우 높은 함수입니다. 대부분의 경우 {{를 포함하지 않으므로 즉시 반환됩니다.
  3. 기존 로직 무영향: 실제로 {{가 포함된 경우(시스템 프롬프트 템플릿 등)에는 기존과 동일하게 동작합니다.
  4. 0줄 삭제: 기존 코드를 전혀 수정하지 않고, 함수 시작 부분에 가드 절 하나만 추가했습니다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글