学习 Java AI智能体笔记 Abei 2025-07-10 2025-07-10 AI 智能体笔记
项目介绍
以 AI 开发实战为核心的项目,通过开发
AI 视力助手 + 拥有自主规划能力的超级智能体
AI 视力助手应用可以依赖 AI
大模型解决用户的眼健康问题,支持多轮对话、基于自定义知识库进行问答、自主调用工具和
MCP 服务完成任务,比如调用地图服务获取附近地点并制定恢复计划。
项目知识点
AI 应用平台的使用
接入 AI 大模型
AI 开发框架(Spring AI + LangChain4j)
AI 大模型本地部署
Prompt 工程和优化技巧
多模态特性
Spring AI 核心特性:如自定义拦截器、上下文持久化、结构化输出
RAG 知识库和向量数据库
Tool Calling 工具调用
MCP 模型上下文协议和服务开发
AI 智能体 Manus 原理和自主开发
AI 服务化和 Serverless 部署
需求分析
AI 视力助手:用户在眼康训练过程中难免遇到各种难题,让 AI
为用户提供贴心健康指导。支持多轮对话、对话记忆持久化、RAG
知识库检索、工具调用、MCP 服务调用。
AI
超级智能体:可以根据用户的需求,自主推理和行动,直到完成目标。
提供给 AI
的工具:包括联网搜索、文件操作、网页抓取、资源下载、终端操作、PDF
生成。
AI MCP 服务:可以从特定网站搜索图片。
技术选型
项目以 Spring AI 开发框架实战为核心,涉及到多种主流 AI
客户端和工具库的运用。
Java 21 + Spring Boot 3 框架
⭐ Spring AI + LangChain4j
⭐ RAG 知识库
⭐ PGvector 向量数据库
⭐ Tool Calling 工具调用
⭐ MCP 模型上下文协议
⭐ ReAct Agent 智能体构建
⭐ Serverless 计算服务
⭐ AI 大模型开发平台百练
⭐ Cursor AI 代码生成 + MCP
第三方接口:如 SearchAPI / Pexels API
Ollama 大模型部署
Kryo 高性能序列化
Jsoup 网页抓取
iText PDF 生成
Knife4j 接口文档
image-20250710195800855
架构设计
从客户端发送请求开始,自上而下经过一系列处理,最终得到响应结果。架构图如下:
image-20250710195858282
AI 大模型接入
从 AI 大模型上手,学会如何使用 AI 大模型以及通过编程调用 AI
大模型。
具体内容:
AI 大模型概念
接入 AI 大模型(3种方式)
后端项目初始化
程序调用 AI 大模型(4种方式)
本地部署 AI 大模型
Spring AI 调用本地大模型
AI 大模型概念
image-20250710200334173
大模型举例:
OpenAI
GPT-4o (多模态)
GPT-4(文本 + 图像)
GPT-3.5 Turbo (主要处理文本)
Anthropic
Claude 3 系列(Opus, Sonnet, Haiku, 由强到弱)
Google
Gemini Ultra / Pro / Nano(多模态能力)
Meta
Llama 3(开源, 70B 和 8B 参数版本)
Llama 2 (开源, 多种参数规模)
国内大模型
后续的 AI 介绍不再记录
。。。
接入 AI 大模型
主要有 2 种途径来接入 AI 大模型,分别是云服务和自部署
云服务
直接使用其他云服务商在云端已部署好的大模型服务,
无需自己考虑基础设施(比如服务器、GPU 算力),特点如下:
提供纯净的大模型能力和构建应用(智能体)的工具
按需付费,无需前期大量基础设施投入
随时可用,维护成本低
自动更新到最新版本的模型
通常具有更完善的安全措施和合规保障
自部署
本地或私有云环境部署开源大模型,特点如下:
完全控制数据流,更高的数据隐私保障
可根据特定需求微调和定制模型
无网络延迟,适合对响应速度有严格要求的场景
一次性成本较高,需要专业的技术团队维护
适合企业级应用和对数据安全有严格要求的场景
接入大模型的 3 种方式
AI 应用平台接入
通过与服务商提供的 AI 应用平台来使用 AI 大模型
本次学习以阿里云百炼为例
点击去阿里云百炼 ->>> 阿里云百炼
在使用阿里云百炼产品时,可能会看到另一个产品 -
模型服务灵积(DashScope)
很容易把这两个产品混淆。百炼是一个可视化平台,同时服务于技术和非技术同学,使用更简单,更上层;而灵积旨在通过灵活、易用的
模型
API 接口
,让开发者能够快速调用丰富的大模型能力,面向技术开发同学,更底层。
AI 软件客户端接入
如 Cursor ,不是本文学习重点,跳过
程序接入
可以通过编程的方式在自己的项目中调用 AI 大模型,又可以分为 2
种方式:
直接调用 AI 大模型,比如调用 DeepSeek (更原生)
调用 AI 大模型平台创建的应用或智能体(更方便)
对于第一种方式,可以使用特定平台提供的 SDK 或
API,参考平台的文档来接入;也可以使用 AI 开发框架,比如 Spring
AI、Spring AI Alibaba、LangChain4j
等自主选择大模型进行调用,可以灵活切换使用的大模型而几乎不用修改代码。
对于第二种方式,一般只能使用特定平台提供的 SDK 或 API,参考
平台的文档
来接入,每个大模型服务平台的代码都不一样
后端初始化省略。。。
程序调用 AI 大模型
在实际开发中,有多种方式可以在应用程序中调用 AI 大模型。下面详细介绍
4 种主流的接入方式,并通过实例代码展示如何在 Java 项目中实现与 AI
大模型的交互
SDK 接入:使用官方提供的软件开发工具包,最直接的集成方式
HTTP 接入:通过 REST API 直接发送 HTTP 请求调用模型
Spring AI:基于 Spring 生态系统的 AI 框架,更方便地接入大模型
LangChain4j:专注于构建 LLM 应用的 Java 框架,提供丰富的 AI
调用组件
本次选择阿里云百炼平台接入,因为阿里大模型对 Java
开发生态支持较好,更容易与现有 Java 框架集成。
SDK 接入
SDK
(软件开发包)是官方提供的最直接的集成方式,通常提供了完善的类型支持和错误处理机制。
首先需要按照官方文档安装 SDK 安装 SDK 官方指南
在 pom.xml 种引入依赖
1 2 3 4 5 6 <dependency > <groupId > com.alibaba</groupId > <artifactId > dashscope-sdk-java</artifactId > <version > 2.20.6</version > </dependency >
在阿里云百炼申请一个 API Key,不要泄露
image-20250710205017023
项目中新建 demo.invoke
包,集中存放调用 AI
大模型的示例代码。
具体的代码示例可参考官方文档 通过 API 调用通义千问
通过 SDK 调用模型的完整示例代码:
注意下面的代码是用的是 dashscope 不是 HTTP请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 import java.util.Arrays;import java.lang.System;import com.alibaba.dashscope.aigc.generation.Generation;import com.alibaba.dashscope.aigc.generation.GenerationParam;import com.alibaba.dashscope.aigc.generation.GenerationResult;import com.alibaba.dashscope.common.Message;import com.alibaba.dashscope.common.Role;import com.alibaba.dashscope.exception.ApiException;import com.alibaba.dashscope.exception.InputRequiredException;import com.alibaba.dashscope.exception.NoApiKeyException;import com.alibaba.dashscope.utils.JsonUtils;public class SdkAiInvoke { public static GenerationResult callWithMessage () throws ApiException, NoApiKeyException, InputRequiredException { Generation gen = new Generation (); Message systemMsg = Message.builder() .role(Role.SYSTEM.getValue()) .content("You are a helpful assistant." ) .build(); Message userMsg = Message.builder() .role(Role.USER.getValue()) .content("你是谁?" ) .build(); GenerationParam param = GenerationParam.builder() .apiKey(TestApiKey.API_KEY) .model("qwen-plus" ) .messages(Arrays.asList(systemMsg, userMsg)) .resultFormat(GenerationParam.ResultFormat.MESSAGE) .build(); return gen.call(param); } public static void main (String[] args) { try { GenerationResult result = callWithMessage(); System.out.println(JsonUtils.toJson(result)); } catch (ApiException | NoApiKeyException | InputRequiredException e) { System.err.println("An error occurred while calling the generation service: " + e.getMessage()); } System.exit(0 ); } }
开发接入 阿里系的大模型,可直接引入 Spring AI Alibaba,完全兼容
Spring AI 框架
1 2 3 4 5 <dependency > <groupId > com.alibaba.cloud.ai</groupId > <artifactId > spring-ai-alibaba-starter</artifactId > <version > 1.0.0-M6.1</version > </dependency >
编写配置类
1 2 3 4 5 6 7 8 9 spring: application: name: spring-ai-alibaba-qwq-chat-client-example ai: dashscope: api-key: ${AI_DASHSCOPE_API_KEY} // 替换API chat: options: model: qwen-plus
编写实例代码,注意要注入dashscopeChatModel
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @Component public class SpringAiAiInvoke implements CommandLineRunner { @Resource private ChatModel dashscopeChatModel; @Override public void run (String... args) throws Exception { AssistantMessage output = dashscopeChatModel.call(new Prompt ("你好,我是鱼皮" )) .getResult() .getOutput(); System.out.println(output.getText()); } }
CommandLineRunner,实现这个接口的目的是在Spring boot
启动后直接执行一次,为了测试
LangChain4j 和 使用 Ollama
本都部署接入的内容不继续写入,本次学习不作重点
Ollama 官方文档
AI 应用开发
熟悉 Prompt 工程和优化技巧,并设计开发一款 AI 视力助手,实战 Spring
AI 调用大模型、对话记忆、Advisor、结构化输出、自定义对话记忆、Prompt
模板等特性
具体内容包括:
Prompt 工程基本概念 (不做介绍)
Prompt 优化技巧
AI 视力助手应用需求分析
AI 视力助手应用方案设计
Spring AI ChatClient / Advisor / ChatMemory 特性
多轮对话 AI 应用开发
Spring AI 自定义 Advisor
Spring AI 结构化输出 - 视力报告功能
Spring AI 对话记忆持久化
Spring AI Prompt 模板特性
多模态概念和开发
Prompt 优化技巧
利用资源
Prompt 学习
Prompt 提示词库
基础提示技巧
明确指定任务和角色
1 2 系统:你是一位经验丰富的Python教师,擅长向初学者解释编程概念。 用户:请解释 Python 中的列表推导式,包括基本语法和 2-3 个实用示例。
提供详细说明和具体示例
1 2 3 4 5 6 7 8 9 10 11 请提供一个社交媒体营销计划,针对一款新上市的智能手表。计划应包含: 1. 目标受众描述 2. 三个内容主题 3. 每个平台的内容类型建议 4. 发布频率建议 示例格式: 目标受众: [描述] 内容主题: [主题1], [主题2], [主题3] 平台策略: [平台] - [内容类型] - [频率]
使用结构化格式引导思维
1 2 3 4 5 6 7 8 9 10 分析以下公司的优势和劣势: 公司: Tesla 请使用表格格式回答,包含以下列: - 优势(最少3项) - 每项优势的简要分析 - 劣势(最少3项) - 每项劣势的简要分析 - 应对建议
明确输出格式要求
1 2 3 4 5 6 撰写一篇关于气候变化的科普文章,要求: - 使用通俗易懂的语言,适合高中生阅读 - 包含5个小标题,每个标题下2-3段文字 - 总字数控制在800字左右 - 结尾提供3个可行的个人行动建议
进阶提示技巧
思维链提示法(Chain-of-Thought)
引导模型展示推理过程,逐步思考问题,提高复杂问题的准确性
1 2 3 4 5 6 7 8 问题:一个商店售卖T恤,每件15元。如果购买5件以上可以享受8折优惠。小明买了7件T恤,他需要支付多少钱? 请一步步思考解决这个问题: 1. 首先计算7件T恤的原价 2. 确定是否符合折扣条件 3. 如果符合,计算折扣后的价格 4. 得出最终支付金额
少样本学习(Few-Shot Learning)
通过提供几个输入-输出对的示例,帮助模型理解任务模式和期望输出。
1 2 3 4 5 6 7 8 9 10 11 我将给你一些情感分析的例子,然后请你按照同样的方式分析新句子的情感倾向。 输入: "这家餐厅的服务太差了,等了一个小时才上菜" 输出: 负面,因为描述了长时间等待和差评服务 输入: "新买的手机屏幕清晰,电池也很耐用" 输出: 正面,因为赞扬了产品的多个方面 现在分析这个句子: "这本书内容还行,但是价格有点贵"
分步骤指导(Step-by-Step)
将复杂任务分解为可管理的步骤,确保模型完成每个关键环节
1 2 3 4 5 6 7 8 请帮我创建一个简单的网站落地页设计方案,按照以下步骤: 步骤1: 分析目标受众(考虑年龄、职业、需求等因素) 步骤2: 确定页面核心信息(主标题、副标题、价值主张) 步骤3: 设计页面结构(至少包含哪些区块) 步骤4: 制定视觉引导策略(颜色、图像建议) 步骤5: 设计行动召唤(CTA)按钮和文案
自我评估和修正
让模型评估自己的输出并进行改进,提高准确性和质量
1 2 3 4 5 6 7 8 9 解决以下概率问题: 从一副标准扑克牌中随机抽取两张牌,求抽到至少一张红桃的概率。 首先给出你的解答,然后: 1. 检查你的推理过程是否存在逻辑错误 2. 验证你使用的概率公式是否正确 3. 检查计算步骤是否有误 4. 如果发现任何问题,提供修正后的解答
知识检索和引用
引导模型检索相关信息并明确引用信息来源,提高可靠性
1 2 3 4 5 6 7 8 请解释光合作用的过程及其在植物生长中的作用。在回答中: 1. 提供光合作用的科学定义 2. 解释主要的化学反应 3. 描述影响光合作用效率的关键因素 4. 说明其对生态系统的重要性 对于任何可能需要具体数据或研究支持的陈述,请明确指出这些信息的来源,并说明这些信息的可靠性。
多视角分析
引导模型从不同角度、立场或专业视角分析问题,提供全面见解。
1 2 3 4 5 6 7 8 9 10 11 12 13 分析"城市应该禁止私家车进入市中心"这一提议: 请从以下4个不同角度分析: 1. 环保专家视角 2. 经济学家视角 3. 市中心商户视角 4. 通勤居民视角 对每个视角: - 提供支持该提议的2个论点 - 提供反对该提议的2个论点 - 分析可能的折中方案
多模态思维
结合不同表达形式进行思考,如文字描述、图表结构、代码逻辑等
1 2 3 4 5 6 7 8 9 设计一个智能家居系统的基础架构: 1. 首先用文字描述系统的主要功能和组件 2. 然后创建一个系统架构图(用ASCII或文本形式表示) 3. 接着提供用户交互流程 4. 最后简述实现这个系统可能面临的技术挑战 尝试从不同角度思考:功能性、用户体验、技术实现、安全性等。
提示词调试与优化
迭代式提示优化
通过逐步修改和完善提示词,提高输出质量
1 2 3 4 5 6 7 8 9 10 11 12 初始提示: 谈谈人工智能的影响。 [收到笼统回答后] 改进提示: 分析人工智能对医疗行业的三大积极影响和两大潜在风险,提供具体应用案例。 [如果回答仍然不够具体] 进一步改进: 详细分析AI在医学影像诊断领域的具体应用,包括: 1. 现有的2-3个成功商业化AI诊断系统及其准确率 2. 这些系统如何辅助放射科医生工作 3. 实施过程中遇到的主要挑战 4. 未来3-5年可能的技术发展方向
边界测试
通过极限情况测试模型的能力边界,找出优化空间
1 2 3 4 5 6 7 8 尝试解决以下具有挑战性的数学问题: 证明在三角形中,三条高的交点、三条中线的交点和三条角平分线的交点在同一条直线上。 如果你发现难以直接证明: 1. 说明你遇到的具体困难 2. 考虑是否有更简单的方法或特例可以探讨 3. 提供一个思路框架,即使无法给出完整证明
提示词模板化
创建结构化模板,便于针对类似任务进行一致性提示,否则每次输出的内容可能会比较大的区别,不利于调试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 【专家角色】: {领域}专家 【任务描述】: {任务详细说明} 【所需内容】: - {要点1} - {要点2} - {要点3} 【输出格式】: {格式要求} 【语言风格】: {风格要求} 【限制条件】: {字数、时间或其他限制} 例如: 【专家角色】: 营养学专家 【任务描述】: 为一位想减重的上班族设计一周健康饮食计划 【所需内容】: - 七天的三餐安排 - 每餐的大致卡路里 - 准备建议和购物清单 【输出格式】: 按日分段,每餐列出具体食物 【语言风格】: 专业但友好 【限制条件】: 考虑准备时间短,预算有限
错误分析与修正
系统性分析模型回答中的错误,并针对性优化提示词,这一点在我们使用
Cursor 等 AI 开发工具生成代码时非常有用
1 2 3 4 5 6 7 8 9 10 11 我发现之前请你生成的Python代码存在以下问题: 1. 没有正确处理文件不存在的情况 2. 数据处理逻辑中存在边界条件错误 3. 代码注释不够详细 请重新生成代码,特别注意: 1. 添加完整的异常处理 2. 测试并确保所有边界条件 3. 为每个主要函数和复杂逻辑添加详细注释 4. 遵循PEP 8编码规范
AI 应用方案设计
根据需求,我们将实现一个具有多轮对话能力的 AI
视力助手应用。整体方案设计将围绕 2 个核心展开:
系统提示词设计
此处不再赘述,可直接在阿里云百炼平台调试系统提示词
多轮对话实现
要实现具有“记忆力”的 AI 应用,让 AI
能够记住用户之前的对话内容并保持上下文连贯性,我们可以使用 Spring AI
框架的 对话记忆能力
。
如何使用对话记忆能力呢?参考 Spring AI 的官方文档,了解到 Spring AI
提供了 ChatClient
API 来和 AI 大模型交互。
ChatClient 特性
之前我们直接使用 Spring Boot 注入的 ChatModel
来调用大模型完成对话,而通过我们自己构造的
ChatClient,可实现功能更丰富、更灵活的 AI
对话客户端,也更推荐通过这种方式调用 AI
通过示例代码,能够感受到 ChatModel 和 ChatClient 的区别。ChatClient
支持更复杂灵活的链式调用(Fluent API):
1 2 3 4 5 6 7 8 9 10 ChatResponse response = chatModel.call(new Prompt ("你好" ));ChatClient chatClient = ChatClient.builder(chatModel) .defaultSystem("你是恋爱顾问" ) .build(); String response = chatClient.prompt().user("你好" ).call().content();
Spring AI 提供了多种构建 ChatClient
的方式,比如自动注入、通过建造者模式手动构造:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @Service public class ChatService { private final ChatClient chatClient; public ChatService (ChatClient.Builder builder) { this .chatClient = builder .defaultSystem("你是恋爱顾问" ) .build(); } } ChatClient chatClient = ChatClient.builder(chatModel) .defaultSystem("你是恋爱顾问" ) .build();
ChatClient 支持多种响应格式,比如返回 ChatResponse
对象、返回实体对象、流式返回:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ChatResponse chatResponse = chatClient.prompt() .user("Tell me a joke" ) .call() .chatResponse(); record ActorFilms (String actor, List<String> movies) {}ActorFilms actorFilms = chatClient.prompt() .user("Generate the filmography for a random actor." ) .call() .entity(ActorFilms.class); List<ActorFilms> multipleActors = chatClient.prompt() .user("Generate filmography for Tom Hanks and Bill Murray." ) .call() .entity(new ParameterizedTypeReference <List<ActorFilms>>() {}); Flux<String> streamResponse = chatClient.prompt() .user("Tell me a story" ) .stream() .content(); Flux<ChatResponse> streamWithMetadata = chatClient.prompt() .user("Tell me a story" ) .stream() .chatResponse();
可以给 ChatClient
设置默认参数,比如系统提示词,还可以在对话时动态更改系统提示词的变量,类似模板的概念:
1 2 3 4 5 6 7 8 9 10 11 12 ChatClient chatClient = ChatClient.builder(chatModel) .defaultSystem("You are a friendly chat bot that answers question in the voice of a {voice}" ) .build(); chatClient.prompt() .system(sp -> sp.param("voice" , voice)) .user(message) .call() .content());
此外,还支持指定默认对话选项、默认拦截器、默认函数调用等等,后面会用到。