From 9a113002d43fd529e80f3d26c464b23e3078ccab Mon Sep 17 00:00:00 2001 From: truetype Date: Mon, 9 Feb 2026 11:01:29 +0100 Subject: [PATCH] feat: make embedding model configurable for semantic search - Add SemanticSearchConfig to settings.py with embedding model options - Update WorldMapper to accept embedding_model parameter - Update main.py to pass model from config to WorldMapper - Add documentation for available embedding models: - sentence-transformers/all-MiniLM-L6-v2 (default, fast) - sentence-transformers/all-mpnet-base-v2 (better quality) - google/embeddinggemma-300m (state-of-the-art) - Update config.yaml and config.example.yaml with new options Users can now choose the best embedding model for their needs. --- docs/configuration.md | 7 ++++- examples/config.example.yaml | 13 ++++++--- src/config/settings.py | 42 +++++++++++++++++------------- src/main.py | 1 + src/modules/mapper/world_mapper.py | 7 ++--- 5 files changed, 44 insertions(+), 26 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 4f22841..1560305 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -71,7 +71,12 @@ mapper: codec: "h264" semantic_search: - model: "all-MiniLM-L6-v2" # Sentence transformer model + # Embedding model for semantic room search + # Available models: + # - "sentence-transformers/all-MiniLM-L6-v2" (default, fast, 22MB) + # - "sentence-transformers/all-mpnet-base-v2" (better quality, 418MB) + # - "google/embeddinggemma-300m" (state-of-the-art, requires transformers>=4.40) + model: "sentence-transformers/all-MiniLM-L6-v2" top_k: 5 # Number of search results similarity_threshold: 0.7 # Minimum similarity score ``` diff --git a/examples/config.example.yaml b/examples/config.example.yaml index 75f66af..e52c4ca 100644 --- a/examples/config.example.yaml +++ b/examples/config.example.yaml @@ -35,10 +35,15 @@ mapper: fps: 30 codec: "h264" - semantic_search: - model: "all-MiniLM-L6-v2" - top_k: 5 - similarity_threshold: 0.7 + semantic_search: + # Embedding model for semantic room search + # Options: + # - "sentence-transformers/all-MiniLM-L6-v2" (default, fast, 22MB) + # - "sentence-transformers/all-mpnet-base-v2" (better quality, 418MB) + # - "google/embeddinggemma-300m" (state-of-the-art, requires transformers>=4.40) + model: "sentence-transformers/all-MiniLM-L6-v2" + top_k: 5 + similarity_threshold: 0.7 behavior: reaction_time_min_ms: 200 diff --git a/src/config/settings.py b/src/config/settings.py index 1642bfb..86ceed1 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -51,24 +51,30 @@ class AIConfig(BaseModel): llm: LLMProviderConfig = Field(default_factory=LLMProviderConfig) -class MapperConfig(BaseModel): - """Mapper configuration""" - class ActiveStorageConfig(BaseModel): - db_path: str = "data/maps/active/world.db" - graph_cache_size: int = 10000 - - class HistoricalStorageConfig(BaseModel): - archive_dir: str = "data/maps/archive" - - class SnapshotTriggers(BaseModel): - room_count: int = 500 - session_end: bool = True - time_interval_hours: int = 24 - - snapshot_triggers: SnapshotTriggers = Field(default_factory=SnapshotTriggers) - - active_storage: ActiveStorageConfig = Field(default_factory=ActiveStorageConfig) - historical_storage: HistoricalStorageConfig = Field(default_factory=HistoricalStorageConfig) +class MapperConfig(BaseModel): + """Mapper configuration""" + class ActiveStorageConfig(BaseModel): + db_path: str = "data/maps/active/world.db" + graph_cache_size: int = 10000 + + class HistoricalStorageConfig(BaseModel): + archive_dir: str = "data/maps/archive" + + class SnapshotTriggers(BaseModel): + room_count: int = 500 + session_end: bool = True + time_interval_hours: int = 24 + + snapshot_triggers: SnapshotTriggers = Field(default_factory=SnapshotTriggers) + + class SemanticSearchConfig(BaseModel): + model: str = "sentence-transformers/all-MiniLM-L6-v2" + top_k: int = 5 + similarity_threshold: float = 0.7 + + active_storage: ActiveStorageConfig = Field(default_factory=ActiveStorageConfig) + historical_storage: HistoricalStorageConfig = Field(default_factory=HistoricalStorageConfig) + semantic_search: SemanticSearchConfig = Field(default_factory=SemanticSearchConfig) class BehaviorConfig(BaseModel): diff --git a/src/main.py b/src/main.py index a005b54..3dec67c 100644 --- a/src/main.py +++ b/src/main.py @@ -60,6 +60,7 @@ async def main_loop(config): enable_sync=True, room_count_trigger=config.mapper.historical_storage.snapshot_triggers.room_count, time_interval_hours=config.mapper.historical_storage.snapshot_triggers.time_interval_hours, + embedding_model=config.mapper.semantic_search.model, ) # Initialize Character Creator (Phase 2) diff --git a/src/modules/mapper/world_mapper.py b/src/modules/mapper/world_mapper.py index f986abe..b2b4dcb 100644 --- a/src/modules/mapper/world_mapper.py +++ b/src/modules/mapper/world_mapper.py @@ -39,6 +39,7 @@ class WorldMapper: enable_sync: bool = True, room_count_trigger: int = 500, time_interval_hours: float = 24.0, + embedding_model: str = "sentence-transformers/all-MiniLM-L6-v2", ) -> None: self.storage = ActiveStorage(db_path=db_path) self.pathfinder = Pathfinder(self.storage.graph) @@ -53,7 +54,7 @@ class WorldMapper: self._sync_manager: Optional[SyncManager] = None if enable_sync: historical = HistoricalStorage(archive_dir=archive_dir) - semantic = SemanticSearch() + semantic = SemanticSearch(model_name=embedding_model) self._sync_manager = SyncManager( active=self.storage, historical=historical, @@ -62,8 +63,8 @@ class WorldMapper: time_interval_hours=time_interval_hours, ) logger.info( - "SyncManager enabled: trigger=%d rooms, interval=%.1fh", - room_count_trigger, time_interval_hours, + "SyncManager enabled: trigger=%d rooms, interval=%.1fh, model=%s", + room_count_trigger, time_interval_hours, embedding_model, ) # ------------------------------------------------------------------