一 Java AI:
通常指的是使用Java编程语言进行人工智能(AI)开发。Java作为一种成熟且广泛使用的编程语言,具有许多特性使其适合AI开发,比如面向对象编程、丰富的库和框架支持、跨平台能力以及良好的性能和安全性。
- 机器学习:Java有多个库和框架支持机器学习,比如:Weka,Deeplearning4J,MOA
- 自然语言处理(NLP):Java可以用于开发NLP应用,比如文本分析、语言翻译等。常用的库包括:Stanford NLP,Apache OpenNLP
- 专家系统和知识表示:Java可以用于开发基于规则的系统和知识表示应用。
- 机器人和自动化:Java在机器人控制和自动化领域也有应用,适合开发智能机器人系统。
- 数据处理和分析:Java的强大数据处理能力使其适合处理和分析大规模数据,这是AI应用的重要组成部分。
针对 Java 的 开发框架:
- Spring AI(原生)
- LangChain4J
- Spring AI Alibaba
总结对比表
框架 | 核心优势 | 主要劣势 | 适用场景 |
---|---|---|---|
Spring AI | 多模型支持、企业级生态、模块化扩展 | 配置复杂、国内适配弱 | 国际化企业级应用 |
LangChain4J | 轻量灵活、声明式开发、社区活跃 | 功能覆盖有限、依赖第三方扩展 | 快速集成 AI 的中小型项目 |
Spring AI Alibaba | 本土化适配、阿里生态整合、简化开发 | 模型多样性不足、依赖阿里云服务 | 国内企业及阿里云生态项目 |
二 LangChain4J 简介
是一个专为Java开发者设计的开源库,旨在简化将大型语言模型(LLM)集成到Java应用程序中的过程
- 统一API:LangChain4j提供了一个标准化的API,使得开发者可以方便地接入15+个主流的LLM提供商(如OpenAI、Google 、阿里、 智谱)和15+个向量嵌入存储(Qdrant、Pinecone、Milvus)。这意味着开发者无需学习每个API的细节,可以轻松切换不同的模型和存储,而无需重写代码。
- 综合工具箱:该框架包含多种工具,从低级的提示模板、聊天记忆管理到高级模式(如AI服务和RAG)。这些工具帮助开发者构建从聊天机器人到完整的数据检索管道等多种应用。
- 多模态支持:LangChain4j支持文本和图像作为输入,能够处理更复杂的应用场景。
三 Spring 接入开发
1 Maven 配置,最新版,参见 maven 仓库:
Maven 引入
xml
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
</dependency>
<!-- 加载bom 后,所有langchain4j引用不需要加版本号 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-bom</artifactId>
<version>0.36.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2 支持 properties 和 yml 配置方式
大模型配置链接
yaml
langchain4j:
open-ai:
chat-model:
api-key: demo
model-name:
base-url:
3 模型使用
模型使用
kotlin
package com.test
import dev.langchain4j.model.chat.ChatLanguageModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootTestclass SimplechatApplicationTest {
@Autowired
private ChatLanguageModel chatLanguageModel;
@Test
public void testChat(){
String generate = chatLanguageModel.generate("你好");
System.out.println(generate);
}
}
四 AI Agent (LangChain4J)
AI Agent(人工智能代理或智能体)是一种能够自主感知环境、分析信息、做出决策并执行行动 的智能实体,通常基于人工智能技术实现。它的核心目标是通过与环境交互,完成特定任务或优化目标,具备一定程度的自主性和适应性。
它是一个高层级概念,它以大模型为核心,集成记忆和工具等为一体,构造了它的决策能力(来源于接入大模型)、执行能力(基于已被定义的接口、方法等业务代码)、记忆能力(基于内存、外部数据源等,来构建上下文环境),因此被称为智能体
1 核心功能 vs. 扩展功能
核心功能 | 扩展功能(依赖核心功能) |
---|---|
环境感知与数据输入 | 情感识别(如分析用户语气) |
目标驱动的决策 | 创造性生成(如AI绘画、写诗) |
动作执行 | 多模态交互(语音+手势+屏幕反馈) |
2 LangChian4J 中的 AI Agent 的实现
AI Agent 的 Tools(工具) 、Memory(记忆) 和 RAG(检索增强生成) 是其实现智能行为的关键模块,
模块 | 核心能力 | 局限性 | 互补性 |
---|---|---|---|
Tools | 执行具体操作(如计算、控制设备) | 依赖预设接口,缺乏灵活性 | 通过 RAG 动态选择工具,通过记忆优化调用策略 |
Memory | 长期上下文管理与个性化 | 存储容量有限,知识可能过时 | RAG 补充实时知识,工具更新记忆内容 |
RAG | 动态知识检索与整合 | 检索延迟,依赖外部数据质量 | 记忆缓存高频结果,工具提供实时数据源 |
1) Tools:
(1)功能概述
Tools 允许 AI Agent 调用外部工具(如 API、数据库、本地代码)以扩展功能,解决大模型无法直接操作现实世界的问题。支持 底层 APi 使用和高级 API 注册
(2)LangChain4j 实现
- 核心接口 :
Tool
接口定义工具的执行逻辑。 - 工具注册 :通过
ToolExecutor
注册和管理工具。 - 动态调用:Agent 根据用户请求自动选择并调用工具。
(3)示例
LangChain4J 中的 Tools 简单应用
// 定义一个简单的计算工具``public class CalculatorTool ``implements Tool {``@Override``public String name() {``return "calculator"``;``}``@Override``public String description() {``return "执行数学计算(如:计算 2 + 3)"``;``}``@Override``public Object execute(Map<String, Object> inputs) {``double a = Double.parseDouble(inputs.get(``"a"``).toString());``double b = Double.parseDouble(inputs.get(``"b"``).toString());``return a + b;``}``}``// 注册工具并调用``ToolExecutor executor = ``new DefaultToolExecutor();``executor.registerTool(``new CalculatorTool());``// Agent调用工具``Map<String, Object> inputs = ``new HashMap<>();``inputs.put(``"a"``, ``5``);``inputs.put(``"b"``, ``3``);``Object result = executor.execute(``"calculator"``, inputs);``System.out.println(``"计算结果: " + result); ``// 输出 8.0 |
---|
2) Memory
(1)功能概述
Memory 管理 Agent 的短期对话上下文和长期记忆,支持个性化交互和任务连续性。
(2)LangChain4j 实现
- 短期记忆 :使用
ConversationBuffer
存储当前会话的上下文。 - 长期记忆 :通过
VectorStore
(如 Elasticsearch)持久化关键信息。 - 记忆检索:基于向量相似度或关键字匹配查找历史记录。
(3)示例
LangChain4J 中 Memory 的简单应用
// 初始化对话缓冲区(短期记忆)``ConversationBuffer buffer = ``new ConversationBuffer();``buffer.addUserMessage(``"我喜欢科幻电影"``);``buffer.addAiMessage(``"好的,已记录您的偏好。"``);``// 获取当前对话上下文``String context = buffer.getContextAsText();``// 长期记忆存储(使用 Elasticsearch)``EmbeddingStore<TextSegment> embeddingStore = ``new ElasticsearchEmbeddingStore(``"localhost"``, ``9200``);``EmbeddingModel embeddingModel = ``new OpenAIEmbeddingModel(``"sk-xxx"``);``Retriever<TextSegment> retriever = EmbeddingStoreRetriever.from(embeddingStore, embeddingModel);``// 存储用户偏好``String userPreference = ``"用户偏好:科幻电影"``;``embeddingStore.add(embeddingModel.embed(userPreference).get(), TextSegment.from(userPreference));``// 检索相关记忆``Query query = Query.from(``"推荐一部电影"``);``List<TextSegment> relevantMemories = retriever.retrieve(query); |
---|
3) RAG
(1)功能概述
RAG 结合外部知识库检索和生成模型,提升回答的准确性和时效性,避免大模型的"幻觉"问题。
(2)LangChain4j 实现
- 知识库构建 :使用
DocumentLoader
加载 PDF、HTML 等文档。 - 向量检索 :通过
EmbeddingModel
将文本向量化,存入VectorStore
。 - 增强生成:检索结果作为上下文输入 LLM 生成最终回答。
(3)示例
LangChain4J 中 RAG 的简单应用
// 加载文档(如 PDF)``DocumentLoader loader = ``new PdfDocumentLoader(``"path/to/file.pdf"``);``List<Document> documents = loader.load();``// 切分文档为片段``DocumentSplitter splitter = ``new TokenDocumentSplitter(``500``);``List<TextSegment> segments = splitter.split(documents);``// 向量化并存储``EmbeddingModel embeddingModel = ``new OpenAIEmbeddingModel(``"sk-xxx"``);``EmbeddingStore<TextSegment> embeddingStore = ``new InMemoryEmbeddingStore<>();``for (TextSegment segment : segments) {``Embedding embedding = embeddingModel.embed(segment.text()).get();``embeddingStore.add(embedding, segment);``}``// 构建 RAG 链``Retriever<TextSegment> retriever = EmbeddingStoreRetriever.from(embeddingStore, embeddingModel);``ChatLanguageModel model = OpenAiChatModel.builder().apiKey(``"sk-xxx"``).build();``UserMessage userMessage = UserMessage.from(``"什么是量子计算?"``);``List<TextSegment> relevantDocs = retriever.retrieve(userMessage);``String answer = model.generate(``"基于以下上下文回答:\n" +``relevantDocs.stream().map(TextSegment::text).collect(Collectors.joining(``"\n"``)) +``"\n问题:" + userMessage.text()``).content();``System.out.println(answer); |
---|
4) LangChain4J 实现 AI Agent
// 1. 工具调用:查询 PubMed``Tool pubmedTool = ``new PubMedAPITool();``List<Document> papers = pubmedTool.execute(``"treatment"``);``// 2. 记忆管理:存储患者病史``ConversationBuffer buffer = ``new ConversationBuffer();``buffer.addUserMessage(``"患者有糖尿病史"``);``// 3. RAG 增强生成``String question = ``"建议xxx 合并糖尿病患者的治疗方案"``;``List<TextSegment> relevantInfo = retriever.retrieve(question);``String context = buffer.getContextAsText() + ``"\n" + relevantInfo;``String advice = model.generate(context + ``"\n问题:" + question).content(); |
---|
RAG 流程
- 户发起提示词 prompt 提问;
- 根据 chatMemoryId 查询历史回话,并返回;
- 通过提示词模板将 prompt 和 history messages 组合成一个提示词发送给大模型;
- 大模型根据提示词进行回答,将 prompt + AiMessages 同时放入到 ChatMemory 中;
- 最后将大模型生成的结果返回给用户
向量Embedding
相当于数据的坐标,向量分数越高,代表坐标位置越接近,匹配的数据越相似
向量数据库EmbeddingStore:支持20多种实现,包括内存、redis、mongo、es等
-
Document(文档)这个文档是我们要处理的原始文本数据
-
Text Splitter(文本分割器)文本分割器将文档分割成多个段落或部分,这些部分被称为"Segments"(段落)。
-
Segments(段落):分割后的文本部分被送入嵌入模型进行处理。
-
Embedding Model(嵌入模型):嵌入模型将每个段落转换为嵌入向量(Embeddings)。嵌入模型的作用是将文本数据转换为数值形式,以便进行进一步的处理和分析。
-
Embeddings(嵌入向量):生成的嵌入向量被送入嵌入存储。
-
Embedding Store(嵌入存储)嵌入存储用于保存生成的嵌入向量。这个存储可以是一个数据库或其他形式的存储系统,用于后续的查询和检索操作。
五 Java AI 扩展
1 MCP 协议
MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 推出的一种开放协议,旨在标准化大型语言模型(LLM)与外部系统的交互方式。Tools(工具) 是 MCP 协议的核心能力之一,允许 LLM 动态调用外部功能(如 API、数据库、本地服务等),从而扩展模型的实际操作能力。以下从功能定义、技术实现、应用场景及生态影响四方面深入解析 MCP 中的 Tools 模块。
核心作用
- 动态扩展 LLM 能力:通过 Tools,LLM 可调用外部工具执行具体操作(如代码提交、数据查询、文件读写等),突破模型固有功能的限制。
- 标准化接口:MCP 定义了统一的工具调用规范,避免不同服务间的定制开发问题。例如,GitHub 操作、Slack 消息发送等均通过同一协议实现。
- 权限与安全控制:Tools 的调用由 MCP Server 管理,敏感信息(如 API 密钥)无需暴露给 LLM 提供商,确保数据安全性。
技术优势
- 去中心化能力扩展:任何开发者均可创建 Tools 并发布到 MCP 生态(如开源社区或商业市场),形成类似"AI 应用商店"的模式。
- 降低开发成本:标准化协议减少重复代码,例如传统 N 个模型对接 M 个数据源的复杂度从 N×M 降至 N+M7。
- 动态适应需求:Tools 可动态加载,无需重新训练模型即可支持新功能
2 LangGraph
LangGraph 是 LangChain 生态系统 中的开源框架,专为构建基于大语言模型(LLM)的 有状态、多代理应用程序 设计。其核心思想是通过 图结构(Graph) 和 状态机(State Machine) 管理复杂的工作流程,支持循环、条件分支、持久化状态和人工干预等高级功能。
1)核心设计理念
(1)图结构与状态管理
- 节点(Node):代表执行步骤(如调用 LLM、工具函数),处理输入状态并返回更新后的状态。
- 边(Edge):定义节点间的执行顺序,支持普通边(固定路径)和条件边(动态路由)。
- 状态(State):贯穿整个图的动态对象,包含所有运行时信息(如对话历史、中间结果),支持通过 Pydantic 模型或字典定义。
(2)循环与分支支持
- 与传统的 有向无环图(DAG) 不同,LangGraph 允许定义循环结构(如对话多轮迭代),并通过条件边实现动态路径选择(例如根据 LLM 输出决定是否调用工具)。
(3)持久化与断点恢复
- 自动保存图执行状态至内存或数据库(如 Redis、Postgres),支持 暂停/恢复 执行。
- 应用场景:长时间运行的对话、错误回滚、历史状态查询("时间旅行")。
(4)人工干预(Human-in-the-Loop)
- 可在节点执行前后插入断点,允许人工审核或修改状态。例如在客户服务流程中,人工确认敏感操作后再继续执行。
2)核心功能与技术实现
1)动态工作流构建
- 条件边:基于状态动态选择下一节点(如 LLM 决定是否调用工具)6。
- 多代理协作:多个代理共享状态,协同处理复杂任务(如一个代理规划任务,另一个执行工具调用)23。
(2)状态管理机制
- 短期记忆:通过上下文窗口保留当前会话信息。
- 长期记忆:使用向量数据库(如 FAISS)持久化关键数据,支持个性化交互15。
(3)与 LangChain 生态集成 25
- 复用 LangChain 的组件(如工具调用、RAG 管道),并通过 LangSmith 监控性能。
------ 示例:结合 RAG 实现自适应检索,根据反馈循环优化查询结果28。
(4)流式处理与实时反馈
- 支持按节点生成顺序流式输出,提升用户体验(如逐词生成回复)
3)示例
LangGraph demo
from langgraph.graph ``import StateGraph, END``from langchain_openai ``import ChatOpenAI``# 定义状态模型``class ChatState(TypedDict):``messages: ``list``# 初始化图和模型``workflow ``= StateGraph(ChatState)``llm ``= ChatOpenAI()``# 定义节点函数``def process_input(state: ChatState):``return {``"messages"``: [llm.invoke(state[``"messages"``])}``# 添加节点和边``workflow.add_node(``"chatbot"``, process_input)``workflow.add_edge(START, ``"chatbot"``)``workflow.add_edge(``"chatbot"``, END)``app ``= workflow.``compile``()``# 执行对话``app.invoke({``"messages"``: [(``"user"``, ``"你好!"``)]}) |
---|
六 参考文献