[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 의 다른글
- 이전글 [Loki] 캐시 최대 크기 초과 시 조기 중단으로 OOM 방지
- 현재글 : [Open WebUI] 비중국어 콘텐츠에 대한 불필요한 처리 스킵으로 스트리밍 성능 개선
- 다음글 [Open WebUI] DOMParser 대신 html-entities로 HTML 디코딩 최적화
댓글