中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

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#控制臺項目。

安裝包:

image-20250104145553743

創建插件:

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)路徑:

image-20250104150522404

image-20250104150643237

提問論文相關問題:

image-20250104150933860

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

image-20250104151253266

image-20250104151334522

總結

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

posted @ 2025-01-04 15:22  mingupupup  閱讀(1116)  評論(1)    收藏  舉報