PaperAssistant:使用Microsoft.Extensions.AI实现
前言
上篇文章介绍了使用Semantic Kernel Chat Completion Agent实现的版本。
今天来介绍一下使用Microsoft.Extensions.AI的版本。
Microsoft.Extensions.AI介绍
Microsoft.Extensions.AI 是微软为 .NET 生态系统推出的一组核心库,旨在为开发者提供统一的 C# 抽象层,简化与 AI 服务的集成。它通过与 .NET 生态系统的深度协作(包括与 Semantic Kernel 团队的合作),为开发者提供了一种标准化的方式来与各种 AI 服务(如大型语言模型、嵌入生成、工具调用等)进行交互。
GitHub地址:https://github.com/dotnet/extensions/tree/main/src/Libraries/Microsoft.Extensions.AI
实践
新建一个C#控制台项目。
安装包:
创建插件:
internal sealed class PaperAssistantPlugin
{
public PaperAssistantPlugin()
{
var envVars = DotEnv.Read();
ApiKeyCredential apiKeyCredential = new ApiKeyCredential(envVars["PaperSummaryApiKey"]);
OpenAIClientOptions openAIClientOptions = new OpenAIClientOptions();
openAIClientOptions.Endpoint = new Uri($"{envVars["PaperSummaryEndpoint"]}");
IChatClient openaiClient =
new OpenAIClient(apiKeyCredential, openAIClientOptions)
.AsChatClient(envVars["PaperSummaryModelId"]);
Client = new ChatClientBuilder(openaiClient)
.UseFunctionInvocation()
.Build();
}
internal IChatClient Client { get; set; }
[Description("读取指定路径的PDF文档内容")]
[return: Description("PDF文档内容")]
public string ExtractPDFContent(string filePath)
{
Console.WriteLine($"执行函数ExtractPDFContent,参数{filePath}");
StringBuilder text = new StringBuilder();
// 读取PDF内容
using (PdfDocument document = PdfDocument.Open(filePath))
{
foreach (var page in document.GetPages())
{
text.Append(page.Text);
}
}
return text.ToString();
}
[Description("根据文件路径与笔记内容创建一个md格式的文件")]
public void SaveMDNotes([Description("保存笔记的路径")] string filePath, [Description("笔记的md格式内容")] string mdContent)
{
try
{
Console.WriteLine($"执行函数SaveMDNotes,参数1:{filePath},参数2:{mdContent}");
// 检查文件是否存在,如果不存在则创建
if (!File.Exists(filePath))
{
// 创建文件并写入内容
File.WriteAllText(filePath, mdContent);
}
else
{
// 如果文件已存在,覆盖写入内容
File.WriteAllText(filePath, mdContent);
}
}
catch (Exception ex)
{
// 处理异常
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
[Description("总结论文内容生成一个md格式的笔记,并将笔记保存到指定路径")]
public async void GeneratePaperSummary(string filePath1, string filePath2)
{
Console.WriteLine($"执行函数GeneratePaperSummary,参数1:{filePath1},参数2:{filePath2}");
StringBuilder text = new StringBuilder();
// 读取PDF内容
using (PdfDocument document = PdfDocument.Open(filePath1))
{
foreach (var page in document.GetPages())
{
text.Append(page.Text);
}
}
// 生成md格式的笔记
string skPrompt = """
请使用md格式总结论文的摘要、前言、文献综述、主要论点、研究方法、结果和结论。
论文标题为《[论文标题]》,作者为[作者姓名],发表于[发表年份]。请确保总结包含以下内容:
论文摘要
论文前言
论文文献综诉
主要研究问题和背景
使用的研究方法和技术
主要结果和发现
论文的结论和未来研究方向
""";
List<ChatMessage> history = [];
history.Add(new ChatMessage(ChatRole.System, skPrompt));
history.Add(new ChatMessage(ChatRole.User, text.ToString()));
var result = await Client.CompleteAsync(history);
try
{
// 检查文件是否存在,如果不存在则创建
if (!File.Exists(filePath2))
{
// 创建文件并写入内容
File.WriteAllText(filePath2, result.ToString());
Console.WriteLine($"生成笔记成功,笔记路径:{filePath2}");
}
else
{
// 如果文件已存在,覆盖写入内容
File.WriteAllText(filePath2, result.ToString());
}
}
catch (Exception ex)
{
// 处理异常
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
}
创建好了插件之后,我们需要创建一个IChatClient,由于国内大模型提供商大部分都已经兼容了OpenAI格式,所以安装Microsoft.Extensions.AI.OpenAI就可以用了。
在Microsoft.Extensions.AI.OpenAI中使用国内大语言模型的方式如下所示:
var envVars = DotEnv.Read();
ApiKeyCredential apiKeyCredential = new ApiKeyCredential(envVars["ToolUseApiKey"]);
OpenAIClientOptions openAIClientOptions = new OpenAIClientOptions();
openAIClientOptions.Endpoint = new Uri($"{envVars["ToolUseEndpoint"]}");
IChatClient openaiClient =
new OpenAIClient(apiKeyCredential, openAIClientOptions)
.AsChatClient(envVars["ToolUseModelId"]);
IChatClient client = new ChatClientBuilder(openaiClient)
.UseFunctionInvocation()
.Build();
在ChatOptions中导入工具:
ChatOptions chatOptions = new()
{
Tools = [AIFunctionFactory.Create(paperAssistantPlugin.ExtractPDFContent),
AIFunctionFactory.Create(paperAssistantPlugin.SaveMDNotes),
AIFunctionFactory.Create(paperAssistantPlugin.GeneratePaperSummary)]
};
总结论文并将笔记保存至指定路径:
提问论文相关问题:
将笔记保存至指定路径:
总结
只是一个非常简单的示例,希望对大家使用Microsoft.Extensions.AI实现自己的应用有所帮助。代码已上传至GitHub,地址:https://github.com/Ming-jiayou/PaperAssistant。
PaperAssistant:使用Microsoft.Extensions.AI实现的更多相关文章
- Microsoft.Extensions.Options支持什么样的配置类?
在.Net core中,微软放弃了笨重基于XML的.Config配置文件(好吧,像我这种咸鱼早都忘了如何自己写一个Section了). 现在主推新的高度可扩展的配置文件(参见此处) 对于新的配置系统, ...
- asp.net core 2.0 Microsoft.Extensions.Logging 文本文件日志扩展
asp.net core微软官方为日志提供了原生支持,有如下实现 Console Debug EventLog AzureAppServices TraceSource EventSource 并且在 ...
- DotNetCore跨平台~一起聊聊Microsoft.Extensions.DependencyInjection
写这篇文章的心情:激动 Microsoft.Extensions.DependencyInjection在github上同样是开源的,它在dotnetcore里被广泛的使用,比起之前的autofac, ...
- Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例
本文目录 1. Net下日志记录 2. NLog的使用 2.1 添加nuget引用NLog.Web.AspNetCore 2.2 配置文件设置 2.3 依赖配置及调用 ...
- Microsoft.Extensions.DependencyInjection不同版本导致EF出现内存泄露。
我的代码里将IServiceProvider放入ServiceLocator中遇到的问题. 注:以下所有例子都是Console里的结论,AspNetCore里不管怎么玩都没有问题,有其他帖子测试出在A ...
- 检测到包降级: Microsoft.Extensions.Configuration.Abstractions 从 2.1.1 降 2.1.0
解决方法:工具-nuget管理包-程序管理控制台-选择 项目- 执行 -Install-Package Microsoft.Extensions.Configuration.Abstractions ...
- 微软日志工厂 Microsoft.Extensions.Logging 中增加 log4net 的日志输出
前提: 需要nuget Microsoft.Extensions.Logging.Log4Net.AspNetCore 2.2.6: 描述:解决 .net core 微软日志工厂 Micros ...
- 解析 Microsoft.Extensions.DependencyInjection 2.x 版本实现
项目使用了 Microsoft.Extensions.DependencyInjection 2.x 版本,遇到第2次请求时非常高的内存占用情况,于是作了调查,本文对 3.0 版本仍然适用. 先说结论 ...
- 使用诊断工具观察 Microsoft.Extensions.DependencyInjection 2.x 版本的内存占用
目录 准备工作 大量接口与实现类的生成 elasticsearch+kibana+apm asp.net core 应用 请求与快照 Kibana 上的请求记录 请求耗时的分析 请求内存的分析 第2次 ...
- Microsoft.Extensions.DependencyInjection 之三:展开测试
目录 前文回顾 IServiceCallSite CallSiteFactory ServiceProviderEngine CompiledServiceProviderEngine Dynamic ...
随机推荐
- 掀起云端革命!ToDesk云电脑与传统PC电脑的差异分析
在科技日新月异的今天,传统PC电脑的市场地位正悄然发生变化.随着云计算技术的不断成熟与普及,云电脑逐渐走进大众视野,不同于传统PC电脑的高昂的成本和易退化的硬件性能,云电脑正以其轻成本高性能的优势吸引 ...
- Windows 记录一次磁盘相关的PC卡顿问题
我的电脑最近经常抽疯,时不时卡顿一次 检查系统事件日志,会有这俩个: 发出了对设备 \Device\RaidPort0 的重置. 已在磁盘 0 (PDO 名称: \Device\0000003a)的逻 ...
- Linux基础常识
1 什么是shell shell是Linux系统的用户界面,提供了用户与内核交互的一种接口,它接收用户输入的命令并到送到内核去执行,因此也被称为Linux的命令解释器. 显示系统当前使用的shell ...
- My SQL 下载和安装图文解说
一.下载My SQL 官网下载地址:https://downloads.mysql.com/archives/installer/ 选择需要下载的版本,点击download.本文选择下载的版本是8.0 ...
- SaaS平台的组织数据模型设计
大家好,我是汤师爷~ 想要深入理解零售企业的组织架构并不容易.大多数人并没有实际经营过零售企业,更不曾参与设计其组织架构. 在调研商家的过程中,我们通常只能了解他们组织架构的现状,却难以直接与企业高层 ...
- 13-1 c++拷贝控制:拷贝赋值与销毁
定义一个类时,我们必须对它进行拷贝控制,即控制该类在进行拷贝.赋值.移动和销毁时要进行哪些操作 一个类通过五个特殊的成员函数进行拷贝控制 拷贝构造函数 拷贝赋值函数 移动构造函数 移动赋值函数 析构函 ...
- CF716B Complete the Word 题解
CF716B Complete the Word 题解 分析 首先观察数据范围是 \(50000\),可以考虑 \(O(n)\) 暴力. 在字符串中枚举子串开始的位置 \(i\),然后再枚举 \(i\ ...
- Bulk-Crap-Uninstaller:一个高效卸载,轻松管理你的应用程序的.Net开源工具
我们在工作中,经常需要安装大量的软件,随着应用程序的不断增多,管理这些软件变得非常困难. 下面介绍一款具备高效.简洁的特点,可以帮助我们快速卸载大量不需要的应用程序,让电脑管理变得更加轻松. 01 项 ...
- 鸿蒙Navigation知识点详解
Navigation是路由导航的根视图容器,一般作为页面(@Entry)的根容器,包括单栏(Stack).分栏(Split)和自适应(Auto)三种显示模式.Navigation组件适用于模块内和跨模 ...
- 参与 2024 第四季度官方 Flutter 开发者调查
Flutter 3.24 和 Dart 3.5 稳定版发布 已有三月之久,今年最后一次开发者调查也如约而至! 自 Flutter 3.24 正式发布以来,团队通过一系列补丁更新不断优化平台稳定性和开发 ...