跳到内容

步骤 04 - 系统消息

步骤 1中,我们看到了两种消息类型:

  • 用户消息 (User)
  • AI 回复 (Assistant)

还有其他类型的消息,本步骤将介绍系统消息。这是一种重要的消息类型。它提供了对话的范围并向 LLM 提供指令。

系统消息

LLM 中的系统消息是一种指令,有助于指导模型在交互过程中的行为和语气。它通常会设置模型的上下文、角色或边界,定义它应该如何回应用户。

系统消息对于塑造模型的输出至关重要,可以确保其符合特定的要求,例如正式程度、话题焦点或特定的任务执行。与用户输入不同,系统消息在对话中是隐藏的,但会影响整体体验。

要添加系统消息,我们需要增强我们的 CustomerSupportAgent 接口。 CustomerSupportAgent 接口内容更新为:

CustomerSupportAgent.java
package dev.langchain4j.quarkus.workshop;

import dev.langchain4j.service.SystemMessage;
import io.quarkiverse.langchain4j.RegisterAiService;
import io.smallrye.mutiny.Multi;
import jakarta.enterprise.context.SessionScoped;

@SessionScoped
@RegisterAiService
public interface CustomerSupportAgent {

    @SystemMessage("""
            You are a customer support agent of a car rental company 'Miles of Smiles'.
            You are friendly, polite and concise.
            If the question is unrelated to car rental, you should politely redirect the customer to the right department.
            """)
    Multi<String> chat(String userMessage);
}

如果您没有遵循研讨会,step-04 目录已包含更新后的 CustomerSupportAgent 接口。

如您所见,我们已将 @SystemMessage 注解添加到 chat 方法。这就是我们向 LLM 添加系统消息的方式。我们定义了对话的上下文、语气和范围。

系统消息和记忆

还记得我们在步骤 1中讨论过的对话记忆吗?我们将用户和 AI 之间交换的所有消息都发送到 LLM,以便 LLM 可以提供上下文感知的响应。

有时,消息过多,我们需要淘汰一些。通常,我们会移除最旧的消息。但是,我们始终保留系统消息。我们只移除用户和 AI 消息。

这样,LLM 仍然理解上下文,并且不会因为记忆淘汰而发生根本性的行为改变。

玩转系统消息

现在,让我们测试一下系统消息。确保应用程序正在运行,并在浏览器中打开 https://:8080

让我们让 LLM 讲一个故事

Tell me a story
Out of context

AI 应该会回复说它超出范围了。您可以通过要求一个汽车租赁故事来相对容易地解决这个问题,但也有其他解决方案。

重要的是要有一个定义对话范围和 AI 角色的系统消息。即使对话很长,这也不会丢失。

好了,现在让我们进一步深入,实现 RAG 模式!这是下一步的主题!