深入解析LangChain4j中的ChatLanguageModel API:从基础到高级应用

聊天与语言模型 | LangChain4j

注意
本页描述的是低级别的 LLM API。
有关高级 LLM API,请参见 AI Services。


支持的所有 LLM

Provider Streaming Tools (sync/streaming) JSON Schema JSON Mode Supported Modalities (Input) Observability Local Deployment Supports Native Image Comments
Amazon Bedrock (Converse API) #2470 ✅/ text, image, PDF
Amazon Bedrock (Invoke API) ✅/#2114 text
Anthropic ✅/✅ text, image
Azure OpenAI ✅/✅ text, image
ChatGLM text
DashScope ✅/✅ text, image, audio
GitHub Models ✅/✅ #1911 text
Google AI Gemini ✅/✅ text, image, audio, video, PDF
Google Vertex AI Gemini ✅/✅ #1717 text, image, audio, video, PDF
Google Vertex AI PaLM 2 text
Hugging Face text
Jlama ✅/✅ text
LocalAI ✅/✅ text
Mistral AI ✅/✅ text
Ollama ✅/✅ text, image
OpenAI ✅/✅ text, image, audio Compatible with: Ollama, LM Studio, GPT4All, etc. Compatible with: Groq, etc.
Qianfan ✅/✅ text
Cloudflare Workers AI text
Zhipu AI ✅/✅ text, image

图例:

✅ 表示“支持”
表示“尚未支持;请帮助我们实现它”
表示“正在实施中;请稍候”
❌ 表示“LLM提供商不支持”
无标记 表示“不确定,需要再次确认”

目前,LLM 提供两种 API 类型:

  1. LanguageModels

    • 其 API 非常简单,接受一个字符串作为输入,并返回一个字符串作为输出。
    • 此 API 正在逐渐被聊天 API(第二种类型)取代。
  2. ChatLanguageModels

    • 接受多个 ChatMessages 作为输入,并返回单个 AiMessage 作为输出。
    • ChatMessage 通常包含文本,但某些 LLM 还支持其他模态(例如图像、音频等)。
    • 示例包括 OpenAI 的 gpt-4o-mini 和 Google 的 gemini-1.5-pro。

LangChain4j 将不再扩展对 LanguageModels 的支持,因此在所有新功能中,我们将使用 ChatLanguageModel API。
ChatLanguageModel 是与 LangChain4j 中的 LLM 交互的低级 API,提供最大的功能和灵活性。此外,还存在一个高级 API(AI Services),我们将在介绍完基础内容后进行讲解。


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

  1. EmbeddingModel

    • 该模型可以将文本转换为嵌入向量(Embedding)。
  2. ImageModel

    • 该模型可以生成和编辑图像。
  3. ModerationModel

    • 该模型可以检查文本是否包含有害内容。
  4. ScoringModel

    • 该模型可以根据查询对多段文本进行评分或排名,本质上是确定每段文本与查询的相关性。这对 RAG(检索增强生成)非常有用。

这些内容将在后续章节中详细讨论。


更深入地了解 ChatLanguageModel API

public interface ChatLanguageModel { 
    String generate(String userMessage); 
    ...
}

如您所见,有一个简单的 generate 方法,它接受一个字符串作为输入并返回一个字符串作为输出,类似于 LanguageModel。
这是一个方便的方法,您可以快速轻松地进行测试,而无需将字符串包装在 UserMessage 中。

以下是实际的聊天 API:

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

这些版本的 generate 方法接受一个或多个 ChatMessages 作为输入。
ChatMessage 是一个表示聊天消息的基本接口。目前有四种类型的聊天消息,每种消息来源对应一种类型。


创建 UserMessage 的多种方式

根据内容的不同,有多种方式创建 UserMessage:

最简单的方式是:

new UserMessage("Hi")  
UserMessage.from("Hi")

为什么需要提供多个 ChatMessages 作为输入,而不是仅仅一个?
这是因为 LLM 本质上是无状态的,这意味着它们不会维护对话的状态。因此,如果您希望支持多轮对话,则需要负责管理对话的状态。

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

用户: Hello, my name is Klaus
AI: Hi Klaus, how can I help you?
用户: What is my name?
AI: Klaus

这是与 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 概念,我们将在下一节中探讨。


UserMessage 可以包含的内容

UserMessage 不仅可以包含文本,还可以包含其他类型的内容。
UserMessage 包含一个 List contents。
Content 是一个接口,具有以下实现:

  1. TextContent

    • 最简单的 Content 形式,表示纯文本,包装一个字符串。
    • UserMessage.from(TextContent.from("Hello!")) 等同于 UserMessage.from("Hello!")
    • 可以在一个 UserMessage 中提供一个或多个 TextContents:
      UserMessage userMessage = UserMessage.from(  
          TextContent.from("Hello!"),  
          TextContent.from("How are you?")
      );
      
  2. ImageContent

    • 根据 LLM 提供商的不同,ImageContent 可以从远程图像的 URL 或 Base64 编码的二进制数据创建。

    • 示例:

      UserMessage userMessage = UserMessage.from(  
          TextContent.from("Describe the following image"),  
          ImageContent.from("https://example.com/cat.jpg")
      );  
      Response<AiMessage> response = model.generate(userMessage);
      
    • 如果从本地文件创建:

      byte[] imageBytes = readBytes("/home/me/cat.jpg");  
      String base64Data = Base64.getEncoder().encodeToString(imageBytes);  
      ImageContent imageContent = ImageContent.from(base64Data, "image/jpg");  
      UserMessage userMessage = UserMessage.from(imageContent);
      
    • 还可以指定 DetailLevel 枚举(LOW/HIGH/AUTO 选项)来控制模型处理图像的方式。更多细节请参考相关文档。

  3. AudioContent
    AudioContent 与 ImageContent 类似,但表示音频内容。

  4. **VideoContent **
    VideoContent 与 ImageContent 类似,但表示视频内容。

  5. **PdfFileContent **
    PdfFileContent 与 ImageContent 类似,但表示 PDF 文件的二进制内容。


Kotlin 扩展

聊天语言模型的 Kotlin 扩展提供了用于处理与语言模型交互的异步方法,利用了 Kotlin 的协程功能。chatAsync 方法允许非阻塞地处理 ChatRequestChatRequest.Builder 配置,并返回带有模型回复的 ChatResponse。类似地,generateAsync 处理从聊天消息中异步生成响应。这些扩展简化了在 Kotlin 应用程序中构建聊天请求和高效处理对话的过程。需要注意的是,这些方法被标记为实验性,可能会随着时间的推移而演变。

ChatLanguageModel.chatAsync(request: ChatRequest):专为 Kotlin 协程设计,此异步扩展函数在协程作用域内使用 Dispatchers.IO 包装了同步的 chat 方法,从而实现了非阻塞操作,这对于保持应用程序的响应性至关重要。它特别命名为 chatAsync,以避免与现有的同步 chat 方法冲突。其函数签名是:suspend fun ChatLanguageModel.chatAsync(request: ChatRequest): ChatResponse。关键字 suspend 表明这是一个协程函数。

ChatLanguageModel.chat(block: ChatRequestBuilder.() -> Unit):这个变体的 chat 方法通过使用 Kotlin 的类型安全构建器 DSL 提供了一种更简洁的方法。它简化了 ChatRequest 对象的构建,同时内部使用 chatAsync 进行异步执行。此版本通过协程提供了简洁性和非阻塞行为。

你可能感兴趣的:(精品专栏,microsoft,langchain4j,java,ai)