当前位置: 首页 > news >正文

(三) Dotnet为AI控制台对话添加依赖注入等集成

image.png

依赖注入

日常使用过程中,并不是直接构造IChatClient 实例,而是使用微软自带的依赖注入类库进行实例化生命周期管理。

引用依赖

添加nuget 包引用Microsoft.Extensions.Hosting

<Project Sdk="Microsoft.NET.Sdk"><ItemGroup><PackageReference Include="Microsoft.Extensions.AI" Version="9.9.1" /><PackageReference Include="Microsoft.Extensions.AI.Abstractions" Version="9.9.1" /><PackageReference Include="Microsoft.Extensions.AI.OpenAI" Version="9.9.1-preview.1.25474.6" /><PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.0-rc.1.25451.107" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.0-rc.1.25451.107" /></ItemGroup>
</Project>

主程序代码

创建Host 构建实例,用于添加指出配置,此处添加缓存服务Microsoft.Extensions.Caching.Memory,以内存作为缓存介质;进行IChatClient 实现类服务注册时,需要全局引入Microsoft.Extensions.AI,该Nuget 包含AddChatClient()
代码修改如下:

internal class Program
{async static Task Main(string[] args){// 省略不变内容//-------------------------依赖注入---------------------------------// 构建默认主机构建器实例var builder = Host.CreateApplicationBuilder();// 添加缓存服务-内存作为缓存介质builder.Services.AddDistributedMemoryCache();// 注册IChatClient实现类型builder.Services.AddChatClient(new OpenAI.Chat.ChatClient(model, new ApiKeyCredential(apikey), new OpenAIClientOptions{Endpoint = new Uri(endpoint) // 指定api访问地址}).AsIChatClient()) // 注册ichatclient实例.UseLogging(); // 使用日志// 构建Host实例var host = builder.Build();// 获取ichatclient实现实例IChatClient client = host.Services.GetRequiredService<IChatClient>();//-------------------------依赖注入---------------------------------// 输入上下文 添加多轮会话历史 GetResponseAsync() 接受消息列表// 获取http请求响应(非流式)List<ChatMessage> history = [new ChatMessage(ChatRole.Assistant, "你是一个英语助手,拥有10年初中教学经验,对于用户提问,英文回复并用中文解释。")]; // 构建基本背景消息Console.WriteLine("开始会话,输入 bye 结束会话。");// 省略不变内容
}

运行后与直接构建实例无体验区别。
Pasted image 20251005142747.png

缓存处理

如果同一个问答内容,都调用模型,这明显有点浪费资源,添加上缓存,提高响应性能,降低资源损耗。
官方案例中,缓存主要添加在构建IChatClient 之前,并且是ChatClientBuilder 实例的扩展方法。

IChatClient client = new ChatClientBuilder(<ichatclient实例>) .UseDistributedCache(new MemoryDistributedCache( Options.Create(new MemoryDistributedCacheOptions()))) .Build();

实际AddChatClient() 返回类型就是ChatClientBuilder,因此可以直接在案例代码中进行修改。

// 省略不变内容
// 构建默认主机构建器实例
var builder = Host.CreateApplicationBuilder();
// 添加缓存服务-内存作为缓存介质
builder.Services.AddDistributedMemoryCache();
// 注册IChatClient实现类型
builder.Services.AddChatClient(new OpenAI.Chat.ChatClient(model, new ApiKeyCredential(apikey), new OpenAIClientOptions
{Endpoint = new Uri(endpoint) // 指定api访问地址
})
.AsIChatClient()) // 注册ichatclient实例
//-------------------------添加缓存---------------------------------.UseDistributedCache(new MemoryDistributedCache(Options.Create(new MemoryDistributedCacheOptions()))) // 使用缓存
//-------------------------添加缓存---------------------------------.UseLogging(); // 使用日志
// 省略不变内容

断点时局部变量(由于使用了日志,所以对象是AILogingChatClient)。
无缓存。
Pasted image 20251005150635.png
有缓存。
Pasted image 20251005150308.png

对话配置

默认问话模型服务,直接进行调用,需要对模型服务附带一些请求附加参数配置时,例如modelidTopPTopKTemperatureSeed 等,按照实际需求对模型服务进行对话配置处理。

// 会话标识符
public string? ConversationId { get; set; }
// 请求指令
public string? Instructions { get; set; }
// 生成回复的温度
public float? Temperature { get; set; }
// 回复最大 token 数
public int? MaxOutputTokens { get; set; }
// 核采样因子(top p)
public float? TopP { get; set; }
// 生成时考虑的最可能 token 数(top k)
public int? TopK { get; set; }
// 重复 token 频率惩罚
public float? FrequencyPenalty { get; set; }
// 已出现 token 的惩罚
public float? PresencePenalty { get; set; }
// 随机种子
public long? Seed { get; set; }
// 回复格式
public ChatResponseFormat? ResponseFormat { get; set; }
// 模型 ID
public string? ModelId { get; set; }
// 停止序列列表
public IList<string>? StopSequences { get; set; }
// 是否允许多工具调用
public bool? AllowMultipleToolCalls { get; set; }
// 工具模式
public ChatToolMode? ToolMode { get; set; }
// 工具列表
[JsonIgnore]
public IList<AITool>? Tools { get; set; }
// 原始选项工厂回调
[JsonIgnore]
public Func<IChatClient, object?>? RawRepresentationFactory { get; set; }
// 附加属性
public AdditionalPropertiesDictionary? AdditionalProperties { get; set; }

实际案例代码调整如下:

internal class Program
{async static Task Main(string[] args){// 省略不变内容string modelthink = "deepseek-reasoner"; // 思考 // 省略不变内容//-------------------------对话配置-附加配置------------------------// 模型服务配置client = ChatClientBuilderChatClientExtensions.AsBuilder(client).ConfigureOptions(options => options.ModelId ??= model).Build();//-------------------------对话配置-附加配置------------------------// 作为缓存对象构架分部署缓存// 输入上下文 添加多轮会话历史 GetResponseAsync() 接受消息列表// 获取http请求响应(非流式)List<ChatMessage> history = [new ChatMessage(ChatRole.Assistant, "你是一个英语助手,拥有10年初中教学经验,对于用户提问,英文回复并用中文解释。")]; // 构建基本背景消息Console.WriteLine("开始会话,输入 bye 结束会话。");//-------------------------对话配置实例----------------------------ChatOptions chatOptions = new ChatOptions();// 设置模型为思考模型chatOptions.ModelId = modelthink;// 设置Temperature 0.1 - 0.5(严谨、可复现)chatOptions.Temperature = 0.5f;// top-p 0.7-0.85 chatOptions.TopP = 0.7f;// top-k 20-40chatOptions.TopK = 20;//-------------------------对话配置实例----------------------------// 通过控制台输入添加用户角色信息且大模型响应消息作为最后的消息while (true) {// 省略不变内容//-------------------------对话配置---------------------------await foreach (ChatResponseUpdate update in client.GetStreamingResponseAsync(history, chatOptions)) {// 省略不变内容}//-------------------------对话配置---------------------------// 省略不变内容}}
}

输出结果如下:
Pasted image 20251005224822.png
以上完整代码如下:

internal class Program
{async static Task Main(string[] args){string apikey = Environment.GetEnvironmentVariable("OPENAI_API_KEY");// 通过环境变量获取apikeystring model = "deepseek-chat"; // 非思考string modelthink = "deepseek-reasoner"; // 思考 string endpoint = "https://api.deepseek.com/v1"; // deepseek 中 提供兼容openai的访问api// 构建默认主机构建器实例var builder = Host.CreateApplicationBuilder();// 添加缓存服务-内存作为缓存介质builder.Services.AddDistributedMemoryCache();// 注册IChatClient实现类型builder.Services.AddChatClient(new OpenAI.Chat.ChatClient(model, new ApiKeyCredential(apikey), new OpenAIClientOptions{Endpoint = new Uri(endpoint) // 指定api访问地址}).AsIChatClient()) // 注册ichatclient实例.UseDistributedCache(new MemoryDistributedCache(Options.Create(new MemoryDistributedCacheOptions()))) // 使用缓存.UseLogging(); // 使用日志// 构建Host实例var host = builder.Build();// 获取ichatclient实现实例IChatClient client = host.Services.GetRequiredService<IChatClient>();//-------------------------对话配置-附加配置----------------------------// 模型服务配置client = ChatClientBuilderChatClientExtensions.AsBuilder(client).ConfigureOptions(options => options.ModelId ??= model).Build();//-------------------------对话配置-附加配置----------------------------// 作为缓存对象构架分部署缓存// 输入上下文 添加多轮会话历史 GetResponseAsync() 接受消息列表// 获取http请求响应(非流式)List<ChatMessage> history = [new ChatMessage(ChatRole.Assistant, "你是一个英语助手,拥有10年初中教学经验,对于用户提问,英文回复并用中文解释。")]; // 构建基本背景消息Console.WriteLine("开始会话,输入 bye 结束会话。");//-------------------------对话配置实例----------------------------ChatOptions chatOptions = new ChatOptions();// 设置模型为思考模型chatOptions.ModelId = modelthink;// 设置Temperature 0.1 - 0.5(严谨、可复现)chatOptions.Temperature = 0.5f;// top-p 0.7-0.85 chatOptions.TopP = 0.7f;// top-k 20-40chatOptions.TopK = 20;//-------------------------对话配置实例---------------------------------// 通过控制台输入添加用户角色信息且大模型响应消息作为最后的消息while (true) {Console.Write("Q:");string request = Console.ReadLine();if (request.Contains("bye")){break;}// 输入询问内容并存储到消息集合中history.Add(new ChatMessage(ChatRole.User, request));// 将输出的响应结果进行集合保存List<ChatResponseUpdate> updates = [];//-------------------------对话配置---------------------------------await foreach (ChatResponseUpdate update in client.GetStreamingResponseAsync(history, chatOptions)) {// 输出实时流对话结果Console.Write(update);// 存储此次消息响应单项updates.Add(update);}//-------------------------对话配置---------------------------------// 添加对话结果保存到历史集合中history.AddMessages(updates);// 每一次对话输出完成进行换行Console.WriteLine();}Console.WriteLine("会话结束");}
}
http://www.dtcms.com/a/447511.html

相关文章:

  • nat123做视频网站大连网站制作
  • 动易网站后台编辑器无效问题上海网站制作全包
  • 网站开发学习什么兰州市城市建设设计院官网
  • 滕州网站优化旅游网站建设有哪些不足
  • 外贸站群wordpress图片体积
  • 做个简单网站大概多少钱宝塔面板wordpress备份恢复
  • 中英文网站用同域名哔哩哔哩网页版稍后再看在哪里
  • 建站主机 wordpress电子商务网站建设程序应用题
  • LlamaIndex框架快速入门
  • 网站建设技术优势互联网网站开发创业计划书
  • 自动化测试框架playwright使用
  • 门户网站制作流程博客wordpress页面 文章页 分类
  • 网站企业推广方案重庆工程公司有哪些
  • 无锡鸿源建设集团有限公司网站网站网络拓扑图
  • cpanel转移网站网页配色的技巧是什么
  • 建设网站的建设费用包括ui设计的工作流程分为哪三类
  • 做网站可以不写代码郑州网站高端网站设计
  • 一次生产环境数据错误的排查记录
  • 网站建设费用差异大网站建设公司专业
  • 绍兴网站建设制作网站外链建设方法
  • 平凉网站建设wordpress包
  • 东莞响应式网站建设定制智慧政务网站怎么做
  • # Cryptography .Fernet模块--python加解密详解
  • 建网站公司 快云可信网站
  • 江苏网站建设系统方案c 网站开发平台
  • wordpress子站搭建微信网站如何制作软件
  • 打工人日报#20251005
  • 网站建设话术关键词网站建设需要客户提供什么内容
  • 2-1嵌入式进阶指南:P169H002 基于 ST7789T3 和 CST816D 驱动的 LCD 触摸显示屏开发手册(2)
  • 河北建设厅官方网站昆明网站建设价位