经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
解锁GraphRag.Net的无限可能:手把手教你集成国产模型和本地模型
来源:cnblogs  作者:许泽宇  时间:2024/8/7 8:50:44  对本文有异议

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

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

 

为什么选择GraphRag.Net?

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

默认配置方法

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

  1. // OpenAI配置
  2. builder.Configuration.GetSection("OpenAI").Get<OpenAIOption>();
  3. // 文档切片配置
  4. builder.Configuration.GetSection("TextChunker").Get<TextChunkerOption>();
  5. // 配置数据库连接
  6. builder.Configuration.GetSection("GraphDBConnection").Get<GraphDBConnectionOption>();
  7.  
  8. // 注意,需要先注入配置文件,然后再注入GraphRag.Net
  9. builder.Services.AddGraphRagNet();

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

自定义配置方法

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

  1. var kernelBuild = Kernel.CreateBuilder();
  2. kernelBuild.Services.AddKeyedSingleton<ITextGenerationService>("mock-text", new MockTextCompletion());
  3. kernelBuild.Services.AddKeyedSingleton<IChatCompletionService>("mock-chat", new MockChatCompletion());
  4. kernelBuild.Services.AddSingleton<ITextEmbeddingGenerationService>(new MockTextEmbeddingGeneratorService());
  5. kernelBuild.Services.AddKeyedSingleton("mock-embedding", new MockTextEmbeddingGeneratorService());
  6.  
  7. builder.Services.AddGraphRagNet(kernelBuild.Build());

在这个自定义配置示例中,我们引入了三个自定义服务接口:ITextGenerationServiceIChatCompletionServiceITextEmbeddingGenerationService

实现自定义服务接口

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

实现IChatCompletionService

  1. public class MockChatCompletion : IChatCompletionService
  2. {
  3. private readonly Dictionary<string, object?> _attributes = new();
  4. private string _chatId;
  5.  
  6.  
  7. private static readonly JsonSerializerOptions _jsonSerializerOptions = new()
  8. {
  9. NumberHandling = JsonNumberHandling.AllowReadingFromString,
  10. Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
  11. };
  12.  
  13. public IReadOnlyDictionary<string, object?> Attributes => _attributes;
  14.  
  15. public MockChatCompletion()
  16. {
  17.  
  18. }
  19.  
  20. public async Task<IReadOnlyList<ChatMessageContent>> GetChatMessageContentsAsync(ChatHistory chatHistory, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, [EnumeratorCancellation] CancellationToken cancellationToken = default)
  21. {
  22. StringBuilder sb = new();
  23. string result = $"这是一条Mock数据,便于聊天测试,你的消息是:{chatHistory.LastOrDefault().ToString()}";
  24. return [new(AuthorRole.Assistant, result.ToString())];
  25. }
  26.  
  27. public async IAsyncEnumerable<StreamingChatMessageContent> GetStreamingChatMessageContentsAsync(ChatHistory chatHistory, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, [EnumeratorCancellation] CancellationToken cancellationToken = default)
  28. {
  29. StringBuilder sb = new();
  30. string result = $"这是一条Mock数据,便于聊天测试,你的消息是:{chatHistory.LastOrDefault().ToString()}";
  31. foreach (var c in result)
  32. {
  33. yield return new StreamingChatMessageContent(AuthorRole.Assistant, c.ToString());
  34. }
  35. }
  36. }

  

实现ITextGenerationService

  1. public class MockTextCompletion : ITextGenerationService, IAIService
  2. {
  3. private readonly Dictionary<string, object?> _attributes = new();
  4. private string _chatId;
  5.  
  6. private static readonly JsonSerializerOptions _jsonSerializerOptions = new()
  7. {
  8. NumberHandling = JsonNumberHandling.AllowReadingFromString,
  9. Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
  10. };
  11.  
  12. public IReadOnlyDictionary<string, object?> Attributes => _attributes;
  13.  
  14. public MockTextCompletion()
  15. {
  16.  
  17. }
  18.  
  19. public async Task<IReadOnlyList<TextContent>> GetTextContentsAsync(string prompt, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default)
  20. {
  21. StringBuilder sb = new();
  22. string result = $"这是一条Mock数据,便于聊天测试,你的消息是:{prompt}";
  23. return [new(result.ToString())];
  24. }
  25.  
  26. public async IAsyncEnumerable<StreamingTextContent> GetStreamingTextContentsAsync(string prompt, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default)
  27. {
  28. StringBuilder sb = new();
  29. string result = $"这是一条Mock数据,便于聊天测试,你的消息是:{prompt}";
  30. foreach (var c in result)
  31. {
  32. var streamingTextContent = new StreamingTextContent(c.ToString(), modelId: "mock");
  33.  
  34. yield return streamingTextContent;
  35. }
  36. }
  37. }

实现ITextEmbeddingGenerationService

  1. public sealed class MockTextEmbeddingGeneratorService : ITextEmbeddingGenerationService
  2. {
  3. private Dictionary<string, object?> AttributesInternal { get; } = [];
  4. public IReadOnlyDictionary<string, object?> Attributes => this.AttributesInternal;
  5. public MockTextEmbeddingGeneratorService()
  6. {
  7.  
  8. }
  9. public async Task<IList<ReadOnlyMemory<float>>> GenerateEmbeddingsAsync(
  10. IList<string> data,
  11. Kernel? kernel = null,
  12. CancellationToken cancellationToken = default)
  13. {
  14. IList<ReadOnlyMemory<float>> results = new List<ReadOnlyMemory<float>>();
  15.  
  16. float[] array1 = { 1.0f, 2.0f, 3.0f };
  17. float[] array2 = { 4.0f, 5.0f, 6.0f };
  18. float[] array3 = { 7.0f, 8.0f, 9.0f };
  19.  
  20. // 将数组包装为ReadOnlyMemory<float>并添加到列表中
  21. results.Add(new ReadOnlyMemory<float>(array1));
  22. results.Add(new ReadOnlyMemory<float>(array2));
  23. results.Add(new ReadOnlyMemory<float>(array3));
  24.  
  25. return results;
  26. }
  27.  
  28. public void Dispose()
  29. {
  30.  
  31. }
  32. }

  

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

 

结语

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

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

 

原文链接:https://www.cnblogs.com/xuzeyu/p/18343527

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号