【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

课程合作请留言

相关推荐
考虑考虑1 小时前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干1 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying1 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
Bug退退退1233 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠3 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
Zz_waiting.3 小时前
Javaweb - 10.4 ServletConfig 和 ServletContext
java·开发语言·前端·servlet·servletconfig·servletcontext·域对象
全栈凯哥3 小时前
02.SpringBoot常用Utils工具类详解
java·spring boot·后端
兮动人3 小时前
获取终端外网IP地址
java·网络·网络协议·tcp/ip·获取终端外网ip地址
呆呆的小鳄鱼3 小时前
cin,cin.get()等异同点[面试题系列]
java·算法·面试