SemanticKernel/C#:实现接口,接入本地嵌入模型
内容提要
本文介绍了如何通过Codeblaze.SemanticKernel项目实现ITextEmbeddingGenerationService接口,接入本地嵌入模型。通过实现接口中的方法和属性,可以将Ollama中的嵌入模型接入到Codeblaze.SemanticKernel中。文章还提供了使用OllamaTextEmbeddingGeneration类和扩展方法WithOllamaTextEmbeddingGeneration的示例代码。最后,作者展示了使用界面测试了RAG效果和回答效果。
延伸解读
为何需要自定义嵌入接口
Ollama的对话模型已兼容OpenAI格式,可直接通过Semantic Kernel的IChatCompletionService接入,但其嵌入模型尚未兼容OpenAI格式。因此,若想使用Ollama提供的本地嵌入模型,必须自行实现ITextEmbeddingGenerationService接口。这体现了Semantic Kernel的抽象能力:通过实现接口,可以灵活接入不兼容OpenAI格式的模型,而无需修改上层调用逻辑。
实现嵌入服务的关键步骤
实现ITextEmbeddingGenerationService主要需完成GenerateEmbeddingsAsync方法和Attributes属性。Codeblaze.SemanticKernel通过OllamaBase基类封装了通用逻辑,如PingOllamaAsync用于检查模型可用性,并管理Attributes。OllamaTextEmbeddingGeneration类则具体实现GenerateEmbeddingsAsync,向Ollama的/api/embeddings端点发送请求,解析返回的JSO
集成到语义记忆的扩展方法
为了在MemoryBuilder中方便地使用Ollama嵌入,项目提供了WithOllamaTextEmbeddingGeneration扩展方法。它内部调用builder.WithTextEmbeddingGeneration,将OllamaTextEmbeddingGeneration实例注册为文本嵌入生成后端。这样,在构建语义记忆时,只需一行代码即可指定Ollama模型和地址,简化了配置流程,使本地嵌入模型能无缝接入RAG应用。
实际测试与效果
作者使用WPF界面进行了测试,将新闻文本通过Ollama的mxbai-embed-large:335m模型向量化并存入SQLite数据库,然后测试RAG效果。结果显示,结合在线API的Qwen2-72B-Instruct大模型,回答效果良好。这表明,通过自定义嵌入接口,可以混合使用本地嵌入模型和在线大模型,既保护数据隐私又利用云端强大生成能力,为构建高效RAG系统提供了可行方案。
Q&A
如何通过Codeblaze.SemanticKernel接入本地嵌入模型?
可以通过实现ITextEmbeddingGenerationService接口来接入本地嵌入模型,具体方法包括实现接口中的GenerateEmbeddingsAsync方法。
Ollama的嵌入模型与OpenAI格式有什么不同?
Ollama的嵌入模型尚未兼容OpenAI格式,因此需要通过实现ITextEmbeddingGenerationService接口来接入。
示例代码中如何使用OllamaTextEmbeddingGeneration类?
示例代码展示了如何创建OllamaTextEmbeddingGeneration实例,并调用GenerateEmbeddingsAsync方法获取文本嵌入。
MemoryBuilder如何与Ollama的嵌入模型结合使用?
可以通过扩展方法WithOllamaTextEmbeddingGeneration将Ollama作为文本嵌入生成后端接入MemoryBuilder。
如何测试RAG效果和回答效果?
可以使用WPF界面进行测试,通过将文本向量化存入数据库来评估RAG效果和回答效果。
ITextEmbeddingGenerationService接口的主要功能是什么?
ITextEmbeddingGenerationService接口用于生成浮点类型的文本嵌入,提供了生成嵌入的标准方法。