Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >教你如何入门AI Agent,让AI自动创建项目构建项目检查代码

教你如何入门AI Agent,让AI自动创建项目构建项目检查代码

作者头像
郑子铭
发布于 2025-03-13 13:18:02
发布于 2025-03-13 13:18:02
14900
代码可运行
举报
运行总次数:0
代码可运行

在AI很火爆的时候,到现在为止还有很多人很迷茫,如何入门AI?了解AI?下面我将带你进入AI Agent高级AI编程的领域。

下面我们将基于Microsoft.SemanticKernel去实现Agent的功能,创建一个CodeAgent,用户提出需求,然后由Agent进行实现。

创建一个控制台项目CodeAgent,然后安装以下依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

    <ItemGroup>
      <PackageReference Include="Microsoft.SemanticKernel" Version="1.33.0" />
      <PackageReference Include="Microsoft.SemanticKernel.Agents.Core" Version="1.33.0-alpha" />
      <PackageReference Include="Microsoft.SemanticKernel.Agents.OpenAI" Version="1.33.0-alpha" />
    </ItemGroup>

打开Program.cs

AI Agent是一种能够感知环境并作出相应决策和行动的智能系统。在本文中,我们将创建三个协同工作的AI Agent:

  • CodeReviewAgent: 负责代码审查和需求确认
  • ProgrammerAgent: 负责代码实现和文件操作
  • CodeErrorCheckAgent: 负责代码错误检查和反馈
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using CodeAgent.Function;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Agents.Chat;
using Microsoft.SemanticKernel.Agents.OpenAI;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;

#pragma warning disable OPENAI001

#pragma warning disable SKEXP0001

#pragma warning disable SKEXP0110

#pragma warning disable SKEXP0010

internalclassProgram
{
    public static async Task Main(string[] args)
    {
        var model = "gpt-4o";

        var kernelBuilder = Kernel.CreateBuilder();

        kernelBuilder.Plugins.AddFromType<UserFunction>();
        kernelBuilder.Plugins.AddFromType<CodeFunction>();

        kernelBuilder.AddOpenAIChatCompletion(model, new Uri("https://api.token-ai.cn/v1"),
            await File.ReadAllTextAsync("token"));

        var kernel = kernelBuilder.Build();

        var codeReviewAgent = CreateCodeReviewAgent(kernel);
        var programmerAgent = CreateProgrammerAgent(kernel);
        var codeErrorCheckAgent = CreateCodeErrorCheckAgent(kernel);


        var chat = new AgentGroupChat(codeReviewAgent, programmerAgent, codeErrorCheckAgent)
        {
            ExecutionSettings = new AgentGroupChatSettings()
            {
                TerminationStrategy = new CodeTerminationStrategy()
                {
                    Agents = [codeReviewAgent],
                    MaximumIterations = 10,
                }
            }
        };

        var chatHistory = new ChatMessageContent(AuthorRole.User, "使用Avalonia实现一个简单的计算器,工作目录:D:\\agent");

        chat.AddChatMessage(chatHistory);

        WriteAgentChatMessage(chatHistory);

        awaitforeach (var item in chat.InvokeAsync())
        {
            WriteAgentChatMessage(item);
        }
    }

    publicsealedclassCodeTerminationStrategy : TerminationStrategy
    {
        protected override Task<bool> ShouldAgentTerminateAsync(Agent agent, IReadOnlyList<ChatMessageContent> history,
            CancellationToken cancellationToken)
        {
            // 如果最后一条消息包含[done]则终止

            return history[^1].Content?.Contains("[done]") == true ? Task.FromResult(true) : Task.FromResult(false);
        }
    }

    public static void WriteAgentChatMessage(ChatMessageContent messages)
    {
        var authorExpression = messages.Role == AuthorRole.User ? string.Empty : $"- {messages.AuthorName ?? "*"}";

        var contentExpression = string.IsNullOrWhiteSpace(messages.Content) ? string.Empty : messages.Content;
        var isCode = messages.Metadata?.ContainsKey(OpenAIAssistantAgent.CodeInterpreterMetadataKey) ?? false;

        var codeMarker = isCode ? "\n [CODE]\n" : string.Empty;

        Console.ForegroundColor = messages.Role == AuthorRole.User ? ConsoleColor.Green : ConsoleColor.Blue;
        Console.Write($"\n [{messages.Role}]:");
        Console.ResetColor();
        Console.WriteLine($"{authorExpression} {codeMarker} {contentExpression}");

        foreach (var item in messages.Items)
        {
            switch (item)
            {
                case AnnotationContent annotation:
                    Console.WriteLine($"  [{item.GetType().Name}] {annotation.Quote}: File #{annotation.FileId}");
                    break;
                case FileReferenceContent fileReference:
                    Console.WriteLine($"  [{item.GetType().Name}] File #{fileReference.FileId}");
                    break;
                case ImageContent image:
                    Console.WriteLine(
                        $"  [{item.GetType().Name}] {image.Uri?.ToString() ?? image.DataUri ?? $"{image.Data?.Length} bytes"}");
                    break;
                case FunctionCallContent functionCall:
                    Console.WriteLine($"  [{item.GetType().Name}] {functionCall.Id}");
                    break;
                case FunctionResultContent functionResult:
                    Console.WriteLine(
                        $"  [{item.GetType().Name}] {functionResult.CallId} - {functionResult.Result ?? "*"}");
                    break;
            }
        }
    }

    public static ChatCompletionAgent CreateCodeReviewAgent(Kernel kernel)
    {
        conststring reviewAgentName = "CodeReviewAgent";
        conststring reviewInstruction =
            """
            你是CodeReviewAgent,
            - 你的职责是检查代码问题,只需要检查代码的质量,不需要编写代码。
            - 如果给出的代码完全符合预期,那么只回复:[done]- 如果不符合用户的需求,你需要提出建议,并且给出解决方案的思路,提供思维链的一系列解决思路,但是不要直接给出答案。
            - 你还需要将用户的问题提供一些思维链的计划,然后告知ProgrammerAgent,但是你不能直接[done]""";
        var codeReviewAgent = new ChatCompletionAgent()
        {
            Name = reviewAgentName,
            Instructions = reviewInstruction,
            Kernel = kernel,
            Description = "代码审查机器人",
            Arguments = new KernelArguments(new OpenAIPromptExecutionSettings()
                { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() }),
        };

        return codeReviewAgent;
    }

    /// <summary>
    /// 检查代码是否存在报错
    /// </summary>
    /// <returns></returns>
    public static ChatCompletionAgent CreateCodeErrorCheckAgent(Kernel kernel)
    {
        conststring errorCheckAgentName = "CodeErrorCheckAgent";
        conststring errorCheckInstruction =
            """
            你是CodeErrorCheckAgent,
            - 你的职责是检查代码是否存在报错,只需要检查代码的质量,不需要编写代码。
            - 如果代码构建没问题,那么只回复:[yes-code]- 如果代码构建出现异常,那么你需要告知ProgrammerAgent,然后提供解决方案的思路。
            """;
        var codeErrorCheckAgent = new ChatCompletionAgent()
        {
            Name = errorCheckAgentName,
            Instructions = errorCheckInstruction,
            Kernel = kernel,
            Description = "代码错误检查机器人",
            Arguments = new KernelArguments(new OpenAIPromptExecutionSettings()
                { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() }),
        };

        return codeErrorCheckAgent;
    }

    /// <summary>
    /// 创建一个程序员Agent
    /// </summary>
    /// <returns></returns>
    public static ChatCompletionAgent CreateProgrammerAgent(Kernel kernel)
    {
        conststring programmerAgentName = "ProgrammerAgent";
        conststring programmerInstruction =
            """
            你是ProgrammerAgent,
            - 你的职责是编写代码,
            - 请根据用户的需求编写代码,
            - 尽可能考虑到最佳实践,并且保持代码的可读性。
            - 您还可以帮助用户直接创建项目,修改代码文件,如果需要构建项目,通知CodeErrorCheckAgent 检查代码是否存在报错。
            """;

        var programmerAgent = new ChatCompletionAgent()
        {
            Name = programmerAgentName,
            Instructions = programmerInstruction,
            Kernel = kernel,
            Description = "程序员机器人",
            Arguments = new KernelArguments(new OpenAIPromptExecutionSettings()
                { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() }),
        };

        return programmerAgent;
    }
}

然后我们提供一些Agent需要的能力,创建俩个文件CodeFunction,UserFunction

CodeFunction.cs 这个Function由于提供操作文件的功能给AI

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.ComponentModel;
using System.Diagnostics;
using System.Text;
using Microsoft.SemanticKernel;

namespaceCodeAgent.Function;

publicclassCodeFunction
{
    /// <summary>
    /// 执行CMD命令
    /// </summary>
    [KernelFunction, Description("执行CMD命令, 并且等待命令执行完成")]
    public async Task<string> ExecuteCommand(string command)
    {
        Console.WriteLine(command);

        var process = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "cmd.exe",
                Arguments = $"/c {command}",
                // 显示窗口,并且将控制台内容输出
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false,
                CreateNoWindow = false,
                // 设置编码
                StandardOutputEncoding = Encoding.UTF8,
                StandardErrorEncoding = Encoding.UTF8
            }
        };

        process.Start();

        await process.WaitForExitAsync();

        var result = await process.StandardOutput.ReadToEndAsync();

        var error = await process.StandardError.ReadToEndAsync();

        process.Close();

        if (string.IsNullOrWhiteSpace(error))
        {
            Console.WriteLine(result);
            return result;
        }

        await Console.Error.WriteLineAsync(error);
        return error;
    }

    /// <summary>
    /// DotNet构建指定目录下的项目
    /// </summary>
    /// <returns></returns>
    public Task<string> BuildDotNetProject(
        [Description("项目路径")] string projectPath)
    {
        return ExecuteCommand($"dotnet build {projectPath}");
    }

    /// <summary>
    /// 获取当前系统基本信息
    /// </summary>
    [KernelFunction, Description("获取当前系统基本信息")]
    public string GetSystemInfo()
    {
        var os = Environment.OSVersion;
        var platform = Environment.OSVersion.Platform;
        var version = Environment.OSVersion.VersionString;
        var processorCount = Environment.ProcessorCount;
        var systemDirectory = Environment.SystemDirectory;
        var userName = Environment.UserName;
        var machineName = Environment.MachineName;
        var userDomainName = Environment.UserDomainName;
        var currentDirectory = Environment.CurrentDirectory;
        var is64BitOperatingSystem = Environment.Is64BitOperatingSystem;
        var is64BitProcess = Environment.Is64BitProcess;

        return @$"
            操作系统:{os}
            平台:{platform}
            版本:{version}
            处理器数量:{processorCount}
            系统目录:{systemDirectory}
            用户名:{userName}
            机器名:{machineName}
            用户域名:{userDomainName}
            当前目录:{currentDirectory}
            是否为64位操作系统:{is64BitOperatingSystem}
            是否为64位进程:{is64BitProcess}
        ";
    }

    /// <summary>
    /// 修改指定的文件的内容
    /// </summary>
    [KernelFunction, Description("修改指定的文件的内容")]
    public async Task ModifyFileContent(string filePath, string content)
    {
        await File.WriteAllTextAsync(filePath, content);
    }

    /// <summary>
    /// 获取指定目录下所有文件
    /// </summary>
    /// <returns></returns>
    [KernelFunction, Description("获取指定目录下所有文件")]
    public string[] GetFilesInDirectory(
        [Description("目录路径")] string directoryPath)
    {
        return Directory.GetFiles(directoryPath);
    }

    /// <summary>
    /// 文件重命名
    /// </summary>
    /// <returns></returns>
    [KernelFunction, Description("文件重命名")]
    public string RenameFile(
        [Description("文件路径")] string filePath,
        [Description("新文件名")] string newFileName)
    {
        File.Move(filePath, Path.Combine(Path.GetDirectoryName(filePath), newFileName));

        return"文件重命名成功";
    }

    /// <summary>
    /// 修改指定的文件 指定行的内容,如果行不存在则添加
    /// </summary>
    [KernelFunction, Description("修改指定的文件 指定行的内容,如果行不存在则添加")]
    public async Task ModifyFileLineContent(string filePath, int lineNumber, string content)
    {
        Console.WriteLine("修改指定的文件 指定行的内容,如果行不存在则添加:{0} {1} {2}", filePath, lineNumber, content);
        var lines = await File.ReadAllLinesAsync(filePath);

        if (lineNumber > lines.Length)
        {
            await File.AppendAllTextAsync(filePath, content);
        }
        else
        {
            lines[lineNumber - 1] = content;
            await File.WriteAllLinesAsync(filePath, lines);
        }
    }

    /// <summary>
    /// 读取指定文件的内容
    /// </summary>
    [KernelFunction, Description("读取指定文件的内容")]
    public async Task<string> ReadFileContent(string filePath)
    {
        Console.WriteLine("读取指定文件的内容:{0}", filePath);
        returnawait File.ReadAllTextAsync(filePath);
    }

    /// <summary>
    /// 读取指定文件的指定行的内容
    /// </summary>
    [KernelFunction, Description("读取指定文件的指定行的内容")]
    public async Task<string> ReadFileLineContent(string filePath, int lineNumber)
    {
        Console.WriteLine("读取指定文件的指定行的内容:{0} {1}", filePath, lineNumber);
        var lines = await File.ReadAllLinesAsync(filePath);

        if (lineNumber > lines.Length)
        {
            return"行数超出文件行数";
        }

        return lines[lineNumber - 1];
    }
}

UserFunction 如果需要在确认一些功能需求的时候需要让用户输入,所以需要提供读取用户输入的Function。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.ComponentModel;
using Microsoft.SemanticKernel;

namespaceCodeAgent.Function;

publicclassUserFunction
{
    /// <summary>
    /// 找用户确认需求
    /// </summary>
    /// <returns></returns>
    [KernelFunction, Description("找用户确认需求,并且等待用户提供确认")]
    public string ConfirmRequirement(
        [Description("需要确认的需求")] string requirement
    )
    {
        Console.WriteLine(requirement);

        Console.WriteLine("请确认需求,输入yes/no");

        var result = Console.ReadLine();

        return result;
    }

    /// <summary>
    /// 确认用户是否有额外的需要
    /// </summary>
    /// <returns></returns>
    [KernelFunction, Description("确认用户是否有额外的需要")]
    public string ConfirmAdditionalRequirement(
        [Description("提醒用户是否有额外的需求")] string reminder
    )
    {
        Console.WriteLine(reminder);

        Console.Write("用户输入:");
        var result = Console.ReadLine();

        return result;
    }

    /// <summary>
    /// 当任务完成时,通知用户,让用户确认是否满足需求,如果满足则返回[done]
    /// </summary>
    /// <returns></returns>
    [KernelFunction, Description("当任务完成时,通知用户,让用户确认是否满足需求,如果满足则返回[done]")]
    public string NotifyUserTaskDone(
        [Description("任务完成的消息")] string message
    )
    {
        Console.WriteLine(message);

        Console.Write("用户输入:");
        var result = Console.ReadLine();

        return result;
    }
}

创建token文件,然后将你的OpenAI Key放到文件即可。

然后我们执行项目,下面是执行的流程,在执行过程中,AI会先找我们确认详细的需求,然后确认以后他会生成一个计划告知ProgrammerAgent然后ProgrammerAgent进行代码实现,ProgrammerAgent会创建项目和修改代码文件,在日志中存在读取文件内容,和修改文件内容,然后CodeErrorCheckAgent会进行代码检查,代码检查是通过dotnet build去查看代码异常信息,然后再给ProgrammerAgent修复异常内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 [user]:  使用Avalonia实现一个简单的计算器,工作目录:D:\agent
您提到使用Avalonia实现一个简单的计算器,是否有具体的功能需求或界面设计偏好?例如,加减乘除基础运算,或是需要历史记录等功能。
请确认需求,输入yes/no
基本操作、历史记录、主题切换

 [Assistant]:- CodeReviewAgent  为了实现一个符合您要求的计算器应用程序,可以按照以下思路来构建项目:

1. **基础操作**- 实现基本的四则运算:加、减、乘、除。
    -UI设计上,布局可以采用简单的网格布局来放置按钮,确保按键的响应速度和准确性。

2. **历史记录**- 在计算器界面的侧边或底部增加一个区域,显示历史计算的结果。
    - 考虑使用一个列表控件(如`ListBox``DataGrid`)来存放历史记录。
    - 可以将历史记录保存在内存中,并在用户需要时进行清空。

3. **主题切换**- 提供一个下拉菜单或者按钮,供用户切换主题配色。
    - 定义几个主题风格,并实现动态资源的切换,以便用户在运行时可以改变主题。

4. **项目组织**- 创建一个新的Avalonia应用程序项目,用于开发此计算器。
    - 确保代码结构清晰,使用MVVM架构,使得界面与逻辑分离。

请确认这些思路符合您的期望,然后我们可以继续进行如何具体实现代码的探讨。
dotnet new avalonia.app -o D:\agent\AvaloniaCalculator
已成功创建模板“Avalonia .NET App”。

正在处理创建后操作...
正在还原 D:\agent\AvaloniaCalculator\AvaloniaCalculator.csproj:
  正在确定要还原的项目…
  已还原 D:\agent\AvaloniaCalculator\AvaloniaCalculator.csproj (用时 201 毫秒)。
已成功还原。



读取指定文件的内容:D:\agent\AvaloniaCalculator\MainWindow.axaml
读取指定文件的内容:D:\agent\AvaloniaCalculator\MainWindow.axaml.cs
cd D:\agent\AvaloniaCalculator && dotnet build
  正在确定要还原的项目…
  所有项目均是最新的,无法还原。
C:\Program Files\dotnet\sdk\9.0.200-preview.0.24575.35\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.RuntimeIdentifierInference.targets(326,5): message NETSDK1057: 你正在用 .NET 的预览版。请参阅 https://aka.ms/dotnet-support-policy [D:\agent\AvaloniaCalculator\AvaloniaCalculator.csproj]
D:\agent\AvaloniaCalculator\MainWindow.axaml.cs(15,9): error CS0200: 无法为属性或索引器“ItemsControl.Items”赋值 - 它是只读的 [D:\agent\AvaloniaCalculator\AvaloniaCalculator.csproj]
D:\agent\AvaloniaCalculator\MainWindow.axaml.cs(22,30): warning CS8602: 解引用可能出现空引用。 [D:\agent\AvaloniaCalculator\AvaloniaCalculator.csproj]
D:\agent\AvaloniaCalculator\MainWindow.axaml.cs(31,36): warning CS8602: 解引用可能出现空引用。 [D:\agent\AvaloniaCalculator\AvaloniaCalculator.csproj]
D:\agent\AvaloniaCalculator\MainWindow.axaml.cs(62,29): warning CS8604: “double double.Parse(string s)”中的形参“s”可能传入 null 引用实参。 [D:\agent\AvaloniaCalculator\AvaloniaCalculat

实际运行效果

让我们通过一个实际案例来看看这个系统是如何工作的。以下是创建一个Avalonia计算器应用的过程:

  1. 需求确认阶段
    • Agent询问具体需求
    • 用户确认功能要求
  2. 开发实现阶段
    • 自动创建项目结构
    • 生成必要的代码文件
    • 实现基本功能
  3. 检查优化阶段
    • 代码质量审查
    • 错误检测和修复
    • 功能完善

最终成果

通过AI Agent的协作,我们成功创建了一个具有以下功能的计算器应用:

  • 基础计算功能
  • 历史记录
  • 主题切换

总结

通过本文的实践,我们了解了:

  1. 如何使用Semantic Kernel框架构建AI Agent
  2. 如何实现Agent之间的协作
  3. 如何将AI能力应用到实际开发中

这个案例展示了AI Agent在软件开发中的潜力,为我们提供了一个全新的开发范式。

进阶建议

  1. 尝试扩展Agent的功能
  2. 优化Agent之间的交互
  3. 探索更多实际应用场景

希望这个教程能帮助你更好地理解和使用AI Agent技术!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用C#构建一个论文总结AI Agent
我觉得将日常生活中一些简单重复的任务交给AI Agent,是学习构建AI Agent应用一个很不错的开始。本次分享我以日常生活中一个总结论文的简单任务出发进行说明,希望对大家了解AI Agent有所帮助。任务可以是多种多样的,真的帮助自己提升了效率,那就是一个很不错的开始了!!
郑子铭
2025/02/25
720
使用C#构建一个论文总结AI Agent
结合SK和ChatGLM3B+whisper+Avalonia实现语音切换城市
OpenAIHttpClientHandler.cs,这个文件是用于修改SK的访问地址,默认的SK只支持OpenAI官方的地址并且不能进行修改!
用户10786849
2023/12/10
4130
结合SK和ChatGLM3B+whisper+Avalonia实现语音切换城市
.NET SK 如何给AI大模型添加搜索引擎功能?
普通的AI大模型的数据都是在一开始训练的时候决定的,所以大模型的数据来源都可能存在时效性。
用户10786849
2024/06/07
1760
.NET SK 如何给AI大模型添加搜索引擎功能?
Semantic Kernel 通过 LocalAI 集成本地模型
可参考官方 Getting Started 进行部署,通过LocalAI我们将本地部署的大模型转换为OpenAI的格式,通过SK 的OpenAI 的Connector 访问,这里需要做的是把openai的Endpoint 指向 LocalAI,这个我们可以通过一个自定义的HttpClient来完成这项工作,例如下面的这个示例:
张善友
2024/01/26
7320
Semantic Kernel 通过 LocalAI 集成本地模型
多轮对话利用AI发送邮件!(底部有免费的学习资料!)
在实际的开发中,我们经常会遇到发送邮件的需求,下面我们通过一个案例来了解如何利用Prompt来发送邮件。
用户10786849
2024/05/27
1520
多轮对话利用AI发送邮件!(底部有免费的学习资料!)
万字长文学会对接 AI 模型:Semantic Kernel 和 Kernel Memory,工良出品,超简单的教程
很多人想学习 AI,但是不知道怎么入门。笔者开始也是,先是学习了 Python,然后是 Tensorflow ,还准备看一堆深度学习的书。但是逐渐发现,这些知识太深奥了,无法在短时间内学会。此外还有另一个问题,学这些对自己有什么帮助?虽然学习这些技术是很 NB,但是对自己作用有多大?自己到底需要学什么?
痴者工良
2024/03/02
1.2K0
万字长文学会对接 AI 模型:Semantic Kernel 和 Kernel Memory,工良出品,超简单的教程
semantic kernel调用ollama接口
我是对本地大模型有执念的!因为它安全性好,数据完全被自己掌控。在前面的内容里面分享了如何使用OllamaSharp访问ollama接口,今天分享如何使用Semantic Kernel来访问ollama接口。
拓荒者IT
2025/04/09
690
semantic kernel调用ollama接口
SemanticFunction 融合 LLM 和传统编程
本文将继续和大家介绍 SemanticKernel 神奇的魔法,将使用 LLM 大语言模型编写的自然语言函数和传统的编程语言编写的函数融合到一起的例子。通过本文的例子,大家可以看到 SemanticKernel 框架所推荐的一个工作模式,同时可以更好的理解 SemanticKernel 框架的用法
郑子铭
2023/09/19
2050
SemanticFunction 融合 LLM 和传统编程
dotnet SemanticKernel 入门 注入日志
使用 SemanticKernel 框架在对接 AI 时,由于使用到了大量的魔法,需要有日志的帮助才好更方便定位问题,本文将告诉大家如何在 SemanticKernel 注入日志
林德熙
2023/11/28
2140
.NET 6+Semantic Kernel快速接入OpenAI接口
今天我们快速地使用Semantic Kernel来集成OpenAI,使用20来行代码快速实现一个简单的AIGC应用。
Edison Zhou
2024/05/30
1900
.NET 6+Semantic Kernel快速接入OpenAI接口
AI应用开发基座:Microsoft.Extensions.AI
微软在2024年11月就发布了新的AI核心库Microsoft.Extensions.AI,虽然目前还是一个预览版,但其可以大大简化我们的AI集成和开发工作。
郑子铭
2025/04/04
720
AI应用开发基座:Microsoft.Extensions.AI
实战教学:用Semantic Kernel框架集成腾讯混元大模型应用
腾讯混元大模型(Tencent Hunyuan)是由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力。具体参见:腾讯混元大模型-腾讯云 (tencent.com)。
TVP官方团队
2024/01/27
2.6K0
实战教学:用Semantic Kernel框架集成腾讯混元大模型应用
Semantic Kernel .NET SDK 的 v1.0.0 Beta1 发布
Semantic Kernel (SK) 是一个开源的将大型语言模型(LLM)与流行的编程语言相结合的SDK,Microsoft将Semantic Kernel(简称SK)称为轻量级SDK,结合了OpenAI,Azure OpenAI和Hugging Face等AI LLM的集成。它使开发人员能够通过编排 AI 组件并将其与现有代码集成来创建 AI 应用。SDK 提供对 Java、Python 和 C# 的支持。它提供了用于添加内存和AI服务的连接器,为应用程序创建模拟的“大脑”。语义内核支持来自不同提供商的插件,为开发人员提供自己的 API,并简化 AI 服务的集成,使开发人员能够利用最新的 AI 进步并构建复杂和智能的管道。
JusterZhu
2023/10/24
2510
Semantic Kernel .NET SDK 的 v1.0.0 Beta1 发布
基于Microsoft.Extensions.AI核心库实现RAG应用
之前我们了解 Microsoft.Extensions.AI 和 Microsoft.Extensions.VectorData 两个重要的AI应用核心库。基于对他们的了解,今天我们就可以来实战一个RAG问答应用,把之前所学的串起来。如果你觉得对你有帮助,可以V我50,毕竟今天是Crazy星期四。
郑子铭
2025/04/14
730
基于Microsoft.Extensions.AI核心库实现RAG应用
从0开始搭建免费大模型平台
然后他会在当前目录下生成data目录,这个目录就是默认数据库sqlite的数据持久化目录。
用户10786849
2024/06/18
2610
从0开始搭建免费大模型平台
SemanticKernel 入门 将技能导入框架
本文属于 SemanticKernel 入门系列博客,更多博客内容请参阅我的 博客导航
JusterZhu
2023/09/20
2210
SemanticKernel 入门 将技能导入框架
dotnet SemanticKernel 入门 自定义变量和技能
本文将告诉大家如何在 SemanticKernel 框架内定义自定义的变量和如何开发自定义的技能
林德熙
2023/11/28
2340
dotnet SemanticKernel 入门 将技能导入框架
在上一篇博客中和大家简单介绍了 SemanticKernel 里的技能概念,接下来咱准备将 技能 导入到 SemanticKernel 框架里面,进行一个管道式调用
林德熙
2023/11/28
1500
dotnet core 通过修改文件头的方式隐藏控制台窗口
在带界面的 dotnet core 程序运行的时候就会出现一个控制台窗口,本文告诉大家使用最简单方法去隐藏控制台窗口。
林德熙
2022/08/04
7980
在C#中基于Semantic Kernel的检索增强生成(RAG)实践
玩过大语言模型(LLM)的都知道OpenAI,然后微软Azure也提供了OpenAI的服务:Azure OpenAI,只需要申请到API Key,就可以使用这些AI服务。使用方式可以是通过在线Web页面直接与AI聊天,也可以调用AI的API服务,将AI的能力集成到自己的应用程序中。不过这些服务都是在线提供的,都会需要根据token计费,所以不仅需要依赖互联网,而且在使用上会有一定成本。于是,就出现了像Ollama这样的本地大语言模型服务,只要你的电脑足够强悍,应用场景允许的情况下,使用本地大语言模型也是一个不错的选择。
郑子铭
2024/11/23
1790
在C#中基于Semantic Kernel的检索增强生成(RAG)实践
推荐阅读
相关推荐
使用C#构建一个论文总结AI Agent
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验