AgentFramework-零基础入门-第09章_实战项目1_智能客服助手
本项目开发了一个基于Azure OpenAI的智能客服助手系统,具备订单查询、FAQ解答、退换货处理和人工转接四大核心功能。系统采用C#/.NET 8开发,通过Microsoft Agent Framework实现对话管理,包含模拟数据库层和工具层设计。关键技术包括函数调用、对话线程管理、错误处理等,提供了友好的控制台交互界面。项目完整实现了需求文档中的所有功能,并进行了用户体验优化,如添加表情符

项目1:智能客服助手 - 需求文档
项目概述
在本项目中,你将创建一个智能客服助手系统,它能够:
-
回答常见问题
-
查询订单状态
-
处理退换货请求
-
转接人工客服
这个项目将综合运用前面学到的多个知识点:代理创建、工具调用、记忆功能等。
项目目标
通过完成这个项目,你将:
-
掌握如何设计一个实用的 AI 代理系统
-
学会如何为代理添加多个实用工具
-
理解如何处理不同类型的用户请求
-
实践错误处理和用户体验优化
功能需求
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小时开放,随时可以下单。
评估标准
完成的项目应该满足:
-
✅ 所有功能都能正常工作
-
✅ 代码结构清晰,易于理解
-
✅ 有适当的错误处理
-
✅ 用户体验友好
-
✅ 代码有适当的注释
预计完成时间
-
初级学习者: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. 错误处理策略
常见错误场景
-
订单不存在
-
友好提示用户检查订单号
-
提供订单号格式示例
-
-
工具调用失败
-
捕获异常
-
向用户道歉
-
提供替代方案(如转接人工)
-
-
用户输入不明确
-
礼貌地请求更多信息
-
提供选项让用户选择
-
-
系统错误
-
记录错误日志
-
向用户道歉
-
提供人工客服联系方式
-
实现步骤建议
第一步:搭建基础框架
-
创建控制台项目
-
配置 Azure OpenAI 连接
-
创建基本的代理
第二步:准备模拟数据
-
创建订单数据类
-
准备一些测试订单
-
创建FAQ知识库
第三步:实现工具
-
从最简单的工具开始(FAQ查询)
-
逐个实现其他工具
-
测试每个工具的功能
第四步:集成代理和工具
-
将工具注册到代理
-
测试代理能否正确调用工具
-
优化代理的指令
第五步:完善用户体验
-
添加欢迎消息
-
优化输出格式
-
添加错误处理
-
测试各种场景
第六步:测试和优化
-
测试所有功能
-
优化响应速度
-
改进回复质量
技术要点
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}" : "")}
━━━━━━━━━━━━━━━━━━━━
";
}
扩展建议
完成基础功能后,可以尝试:
-
添加更多工具(如优惠券查询、积分查询)
-
实现情感分析,识别用户情绪
-
添加多语言支持
-
集成真实的数据库
-
添加 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)
学到的知识点
-
如何设计和实现 AI 代理
-
如何创建和注册工具
-
如何管理对话上下文
-
如何处理错误和异常
-
如何优化用户体验
可能的扩展
-
集成真实数据库
-
添加 Web 界面
-
实现语音交互
-
添加情感分析
-
支持多语言
-
集成支付系统
-
添加推荐功能
恭喜你完成了这个项目!🎉
更多推荐



所有评论(0)