Skip to content

代理 (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();

代理执行流程

代理的执行流程通常包括以下步骤:

  1. 接收任务:接收用户的任务或问题
  2. 分析任务:分析任务类型和需求
  3. 制定计划:制定执行计划
  4. 执行工具:调用相应的工具执行任务
  5. 处理结果:处理工具执行结果
  6. 生成响应:生成最终响应

执行流程示例

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);

代理评估与优化

评估和优化代理的性能是确保代理系统正常运行的重要环节:

评估指标

  • 任务完成率:代理成功完成任务的比例
  • 响应质量:代理响应的准确性和有用性
  • 执行时间:代理执行任务的时间
  • 工具使用效率:工具使用的合理性和效率
  • 用户满意度:用户对代理响应的满意度

优化策略

  1. 工具优化

    • 提供更清晰的工具描述
    • 优化工具参数设计
    • 添加更多专用工具
  2. 提示词优化

    • 改进代理的系统提示词
    • 添加示例和指导
    • 明确任务要求和约束
  3. 模型选择

    • 根据任务复杂度选择合适的模型
    • 考虑模型的推理能力和响应速度
  4. 执行策略优化

    • 优化计划制定过程
    • 改进工具选择逻辑
    • 添加错误处理和重试机制

评估示例

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);

最佳实践

  1. 工具设计

    • 工具描述要清晰明确
    • 工具功能要单一且专注
    • 提供适当的参数和返回值
  2. 代理配置

    • 根据任务需求选择合适的代理类型
    • 合理配置代理参数
    • 提供适当的系统提示词
  3. 错误处理

    • 添加工具执行错误处理
    • 实现代理执行超时处理
    • 提供友好的错误提示
  4. 监控与日志

    • 记录代理执行过程
    • 监控工具使用情况
    • 分析代理性能指标
  5. 持续优化

    • 收集用户反馈
    • 分析代理执行结果
    • 不断调整和优化代理配置
  6. 安全考虑

    • 限制工具的访问权限
    • 验证用户输入
    • 防止恶意使用工具