个人总结 - LangChain4j应用(1)
github:
Releases · langchain4j/langchain4j · GitHub
官方文档:
简要介绍:
LangChain4j是一个旨在简化大语言模型(LLMs)与Java应用程序集成的框架。
Chat and Language Models:
-
LanguageModel
: 最简单的聊天模型,简单的接收字符串,不做附加处理而生成回答(LangChain4j不支持) -
ChatLanguageModel
:接受单个或多个 ChatMessages 作为输入,并返回 AiMessage 作为输出。/** Response 包含: 1.内容(AiMessage) 2.有关生成的元信息。首先,它包括 TokenUsage,它包含有关输入(messages)包含的令牌数、作为输出生成的令牌数以及总数(输入 + 输出)的统计信息。可以此信息来计算对 LLM 的给定调用的费用。 3.FinishReason,这是一个枚举,其中包含生成停止的各种原因。如果 LLM 决定自行停止生成,它将是 FinishReason.STOP。 */ Response<AiMessage> generate(ChatMessage... messages); Response<AiMessage> generate(List<ChatMessage> messages);
-
ChatMessage的类型:
-
UserMessage:这是来自用户的消息。包含文本,但某些LLM也支持文本和图像的混合
-
AiMessage:这是由 AI 生成的消息,响应 UserMessage。generate 方法返回包装在 Response 中的 AiMessage。AiMessage 可以包含文本响应 (String) 或执行工具的请求 (ToolExecutionRequest)。
-
ToolExecutionResultMessage:ToolExecutionRequest 的结果。
-
SystemMessage:定义AI的系统角色信息。
-
-
-
EmbeddingModel
: 此模型可以将文本转换为 Embedding,用于RAG。 -
ImageModel
: 此模型可以生成和编辑图像。 -
ModerationModel
: 此模型可以检查文本是否包含有害内容。 -
ScoringModel
: 此模型可以根据query对多段文本进行评分(或排名),来确定每段文本与query的相关性。用于RAG。
Chat Memory(聊天内存)
-
不同于History保留整个历史记录,而是根据内部算法保留关键信息
-
消息淘汰:超过LLM 一次可以处理的token数量时会进行消息淘汰
-
MessageWindowChatMemory :保留 N 条最近的消息。
-
TokenWindowChatMemory:保留 N 个最新的令牌。由于信息是不可分割的。如果消息不合适,则会将其完全淘汰。MessageWindowChatMemory 需要一个 Tokenizer 来计算每个 ChatMessage 中的令牌。
-
-
消息持久化:可通过实现ChatMemoryStore接口自定义消息持久化
-
//自定义持久化机制 class PersistentChatMemoryStore implements ChatMemoryStore { //memoryId 用于区分多个用户的对话。getMessages()方法应返回给定memoryId关联的所有消息。 @Override public List<ChatMessage> getMessages(Object memoryId) {} //在添加新的 UserMessage 、 AiMessage 或淘汰消息时执行,messages不包括被淘汰的消息 @Override public void updateMessages(Object memoryId, List<ChatMessage> messages) {} // @Override public void deleteMessages(Object memoryId) {} } ChatMemory chatMemory = MessageWindowChatMemory.builder() .id("12345") .maxMessages(10) //指定自定义的持久化机制 .chatMemoryStore(new PersistentChatMemoryStore()) .build();
Model Parameters(模型参数)
-
model参数具体含义由model厂商提供,以下是常见的参数配置:
-
model:模型名称(例如:gpt-4o)
-
temperature:介于 0 和 2 之间。较高的值(如 0.8)将使输出更加随机,而较低的值(如 0.2)将使输出更加集中和确定性。
-
max_tokens:聊天完成时可以生成的最大令牌数量。
-
n:为每条输入消息生成n个输出选项。
-
top_p:类似temperature,但倾向于选择下一个token的范围大小,比如设置
top_p
为0.1,那么model只会从累积概率的前10%的tokens中选择下一个token,如果你设置的 top_p 值较高,就有更大的范围来选择下一个token。
-
-
创建模型的方式:
-
Static Factory:仅接受强制参数(例如 API 密钥)其他参数设置为默认值。
OpenAiChatModel model = OpenAiChatModel.withApiKey("demo");
-
Builder:自由配置
OpenAiChatModel model = OpenAiChatModel.builder() .apiKey("demo") .modelName("gpt-4") .temperature(0.3) .timeout(ofSeconds(60)) .logRequests(true) .logResponses(true) .build();
-
SpringBoot配置文件:只有OpenAi支持
langchain4j.open-ai.chat-model.api-key=${OPENAI_API_KEY}
-
Response Streaming(流式响应)
-
对于ChatLanguageModel和LanguageModel接口,有相应的StreamingChatLanguageModel和StreamingLanguageModel接口
StreamingChatLanguageModel model = OpenAiStreamingChatModel.builder() .apiKey(System.getenv("OPENAI_API_KEY")) .modelName(GPT_4_O_MINI) .build(); String userMessage = "xxx"; model.generate(userMessage, new StreamingResponseHandler<AiMessage>() { //生成下一个token时被调用 @Override public void onNext(String token) {} //当 LLM 完成生成时:调用 onComplete(Response<T> response)。这里,对于 StreamingChatLanguageModel,T 代表 AiMessage,String 代表 StreamingLanguageModel。 Response 对象包含完整的响应 @Override public void onComplete(Response<AiMessage> response) {} @Override public void onError(Throwable error) { error.printStackTrace(); } });