🐈

Cognitive SearchをメモリとしてSemantic Kernelを使用する方法

2023/07/25に公開

概要

Semantic KernelでCognitive SearchをMemoryとして使用できる実装がPythonにも入ったようなので試してみました。

実装と検証

Storeの生成。1536はAdaのEmbeddingの次元数。

import os
from dotenv import load_dotenv
from azure.identity import DefaultAzureCredential
from semantic_kernel.connectors.memory.azure_cognitive_search import AzureCognitiveSearchMemoryStore

load_dotenv()
"""
例は.NETですがこの辺り参考にCredentialを
https://learn.microsoft.com/ja-jp/azure/search/search-howto-aad?tabs=config-svc-rest%2Caad-dotnet
"""
credential = DefaultAzureCredential()
memory_store = AzureCognitiveSearchMemoryStore(
    vector_size=1536,
    search_endpoint=os.getenv("COGNITIVE_SEARCH_ENDPOINT"),
    admin_key=os.getenv("COGNITIVE_SEARCH_ADMIN_KEY"),
    azure_credentials=credential
)

semantic kernelでテキストをベクトルとしてCognitive Searchに登録

import semantic_kernel as sk
import asyncio
import uuid
from semantic_kernel.connectors.ai.open_ai import AzureTextEmbedding

kernel = sk.Kernel()
loop = asyncio.get_event_loop()
kernel.add_text_embedding_generation_service(
    "ada",
  AzureTextEmbedding(
      "text-embedding-ada-002",
      os.getenv("EMBEDDING_OPENAI_ENDPOINT"),
     os.getenv("EMBEDDING_OPENAI_API_KEY")
  )
)
kernel.register_memory_store(memory_store=memory_store)
loop.run_until_complete(kernel.memory.save_information_async(
    collection="インデックスの名前",
    id=str(uuid.uuid4()),
    text="サイベリアンは可愛い。このサイベリアンの名前は「いくと」です。"
))

埋め込みを作る過程はラップしてあって便利。外部記憶としてこんな感じでサクッと保存できるの良いですね。クエリ実行編も時間があれば🙂全体的に実装が非同期なのは処理に時間がかかるものが多いからですかね👀

Cognitive Searchのエクスプローラで見ると以下のようにデータが作成されていた

参考資料

この辺りを参考にしました

memory storeとしてのCognitive Searchのクラス
https://github.com/microsoft/semantic-kernel/blob/main/python/semantic_kernel/connectors/memory/azure_cognitive_search/azure_cognitive_search_memory_store.py

保存処理などの実装
https://github.com/microsoft/semantic-kernel/blob/main/python/semantic_kernel/memory/semantic_text_memory.py

sample
https://github.com/microsoft/semantic-kernel/blob/main/python/samples/kernel-syntax-examples/memory.py

Discussion