🐈
Cognitive SearchをメモリとしてSemantic Kernelを使用する方法
概要
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のクラス
保存処理などの実装
sample
Discussion