当前位置: 首页 > news >正文

第1章:LangChain4j的聊天与语言模型

本文主要介绍了LangChain4j中与语言模型和聊天模型相关的API。强调了ChatLanguageModel的重要性,并详细解释了如何通过ChatMessage管理多轮对话、支持多模态输入,以及如何利用Kotlin扩展进行异步处理。这些功能使得LangChain4j在构建聊天应用时更加灵活和强大。

本文主要介绍了LangChain4j中语言模型和聊天模型的使用方法,包括:

  • 语言模型的两种API类型:LanguageModel和ChatLanguageModel。
  • ChatLanguageModel的多轮对话和多模态支持。
  • 如何通过ChatMessage管理对话状态。
  • Kotlin扩展支持异步处理聊天交互。

这些内容为开发者提供了使用LangChain4j构建聊天应用的基础知识

1. 语言模型的两种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和LanguageModel,LangChain4j还支持以下类型的模型:

  • EmbeddingModel:将文本转换为嵌入向量。
  • ImageModel:生成和编辑图像。
  • ModerationModel:检查文本是否包含有害内容。
  • ScoringModel:根据查询对多段文本进行评分或排名,用于检索增强生成(RAG)。

2. ChatLanguageModel API

ChatLanguageModel是LangChain4j中与语言模型交互的底层API,提供了最强大的功能和灵活性。它的核心方法是generate,可以接受一个或多个ChatMessage作为输入,并返回一个AiMessage。

ChatLanguageModel API的核心是generate方法,它接受一个或多个ChatMessage作为输入,并返回一个AiMessage。ChatMessage是一个基础接口,代表聊天消息,有以下几种类型:

  • UserMessage:用户的消息,可以是应用的最终用户(人类)或应用本身。根据语言模型支持的模态,UserMessage可以包含文本或其他模态。
  • AiMessage:AI生成的消息,通常是响应UserMessage的。generate方法返回的AiMessage被包装在Response中。AiMessage可以包含文本响应或工具执行请求(ToolExecutionRequest)。
  • ToolExecutionResultMessage:工具执行请求的结果。
  • SystemMessage:系统消息,通常由开发者定义,用于指示语言模型在对话中的角色、行为方式和回答风格等。语言模型会更关注SystemMessage,因此不应允许最终用户自由定义或注入内容。
  • CustomMessage:自定义消息,可以包含任意属性,但只有支持该功能的ChatLanguageModel实现(目前只有Ollama)才能使用。

LLM会更关注SystemMessage,因此不要让用户随意修改或注入内容。

3. 多轮对话的管理

由于LLM本身是无状态的,因此需要开发者手动管理对话状态。例如,一个简单的多轮对话如下:

	用户:你好,我叫Klaus。AI:你好Klaus,我能帮你什么?用户:我的名字是什么?AI:Klaus。

在ChatLanguageModel中,需要将之前的对话消息传递给generate方法,以维护对话上下文。例如:

	UserMessage firstUserMessage = UserMessage.from("你好,我叫Klaus");AiMessage firstAiMessage = model.generate(firstUserMessage).content();UserMessage secondUserMessage = UserMessage.from("我的名字是什么?");AiMessage secondAiMessage = model.generate(firstUserMessage, firstAiMessage, secondUserMessage).content();

4. 多模态支持

UserMessage不仅可以包含文本,还可以包含其他类型的内容,如图像、音频、视频或PDF文件。UserMessage包含一个Content列表,Content是一个接口,有以下实现:

  • TextContent:表示纯文本。
  • ImageContent:表示图像,可以是远程图像的URL或Base64编码的二进制数据。
  • AudioContent:表示音频内容。
  • VideoContent:表示视频内容。
  • PdfFileContent:表示PDF文件的二进制内容。

例如,发送文本和图像的代码如下:

UserMessage userMessage = UserMessage.from(TextContent.from("描述下面的图像"),ImageContent.from("https://example.com/cat.jpg")
);
Response<AiMessage> response = model.generate(userMessage);

5. Kotlin扩展

LangChain4j为Kotlin提供了扩展,支持异步处理聊天交互。例如:

  • chatAsync:异步执行聊天请求,返回模型的回复。
  • generateAsync:异步生成响应。

这些扩展利用Kotlin的协程功能,使应用程序能够以非阻塞方式处理聊天请求。

总结

本文主要介绍了LangChain4j中与语言模型和聊天模型相关的API。强调了ChatLanguageModel的重要性,并详细解释了如何通过ChatMessage管理多轮对话、支持多模态输入,以及如何利用Kotlin扩展进行异步处理。这些功能使得LangChain4j在构建聊天应用时更加灵活和强大。

导读说明:
这是LangChain开发智能体的系列文档,欢迎连读

  • 第1章:LangChain4j的聊天与语言模型
  • 第2章:如何基于LangChain4j实现聊天记忆
  • 第3章:在LangChain中如何设置模型参数
  • 第4章:在LangChain中如何实现响应式流(Response Streaming)
  • 第5章:在LangChain中如何使用AI Services
  • 第6章:基于LangChain如何开发Agents,附带客户支持智能体示例
  • 第7章:在LangChain中如何调用函数Tools (Function Calling)
  • 第8章:LangChain检索增强生成RAG–1概述
  • 第8章:LangChain检索增强生成RAG–2.1Easy RAG实现
  • 第8章:LangChain检索增强生成RAG–2.2Core RAG APIs
  • 第8章:LangChain检索增强生成RAG–2.3Naive RAG
  • 第8章:LangChain检索增强生成RAG–2.4Advanced RAG【高级RAG】
  • 第9章:LangChain让大模型结构化输出
  • 第9章:LangChain结构化输出-示例1(情感分析AI服务)
  • 第9章:LangChain结构化输出-示例2(数字提取服务)
  • 第9章:LangChain结构化输出-示例3(日期和时间提取服务)
  • 第9章:LangChain结构化输出-示例4(基于大模型从自然语言中提取POJO)
  • 第9章:LangChain结构化输出-示例5(基于大模型如何精确匹配POJO的字段)
  • 第9章:LangChain结构化输出-示例6(设置系统消息和用户消息模版)
  • 第10章:基于LangChain的综合实战[开发企业助手,查知识、查订单、表单登记…]

http://www.mrgr.cn/news/92095.html

相关文章:

  • Orange 单体架构 - 快速启动
  • 什么是向量化?ElasticSearch如何存储向量?
  • Python爬虫-破解字体加密技术
  • STM32基础篇(二)------GPIO
  • 前端面试真题 2025最新版
  • DeepSeek入门到大师 清华大学[1-5版]全集
  • go执行java -jar 完成DSA私钥解析并签名
  • Java GC 基础知识快速回顾
  • 【数据结构】(12) 反射、枚举、lambda 表达式
  • 游戏引擎学习第119天
  • SOME/IP--协议英文原文讲解11
  • 简单又强大的Zustand,为啥不自己手写一个呢
  • 虚拟机emulator报错
  • C# 将非托管Dll嵌入exe中(一种实现方法)
  • Windows10系统本地部署Ollama_DeepSeek-R1实操手册
  • leetcode 119. 杨辉三角 II
  • 【数据结构】(11) Map 和 Set
  • 洛谷P1135多题解
  • vue3 Props的使用
  • Web自动化之Selenium实战案例1:论文pdf自动下载