注意
本页描述的是低级别的 LLM API。
有关高级 LLM API,请参见 AI Services。
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 类型:
LanguageModels
ChatLanguageModels
LangChain4j 将不再扩展对 LanguageModels 的支持,因此在所有新功能中,我们将使用 ChatLanguageModel API。
ChatLanguageModel 是与 LangChain4j 中的 LLM 交互的低级 API,提供最大的功能和灵活性。此外,还存在一个高级 API(AI Services),我们将在介绍完基础内容后进行讲解。
EmbeddingModel
ImageModel
ModerationModel
ScoringModel
这些内容将在后续章节中详细讨论。
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:
最简单的方式是:
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 包含一个 List
contents。
Content 是一个接口,具有以下实现:
TextContent
UserMessage.from(TextContent.from("Hello!"))
等同于 UserMessage.from("Hello!")
。UserMessage userMessage = UserMessage.from(
TextContent.from("Hello!"),
TextContent.from("How are you?")
);
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 选项)来控制模型处理图像的方式。更多细节请参考相关文档。
AudioContent
AudioContent 与 ImageContent 类似,但表示音频内容。
**VideoContent **
VideoContent 与 ImageContent 类似,但表示视频内容。
**PdfFileContent **
PdfFileContent 与 ImageContent 类似,但表示 PDF 文件的二进制内容。
聊天语言模型的 Kotlin 扩展提供了用于处理与语言模型交互的异步方法,利用了 Kotlin 的协程功能。chatAsync
方法允许非阻塞地处理 ChatRequest
或 ChatRequest.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
进行异步执行。此版本通过协程提供了简洁性和非阻塞行为。