前言
AI Agent是智能体的概念,以大模型为核心,集决策能力、记忆能力、工具调用能力为一体的智能体。
langchain框架是python写的,它是一个大语言模型智能框架,Langchain4J是langchain框架对应的java语言编写的。
langchain框架中,包含了模型、数据集成、链式、工具包、代理、提示词、记忆等概念。
代理Agent是一个高层级概念,它以大模型为核心,集成记忆和工具等为一体,构造了它的决策能力、执行能力、记忆能力,因此被称为智能体。
决策能力: 来源于接入大模型
执行能力: 基于已被定义的接口、方法等业务代码
记忆能力: 基于内存、外部数据源等,来构建上下文环境。
构建AI 智能体
我们已OpenAI gpt-4o为模型底座,构建一个AI 智能体。
OpenAiChatModel model = OpenAiChatModel.builder().baseUrl("https://xxxx").modelName("gpt-4o-mini").apiKey("xxxx").organizationId("xxxx").temperature(0.1).logRequests(true).logResponses(true).build();TransactionService transactionService = new TransactionService();ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);Assistant assistant = AiServices.builder(Assistant.class).chatLanguageModel(model).chatMemory(chatMemory).tools(transactionService).build();String userMessage = "历史上的今天发生了什么";interface Assistant {Response<AiMessage> chat(String userMessage);
}
static class TransactionService {@Tool("根据参数id返回一个对应的金额数值")double getTransactionAmount(@P("参数id") String id) {System.out.printf("调用工具getTransactionAmount(%s)%n", id);switch (id) {case "T001":return 11.1;case "T002":return 22.2;default:throw new IllegalArgumentException("Unknown transaction ID: " + id);}}
}
在上述代码中,用户角色问了问题:历史上的今天发生了什么?
其中Assistant 就是一个智能体构建,它包含了大模型集成、记忆能力与工具调用。
Assistant assistant = AiServices.builder(Assistant.class).chatLanguageModel(model).chatMemory(chatMemory).tools(transactionService).build();
下面刨根问题追踪源码学习,向低层级概念进发。
Langchain4J之模型
在Langchain4J-core核心包中,分别实现了其核心能力:代理、数据集成、记忆能力、大模型、RAG等功能。
model就是关于大模型的包
它包含了:
聊天模型
文本向量
输入
输出
语言模型
等
LanguageModel是大模型接入的顶级接口,它定了最原始的大模型调用,输入提示词、输出文本。
public interface LanguageModel {/*** Generate a response to the given prompt.** @param prompt the prompt.* @return the response.*/
Response<String> generate(String prompt);/*** Generate a response to the given prompt.** @param prompt the prompt.* @return the response.*/
default Response<String> generate(Prompt prompt) {return generate(prompt.text());
}
}
如果LanguageModel是定义大模型的基础能力,那么TokenCountEstimator就是管理大模型Token的顶级接口,因为每个大模型都有token上限,当使用记忆能力时,不可能无限存储然后发送给大模型。
例如一个OpenAiLanguageModel它既要实现LanguageModel,也要实现TokenCountEstimator。
public class OpenAiLanguageModel implements LanguageModel, TokenCountEstimator {private final OpenAiClient client;
private final String modelName;
private final Double temperature;
private final Integer maxRetries;
private final Tokenizer tokenizer;
OpenAiLanguageModel的核心就是OpenAiClient,它基本就是一个OpenAiApi接口+OkHttpClient。
然后以大模型为核心,Langchain4J丰富了大模型更多的功能,比如输入的提示词及提示词模板,输出、结构化输出等,以及聊天模型的实现。
聊天模型是model包中的chat包,它的顶级接口ChatLanguageModel与LanguageModel类型,多了更多的行为定义,比如chat。