Skip to content

[4주차 크루 미션 - 최종 발표 & 회고] ellipsis 미션 제출합니다.#20

Merged
malibinYun merged 187 commits into
woowacourse:committhekermitfrom
CommitTheKermit:ellipsis
Jun 24, 2026
Merged

[4주차 크루 미션 - 최종 발표 & 회고] ellipsis 미션 제출합니다.#20
malibinYun merged 187 commits into
woowacourse:committhekermitfrom
CommitTheKermit:ellipsis

Conversation

@CommitTheKermit

Copy link
Copy Markdown

어느덧 마지막 PR이네요. 고생많으셨습니다~

4주차 보고서(수정)

A. 처음 의도 vs 결과

  • 1주차에 정의한 문제와 4주 후의 문제 (차이가 있다면 이유)
    • 1주차
      • 플러피, 1주차에 정의한 문제 → 사람들은 SNS에 부담감을 느낀다?
      • 키버디, 1주차에 정의한 문제 → 키보드를 찾는데 사용자들이 불편함을 느낀다.
    • 4주차
      • 키버디, 4주 후의 문제(해결 대상) → 키보드를 구매하려고 할 때 알아야 할 정보가 너무 많고 여기저기 흩어져 있어, 원하는 키보드를 찾는 과정이 복잡하다.
      • 키버디, 4주 후의 문제(열린 의문) → 그렇다면 자연어 입력이 그 복잡함을 줄여주는, 사용자에게 편한 방법일까?
    • 이유
      • 처음에는 문제 정의를 너무 가볍게 생각했다. 인터뷰 결과 우리가 세운 가설은 깨졌으며, 우리가 생각한 문제는 사용자들이 문제라고 인식하지 않았다. 그래서 아이디어를 피봇하였다.
      • 사용자들은 본인이 원하는 키보드를 찾는데 불편함을 겪었고 우리가 세운 가설과 문제를 지지받을 수 있었다.
      • 그러나, 과연 키보드를 찾는데 불편함을 느끼는 사용자들이 내가 원하는 키보드를 설명하는 자연어를 입력하는 게 쉬울까? 하는 의문이 들었고 실제로 피드백 사항 중에 있었다.
      • 다만 우리는 미리 제시된 키보드 조건들을 선택지로 제공하여 자연어 입력에 대한 불편함을 줄이려고 하였다.
  • 1주차 MVP 범위와 실제 만든 것 (차이가 있다면 이유)
    • 1주차 MVP 범위(사실2주차)
      • 자연어 설명
      • 선택지 제공
      • 추천 결과 페이지
    • 실제 만든 것
      • 자연어 설명
      • 선택지 제공
        • 선택지에 있는 키워드들이 어렵다는 피드백이 많아서, 선택지가 뭘 의미하는 지, 어떠한 특징을 가지고 있는지를 영상, 인포그래픽으로 제공하여 사용자의 이해를 높이고자 하였습니다.
      • 추천 결과 페이지
        • 쉬운 용어 풀이 키워드

          • 전문적인 용어가 키워드화 되어 각 키보드마다 태그 형식으로 달려있지만 이러한 용어를 좀 더 쉽게 풀이해둠

          “내가 이 서비스를 이용해서 키보드를 추천받고 구매하여 막상 받아보았을 때 내가 생각하던 키보드가 아닐 경우 서비스에 대한 신뢰도와 이용률이 적어질 것”이라는 피드백을 반영하여 좀 더 쉬운 말로 용어 키워드를 풀이하여 설명하도록 함

        • 각 키보드별 주의할 사항

          • 각 추천 결과 키보드마다 확인할 점을 제공해주어 구매하기 전에 좀 더 실패할 확률을 줄여주고 사용자가 쉽게 놓칠만한 주의사항들을 알 수 있도록 한 번 더 필터링 해준다

          “내가 이 서비스를 이용해서 키보드를 추천받고 구매하여 막상 받아보았을 때 내가 생각하던 키보드가 아닐 경우 서비스에 대한 신뢰도와 이용률이 적어질 것”이라는 피드백을 반영하여 키보드를 구매하기 전 쉽게 놓칠만한 주의사항들을 포함시킴

        • 접점 방식, 스위치 설계에 따른 키감, 소음 레벨미터

          초기엔 태그 chip을 통한 단어 중심 정보로 제작하려 했으나, 두 값 모두 “강도”와 관련된 필드여서 단어만으로 사용자가 어떤 느낌인지 파악하는데 한계가 있을 것이라고 판단해 레벨미터를 사용해 조금 더 시각적인 정보를 제공하고자 구현 방향을 변경함

        • 해당 키보드의 유튜브 영상 링크

          • Youtube Data API v3 콜을 통해 영상 링크 수집

          타건음을 태그 chip을 사용해 의서어로 제공하려 했으나, 소리의 경우 사람마다 다르게 받아들일 수 있겠다고 판단해 억지로 의성어를 제공하는 것 보단 동영상을 통해 사용자가 직접 판단하는 것이 더 좋겠다고 판단해 의성어 chip을 제거하고 영상 링크를 제공

      • 구매 링크 & 사용자 피드백
        • 사용자가 우리가 제공하는 추천결과를 실제로 마음에 들어하는지를 정량적으로 분석하기 어려워서, 구매 링크와 사용자 피드백을 통하여 검증기준으로 추가하려고 하였습니다.
  • 1주차에 고른 기술, 다시 한다면 같은 선택일지
    • 제미나이 캔버스
      • 종합 결론: 제미나이 캔버스는 최소한의 디자인·인터랙션을 갖춘 프로토타입을 빠르게 만들고 링크만으로 공유할 수 있다는 장점이 있어, “빠른 프로토타이핑” 관점만 보면 다시 선택할 여지도 있는 기술입니다.
      • 다만 이후 기능이 추가·확장되면서 많은 UI를 덧붙여야 했고, 그 과정에서 클로드 디자인이나 Pencil 같은 도구를 더 많이 활용했습니다. 어차피 Pencil로 UI를 다시 그릴 거라면 제미나이 캔버스 결과물을 포팅할 필요 없이 처음부터 Pencil로 시작하는 편이 낫다고 판단했습니다.
      • 따라서 “다시 한다면 제미나이 캔버스는 쓰지 않고 처음부터 Pencil로 UI를 만들고 진행”하는 쪽으로 의견을 모았습니다.
    • React + React DOM
      • 제미나이 캔버스 결과가 React + Tailwind + lucide-react로 만든 UI 프로토타입으로 구성되었습니다. 이 구조를 가장 잘 흡수할 수 있는 Vite + React + TS + Tailwind 구조로 구현하였습니다.
    • 파이어베이스
      • 서버 운영 부담을 최소화하기 위해서 사용하려 하였습니다.
    • 수파베이스
      • 파이어베이스와 제공하는 기능이 크게 다르지 않고, 서버 운영 비용을 최소화할 수 있어 선택하였습니다.
  • 고려했다 안 쓴 선택지와 뺀 이유
    • 엑셀
      • MVP 제작 시 사용자가 Excel 프로그램을 보유해야 하고, 구글 스프레드시트는 작동이 부드럽지 않아 제외 (MVP 플랫폼 후보)
    • 제미나이 캔버스(플랫폼/지속 사용 관점)
      • 코드 베이스를 가진 계정에서만 작업해야 해 팀원 기능 분담이 어렵고, 컨텍스트 확장 한계가 있어 프로토타입 코드만 추출한 뒤 지속 사용은 중단
    • 파이어베이스 사용 → 수파베이스 사용
      • 파이어베이스에서는 Blaze 요금제로 바꿨을 때 서버 운영 비용이 발생하나, 수파베이스에서는 서버 운영 비용이 발생하지 않아 서버 운영 비용을 최소화할 수 있어 변경하였습니다.
    • 공통 하네싱
      • 코드 컨벤션, 깃 컨벤션, PR 포맷 컨벤션, 브랜치 컨벤션 등등 공통으로 작업할 내용에 하네싱이 필요했는데 이 부분에서 놓친 점이 많아, 사람과 AI에 불필요한 혼동을 줬다고 생각합니다.

B. 가설 검증 종합

  • 4주간 세운 가설과 결과 (지지 / 반박 / 불명확)
    • 플러피
      • 상대 상태가 궁금하지만 메시지 보내기가 부담돼 확인을 포기한 경험이 있다 → 반박
      • 공개 범위 때문에 게시를 망설이거나 줄인 경험이 있다 → 불명확
    • 키버디 (정성 요약)
      • 사용자는 키보드 구매 과정에서 높은 진입장벽과 선택 피로를 느낀다. → 지지
      • 키보드는 ‘선택형 취향 제품’으로 인식된다. → 지지이나, 너무 당연한 가설
      • 사용자는 ‘간단한 선택 → 맞춤 추천’ 형태의 가이드를 원한다. → 지지이나, 너무 당연한 가설
    • 키버디 (인터뷰 정량 결과, 29명 기준)
      1. 노트북에 별도의 키보드를 연결하여 사용하고 있다. → 부분 지지 (59%, 17/29명 “네”)
      2. 키보드는 더 이상 필수 입력장치가 아닌, 필요에 따라 구매하는 선택형 제품이라고 인식한다. → 강력 지지 (83%, 24/29명 “네”)
      3. 키보드 구매 시 입력이라는 목적성보다 취향을 따진다. → 강력 지지 (90%, 26/29명 “네”)
      4. 다양한 옵션으로 인해 부담을 느낀다. → 지지 (69%, 20/29명 “어렵다 / 너무 어렵다”)
      5. 키보드 선택 과정에서 정보 탐색(검색·리뷰·유튜브)에 많은 시간을 소비한다. → 지지 (66%, 19/29명 “오래 걸렸어요”)
      6. 자신의 사용 환경(사무실·집·게임 등)에 맞는 키보드를 명확히 추천받고 싶어 한다. → 강력 지지 (86%, 25/29명 “네”)
      7. 구매 과정이 복잡하여 추천 서비스 또는 가이드의 필요성을 느낀다. → 지지 (72%, 21/29명 “네”)
  • 가장 크게 깨진 가설 1개와 받아들인 방식
    • 플러피에서 다뤘던 가설들이 많이 깨졌습니다.
      • 상대 상태가 궁금하지만 메시지 보내기가 부담돼 확인을 포기한 경험이 있다.
      • 위 가설이 저희는 문제라고 생각했는데, 상태가 궁금할 정도의 관계라면 메세지 보내는게 그렇게 부담스럽지 않다고 답변하신 의견들이 많았습니다.
      • 사용자들이 실제로 문제라고 생각하지도 않는 부분을 해결할 필요가 있을까라는 의문이 들어 아이디어를 피봇하였습니다.
  • 중간 공유에서 검증하기로 한 다음 1가지와 그 결과
    • 다음 과제: “추천 결과의 품질 고도화”
    • 초기 추천은 사용자의 자연어 입력과 키보드 DB를 그대로 LLM에 전달해 결과를 받는 구조라, 사용자의 조건이 안정적으로 반영되지 않았습니다. (예: 조용한 키보드 요청에 시끄러운 축 추천, RGB 불필요에 RGB 백라이트 키보드 추천)
    • 개선: 자연어를 바로 추천에 연결하지 않고, 먼저 LLM으로 사용자 의도를 태그로 추출한 뒤 그 태그로 키보드 DB를 검색하도록 변경. (예: “사무실에서 쓸 조용한 키보드” → ‘사무용’,’조용함’ 태그 / “백라이트는 없어도 된다” → ‘백라이트 없음’ 하드 제약)
    • 결과: 추천이 이전보다 의도에 맞게 개선됨. 다만 정성적 판단에 가까워, 추천 정확도를 수치화하기 위해 “Rubric” 방식으로 정량 검증을 추가로 진행.
  • 끝까지 검증 못 한 가설이 있다면 그 사실 그대로
    • 자연어 입력이 사용자에게 편한 방법일까?
    • 자연어 입력을 통하여 정말로 사용자의 취향을 반영한 키보드가 추천될까?

CommitTheKermit and others added 30 commits May 28, 2026 17:29
다나와 크롤러 데이터 기반 키보드 추천 웹앱(Vite+React+TS) 이관.
node_modules/dist/.env.local 등 빌드 산출물과 실제 키 파일은 제외하고
.env.local.example만 포함. README 경로를 impl 기준으로 갱신.
추천 정확도 저하(제약 무시·의도 빗나감)를 고치기 위한 태그 파이프라인 전환 요구사항을 Seed로 명세.
LLM은 태그 추출만, 검색/스코어링/결과는 빌드 시 1회 생성한 정적 규칙표로 결정론 처리.
하드 제약 위반 0건 단위테스트 + 의도 골드셋으로 검증. (ooo interview/seed, fallback QA 0.92)
- tagSchema.ts: HARD_NUMERIC_KEYS, HARD_ENUM_KEYS, HARD_CONSTRAINT_KEYS, HARD_CONSTRAINT_ENUMS, SOFT_INTENT_VOCAB 상수 정의 및 export
- isSoftIntentTag / isHardConstraintKey / isValidHardEnumValue 런타임 검증 헬퍼 포함
- tagSchema.test.ts: 28개 단위 테스트 (키 목록, 열거형 값, 중복 없음, 헬퍼 동작 검증)
- vitest devDependency 추가, npm test 스크립트 설정
스키마 상수 기반으로 임의 객체의 태그 스키마 준수 여부를 검증하는 validateTagSchema 함수 구현.
- 최상위 알 수 없는 키, hardConstraints 미지원 키, 열거형 허용 외 값, 숫자 키 타입 오류, softIntentTags 어휘 외 값 감지
- 복수 오류 한 번에 수집하는 방식으로 구현
- 유효/무효 케이스 총 20개 단위 테스트 추가 (전체 47개 통과)
자유형 자연어를 LLM에 전달해 hardConstraints + softIntentTags 구조의
ExtractedTags를 반환하는 extractRawTags() 함수를 구현한다.

- extractRawTags.ts: AnthropicClient 주입 구조로 테스트 격리 지원,
  스키마 밖 키/값은 parseAndSanitize에서 폐기, 비정상 JSON 안전 처리
- extractRawTags.test.ts: LLM 호출을 _setClientForTest로 모킹,
  hardConstraints/softIntentTags 키 존재 확인, 스키마 외 값 폐기 등 19개 테스트
extractRawTags의 출력(unknown)을 받아 스키마 밖 키/값을 제거하고
정제된 ExtractedTags를 반환하는 sanitizeTags(raw: unknown) 구현.

- 최상위 hardConstraints/softIntentTags 외 키 무시
- HARD_CONSTRAINT_KEYS 밖 hardConstraints 키 제거
- 열거형 키의 HARD_CONSTRAINT_ENUMS 밖 값 제거
- 숫자 키에 number 외 타입 값 제거
- SOFT_INTENT_VOCAB 밖 softIntentTags 항목 제거
- 비정상 입력(null/배열/문자열) 안전 처리
- 알 수 없는 키 제거 / 잘못된 열거형 폐기 / 유효한 값 보존 검증 27개 테스트 추가 (전체 93개 통과)
- extractRawTags -> sanitizeTags -> validateTagSchema 순서 파이프라인을 실행하는
  extractAndValidateTags(input: string) 함수를 extractRawTags.ts에 추가
- validateTagSchema 실패 시 오류를 throw하도록 구현
- sanitizeTags가 스키마 밖 값을 폐기하므로 정상 조건에서 항상 유효한 출력 보장
- extractRawTags.ts의 tagSchema 임포트에 validateTagSchema 추가
- extractAndValidateTags.test.ts: LLM 모킹으로 23개 통합 단위 테스트 추가
  (정상 응답, 스키마 밖 값 폐기 후 통과, 비정상 JSON 안전 처리, 출력 구조 보장)
- src/lib/hardFilter.ts: 레이아웃 하드 제약 위반 판정 함수 구현
  - layoutTag 없음(빈 문자열) -> false(제약 없음)
  - keyboard.layout과 layoutTag 일치 -> false(통과)
  - 불일치 -> true(위반)
- src/__tests__/hardFilter.test.ts: 17개 단위테스트
  - 6개 레이아웃 값 일치 케이스(false)
  - 8개 불일치 케이스(true)
  - 3개 제약 없음 케이스(false)
- 전체 테스트: 133개 통과 (기존 116개 + 신규 17개)
- softTagRules.ts: SOFT_INTENT_VOCAB 24개 태그 전체를 커버하는 정적 규칙표 생성
  - 태그별 AttributePredicate(field/op/value) 술어 매핑
  - checkRuleTableCompleteness 함수 구현
- softTagRules.test.ts: 19개 단위 테스트 추가
  - 정적 규칙표 구조 무결성 검사 (7개)
  - 현재 규칙표 완전성 검증 - 누락 0건 확인 (2개)
  - 누락 태그 감지 시나리오 (6개): 빈 규칙표/특정 태그 누락/predicates 빈 배열
  - 경계 케이스 (3개): 빈 vocab/중복 엔트리/순서 보장

전체 152개 테스트 통과 (기존 133개 + 신규 19개)
hardFilter.ts에 checkSwitchViolation(keyboard, switchTag) 함수 추가.
일치->false, 불일치->true, 빈 문자열->false(제약 없음) 케이스 18개 테스트.
guidedInputMapper 모듈을 추가하고 단위 테스트 51개 작성.
LLM 호출 없이 결정론적으로 동작하는 순수 함수로 구현:
- mapBudgetToConstraints: 예산 범위 -> price_min/price_max
- mapConnectionToConstraints: 연결방식 선택지 -> connection/wireless_type
- mapLayoutToConstraints: 크기 선택지 -> layout (매핑 불가 선택지는 하드 제약 미생성)
- mapEngravingToConstraints: 각인 선택지 -> engraving
- mapBacklightToConstraints: 백라이트 선택지 -> backlight
- mapKeyFeelToConstraints: 키감 선택지 -> switch_type
- guidedAnswersToHardConstraints: 전체 answers+budget 통합 변환
전체 테스트 221개 통과
폼팩터 하드 제약 위반 판정 함수(checkFormFactorViolation)를
hardFilter.ts에 추가하고, 19개 단위테스트를 작성했다.
- 일치 시 false(6케이스), 불일치 시 true(9케이스), 태그없음 시 false(4케이스)
- 전체 테스트 240개 통과 (기존 221개 + 신규 19개)
Sub-AC 3-2-a: extractDatasetSchema(keyboards) 함수 추가
- Keyboard[] 입력 -> Record<속성명, Set<값>> 반환
- getFieldValues / hasField / hasValue 헬퍼 함수 포함
- 단위 테스트 39개 작성 (빈 배열, 속성명 목록, 값 추출, 중복 제거, 실제 샘플 검증 등)
- 전체 279개 테스트 통과
- hardFilter.ts에 checkBudgetViolation(keyboard, budgetTag) 추가
  - budgetTag <= 0: 제약 없음으로 간주하여 false 반환
  - keyboard.price > budgetTag: 위반(true)
  - keyboard.price <= budgetTag: 통과(false), 경계값 포함
- hardFilter.test.ts에 13개 테스트 케이스 추가
  - 가격 < 상한, 가격 = 상한(경계값), 가격 > 상한, budgetTag <= 0 시나리오 포함
- 전체 292개 테스트 통과
- datasetSchema.ts에 findInvalidFieldNames 함수 추가
  - 규칙표 술어의 모든 field 이름 수집 후 스키마 맵과 대조
  - 스키마에 없는(무효) 속성명을 중복 없이 반환
  - PredicateRuleEntry 제네릭 인터페이스로 순환 의존 없이 SoftTagRuleEntry 호환
- datasetSchema.test.ts에 findInvalidFieldNames 단위 테스트 9건 추가
  - 모두 유효: 빈 배열 반환 검증
  - 모두 무효: 전체 반환 검증
  - 유효/무효 혼재: 무효 속성명만 정확히 탐지
  - 중복 field: Set 기반 중복 제거 보장
  - 빈 규칙표/빈 스키마 경계 케이스 처리
- 전체 테스트 301개 통과 (기존 292개 + 신규 9개)
- guidedInputMapper에 소프트 태그 전용 상수 추가 (PURPOSE_OPTIONS, PORTABILITY_OPTIONS, SOUND_OPTIONS, KEY_FORCE_OPTIONS)
- 소프트 전용 단계 매핑 함수: mapPurposeToSoftTags, mapPortabilityToSoftTags, mapSoundToSoftTags, mapKeyForceToSoftTags
- 하드 제약 단계의 소프트 태그 보완 함수: mapKeyFeelToSoftTags, mapLayoutToSoftTags, mapConnectionToSoftTags, mapBacklightToSoftTags, mapEngravingToSoftTags
- guidedAnswersToSoftTags 통합 함수 (중복 제거 포함)
- guidedSoftTagMapper.test.ts: 소프트 태그 매핑 단위 테스트 75개 추가
- 모든 매핑 함수는 LLM 호출 없는 동기 순수 함수, 전체 376개 테스트 통과
- HardTag 타입 정의: type(판별자) + value(제약값) 구조
- checkHardConstraintViolation 함수 구현:
  - 'layout' -> checkLayoutViolation (Sub-AC 4-1-1)
  - 'switch_type' -> checkSwitchViolation (Sub-AC 4-1-2)
  - 'form_factor' -> checkFormFactorViolation (Sub-AC 4-1-3)
  - 'price_max' -> checkBudgetViolation (Sub-AC 4-1-4)
  - 알 수 없는 유형 -> false (안전한 기본값)
- 디스패처 단위테스트 추가 (6개 describe, 30개 케이스):
  라우팅 정확성, 직접 호출과의 결과 동일성, 알 수 없는 유형, 복합 시나리오
- datasetSchema.ts에 findRulesWithInvalidValues 함수 추가
  - 속성명이 스키마에 존재하는 경우에 한해 허용 값 집합 밖 값을 참조하는 규칙 반환
  - eq 술어: 스키마 값 집합에 정확히 포함되는지 검사
  - contains 술어: 스키마 값 중 하나라도 부분 문자열로 포함하는지 검사
  - lte/gte 술어: 수치 비교 임계값이므로 검사 대상에서 제외
  - 속성명이 스키마에 없으면 해당 술어는 검사 범위 아님(findInvalidFieldNames 담당)
- PredicateWithValue, RuleEntryWithValues 제네릭 인터페이스 추가
- datasetSchema.test.ts에 19개 단위 테스트 추가 (총 421개 통과)
keyboards 배열과 hardTags 배열을 받아 모든 하드 제약을 만족하는
키보드만 반환하는 filterByHardConstraints 함수 구현 (Sub-AC 4-2).

- hardFilter.ts: filterByHardConstraints 추가 (checkHardConstraintViolation 기반)
- hardFilter.test.ts: filterByHardConstraints 단위테스트 5개 describe 블록 추가
  - 빈 태그 배열 / layout 단일 / price_max 단일 / 복합(layout+price+switch) / violations===0 보장
- 전체 테스트 434개 통과 (기존 401개 + 신규 33개)
- TagSet 인터페이스 추가 (hard: HardConstraints, soft: SoftIntentTag[])
- dispatchStepToTagSet(stepIndex, value): 0-9 단계 번호와 선택값을 받아
  하드/소프트 매핑 함수에 라우팅하고 TagSet 반환
- STEP_ID_TO_INDEX 테이블 및 dispatchStepIdToTagSet 헬퍼 추가
- 예산 단계(7)는 { min, max } range 입력, 나머지 string 입력 처리
- 타입 불일치/알 수 없는 단계 -> { hard: {}, soft: [] } 안전 반환
- LLM 호출 없이 결정론적 동작
- 10단계 전체 시나리오 단위 테스트 (stepDispatcher.test.ts) 추가
- 전체 511개 테스트 통과
하드 제약 필드 누락/타입 오류/소프트 의도 필드 누락 케이스를 명시적으로 커버
- hardConstraints: null, [], string 타입 오류 검증
- price_min 숫자/문자열 검증
- softIntentTags: null, 숫자 요소, null 요소 검증
- 각 필드 누락 시 상대 필드 오류 미발생 확인

tagSchema.test.ts: 47 -> 57개 테스트 (전체 521개 통과)
… 테스트 작성

- guidedInputMapper에 selectionOptionConverter 함수 추가
  - guidedAnswersToHardConstraints + guidedAnswersToSoftTags를 ExtractedTags 인터페이스로 통합
  - 자유형 자연어 경로(extractRawTags)와 동일한 { hardConstraints, softIntentTags } 반환
  - LLM 호출 없이 결정론적으로 동작

- selectionOptionConverter.test.ts 신규 작성 (Sub-AC 2-2b)
  - 출력 구조 보장: hardConstraints(객체) + softIntentTags(배열) 항상 존재
  - validateTagSchema 통과 검증: 빈/부분/전체 입력 + 대표 시나리오 8개
  - 하드 제약 단계 단일 입력 15케이스 스키마 통과 확인
  - 소프트 전용 단계 7케이스 스키마 통과 확인
  - 예산 입력 4케이스 스키마 통과 확인
  - softIntentTags 항목이 모두 SOFT_INTENT_VOCAB에 속함 검증
  - 결정론성: 동일 입력 -> 항상 동일 출력
  - LLM 호출 없는 동기 순수 함수 확인

전체 583개 테스트 통과
선택 변환 태그(selectionOptionConverter)와 자유형 태그(sanitizeTags 시뮬레이션)가
동일한 하드 제약을 표현할 때 filterByHardConstraints 결과가 일치함을 검증하는
24개의 단위 테스트를 작성한다.

- layout(텐키리스/미니/풀배열) 단일 제약 동일성 검증
- switch_type(기계식/무접점) 단일 제약 동일성 검증
- price_max 단일 제약 동일성 검증
- 복합 제약(layout + switch_type + price_max) 동일성 검증
- 빈 제약, 불가능한 제약(결과 0건) 경우 검증
- 소프트태그 차이가 하드 필터 결과에 영향 없음 검증
- 1800배열 선택 시 layout 하드 제약 없음 동일성 검증
- 8개 시나리오 테이블 기반 통합 검증
- hardConstraintsToHardTags 변환 헬퍼를 테스트 내부에 정의
- 모든 결과에서 violations === 0 단언 포함
- softScorer.ts: SOFT_TAG_RULE_TABLE 기반 결정론 스코어링 함수 구현
  - evaluatePredicate: 속성 술어 평가 (eq/contains/lte/gte)
  - scoreBySoftTags: 키보드별 점수 벡터 산출 (LLM 없이 순수 함수)
  - deriveRankOrder: 점수 벡터 -> 순위 배열 변환

- softScoreParity.test.ts: 40개 단위 테스트 추가
  - 선택 경로(guidedAnswersToSoftTags) 소프트태그와
    자유형 경로(sanitizeTags 시뮬레이션) 소프트태그를
    scoreBySoftTags에 전달했을 때 스코어 벡터가 일치하는지 검증
  - 7개 의도 시나리오: 사무용+조용함, 게이밍+RGB, 무선+미니+휴대성,
    기계식+타건감+경쾌함, 무접점+조용함, 가성비+풀배열, 복합 전체 단계
  - 결정론성, 태그 순서 무관 점수 동일, 순위 배열 일치 검증
  - 전체 647개 테스트 통과
chohs4164 and others added 25 commits June 17, 2026 16:10
코드 리뷰(PR #21) 피드백 반영.

- recommend.ts: 클라이언트 sanitizeExtraction의 hardConstraints가 단순 캐스트라
  키별 타입·값 검증이 빠져 2중 방어가 무력했다. extractRawTags의 sanitizeTags를
  재사용해 숫자/열거형 검증을 거치도록 수정(softIntentTags도 함께).
- index.ts(Edge Function): parseExtractJson이 JSON.parse SyntaxError를 던져 500으로
  떨어지던 문제를 null 폴백으로 변경 → sanitizeExtraction이 빈 추출로 graceful degrade.
- index.ts: 추출 프롬프트에서 사용자 쿼리의 큰따옴표를 이스케이프해 프롬프트 구조
  파손 가능성 제거.
- 테스트 규약: guided 경로 LLM 미호출 불변식을 recommendLlmNoCall.test.ts로 분리
  (*LlmNoCall.test.ts 규약 준수). recommendTop3는 포인터 주석만 남김.
- vocabularyParity.test.ts 추가: Edge Function vocabulary.ts 사본과 프론트
  tagSchema/intentProfile 어휘 드리프트를 CI에서 감지.
- AGENTS.md: 결정론 하네스 UI 배선 반영. 현행 프로덕션 경로(Edge Function
  OpenAI 태그추출 + 클라 결정론 검색)와 레거시(Edge Function 전체 추천 생성,
  클라 claude 추출)를 구분하도록 아키텍처 섹션 갱신.
feat(keybuddy): 결정론 의도 하네스 UI 연결 및 추천 점수순 상위 3개 제한
추천 가설 검증용 데이터를 모으기 위해 두 가지 사용자 행동을 Supabase에 적재한다(실결제 없음).

- events 테이블 마이그레이션: 단일 events(id, event_type, session_id, payload jsonb, created_at) + anon insert-only RLS
- lib/session.ts: 로그인 없는 익명 세션 UUID(localStorage)
- lib/events.ts: purchase_click('구매하기' 클릭, payload product_code)·rating(추천 전체 별점) 이벤트를 PostgREST /rest/v1/events로 직접 insert. best-effort라 실패는 삼켜 UX를 막지 않음
- App.tsx: 구매하기 버튼·별점 클릭에 계측 연결(토스트/링크 동작은 그대로)
- events.test.ts: payload 형태·PostgREST 요청/실패 동작 단위검증(9 케이스)
- 문서: AGENTS.md 이벤트 수집 경로·스위트 수, README 마이그레이션 적용·수동 확인 절차
YouTube 타건 영상 링크 수집 기능 추가
feat(switch_catalog): 키보드 스위치 데이터 추가
fix: 비기계식 키보드 레벨미터 고정
…ction

feat(keybuddy): 구매 클릭·추천 별점 Supabase 이벤트 수집
Co-authored-by: first-woosun <dbdntjs620@gmail.com>
PR #20 충돌 해소. committhekermit(3주차 제출 스냅샷)은 ellipsis의 옛 버전이라
가져올 고유 변경이 없어 결과 트리를 ellipsis 최신본 그대로 유지한다(-s ours).
@CommitTheKermit

Copy link
Copy Markdown
Author

Keep

  • 자연어 태그 추출
  • 에이전트 코딩 - knowledge-loop, 지식 저장소
  • AI 협업 의사 결정
  • CLAUDE.md 심볼릭 링크, 하나의 프로젝트 메모리 파일 들고가기
  • 주제 선정과정에서 잘못되었다고 생각이 들 때 주제를 피봇한 것
    • 실수 내지 잘못을 인정하고 돌아보며 어떻게할지 생각해본 시간이라고 느껴져 뜻 깊었다 생각함
    • 주제를 변경하게 되면 시간도 부족하고 그 만큼 힘들것이 예상되는 상황에서도 팀원 모두가 더 좋은 결과를 위해 노력해주었다는 점이 좋았다고 생각함
  • 각자 해야할 일을 목록화
    • 각자가 달성해야할 목표를 글로 작성해 목록화 해놓아 어떤 작업을 해야할지 빠르게 결정할 수 있었음
  • 우리가 서로 기획을 진행해나가면서 각자의 생각이 다를 수 있는데 이를 대면 회의를 통해서 지속적으로 소통하고 하나의 의견으로 취합해나가고자 한 점이 참 좋았었던 것 같습니다.
  • 서로의 의견이 때에도 부담없는 분위기를 만들어주어서 자신의 의견과 그 근거를 들어서 다름 사람을 설득할 수 있는 시간이 되어 좋았습니다.
  • 초반에 워크스페이스를 잘 횔용하여 회의 내용, 기획, 아이디어 등을 잘 취합하고 정리해나서 좋았습니다

Problem

  • 문제 끼워 맞추기
  • 외부 자료 의존 → 다나와
  • 외부 서비스 의존 → LLM 의존
  • 깃 컨벤션 전략
  • 공통 하네싱
  • 토큰 과다 사용
  • 자명한 가설
  • 결정이 느리다
    • 항상 의사결정을 수립해야 함
  • 구현 방향 결정이 느리다
  • AI 의존적인것 같다, 보고서든, PPT든, PR이든 거의 다 사람이 안 읽고 진행하지 않나,
  • 주도적으로 진행했나?
    • 내가 의견을 낸 주제로 진행하게 되었음에도 그만큼의 책임감과 확신을 갖고 임했는가?
    • 솔직히 말하면 조장(아오)에게 의지한 면이 많다고 생각함 (의사결정, 구현 등등…)
    • 내가 낸 주제라 구현 방향에 대해 내가 더 적극적으로 고민하고 실험해 봤어야 했던 것 같다
    • 내가 모르는데 남들은 이 주제에 대해 어떻게 알고 뭐가 있으면 좋을지를 아는가…
  • 인정 중독
    • 내 결정에 내 스스로가 확신을 갖지 못해 작업을 진행할 때 “이거다.”보다 “이러면 어떨까요?”가 많았다.
  • 결정이 느리다
  • 문서화의 부재
    • 제출용 자료와 그와 관련된 산출물들은 문서화가 되어 있지만 이 것들이 만들어지는 과정에 대한 문서가 단 하나도 없다고 생각함
    • 결과도 중요하지만 그 과정에서 발생한 내 생각과 고민, 결정들을 문서화 하는 연습이 필요해보임
  • 서로 다른 ai를 사용하여 개발을 진행하다보니 이에 대한 통합된 하네싱이 있었다면 좀 더 규칙 반경 안에서 개발을 잘 방향대로 진행해나갔다면 좋겠습니다.
  • 워크스페이스 할당량 만료로 인해서 추가적인 개발 문서 통합이 원활히 진행되지 못해서 아쉬움이 남습니다.
  • Github의 Issue를 통해서 좀 더 개발 현황에 대한 보고의 동기화가 잘 이루어졌었다면 좀 더 좋지 않았을까 합니다.
  • 문서화의 부재 → 노션 워크스페이스에서 벗어나기
  • 체계적인 회의+개발 사이클이 부족했다
    • 회의 → 2~3일 개발 → 회의,,, 데일리미팅을 통해 어제 뭘 개발했는지,
  • 깃 컨벤션, 공통 하네싱(오케스트레이션)의 공통적인 이해가 부족했다

TRY

  • 외부 자료/LLM 콜 의존하지 않는 서비스 만들기
  • 공통 하네싱 정하고 작업하기
  • 공통 워크스페이스 오픈소스 앱 이용해보기 AppFlowy
  • 의사결정을 할 때 조금 더 체계적으로 하기
    • 여러가지 선택지 중 어떤 선택지가 더 좋을지 고민해보고 더 자세히 알아보고 여러 실험을 계획해 실제로 선택지들이 갖는 장단점이 어떤 것들이 있는지 가늠해 근거있는 선택을 할 수 있게 되고 싶다.
    • 근거가 있는 선택이라면 남들에게 이건 어떤지 물어보면서 “인정”을 요구하지 않아도 자신있게 구현해갈 수 있을 것 같음
    • 체계적인 의사 결정이라면 의사 결정을 위한 체계를 정의해야할 것
    • 어떤 체계를 설계하고 사용할지 고민해보는 것이 앞으로의 과제일 것 같음
  • 결과 뿐만 아니라 과정도 문서화하기
    • 회의, 작업 등등을 진행하면서 그 때 그 때 내 생각, 고민, 결정, 근거 등을 문서화한다.
    • 노션을 사용할 생각
    • Mind Note??
  • 좀 더 체계적인 데이터베이스 생성
  • issue 적극 사용
  • 브레인 스토밍을 진행했던 순간들도 기록하기
  • 녹음을 통한 모든 순간순간 기록
  • 저한테 좀 더 확신 있는 근거를 가지고 주장할 수 있는 지식이 있으면 좋겠습니다.

팀이 다음에 가져갈 1가지

  1. 공통 워크스페이스를 통한 문서화

@malibinYun malibinYun left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

최종 발표까지 정말 고생 많으셨어요.
제가 알림이 안와서 너무 늦게 봐버렸네요.. 죄송해요.
더 이야기 나누고 싶은 게 있거나, 제 의견이 더 궁금한 점들이 있다면 코멘트로 남겨주세요.
슬랙 방에다 말씀해주셔도 좋아요.

Comment thread report/week4.md
Comment on lines +13 to +14
- 처음에는 문제 정의를 너무 가볍게 생각했다. 인터뷰 결과 우리가 세운 가설은 깨졌으며, 우리가 생각한 문제는 사용자들이 문제라고 인식하지 않았다. 그래서 아이디어를 피봇하였다.
- 사용자들은 본인이 원하는 키보드를 찾는데 불편함을 겪었고 우리가 세운 가설과 문제를 지지받을 수 있었다.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

내가 만든 걸 어쨌든 팔기 위해서는 결국 쓰는 사람, 고객이 중요하죠.
고객의 목소리에 귀기울이고 피봇한 것 굉장히 쉽지않지만 멋진 결정이라 생각해요.

Comment thread report/week4.md
Comment on lines +39 to +45
> 초기엔 태그 chip을 통한 단어 중심 정보로 제작하려 했으나, 두 값 모두 “강도”와 관련된 필드여서 단어만으로 사용자가 어떤 느낌인지 파악하는데 한계가 있을 것이라고 판단해 레벨미터를 사용해 조금 더 시각적인 정보를 제공하고자 구현 방향을 변경함
>
- 해당 키보드의 유튜브 영상 링크
- Youtube Data API v3 콜을 통해 영상 링크 수집

> 타건음을 태그 chip을 사용해 의서어로 제공하려 했으나, 소리의 경우 사람마다 다르게 받아들일 수 있겠다고 판단해 억지로 의성어를 제공하는 것 보단 동영상을 통해 사용자가 직접 판단하는 것이 더 좋겠다고 판단해 의성어 chip을 제거하고 영상 링크를 제공
>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

판단에 대한 근거를 좀 더 써보는 건 어떨까요?
위 항목에서는 피드백을 통해 반영했던 것 처럼요.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

위 내용들의 경우 모두 “사용자의 감각”에 관련된 요소들로 단순히 태그로만 표현되면 제공된 정보를 봤을 때 직관적으로 이해되지 않을 것 같다는 피드백이 있었습니다.

“걸림”의 경우 여러 종류의 키보드를 타건해본 경험이 없는 사용자의 경우 걸림이라는게 어떤 느낌인지 조차 인식되어있지 않은 경우가 많았고, 소음의 경우에도 단순히 “조용함”, “보통”, “시끄러움”등으로 나타낼 경우 타건 소리가 얼마나 큰지 잘 안 와 닿을 것 같다는 피드백이 있었습니다.

따라서 단순히 단어로만 표시하는 것 보다, 좀 더 시각적인 정보로 제공해 사용자의 이해를 돕고자 레벨미터의 형태를 채택했습니다.

타건 소리 의성어 태그의 경우에도 위와 마찬가지로 사용자의 감각적 주관에 크게 의존하는 정보라고 생각했습니다. 다만 이 부분은 어떤 피드백을 받고 변경된 것이 아닌 제작과정에서 든 의문과 그 의문이 결과물에 반영된 결과입니다.

동일한 키보드 타건 소리에 대해 어떤 사람을 “보글보글”이라고 느끼고, 어떤 사람은 “부글부글”이라고 느낀다고 가정해보겠습니다. 이 때 서비스를 제공하는 측에서 “보글보글”이라는 의성어로 픽스해 제공한다면 “부글부글”이라고 느낀 사용자의 입장에서 “이건 부글부글 아닌가? 이 서비스 이상하네?”라는 부정적 경험으로 이어질 수 있겠다고 생각했습니다.

물론 의성어 태그만 제공했을 때의 사용자 경험이 어떤지와 타건 영상을 제공했을 때, 두 정보 모두 제공했을 때의 사용자 피드백을 수집했다면 서비스 운영에 유의미한 데이터를 뽑아낼 수 있는 부분인 것 같은데, 실패 경험을 회피했다는 점에서 아쉬움이 남는 부분입니다.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

위 내용을 바탕으로 그러한 피드백 기반으로 이러이러해서 변경햇다~ 이런식으로 문서를 개선하시면 좋겠네요!

Comment thread report/week4.md
Comment on lines +55 to +58
- 파이어베이스
- 서버 운영 부담을 최소화하기 위해서 사용하려 하였습니다.
- 수파베이스
- 파이어베이스와 제공하는 기능이 크게 다르지 않고, 서버 운영 비용을 최소화할 수 있어 선택하였습니다.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

조금 더 이유가 구체적이면 좋겠는걸요. 제가 생각하는 파이어베이스의 가장 강점은 무료 사용량이 매우 많은 거라 생각해요. 짧은 시간 내 높은 트래픽을 처리하긴 어렵지만요.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Firebase의 가장 큰 장점은 무료 사용량이 넉넉하다는 점이라고 생각합니다. 실제로 Firebase Spark Plan은 결제수단 없이 사용할 수 있고, Firestore도 일 단위 읽기/쓰기 무료 한도, Cloud Functions도 월 호출 무료 한도를 제공합니다. 그래서 초기 MVP나 짧은 기간의 실험 서비스에는 Firebase가 비용 측면에서 매우 유리하다고 판단하였습니다.

다만 KeyBuddy에서는 단순히 무료 사용량보다 데이터 구조와 이후 확장성을 더 중요하게 봤습니다. 저희 서비스는 키보드 catalog를 조건별로 필터링하고, 추천 결과와 사용자 이벤트를 구조화해서 다뤄야 했기 때문에 문서 기반 NoSQL보다 PostgreSQL 기반의 관계형 모델이 더 잘 맞았습니다. Supabase는 PostgreSQL을 그대로 사용하므로 SQL 쿼리, 테이블 구조, RLS 정책을 명확하게 설계할 수 있다는 장점이 있었습니다.

또한 Firebase는 Google Cloud 생태계와 강하게 결합되어 있어 Firestore,Firebase Auth, Cloud Functions 중심으로 구현하면 이후 다른 환경으로 옮길 때 데이터 모델과 인증 흐름, 함수 배포 방식을 다시 설계해야 할 가능성이 큽니다. 반면 Supabase는 PostgreSQL 기반이고 self-hosting 옵션도 제공하기 때문에, 장기적으로는 특정 벤더에 대한 종속을 조금 줄일 수 있다고 판단했습니다.

Edge Functions 측면에서도 Supabase는 Deno 기반 TypeScript 함수를 전 세계 edge에 배포할 수 있고, 로컬 실행 및 Deno 호환 환경으로의 이식 가능성을 제공합니다.

Comment thread report/week4.md
- 파이어베이스 사용 → 수파베이스 사용
- 파이어베이스에서는 Blaze 요금제로 바꿨을 때 서버 운영 비용이 발생하나, 수파베이스에서는 서버 운영 비용이 발생하지 않아 서버 운영 비용을 최소화할 수 있어 변경하였습니다.
- 공통 하네싱
- 코드 컨벤션, 깃 컨벤션, PR 포맷 컨벤션, 브랜치 컨벤션 등등 공통으로 작업할 내용에 하네싱이 필요했는데 이 부분에서 놓친 점이 많아, 사람과 AI에 불필요한 혼동을 줬다고 생각합니다.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

깃, PR 포맷, 브랜치 컨벤션은 정말 필요한 하네스였을까요?
그만큼 정밀했어야했는지요. 이런 경우 필요한 하네스는 무엇이었을지 고민해보는 것도 좋은 고민이란 생각이 들어요.

@CommitTheKermit CommitTheKermit Jun 22, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이번 프로젝트를 돌아보면, 에이전트의 작업과 코드의 흐름을 잘 따라 가고 있었는가? 하고 질문을 던지자면 그렇지 않았다고 생각합니다. 전체적인 흐름은 잘 알고 있으나, 어떻게 태그를 추출했는지? 어떻게 추천을 하는지? 큰 흐름은 설명할 수 있지만 세부적인 흐름은 잘 모른다고 생각합니다.

대AI 시대에 "몇번째 줄에 어떠한 코드가 있다" 정도는 아니더라도, "이 기능은 이러한 흐름으로 작동한다."를 잘 설명할 수 있어야 한다고 생각합니다. 그렇기에 AI를 사용해 개발을 했더라도, 흐름을 잘 따라가기 위해서라면 "PR은 손으로 작성해야겠다."라는 생각이 들었습니다. 이처럼 에이전트의 흐름을 따라가기 위해서 직접 읽고 직접 쓰는 부분이 많아야겠다라는 생각입니다.

깃 컨벤션 하네싱은 PreToolUse 하네싱을 통해서 할 수 있습니다. 정확히는 Bash Tool을 사용하기 전에 내가 정해진 포맷을 주입할 수 있습니다. 기존에는, Skill이나 MEMORY를 통해서 하네싱을 달성하려고 했는데, Skill은 항상 발동된다고 보장하기 어렵고 메모리는 Advisory 성격이 강해, 문맥이 너무 길어지면 클로드가 듣지 않는 경우가 있어 항상 규칙을 준수한다고 보장하기 어렵습니다.

그렇기에, git 명령어를 사용할 때 내가 원하는 포맷을 강제하도록 하고 만약 포맷을 따르지 않았다면 아예 에이전트 흐름을 Stop되게 하려고 합니다.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"이 기능은 이러한 흐름으로 작동한다를 잘 설명할 수 있어야 한"다 했을 때, PR을 손으로 작성하는 것과 어떤 연관이 있나요?
설계자체는 사람끼리 하고, ai의 도움을 받으면서, 그 결정과 내용들을 잘 담아서 ai에게 정리시키고, 그 정리된 문서를 팀원들이 다시 검토하고 하는 것은 어떨까요?
설계문서만 있으면 구현은 ai가 금방 해내니까요.
설계한 걸 까먹는 건 저처럼 청년 치매를 극복해야하는 문제가 될지도요..

Comment thread report/week4.md
- 파이어베이스 사용 → 수파베이스 사용
- 파이어베이스에서는 Blaze 요금제로 바꿨을 때 서버 운영 비용이 발생하나, 수파베이스에서는 서버 운영 비용이 발생하지 않아 서버 운영 비용을 최소화할 수 있어 변경하였습니다.
- 공통 하네싱
- 코드 컨벤션, 깃 컨벤션, PR 포맷 컨벤션, 브랜치 컨벤션 등등 공통으로 작업할 내용에 하네싱이 필요했는데 이 부분에서 놓친 점이 많아, 사람과 AI에 불필요한 혼동을 줬다고 생각합니다.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

깃, PR 포맷, 브랜치 컨벤션은 정말 필요한 하네스였을까요?
그만큼 정밀했어야했는지요. 이런 경우 필요한 하네스는 무엇이었을지 고민해보는 것도 좋은 고민이란 생각이 들어요.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이번 프로젝트를 돌아보면, 에이전트의 작업과 코드의 흐름을 잘 따라 가고 있었는가? 하고 질문을 던지자면 그렇지 않았다고 생각합니다. 전체적인 흐름은 잘 알고 있으나, 어떻게 태그를 추출했는지? 어떻게 추천을 하는지? 큰 흐름은 설명할 수 있지만 세부적인 흐름은 잘 모른다고 생각합니다.

대AI 시대에 "몇번째 줄에 어떠한 코드가 있다" 정도는 아니더라도, "이 기능은 이러한 흐름으로 작동한다."를 잘 설명할 수 있어야 한다고 생각합니다. 그렇기에 AI를 사용해 개발을 했더라도, 흐름을 잘 따라가기 위해서라면 "PR은 손으로 작성해야겠다."라는 생각이 들었습니다. 이처럼 에이전트의 흐름을 따라가기 위해서 직접 읽고 직접 쓰는 부분이 많아야겠다라는 생각입니다.

깃 컨벤션 하네싱은 PreToolUse 하네싱을 통해서 할 수 있습니다. 정확히는 Bash Tool을 사용하기 전에 내가 정해진 포맷을 주입할 수 있습니다. 기존에는, Skill이나 MEMORY를 통해서 하네싱을 달성하려고 했는데, Skill은 항상 발동된다고 보장하기 어렵고 메모리는 Advisory 성격이 강해, 문맥이 너무 길어지면 클로드가 듣지 않는 경우가 있어 항상 규칙을 준수한다고 보장하기 어렵습니다.

그렇기에, git 명령어를 사용할 때 내가 원하는 포맷을 강제하도록 하고 만약 포맷을 따르지 않았다면 아예 에이전트 흐름을 Stop되게 하려고 합니다.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이건 왜 두개지

Comment thread report/week4.md
Comment on lines +97 to +99
- 끝까지 검증 못 한 가설이 있다면 그 사실 그대로
- 자연어 입력이 사용자에게 편한 방법일까?
- 자연어 입력을 통하여 정말로 사용자의 취향을 반영한 키보드가 추천될까? No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 가설들도 나중에 검증해보기 위해서 어떤 것들을 지표삼아볼 수 있을지 정리해보는 것도 좋은 방법이란 생각이 드네요!

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저희가 제공하는 서비스에는

  1. 자연어 입력을 통한 검색

  2. 선택지 입력을 통한 검색

이 두가지 방식을 통해서 내가 원하는 키보드를 찾을 수 있도록 하고 있는데

이 두 방식 중에서 1번:자연어 입력을 통한 방식으로 검색하여 사용하는 비율이 높다면, “자연어 입력을 통한 검색이 사용자에게 편한 방법일 것이다.” 라는 결론을 낼 수 있을 것 같습니다.

한 세션 내에서 사용자가 자연어 검색을 통해서 키보드를 검색하는 횟수, 자연어 압력을 통한 검색을 사용하는 빈도 등의 데이터를 수집하여 지표로 삼을 수 있을 것으로 보입니다.만약 최초 검색 이후에 사용한 문구가 이전 검색과 동일한 의도를 가지고 재검색을 수행한다면 이것은 추천 결과가 만족스럽지 않았다는 것을 의미할 것 같습니다. 동일한 의도를 갖는지 여부는 입력된 자연어에서 추출한 태그들의 유사도를 분석하는 방법이 있을 것 같습니다.

@malibinYun

Copy link
Copy Markdown

Problem
구현 방향 결정이 느리다
AI 의존적인것 같다, 보고서든, PPT든, PR이든 거의 다 사람이 안 읽고 진행하지 않나,

설계와 구현을 잘 나누는 게 중요해보여요. 설계대로 잘 구현해냈는지에 대한 테스트, e2e 테스트 목록을 마련해서 그것을 모두 통과하는지 점검한다면 구현을 어떻게 했느냐는 사실 크게 중요하지 않아보여요.
설계를 어떻게 했는지는 모두가 잘 알고 있어야겠지요.

분산 처리를 했다던지, 트래픽 감당을 위한 전략을 어떻게 했다던지, 실패에 대한 처리는 어떤식으로 마련되어있는지 등등.. 설계와 방향을 잘 정해둔다면 그것들을 어떻게 코드로 실제로 구현했는지는 이제는 중요하지 않은 시대가 왔다고 생각해요.

문서화의 부재
제출용 자료와 그와 관련된 산출물들은 문서화가 되어 있지만 이 것들이 만들어지는 과정에 대한 문서가 단 하나도 없다고 생각함
결과도 중요하지만 그 과정에서 발생한 내 생각과 고민, 결정들을 문서화 하는 연습이 필요해보임

ADR을 잘 쌓아서 이것을 ai가 참조하도록 하는 것이 가장 좋지요.
ai가 기획이나 결정사항들에 대한 컨텍스트를 알면 알 수록 ai는 훨씬 똑똑하게 결과물을 내놓을 것이에요.

문서를 여러곳에 분산하는 것도 장점이 있을 수 있지만, 아예 하나 (깃) 에서 관리하는 것도 나쁘지 않다고 생각해요. ai가 mcp나 툴을 활용해서 보는 것 보다는 로컬 문서를 보는 게 더 즉각적이니까요. 장단점이 뚜렷해서 상황에 맞춰서 잘 활용하면 좋겠어요.

@malibinYun malibinYun left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

빠른 호흡의 프로젝트 진행하시느라 고생 많으셨어요.
중간에 아이디어 피봇까지 해서 더 힘들었을텐데 결국 완료까지 잘 하셨네요 👍
피드백은 이만 마무리 짓도록 하겠습니다.
그룹 DM 방 만들어놓은 것이나, 1:1 DM으로 언제든지 궁금한 점들 물어보셔도 좋으니 메시지 남겨주세요.
남은 3 4 레벨도 화이팅입니다 💪

@malibinYun malibinYun merged commit bd9f35e into woowacourse:committhekermit Jun 24, 2026
20 of 22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants