PaperAssistant:使(shi)用Microsoft.Extensions.AI實現
前言
上篇文章介紹了使(shi)用(yong)Semantic Kernel Chat Completion Agent實現的版本。
今天來(lai)介紹一下使用Microsoft.Extensions.AI的版本。
Microsoft.Extensions.AI介紹
Microsoft.Extensions.AI 是(shi)微軟為(wei) .NET 生態系統(tong)推(tui)出的(de)(de)(de)一組核心庫,旨在為(wei)開(kai)發者(zhe)提供(gong)統(tong)一的(de)(de)(de) C# 抽象層(ceng),簡化(hua)與(yu)(yu) AI 服務的(de)(de)(de)集成。它通過與(yu)(yu) .NET 生態系統(tong)的(de)(de)(de)深(shen)度(du)協(xie)作(包括與(yu)(yu) Semantic Kernel 團隊的(de)(de)(de)合作),為(wei)開(kai)發者(zhe)提供(gong)了一種(zhong)(zhong)標(biao)準(zhun)化(hua)的(de)(de)(de)方式來(lai)與(yu)(yu)各種(zhong)(zhong) AI 服務(如大型語言模型、嵌入生成、工(gong)具調用等)進(jin)行交互。
GitHub地址:
實踐
新建一個(ge)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}");
}
}
}
創建好了插件之(zhi)后,我們需要創建一個IChatClient,由于國內(nei)大(da)模型(xing)提(ti)供商大(da)部分(fen)都(dou)已經兼容了OpenAI格式(shi),所以(yi)安裝(zhuang)Microsoft.Extensions.AI.OpenAI就可以(yi)用了。
在Microsoft.Extensions.AI.OpenAI中使用國(guo)內大語言模型的方式如下(xia)所(suo)示:
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)]
};
總結(jie)論文并將筆記保存至指定(ding)路徑:


提問論文相關問題:

將筆記保存至(zhi)指(zhi)定路徑:


總結
只是一(yi)個(ge)非常簡(jian)單的示(shi)例,希望對大家使用(yong)Microsoft.Extensions.AI實現自(zi)己的應用(yong)有所幫助。代(dai)碼(ma)已(yi)上傳至GitHub,地址:
