- 什么是大模型llm(大脑)
大模型是基于海量数据训练的、参数量巨大的深度学习模型,核心能力是理解和生成人类语言,完成推理翻译代码编写等复杂任务。案例-chatgpt,千问,豆包,deepseek。
- 什么是ollama
ollama是一个轻量的大模型本地部署工具,它帮你打包了模型的运行环境,你只需一条命令就能在本地启动大模型,还提供了统一的API接口供app调用。
- 什么是 MCP
mcp是模型上下文协议,是一种标准化的通信协议,用于链接大模型和外部工具(如何数据库\API\硬件设备),让大模型能更安全高效地调用外部资源。MCP是微软阿里等企业联合推动的协议,AgentScope\Langchain等框架都支持MCP协议。
使用场景:比如大模型要查询企业EPR系统的数据,通过MCP协议可以安全地调用ERP的接口,而无需直接暴露数据库权限。
- 什么是RAG
rag是检索增强生成,是一种优化大模型数据输出的技术方案--通过先检索外部知识库的相关信息,再将这些信息作为上下文喂给大模型,让大模型基于检索到的真实数据生成回答。
使用场景:企业私有化文档问答助手(员工手册、产品说明书)、法律条文查询、技术文档检索等。
- 什么是Agent(完整的人)
agent是智能体,它是具备自主决策和执行能力的Ai实体,核心是感知-决策-行动的闭环。它能理解用户需求,规划任务步骤,调用工具(如RAG\API\数据库),完成任务后返回结果,甚至能根据反馈调整策略。Agent是基于大模型构建的,是大模型能力的延伸和落地载体。LangChain4j就是一个Agent开发框架,提供了rag的完整组件;AgentScope-Java则是侧重多Agent协同的框架。
Agent(自主执行实体)
|--依赖:llm大模型(核心大脑,推理决策)
|--依赖RAG(知识增强,解决幻觉/专属知识)
|--依赖MCP(安全调用外部工具,链接外部世界)
|--底层支撑:ollama(大模型本地部署,提供离线服务)
- LangChain4j、SpringAi、AgentScope的区别
维度 AgentScope-Java LangChain4j Spring AI
核心定位 企业级多智能体开发框架 LLM 工作流与工具链组合工具包 Spring 生态 AI 基础设施
设计理念 可控、可靠、可观测的多智能体协同 灵活组合 LLM 能力(工具、记忆、RAG) 约定优于配置,无缝集成 Spring 生态
核心能力 1. 多智能体通信(MsgHub、A2A 协议)2. 生产级运行时(任务中断、人机介入、安全沙箱)3. 结构化任务管理(PlanNotebook)4. 全链路可观测 1. LLM 统一抽象(支持多模型)2. 灵活工具链与链式调用3. 深度 RAG 定制(向量库、检索策略)4. 轻量记忆机制 1. 一键式模型配置(通义、Ollama 等)2. Spring 原生集成(依赖注入、AOP)3. 标准化 API(ChatClient、EmbeddingClient)4. 与 Spring 生态组件联动(Data、Security)
生态依赖 无强依赖,Java 原生,可集成 Spring 无框架依赖,跨 Java 生态适配 强依赖 Spring 生态(Boot/Cloud)
典型场景 多智能体协同系统(如金融风控审核、政务流程协同)、企业级智能助理(带安全审计) 私有化 RAG 知识库、定制化 LLM 工作流(如代码审计、文档分析)、轻量智能问答 Spring 应用快速 AI 化(如电商智能推荐、客服机器人)、微服务 AI 增强
选型速记:多智能体,强管控->AgentScope-Java; 深度定制,做RAG->LangChain4j;
Spring技术栈,快速集成AI->SpringAI
- 什么是向量数据库
专门存储管理和检索向量数据的一种数据库。向量是将文本图片音频等非结构化数据使用Embedding嵌入模型转换成的一组数字数组([0.12,0.34,...])这个数组能代表原始数据的语义特征。向量数据库解决了非结构化数据的语义检索问题,这是RAG的核心依赖,没有向量数据库,RAG就无法高效的从海量文档中找到和用户问题语义相关的内容。
(大白话:向量数据库存的是语义的数字指纹,查询时是模糊匹配--比如查『苹果手机』,它能找到iphone15/苹果最新机型 这些语义相似的内容,因为他们的数字指纹很接近。)
向量数据库的向量匹配算法有:余弦相似度和欧氏距离
余弦相似度-衡量2个向量的方向相似性,不受向量长度影响,是文本Embedding匹配的首选算法;
欧氏距离-衡量2个向量的空间距离,向量越近越相似,适合图像视频等稠密数据的匹配。
向量数据库相关产品:Chroma \ Milvus
- 什么是embedding (向量嵌入技术)
一种将非结构化数据(文本图片音频等)转换成低维稠密向量的技术,生成的向量不是随机的数字,而是能精准表达原始数据的语义特征、相似性、上下文关系的数字指纹。
关键特点---语义越相似,向量越接近。如苹果手机和iphone的向量距离很近,而苹果手机和香蕉的向量距离很远。
embedding与向量数据库的关系---RAG的核心流程分2步:
入库时:用Embedding把非结构化文档转换成向量,存入向量数据库
查询时:用同一个Embedding把用户问题转换为向量,去向量数据库中检索最相似的向量,从而找到语义相关的文档片段。
embedding的典型应用场景有
RAG中的文本向量转换
推荐系统(根据用户兴趣向量推荐商品)
语义搜索(搜索引擎的相关推荐)
异常检测(通过向量距离判断是否为异常数据)
- 什么是HuggingFace (抱抱脸)
HuggingFace (抱抱脸)全球最大的开源AI模型社区和工具平台,核心提供2大能力-模型仓库和开发工具库;模型仓库:汇聚了开发者上传的几百万个预训练大模型
开发工具库:Transformers和DataSets简化大模型的加载训练推理流程
大白话-相当于AI领域的GitHub和Maven仓库
- 什么是onnx,它与Pytorch/TensorFlow有什么区别
onnx是一种开源的跨框架的神经网络模型格式标准,它解决了AI模型训练和部署框架不兼容的问题。
大白话-训练模型的框架有很多Pytorch\TensorFlow\Keras等,不同框架输出的模型格式不一样,pyTorch模型格式是.pth,TensorFlow模型格式是.pb; 而ONNX相当于AI模型的PDF格式,可以把各种训练模型框架输出的文件格式统一为.onnx文件格式,然后在任何支持ONNX的部署平台(如ONNX Runtime \TensorRT )上运行,无需重新训练。
Ollama能快速部署本地大模型,一个原因就是它内部对很多开源模型做了ONNX格式转换和优化。
onnx与Pytorch/TensorFlow有什么区别
技术 核心定位 核心作用 应用阶段
Pytorch/TensorFlow 训练框架 提供模型设计、训练、微调的完整工具链,支持复杂的神经网络架构创新 模型研发阶段(实验室)
ONNX 模型格式标准 + 部署优化工具链 定义跨框架的模型格式,实现模型在不同框架间的转换;通过 ONNX Runtime 优化推理性能 模型部署阶段(生产环境)
- 什么是FuncationCall,它与MCP是什么关系
FuncationCall函数调用,是指大模型调用外部函数工具的能力。FunctionCall相当于给大模型装上手脚,让它能调用预先定义好的外部函数,获取函数返回的结果后,再结合结果生成最终回答。
MCP是大模型外部工具之间的标准化通信协议,定义了大模型调用外部工具时的统一格式、权限控制、参数校验、错误处理等规范。MCP解决了FuncationCall的格式碎片化问题,MCP是对FunctionCall的高级封装。
(以前没有MCP时,不同大模型的FuncationCall格式不统一(如openAI和Langchain的FunctionCall的json格式就不同),开发者需要为每个工具编写不同的适配代码,而有了MCP后,无论是ChatGpt还是本地的DeepSeek,无论是API函数、还是数据库,都可以按照MCP的格式通信,实现一次开发,到处调用。)
- SpringAi框架中的@mcpTool是什么
@McpTool注解是SpringAi对Mcp协议的Java封装,解决了『大模型与外部工具交互碎片化』的问题;开发者用java方法+注解定义工具,框架自动生成MCP标准的json Schema,大模型可以按统一协议发现并调用。
核心注解及作用
注解 作用
@McpTool 标记java方法为mcp工具,自动生成json schema ;可指定工具名、描述、权限提示等信息
@McpToolParam 标注方法参数,声明描述、是否必填等,用于生成参数校验规则
@McpSampling/ @McpLogging 客户端注解,用于采样、日志等响应处理
示例代码1-编写tool
java
import org.springframework.ai.mcp.annotation.McpLogging;
import org.springframework.ai.mcp.annotation.McpSampling;
import org.springframework.ai.mcp.annotation.McpTool;
import org.springframework.ai.mcp.annotation.McpToolParam;
import org.springframework.stereotype.Component;
@Component
public class UserTools {
// ========== 工具 1: 查询用户信息(精准参数 + 脱敏日志) ==========
/**
* 根据用户ID查询用户信息
* @param userId 用户ID(必须参数)
* @return 用户信息JSON
*/
@McpTool(
name = "getUserById",
description = "根据用户ID查询用户详细信息,适用于需要用户数据的场景"
)
@McpSampling(
temperature = 0.1, // 低温度,确保大模型生成的userId参数精准
maxTokens = 512 // 小令牌数,减少无用输出
)
@McpLogging(
enabled = true,
level = "INFO",
logRequest = false, // 不记录请求参数(userId可能敏感)
logResponse = false, // 不记录响应内容(用户信息敏感)
logMetadata = true // 仅记录工具调用状态(成功/失败、耗时)
)
public String getUserById(
@McpToolParam(
name = "userId",
description = "用户的唯一标识,必须是数字",
required = true
) String userId
) {
// 模拟数据库查询
return String.format("{\"userId\":\"%s\",\"name\":\"张三\",\"age\":25,\"email\":\"zhangsan@example.com\"}", userId);
}
// ========== 工具 2: 生成用户报告(灵活生成 + 详细日志) ==========
/**
* 根据用户信息生成简短报告
* @param userInfo 用户信息JSON(必须参数)
* @return 用户报告
*/
@McpTool(
name = "generateReport",
description = "根据用户信息生成简洁的个人报告,适用于总结用户情况"
)
@McpSampling(
temperature = 0.8, // 高温度,鼓励灵活的报告生成
maxTokens = 1024 // 大令牌数,支持更详细的报告
)
@McpLogging(
enabled = true,
level = "DEBUG",
logRequestDetails = true, // 记录完整请求参数(用户信息用于调试)
logResponseDetails = true, // 记录完整响应(报告内容用于验证)
logMetadata = true
)
public String generateReport(
@McpToolParam(
name = "userInfo",
description = "用户信息的JSON字符串,包含userId、name、age、email",
required = true
) String userInfo
) {
// 模拟生成报告
return "用户报告:\n" + userInfo + "\n该用户为系统普通用户,信息完整。";
}
}
示例代码2-配置springAi需要的自动配置
yaml
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
model: deepseek-coder:6.7b
# 全局默认配置(会被注解覆盖)
temperature: 0.7
max-tokens: 1024
# 启用 MCP 工具调用
mcp:
tool:
enabled: true
示例代码3-编写Agent服务-构建提示,引导大模型调用工具
java
import org.springframework.ai.chat.ChatClient;
import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class AgentService {
private final ChatClient chatClient;
public AgentService(ChatClient chatClient) {
this.chatClient = chatClient;
}
public String runAgent(String userQuery) {
// 构建提示,引导大模型调用工具
PromptTemplate promptTemplate = new PromptTemplate(
"请根据用户需求调用合适的工具:{userQuery}\n" +
"如果需要查询用户信息,调用 getUserById 工具;如果需要生成报告,调用 generateReport 工具。"
);
Prompt prompt = promptTemplate.create(Map.of("userQuery", userQuery));
ChatResponse response = chatClient.call(prompt);
return response.getResult().getOutput().getContent();
}
}
示例代码4-编写控制器(测试web接口)
java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AgentController {
private final AgentService agentService;
public AgentController(AgentService agentService) {
this.agentService = agentService;
}
@GetMapping("/agent")
public String agent(@RequestParam String query) {
return agentService.runAgent(query);
}
}
效果验证测试
测试getUserById工具
bash
curl "http://localhost:8080/agent?query=查询用户ID为1001的信息"
测试 generateReport工具
bash
curl "http://localhost:8080/agent?query=根据用户信息{\"userId\":\"1001\",\"name\":\"张三\"}生成报告"