SemanticKernel/C#:使用Ollama中的对话模型与嵌入模型用于本地离线场景

💡 原文中文,约4700字,阅读约需12分钟。
📝

内容提要

本文介绍了在SemanticKernel/C#中使用Ollama的对话模型与嵌入模型用于本地离线场景的方法。对话模型是gemma2:2b,嵌入模型是all-minilm:latest。使用方法见https://github.com/BLaZeKiLL/Codeblaze.SemanticKernel/tree/main/dotnet/Codeblaze.SemanticKernel.Connectors.Ollama。

🔎

延伸解读

对话模型接入:利用OpenAI兼容性简化开发

Ollama自2024年2月8日起兼容OpenAI Chat Completions API,因此在SemanticKernel中可直接使用AddOpenAIChatCompletion方法,指定模型如gemma2:2b和本地端点即可。这避免了为对话模型单独实现接口,降低了集成复杂度。但需注意,此兼容性仅针对对话模型,嵌入模型尚未兼容。

嵌入模型集成:需第三方库或自行实现

Ollama的嵌入模型不兼容OpenAI格式,无法直接通过请求转发使用。开发者可参考GitHub上的Codeblaze.SemanticKernel项目,它实现了EmbeddingGeneration等接口。通过安装该包并构建ISemanticTextMemory,即可在SemanticKernel中使用Ollama的嵌入模型,如all-minilm:latest。若只需嵌入功能,也可借鉴代码自行实现以减少依赖。

RAG效果调优:切片大小与相关度阈值是关键

实践表明,切片大小和相关度设定对RAG效果影响显著。切片过小可能丢失上下文,过大则引入噪声;相关度阈值过高可能导致检索不到结果,过低则引入不相关数据。需要根据具体文档和需求调整TextChunker的分割参数以及SearchAsync的limit和minRelevanceScore,通过实验找到平衡点。

本地离线方案的性能考量与替代选择

本地运行Ollama模型对硬件要求较高,响应可能较慢,如示例中回答一个问题耗时几十秒。若条件允许,可换用更大模型提升效果;若无需严格离线,可结合在线API(如Qwen/Qwen2-7B-Instruct)与本地嵌入模型,以平衡效果与速度。这为不同场景提供了灵活的选择。

❓

Q&A

如何在SemanticKernel/C#中使用Ollama的对话模型?

可以通过创建一个kernel并使用AddOpenAIChatCompletion方法来实现,示例代码为:var kernel = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId: 'gemma2:2b', apiKey: null, endpoint: new Uri('http://localhost:11434')).Build();

Ollama的嵌入模型与OpenAI格式有什么不同?

Ollama的嵌入模型不兼容OpenAI格式,因此需要自行实现接口来使用。

在使用Ollama的过程中遇到的问题有哪些?

主要问题包括嵌入模型的接口兼容性和切片大小、相关度设定对效果的影响。

如何构建ISemanticTextMemory以使用Ollama的嵌入模型?

可以通过MemoryBuilder构建ISemanticTextMemory,示例代码为:var builder = new MemoryBuilder().WithOllamaTextEmbeddingGeneration('all-minilm:latest', embeddingEndpoint);

在本地离线场景中使用Ollama的优势是什么?

使用Ollama可以在没有网络连接的情况下进行对话和嵌入模型的操作,适合需要离线处理的应用场景。

如何提高Ollama模型的回答效果?

可以通过调整切片大小和相关度设定来提高模型的回答效果,确保设置满足需求。

🏷️

标签

➡️

继续阅读