Files
Orchestrator/bahn/teamlandkarte-mcp/.kiro/specs/remove-embedding-competence-similarity/tasks.md
T
ankn a5f8fb49ab Migrate all repos into monorepo context folders
Bahn: aisupport, Analyse-O2C-C2S, awesome-bahn-mcp-servers, beam-mcp,
      Confluence_Bot, db-planet-mcp-server, O2C-Harness, project-audit,
      Projekt-KIQ-HP, teamlandkarte-mcp
Dhive: Jury-Voting
Privat: CV, NoteGraph (NOTE: NoteGraph needs complete redo after consolidation)
Shared: AI-Orchestrator, OrgMyLife, power_skills_and_more
Shared/references: symphony (read-only)

Bahn repos remain available as independent remotes - this monorepo
pulls them in via subtree, the originals are untouched.
2026-06-30 20:39:52 +02:00

179 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Implementation Plan: Entfernung Embedding-basierter Similarity Umstellung auf BM25 + LLM
## Overview
Incremental removal of all embedding infrastructure and replacement with BM25 + LLM. Tasks are ordered to avoid breaking the system mid-way: first add new LLM-based methods, then remove embedding code paths, then clean up config and delete dead modules.
## Tasks
- [x] 1. Simplify AzureOpenAIClient to remove embedding methods
- [x] 1.1 Remove `embeddings` and `get_embeddings_batch` methods from `AzureOpenAIClient`
- Remove the `self._emb` AsyncAzureOpenAI client instance
- Remove constructor parameters: `embedding_api_key`, `embedding_deployment`, `embedding_batch_size`
- Keep only `chat_completion` method and its supporting `self._chat` client
- Make `self._chat` the primary client (no longer optional/conditional)
- Remove the guard clause in `chat_completion` that checks for missing config
- _Requirements: 6.7_
- [x] 1.2 Update `AzureOpenAIClient` constructor signature
- New required params: `endpoint`, `api_version`, `chat_deployment`, `llm_api_key`
- Keep optional: `timeout_s`, `max_retries`, `cost_tracker`
- Remove cost tracker calls for embedding requests (`log_embedding_request`, `log_embedding_batch_request`)
- _Requirements: 6.7_
- [-] 2. Refactor SimilarityEngine to remove embedding methods and add LLM role similarity
- [x] 2.1 Remove embedding-related methods and properties from `SimilarityEngine`
- Remove methods: `prefetch_embeddings`, `_embed`, `get_embedding_for_cache_key`, `get_embeddings_for_cache_keys`, `_aggregate_similarity`, `_per_skill_similarity`
- Remove properties: `embedding_model`, `embedding_dimensions`, `use_bm25_search`
- Remove constructor parameters: `cache`, `embedding_model`, `embedding_dimensions`, `strategy`, `use_bm25_search`
- Remove module-level helpers: `_cache_key`, `cosine_similarity`
- Update constructor to accept only: `client`, `cost_tracker`, `use_auto_tagging`, `auto_tagger`
- Add `_role_similarity_cache: dict[tuple[str, str], float]` to constructor
- _Requirements: 1.3, 1.4, 1.5, 1.6, 1.7, 6.1, 6.2_
- [x] 2.2 Simplify `compute_competence_similarity` to always use BM25+RRF
- Remove any strategy/conditional branching
- Always call `_bm25_rrf_similarity` directly (with optional auto-tagging expansion)
- _Requirements: 1.1, 1.2_
- [x] 2.3 Implement LLM-based `compute_role_similarity`
- Replace embedding cosine similarity with LLM chat completion
- Add `_ROLE_SIMILARITY_SYSTEM_PROMPT` constant
- Implement symmetric cache key: `tuple(sorted((role_a_lower, role_b_lower)))`
- Return 0.0 for bad/empty/None/"(unknown)" roles without LLM call
- Return 1.0 for identical roles (case-insensitive) without LLM call
- Parse JSON response, clamp score to [0.0, 1.0]
- On any exception: return 0.0, do not cache failed results
- _Requirements: 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.8_
- [x] 2.4 Add `clear_role_cache` method
- Clears `_role_similarity_cache` dict
- _Requirements: 5.8_
- [x] 2.5 Write property test for BM25 zero-score on disjoint tokens
- **Property 1: BM25 Zero-Score für fehlenden Token-Overlap**
- **Validates: Requirements 1.1**
- [x] 2.6 Write property test for role similarity value range and identity
- **Property 5: compute_role_similarity Wertebereich**
- **Validates: Requirements 5.1**
- [x] 2.7 Write property test for role similarity cache symmetry
- **Property 6: Rollen-Similarity-Cache ist symmetrisch und idempotent**
- **Validates: Requirements 5.8**
- [-] 3. Refactor VocabularyCache to use LLM-based role inference
- [x] 3.1 Rewrite `VocabularyCache` class
- Remove all embedding-related methods: `preload`, `_preload_role_vocab`, `_preload_competence_vocab`, `ensure_task_embedding`, `infer_competences`
- Remove old `infer_primary_role` (embedding-based)
- Remove properties: `roles`, `competences`
- Remove constructor dependencies on `SimilarityEngine` and `EmbeddingCache`
- New constructor accepts only: `db: DBClient`, `client: AzureOpenAIClient`
- Remove module-level helpers: `role_vocab_cache_key`, `competence_vocab_cache_key`, `task_id_cache_key`, `VocabItem`
- _Requirements: 4.3, 6.3, 6.4, 6.5_
- [x] 3.2 Implement new LLM-based `infer_primary_role`
- Accept `task_text: str` keyword argument (no more `task_embedding`)
- Fetch all role names from DB via `self._db.get_all_role_names()`
- Build LLM prompt with task text and available roles list
- Parse JSON response: `{"role": "...", "confidence": 0.0-1.0}`
- Validate returned role exists in DB role list
- Return `None` on empty text, empty role list, or any exception
- _Requirements: 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8_
- [x] 3.3 Write property test for infer_primary_role output validity
- **Property 3: infer_primary_role Ausgabe-Validität**
- **Validates: Requirements 3.1, 3.4**
- [x] 3.4 Write property test for graceful degradation on LLM failure
- **Property 4: Graceful Degradation bei LLM-Fehler**
- **Validates: Requirements 3.5, 5.6**
- [x] 4. Checkpoint - Ensure all tests pass
- Ensure all tests pass, ask the user if questions arise.
- [-] 5. Update Matcher to unconditionally build BM25 index
- [x] 5.1 Remove `use_bm25_search` conditional in `Matcher.match`
- Remove `if self._sim.use_bm25_search` guard around BM25 index construction
- Always build global BM25 index when `filtered` is non-empty
- _Requirements: 2.6_
- [x] 5.2 Write property test for unconditional BM25 index building
- **Property 2: Matcher baut BM25-Index bedingungslos**
- **Validates: Requirements 2.6**
- [x] 6. Update MCP Server to remove embedding preload and wire new components
- [x] 6.1 Remove embedding preload infrastructure from `mcp_server.py`
- Remove `_startup_preload_embeddings` function
- Remove `_deferred_preload` function and `_preload_started` flag
- Remove `_ensure_preloaded` function
- Remove all `await _ensure_preloaded()` calls in tool handlers
- Remove `EmbeddingCache` import and instantiation
- _Requirements: 4.1, 4.2, 4.4, 4.5, 6.12_
- [x] 6.2 Update component wiring in `build_server`
- Construct `AzureOpenAIClient` with new simplified signature (no embedding params)
- Construct `SimilarityEngine` with new signature (client, cost_tracker, use_auto_tagging, auto_tagger)
- Construct `VocabularyCache` with new signature (db, client)
- _Requirements: 6.7_
- [x] 6.3 Update `infer_primary_role` tool handler
- Remove embedding generation step
- Call `vocab_cache.infer_primary_role(task_text=text)` directly with task text
- _Requirements: 3.9_
- [x] 6.4 Remove or simplify `validate_task_requirements` tool if it depends on embeddings
- Remove embedding-based `infer_competences` usage
- Either remove the tool entirely or replace with a DB-field-only version
- _Requirements: 6.5_
- [x] 7. Simplify config.py and config.toml
- [x] 7.1 Remove embedding-related dataclasses and fields from `config.py`
- Delete `EmbeddingCacheConfig` dataclass
- Delete `InferenceConfig` dataclass
- Remove from `AzureOpenAIConfig`: `embedding_deployment`, `embedding_batch_size`
- Remove from `SimilarityConfig`: `embedding_model`, `embedding_dimensions`, `strategy`, `use_bm25_search`
- Remove `inference` field from `MatchingConfig`
- Remove `embedding_cache` field from `AppConfig`
- _Requirements: 2.1, 2.2, 6.8, 6.9, 6.10_
- [x] 7.2 Update `load_config` / `_parse_azure_openai` validation
- Remove `AZURE_OPENAI_EMBEDDING_API_KEY` environment variable check
- Make `AZURE_OPENAI_LLM_API_KEY` always required
- Make `chat_deployment` required
- Remove `embedding_dimensions == 3072` validation
- Remove `strategy` validation
- Remove `[matching.inference]` parsing
- Remove `[embedding_cache]` parsing
- _Requirements: 2.3, 2.4_
- [x] 7.3 Update `config.toml` and `config.toml.example`
- Remove `[embedding_cache]` section
- Remove from `[matching.similarity]`: `embedding_model`, `embedding_dimensions`, `strategy`, `use_bm25_search`
- Remove from `[azure_openai]`: `embedding_deployment`, `embedding_batch_size`
- Remove `[matching.inference]` section
- _Requirements: 6.11_
- [x] 8. Delete EmbeddingCache module and related tests
- [x] 8.1 Delete `src/teamlandkarte_mcp/cache/embedding_cache.py`
- _Requirements: 6.6_
- [x] 8.2 Remove or update tests that reference embedding functionality
- Delete tests for `EmbeddingCache`
- Update tests for `SimilarityEngine` to use new constructor
- Update tests for `VocabularyCache` to use new constructor
- Update tests for `AzureOpenAIClient` to use new constructor
- Remove any test fixtures that create embedding mocks
- _Requirements: 6.6_
- [x] 9. Final checkpoint - Ensure all tests pass
- Ensure all tests pass, ask the user if questions arise.
## Notes
- Tasks marked with `*` are optional and can be skipped for faster MVP
- Each task references specific requirements for traceability
- Checkpoints ensure incremental validation
- Property tests validate universal correctness properties from the design document
- Order ensures no broken intermediate states: new LLM methods added before old embedding paths removed