第1章:LangChain4j的聊天与语言模型
LangChain4J官方文档翻译与解析
目标文档路径:
https://docs.langchain4j.dev/tutorials/chat-and-language-models/
- 语言模型的两种API类型
LangChain4j支持两种语言模型(LLM)的API:
LanguageModel:这种API非常简单,它接受一个字符串作为输入,并返回一个字符串作为输出。这种API正在逐渐被聊天API(第二种API类型)取代。
ChatLanguageModel:这种API接受多个ChatMessage作为输入,并返回一个AiMessage作为输出。ChatMessage通常包含文本,但某些LLM还支持其他模态(例如图像、音频等)。例如,OpenAI的gpt-4o-mini和Google的gemini-1.5-pro就是支持这种多模态的聊天模型。
LangChain4j不再扩展对LanguageModel的支持,所有新功能都将使用ChatLanguageModel API。ChatLanguageModel是LangChain4j中与LLM交互的低级API,提供了最大的灵活性和功能。此外,LangChain4j还支持其他类型的模型,例如:
EmbeddingModel:将文本转换为嵌入向量。
ImageModel:生成和编辑图像。
ModerationModel:检查文本是否包含有害内容。
ScoringModel:对多段文本进行评分或排名,以确定它们与查询的相关性。这对于检索增强型生成(RAG)非常有用。 - ChatLanguageModel API
ChatLanguageModel API的核心是generate方法,它接受一个或多个ChatMessage作为输入,并返回一个AiMessage。ChatMessage是一个基础接口,代表聊天消息,有以下几种类型:
UserMessage:用户发送的消息,可以是文本或其他模态内容。
AiMessage:AI生成的消息,通常是对UserMessage的回应。
ToolExecutionResultMessage:工具执行请求的结果。
SystemMessage:系统消息,通常由开发者定义,用于指定LLM在对话中的角色、行为风格等。LLM会更关注SystemMessage,因此不要让用户随意修改或注入内容。 - 多轮对话的管理
由于LLM本身是无状态的,因此需要开发者手动管理对话状态。例如,一个简单的多轮对话如下:
用户:你好,我叫Klaus。
AI:你好Klaus,我能帮你什么?
用户:我的名字是什么?
AI:Klaus。
在ChatLanguageModel中,需要将之前的对话消息传递给generate方法,以维护对话上下文。例如:
java复制
UserMessage firstUserMessage = UserMessage.from(“你好,我叫Klaus”);
AiMessage firstAiMessage = model.generate(firstUserMessage).content();
UserMessage secondUserMessage = UserMessage.from(“我的名字是什么?”);
AiMessage secondAiMessage = model.generate(firstUserMessage, firstAiMessage, secondUserMessage).content(); - 多模态支持
UserMessage不仅可以包含文本,还可以包含其他类型的内容,例如图像、音频、视频或PDF文件。例如,发送文本和图像的代码如下:
java复制
UserMessage userMessage = UserMessage.from(
TextContent.from(“描述下面的图像”),
ImageContent.from(“https://example.com/cat.jpg”)
);
Response response = model.generate(userMessage); - Kotlin扩展
LangChain4j为Kotlin提供了扩展,支持异步处理聊天交互。这些扩展利用Kotlin的协程功能,提供了chatAsync和generateAsync方法,简化了聊天请求的构建和对话处理。
总结
这篇文章主要介绍了LangChain4j中与语言模型和聊天模型相关的API。它强调了ChatLanguageModel的重要性,并详细解释了如何通过ChatMessage管理多轮对话、支持多模态输入,以及如何利用Kotlin扩展进行异步处理。这些功能使得LangChain4j在构建聊天应用时更加灵活和强大。