【Java-LangChain:使用 ChatGPT API 搭建系统-3】评估输入-分类-CSDN博客
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
第三章 评估输入-分类
在本章中我们将重点讨论评估输入任务这对于确保系统的质量和安全性至关重要。
对于需要处理不同情况下的许多独立指令集的任务首先对查询类型进行分类并以此为基础确定要使用哪些指令具有诸多益处。
这可以通过定义固定的类别和 hard-coding 与处理给定类别任务相关的指令来实现。
例如在构建客户服务助手时首先对查询类型进行分类然后根据该分类确定要使用哪些指令这一点可能非常重要。
举个具体的例子如果用户要求关闭其帐户那么二级指令可能是添加有关如何关闭账户的额外说明而如果用户询问特定产品的信息则二级指令可能会添加更多的产品信息。
环境配置
参考第二章的 环境配置小节内容即可。
对用户指令进行分类
在这里我们使用系统消息 system_message 作为系统的全局指导并选用 # 作为分隔符。
分隔符是一种用于区分指令或输出中不同部分的工具它能帮助模型识别各个部分从而提高系统在执行特定任务时的准确性和效率。
在这个例子中我们选择使用 # 作为分隔符。
#
是一个理想的分隔符因为它可以被视为一个独立的 token。
private String delimiter = "###";
这是我们的 system message我们正在以下面的方式询问模型。
private String system = "你将获得客户服务查询。\n" +
"每个客户服务查询都将用{delimiter}字符分隔。\n" +
"将每个查询分类到一个主要类别和一个次要类别中。\n" +
"以 JSON 格式提供你的输出包含以下键primary 和 secondary。\n" +
"\n" +
"主要类别计费Billing、技术支持Technical Support、账户管理Account Management或一般咨询General Inquiry。\n" +
"\n" +
"计费次要类别\n" +
"取消订阅或升级Unsubscribe or upgrade\n" +
"添加付款方式Add a payment method\n" +
"收费解释Explanation for charge\n" +
"争议费用Dispute a charge\n" +
"\n" +
"技术支持次要类别\n" +
"常规故障排除General troubleshooting\n" +
"设备兼容性Device compatibility\n" +
"软件更新Software updates\n" +
"\n" +
"账户管理次要类别\n" +
"重置密码Password reset\n" +
"更新个人信息Update personal information\n" +
"关闭账户Close account\n" +
"账户安全Account security\n" +
"\n" +
"一般咨询次要类别\n" +
"产品信息Product information\n" +
"定价Pricing\n" +
"反馈Feedback\n" +
"与人工对话Speak to a human";
现在我们来看一个用户消息user message的例子。
String message = "我希望你删除我的个人资料和所有用户数据。";
将这个消息格式化为一个消息列表系统消息和用户消息使用"####"进行分隔。 我们思考一下作为人类这句话属于哪个类别“我想让您删除我的个人资料。“这句话看上去属于"账户管理”或者属于"关闭账户”。
String message = "我希望你删除我的个人资料和所有用户数据。";
List<ChatMessage> chatMessages = new ArrayList<>();
ChatMessage chatMessage = new ChatMessage();
chatMessage.setRole("system");
chatMessage.setContent(system);
chatMessages.add(chatMessage);
ChatMessage chatMessage2 = new ChatMessage();
chatMessage2.setRole("user");
chatMessage2.setContent(delimiter + message + delimiter);
chatMessages.add(chatMessage2);
String result = this.getCompletionFromMessage(chatMessages, 1);
log.info("test1:\n{}", result);
{"primary": "账户管理", "secondary": "关闭账户"}
让我们看看模型是如何思考的, 模型的分类是将"账户管理"作为"primary"“关闭账户"作为"secondary”。
请求结构化输出如 JSON的好处是您可以轻松地将其读入某个对象中如果您使用其他语言也可以转换为其他对象然后输入到后续步骤中。
这是另一个用户消息: "告诉我更多关于你们的平板电视的信息"我们运用相同的消息列表来获取模型的响应然后打印出来。
这里返回了另一个分类结果并且看起来应该是正确的。
String message = "告诉我更多有关你们的平板电脑的信息";
List<ChatMessage> chatMessages = new ArrayList<>();
ChatMessage chatMessage = new ChatMessage();
chatMessage.setRole("system");
chatMessage.setContent(system);
chatMessages.add(chatMessage);
ChatMessage chatMessage2 = new ChatMessage();
chatMessage2.setRole("user");
chatMessage2.setContent(delimiter + message + delimiter);
chatMessages.add(chatMessage2);
String result = this.getCompletionFromMessage(chatMessages, 1);
log.info("test2:\n{}", result);
{
"primary": "一般咨询",
"secondary": "产品信息"
}
如果您有任何特定的问题或需要更详细的信息请告诉我我会尽力回答。
因此根据客户咨询的分类我们现在可以提供一套更具体的指令来处理后续步骤。
在这种情况下我们可能会添加关于电视的额外信息而在其他情况下我们可能希望提供关闭账户的链接或类似的内容。 在接下来的章节中我们将进一步了解处理输入的不同方法.
Java快速转换到大模型开发
配套课程的所有代码已经发布在https://github.com/Starcloud-Cloud/java-langchain
课程合作请留言
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |