使用 LangChain4j 和通义千问构建 AI Agent

概述

本文将介绍如何使用 LangChain4j 框架结合阿里云通义千问模型创建一个实用的 AI Agent。我们将构建一个能够识别代码文件类型并自动重命名文件后缀的智能助手。

项目依赖配置

核心依赖项

  • langchain4j: 基础框架 (1.10.0)
  • langchain4j-community-dashscope: 阿里云通义千问集成 (1.10.0-beta18)
  • langchain4j-http-client-jdk: HTTP 客户端实现

Maven 依赖

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j</artifactId>
    <version>1.10.0</version>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-http-client-jdk</artifactId>
    <version>1.10.0</version>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-community-dashscope</artifactId>
    <version>1.10.0-beta18</version>
</dependency>

AI Agent 实现详解

1. 主程序结构

在 src 目录创建 DashScopeAiCodeRecognition.java

模型初始化
QwenChatModel model = QwenChatModel.builder()
        .apiKey("sk-b3ab938***********************") // 指定api key
        .modelName("qwen3-max") // 指定使用的模型名称
        .build();

2. 助手接口定义

interface Assistant {
    @SystemMessage("You are a helpful programming assistant.")
    String help(String prompt);
}

@SystemMessage 注解,其中包含我们想要使用的系统提示模板。 这将在幕后转换为 SystemMessage 并与 UserMessage 一起发送给 LLM。

3. 自定义工具集

创建 CodeRecognitionTool 类。
AI Agent 通过三个自定义工具实现功能:

文件列表工具
@Tool(name = "列出给定目录的文件")
public List<File> listFiles(@P(value = "文件目录") String dir)
文件读取工具
@Tool(name = "读取给定文件的内容")
public String readFile(String file)
文件重命名工具
@Tool(name = "重命名文件")
public void renameFile(@P("源文件名") String filename, @P("新文件名") String newFileName)

@Tool 注解将普通的 Java 方法定义为 AI Agent 可调用的工具方法,name 参数描述方法实现的功能,合理的描述便于 AI 理解。

AI Services 创建
Assistant assistant = AiServices.builder(Assistant.class)
        .chatModel(model) // 使用的模型实例
        .tools(new CodeRecognitionTool()) // 使用的自定义工具类实例
        .build();

核心功能演示

代码语言识别与重命名

当前实现的功能是:

  1. 读取指定文件内容
  2. 分析代码特征识别编程语言
  3. 将文件重命名为正确的扩展名

示例调用

String help = assistant.help("帮我识别出 D:\\IdeaProjects\\ai-test\\a\\test 文件的编程语言并重命名为正确的后缀");

完整代码

package com.github.cloudgyb.tools;

import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.community.model.dashscope.QwenChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.SystemMessage;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class DashScopeAiCodeRecognition {

    public static void main(String[] args) {
        QwenChatModel model = QwenChatModel.builder()
                .apiKey("sk-b3ab9****************************")
                .modelName("qwen3-max")
                .build();
        Assistant assistant = AiServices.builder(Assistant.class)
                .chatModel(model)
                .tools(new CodeRecognitionTool())
                .build();
        /*String help = assistant.help("根据文件内容识别出编程语言,帮我将 D:\\IdeaProjects\\ai-test\\a " +
                "目录下所有文件重命名为正确的后缀");
        System.out.println(help);*/
        String help = assistant.help("帮我识别出 D:\\IdeaProjects\\ai-test\\a\\test 文件的编程语言并 " +
                "重命名为正确的后缀");
        System.out.println(help);
    }

    interface Assistant {
        @SystemMessage("You are a helpful programming assistant.")
        String help(String prompt);
    }

    static class CodeRecognitionTool {
        @Tool(name = "列出给定目录的文件")
        public List<File> listFiles(@P(value = "文件目录") String dir) {
            System.out.println("listFiles " + dir);
            Path path1 = Paths.get(dir);
            return Arrays.asList(Objects.requireNonNull(path1.toFile().listFiles()));
        }

        @Tool(name = "读取给定文件的内容")
        public String readFile(String file) {
            System.out.println("readFile " + file);
            try (FileInputStream fileInputStream = new FileInputStream(file)) {
                return new String(fileInputStream.readAllBytes(), StandardCharsets.UTF_8);
            } catch (IOException e) {
                return "无法读取文件";
            }
        }

        /**
         * 重命名文件
         *
         * @param filename    源文件名
         * @param newFileName 新文件名
         */
        @Tool(name = "重命名文件")
        public void renameFile(@P("源文件名") String filename, @P("新文件名") String newFileName) {
            System.out.println("renameFile " + filename + " " + newFileName);
            boolean b = new File(filename).renameTo(new File(newFileName));
            if (b) {
                System.out.println("重命名成功");
            } else {
                System.out.println("重命名失败");
            }
        }
    }
}

运行代码:

在这里插入图片描述

总结

本博客展示了如何使用 LangChain4j 构建一个实用的 AI Agent,该 Agent 可以智能地识别代码文件类型并自动修正文件扩展名。这种方案可广泛应用于代码库整理、文件管理等场景,大大提高了开发效率。

通过合理的架构设计和工具集成,我们可以构建出功能强大且易于使用的 AI 应用程序。随着大模型技术的不断发展,这类智能助手将在软件开发流程中发挥越来越重要的作用。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐