来源:互联网 更新时间:2026-08-22 14:46
前两篇文章聊下来,大家应该已经清楚
GraphRag.Net 底层基于
先回顾一下默认配置长什么样——这也是理解自定义配置的基础:
// OpenAI配置
builder.Configuration.GetSection("OpenAI").Get();
// 文档切片配置
builder.Configuration.GetSection("TextChunker").Get();
// 配置数据库连接
builder.Configuration.GetSection("GraphDBConnection").Get();
// 注意,需要先注入配置文件,然后再注入GraphRag.Net
builder.Services.AddGraphRagNet();
这段代码做的事情很清晰:注入 OpenAI 的配置、文本切片的配置和数据库连接的配置,然后注册 GraphRag.Net 的服务。默认情况下,它自然使用的是 OpenAI 的接口。
如果想把背后的模型换成自定义的,需要自己实现几个关键服务接口。下面是一个完整的自定义配置示例:
var kernelBuild = Kernel.CreateBuilder();
kernelBuild.Services.AddKeyedSingleton("mock-text", new MockTextCompletion());
kernelBuild.Services.AddKeyedSingleton("mock-chat", new MockChatCompletion());
kernelBuild.Services.AddSingleton(new MockTextEmbeddingGeneratorService());
kernelBuild.Services.AddKeyedSingleton("mock-embedding", new MockTextEmbeddingGeneratorService());
builder.Services.AddGraphRagNet(kernelBuild.Build());
这里用到了三个核心接口:
ITextGenerationServiceIChatCompletionServiceITextEmbeddingGenerationService接下来,我们分别给出三个接口的示例实现(这里是 Mock 版本,方便你理解骨架,实际替换成本地模型的 API 调用即可)。
IChatCompletionServicepublic class MockChatCompletion : IChatCompletionService
{
private readonly Dictionary _attributes = new();
private string _chatId;
private static readonly JsonSerializerOptions _jsonSerializerOptions = new()
{
NumberHandling = JsonNumberHandling.AllowReadingFromString,
Encoder = Ja vaScriptEncoder.Create(UnicodeRanges.All)
};
public IReadOnlyDictionary Attributes => _attributes;
public MockChatCompletion() { }
public async Task> GetChatMessageContentsAsync(
ChatHistory chatHistory,
PromptExecutionSettings? executionSettings = null,
Kernel? kernel = null,
CancellationToken cancellationToken = default)
{
string result = $"这是一条Mock数据,便于聊天测试,你的消息是:{chatHistory.LastOrDefault().ToString()}";
return [new(AuthorRole.Assistant, result.ToString())];
}
public async IAsyncEnumerable GetStreamingChatMessageContentsAsync(
ChatHistory chatHistory,
PromptExecutionSettings? executionSettings = null,
Kernel? kernel = null,
CancellationToken cancellationToken = default)
{
string result = $"这是一条Mock数据,便于聊天测试,你的消息是:{chatHistory.LastOrDefault().ToString()}";
foreach (var c in result)
{
yield return new StreamingChatMessageContent(AuthorRole.Assistant, c.ToString());
}
}
}
ITextGenerationServicepublic class MockTextCompletion : ITextGenerationService, IAIService
{
private readonly Dictionary _attributes = new();
private string _chatId;
private static readonly JsonSerializerOptions _jsonSerializerOptions = new()
{
NumberHandling = JsonNumberHandling.AllowReadingFromString,
Encoder = Ja vaScriptEncoder.Create(UnicodeRanges.All)
};
public IReadOnlyDictionary Attributes => _attributes;
public MockTextCompletion() { }
public async Task> GetTextContentsAsync(
string prompt,
PromptExecutionSettings? executionSettings = null,
Kernel? kernel = null,
CancellationToken cancellationToken = default)
{
string result = $"这是一条Mock数据,便于聊天测试,你的消息是:{prompt}";
return [new(result.ToString())];
}
public async IAsyncEnumerable GetStreamingTextContentsAsync(
string prompt,
PromptExecutionSettings? executionSettings = null,
Kernel? kernel = null,
CancellationToken cancellationToken = default)
{
string result = $"这是一条Mock数据,便于聊天测试,你的消息是:{prompt}";
foreach (var c in result)
{
yield return new StreamingTextContent(c.ToString(), modelId: "mock");
}
}
}
ITextEmbeddingGenerationServicepublic sealed class MockTextEmbeddingGeneratorService : ITextEmbeddingGenerationService
{
private Dictionary AttributesInternal { get; } = [];
public IReadOnlyDictionary Attributes => this.AttributesInternal;
public MockTextEmbeddingGeneratorService() { }
public async Task>> GenerateEmbeddingsAsync(
IList data,
Kernel? kernel = null,
CancellationToken cancellationToken = default)
{
IList> results = new List>();
float[] array1 = { 1.0f, 2.0f, 3.0f };
float[] array2 = { 4.0f, 5.0f, 6.0f };
float[] array3 = { 7.0f, 8.0f, 9.0f };
results.Add(new ReadOnlyMemory(array1));
results.Add(new ReadOnlyMemory(array2));
results.Add(new ReadOnlyMemory(array3));
return results;
}
public void Dispose() { }
}
看到这里,你应该已经发现了——整个集成思路其实很直白:把三个接口按照你需要调用的模型逻辑实现一遍,然后在初始化时注入到 Kernel 里,再传给 GraphRag.Net。无论是国产模型(比如百度文心、阿里通义)还是本地部署的 ollama、llama.cpp,都可以用同样的模式接入。只需要把 Mock 代码里返回固定字符串的逻辑,换成真正的 HTTP 调用或本地推理接口即可。
通过这几步,你就能在 GraphRag.Net 中自由切换模型了。实际项目中,你只需要根据自己的模型 SDK 替换掉实现类中的核心逻辑。希望这个框架能帮你省下大量对接和抽象的工作,让你更专注于业务本身。如果有任何疑问,欢迎在社区里一起讨论。
感谢阅读,我们下期再见。
腾讯ima怎么把微信内容一键导入知识库?
黄金价格不断创新高!黄金稳定币XAU、PAXG市值达11亿美元
CC币价格预测(2026-2035):Canton币今日价格走势+长期价格预测
腾讯ima怎么创建共享知识库?
Celestia价格预测2026-2032:TIA币能否引领山寨币上涨行情?历史价格回顾
新浪互联网热点小时报丨2026年07月26日16时_今日实时互联网热点速递
新浪机器学习热点小时报丨2026年07月25日18时_今日实时机器学习热点速递
比特币(BTC)核心周期指标复刻历史走势 价格或跌破5.8万美元关键支撑位
新浪人工智能热点小时报丨2026年07月30日18时_今日实时人工智能热点速递
WorkBuddy微信版怎么获得积分?
车载冰箱重置到出厂设置几步?
5000元起的鼠标哪个最值得入手?
比特币 2025 年价格预测:BTC 的未来走势
笔记本移动电源推荐哪款?
结婚家电首选:Leader懒人三筒Ultra热泵洗烘一体
短剧《史上最强洪荒修为》剧情介绍
kimi提示词专家使用方法新手指南
Aptos(APT)2026-2032年价格预测与历史走势梳理
短剧《仙人跳获透视,古玩玉器我全拿捏》剧情介绍
腾讯ima知识库怎么分类管理?
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc