当前位置: 首页 > news >正文

AI agent 项目开发

AI基础

LangChainj

目前主流的Java AI开发框架:Spring AI、LangChain4j,提供大量开箱即用的API调大模型和AI开发常用功能如:

  • 对话记忆
  • 结构化输出
  • RAG 知识库
  • 工具调用
  • MCP
  • SSE 流式输出

ChatModel

ChatModel 是最基础的概念,负责和 AI 大模型交互。
首先需要引入至少一个 AI 大模型依赖,这里选择国内的阿里云大模型,提供了和 Spring Boot 项目的整合依赖包,比较方便。在pom.xml中引入依赖:

dev.langchain4j
langchain4j-community-dashscope-spring-boot-starter
1.1.0-beta7

项目

标题项目配置

Java版本:21
springboot:3.5.*
引入依赖:Spring Web,Lombok
将src/resources中application.properties 改为application.yml

application.properties:采用 键值对(key=value) 格式,是传统的配置方式,语法简单直接。如:
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456

application.yml:采用 YAML(YAML Ain’t Markup Language) 格式,基于缩进(空格,不能用 Tab)表达层级关系,支持列表、嵌套,语法更简洁、结构化更强。
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
用 application.properties:
配置项少、层级浅的简单场景;
团队成员不熟悉 YAML 语法,追求最低学习成本;
需要兼容老项目(老项目多使用 properties)。
用 application.yml:
配置项多、层级深(如微服务、数据库 / 缓存 / 消息队列多配置);
需要配置列表 / 数组(如白名单、多环境配置);
追求配置文件的可读性和整洁性。

新建local版本的application.yml文件,防止开源时泄密,修改.gitignore 文件,添加一个自定义的不添加到github上的文件:application-local.yml

###CUSTMO### application-local.yml

.gitignore 是 Git 版本控制系统中一个核心的配置文件,作用是告诉 Git:「哪些文件 /
文件夹不需要被追踪(即不纳入版本管理)」。简单来说,它就是 Git 的「忽略清单」,能帮你过滤掉不需要提交到代码仓库的文件。

项目启动类路径:src/main/java/com/example/aicodehelper/AiCodeHelperApplication.java

在配置文件中添加大模型配置

注入ChatModel

langchain4j:community:dashscope:chat-model:model-name:qwen-max api-key:<YouAPIKeyhere>

如此一来便有了ChatModel,可以注入

接下来在项目文件中创建AiCodeHelper 类,引入自动注入的 qwenChatModel,编写简单的对话代码,并利用 Lombok 注解打印输出结果日志:

packagecom.example.aicodehelper.ai;importdev.langchain4j.data.message.AiMessage;importdev.langchain4j.data.message.UserMessage;importdev.langchain4j.model.chat.ChatModel;importdev.langchain4j.model.chat.response.ChatResponse;importjakarta.annotation.Resource;importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Service;@Service@Slf4jpublicclassAiCodeHelper{@ResourceprivateChatModelqwenChatModel;//和ai聊天publicStringchat(Stringmessage){UserMessageuserMessage=UserMessage.from(message);//在langchain4j中用UserMessage封装用户消息ChatResponsechatResponse=qwenChatModel.chat(userMessage);//模型输出AiMessageaiMessage=chatResponse.aiMessage();//从输出中提取模型的回复log.info("AI输出:"+aiMessage.toString());//调试的时候采用.toString()returnaiMessage.text();//获取ai的文本回复用.text()}}

LangChain4j 中使用多模态的方法很简单,用户消息中可以添加图片、音视频、PDF 等媒体资源。

具体做法是通过UserMessage传递,UserMessage可以接收多模态的数据

UserMessageuserMessage=UserMessage.from(TextContent.from("描述图片"),ImageContent.from("https://www.codefather.cn/logo.png"));

但实现多模态agent的前提是使用的大模型支持多模态。

系统提示词-SystemMessage

系统提示词是设置 AI 模型行为规则和角色定位的隐藏指令,用户通常不能直接看到。
可以定义一个常量字符串保存系统提示词:

privatestaticfinalStringSYSTEM_MESSAGE=""" 你是编程领域的小助手,帮助用户解答编程学习和求职面试相关的问题,并给出建议。重点关注 4 个方向: 1. 规划清晰的编程学习路线 2. 提供项目学习建议 3. 给出程序员求职全流程指南(比如简历优化、投递技巧) 4. 分享高频面试题和面试技巧 请用简洁易懂的语言回答,助力用户高效学习与求职。 """;

然后在传消息给大模型的时候将系统提示词一起传过去:

publicStringchat(Stringmessage){SystemMessagesystemMessage=SystemMessage.from(SYSTEM_MESSAGE);UserMessageuserMessage=UserMessage.from(message);//在langchain4j中用UserMessage封装用户消息ChatResponsechatResponse=qwenChatModel.chat(systemMessage,userMessage);//模型输出AiMessageaiMessage=chatResponse.aiMessage();//从输出中提取模型的回复log.info("AI输出:"+aiMessage.toString());//调试的时候采用.toString()returnaiMessage.text();//获取ai的文本回复用.text()}

首先创建SystemMessage 对象接收系统提示词,然后在qwenChatModel.chat传入,直接在userMessage之前传入就行了。

AI服务-AI Service

首先引入 langchain4j 依赖:

dev.langchain4j
langchain4j
1.1.0

然后创建AI Service服务接口,采用声明式开发方法,编写一个对话方法,然后可以直接通过 @SystemMessage 注解定义系统提示词。

publicinterfaceAiCodeHelperService{@SystemMessage("你是一位编程小助手")Stringchat(StringuserMessage);}

同时,@SystemMessage 注解支持从文件中读取系统提示词:

publicinterfaceAiCodeHelperService{@SystemMessage(fromResource="system-prompt.txt")Stringchat(StringuserMessage);}

然后编写工厂类,用于创建 AI Service:

工厂类(Factory Class)是编程中创建型设计模式的核心实现,可以理解成 “对象生产车间”:它不直接让你用 new
关键字创建对象,而是通过专门的工厂类方法来封装对象的创建逻辑,对外提供统一的创建入口。 public class
AiCodeHelperFactory {
// 工厂方法:根据类型创建不同的实现类对象
public static AiCodeHelperService createService(String type) {
if (“openai”.equals(type)) {
return new OpenAiCodeHelperServiceImpl();
} else if (“local”.equals(type)) {
return new LocalAiCodeHelperServiceImpl();
}
throw new IllegalArgumentException(“不支持的AI类型”);
} }

// 使用工厂类创建对象(无需关心具体实现类) AiCodeHelperService service =
AiCodeHelperFactory.createService(“openai”); String result =
service.chat(“帮我写一段Java代码”);
核心特点:
隐藏对象创建的细节(比如实现类的初始化、依赖注入、配置加载);
统一管理对象创建,修改创建逻辑时只需改工厂类,无需修改所有调用处;
解耦 “对象使用” 和 “对象创建”。

@ConfigurationpublicclassAiCodeHelperServiceFactory{@ResourceprivateChatModelqwenChatModel;@BeanpublicAiCodeHelperServiceaiCodeHelperService(){returnAiServices.create(AiCodeHelperService.class,qwenChatModel);}}

调用 AiServices.create 方法就可以创建出 AI Service 的实现类了,背后的原理是利用 Java 反射机制创建了一个实现接口的代理对象,代理对象负责输入和输出的转换,比如把 String 类型的用户消息参数转为 UserMessage 类型并调用 ChatModel,再将 AI 返回的 AiMessage 类型转换为 String 类型作为返回值。

编写单元测试,调用我们开发的AIService@SpringBootTestclassAiCodeHelperServiceTest{@ResourceprivateAiCodeHelperServiceaiCodeHelperService;@Testvoidchat(){Stringresult=aiCodeHelperService.chat("你好,我是程序员鱼皮");System.out.println(result);}}

结构化输出


结构化输出有 3 种实现方式:

  • 利用大模型的 JSON schema
  • 利用 Prompt + JSON Mode
  • 利用 Prompt

利用 Prompt:
默认是 Prompt 模式,也就是在原本的用户提示词下拼接一段内容 来指定大模型强制输出包含特定字段的 JSON 文本。

你是一个专业的信息提取助手。请从给定文本中提取人员信息, 并严格按照以下JSON格式返回结果:{"name":"人员姓名","age":年龄数字,"height":身高(米),"married":true/false,"occupation":"职业"}重要规则:1.只返回JSON格式,不要添加任何解释2.如果信息不明确,使用null3.age 必须是数字,不是字符串4.married 必须是布尔值

这样方法并不严格,最后的输出可能不会按结构化格式输出。

JSON schema:

底层接口实现:

采用JSONSchema模式,直接在请求中约束LLM的输出格式。这是目前最可靠、精确度最高的结构化输出实现。ResponseFormatresponseFormat=ResponseFormat.builder().type(JSON).jsonSchema(JsonSchema.builder().name("Person").rootElement(JsonObjectSchema.builder().addStringProperty("name").addIntegerProperty("age").addNumberProperty("height").addBooleanProperty("married").required("name","age","height","married").build()).build()).build();ChatRequestchatRequest=ChatRequest.builder().responseFormat(responseFormat).messages(userMessage).build();

流程:

在代码中使用JSON schema进行结构化约束:
比如我们增加一个 让 AI 生成学习报告 的方法,AI 需要输出学习报告对象,包含名称和建议列表

@SystemMessage(fromResource="system-prompt.txt")ReportchatForReport(StringuserMessage);// 学习报告recordReport(Stringname,List<String>suggestionList){}
record Report(String name, List<String> suggestionList){} :AI 框架会基于你定义的 Report 记录类(record)「自动生成 JSON Schema」并注入到系统提示中

record Report(String name, List suggestionList){} 本质是 Java 的类型定义(类似定义一个类),而非可直接执行的方法 / 函数,所以你看不到像 new Report(…) 或 report.xxx() 这样的 “调用”,但它的作用贯穿整个 chatForReport 方法的执行流程。

编写单元测试:

@TestvoidchatForReport(){StringuserMessage="你好,我是程序员鱼皮,学编程两年半,请帮我制定学习报告";AiCodeHelperService.Reportreport=aiCodeHelperService.chatForReport(userMessage);System.out.println(report);}
http://www.jsqmd.com/news/508631/

相关文章:

  • 多模态特征融合新突破!刷爆顶会SOTA!
  • Xycom XVME-976 CPU单元处理器卡
  • 开箱即用!AgentCPM研报助手镜像部署,三步开启本地AI研究之旅
  • Qwen3.5-9B环境部署:Ubuntu/CUDA12.1+PyTorch2.3兼容配置
  • Fish-Speech-1.5多语言TTS实战:基于Python爬虫的语音数据采集与处理
  • 基于RexUniNLU的智能新闻推荐系统
  • 【力扣-76. 最小覆盖字串[特殊字符]】Python笔记
  • 2026 年 AI 毕业论文格式排版工具全测评:9 款工具破解格式困局
  • Python 脚本学习体系(9个核心节点)【20260318-001篇】
  • 计算机毕业设计之springboot基于微信小程序的社区买菜订购系统的设计与实现
  • 基于FPGA的机器视觉缺陷检测系统:实现铝片表面四种缺陷的源码端测文件集成,采用SSD-Mob...
  • 零基础搭建 AI 测试环境:手把手教程
  • LoRA训练助手Win11兼容性测试:系统优化指南
  • 实时手机检测-通用效果展示:手机边缘定位精准度可视化分析
  • 三菱Fx3U三轴定位控制程序,其中两轴为脉冲输出同步运行360度转盘,3轴为工作台丝杆。 1...
  • openclaw+Nunchaku FLUX.1-dev:开源大模型支持TensorRT加速部署教程
  • Qwen3-VL-4B Pro效果实测:看图说话能力惊艳,细节识别准确率高
  • MATLAB/Simulink仿真:基于下垂控制的蓄电池SOC均衡策略
  • 基于ADRC的永磁同步直线电机Simulink仿真模型
  • Qwen-Image镜像新手指南:RTX4090D用户首次运行Qwen-VL图文推理全流程
  • 基于EVA-02构建智能问答Agent:技术论坛帖子内容归纳与解答
  • 前端入门必学CSS零基础快速入门篇(可用于备赛蓝桥杯Web应用开发) 牛客手把手带刷FE14,FE15:布局_含::after详解+固定定位的核心特点 补充知识点
  • ABAQUS盾构管片精细化建模cae源文件及录屏讲解教程 包含单环和多环两种 一环6块,环宽1.5m
  • 大数据领域分布式存储的存储系统自动化配置
  • 实时口罩检测-通用模型案例分享:快速检测图片中多人口罩佩戴情况
  • 计算机毕业设计 | SpringBoot+vue仓库管理系统 仓储物流管理平台(附源码+论文)
  • RAG 构建,学这四个神级项目就够了
  • AgentCPM在Qt桌面应用中的集成:开发一款本地化的智能研报编写工具
  • AIVideo算法解析:从文本到视频的Transformer架构
  • Qwen3.5-9B多模态token部署详解:早期融合训练架构解析