如何将Microsoft Semantic Kernel代码从SimpleVectorStore迁移至Chroma
解决Semantic Kernel从SimpleVectorStore迁移到ChromaStore的问题
问题原因
ChromaStore的API设计和SimpleVectorStore不同,它没有add_documents这个同步方法,需要改用异步的add_async方法,或通过VectorStoreClient封装统一操作。
正确迁移步骤
1. 安装必要依赖
确保已安装相关包:
pip install semantic-kernel chromadb
2. 修改向量存储初始化代码
替换原SimpleVectorStore的初始化逻辑,改为ChromaStore:
import chromadb from semantic_kernel.connectors.memory.chroma import ChromaStore from semantic_kernel.memory import VectorStoreClient # 初始化Chroma客户端,支持本地持久化或内存模式 chroma_client = chromadb.PersistentClient(path="./travel_chroma_db") # 本地持久化存储 # 内存模式:chroma_client = chromadb.InMemoryClient() # 初始化ChromaStore,指定集合名称 chroma_store = ChromaStore( client=chroma_client, collection_name="travel_guide" ) # 可选:封装为VectorStoreClient,统一操作接口 memory_store = VectorStoreClient(chroma_store)
3. 替换文档添加逻辑
原add_documents调用需替换为异步的add_async方法,同步代码需用asyncio.run包裹执行:
异步代码示例
import asyncio from semantic_kernel.contents.document_content import DocumentContent async def add_travel_documents(): # 构造要添加的文档列表 travel_docs = [ DocumentContent(text="北京故宫是明清两代皇家宫殿,建议游玩3小时", id="beijing_gugong"), DocumentContent(text="上海外滩夜景绝美,适合傍晚前往观赏", id="shanghai_bund") ] # 批量添加文档到ChromaStore await chroma_store.add_async(documents=travel_docs) # 或用VectorStoreClient执行:await memory_store.add_async(documents=travel_docs) asyncio.run(add_travel_documents())
同步代码兼容处理
如果原有代码是同步逻辑,可通过asyncio包裹异步方法:
import asyncio from semantic_kernel.contents.document_content import DocumentContent def add_docs_sync(doc_list): asyncio.run(chroma_store.add_async(documents=doc_list)) # 调用示例 docs = [DocumentContent(text="成都火锅以麻辣鲜香著称,推荐春熙路周边门店", id="chengdu_hotpot")] add_docs_sync(docs)
4. 修改文档检索逻辑
检索操作同样需使用异步方法get_nearest_matches_async:
async def retrieve_travel_info(query_text): results = await chroma_store.get_nearest_matches_async( collection_name="travel_guide", query_text=query_text, limit=3 ) for item in results: print(f"相关内容: {item.text}, 相似度: {item.relevance_score:.2f}") asyncio.run(retrieve_travel_info("北京必去景点"))
关键注意点
- ChromaStore的核心操作均为异步,需遵循
async/await语法规则 - 必须将待添加内容封装为
DocumentContent类型,不能直接传入原始文本 - 若使用远程Chroma服务,需将客户端初始化改为
chromadb.HttpClient(host="your-host", port=8000)
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

