퍼지 맵 매크로 및 브래킷 로직

Aura는 ‘FUZZY_MAP_pre.py’ 파일에서 여러 사전 처리 규칙을 그룹화하여 ‘시작 규칙’이 트리거되면 응집력 있는 파이프라인으로 순차적으로 실행할 수 있도록 지원합니다. 이 문서에서는 이 기능의 디자인 철학, 구문 및 실행 흐름을 설명합니다.

핵심 디자인 원칙

  1. 중복성 없음: 그룹 내부의 규칙은 표준 Python 튜플로 유지됩니다. ('replacement_text', r'regex_pattern', 임계값, flags_and_options)

  2. 이중 사용성: 그룹 내의 개별 규칙은 완전히 기능하는 독립형 규칙입니다. 그룹이 트리거되지 않으면 상위 루프에서 정상적으로 평가됩니다.

  3. 수동 종료 마커: 그룹의 끝은 자체적으로는 일치하지 않는 수동 규칙 항목에 의해 정의됩니다. 이는 순전히 파서의 경계 표시 역할을 합니다.

  4. 하이브리드 폴백(비일치 시 추가): 그룹이 활성화되면 모든 내부 규칙이 출력에 기여해야 합니다. 내부 규칙의 정규식이 텍스트와 일치하면 일반적인 대체가 발생합니다. 일치하지 않으면 대체 텍스트가 공백과 함께 현재 텍스트에 추가됩니다.


구문 및 구조

매크로 그룹은 FUZZY_MAP_pre.py시작 규칙종료 규칙 사이에 일련의 표준 규칙을 래핑하여 정의됩니다.

1. 시작 규칙

시작 규칙은 일치할 때 매크로를 트리거하는 표준 규칙입니다. 옵션 사전에 ‘group_start’ 키가 포함되어 있습니다.

('replacement', r'start_pattern', 100, {'group_start': 'unique_group_name'})

2. 내부 규칙

내부 규칙은 시작 규칙 뒤에 순차적으로 배치되는 표준 규칙입니다. 특별한 메타데이터가 필요하지 않습니다.

('inner_replacement', r'inner_pattern', 100, {})

3. 종료 규칙(패시브 마커)

종료 규칙에는 옵션 사전에 None 대체, 빈 패턴 및 'group_end' 키가 있습니다.

(None, r'', 100, {'group_end': 'unique_group_name'})

구체적인 예

다음은 FUZZY_MAP_pre.py 파일에 정의된 실제 테스트 사례입니다.

FUZZY_MAP_pre = [
    # Start Rule: Triggers the group 'sandbox_test' when "start sandbox" matches
    ('Sandbox:', r'start\w* sandbox', 100, {'group_start': 'sandbox_test'}),
    
    # Inner Rule 1: Replaces "apfel" with "birne" if present
    ('birne', r'apfel', 100, {}),
    
    # Inner Rule 2: Replaces "banane" if present, otherwise appends "banane"
    ('banane', r'banane', 100, {}),
    
    # End Rule: Passive boundary marker
    (None, r'', 100, {'group_end': 'sandbox_test'}),
]

실행 흐름 시나리오:

  • 시나리오 A(트리거된 매크로):

  • 입력: "start sandbox mit apfel"

  • 예상 흐름:

  1. 시작 규칙은 "start sandbox"와 일치하여 이를 "Sandbox:" -> 현재 텍스트: "Sandbox: mit apfel"로 대체합니다.

  2. 'sandbox_test' 그룹이 트리거됩니다.

  3. "Sandbox: mit apfel"에서 내부 규칙을 재귀적으로 실행합니다.

  • 내부 규칙 1은 "apfel"과 일치하고 "birne"으로 대체됩니다. -> 현재 텍스트: "Sandbox: mit birne".

  • 내부 규칙 2는 "banane"과 일치하지 않습니다. 그룹이 활성화되어 있으므로 "banane"을 추가하는 것으로 대체됩니다. -> 현재 텍스트: "Sandbox: mit birne banane".

  1. 최종 텍스트 "Sandbox: mit birne banane"가 반환되고 LanguageTool에 의해 수정됩니다.

  • 출력: "샌드박스: mit Birne Banane"

  • 시나리오 B(트리거되지 않은 매크로 - 이중 유용성):

  • 입력: "ein apfel und eine kirsche"

  • 예상 흐름:

  1. 시작 규칙이 일치하지 않습니다. ``sandbox_test’’ 그룹은 비활성 상태로 유지됩니다.

  2. 루프는 다음 규칙으로 진행됩니다.

  3. 내부 규칙 1: "apfel"과 일치하여 "birne"로 대체 -> 현재 텍스트: "ein birne und eine kirsche".

  4. 내부 규칙 2: 일치하지 않습니다. 그룹이 트리거되지 않았으므로 규칙은 일반적인 독립형 규칙으로 작동하며 아무 것도 추가되지 않습니다.

  5. 종료 규칙은 무시됩니다.

  • 출력: "ein birne und eine kirsche"


기술 세부정보(고급설정)

  • 격리된 재귀: 그룹이 트리거되면 엔진은 custom_rules=[inner_rule]을 사용하여 process_text_in_Background를 반복적으로 호출합니다. 이를 통해 각 내부 규칙이 전체 동기 파이프라인 패스 내에서 실행될 수 있습니다.

  • 성능 및 안정성 보호 장치:

  • 시퀀스 우회: 내부 재귀 실행은 교착 상태 및 실행 지연을 방지하기 위해 chunk_id 시퀀스 큐를 우회합니다.

  • I/O 및 TTS 억제: 재귀 실행은 중간 파일 쓰기 및 TTS 음성 출력을 억제하여 최종 안정화된 텍스트만 작성 및 음성화되도록 합니다.

  • 안정성 보호: 재귀 실행은 대체 추가 중에 무한 안정성 루프를 방지하기 위해 한 번의 반복 후에 엄격하게 중단됩니다.

  • 안전한 종료: 안정성 검사는 최대 반복 횟수(MAX_ITERATIONS_FOR_SAFETY)에 엄격하게 의존하여 무한 루프를 방지하고 합법적이고 느린 매크로 실행을 조기에 중단할 수 있는 시간 기반 조절을 우회합니다. CODE_BLOCK_4