레거시 메모리 스토어

레거시 메모리 스토어 (Memory Stores)

Semantic Kernel은 메모리 스토어(Memory Store) 추상화를 제공했어요. 핵심 인터페이스는 Microsoft.SemanticKernel.Memory.IMemoryStore죠. 그런데 메모리 스토어는 이제 '레거시'로 분류됩니다. 벡터 저장·검색 능력을 키우는 과정에서 새 추상화인 벡터 스토어(Vector Store) 로 교체되고 있어요. 새로 작업을 시작하신다면 벡터 스토어 추상화를 쓰는 걸 권장해요.

메모리 스토어와 벡터 스토어 비교

두 추상화의 목적은 비슷하지만, 인터페이스가 다르고 벡터 스토어가 더 넓은 기능을 제공해요. 표로 정리하면 이해가 빨라집니다.

특성 레거시 메모리 스토어 벡터 스토어
주요 인터페이스 IMemoryStore VectorStore
추상화 nuget 패키지 Microsoft.SemanticKernel.Abstractions Microsoft.Extensions.VectorData.Abstractions
네이밍 컨벤션 {Provider}MemoryStore (예: RedisMemoryStore) {Provider}VectorStore (예: RedisVectorStore)
레코드 upsert·get·delete 지원 지원
컬렉션 생성·삭제 지원 지원
벡터 검색 지원 지원
벡터 검색 인덱스·거리 함수 선택 불가 지원
레코드당 여러 벡터 불가 지원
커스텀 스키마 불가 지원
여러 벡터 타입 불가 지원
벡터 검색 전 메타데이터 선필터링 불가 지원
벡터가 아닌 DB에서 온전한 데이터셋을 클라이언트로 받아 로컬 벡터 검색 지원 불가

핵심 차이는 '얼마나 유연하게 내 데이터를 표현하고 검색 앞단에 필터를 걸 수 있는가'예요. 벡터 스토어는 스키마를 내가 골라서, 레코드에 벡터를 여러 개 넣고, 검색 전에 메타데이터로 선필터링까지 할 수 있어요.

메모리 스토어 커넥터 목록

Semantic Kernel은 정보를 저장·조회하는 데 쓰는 메모리 스토어 커넥터를 여럿 제공해요. 대표적으로 Azure Cosmos DB for NoSQL, vCore 기반 Azure Cosmos DB for MongoDB, Azure AI Search, Azure PostgreSQL Server, Azure SQL Database, Chroma, DuckDB, Milvus, MongoDB Atlas Vector Search, Pinecone, Postgres, Qdrant, Redis, Sqlite, Weaviate 등이 있어요. 언어 지원은 커넥터마다 달라서 C#만 되는 것, Python까지 되는 것이 섞여 있어요. 세부 지원 여부는 각 커넥터 문서를 확인하는 게 좋아요.

메모리 스토어에서 벡터 스토어로 이전하기

벡터 스토어 추상화로 바꾸는 데는 크게 두 가지 방법이 있어요.

기존 컬렉션을 벡터 스토어로 그대로 쓰기

가장 간단한 방법은 메모리 스토어로 만든 컬렉션에 벡터 스토어 추상화로 접근하는 거예요. 벡터 스토어는 스키마를 직접 고를 수 있기 때문에, 레거시 메모리 스토어 구현이 쓴 스키마와 일치하는 데이터 모델만 만들어 주면 되는 경우가 많죠.

예를 들어 Azure AI Search 메모리 스토어가 만든 컬렉션에 접근하려면 아래 같은 벡터 스토어 데이터 모델을 쓰면 돼요.

using Microsoft.Extensions.VectorData;

class VectorStoreRecord
{
    [VectorStoreKey]
    public string Id { get; set; }

    [VectorStoreData]
    public string Description { get; set; }

    [VectorStoreData]
    public string Text { get; set; }

    [VectorStoreData]
    public bool IsReference { get; set; }

    [VectorStoreData]
    public string ExternalSourceName { get; set; }

    [VectorStoreData]
    public string AdditionalMetadata { get; set; }

    [VectorStoreVector(VectorSize)]
    public ReadOnlyMemory<float> Embedding { get; set; }
}

새 컬렉션을 만들어 이전하기

어떤 경우엔 기존 컬렉션을 그대로 쓰기보다 새 컬렉션으로 옮기는 게 나아요. 특히 필터링 관점에서 메모리 스토어가 고른 스키마가 요구사항과 안 맞을 때죠.

예를 들어 Redis 메모리 스토어는 string metadata, long timestamp, float[] embedding 세 필드 스키마를 써요. 벡터·타임스탬프를 제외한 모든 데이터가 직렬화된 JSON 문자열로 Metadata 필드에 들어가요. 이러면 개별 값을 인덱싱해서 필터링할 수 없어요. ExternalSourceName으로 필터링하고 싶어도, 그 값이 JSON 문자열 안에 있는 동안엔 불가능하죠.

이럴 땐 평탄한(flat) 스키마의 새 컬렉션으로 데이터를 옮기는 게 낫습니다. 원본 데이터로 새 컬렉션을 만들거나, 단순히 옛 데이터를 새 컬렉션으로 매핑·복사하는 두 선택지가 있어요. 첫 번째는 소스 데이터에서 임베딩을 재생성해야 해서 비용이 더 들 수 있어요.

출처: https://learn.microsoft.com/en-us/semantic-kernel/concepts/vector-store-connectors/memory-stores