Skip to content

Text Operations and Choice Order

kimjooyoon edited this page Oct 8, 2026 · 6 revisions

문자열 함수를 Gooo로 만들고, 후보 순서도 뒤집어 보기

2026-10-08. 문자열 길이와 부분 추출을 추가한 개발 PR #1371의 관측입니다. 전체 CI와 검증 기록을 확인해 dev 463f3f7f에 병합했습니다. main 반영 PR #1372도 CI와 병합 검증을 통과했고, 공개 0.6.8 바이너리에는 아직 이 변경이 들어 있지 않습니다.

Gooo로 작성할 수 있게 된 것

파일 이름이 .gooo로 끝나는지, 숨김 이름인지, 확장자를 떼면 어떤 이름이 남는지를 Gooo 함수로 적었습니다. 접두어·접미어 검사, 접미어 제거, 바이트 길이를 각각 함수로 만들고 Classify가 불러 씁니다. 파일을 직접 읽지는 않습니다.

이전 실행 파일은 같은 접두어 함수를 len 호출에서 거부했습니다. 개발 소스에서는 타입 검사와 변환 전후 비교를 통과합니다. 빈 문자열, 짧은 입력, 한글, 이모지, 잘못된 위치값, 저장 재실행을 확인했습니다. 길이와 위치는 UTF-8 바이트 기준입니다. 예를 들어 가는 3바이트이며, 접두어·접미어 전체의 경계로 잘라 문자가 쪼개지는 것을 피합니다.

소스와 사용법 · Go 길이 규칙 · Go 부분 추출 규칙.

처음 한 번의 결과

세 결과 필드에 각각 두 후보가 있어 조합은 여덟 개입니다. 다섯 조립 사례로 선택하고, 다른 파일 이름 열두 개로 실행 결과를 확인했습니다. 모델은 기존 자체 소형 모델을 그대로 썼습니다.

경로 시도한 후보 조립 사례 / 필드 별도 실행
고정 순서 8 5/5 · 15/15 12/12
모델 순서 1 5/5 · 15/15 12/12
저장한 모델 결과 실행 새 후보 없음 이전 선택 유지 12/12

이 관측의 소스는 334f5ed13bf520c54efe9d8270582dc31433d5f3입니다. 모델 판단은 37.542µs, 준비는 0.670792ms, 텐서는 2,096B였습니다. 전체 명령은 고정 순서 0.35초, 모델 0.33초였습니다. 모델 명령의 CPU 시간은 사용자 0.16초·시스템 0.10초, 최고 RSS는 86,704,128B였습니다. CPU/벽시간은 한 코어 기준 약 78.8%이며 자식 작업을 포함합니다. 호스트 CPU 증가량은 미측정입니다. 캐시와 다른 작업을 통제하지 않은 단일 쌍이므로 속도 우위를 판단할 근거로 쓰지 않습니다. 저장 실행의 새 모델 호출은 0회였습니다.

같은 선택지의 앞뒤만 바꿔 보니

첫 결과에서는 좋은 선택지를 모두 두 번째에 놓았습니다. 각 필드의 앞뒤를 독립적으로 뒤집어 가능한 여덟 배치를 전부 실행했습니다. 함수의 의미, 설명 문장, 조립 사례와 실행 사례는 유지했습니다. 이것은 한 프로그램의 배치 실험 여덟 개입니다.

뒤집은 필드 고정 순서의 시도 수 모델 순서의 시도 수
없음 8 1
소스 여부 7 3
이름 6 2
소스 여부 + 이름 5 5
바이트 길이 4 4
소스 여부 + 바이트 길이 3 7
이름 + 바이트 길이 2 6
모두 1 8
합계 36 36

모델은 모든 배치에서 세 필드의 두 번째 후보를 먼저 골랐습니다. 첫 후보가 맞은 배치는 모델도 고정 순서도 1/8입니다. 모델이 해당 조합에 부여한 값은 99.786~99.797%였지만, 이 수치를 실제 정답 확률로 읽을 수는 없습니다. 이번 예제에서는 후보의 배치에 크게 의존했으며, 여덟 배치를 합치면 탐색량을 줄이지 못했습니다.

Gooo의 사례 평가가 계속 작동해 두 방식 모두 여덟 배치에서 실행 12/12를 얻었습니다. 합계 96/96은 같은 열두 입력을 여덟 배치에서 반복한 수치입니다. 고유 실행 입력은 열두 개이며, 전체 언어나 새로운 문제에 대한 정답률을 뜻하지 않습니다.

배치 실험은 ec801d913206d83e08992710a3834b87ce010b40에서 실행했습니다. 모델 판단 시간은 20.792~47.666µs, 중앙값 22.333µs였습니다. 모델 호출은 배치당 한 번, 실행 시 새 호출은 0회입니다. 새 학습은 하지 않았고, 모델 학습 자료와의 중복 여부는 미확인입니다.

학습 전에 사라지는 구분을 찾았다

후속으로 모델에 들어가는 실제 float32 배열을 비교했습니다. 현재 입력 표현은 suffix && visible과 suffix || visible을 같게 만들고, input과 stem도 같게 만듭니다. 여덟 후보 배치가 전체 배열 두 종류로 줄어들었습니다. 각 배열에는 서로 다른 정답 선택이 필요한 네 배치가 묶입니다.

따라서 제공된 정답을 기준으로 이 입력만 쓰는 결정론적 선택기가 맞힐 수 있는 최대치는 2/8입니다. 기존 모델의 실제 첫 선택은 1/8입니다. 이 최대치는 해당 자료와 현재 특징 추출 버전에 한정됩니다. 같은 프로그램의 여덟 배치를 세었으며, 언어 전체의 정확도나 새 프로그램에 대한 성능을 측정한 값은 아닙니다.

이 검사를 작업장 PR #21의 feature-audit 명령으로 만들고 CI를 통과해 main 13c54fe6에 병합했습니다. Go가 모든 배열 비트를 비교하고, Gooo로 작성한 평가 함수가 preserve-distinguishing-source-facts를 다음 행동으로 반환합니다. 모델을 켜고 끈 실제 실행에서 같은 문제를 찾았고, Gooo 평가 함수의 새 모델 호출은 0회였습니다. 한 행에 여러 정답 후보가 있는 경우도 다룹니다.

고정 소스의 원본 관측·재실행·파일별 해시 에는 입력, 두 실행 결과, Gooo 평가 소스와 생성 코드를 담았습니다. 평가는 공개 0.6.8 컴파일러로 실행했습니다. 추가 학습과 가중치 변경은 없습니다.

출처를 담는 v2 입력도 별도로 확인했습니다. 컴파일러 4eefd6b7에서 같은 파일 이름 예제를 분석하자, 실행용으로는 지원하는 HasSuffix 보조 함수를 출처 그래프가 따라가지 못했습니다. 분석 결과는 UNRESOLVED, 모델 문맥은 DECLINED_TO_DETERMINISTIC이며, 예측과 후보 평가는 각각 0회였습니다. 이 명령은 입력 분석만 수행합니다. 그대로 보관한 출력과 재현 방법.

후속 개발 소스 246fdf5b에서는 이 함수 경계를 연결했습니다. 같은 v2 입력이 네 배열을 만들어 제공된 정답 기준 최대치가 4/8로 바뀌었습니다. 연산자 구분 손실은 남아 있으며 새 모델을 학습한 결과는 아닙니다. 보조 함수 연결과 새 관측.

다음 모델 개선에서 확인할 것

  • Gooo 보조 함수의 인자·반환값과 안정 ID를 출처 그래프에 연결한다. 분석 범위를 넘는 경우는 미해결로 남긴다. 함수 연결만으로 현재의 연산 구분 손실이 해결되는 것은 아니므로 그래프와 모델 특징을 각각 확인한다.
  • 연산자의 종류와 값의 출처를 입력에 보존한다. 현재 입력으로 학습량만 늘려도 특징 추출 단계에서 사라진 구분은 복원되지 않는다. 새 표현도 같은 검사로 확인한다.
  • 좋은 후보가 앞이나 뒤에 놓이는 경우를 함께 학습 자료로 만든다.
  • 같은 원본 프로그램에서 나온 배치들은 같은 데이터 분할에 둔다. 앞뒤만 바꾼 예제가 학습과 평가에 나뉘어 들어가면 새 문제를 푸는 능력을 확인하기 어렵다.
  • 첫 선택과 총 시도 수, 마지막 실행 결과를 따로 본다. 컴파일러가 수정한 결과와 모델의 첫 판단이 각각 얼마나 기여했는지 남긴다.
  • 현재 모델은 필드명·후보 식·설명 문장을 읽는다. 보조 함수 내부의 계산까지 이해했다고 주장할 근거는 부족하다. 함수 내부에서 값이 어디서 왔는지 연결하는 표현이 다음 과제다.

현재까지의 개선은 문자열 기능을 Gooo로 직접 작성할 수 있는 범위가 늘었다는 점입니다. 모델에는 후보 배치에 따른 약점이 남아 있으며, 위 원본과 함께 후속 비교 기준으로 보관합니다.

전체 요약 · 실제 값 재집계 · 재현 도구 · 관측 파일 목록과 해시.

Gooo

배우기

직접 다뤄 보기

원리와 개발

공개 코드와 모델

Clone this wiki locally