项目1:智能客服助手 - 需求文档

项目概述

在本项目中,你将创建一个智能客服助手系统,它能够:

  • 回答常见问题

  • 查询订单状态

  • 处理退换货请求

  • 转接人工客服

这个项目将综合运用前面学到的多个知识点:代理创建、工具调用、记忆功能等。

项目目标

通过完成这个项目,你将:

  1. 掌握如何设计一个实用的 AI 代理系统

  2. 学会如何为代理添加多个实用工具

  3. 理解如何处理不同类型的用户请求

  4. 实践错误处理和用户体验优化

功能需求

1. 基础对话功能

  • 代理能够理解用户的自然语言输入

  • 代理能够用友好的语气回复用户

  • 代理能够记住对话历史(使用记忆功能)

2. 常见问题解答

代理应该能够回答以下类型的问题:

  • 营业时间

  • 配送政策

  • 退换货政策

  • 支付方式

  • 会员权益

3. 订单查询功能

  • 用户可以通过订单号查询订单状态

  • 显示订单的详细信息(商品、金额、状态)

  • 显示物流信息

4. 退换货处理

  • 用户可以申请退换货

  • 系统记录退换货原因

  • 生成退换货单号

  • 告知用户后续流程

5. 人工客服转接

  • 当代理无法处理问题时,提供转接人工客服的选项

  • 记录转接原因

  • 提供预计等待时间

技术需求

1. 使用的技术

  • Microsoft Agent Framework

  • Azure OpenAI 或 OpenAI

  • C# / .NET 8.0

2. 需要实现的工具

  • QueryOrderStatus: 查询订单状态

  • CreateReturnRequest: 创建退换货请求

  • TransferToHuman: 转接人工客服

  • GetFAQAnswer: 获取常见问题答案

3. 数据模拟

由于这是学习项目,我们将使用模拟数据:

  • 模拟订单数据库

  • 模拟常见问题知识库

  • 模拟退换货系统

用户场景示例

场景1:查询订单

用户:你好,我想查询一下我的订单
客服:您好!我可以帮您查询订单状态。请提供您的订单号。
用户:订单号是 ORD20240001
客服:好的,让我为您查询... 
     您的订单 ORD20240001 当前状态是"配送中"
     商品:无线蓝牙耳机
     金额:299元
     预计送达时间:明天下午

场景2:申请退货

用户:我想退货
客服:好的,我可以帮您处理退货申请。请提供您的订单号。
用户:ORD20240002
客服:请问您退货的原因是什么?
用户:商品有质量问题
客服:非常抱歉给您带来不便。我已为您创建退货申请,退货单号是 RET20240001。
     请按以下步骤操作:
     1. 将商品原包装寄回
     2. 快递费用由我们承担
     3. 收到商品后3个工作日内退款

场景3:咨询问题

用户:你们的营业时间是什么时候?
客服:我们的客服服务时间是:
     周一至周五:9:00 - 21:00
     周六至周日:10:00 - 18:00
     在线商城24小时开放,随时可以下单。

评估标准

完成的项目应该满足:

  1. ✅ 所有功能都能正常工作

  2. ✅ 代码结构清晰,易于理解

  3. ✅ 有适当的错误处理

  4. ✅ 用户体验友好

  5. ✅ 代码有适当的注释

预计完成时间

  • 初级学习者:4-6 小时

  • 有编程基础:2-3 小时

项目1:智能客服助手 - 设计指导

系统架构

整体架构图

┌─────────────────────────────────────────────────┐
│                   用户界面                        │
│              (控制台交互)                         │
└────────────────────┬────────────────────────────┘
                     │
                     ▼
┌─────────────────────────────────────────────────┐
│              智能客服代理                         │
│  - 理解用户意图                                   │
│  - 选择合适的工具                                 │
│  - 生成友好回复                                   │
└────────┬────────┬────────┬────────┬─────────────┘
         │        │        │        │
         ▼        ▼        ▼        ▼
    ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
    │订单查询│ │退换货  │ │FAQ查询 │ │人工转接│
    │工具    │ │工具    │ │工具    │ │工具    │
    └────┬───┘ └───┬────┘ └───┬────┘ └───┬────┘
         │         │          │          │
         ▼         ▼          ▼          ▼
    ┌─────────────────────────────────────────┐
    │           模拟数据层                     │
    │  - 订单数据                              │
    │  - FAQ知识库                             │
    │  - 退换货记录                            │
    └─────────────────────────────────────────┘

核心组件设计

1. 代理配置

// 代理的核心配置
var agent = new ChatCompletionAgent
{
    Name = "智能客服助手",
    Instructions = @"
        你是一个专业、友好的客服助手。你的职责是:
        1. 用礼貌、热情的语气与客户交流
        2. 准确理解客户需求
        3. 使用合适的工具帮助客户解决问题
        4. 当无法处理时,及时转接人工客服
        
        注意事项:
        - 始终保持专业和礼貌
        - 对客户的问题表示理解和关心
        - 提供清晰、具体的信息
        - 遇到不确定的情况,不要猜测,而是询问或转接
    ",
    // ... 其他配置
};

2. 工具设计

工具1:订单查询工具

功能:根据订单号查询订单详情

输入参数

  • orderId (string): 订单号

输出

  • 订单状态

  • 商品信息

  • 金额

  • 物流信息

实现思路

[KernelFunction]
[Description("查询订单状态和详细信息")]
public string QueryOrderStatus(
    [Description("订单号,格式如 ORD20240001")] string orderId)
{
    // 1. 验证订单号格式
    // 2. 从模拟数据库查询订单
    // 3. 格式化返回结果
    // 4. 处理订单不存在的情况
}
工具2:退换货工具

功能:创建退换货申请

输入参数

  • orderId (string): 订单号

  • reason (string): 退换货原因

  • type (string): "退货" 或 "换货"

输出

  • 退换货单号

  • 后续操作指引

实现思路

[KernelFunction]
[Description("创建退换货申请")]
public string CreateReturnRequest(
    [Description("订单号")] string orderId,
    [Description("退换货原因")] string reason,
    [Description("类型:退货或换货")] string type)
{
    // 1. 验证订单是否存在
    // 2. 检查订单是否可以退换货
    // 3. 生成退换货单号
    // 4. 记录申请信息
    // 5. 返回操作指引
}
工具3:FAQ查询工具

功能:查询常见问题答案

输入参数

  • question (string): 用户的问题

输出

  • 相关的FAQ答案

实现思路

[KernelFunction]
[Description("查询常见问题的答案")]
public string GetFAQAnswer(
    [Description("用户的问题")] string question)
{
    // 1. 在FAQ知识库中搜索相关问题
    // 2. 返回最匹配的答案
    // 3. 如果没有找到,返回提示信息
}
工具4:人工转接工具

功能:记录转接请求并提供等待信息

输入参数

  • reason (string): 转接原因

输出

  • 转接确认信息

  • 预计等待时间

实现思路

[KernelFunction]
[Description("转接人工客服")]
public string TransferToHuman(
    [Description("转接原因")] string reason)
{
    // 1. 记录转接原因
    // 2. 生成转接单号
    // 3. 返回等待信息
}

3. 数据模型设计

订单模型
public class Order
{
    public string OrderId { get; set; }          // 订单号
    public string ProductName { get; set; }      // 商品名称
    public decimal Amount { get; set; }          // 金额
    public string Status { get; set; }           // 状态
    public DateTime OrderDate { get; set; }      // 下单时间
    public string ShippingInfo { get; set; }     // 物流信息
    public DateTime? EstimatedDelivery { get; set; } // 预计送达
}
退换货模型
public class ReturnRequest
{
    public string ReturnId { get; set; }         // 退换货单号
    public string OrderId { get; set; }          // 关联订单号
    public string Type { get; set; }             // 退货/换货
    public string Reason { get; set; }           // 原因
    public DateTime CreateTime { get; set; }     // 创建时间
    public string Status { get; set; }           // 状态
}
FAQ模型
public class FAQ
{
    public string Question { get; set; }         // 问题
    public string Answer { get; set; }           // 答案
    public List<string> Keywords { get; set; }   // 关键词
}

4. 对话流程设计

典型对话流程
1. 用户输入
   ↓
2. 代理理解意图
   ↓
3. 判断是否需要调用工具
   ↓
4. 调用相应工具(如果需要)
   ↓
5. 生成友好的回复
   ↓
6. 返回给用户
   ↓
7. 等待下一轮输入
状态管理

使用 AgentThread 管理对话状态:

  • 保存对话历史

  • 记录用户上下文

  • 支持多轮对话

5. 错误处理策略

常见错误场景
  1. 订单不存在

    • 友好提示用户检查订单号

    • 提供订单号格式示例

  2. 工具调用失败

    • 捕获异常

    • 向用户道歉

    • 提供替代方案(如转接人工)

  3. 用户输入不明确

    • 礼貌地请求更多信息

    • 提供选项让用户选择

  4. 系统错误

    • 记录错误日志

    • 向用户道歉

    • 提供人工客服联系方式

实现步骤建议

第一步:搭建基础框架

  1. 创建控制台项目

  2. 配置 Azure OpenAI 连接

  3. 创建基本的代理

第二步:准备模拟数据

  1. 创建订单数据类

  2. 准备一些测试订单

  3. 创建FAQ知识库

第三步:实现工具

  1. 从最简单的工具开始(FAQ查询)

  2. 逐个实现其他工具

  3. 测试每个工具的功能

第四步:集成代理和工具

  1. 将工具注册到代理

  2. 测试代理能否正确调用工具

  3. 优化代理的指令

第五步:完善用户体验

  1. 添加欢迎消息

  2. 优化输出格式

  3. 添加错误处理

  4. 测试各种场景

第六步:测试和优化

  1. 测试所有功能

  2. 优化响应速度

  3. 改进回复质量

技术要点

1. 记忆功能的使用

// 创建线程保持对话上下文
var thread = new AgentThread();

// 在循环中使用同一个线程
while (true)
{
    var userInput = Console.ReadLine();
    await foreach (var message in agent.InvokeAsync(thread, userInput))
    {
        Console.WriteLine(message.Content);
    }
}

2. 工具注册

// 创建工具实例
var tools = new CustomerServiceTools();

// 注册到代理
agent.Kernel.Plugins.AddFromObject(tools);

3. 格式化输出

// 使用字符串插值和格式化
public string FormatOrderInfo(Order order)
{
    return $@"
订单信息:
━━━━━━━━━━━━━━━━━━━━
订单号:{order.OrderId}
商品:{order.ProductName}
金额:¥{order.Amount:F2}
状态:{order.Status}
下单时间:{order.OrderDate:yyyy-MM-dd HH:mm}
{(order.EstimatedDelivery.HasValue ? 
  $"预计送达:{order.EstimatedDelivery:yyyy-MM-dd}" : "")}
━━━━━━━━━━━━━━━━━━━━
";
}

扩展建议

完成基础功能后,可以尝试:

  1. 添加更多工具(如优惠券查询、积分查询)

  2. 实现情感分析,识别用户情绪

  3. 添加多语言支持

  4. 集成真实的数据库

  5. 添加 Web 界面

项目1:智能客服助手 - 项目模板代码

项目结构

CustomerServiceAgent/
├── CustomerServiceAgent.csproj
├── Program.cs                      // 主程序入口
├── Models/
│   ├── Order.cs                    // 订单模型
│   ├── ReturnRequest.cs            // 退换货模型
│   └── FAQ.cs                      // FAQ模型
├── Data/
│   ├── MockOrderDatabase.cs        // 模拟订单数据库
│   └── MockFAQDatabase.cs          // 模拟FAQ数据库
└── Tools/
    └── CustomerServiceTools.cs     // 客服工具集合

1. 项目文件 (CustomerServiceAgent.csproj)

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

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

  <ItemGroup>
    <PackageReference Include="Azure.AI.OpenAI" Version="2.1.0" />
    <PackageReference Include="Microsoft.Extensions.AI" Version="9.0.1-preview.1.24570.5" />
    <PackageReference Include="Microsoft.Extensions.AI.OpenAI" Version="9.0.1-preview.1.24570.5" />
  </ItemGroup>

</Project>

2. 数据模型

Order.cs

namespace CustomerServiceAgent.Models;

/// <summary>
/// 订单模型
/// </summary>
public class Order
{
    /// <summary>
    /// 订单号
    /// </summary>
    public string OrderId { get; set; } = string.Empty;

    /// <summary>
    /// 商品名称
    /// </summary>
    public string ProductName { get; set; } = string.Empty;

    /// <summary>
    /// 订单金额
    /// </summary>
    public decimal Amount { get; set; }

    /// <summary>
    /// 订单状态:待支付、已支付、配送中、已完成、已取消
    /// </summary>
    public string Status { get; set; } = string.Empty;

    /// <summary>
    /// 下单时间
    /// </summary>
    public DateTime OrderDate { get; set; }

    /// <summary>
    /// 物流信息
    /// </summary>
    public string ShippingInfo { get; set; } = string.Empty;

    /// <summary>
    /// 预计送达时间
    /// </summary>
    public DateTime? EstimatedDelivery { get; set; }
}

ReturnRequest.cs

namespace CustomerServiceAgent.Models;

/// <summary>
/// 退换货申请模型
/// </summary>
public class ReturnRequest
{
    /// <summary>
    /// 退换货单号
    /// </summary>
    public string ReturnId { get; set; } = string.Empty;

    /// <summary>
    /// 关联的订单号
    /// </summary>
    public string OrderId { get; set; } = string.Empty;

    /// <summary>
    /// 类型:退货 或 换货
    /// </summary>
    public string Type { get; set; } = string.Empty;

    /// <summary>
    /// 退换货原因
    /// </summary>
    public string Reason { get; set; } = string.Empty;

    /// <summary>
    /// 创建时间
    /// </summary>
    public DateTime CreateTime { get; set; }

    /// <summary>
    /// 状态:待审核、已批准、处理中、已完成
    /// </summary>
    public string Status { get; set; } = "待审核";
}

FAQ.cs

namespace CustomerServiceAgent.Models;

/// <summary>
/// 常见问题模型
/// </summary>
public class FAQ
{
    /// <summary>
    /// 问题
    /// </summary>
    public string Question { get; set; } = string.Empty;

    /// <summary>
    /// 答案
    /// </summary>
    public string Answer { get; set; } = string.Empty;

    /// <summary>
    /// 关键词列表,用于匹配
    /// </summary>
    public List<string> Keywords { get; set; } = new();
}

3. 模拟数据库

MockOrderDatabase.cs

using CustomerServiceAgent.Models;

namespace CustomerServiceAgent.Data;

/// <summary>
/// 模拟订单数据库
/// </summary>
public static class MockOrderDatabase
{
    private static readonly List<Order> _orders = new()
    {
        new Order
        {
            OrderId = "ORD20240001",
            ProductName = "无线蓝牙耳机",
            Amount = 299.00m,
            Status = "配送中",
            OrderDate = DateTime.Now.AddDays(-2),
            ShippingInfo = "您的包裹已从北京发出,正在运往上海",
            EstimatedDelivery = DateTime.Now.AddDays(1)
        },
        new Order
        {
            OrderId = "ORD20240002",
            ProductName = "智能手表",
            Amount = 1299.00m,
            Status = "已完成",
            OrderDate = DateTime.Now.AddDays(-10),
            ShippingInfo = "包裹已签收",
            EstimatedDelivery = DateTime.Now.AddDays(-7)
        },
        new Order
        {
            OrderId = "ORD20240003",
            ProductName = "机械键盘",
            Amount = 599.00m,
            Status = "待支付",
            OrderDate = DateTime.Now.AddHours(-2),
            ShippingInfo = "等待支付",
            EstimatedDelivery = null
        }
    };

    /// <summary>
    /// 根据订单号查询订单
    /// </summary>
    public static Order? GetOrderById(string orderId)
    {
        return _orders.FirstOrDefault(o => 
            o.OrderId.Equals(orderId, StringComparison.OrdinalIgnoreCase));
    }

    /// <summary>
    /// 获取所有订单
    /// </summary>
    public static List<Order> GetAllOrders()
    {
        return _orders;
    }
}

MockFAQDatabase.cs

using CustomerServiceAgent.Models;

namespace CustomerServiceAgent.Data;

/// <summary>
/// 模拟FAQ数据库
/// </summary>
public static class MockFAQDatabase
{
    private static readonly List<FAQ> _faqs = new()
    {
        new FAQ
        {
            Question = "营业时间是什么时候?",
            Answer = @"我们的客服服务时间是:
• 周一至周五:9:00 - 21:00
• 周六至周日:10:00 - 18:00
• 在线商城24小时开放,随时可以下单",
            Keywords = new List<string> { "营业时间", "工作时间", "几点", "上班" }
        },
        new FAQ
        {
            Question = "支持哪些支付方式?",
            Answer = @"我们支持以下支付方式:
• 微信支付
• 支付宝
• 银行卡支付
• 信用卡支付
• 货到付款(部分地区)",
            Keywords = new List<string> { "支付", "付款", "怎么付" }
        },
        new FAQ
        {
            Question = "配送需要多长时间?",
            Answer = @"配送时间根据地区不同:
• 同城:1-2个工作日
• 省内:2-3个工作日
• 跨省:3-5个工作日
• 偏远地区:5-7个工作日
我们会在发货后第一时间通知您物流信息。",
            Keywords = new List<string> { "配送", "快递", "多久", "几天" }
        },
        new FAQ
        {
            Question = "退换货政策是什么?",
            Answer = @"我们的退换货政策:
• 7天无理由退货(商品未使用)
• 15天质量问题换货
• 退货运费:质量问题由我们承担,其他情况由买家承担
• 退款时间:收到退货后3个工作日内处理",
            Keywords = new List<string> { "退货", "换货", "退款", "退换" }
        },
        new FAQ
        {
            Question = "会员有什么权益?",
            Answer = @"会员专享权益:
• 全场商品9.5折优惠
• 每月赠送优惠券
• 生日当月双倍积分
• 优先客服服务
• 免费配送(无门槛)",
            Keywords = new List<string> { "会员", "权益", "优惠", "折扣" }
        }
    };

    /// <summary>
    /// 根据关键词搜索FAQ
    /// </summary>
    public static FAQ? SearchFAQ(string query)
    {
        // 简单的关键词匹配
        return _faqs.FirstOrDefault(faq =>
            faq.Keywords.Any(keyword =>
                query.Contains(keyword, StringComparison.OrdinalIgnoreCase)));
    }

    /// <summary>
    /// 获取所有FAQ
    /// </summary>
    public static List<FAQ> GetAllFAQs()
    {
        return _faqs;
    }
}

4. 客服工具类(待完成)

CustomerServiceTools.cs

using System.ComponentModel;
using Microsoft.Extensions.AI;
using CustomerServiceAgent.Models;
using CustomerServiceAgent.Data;

namespace CustomerServiceAgent.Tools;

/// <summary>
/// 客服工具集合
/// </summary>
public class CustomerServiceTools
{
    // TODO: 实现订单查询工具
    [Description("查询订单状态和详细信息")]
    public string QueryOrderStatus(
        [Description("订单号,格式如 ORD20240001")] string orderId)
    {
        // 提示:
        // 1. 使用 MockOrderDatabase.GetOrderById() 查询订单
        // 2. 如果订单不存在,返回友好的提示
        // 3. 如果订单存在,格式化订单信息并返回
        
        throw new NotImplementedException("请实现订单查询功能");
    }

    // TODO: 实现退换货工具
    [Description("创建退换货申请")]
    public string CreateReturnRequest(
        [Description("订单号")] string orderId,
        [Description("退换货原因")] string reason,
        [Description("类型:退货 或 换货")] string type)
    {
        // 提示:
        // 1. 验证订单是否存在
        // 2. 检查订单状态是否允许退换货
        // 3. 生成退换货单号(如 RET + 时间戳)
        // 4. 返回退换货指引
        
        throw new NotImplementedException("请实现退换货功能");
    }

    // TODO: 实现FAQ查询工具
    [Description("查询常见问题的答案")]
    public string GetFAQAnswer(
        [Description("用户的问题")] string question)
    {
        // 提示:
        // 1. 使用 MockFAQDatabase.SearchFAQ() 搜索答案
        // 2. 如果找到答案,返回答案内容
        // 3. 如果没找到,返回提示信息
        
        throw new NotImplementedException("请实现FAQ查询功能");
    }

    // TODO: 实现人工转接工具
    [Description("转接人工客服")]
    public string TransferToHuman(
        [Description("转接原因")] string reason)
    {
        // 提示:
        // 1. 记录转接原因
        // 2. 生成转接单号
        // 3. 返回等待信息和预计时间
        
        throw new NotImplementedException("请实现人工转接功能");
    }
}

5. 主程序(待完成)

Program.cs

using Azure.AI.OpenAI;
using Microsoft.Extensions.AI;
using CustomerServiceAgent.Tools;

// TODO: 配置 Azure OpenAI
string endpoint = "YOUR_AZURE_OPENAI_ENDPOINT";
string apiKey = "YOUR_AZURE_OPENAI_KEY";
string deploymentName = "YOUR_DEPLOYMENT_NAME";

// 提示:从环境变量读取配置更安全
// string endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT") ?? "";

Console.WriteLine("=================================");
Console.WriteLine("   智能客服助手");
Console.WriteLine("=================================");
Console.WriteLine();

try
{
    // TODO: 创建 OpenAI 客户端
    // 提示:使用 AzureOpenAIClient 和 AsChatClient()
    
    // TODO: 创建代理
    // 提示:
    // 1. 设置友好的 Instructions
    // 2. 注册客服工具
    // 3. 配置合适的参数
    
    // TODO: 创建对话线程
    // 提示:使用 AgentThread 保持对话上下文
    
    // TODO: 显示欢迎消息
    
    // TODO: 实现对话循环
    // 提示:
    // 1. 读取用户输入
    // 2. 调用代理处理
    // 3. 显示代理回复
    // 4. 处理退出命令
    
    Console.WriteLine("\n感谢使用智能客服助手!");
}
catch (Exception ex)
{
    Console.WriteLine($"\n发生错误:{ex.Message}");
    Console.WriteLine("请检查配置是否正确。");
}

使用说明

1. 创建项目

dotnet new console -n CustomerServiceAgent
cd CustomerServiceAgent

2. 添加包引用

dotnet add package Azure.AI.OpenAI
dotnet add package Microsoft.Extensions.AI
dotnet add package Microsoft.Extensions.AI.OpenAI

3. 复制代码

将上面的代码文件复制到对应的位置。

4. 配置 Azure OpenAI

Program.cs 中填入你的配置信息。

5. 实现功能

按照 TODO 提示,逐步实现各个功能。

项目1:智能客服助手 - 分步骤实现指南

本指南将带你一步步完成智能客服助手项目。

第一步:实现订单查询工具

目标

实现 QueryOrderStatus 方法,让代理能够查询订单信息。

实现代码

CustomerServiceTools.cs 中,替换 QueryOrderStatus 方法:

[Description("查询订单状态和详细信息")]
public string QueryOrderStatus(
    [Description("订单号,格式如 ORD20240001")] string orderId)
{
    try
    {
        // 1. 查询订单
        var order = MockOrderDatabase.GetOrderById(orderId);
        
        // 2. 订单不存在的情况
        if (order == null)
        {
            return $"抱歉,未找到订单号为 {orderId} 的订单。请检查订单号是否正确。\n" +
                   "订单号格式示例:ORD20240001";
        }
        
        // 3. 格式化订单信息
        var result = $@"
订单信息查询成功!
━━━━━━━━━━━━━━━━━━━━━━━━━━
📦 订单号:{order.OrderId}
🛍️  商品:{order.ProductName}
💰 金额:¥{order.Amount:F2}
📊 状态:{order.Status}
📅 下单时间:{order.OrderDate:yyyy-MM-dd HH:mm}
🚚 物流信息:{order.ShippingInfo}";

        // 4. 添加预计送达时间(如果有)
        if (order.EstimatedDelivery.HasValue)
        {
            result += $"\n⏰ 预计送达:{order.EstimatedDelivery.Value:yyyy-MM-dd}";
        }
        
        result += "\n━━━━━━━━━━━━━━━━━━━━━━━━━━";
        
        return result;
    }
    catch (Exception ex)
    {
        return $"查询订单时发生错误:{ex.Message}";
    }
}

测试提示

完成后,可以测试以下场景:

  • 查询存在的订单:ORD20240001

  • 查询不存在的订单:ORD99999999


第二步:实现FAQ查询工具

目标

实现 GetFAQAnswer 方法,让代理能够回答常见问题。

实现代码

[Description("查询常见问题的答案")]
public string GetFAQAnswer(
    [Description("用户的问题")] string question)
{
    try
    {
        // 1. 搜索FAQ
        var faq = MockFAQDatabase.SearchFAQ(question);
        
        // 2. 如果找到答案
        if (faq != null)
        {
            return $@"
关于「{faq.Question}」
━━━━━━━━━━━━━━━━━━━━━━━━━━
{faq.Answer}
━━━━━━━━━━━━━━━━━━━━━━━━━━";
        }
        
        // 3. 如果没找到答案
        return @"抱歉,我没有找到相关的答案。
您可以:
1. 换个方式描述您的问题
2. 转接人工客服获取帮助
3. 查看我们的帮助中心";
    }
    catch (Exception ex)
    {
        return $"查询FAQ时发生错误:{ex.Message}";
    }
}

测试提示

完成后,可以测试以下问题:

  • "你们的营业时间是什么时候?"

  • "支持哪些支付方式?"

  • "配送需要多久?"


第三步:实现退换货工具

目标

实现 CreateReturnRequest 方法,让代理能够处理退换货申请。

实现代码

// 添加一个静态列表来存储退换货申请
private static List<ReturnRequest> _returnRequests = new();
private static int _returnCounter = 1;

[Description("创建退换货申请")]
public string CreateReturnRequest(
    [Description("订单号")] string orderId,
    [Description("退换货原因")] string reason,
    [Description("类型:退货 或 换货")] string type)
{
    try
    {
        // 1. 验证订单是否存在
        var order = MockOrderDatabase.GetOrderById(orderId);
        if (order == null)
        {
            return $"抱歉,未找到订单号为 {orderId} 的订单。请检查订单号是否正确。";
        }
        
        // 2. 检查订单状态
        if (order.Status == "待支付" || order.Status == "已取消")
        {
            return $"抱歉,订单状态为「{order.Status}」,无法申请退换货。";
        }
        
        // 3. 验证类型
        if (type != "退货" && type != "换货")
        {
            return "请指定类型为「退货」或「换货」。";
        }
        
        // 4. 生成退换货单号
        string returnId = $"RET{DateTime.Now:yyyyMMdd}{_returnCounter:D4}";
        _returnCounter++;
        
        // 5. 创建退换货申请
        var returnRequest = new ReturnRequest
        {
            ReturnId = returnId,
            OrderId = orderId,
            Type = type,
            Reason = reason,
            CreateTime = DateTime.Now,
            Status = "待审核"
        };
        
        _returnRequests.Add(returnRequest);
        
        // 6. 返回处理指引
        string guide = type == "退货" ? 
            @"
📋 退货流程:
1. 将商品恢复原包装
2. 联系快递上门取件(我们承担运费)
3. 等待商品到达仓库
4. 审核通过后3个工作日内退款" :
            @"
📋 换货流程:
1. 将商品恢复原包装
2. 联系快递上门取件
3. 等待商品到达仓库
4. 审核通过后立即发出新商品";

        return $@"
✅ {type}申请已创建成功!

━━━━━━━━━━━━━━━━━━━━━━━━━━
{type}单号:{returnId}
关联订单:{orderId}
商品名称:{order.ProductName}
{type}原因:{reason}
申请时间:{returnRequest.CreateTime:yyyy-MM-dd HH:mm}
当前状态:{returnRequest.Status}
━━━━━━━━━━━━━━━━━━━━━━━━━━
{guide}

💡 温馨提示:
• 请保持商品完好,不影响二次销售
• 请保留好商品吊牌、配件等
• 如有疑问,请联系客服:400-123-4567
";
    }
    catch (Exception ex)
    {
        return $"创建{type}申请时发生错误:{ex.Message}";
    }
}

测试提示

完成后,可以测试:

  • 为已完成的订单申请退货

  • 为配送中的订单申请换货

  • 尝试为待支付订单申请退货(应该被拒绝)


第四步:实现人工转接工具

目标

实现 TransferToHuman 方法,让代理能够转接人工客服。

实现代码

private static int _transferCounter = 1;

[Description("转接人工客服")]
public string TransferToHuman(
    [Description("转接原因")] string reason)
{
    try
    {
        // 1. 生成转接单号
        string transferId = $"TRF{DateTime.Now:yyyyMMdd}{_transferCounter:D4}";
        _transferCounter++;
        
        // 2. 模拟计算等待时间(实际应该从系统获取)
        int waitMinutes = new Random().Next(3, 10);
        
        // 3. 返回转接信息
        return $@"
🔄 正在为您转接人工客服...

━━━━━━━━━━━━━━━━━━━━━━━━━━
转接单号:{transferId}
转接原因:{reason}
当前时间:{DateTime.Now:HH:mm}
预计等待:约 {waitMinutes} 分钟
━━━━━━━━━━━━━━━━━━━━━━━━━━

📞 其他联系方式:
• 客服热线:400-123-4567
• 在线客服:www.example.com/chat
• 工作时间:周一至周五 9:00-21:00

💡 温馨提示:
为了更快地解决您的问题,请准备好:
• 订单号
• 问题描述
• 相关截图(如有)

感谢您的耐心等待!";
    }
    catch (Exception ex)
    {
        return $"转接人工客服时发生错误:{ex.Message}";
    }
}

第五步:实现主程序

目标

完成 Program.cs,创建代理并实现对话循环。

实现代码

using Azure.AI.OpenAI;
using Microsoft.Extensions.AI;
using CustomerServiceAgent.Tools;

// 配置信息(建议从环境变量读取)
string endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT") 
    ?? "YOUR_AZURE_OPENAI_ENDPOINT";
string apiKey = Environment.GetEnvironmentVariable("AZURE_OPENAI_KEY") 
    ?? "YOUR_AZURE_OPENAI_KEY";
string deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT") 
    ?? "gpt-4";

Console.WriteLine("=================================");
Console.WriteLine("   🤖 智能客服助手");
Console.WriteLine("=================================");
Console.WriteLine();

try
{
    // 1. 创建 OpenAI 客户端
    var client = new AzureOpenAIClient(
        new Uri(endpoint),
        new System.ClientModel.ApiKeyCredential(apiKey))
        .AsChatClient(deploymentName);

    // 2. 创建工具实例
    var tools = new CustomerServiceTools();

    // 3. 创建代理
    var agent = new ChatCompletionAgent
    {
        Name = "智能客服助手",
        Instructions = @"
你是一个专业、友好的客服助手。你的职责是:

1. 用礼貌、热情的语气与客户交流
2. 准确理解客户需求
3. 使用合适的工具帮助客户解决问题
4. 当无法处理时,及时转接人工客服

注意事项:
• 始终保持专业和礼貌
• 对客户的问题表示理解和关心
• 提供清晰、具体的信息
• 遇到不确定的情况,不要猜测,而是询问或转接
• 使用表情符号让对话更友好(适度使用)

可用工具:
• QueryOrderStatus: 查询订单信息
• GetFAQAnswer: 回答常见问题
• CreateReturnRequest: 处理退换货申请
• TransferToHuman: 转接人工客服
",
        Kernel = new Kernel()
    };

    // 4. 注册工具
    agent.Kernel.Plugins.AddFromObject(tools);

    // 5. 创建对话线程
    var thread = new AgentThread();

    // 6. 显示欢迎消息
    Console.WriteLine("👋 您好!我是智能客服助手,很高兴为您服务!");
    Console.WriteLine();
    Console.WriteLine("我可以帮您:");
    Console.WriteLine("  • 查询订单状态");
    Console.WriteLine("  • 回答常见问题");
    Console.WriteLine("  • 处理退换货申请");
    Console.WriteLine("  • 转接人工客服");
    Console.WriteLine();
    Console.WriteLine("💡 提示:输入 'exit' 或 'quit' 退出");
    Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━");
    Console.WriteLine();

    // 7. 对话循环
    while (true)
    {
        // 读取用户输入
        Console.Write("您: ");
        string? userInput = Console.ReadLine();

        // 检查退出命令
        if (string.IsNullOrWhiteSpace(userInput) ||
            userInput.Equals("exit", StringComparison.OrdinalIgnoreCase) ||
            userInput.Equals("quit", StringComparison.OrdinalIgnoreCase))
        {
            break;
        }

        Console.WriteLine();

        // 调用代理处理
        try
        {
            Console.Write("客服: ");
            
            await foreach (var message in agent.InvokeAsync(thread, userInput))
            {
                if (message.Content is string content)
                {
                    Console.Write(content);
                }
            }
            
            Console.WriteLine();
            Console.WriteLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ 处理请求时发生错误:{ex.Message}");
            Console.WriteLine("请稍后重试或转接人工客服。");
            Console.WriteLine();
        }
    }

    Console.WriteLine();
    Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━");
    Console.WriteLine("👋 感谢使用智能客服助手!祝您生活愉快!");
}
catch (Exception ex)
{
    Console.WriteLine();
    Console.WriteLine($"❌ 系统错误:{ex.Message}");
    Console.WriteLine();
    Console.WriteLine("请检查:");
    Console.WriteLine("  1. Azure OpenAI 配置是否正确");
    Console.WriteLine("  2. 网络连接是否正常");
    Console.WriteLine("  3. API 密钥是否有效");
}

第六步:配置和运行

1. 设置环境变量

Windows (PowerShell):

$env:AZURE_OPENAI_ENDPOINT="https://your-resource.openai.azure.com/"
$env:AZURE_OPENAI_KEY="your-api-key"
$env:AZURE_OPENAI_DEPLOYMENT="gpt-4"

Windows (CMD):

set AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
set AZURE_OPENAI_KEY=your-api-key
set AZURE_OPENAI_DEPLOYMENT=gpt-4

Linux/Mac:

export AZURE_OPENAI_ENDPOINT="https://your-resource.openai.azure.com/"
export AZURE_OPENAI_KEY="your-api-key"
export AZURE_OPENAI_DEPLOYMENT="gpt-4"

2. 运行项目

dotnet run

第七步:测试场景

测试场景1:查询订单

您: 你好,我想查询订单
客服: 您好!我可以帮您查询订单状态。请提供您的订单号。
您: ORD20240001
客服: [显示订单详情]

测试场景2:咨询问题

您: 你们的营业时间是什么时候?
客服: [显示营业时间信息]

测试场景3:申请退货

您: 我想退货
客服: 好的,我可以帮您处理退货申请。请提供您的订单号。
您: ORD20240002
客服: 请问您退货的原因是什么?
您: 商品有质量问题
客服: [创建退货申请并显示指引]

测试场景4:转接人工

您: 我有个复杂的问题需要咨询
客服: 我理解您的需求。让我为您转接人工客服。
[显示转接信息]

常见问题和解决方案

问题1:代理不调用工具

可能原因:

  • Instructions 不够清晰

  • 工具描述不够准确

  • 用户输入不够明确

解决方案:

  • 优化 Instructions,明确说明何时使用工具

  • 改进工具的 Description

  • 引导用户提供更多信息

问题2:工具返回错误

可能原因:

  • 参数验证不足

  • 异常处理不完善

解决方案:

  • 添加参数验证

  • 完善 try-catch 块

  • 返回友好的错误信息

问题3:对话上下文丢失

可能原因:

  • 没有使用 AgentThread

  • 每次创建新的 thread

解决方案:

  • 确保在循环中使用同一个 thread 实例

  • 检查 thread 是否正确传递


优化建议

1. 改进用户体验

  • 添加打字效果(逐字显示)

  • 使用颜色区分用户和代理消息

  • 添加加载动画

2. 增强功能

  • 添加订单搜索(按商品名称)

  • 实现优惠券查询

  • 添加积分查询功能

3. 提高健壮性

  • 添加输入验证

  • 实现重试机制

  • 添加日志记录

项目1:智能客服助手 - 参考实现

本文档提供完整的参考实现代码,包含所有优化和最佳实践。

完整的 CustomerServiceTools.cs

using System.ComponentModel;
using Microsoft.Extensions.AI;
using CustomerServiceAgent.Models;
using CustomerServiceAgent.Data;

namespace CustomerServiceAgent.Tools;

/// <summary>
/// 客服工具集合 - 完整实现版本
/// </summary>
public class CustomerServiceTools
{
    // 存储退换货申请
    private static readonly List<ReturnRequest> _returnRequests = new();
    private static int _returnCounter = 1;
    private static int _transferCounter = 1;

    /// <summary>
    /// 查询订单状态和详细信息
    /// </summary>
    [Description("查询订单状态和详细信息")]
    public string QueryOrderStatus(
        [Description("订单号,格式如 ORD20240001")] string orderId)
    {
        try
        {
            // 验证订单号格式
            if (string.IsNullOrWhiteSpace(orderId))
            {
                return "请提供有效的订单号。";
            }

            // 查询订单
            var order = MockOrderDatabase.GetOrderById(orderId);

            // 订单不存在
            if (order == null)
            {
                return $@"
❌ 未找到订单

抱歉,未找到订单号为 {orderId} 的订单。

请检查:
• 订单号是否输入正确
• 订单号格式:ORD + 8位数字
• 示例:ORD20240001

如需帮助,请转接人工客服。";
            }

            // 格式化订单信息
            var statusEmoji = order.Status switch
            {
                "待支付" => "⏳",
                "已支付" => "✅",
                "配送中" => "🚚",
                "已完成" => "✅",
                "已取消" => "❌",
                _ => "📦"
            };

            var result = $@"
{statusEmoji} 订单信息查询成功!

━━━━━━━━━━━━━━━━━━━━━━━━━━
📦 订单号:{order.OrderId}
🛍️  商品:{order.ProductName}
💰 金额:¥{order.Amount:F2}
📊 状态:{order.Status}
📅 下单时间:{order.OrderDate:yyyy-MM-dd HH:mm}
🚚 物流信息:{order.ShippingInfo}";

            if (order.EstimatedDelivery.HasValue)
            {
                result += $"\n⏰ 预计送达:{order.EstimatedDelivery.Value:yyyy-MM-dd}";
            }

            result += "\n━━━━━━━━━━━━━━━━━━━━━━━━━━";

            // 根据状态提供额外提示
            result += order.Status switch
            {
                "待支付" => "\n\n💡 提示:请尽快完成支付,订单将在24小时后自动取消。",
                "配送中" => "\n\n💡 提示:您可以随时查询物流信息,如有问题请联系客服。",
                "已完成" => "\n\n💡 提示:如需退换货,请在收货后7天内申请。",
                _ => ""
            };

            return result;
        }
        catch (Exception ex)
        {
            return $"❌ 查询订单时发生错误:{ex.Message}\n请稍后重试或联系客服。";
        }
    }

    /// <summary>
    /// 创建退换货申请
    /// </summary>
    [Description("创建退换货申请")]
    public string CreateReturnRequest(
        [Description("订单号")] string orderId,
        [Description("退换货原因")] string reason,
        [Description("类型:退货 或 换货")] string type)
    {
        try
        {
            // 验证输入
            if (string.IsNullOrWhiteSpace(orderId))
            {
                return "请提供订单号。";
            }

            if (string.IsNullOrWhiteSpace(reason))
            {
                return "请说明退换货原因。";
            }

            // 验证订单是否存在
            var order = MockOrderDatabase.GetOrderById(orderId);
            if (order == null)
            {
                return $"❌ 未找到订单号为 {orderId} 的订单。请检查订单号是否正确。";
            }

            // 检查订单状态
            if (order.Status == "待支付")
            {
                return "❌ 订单尚未支付,无法申请退换货。您可以直接取消订单。";
            }

            if (order.Status == "已取消")
            {
                return "❌ 订单已取消,无法申请退换货。";
            }

            // 检查是否已经申请过
            var existingRequest = _returnRequests.FirstOrDefault(r => 
                r.OrderId == orderId && r.Status != "已完成");
            if (existingRequest != null)
            {
                return $@"
⚠️ 该订单已有进行中的{existingRequest.Type}申请

{existingRequest.Type}单号:{existingRequest.ReturnId}
状态:{existingRequest.Status}

如需查询进度,请联系客服。";
            }

            // 规范化类型
            type = type.Contains("退") ? "退货" : type.Contains("换") ? "换货" : type;

            if (type != "退货" && type != "换货")
            {
                return "请指定类型为「退货」或「换货」。";
            }

            // 生成退换货单号
            string returnId = $"RET{DateTime.Now:yyyyMMdd}{_returnCounter:D4}";
            _returnCounter++;

            // 创建退换货申请
            var returnRequest = new ReturnRequest
            {
                ReturnId = returnId,
                OrderId = orderId,
                Type = type,
                Reason = reason,
                CreateTime = DateTime.Now,
                Status = "待审核"
            };

            _returnRequests.Add(returnRequest);

            // 生成处理指引
            string guide = type == "退货" ?
                @"
📋 退货流程:
1️⃣ 将商品恢复原包装(保持商品完好)
2️⃣ 联系快递上门取件
   • 快递费用由我们承担
   • 客服会提供快递单号
3️⃣ 等待商品到达仓库(约2-3天)
4️⃣ 审核通过后3个工作日内退款

💰 退款说明:
• 退款将原路返回到您的支付账户
• 如使用优惠券,优惠券不退回" :
                @"
📋 换货流程:
1️⃣ 将商品恢复原包装(保持商品完好)
2️⃣ 联系快递上门取件
   • 快递费用由我们承担
   • 客服会提供快递单号
3️⃣ 等待商品到达仓库(约2-3天)
4️⃣ 审核通过后立即发出新商品
5️⃣ 新商品预计3-5天送达

📦 换货说明:
• 换货商品与原商品相同
• 如需换其他商品,请先退货再下单";

            return $@"
✅ {type}申请已创建成功!

━━━━━━━━━━━━━━━━━━━━━━━━━━
🔖 {type}单号:{returnId}
📦 关联订单:{orderId}
🛍️  商品名称:{order.ProductName}
💰 订单金额:¥{order.Amount:F2}
📝 {type}原因:{reason}
📅 申请时间:{returnRequest.CreateTime:yyyy-MM-dd HH:mm}
📊 当前状态:{returnRequest.Status}
━━━━━━━━━━━━━━━━━━━━━━━━━━
{guide}

💡 温馨提示:
• 请保持商品完好,不影响二次销售
• 请保留好商品吊牌、配件、发票等
• 商品需在收货后7天内寄回
• 如有疑问,请联系客服:400-123-4567

📞 需要帮助?
• 在线客服:www.example.com/chat
• 客服热线:400-123-4567
• 工作时间:周一至周五 9:00-21:00
";
        }
        catch (Exception ex)
        {
            return $"❌ 创建{type}申请时发生错误:{ex.Message}\n请稍后重试或联系客服。";
        }
    }

    /// <summary>
    /// 查询常见问题的答案
    /// </summary>
    [Description("查询常见问题的答案")]
    public string GetFAQAnswer(
        [Description("用户的问题")] string question)
    {
        try
        {
            if (string.IsNullOrWhiteSpace(question))
            {
                return "请告诉我您想了解什么问题。";
            }

            // 搜索FAQ
            var faq = MockFAQDatabase.SearchFAQ(question);

            // 如果找到答案
            if (faq != null)
            {
                return $@"
💡 关于「{faq.Question}」

━━━━━━━━━━━━━━━━━━━━━━━━━━
{faq.Answer}
━━━━━━━━━━━━━━━━━━━━━━━━━━

还有其他问题吗?我随时为您服务!";
            }

            // 如果没找到答案,提供帮助选项
            return @"
🤔 抱歉,我没有找到相关的答案。

您可以:
1️⃣ 换个方式描述您的问题
2️⃣ 查看常见问题列表
3️⃣ 转接人工客服获取帮助

💡 常见问题包括:
• 营业时间
• 支付方式
• 配送时间
• 退换货政策
• 会员权益

请告诉我您想了解哪方面的信息?";
        }
        catch (Exception ex)
        {
            return $"❌ 查询FAQ时发生错误:{ex.Message}\n请稍后重试。";
        }
    }

    /// <summary>
    /// 转接人工客服
    /// </summary>
    [Description("转接人工客服")]
    public string TransferToHuman(
        [Description("转接原因")] string reason)
    {
        try
        {
            // 生成转接单号
            string transferId = $"TRF{DateTime.Now:yyyyMMdd}{_transferCounter:D4}";
            _transferCounter++;

            // 获取当前时间
            var now = DateTime.Now;
            var hour = now.Hour;

            // 判断是否在工作时间
            bool isWorkingHours = (now.DayOfWeek >= DayOfWeek.Monday && 
                                   now.DayOfWeek <= DayOfWeek.Friday &&
                                   hour >= 9 && hour < 21) ||
                                  (now.DayOfWeek == DayOfWeek.Saturday || 
                                   now.DayOfWeek == DayOfWeek.Sunday &&
                                   hour >= 10 && hour < 18);

            // 模拟计算等待时间
            int waitMinutes = isWorkingHours ? 
                new Random().Next(3, 10) : 0;

            string waitInfo = isWorkingHours ?
                $"⏰ 预计等待:约 {waitMinutes} 分钟" :
                "⚠️ 当前不在工作时间,建议您:\n   • 留言,我们会尽快回复\n   • 工作时间再次联系";

            return $@"
🔄 正在为您转接人工客服...

━━━━━━━━━━━━━━━━━━━━━━━━━━
🔖 转接单号:{transferId}
📝 转接原因:{reason}
🕐 当前时间:{now:yyyy-MM-dd HH:mm}
{waitInfo}
━━━━━━━━━━━━━━━━━━━━━━━━━━

📞 其他联系方式:
• 客服热线:400-123-4567
• 在线客服:www.example.com/chat
• 邮箱:service@example.com

⏰ 工作时间:
• 周一至周五:9:00 - 21:00
• 周六至周日:10:00 - 18:00

💡 为了更快地解决您的问题,请准备好:
✓ 订单号(如有)
✓ 问题详细描述
✓ 相关截图或照片(如有)

感谢您的耐心等待,我们会尽快为您服务!";
        }
        catch (Exception ex)
        {
            return $@"
❌ 转接人工客服时发生错误:{ex.Message}

请直接拨打客服热线:400-123-4567
或访问在线客服:www.example.com/chat

我们会尽快为您服务!";
        }
    }

    /// <summary>
    /// 获取所有退换货申请(用于调试)
    /// </summary>
    public static List<ReturnRequest> GetAllReturnRequests()
    {
        return _returnRequests;
    }
}

优化的 Program.cs

using Azure.AI.OpenAI;
using Microsoft.Extensions.AI;
using CustomerServiceAgent.Tools;
using System.Text;

// 设置控制台编码以支持表情符号
Console.OutputEncoding = Encoding.UTF8;

// 配置信息
string endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT") 
    ?? throw new InvalidOperationException("请设置 AZURE_OPENAI_ENDPOINT 环境变量");
string apiKey = Environment.GetEnvironmentVariable("AZURE_OPENAI_KEY") 
    ?? throw new InvalidOperationException("请设置 AZURE_OPENAI_KEY 环境变量");
string deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT") 
    ?? "gpt-4";

// 显示欢迎界面
ShowWelcome();

try
{
    // 创建 OpenAI 客户端
    var client = new AzureOpenAIClient(
        new Uri(endpoint),
        new System.ClientModel.ApiKeyCredential(apiKey))
        .AsChatClient(deploymentName);

    // 创建工具实例
    var tools = new CustomerServiceTools();

    // 创建代理
    var agent = new ChatCompletionAgent
    {
        Name = "智能客服助手",
        Instructions = @"
你是一个专业、友好、高效的客服助手。你的使命是为客户提供优质的服务体验。

核心职责:
1. 用礼貌、热情、专业的语气与客户交流
2. 准确理解客户需求,提供精准的帮助
3. 主动使用工具解决客户问题
4. 当无法处理时,及时转接人工客服

交流原则:
• 始终保持礼貌和耐心
• 对客户的问题表示理解和关心
• 提供清晰、具体、可操作的信息
• 使用适当的表情符号让对话更友好(但不要过度)
• 遇到不确定的情况,不要猜测,而是询问或转接

工具使用指南:
• QueryOrderStatus: 当客户询问订单、物流、配送时使用
• GetFAQAnswer: 当客户询问政策、规则、常见问题时使用
• CreateReturnRequest: 当客户明确要退货或换货时使用
• TransferToHuman: 当问题复杂或超出能力范围时使用

特别注意:
• 在创建退换货申请前,确保已获取订单号和原因
• 如果客户没有提供必要信息,礼貌地询问
• 对于投诉或不满,表示理解和歉意,并积极解决
• 保护客户隐私,不要询问敏感信息
",
        Kernel = new Kernel()
    };

    // 注册工具
    agent.Kernel.Plugins.AddFromObject(tools);

    // 创建对话线程
    var thread = new AgentThread();

    // 对话循环
    while (true)
    {
        // 读取用户输入
        Console.Write("\n💬 您: ");
        string? userInput = Console.ReadLine();

        // 检查退出命令
        if (string.IsNullOrWhiteSpace(userInput))
        {
            continue;
        }

        if (userInput.Equals("exit", StringComparison.OrdinalIgnoreCase) ||
            userInput.Equals("quit", StringComparison.OrdinalIgnoreCase) ||
            userInput.Equals("再见", StringComparison.OrdinalIgnoreCase))
        {
            ShowGoodbye();
            break;
        }

        // 特殊命令
        if (userInput.Equals("help", StringComparison.OrdinalIgnoreCase) ||
            userInput.Equals("帮助", StringComparison.OrdinalIgnoreCase))
        {
            ShowHelp();
            continue;
        }

        if (userInput.Equals("clear", StringComparison.OrdinalIgnoreCase) ||
            userInput.Equals("清屏", StringComparison.OrdinalIgnoreCase))
        {
            Console.Clear();
            ShowWelcome();
            continue;
        }

        // 调用代理处理
        try
        {
            Console.Write("\n🤖 客服: ");

            bool hasResponse = false;
            await foreach (var message in agent.InvokeAsync(thread, userInput))
            {
                if (message.Content is string content && !string.IsNullOrWhiteSpace(content))
                {
                    Console.Write(content);
                    hasResponse = true;
                }
            }

            if (!hasResponse)
            {
                Console.Write("抱歉,我现在无法回复。请稍后重试或转接人工客服。");
            }

            Console.WriteLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"\n❌ 处理请求时发生错误:{ex.Message}");
            Console.WriteLine("请稍后重试或输入「转接人工」获取帮助。");
        }
    }
}
catch (Exception ex)
{
    Console.WriteLine();
    Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━");
    Console.WriteLine($"❌ 系统错误:{ex.Message}");
    Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━");
    Console.WriteLine();
    Console.WriteLine("请检查:");
    Console.WriteLine("  1. Azure OpenAI 配置是否正确");
    Console.WriteLine("  2. 环境变量是否已设置");
    Console.WriteLine("  3. 网络连接是否正常");
    Console.WriteLine("  4. API 密钥是否有效");
    Console.WriteLine();
    Console.WriteLine("设置环境变量示例(PowerShell):");
    Console.WriteLine("  $env:AZURE_OPENAI_ENDPOINT=\"https://your-resource.openai.azure.com/\"");
    Console.WriteLine("  $env:AZURE_OPENAI_KEY=\"your-api-key\"");
    Console.WriteLine("  $env:AZURE_OPENAI_DEPLOYMENT=\"gpt-4\"");
}

// 辅助方法
static void ShowWelcome()
{
    Console.WriteLine("╔═══════════════════════════════════════╗");
    Console.WriteLine("║                                       ║");
    Console.WriteLine("║       🤖 智能客服助手 v1.0           ║");
    Console.WriteLine("║                                       ║");
    Console.WriteLine("╚═══════════════════════════════════════╝");
    Console.WriteLine();
    Console.WriteLine("👋 您好!我是智能客服助手,很高兴为您服务!");
    Console.WriteLine();
    Console.WriteLine("我可以帮您:");
    Console.WriteLine("  📦 查询订单状态");
    Console.WriteLine("  💡 回答常见问题");
    Console.WriteLine("  🔄 处理退换货申请");
    Console.WriteLine("  👤 转接人工客服");
    Console.WriteLine();
    Console.WriteLine("💡 提示:");
    Console.WriteLine("  • 输入 'help' 查看帮助");
    Console.WriteLine("  • 输入 'clear' 清屏");
    Console.WriteLine("  • 输入 'exit' 或 '再见' 退出");
    Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
}

static void ShowHelp()
{
    Console.WriteLine();
    Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    Console.WriteLine("📖 帮助信息");
    Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    Console.WriteLine();
    Console.WriteLine("🔍 查询订单:");
    Console.WriteLine("  \"我想查询订单 ORD20240001\"");
    Console.WriteLine("  \"查一下我的订单状态\"");
    Console.WriteLine();
    Console.WriteLine("💡 咨询问题:");
    Console.WriteLine("  \"你们的营业时间是什么时候?\"");
    Console.WriteLine("  \"支持哪些支付方式?\"");
    Console.WriteLine();
    Console.WriteLine("🔄 退换货:");
    Console.WriteLine("  \"我想退货\"");
    Console.WriteLine("  \"申请换货\"");
    Console.WriteLine();
    Console.WriteLine("👤 转接人工:");
    Console.WriteLine("  \"转接人工客服\"");
    Console.WriteLine("  \"我要找人工\"");
    Console.WriteLine();
    Console.WriteLine("⌨️ 命令:");
    Console.WriteLine("  help  - 显示此帮助");
    Console.WriteLine("  clear - 清屏");
    Console.WriteLine("  exit  - 退出程序");
    Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
}

static void ShowGoodbye()
{
    Console.WriteLine();
    Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    Console.WriteLine("👋 感谢使用智能客服助手!");
    Console.WriteLine();
    Console.WriteLine("如有任何问题,欢迎随时回来!");
    Console.WriteLine("祝您生活愉快!😊");
    Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
}

运行效果示例

╔═══════════════════════════════════════╗
║                                       ║
║       🤖 智能客服助手 v1.0           ║
║                                       ║
╚═══════════════════════════════════════╝

👋 您好!我是智能客服助手,很高兴为您服务!

我可以帮您:
  📦 查询订单状态
  💡 回答常见问题
  🔄 处理退换货申请
  👤 转接人工客服

💡 提示:
  • 输入 'help' 查看帮助
  • 输入 'clear' 清屏
  • 输入 'exit' 或 '再见' 退出
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

💬 您: 你好

🤖 客服: 您好!👋 很高兴为您服务!我是智能客服助手,可以帮您查询订单、回答问题、处理退换货等。请问有什么可以帮您的吗?

💬 您: 我想查询订单 ORD20240001

🤖 客服: 好的,让我为您查询订单信息...

🚚 订单信息查询成功!

━━━━━━━━━━━━━━━━━━━━━━━━━━
📦 订单号:ORD20240001
🛍️  商品:无线蓝牙耳机
💰 金额:¥299.00
📊 状态:配送中
📅 下单时间:2024-11-23 10:30
🚚 物流信息:您的包裹已从北京发出,正在运往上海
⏰ 预计送达:2024-11-26
━━━━━━━━━━━━━━━━━━━━━━━━━━

💡 提示:您可以随时查询物流信息,如有问题请联系客服。

您的包裹正在配送中,预计明天就能送达!还有其他需要帮助的吗?😊

项目总结

实现的功能

✅ 订单查询 ✅ 常见问题解答 ✅ 退换货处理 ✅ 人工客服转接 ✅ 对话记忆 ✅ 友好的用户界面 ✅ 完善的错误处理

使用的技术

  • Microsoft Agent Framework

  • Azure OpenAI

  • C# 12 / .NET 8

  • 函数调用(Function Calling)

  • 对话线程(AgentThread)

学到的知识点

  1. 如何设计和实现 AI 代理

  2. 如何创建和注册工具

  3. 如何管理对话上下文

  4. 如何处理错误和异常

  5. 如何优化用户体验

可能的扩展

  • 集成真实数据库

  • 添加 Web 界面

  • 实现语音交互

  • 添加情感分析

  • 支持多语言

  • 集成支付系统

  • 添加推荐功能

恭喜你完成了这个项目!🎉

更多AIGC文章

RAG技术全解:从原理到实战的简明指南

更多VibeCoding文章

更多Agent文章

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐