LLM 目前有两种 API 类型:

LanguageModels。它们的 API 非常简单 - 它们接受 aString作为输入并返回 aString作为输出。此 API 现已过时,取而代之的是聊天 API(第二种 API 类型)。
ChatLanguageModels。它们接受一个或多个ChatMessages 作为输入并返回一个AiMessage作为输出。 ChatMessage通常包含文本,但一些 LLM 还支持文本和 s 的混合Image。此类聊天模型的示例包括 OpenAIgpt-3.5-turbo和 Google 的gemini-pro。
LanguageModelLangChain4j 中将不再扩展对 s 的支持,因此在所有新功能中,我们都将使用ChatLanguageModelAPI。

ChatLanguageModel是 LangChain4j 中的低级 API,提供最强大的功能和灵活性。在介绍完基础知识后,我们将介绍高级 API(Chain和)。AiServices

除了ChatLanguageModel和 之外LanguageModel,LangChain4j 还支持以下类型的模型:

EmbeddingModel- 该模型可以将文本翻译成Embedding。
ImageModel- 该模型可以生成和编辑Image。
ModerationModel- 该模型可以检查文本是否包含有害内容。
ScoringModel- 该模型可以针对查询对多段文本进行评分(或排名),本质上确定每段文本与查询的相关性。这对 RAG 很有用。这些将在后面介绍。
现在,让我们仔细看看该ChatLanguageModelAPI。

public interface ChatLanguageModel {

String generate(String userMessage);

...

}

如您所见,有一种generate方法可以接受 aString作为输入并返回 aString作为输出,类似于LanguageModel。这只是一种便捷方法,因此您可以快速轻松地使用它,而无需将 包装String在 中UserMessage。

但实际的聊天 API 如下:

...

Response<AiMessage> generate(ChatMessage... messages);

Response<AiMessage> generate(List<ChatMessage> messages);

...

这些版本的generate方法以一个或多个ChatMessage作为输入。 ChatMessage是一个代表聊天消息的基本接口。

ChatMessage
目前有四种类型的聊天消息,每个消息的“来源”对应一种:

UserMessage:这是来自用户的消息。用户可以是您的应用程序的最终用户(人类)或您的应用程序本身。根据 LLM 支持的方式,UserMessage可以仅包含文本(String),或文本和/或图像(Image)。
AiMessage:这是由 AI 生成的消息,通常用于响应UserMessage。您可能已经注意到,generate 方法返回一个AiMessage包装在 中的Response。 AiMessage可以包含文本响应(String)或执行工具的请求(ToolExecutionRequest)。别担心,我们稍后会探索工具。
ToolExecutionResultMessage:这是的结果ToolExecutionRequest。我们稍后会详细介绍这一点。
SystemMessage:这是来自系统的消息。通常,您作为开发人员应该定义此消息的内容。通常,您会在此处写下有关 LLM 在此对话中的角色、其行为方式、以何种风格回答等的说明。LLM 被训练得比SystemMessage其他类型的消息更加关注,因此请小心,最好不要让最终用户自由定义或向其中注入一些输入SystemMessage。通常,它位于对话的开头。
现在我们知道了所有类型的ChatMessage,让我们看看如何在对话中结合它们。

UserMessage在最简单的情况下,我们可以在方法中提供一个 实例generate。这类似于该generate方法的第一个版本,它以String作为输入。这里的主要区别在于它现在返回的不是String,而是Response。 Response是内容(有效负载)的包装器,您经常会将其视为类的返回类型*Model。除了内容(在本例中为AiMessage)之外,Response还包含有关生成的元信息。首先,它包括TokenUsage,其中包含有关输入(ChatMessages您提供给 generate 方法的所有 )包含多少个令牌、生成了多少个令牌作为输出(在 中AiMessage)以及总数(输入 + 输出)的统计信息。您将需要这些信息来计算对 LLM 的给定调用的成本。然后,Response还包含,这是一个枚举,包含生成停止的各种原因。通常,如果 LLM 决定停止生成,FinishReason它将是。FinishReason.STOP

UserMessage根据内容,创建 的方法有很多种。最简单的方法是new UserMessage(“Hi”)或UserMessage.from(“Hi”)。

多个ChatMessage
现在,为什么您需要提供多个ChatMessage而不是一个作为输入?这是因为 LLM 本质上是无状态的,这意味着它们不维护对话的状态。因此,如果您想支持多轮对话,您应该注意管理对话的状态。

假设你想构建一个聊天机器人。想象一下用户和聊天机器人(AI)之间的简单多轮对话:

用户:你好,我叫 Klaus
AI:您好,克劳斯,有什么可以帮您的吗?
用户:我叫什么名字?
人工智能:克劳斯
交互如下ChatLanguageModel:

UserMessage firstUserMessage = UserMessage.from(“Hello, my name is Klaus”);
AiMessage firstAiMessage = model.generate(firstUserMessage).content(); // Hi Klaus, how can I help you?
UserMessage secondUserMessage = UserMessage.from(“What is my name?”);
AiMessage secondAiMessage = model.generate(firstUserMessage, firstAiMessage, secondUserMessage).content(); // Klaus

如您所见,在generate方法的第二次调用中,我们不仅提供了单条消息secondUserMessage,还提供对话中的先前消息。

手动维护和管理这些消息非常麻烦。因此,存在的概念ChatMemory,我们将在下一节中进行探讨。

作者:Jeebiz  创建时间:2024-08-18 23:52
最后编辑:Jeebiz  更新时间:2024-08-18 23:53