Skip to content

umm v0.72.0

Choose a tag to compare

@github-actions github-actions released this 11 Sep 22:58
· 5 commits to main since this release
40f75a2

v0.72.0 — 내 생각을 여는 데 남의 서버를 기다리지 않습니다

"스페이스 로딩이 너무 느려. 메모가 별로 없어도 느려."

재 봤습니다.

임베딩이 사람의 경로 위에 있었습니다

공간을 연다  →  그동안 바뀐 메모를 전부 색인  →  게이트웨이 왕복  →  화면
메모를 쓴다  →  그 자리에서 벡터 생성        →  게이트웨이 왕복  →  저장 완료

ensureEmbeddings호출자는 listNotes 하나뿐이었습니다. 공간을 여는 것이 색인의
계기였습니다. 그리고 UpsertEmbedding 이 메모 생성·수정에서 동기로 불렸습니다.

게이트웨이가 실패하면 더 나빴습니다 — 같은 읽기가 그 공간의 모든 메모를 로컬로 다시
썼습니다.
여전히 사람이 기다리는 채로.

메모 수와 무관합니다. 메모 세 개짜리 공간도 왕복 한 번은 그대로 냅니다.

실측

호출당 2초 걸리는 임베딩 게이트웨이, 메모 3개짜리 공간:

              전        후
쓰기 3 + 읽기 1   6.39s  →  0.18s

고친 것

읽기도 쓰기도 sweep에 알리고 즉시 돌아옵니다. 색인은 5초 주기 배경 작업이 하고, 공간을
열거나 메모를 쓰면 그 공간을 먼저 보라고 알립니다. 알림은 막지 않는 힌트라 버퍼가 차면
그냥 버립니다 — 다음 주기가 어차피 같은 메모를 찾기 때문입니다.

안 바뀐 것: AI 제외

제외된 생각은 별도 묶음으로 넘깁니다. 한 묶음에 섞으면 ensureEmbeddings 가 묶음
전체를 로컬로 떨어뜨려서, 제외되지 않은 남의 생각까지 설정한 모델을 못 쓰게 됩니다.

변형 시험에서 이걸 처음엔 못 잡았습니다 — 두 생각을 각각 다른 sweep에서 색인하면 섞일
일이 없어서, 어느 쪽이든 통과했습니다. 둘 다 색인되지 않은 상태에서 한 번에 돌리는
시험으로 바꾸니 잡힙니다.

임베딩 타임아웃을 채팅과 분리했습니다

둘은 기다리는 대상이 다릅니다. Dream을 쓰는 채팅 모델에는 몇 분을 줘도 되지만, 문장 하나를
임베딩하는 건 네트워크 한 홉 뒤의 1밀리초짜리 일이고, 그걸 기다리는 사람은 검색 중입니다.

하나로 묶여 있어서 채팅에 넉넉히 준 시간이 곧 검색이 기다리는 시간이었습니다.
embedding_timeout_seconds, 기본 10초. 안 정하면 채팅 값으로 떨어지지 않습니다
그러면 분리한 의미가 없습니다.

일하던 공간으로 돌아옵니다

같이 나온 별개 문제입니다.

내비게이션의 My Space/canvas 를 가리키고, 그 주소는 공간을 지정하지 않습니다.
그래서 누를 때마다 이름 알파벳순 첫 공간이 열렸고, 주소도 /canvas 그대로라 그다음
새로 고침이 또 처음부터 판단했습니다.

    ZZZ 공간에서 일하는 중
        → "My Space" 클릭
        → AAA 공간이 열림
        → 주소는 /canvas
        → 새로 고침 → 또 판단
  • 주소가 공간을 가리키면 그게 이깁니다
  • 아니면 마지막에 보던 공간
  • 그것도 없으면 첫 공간
  • 그리고 주소를 항상 고쳐 써서 다음 새로 고침이 다시 판단하지 않게 합니다

못 여는 공간이면 그렇다고 말합니다

주소가 가리키는 공간이 지워졌거나 공유가 회수됐으면, 예전에는 조용히 다른 공간을 보여
주면서 주소는 그대로 뒀습니다
— 주소와 화면이 서로 다른 것을 가리켰습니다. 이제 말합니다.

벡터가 최신이어야 하는 기능들

색인이 비동기가 되자 시험이 잡았습니다 — 방금 쓴 메모에 벡터가 없어서 연결 추천 · 아침
브리핑 · 공간 추천
이 그 메모를 못 봤습니다. 조용히 빠지는 것이라 더 나쁩니다.

그 셋은 이제 스스로 sweep을 한 번 돌리고 시작합니다. 사람이 의도해서 누르는 기능이고,
정상 상태에선 아무것도 못 찾는 질의 한 번입니다.

확인한 것

✓ 느린 게이트웨이(2s)에서 읽기·쓰기 모두 1초 미만
✓ 읽기가 게이트웨이를 한 번도 부르지 않음
✓ sweep이 색인하고, 두 번째 패스는 빈손 (매번 다시 하지 않음)
✓ 고친 메모를 sweep이 다시 집음
✓ 제외된 생각은 게이트웨이에 안 가고, 로컬 벡터는 받음
✓ 제외된 생각이 옆 생각까지 로컬로 끌어내리지 않음
✓ 임베딩 타임아웃이 채팅 값을 따라가지 않고, 미설정 시 10초
✓ 브라우저: 내비 링크가 일하던 공간으로, 주소가 그 공간을 가리킴
✓ 브라우저: 두 번 새로 고쳐도 같은 공간
✓ 브라우저: 못 여는 공간이면 그렇다고 말함
바꾼 것 잡은 것
읽기가 다시 색인 읽기가 게이트웨이를 기다림
쓰기가 다시 동기 색인 쓰기가 게이트웨이를 기다림
sweep이 오래된 것을 못 봄 고친 메모가 영영 안 잡힘
제외된 생각을 한 묶음에 (처음엔 못 잡음 → 시험을 고침)
임베딩 타임아웃이 채팅을 따라감 검색이 채팅 시간만큼 기다림
마지막 공간을 기억 안 함 링크가 엉뚱한 공간을 엶
주소를 안 고쳐 씀 새로 고침이 다시 판단
못 여는 공간을 조용히 교체 주소와 화면이 다른 곳을 가리킴
Suspense를 앱 바깥으로 되돌림 화면 전체가 사라짐
목록을 다시 숫자 줄 안으로 읽는 순서가 엉킴

열 개 전부 검출(하나는 시험을 고친 뒤).

화면이 통째로 사라지지 않습니다

Suspense 가 라우트 트리 바깥에 있었습니다. 그래서 페이지 코드를 불러오는 동안
헤더와 내비게이션까지 언마운트됐습니다 — 화면 전체가 어두워지고 가운데 점이 돌다가,
다시 전부 그려졌습니다. 틀은 바뀐 게 하나도 없는데요.

앱이 재시작하는 것처럼 읽힙니다. 모든 요청이 10ms에 답하는데도 느리게 느껴진
이유였습니다.

안으로 옮겼습니다. 이제 본문 영역만 기다리고, 누르는 순간 내비에서 가려는 곳이 이미
표시
되므로 어디로 가는지 보입니다.

오늘의 리뷰 요약이 엉켜 있었습니다

지난밤 umm이 살펴본 것 의 숫자 블록과 그 아래 목록이 같은 Group 안의 형제였습니다.
Group 은 한 줄에 늘어놓고 감싸므로, 키 큰 목록 옆에 다음 숫자가 밀려 붙습니다.

    전:  1 아직 정리하지 않은   5 답을 못 찾은   [질문 목록...]   1 기록해 둔 상충
                                                                    ↑ 상관없는 목록 오른쪽에 혼자

    후:  1 아직 정리하지 않은   5 답을 못 찾은   1 기록해 둔 상충
         질문으로 표시해 둔 것
         ...

글자는 어느 쪽이나 같아서, 시험은 기하로 확인합니다 — 숫자 라벨들이 같은 세로 띠에
있는지, 목록이 그 전부보다 아래에서 시작하는지.

아직 남은 것

메모가 많아지면 별도로 느려집니다. 카드의 "관련 N" 은 열 때마다 모든 쌍을 비교합니다.

메모 정상 상태
2,000 0.13s
5,000 0.79s
10,000 2.9s (그중 2.81s가 이 계산)

이번 릴리스와는 다른 문제이고, 다음에 따로 갑니다. 조용히 두지 않고 적어 둡니다.


전체 검증: go test -p 1 ./internal/... ./cmd/...(통합 포함) · go vet · gofmt ·
변형 10종 전부 검출 · vitest 158개 · e2e 127개 전부(실제 바이너리·실제 번들) ·
oxlint(종료 코드) · Prettier · tsc · i18n 999키 · OpenAPI 드리프트 · PWA precache

What's Changed

  • Release v0.72.0 stop waiting on the embedding gateway to open a space by @hkjang in #150

Full Changelog: v0.71.7...v0.72.0