前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多轮对话利用AI发送邮件!(底部有免费的学习资料!)

多轮对话利用AI发送邮件!(底部有免费的学习资料!)

作者头像
用户10786849
发布2024-05-27 21:25:43
970
发布2024-05-27 21:25:43
举报
文章被收录于专栏:token的技术分享token的技术分享

创建一个控制台的项目

  • 打开Visual Studio 2022,然后创建一个名称为4_Chat_Prompts的控制台项目
  • 然后复制以下代码到4_Chat_Prompts项目文件中
代码语言:javascript
复制

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <RootNamespace>_4_Chat_Prompts</RootNamespace>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.SemanticKernel" Version="1.12.0" />
  </ItemGroup>
</Project>
  
  • 由于SK默认的限制并没有提供直接修改地址的接口,所以我们需要自定义HttpClientHandler,下面我们创建一个OpenAIHttpClientHandler.cs,然后提供以下实现
代码语言:javascript
复制

    public class OpenAIHttpClientHandler : HttpClientHandler
    {
        private readonly string _uri;

        public OpenAIHttpClientHandler(string uri) => _uri = uri.TrimEnd('/');

        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
            CancellationToken cancellationToken)
        {
            UriBuilder uriBuilder;
            if (request.RequestUri?.LocalPath == "/v1/chat/completions")
            {
                uriBuilder = new UriBuilder(_uri + "/v1/chat/completions");
                request.RequestUri = uriBuilder.Uri;
            }
            else if (request.RequestUri?.LocalPath == "/v1/embeddings")
            {
                uriBuilder = new UriBuilder(_uri + "/v1/embeddings");
                request.RequestUri = uriBuilder.Uri;
            }

            return await base.SendAsync(request, cancellationToken);
        }
    }

利用prompt进行发送邮件

在实际的开发中,我们经常会遇到发送邮件的需求,下面我们通过一个案例来了解如何利用Prompt来发送邮件。

实现发送邮件的功能

复制以下代码到Program.cs文件中

代码语言:javascript
复制
using System.ComponentModel;
using ConsoleApp1;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;

var kernel = Kernel.CreateBuilder()
    .AddOpenAIChatCompletion(
        modelId: "gpt-4",
        apiKey: "这里填写在https://api.token-ai.cn/创建的令牌",
        httpClient: new HttpClient(new OpenAIHttpClientHandler("https://api.token-ai.cn/")))
    .Build();

var emailPrompt =
    @"
## 需求:
- 我需要解决用户发送邮件问题,邮件参数包含以下参数
    - 收件人邮箱
        - required
        - email 
    - 邮件主题
        - required
        - 长度限制 100
        - title
    - 邮件内容
        - content
        - required 
- 在上面的参数如果是required则是必须的,如果用户没有提供那么你需要提示用户缺少哪些参数。
- 如果用户提供了参数,您需要提示不合法的参数,你不要提供测试用例,你需要提示用户哪些参数不合法。
- 上面要求都满足以后,需要提问用户是否确认发送,如果用户确认发送,那么你需要调用发送邮件。
";


kernel.Plugins.AddFromType<EmailTools>();

var chatHistory = new ChatHistory();

while (true)
{
    Console.Write("User > ");
    var input = Console.ReadLine();
    chatHistory.AddUserMessage(input);

    var chatResult = await kernel.GetRequiredService<IChatCompletionService>()
        .GetChatMessageContentAsync(chatHistory, new OpenAIPromptExecutionSettings()
        {
            ChatSystemPrompt = emailPrompt,
            MaxTokens = 500,
            Temperature = 0.5,
            TopP = 1,
            ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
        }, kernel);

    if(string.IsNullOrEmpty(chatResult?.Content))
    {
        
        break;
    }
    
    Console.Write($"\nAssistant > {chatResult}\n");
    chatHistory.AddAssistantMessage(chatResult.Content);

    if (chatResult.Content.Contains("邮件发送成功"))
    {
        break;
    }
}

public class EmailTools
{
    [KernelFunction, Description("发送邮件")]
    public string SendEmail([Description("接收人")] string email, [Description("邮件主题")] string title,
        [Description("邮件内容")] string? content)
    {
        Console.WriteLine($"发送邮件给 {email} 主题:{title} 内容:{content}");
        // Send email
        return "邮件发送成功";
    }
}

启动项目

然后运行项目,您会看到输出结果为:

代码语言:javascript
复制
User > 发邮件给239573049@qq.com

Assistant > 你需要提供邮件的主题和内容。
User > 邮件主题 参加晚宴

Assistant > 你还需要提供邮件的内容。
User > 邮件内容 今晚上参加李白的晚宴

Assistant > 好的,我收到了你的邮件信息:
- 收件人: 239573049@qq.com
- 邮件主题: 参加晚宴
- 邮件内容: 今晚上参加李白的晚宴

请确认是否发送邮件?
User > 确认发送
发送邮件给 239573049@qq.com 主题:参加晚宴 内容:今晚上参加李白的晚宴

Assistant > 邮件已成功发送给239573049@qq.com。

实现结论

在上面我们实现了通过prompt进行多轮对话然后发送邮件给指定的邮箱,并且对于用户的输入进行了校验,如果用户输入不合法,那么我们会提示用户输入不合法的参数,如果用户输入合法,那么我们会提示用户是否确认发送邮件,如果用户确认发送,那么我们会调用发送邮件的方法,然后发送邮件。

这一个案例对于AI的要求是非常高的,因为我们需要对用户的输入进行校验,然后对用户的输入进行处理,然后再进行发送邮件,这个案例是一个比较复杂的案例,但是也是一个比较实用的案例,很多模型多无法达到我们的要求,所以我们需要对模型进行调整,让模型更好的适应我们的需求。

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

本文分享自 token的技术分享 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 利用prompt进行发送邮件
    • 实现发送邮件的功能
      • 启动项目
        • 实现结论
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档