본문으로 건너뛰기

[Open WebUI] 비중국어 콘텐츠에 대한 불필요한 처리 스킵으로 스트리밍 성능 개선

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

들어가며

Open WebUI의 processChineseContent 함수는 중국어 응답에서 Markdown/LaTeX 형식 문제를 처리하기 위해 만들어졌습니다. 문제는 이 함수가 스트리밍 업데이트마다 전체 콘텐츠 문자열에 대해 실행되면서, 줄 분할, 정규식 매핑, 재결합을 수행한다는 점입니다. 중국어가 전혀 없는 콘텐츠에도 O(N_lines)의 작업을 매 프레임마다 수행하고 있었습니다.

핵심 코드 분석

가드 조건 한 줄 추가

Before:

function processChineseContent(content: string): string {
    const lines = content.split('\n');
    const processedLines = lines.map((line) => {
        if (/[\u4e00-\u9fa5]/.test(line)) {
            // 중국어 라인에 대한 처리...
        }
        return line;
    });
    return processedLines.join('\n');
}

After:

function processChineseContent(content: string): string {
    if (!/[\u4e00-\u9fa5]/.test(content)) return content;
    const lines = content.split('\n');
    const processedLines = lines.map((line) => {
        if (/[\u4e00-\u9fa5]/.test(line)) {
            // 중국어 라인에 대한 처리...
        }
        return line;
    });
    return processedLines.join('\n');
}

왜 이게 좋은가

  • 한 줄 변경으로 큰 효과: 함수 내부에서 이미 사용하던 정규식을 전체 문자열 가드로 끌어올린 것이므로 동작 변경이 없습니다.
  • 비중국어 사용자 전원 혜택: 대부분의 사용자가 비중국어 콘텐츠를 사용하므로, 매 프레임마다 문자열 분할/매핑/결합을 건너뜁니다.
  • 스트리밍 특성상 누적 효과 큼: 스트리밍 응답은 토큰이 추가될 때마다 이 함수를 호출하므로, 긴 응답에서의 CPU 절감이 상당합니다.
  • 중국어 콘텐츠 영향 없음: 중국어 문자가 포함된 경우 기존과 동일하게 처리됩니다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글