| """ |
| DeAbstractionLayer: Privileged operation OUTSIDE the model. |
| Maps abstract reasoning outputs back to concrete entities. |
| """ |
|
|
| from typing import Dict, Any, Optional |
|
|
|
|
| class DeAbstractionLayer: |
| """ |
| Converts abstract text back to concrete text using entity vault mappings. |
| This is a PRIVILEGED operation that runs OUTSIDE the model. |
| The de-abstraction keys are NEVER part of model weights or training data. |
| """ |
|
|
| def __init__(self, vault_store: Optional[Dict[str, Any]] = None): |
| self.vault_store = vault_store or {} |
|
|
| def register_vault(self, vault_id: str, mapping: Dict[str, Any]): |
| self.vault_store[vault_id] = mapping |
|
|
| def deabstract(self, abstract_text: str, vault_id: str) -> str: |
| if vault_id not in self.vault_store: |
| raise ValueError(f"Vault {vault_id} not found. Cannot de-abstract securely.") |
| mapping = self.vault_store[vault_id] |
| concrete_text = abstract_text |
| sorted_tokens = sorted(mapping.keys(), key=len, reverse=True) |
| for token in sorted_tokens: |
| entity_info = mapping[token] |
| concrete_value = entity_info.get("surface", token) |
| concrete_text = concrete_text.replace(token, concrete_value) |
| return concrete_text |
|
|
| def deabstract_batch(self, abstract_texts, vault_ids): |
| return [self.deabstract(text, vid) for text, vid in zip(abstract_texts, vault_ids)] |
|
|
| def get_entity_metadata(self, vault_id: str, abstract_token: str) -> Optional[Dict]: |
| if vault_id not in self.vault_store: |
| return None |
| return self.vault_store[vault_id].get(abstract_token) |
|
|
| def list_vaults(self) -> list: |
| return list(self.vault_store.keys()) |
|
|
| def delete_vault(self, vault_id: str): |
| if vault_id in self.vault_store: |
| del self.vault_store[vault_id] |
|
|