使用LangChain4j在Java中实现AI智能体:从工具集成到任务规划
AI Agent的核心机制与Java实现路径
随着生成式AI技术的演进,AI Agent已不再局限于简单的对话响应。它具备感知环境、推理决策、执行动作和持续记忆的能力。基于LangChain4j框架,Java开发者可以快速构建具备实际功能的智能代理系统。
依赖配置与基础组件初始化
首先,在Maven项目中引入LangChain4j核心库及OpenAI支持模块:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>0.36.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>0.36.0</version>
</dependency>
自定义外部能力:工具接口开发
Agent通过调用工具扩展其能力边界。以下为两个典型工具实现:
public class CityWeatherService {
@Tool("获取指定城市实时气象数据")
public String fetchCurrentWeather(String cityName) {
// 模拟真实API调用
return String.format("%s当前天气为多云,温度26℃,湿度55%%", cityName);
}
}
public class MathEvaluator {
@Tool("解析并计算数学表达式结果")
public double evaluateExpression(String formula) {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
return ((Number) engine.eval(formula)).doubleValue();
} catch (ScriptException e) {
throw new RuntimeException("表达式解析失败: " + formula, e);
}
}
}
构建具备上下文记忆的智能代理
通过组合语言模型、记忆组件和工具集,创建可交互的服务接口:
ChatLanguageModel llm = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4o-mini")
.temperature(0.3)
.build();
ChatMemory conversationHistory = MessageWindowChatMemory.withMaxMessages(10);
interface SmartAssistant {
String respondTo(String input);
}
SmartAssistant assistant = AiServices.create(SmartAssistant.class)
.chatModel(llm)
.memory(conversationHistory)
.tools(new CityWeatherService(), new MathEvaluator())
.systemPrompt("你是一个多功能助手,能查询天气和执行算术运算。" +
"根据用户需求判断是否需调用外部工具完成任务。")
.build();
多轮交互测试示例
验证Agent在连续对话中的行为表现:
String reply1 = assistant.respondTo("深圳现在天气如何?");
System.out.println(reply1);
// 输出:正在获取深圳天气...深圳当前天气为多云,温度26℃,湿度55%
String reply2 = assistant.respondTo("广州呢?");
System.out.println(reply2);
// 输出:广州当前天气为晴,温度29℃,空气质量良好
String reply3 = assistant.respondTo("两地温差是多少?");
System.out.println(reply3);
// 内部触发MathEvaluator.evaluateExpression("29 - 26") → 3.0
// 输出:深圳与广州的气温相差3度
结构化输出:复杂任务分解实践
利用记录类(record)接收格式化响应,实现任务拆解自动化:
record ExecutionStrategy(
String objective,
java.util.List<String> actionSteps,
String successCriteria
) {}
interface TaskDecomposer {
@SystemPrompt("作为项目架构师,请将用户目标拆解为可执行步骤")
ExecutionStrategy decompose(String userRequest);
}
TaskDecomposer scheduler = AiServices.create(TaskDecomposer.class)
.chatModel(llm)
.build();
ExecutionStrategy strategy = scheduler.decompose("搭建一个商品库存管理系统");
// LLM返回JSON格式结构体,自动映射至ExecutionStrategy实例