【Java-LangChain:使用 ChatGPT API 搭建系统-5】处理输入-思维链推理

第五章,处理输入-思维链推理

在本章中,我们将专注于处理输入,即通过一系列步骤生成有用地输出。

有时,模型在回答特定问题之前需要进行详细地推理。如果您参加过我们之前的课程,您将看到许多这样的例子。有时,模型可能会因为过于匆忙得出结论而在推理过程中出错。因此,我们可以重新构思查询,要求模型在给出最终答案之前提供一系列相关的推理步骤,这样它就可以更长时间、更深入地思考问题。

通常,我们称这种要求模型逐步推理问题的策略为思维链推理(chain of thought reasoning)。

环境配置

参考第二章的 环境配置小节内容即可。

二,思维链 Prompt

java 复制代码
    private String delimiter = "###";

    private String system = "请按照以下步骤回答客户的查询。客户的查询将以四个井号(#)分隔,即 " + delimiter + "。\n" +
            "\n" +
            "步骤 1:" + delimiter + " 首先确定用户是否正在询问有关特定产品或产品的问题。产品类别不计入范围。\n" +
            "\n" +
            "步骤 2:" + delimiter + " 如果用户询问特定产品,请确认产品是否在以下列表中。所有可用产品:\n" +
            "\n" +
            "产品:TechPro 超极本\n" +
            "类别:计算机和笔记本电脑\n" +
            "品牌:TechPro\n" +
            "型号:TP-UB100\n" +
            "保修期:1 年\n" +
            "评分:4.5\n" +
            "特点:13.3 英寸显示屏,8GB RAM,256GB SSD,Intel Core i5 处理器\n" +
            "描述:一款适用于日常使用的时尚轻便的超极本。\n" +
            "价格:$799.99\n" +
            "\n" +
            "产品:BlueWave 游戏笔记本电脑\n" +
            "类别:计算机和笔记本电脑\n" +
            "品牌:BlueWave\n" +
            "型号:BW-GL200\n" +
            "保修期:2 年\n" +
            "评分:4.7\n" +
            "特点:15.6 英寸显示屏,16GB RAM,512GB SSD,NVIDIA GeForce RTX 3060\n" +
            "描述:一款高性能的游戏笔记本电脑,提供沉浸式体验。\n" +
            "价格:$1199.99\n" +
            "\n" +
            "产品:PowerLite 可转换笔记本电脑\n" +
            "类别:计算机和笔记本电脑\n" +
            "品牌:PowerLite\n" +
            "型号:PL-CV300\n" +
            "保修期:1年\n" +
            "评分:4.3\n" +
            "特点:14 英寸触摸屏,8GB RAM,256GB SSD,360 度铰链\n" +
            "描述:一款多功能可转换笔记本电脑,具有响应触摸屏。\n" +
            "价格:$699.99\n" +
            "\n" +
            "产品:TechPro 台式电脑\n" +
            "类别:计算机和笔记本电脑\n" +
            "品牌:TechPro\n" +
            "型号:TP-DT500\n" +
            "保修期:1年\n" +
            "评分:4.4\n" +
            "特点:Intel Core i7 处理器,16GB RAM,1TB HDD,NVIDIA GeForce GTX 1660\n" +
            "描述:一款功能强大的台式电脑,适用于工作和娱乐。\n" +
            "价格:$999.99\n" +
            "\n" +
            "产品:BlueWave Chromebook\n" +
            "类别:计算机和笔记本电脑\n" +
            "品牌:BlueWave\n" +
            "型号:BW-CB100\n" +
            "保修期:1 年\n" +
            "评分:4.1\n" +
            "特点:11.6 英寸显示屏,4GB RAM,32GB eMMC,Chrome OS\n" +
            "描述:一款紧凑而价格实惠的 Chromebook,适用于日常任务。\n" +
            "价格:$249.99\n" +
            "\n" +
            "步骤 3:" + delimiter + " 如果消息中包含上述列表中的产品,请列出用户在消息中做出的任何假设,例如笔记本电脑 X 比笔记本电脑 Y 大,或者笔记本电脑 Z 有 2 年保修期。\n" +
            "\n" +
            "步骤 4:" + delimiter + " 如果用户做出了任何假设,请根据产品信息确定假设是否正确。\n" +
            "\n" +
            "步骤 5:" + delimiter + " 如果用户有任何错误的假设,请先礼貌地纠正客户的错误假设(如果适用)。只提及或引用可用产品列表中的产品,因为这是商店销售的唯一五款产品。以友好的口吻回答客户。\n" +
            "\n" +
            "使用以下格式回答问题:\n" +
            "步骤 1:" + delimiter + " <步骤 1的推理>\n" +
            "步骤 2:" + delimiter + " <步骤 2 的推理>\n" +
            "步骤 3:" + delimiter + " <步骤 3 的推理>\n" +
            "步骤 4:" + delimiter + " <步骤 4 的推理>\n" +
            "回复客户:{delimiter} <回复客户的内容>\n" +
            "\n" +
            "请确保在每个步骤之间使用 {" + delimiter + "} 进行分隔。";
java 复制代码
        String user = "BlueWave Chromebook 比 TechPro 台式电脑贵多少?";

        List<ChatMessage> messages = new ArrayList<>();

        ChatMessage systemMessage = new ChatMessage();
        systemMessage.setRole("system");
        systemMessage.setContent(system);
        messages.add(systemMessage);
        
        ChatMessage userMessage = new ChatMessage();
        userMessage.setRole("user");
        userMessage.setContent(user);
        messages.add(userMessage);

        String message = this.getCompletionFromMessage(messages, 1);

        log.info("test1:\n{}", message);
步骤 1:### 用户询问特定产品之间的价格差异。

步骤 2:### 用户询问的产品是 BlueWave Chromebook 和 TechPro 台式电脑。

步骤 3:### 用户假设 BlueWave Chromebook 比 TechPro 台式电脑贵。

步骤 4:### 根据产品信息,我们可以确定用户的假设是错误的。

回复客户:###

TechPro 台式电脑的价格是 $999.99,而 BlueWave Chromebook 的价格是 $249.99。因此,TechPro 台式电脑比 BlueWave Chromebook 贵 $750。请注意,这些是商店销售的唯一五款产品。
java 复制代码
        String user = delimiter + "你有电视机嘛?" + delimiter;

        List<ChatMessage> messages = new ArrayList<>();

        ChatMessage systemMessage = new ChatMessage();
        systemMessage.setRole("system");
        systemMessage.setContent(system);
        messages.add(systemMessage);

        ChatMessage userMessage = new ChatMessage();
        userMessage.setRole("user");
        userMessage.setContent(user);
        messages.add(userMessage);

        String message = this.getCompletionFromMessage(messages, 0);

        log.info("test2:\n{}", message);
步骤 1:### 确定用户是否询问有关特定产品或产品的问题。

步骤 2:### 没有电视机在可用产品列表中。

回复客户:### 很抱歉,我们目前没有可用的电视机产品。我们的产品范围主要包括计算机和笔记本电脑。如果您对其他产品有任何疑问,请随时告诉我。

三,内心独白

对于某些应用程序,模型的推理过程可能不适合与用户共享。例如,在辅导类应用程序中,我们可能希望鼓励学生自行解决问题,但模型对学生解决方案的推理过程可能会泄露答案。

内心独白是一种可以用来缓解这种情况的策略,这是一种隐藏模型推理过程的高级方法。

内心独白的思想是让模型以一种不会透露答案的方式生成部分输出,这样用户就无法看到完整的推理过程。目标是将这些部分隐藏在一个结构化的格式中,使得传递它们变得容易。然后,在向用户呈现输出之前,对输出进行一些转化,使得只有部分输出是可见的。

java 复制代码
        String user = delimiter + "你有电视机嘛?" + delimiter;

        List<ChatMessage> messages = new ArrayList<>();

        ChatMessage systemMessage = new ChatMessage();
        systemMessage.setRole("system");
        systemMessage.setContent(system);
        messages.add(systemMessage);

        ChatMessage userMessage = new ChatMessage();
        userMessage.setRole("user");
        userMessage.setContent(user);
        messages.add(userMessage);

        String message = this.getCompletionFromMessage(messages, 0);

        //取出最后一行回复内容
        String lastElement = Arrays.stream(message.split(delimiter))
                .reduce((first, second) -> second)
                .orElse(null);

        log.info("test3:\n{}", lastElement);
是的,我们有电视机。我们有多种品牌和型号可供选择。您对哪个品牌或型号感兴趣?

Java快速转换到大模型开发:

配套课程的所有代码已经发布在:https://github.com/Starcloud-Cloud/java-langchain

课程合作请留言

相关推荐
litGrey7 分钟前
Maven国内镜像(四种)
java·数据库·maven
丶白泽33 分钟前
重修设计模式-结构型-桥接模式
java·设计模式·桥接模式
o独酌o39 分钟前
递归的‘浅’理解
java·开发语言
无问8171 小时前
数据结构-排序(冒泡,选择,插入,希尔,快排,归并,堆排)
java·数据结构·排序算法
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
Flying_Fish_roe1 小时前
Spring Boot-版本兼容性问题
java·spring boot·后端
程序猿进阶2 小时前
如何在 Visual Studio Code 中反编译具有正确行号的 Java 类?
java·ide·vscode·算法·面试·职场和发展·架构
slandarer2 小时前
MATLAB | R2024b更新了哪些好玩的东西?
java·数据结构·matlab
Dola_Pan2 小时前
Linux文件IO(一)-open使用详解
java·linux·dubbo
摇滚侠2 小时前
spring cxf 常用注解
java·后端·spring