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.
5.6 KiB
5.6 KiB
Implementierungsplan: LLM Batch-Matching (Concurrent Requests)
Übersicht
Sequenzielle LLM-Aufrufe in LlmFulltextMatcher werden durch asyncio.gather() mit Semaphore-Begrenzung ersetzt. Die Konfiguration wird um max_concurrency erweitert. Die öffentliche Schnittstelle bleibt unverändert.
Tasks
-
1. Konfiguration erweitern
- 1.1
AzureOpenAIConfigum Feldmax_concurrency: int = 5erweitern- In
src/teamlandkarte_mcp/config.pydas frozen DataclassAzureOpenAIConfigum das Feld ergänzen - Anforderungen: 2.5
- In
- 1.2 Validierung in
_parse_azure_openaihinzufügenmax_concurrencyaus Config lesen mit Default 5ConfigErrorwerfen wenn Wert < 1 oder > 20- Feld an
AzureOpenAIConfig-Konstruktor übergeben - Auch im
load_config-Rebuild-Block (azure_openai = AzureOpenAIConfig(...)) das neue Feld durchreichen - Anforderungen: 2.1, 2.2, 2.3, 2.4
- 1.3
config.tomlum kommentiertenmax_concurrency-Schlüssel erweitern- Unter
[azure_openai]einen Kommentar mit Erklärung und auskommentierten Default-Wert einfügen - Anforderungen: 2.1
- Unter
- 1.4 Property-Test für Config-Validierung schreiben
- Property 6: Config-Validierung
- Teste mit hypothesis:
st.integers(min_value=-100, max_value=100)– Erfolg genau dann wenn 1 <= n <= 20, sonstConfigError - Validiert: Anforderungen 2.1, 2.3, 2.4
- 1.1
-
2.
LlmFulltextMatcherum Concurrency erweitern- 2.1 Konstruktor um
max_concurrency-Parameter und Semaphore erweiternmax_concurrency: int = 5als keyword-only Parameter hinzufügenself._semaphore = asyncio.Semaphore(max_concurrency)im__init__anlegenself._max_concurrency = max_concurrencyspeichernimport asyncioundimport timeergänzen- Anforderungen: 1.2, 1.5, 5.4
- 2.2 Neue Methode
_categorize_one_throttledimplementieren- Async-Wrapper um
_categorize_onederasync with self._semaphore:verwendet - Gleiche Signatur wie
_categorize_one(item_id, user_prompt, raw) - Anforderungen: 1.2, 1.4, 1.5
- Async-Wrapper um
- 2.3
match_capacitiesaufasyncio.gatherumstellen- Sequenzielle for-Schleife durch Liste von
_categorize_one_throttled-Aufrufen ersetzen asyncio.gather(*tasks)für parallele Ausführung verwenden- Ergebnisse iterieren und in
by_category/errorseinsortieren - Logging (INFO) vor und nach dem Batch mit Kandidatenanzahl, Concurrency, Dauer, Erfolge, Fehler
- Bestehende Sortierung beibehalten
- Anforderungen: 1.1, 3.1, 3.2, 4.2, 4.3, 4.4, 5.1, 6.1, 6.2
- Sequenzielle for-Schleife durch Liste von
- 2.4
match_tasksaufasyncio.gatherumstellen- Analog zu 2.3: sequenzielle Schleife durch gather + throttled ersetzen
- Logging analog zu
match_capacities - Anforderungen: 1.1, 3.1, 3.2, 4.2, 4.3, 4.4, 5.1, 6.1, 6.2
- 2.1 Konstruktor um
-
3. MCP-Server Verdrahtung
- 3.1
max_concurrencyanLlmFulltextMatcherübergeben- In
build_server()bei der Instanziierung vonLlmFulltextMatcherden Wertcfg.azure_openai.max_concurrencyübergeben - Anforderungen: 2.1, 5.4
- In
- 3.1
-
4. Checkpoint
- Sicherstellen dass alle bestehenden Tests weiterhin bestehen. Bei Fragen den Nutzer konsultieren.
-
5. Property-Based Tests
- 5.1 Property-Test: Vollständigkeit der Ergebnisse (Partition)
- Property 1: Vollständigkeit der Ergebnisse
- Generiere zufällige Kandidatenlisten mit Mock-Client (Mix aus Erfolg/Fehler); prüfe
len(by_category items) + len(errors) == len(input) - Validiert: Anforderungen 1.1, 1.4, 3.2, 4.2, 4.3
- 5.2 Property-Test: Concurrency-Begrenzung
- Property 2: Concurrency-Begrenzung
- Mock-Client mit asyncio-Counter für gleichzeitige Aufrufe; prüfe
max_concurrent <= max_concurrencyfür verschiedene Werte - Validiert: Anforderungen 1.2
- 5.3 Property-Test: Deterministische Sortierung
- Property 3: Deterministische Sortierung
- Generiere Ergebnisse mit zufälligen Kategorien; prüfe dass jede Kategorie nach
item_idaufsteigend sortiert ist - Validiert: Anforderungen 3.1
- 5.4 Property-Test: Eingabereihenfolge-Unabhängigkeit
- Property 4: Eingabereihenfolge-Unabhängigkeit
- Generiere Kandidatenliste, permutiere, führe Matching aus, vergleiche Ergebnisse auf Gleichheit
- Validiert: Anforderungen 3.3
- 5.5 Property-Test: Korrekte Zuordnung (Response-Mapping)
- Property 5: Korrekte Zuordnung
- Mock gibt item_id-spezifische Kategorien zurück; prüfe dass jedes Item in der korrekten Kategorie landet
- Validiert: Anforderungen 3.4
- 5.6 Property-Test: Logging-Konsistenz
- Property 7: Logging-Konsistenz
- Capture Logs mit
caplog; prüfe dass Start- und End-Log die korrekte Kandidatenanzahl und Summe (Erfolge + Fehler) enthalten - Validiert: Anforderungen 6.1, 6.2
- 5.1 Property-Test: Vollständigkeit der Ergebnisse (Partition)
-
6. Unit Tests
- 6.1 Unit Tests für Batch-Matching schreiben
- Leere Eingabe: sofort leeres Ergebnis ohne LLM-Aufrufe
- Alle Fehler: keine Exception, vollständige Fehlerliste
- Default-Wert: ohne
max_concurrencywird 5 verwendet - Einzelner Fehler beeinflusst andere Kandidaten nicht
- Anforderungen: 4.2, 4.3, 4.4, 5.3
- 6.1 Unit Tests für Batch-Matching schreiben
-
7. Abschluss-Checkpoint
- Sicherstellen dass alle Tests bestehen und die Schnittstelle abwärtskompatibel bleibt. Bei Fragen den Nutzer konsultieren.
Hinweise
- Tasks mit
*sind optional und können für ein schnelleres MVP übersprungen werden - Jeder Task referenziert spezifische Anforderungen für Nachvollziehbarkeit
- Property-Tests verwenden
hypothesis(pytest-Plugin) - Der Score-Modus bleibt vollständig unberührt (Anforderung 7)