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.
This commit is contained in:
truetype committed 2026-02-09 11:01:29 +01:00
1 parent b9f21c7199
commit 9a113002d4
5 files changed
+44 -26

No files matched your search

+6 -1
View File
@@ -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
```
+9 -4
View File
@@ -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
+24 -18
View File
@@ -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):
+1
View File
@@ -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)
+4 -3
View File
@@ -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,
)
# ------------------------------------------------------------------