Files
semantic-kernel/python/semantic_kernel/memory/memory_query_result.py
T
Abby Harrison 6cbea85fd8 Python: Add additional_metadata field to MemoryRecord and address TODOs in ChromaMemoryStore (#1323)
### Motivation and Context
Closes #1271 and addresses several TODOs in ChromaMemoryStore


### Description
- added field `additional_metadata` to `MemoryRecord` and all downstream
methods/classes (see `SemanticTextMemoryBase`, `SemanticTextMemory`,
`MemoryQueryResult`, and `ChromaMemoryStore`)
- addressed ChromaMemoryStore TODO 'what is key used for?' For chromadb,
key and id are effectively the same value, but the two fields are
differentiated for memory stores like Qdrant which require that key be a
uuid. I updated the logic so that this is more apparent. Note that this
results in no change in end-user functionality.
- Updated ChromaMemoryStore TODO 'get_async say embedding is optional
but Record constructor requires it.` MemoryRecord constructor no longer
requires an embedding. Logic is updated and a test added to show that
embedding retrieval is functionally optional.
2023-06-07 15:33:51 -07:00

78 lines
2.5 KiB
Python

# Copyright (c) Microsoft. All rights reserved.
from typing import Optional
from numpy import ndarray
from semantic_kernel.memory.memory_record import MemoryRecord
class MemoryQueryResult:
is_reference: bool
external_source_name: Optional[str]
id: str
description: Optional[str]
text: Optional[str]
additional_metadata: Optional[str]
relevance: float
embedding: Optional[ndarray]
def __init__(
self,
is_reference: bool,
external_source_name: Optional[str],
id: str,
description: Optional[str],
text: Optional[str],
additional_metadata: Optional[str],
embedding: Optional[ndarray],
relevance: float,
) -> None:
"""Initialize a new instance of MemoryQueryResult.
Arguments:
is_reference {bool} -- Whether the record is a reference record.
external_source_name {Optional[str]} -- The name of the external source.
id {str} -- A unique for the record.
description {Optional[str]} -- The description of the record.
text {Optional[str]} -- The text of the record.
embedding {ndarray} -- The embedding of the record.
relevance {float} -- The relevance of the record to a known query.
Returns:
None -- None.
"""
self.is_reference = is_reference
self.external_source_name = external_source_name
self.id = id
self.description = description
self.text = text
self.additional_metadata = additional_metadata
self.relevance = relevance
self.embedding = embedding
@staticmethod
def from_memory_record(
record: MemoryRecord,
relevance: float,
) -> "MemoryQueryResult":
"""Create a new instance of MemoryQueryResult from a MemoryRecord.
Arguments:
record {MemoryRecord} -- The MemoryRecord to create the MemoryQueryResult from.
relevance {float} -- The relevance of the record to a known query.
Returns:
MemoryQueryResult -- The created MemoryQueryResult.
"""
return MemoryQueryResult(
is_reference=record._is_reference,
external_source_name=record._external_source_name,
id=record._id,
description=record._description,
text=record._text,
additional_metadata=record._additional_metadata,
embedding=record._embedding,
relevance=relevance,
)