Appearance
代理 (Agents) 系统
代理类型与选择
LangChain 4J 提供了多种类型的代理,适用于不同的应用场景:
基本代理
基本代理使用语言模型来决策和执行任务:
java
import dev.langchain4j.agent.Agent;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.model.openai.OpenAiChatModel;
// 创建模型
OpenAiChatModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.build();
// 创建工具
Tool searchTool = Tool.builder()
.name("search")
.description("用于搜索网络信息")
.function(input -> searchWeb(input))
.build();
Tool calculatorTool = Tool.builder()
.name("calculator")
.description("用于执行数学计算")
.function(input -> calculate(input))
.build();
// 创建代理
Agent agent = Agent.builder()
.model(model)
.tools(Arrays.asList(searchTool, calculatorTool))
.build();
// 执行任务
String response = agent.execute("北京今天的天气怎么样?");
System.out.println(response);计划与执行代理
计划与执行代理先制定计划,然后执行计划:
java
import dev.langchain4j.agent.planning.PlanningAgent;
// 创建计划与执行代理
PlanningAgent agent = PlanningAgent.builder()
.model(model)
.tools(Arrays.asList(searchTool, calculatorTool))
.build();
// 执行任务
String response = agent.execute("计算 123456789 的平方根,然后搜索相关的数学概念");
System.out.println(response);反射代理
反射代理会反思自己的决策和执行过程,以提高性能:
java
import dev.langchain4j.agent.reflecting.ReflectingAgent;
// 创建反射代理
ReflectingAgent agent = ReflectingAgent.builder()
.model(model)
.tools(Arrays.asList(searchTool, calculatorTool))
.build();
// 执行任务
String response = agent.execute("解释量子计算的基本原理,并提供一个简单的例子");
System.out.println(response);工具 (Tools) 开发
工具是代理可以使用的功能,您可以创建自定义工具:
基本工具
java
import dev.langchain4j.agent.tool.Tool;
// 创建搜索工具
Tool searchTool = Tool.builder()
.name("search")
.description("用于搜索网络信息,输入是搜索查询")
.function(input -> {
// 实现搜索逻辑
return "搜索结果:...";
})
.build();
// 创建计算器工具
Tool calculatorTool = Tool.builder()
.name("calculator")
.description("用于执行数学计算,输入是数学表达式")
.function(input -> {
// 实现计算逻辑
return "计算结果:...";
})
.build();结构化工具
使用结构化输入和输出:
java
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.Parameter;
// 创建结构化工具
Tool weatherTool = Tool.builder()
.name("get_weather")
.description("获取指定城市的天气信息")
.parameters(
Parameter.builder()
.name("city")
.description("城市名称")
.type(String.class)
.required(true)
.build(),
Parameter.builder()
.name("days")
.description("预测天数")
.type(Integer.class)
.required(false)
.build()
)
.function(input -> {
String city = (String) input.get("city");
Integer days = (Integer) input.getOrDefault("days", 1);
// 实现天气查询逻辑
return "天气信息:...";
})
.build();代理执行流程
代理的执行流程通常包括以下步骤:
- 接收任务:接收用户的任务或问题
- 分析任务:分析任务类型和需求
- 制定计划:制定执行计划
- 执行工具:调用相应的工具执行任务
- 处理结果:处理工具执行结果
- 生成响应:生成最终响应
执行流程示例
java
// 执行流程示例
String task = "北京今天的天气怎么样?";
// 1. 分析任务
String analysis = model.generate("分析以下任务需要使用什么工具:" + task);
System.out.println("任务分析:" + analysis);
// 2. 制定计划
String plan = model.generate("为完成任务制定计划:" + task);
System.out.println("执行计划:" + plan);
// 3. 执行工具
String weatherInfo = searchWeb("北京今天天气");
System.out.println("工具执行结果:" + weatherInfo);
// 4. 生成响应
String response = model.generate("根据以下信息回答问题:\n问题:" + task + "\n信息:" + weatherInfo);
System.out.println("最终响应:" + response);代理评估与优化
评估和优化代理的性能是确保代理系统正常运行的重要环节:
评估指标
- 任务完成率:代理成功完成任务的比例
- 响应质量:代理响应的准确性和有用性
- 执行时间:代理执行任务的时间
- 工具使用效率:工具使用的合理性和效率
- 用户满意度:用户对代理响应的满意度
优化策略
工具优化:
- 提供更清晰的工具描述
- 优化工具参数设计
- 添加更多专用工具
提示词优化:
- 改进代理的系统提示词
- 添加示例和指导
- 明确任务要求和约束
模型选择:
- 根据任务复杂度选择合适的模型
- 考虑模型的推理能力和响应速度
执行策略优化:
- 优化计划制定过程
- 改进工具选择逻辑
- 添加错误处理和重试机制
评估示例
java
// 评估代理性能
List<String> testTasks = Arrays.asList(
"北京今天的天气怎么样?",
"计算 123456789 的平方根",
"搜索最新的人工智能研究进展"
);
int successCount = 0;
for (String task : testTasks) {
String response = agent.execute(task);
System.out.println("任务:" + task);
System.out.println("响应:" + response);
System.out.println();
// 简单评估:检查响应是否包含相关信息
if (response.contains("天气") || response.contains("计算结果") || response.contains("研究进展")) {
successCount++;
}
}
double successRate = (double) successCount / testTasks.size();
System.out.println("任务完成率:" + successRate);最佳实践
工具设计:
- 工具描述要清晰明确
- 工具功能要单一且专注
- 提供适当的参数和返回值
代理配置:
- 根据任务需求选择合适的代理类型
- 合理配置代理参数
- 提供适当的系统提示词
错误处理:
- 添加工具执行错误处理
- 实现代理执行超时处理
- 提供友好的错误提示
监控与日志:
- 记录代理执行过程
- 监控工具使用情况
- 分析代理性能指标
持续优化:
- 收集用户反馈
- 分析代理执行结果
- 不断调整和优化代理配置
安全考虑:
- 限制工具的访问权限
- 验证用户输入
- 防止恶意使用工具