解锁GraphRag.Net的无限可能:手把手教你集成国产模型和本地模型

在上次的文章中,我们已经详细介绍了GraphRag的基本功能和使用方式。如果你还不熟悉,建议先阅读前面的文章

通过前两篇文章,相信你已经了解到GraphRag.Net目前只支持OpenAI规范的接口,但许多小伙伴在社区中提议,希望能增加对本地模型(例如:ollama等)的支持。所以这次,我们将探讨如何在GraphRag.Net中使用自定义模型和本地模型。

为什么选择GraphRag.Net

GraphRag.Net 采用了Semantic Kernel 作为基础,让我们能够非常简洁地抽象出会话与向量接口。因此,用户可以非常方便地实现自己定制的解决方案。接下来,我们会通过一个具体的例子,展示如何将本地模型和国产模型集成到GraphRag.Net中。

默认配置方法

首先,我们来看看如何进行默认配置:

复制代码
// OpenAI配置
builder.Configuration.GetSection("OpenAI").Get<OpenAIOption>();
// 文档切片配置
builder.Configuration.GetSection("TextChunker").Get<TextChunkerOption>();
// 配置数据库连接
builder.Configuration.GetSection("GraphDBConnection").Get<GraphDBConnectionOption>();

// 注意,需要先注入配置文件,然后再注入GraphRag.Net
builder.Services.AddGraphRagNet();

这里,我们将在默认配置中注入OpenAI的配置、文本切片的配置和数据库连接的配置。然后,依次注入这些配置文件和GraphRag.Net的服务。

自定义配置方法

如果需要自定义模型或本地模型,可能需要实现一些额外的服务接口,下面是自定义配置的示例:

复制代码
var kernelBuild = Kernel.CreateBuilder();
kernelBuild.Services.AddKeyedSingleton<ITextGenerationService>("mock-text", new MockTextCompletion());
kernelBuild.Services.AddKeyedSingleton<IChatCompletionService>("mock-chat", new MockChatCompletion());
kernelBuild.Services.AddSingleton<ITextEmbeddingGenerationService>(new MockTextEmbeddingGeneratorService());
kernelBuild.Services.AddKeyedSingleton("mock-embedding", new MockTextEmbeddingGeneratorService());

builder.Services.AddGraphRagNet(kernelBuild.Build());

在这个自定义配置示例中,我们引入了三个自定义服务接口:ITextGenerationServiceIChatCompletionService 和**ITextEmbeddingGenerationService**。

实现自定义服务接口

接下来,我们需要为每个服务接口提供具体的实现。以下是三个接口的具体实现:

实现**IChatCompletionService**

复制代码
  public class MockChatCompletion : IChatCompletionService
  {
      private readonly Dictionary<string, object?> _attributes = new();
      private string _chatId;


      private static readonly JsonSerializerOptions _jsonSerializerOptions = new()
      {
          NumberHandling = JsonNumberHandling.AllowReadingFromString,
          Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
      };

      public IReadOnlyDictionary<string, object?> Attributes => _attributes;

      public MockChatCompletion()
      {

      }

      public async Task<IReadOnlyList<ChatMessageContent>> GetChatMessageContentsAsync(ChatHistory chatHistory, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, [EnumeratorCancellation] CancellationToken cancellationToken = default)
      {
          StringBuilder sb = new();
          string result = $"这是一条Mock数据,便于聊天测试,你的消息是:{chatHistory.LastOrDefault().ToString()}";
          return [new(AuthorRole.Assistant, result.ToString())];
      }

      public async IAsyncEnumerable<StreamingChatMessageContent> GetStreamingChatMessageContentsAsync(ChatHistory chatHistory, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, [EnumeratorCancellation] CancellationToken cancellationToken = default)
      {
          StringBuilder sb = new();
          string result = $"这是一条Mock数据,便于聊天测试,你的消息是:{chatHistory.LastOrDefault().ToString()}";
          foreach (var c in result)
          {
              yield return new StreamingChatMessageContent(AuthorRole.Assistant, c.ToString());
          }
      }
  }

  

实现ITextGenerationService

复制代码
 public class MockTextCompletion : ITextGenerationService, IAIService
 {
     private readonly Dictionary<string, object?> _attributes = new();
     private string _chatId;

     private static readonly JsonSerializerOptions _jsonSerializerOptions = new()
     {
         NumberHandling = JsonNumberHandling.AllowReadingFromString,
         Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
     };

     public IReadOnlyDictionary<string, object?> Attributes => _attributes;

     public MockTextCompletion()
     {

     }

     public async Task<IReadOnlyList<TextContent>> GetTextContentsAsync(string prompt, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default)
     {
         StringBuilder sb = new();
         string result = $"这是一条Mock数据,便于聊天测试,你的消息是:{prompt}";
         return [new(result.ToString())];
     }

     public async IAsyncEnumerable<StreamingTextContent> GetStreamingTextContentsAsync(string prompt, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default)
     {
         StringBuilder sb = new();
         string result = $"这是一条Mock数据,便于聊天测试,你的消息是:{prompt}";
         foreach (var c in result)
         {
             var streamingTextContent = new StreamingTextContent(c.ToString(), modelId: "mock");

             yield return streamingTextContent;
         }
     }
 }

实现ITextEmbeddingGenerationService

复制代码
  public sealed class MockTextEmbeddingGeneratorService : ITextEmbeddingGenerationService
  {
      private Dictionary<string, object?> AttributesInternal { get; } = [];
      public IReadOnlyDictionary<string, object?> Attributes => this.AttributesInternal;
      public MockTextEmbeddingGeneratorService()
      {

      }
      public async Task<IList<ReadOnlyMemory<float>>> GenerateEmbeddingsAsync(
        IList<string> data,
        Kernel? kernel = null,
        CancellationToken cancellationToken = default)
      {
          IList<ReadOnlyMemory<float>> results = new List<ReadOnlyMemory<float>>();

          float[] array1 = { 1.0f, 2.0f, 3.0f };
          float[] array2 = { 4.0f, 5.0f, 6.0f };
          float[] array3 = { 7.0f, 8.0f, 9.0f };

          // 将数组包装为ReadOnlyMemory<float>并添加到列表中
          results.Add(new ReadOnlyMemory<float>(array1));
          results.Add(new ReadOnlyMemory<float>(array2));
          results.Add(new ReadOnlyMemory<float>(array3));

          return results;
      }

      public void Dispose()
      {

      }
  }

  

看到这里,你可能已经发现,集成自定义模型和本地模型非常简单。只需按照上述步骤,实现相应的接口并注入配置,你就可以在GraphRag.Net中使用这些自定义的功能。

结语

通过本文的介绍,我们了解了如何在GraphRag.Net 中集成国产模型和本地模型。希望大家能够根据这些示例,开发出更多适合自己需求的功能。更多精彩内容,欢迎关注我的公众号,并发送进群加入我们的GraphRag.Net交流群,与社区小伙伴们一起交流学习!

感谢阅读,我们下期再见!

相关推荐
带刺的坐椅4 小时前
从 Claude Code 隐私争议,看 SolonCode 的设计选择
ai·llm·agent·claudecode·soloncode·codingplan
lincats8 小时前
Claude Code项目越写越乱?这套清理流程能救你
ai·ai agent·claude code
云燕实验室CloudLab12 小时前
《AI开始"抱团"思考了!多智能体 + 思维图到底有多强?》
ai·学习工具·智慧学伴
小七-七牛开发者12 小时前
论文解读:DeepSeek DSpark 在真实高并发推理服务中,如何保证 Token 生成又好又快?
ai·大模型·编程·ai coding
doiito19 小时前
【Agent Harness】Gliding Horse 核心设计理念,不跟风开发自己的AI Agent
ai·rust·架构设计·系统设计·ai agent
doiito2 天前
【Agent Harness】Gliding Horse 的 L2 作战地图:让多 Agent 协作从“摸黑”变成“透明”
ai·rust·架构设计·系统设计·ai agent
xiezhr2 天前
逛GitHub发现一款免费带有AI功能的数据库管理工具DBX
ai·开源软件·自然语言·数据库管理工具
垚森4 天前
我用 GLM-5.2 造了个炸裂主题后台:16 套主题随心切,可在线体验
ai·react
doiito4 天前
【Agent Harness】Gliding Horse 工具结果压缩体系:如何用“指针”驯服上下文膨胀
ai·rust·架构设计·系统设计·ai agent
doiito5 天前
【Agent Harness】Gliding Horse 上下文动态感知与智能压缩:让 Agent 真正“听得进”每一句话
ai·rust·架构设计·系统设计·ai agent