[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 = [
// ... 동일
];
};
왜 이게 좋은가
- O(1)에 가까운 검사:
String.includes()는 단순 부분 문자열 검색으로, 정규식이나 배열 조작보다 훨씬 빠릅니다. - 스트리밍 핫 패스 최적화: LLM 응답이 토큰 단위로 도착할 때마다 호출되므로, 호출 빈도가 매우 높은 함수입니다. 대부분의 경우
{{를 포함하지 않으므로 즉시 반환됩니다. - 기존 로직 무영향: 실제로
{{가 포함된 경우(시스템 프롬프트 템플릿 등)에는 기존과 동일하게 동작합니다. - 0줄 삭제: 기존 코드를 전혀 수정하지 않고, 함수 시작 부분에 가드 절 하나만 추가했습니다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [sglang] sgl-kernel 레거시 경로 대규모 제거: AOT에서 JIT로의 전환 완성
- 현재글 : [Open WebUI] replaceTokens 함수에 early return 추가로 스트리밍 성능 개선
- 다음글 [sglang] CI에 네트워크 타임아웃 추가 및 러너별 동적 병렬도 설정
댓글