Agent skill
managing-embeddings
USE THIS SKILL for anything related to embeddings, vector similarity, or semantic search. Triggers: "임베딩 생성", "코사인 유사도", "캐시 어디에", "임베딩 상태", "의미 유사도", "text-embedding-3-large", "openai embedding", "벡터 차원", "3072", "임베딩 캐시", "embedding 마이그레이션", "레거시 캐시", "embedding fallback", "유사도 검사 임베딩 모드", "임베딩 배치", "rate limit 429". Covers OpenAI embedding API, file-based cache with migration, and text preprocessing.
Install this agent skill to your Project
npx add-skill https://github.com/greenheadHQ/awesome-anki/tree/main/.claude/skills/managing-embeddings
SKILL.md
임베딩 관리
기술 스택
- 모델:
text-embedding-3-large(OpenAI) - 차원: 3072 (기본값,
dimensions옵션으로 축소 가능) - 입력 한도: 8K 토큰
- 패키지:
openai - API 키:
OPENAI_API_KEY환경변수 필수
LLM 추상화 미사용
임베딩은
packages/core/src/llm/추상화 계층을 사용하지 않고,packages/core/src/embedding/client.ts에서openai패키지를 직접 호출한다. 따라서 임베딩은 OpenAI 전용이며, LLM 프로바이더 설정(ANKI_SPLITTER_DEFAULT_LLM_PROVIDER)과 독립적으로 동작한다.
모듈 구조 (packages/core/src/embedding/)
| 파일 | 역할 |
|---|---|
client.ts |
OpenAI 임베딩 API 클라이언트 (text-embedding-3-large) |
cosine.ts |
코사인 유사도 계산 (0-100%) |
cache.ts |
파일 기반 증분 캐시 (호환성 검사, 레거시 마이그레이션 포함) |
index.ts |
모듈 re-export |
주요 상수
export const EMBEDDING_PROVIDER = "openai";
export const EMBEDDING_MODEL = "text-embedding-3-large";
export const EMBEDDING_EXPECTED_DIMENSION = 3072;
// 레거시 (Gemini → OpenAI 마이그레이션 감지용)
export const LEGACY_EMBEDDING_PROVIDER = "gemini";
export const LEGACY_EMBEDDING_MODEL = "gemini-embedding-001";
주요 함수
// 단일 텍스트 임베딩
const embedding = await getEmbedding(text, options?); // number[] (3072차원)
// 의미적 유사도
const similarity = await getSemanticSimilarity(text1, text2, options?); // 0-100 (%)
// 배치 임베딩 (BATCH_SIZE=100, rate limit 딜레이 자동 적용)
const embeddings = await getEmbeddings(texts, options?, onProgress?); // number[][]
// 유사성 검사 (임베딩 모드)
const result = await checkSimilarity(targetCard, allCards, {
useEmbedding: true, deckName: '덱명', threshold: 85
});
EmbeddingOptions는 dimensions?: number 필드 하나만 가진다. 지정하면 모델이 차원 축소된 벡터를 반환한다.
배치 처리 및 재시도
- BATCH_SIZE: 100건씩 OpenAI API 호출
- 배치 간 딜레이: 350ms (
EMBEDDING_BATCH_DELAY_MS) - 재시도: 최대 2회 (
EMBEDDING_MAX_ATTEMPTS), 재시도 간 350ms 대기 - 재시도 대상: 408, 429, 500, 502, 503, 504 상태코드 및 네트워크 오류
텍스트 전처리
preprocessTextForEmbedding() — 임베딩 생성 전 반드시 적용 (자동):
- Cloze 구문에서 내용만 추출 (
{{c1::DNS}}→DNS) - HTML 태그 제거
- 컨테이너 구문 제거 (
::: tip등) - nid 링크에서 제목만 추출
캐시 전략
- 저장 위치:
EMBEDDING_CACHE_DIR환경변수 또는output/embeddings/(기본) - 파일명:
{deckNameHash}.json(MD5 앞 12자) - 캐시 구조:
typescript
interface EmbeddingCache { schemaVersion: number; // EMBEDDING_CACHE_SCHEMA_VERSION = 1 deckName: string; provider: string; // "openai" model: string; // "text-embedding-3-large" dimension: number; // 3072 lastUpdated: number; embeddings: Record<string, CachedEmbedding>; } - 증분 업데이트: MD5 해시로 텍스트 변경 감지, 변경된 카드만 재생성
- 호환성 검사:
getCacheIncompatibilityReason(cache)— schema/provider/model 불일치 감지- 불일치 시 자동으로 캐시 재생성 (레거시 Gemini 캐시 → OpenAI 캐시 마이그레이션)
- 캐시 확인:
GET /api/embedding/status/:deckName - 캐시 삭제:
DELETE /api/embedding/cache/:deckName
API 엔드포인트
| Method | Path | 설명 |
|---|---|---|
| POST | /api/embedding/generate | 덱 전체 임베딩 생성 (증분, 마이그레이션 자동) |
| GET | /api/embedding/status/:deckName | 캐시 상태 + 호환성 확인 |
| DELETE | /api/embedding/cache/:deckName | 캐시 삭제 |
| POST | /api/embedding/single | 단일 텍스트 임베딩 (디버깅) |
자주 발생하는 문제
- OPENAI_API_KEY 미설정:
OPENAI_API_KEY가 설정되지 않았습니다에러 →.env에 키 추가 - Rate Limit 429: 배치 처리 시 자동 딜레이 적용, 서버 라우트에서도 10건마다 400ms 대기
- 캐시 마이그레이션: Gemini에서 OpenAI로 변경 후 첫 실행 시 자동 감지 및 재생성
- 차원 불일치: 레거시 캐시는 768차원 (Gemini), 현재는 3072차원 (OpenAI) — 호환성 검사가 자동 처리
- 캐시 위치 혼동: 덱 이름을 MD5 해시로 변환하여 파일명 생성
상세 참조
references/embedding-system.md— OpenAI text-embedding-3-large, 캐시 호환성/마이그레이션 상세references/preprocessing.md— Cloze/HTML/컨테이너 제거 로직references/troubleshooting.md— OPENAI_API_KEY, rate limit, 캐시 마이그레이션
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
validating-cards
USE THIS SKILL for card content validation — fact-checking, freshness, similarity, context consistency, or anything about duplicate detection and card quality. Triggers: "팩트 체크 결과가", "유사한 카드 찾아줘", "문맥 검증", "검증 캐시", "최신성 검사", "중복 카드", "검증 상태 아이콘", "validate/all", "Jaccard", "임베딩 유사도", "중복 판정", "useValidateCard", "useBatchValidate", "검증 4종", "일괄 검증", "context-checker", "fact-checker", "freshness-checker", "similarity-checker", "findSimilarGroups", "analyzeCardGroup", "검증 폴백". Covers the 4 validation types: fact-check, freshness, similarity, context.
developing-web-ui
React 프론트엔드의 컴포넌트, 훅, 렌더링, 스타일 관련 작업이면 반드시 이 스킬을 먼저 확인할 것. Triggers: "React 컴포넌트 추가", "ContentRenderer 수정", "TanStack Query", "CSS 충돌", "웹 UI 버그", "페이지 추가", "Tailwind 스타일", "렌더링 문제", "shadcn", "shadcn 컴포넌트", "shadcn 마이그레이션", "variant API", "UI 마이그레이션", "마이그레이션", "toast", "sonner", "Toaster", "DiffViewer", "ContentPreview", "BottomSheet", "CompactSelector", "markdown 렌더링", "모바일 반응형", "useMediaQuery", "useIsMobile", "훅 추가", "query hook", "캐시 무효화", "staleTime", "분할 미리보기 UI", "분할 반려 UI", "카드 브라우저", "어려운 카드". Covers the React frontend, components, hooks, query patterns, rendering pipeline, and UI troubleshooting.
understanding-project
프로젝트 구조, 아키텍처, 기술 스택, 패키지 역할 등 전반적인 이해가 필요할 때 사용. 코드가 어디에 있는지, 패키지 간 의존성이 어떤지, 왜 이 구조인지 궁금하면 이 스킬. Triggers: "모노레포 구조가 어떻게 돼", "기술 스택", "export 충돌", "패키지 간 의존성", "프로젝트 구조", "어떤 패키지에 있어", "파일 어디에 있어", "아키텍처", "디렉터리 구조", "코드 위치", "모듈 역할", "어떤 기술 쓰고 있어", "스택", "의존성". Covers the monorepo architecture, package roles, tech stack, and coding conventions.
managing-llm
LLM 추상화 계층, 프로바이더 어댑터, 가격표, 예산 가드 등 LLM 관련 작업이면 무조건 이 스킬. 모델 변경, 프로바이더 추가, 비용 계산, 토큰 카운트 등 모든 LLM 인프라를 다룬다. Triggers: "LLM 모델 변경", "프로바이더 추가", "비용 추정", "예산 가드", "pricing table", "모델 비교", "LLM 비용", "토큰 사용량", "모델 추가", "LLM 설정", "Gemini", "OpenAI", "API key", "model pricing", "budget cap", "token count", "adapter", "factory".
working-with-anki
AnkiConnect 연결, 카드/덱/모델 조회, 학습 데이터 복제, 백업/롤백, 어려운 카드 탐지, 커스텀 config 액션 등 Anki와의 모든 상호작용을 다룬다. Triggers: "AnkiConnect 연결", "test 프로필", "ease factor 복제", "카드 정보 조회", "학습 데이터", "AnkiConnect API", "Anki 프로필", "카드 모델", "어려운 카드", "난이도 탐지", "difficulty", "백업", "롤백", "분할 적용", "scheduling", "스케줄링", "getConfig", "setConfig", "커스텀 액션". Covers AnkiConnect API wrapper, scheduling clone, backup/rollback, difficulty detection, and custom config actions.
splitting-cards
카드 분할 로직, LLM 기반 Split, nid 승계 전략, 텍스트 파서, 비용 추정, 배치 분할 등 카드 분할의 모든 측면을 다룬다. Triggers: "Split 결과가 이상해", "파서 버그", "분할 미리보기", "nid 승계", "Cloze 번호 리셋", "컨테이너 파서", "카드 분할", "atomic card", "분할 비용", "split cost", "배치 분할", "batch split", "분할 적용", "split apply", "분할 검증", "스타일 보존". Covers Split logic, nid inheritance strategy, text parsers, cost estimation, batch split, and split validation.
Didn't find tool you were looking for?