Semantic Kernel (Python)¶
holographic_integrations.semantic_kernel implements Semantic Kernel's current vector store abstraction: HolographicStore (a VectorStore) and HolographicCollection (a VectorStoreCollection and VectorSearch). The legacy MemoryStoreBase connector style, including the adapter in holographic_sdk.semantic_kernel, is superseded by this.
Install¶
Quickstart¶
@vectorstoremodel
@dataclass
class Note:
id: Annotated[str, VectorStoreField("key")]
text: Annotated[str, VectorStoreField("data", is_full_text_indexed=True)]
team: Annotated[str, VectorStoreField("data", is_indexed=True)]
embedding: Annotated[list[float] | str | None, VectorStoreField("vector", dimensions=384)] = None
store = HolographicStore(HmsConfig(url="http://127.0.0.1:8080", tenant_id="sk", input_dim=384), embedding_generator=my_sk_embedder)
async with store.get_collection(Note, collection_name="notes") as notes:
await notes.upsert(Note(id="1", text="...", team="platform", embedding="..."))
hits = await notes.search(values="query", top=3, filter="lambda x: x.team == 'platform'")
fn = notes.create_search_function(function_name="search_notes", top=3) # kernel.add_function(...)
See integrations/python/examples/semantic_kernel_store.py. Semantic Kernel's vector store API is async only, so there is no sync path.
Record mapping¶
| Model | Stored |
|---|---|
| key field | document id (strings only; at most 256 bytes) |
| text data field | document text: text_field= if given, else first is_full_text_indexed field, else first data field |
| other data fields | metadata under their storage name (JSON types only; _hms_ prefix is reserved) |
| vector field (at most one) | used as the vector when it holds a list of floats. A string or None is the source text: the field's or store's SK embedding generator embeds it before upsert; with no generator the backend embeds the text with HmsConfig.embedder (or the service does, with text_queries=True) |
Vectors are not returned (include_vectors is ignored): the service does not return stored vectors. collection_name scopes records inside the tenant; ensure_collection_exists is a no-op (collections are implicit) and ensure_collection_deleted deletes the collection's records. HolographicStore.list_collection_names() only knows collections opened through that store instance.
Search, scores, filters¶
search(values=...)embeds with the field/collection embedding generator when present, else withHmsConfig.embedder.search(vector=...)uses your vector.top + skipmust be at mostmax_fetch(default 100, the server's--max-top-k).- Scores follow the vector field's distance function:
COSINE_SIMILARITYreturns the cosine (higher is better);COSINE_DISTANCEandDEFAULTreturn1 - cosine(lower is better). Other distance functions are rejected when the collection is created, because the service ranks by cosine. hybrid_searchworks only withHmsConfig(text_queries=True)against a server built withlocal-models(BM25 + cosine fusion; scores are then fused rank scores, not cosines). Otherwise it raisesVectorStoreOperationNotSupportedException.- Filters are lambdas or strings, a list meaning AND:
| Expression | Evaluated |
|---|---|
x.f == c combined with and at the top level | by the service, before ranking |
!= < <= > >= in not in, x.f.contains(c), or, not | in the adapter on an over-fetch of overfetch * (top + skip) candidates (bounded by max_fetch); the result can be shorter than top |
| text field, vector field, unknown field, chained comparison, other calls | VectorStoreOperationException |
get(top=, skip=, order_by=)without keys reads at mostmax_fetchrecords and orders them in the adapter.include_total_countreports the number of candidates fetched, not the collection size.upsertwith an existing key replaces the record.deleteof an absent key is a no-op.
Tested¶
semantic-kernel 1.45.0, Python 3.12, real hms-server. tests/semantic_kernel/test_semantic_kernel.py runs the idioms from Semantic Kernel's own vector store tests (single and batch upsert/get/delete, get with ordering and paging, search with values and vectors, lambda and string filters, skip), a custom EmbeddingGeneratorBase service, distance-function orientation, model validation errors, collection isolation inside one tenant, a filter whose only match lies beyond the service's page size, and a real Kernel invoking create_search_function through kernel.invoke. Semantic Kernel does not ship a reusable connector conformance suite in the installed package, so this mirrors its in-repo integration tests rather than importing them.
Not run: a real embedding service (the offline HashingEmbedder stands in), and hybrid_search against on-device models.