Spring AI与DeepSeek实战:打造企业级知识库+系统API调用
目录
Spring AI与DeepSeek实战:打造企业级知识库
一、概述
二、RAG数据库选择
三、向量模型
四、核心代码
4.1. 构建向量数据
4.2. 创建ChatClient
4.3. 搜索接口
4.4. 测试接口
4.4.1. 搜索新能源
4.4.21. 搜索收入
五、总结
六、完整代码
Spring AI与DeepSeek实战:系统API调用
一、概述
二、函数调用原理
2.1. 工具元数据注入
2.2. 模型决策响应
2.3. 服务端路由执行
2.4. 执行结果标准化
2.5. 上下文增强推理
2.6. 终端响应生成
三、核心代码
3.1. 定义工具
3.2. 创建对话接口
3.3. 测试
四、总结
五、完整代码
Spring AI与DeepSeek实战:打造企业级知识库

一、概述
企业应用集成大语言模型(LLM)落地的两大痛点:
- 知识局限性:LLM依赖静态训练数据,无法覆盖实时更新或垂直领域的知识;
- 幻觉:当LLM遇到训练数据外的提问时,可能生成看似合理但错误的内容。
用最低的成本解决以上问题,需要使用 RAG 技术,它是一种结合信息检索技术与 LLM 的框架,通过从外部 知识库 动态检索相关上下文信息,并将其作为 Prompt 融入生成过程,从而提升模型回答的准确性;
本文将以AI智能搜索为场景,基于 Spring AI 与 RAG 技术结合,通过构建实时知识库增强大语言模型能力,实现企业级智能搜索场景与个性化推荐,攻克 LLM 知识滞后与生成幻觉两大核心痛点。
二、RAG数据库选择
构建知识库的数据库一般有以下有两种选择:
| 维度 | 向量数据库 | 知识图谱 |
|---|---|---|
| 数据结构 | 非结构化数据(文本/图像向量) | 结构化关系网络(实体-关系-实体) |
| 查询类型 | 语义相似度检索 | 多跳关系推理 |
| 典型场景 | 文档模糊匹配、图像检索 | 供应链追溯、金融风控 |
| 性能指标 | QPS>5000 | 复杂查询响应时间>2s |
| 开发成本 | 低(API即用) | 高(需构建本体模型) |
搜索推荐场景更适合选择 向量数据库
三、向量模型
向量模型是实现 RAG 的核心组件之一,用于将非结构化数据(如文本、图像、音频)转换为 高维向量(Embedding)的机器学习模型。这些向量能够捕捉数据的语义或结构信息,使计算机能通过数学运算处理复杂关系。
向量数据库是专门存储、索引和检索高维向量的数据库系统

spring-ai-alibaba-starter 默认的向量模型为 text-embedding-v1
可以通过 spring.ai.dashscope.embedding.options.model 进行修改。
四、核心代码
4.1. 构建向量数据
创建 resources/rag/data-resources.txt 文件,内容如下:
1. {"type":"api","name":"测试api服务01","topic":"综合政务","industry":"采矿业","remark":"获取采矿明细的API服务"}
2. {"type":"api","name":"新能源车类型","topic":"能源","industry":"制造业","remark":"获取新能源车类型的服务"}
3. {"type":"api","name":"罚款报告","topic":"交通","industry":"制造业","remark":"获取罚款报告的接口"}
4. {"type":"api","name":"光伏发电","topic":"能源","industry":"电力、热力、燃气及水生产和供应业","remark":"获取光伏发电的年度报告"}
5. {"type":"api","name":"收益明细2025","topic":"综合政务","industry":"信息传输、软件和信息技术服务业","remark":"2025年的收益明细信息表"}
创建向量数据库的 Bean
@Bean
public VectorStore vectorStore(EmbeddingModel embeddingModel, @Value("classpath:rag/data-resources.txt") Resource docs) {VectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build();vectorStore.write(new TokenTextSplitter().transform(new TextReader(docs).read()));return vectorStore;
}
SimpleVectorStore是Spring AI提供的一个基于内存的向量数据库;- 使用
TokenTextSplitter来切分文档。
4.2. 创建ChatClient
private final ChatClient chatClient;public RagController(ChatClient.Builder builder, VectorStore vectorStore) {String sysPrompt = """您是一个数据产品的智能搜索引擎,负责根据用户输入的内容进行精准匹配、模糊匹配和近义词匹配,以搜索相关的数据记录。您只能搜索指定的内容,不能回复其他内容或添加解释。您可以通过[search_content]标识符来表示需要搜索的具体内容。要求您返回匹配内容的完整记录,以JSON数组格式呈现。如果搜索不到内容,请返回[no_data]。""";this.chatClient = builder.defaultSystem(sysPrompt).defaultAdvisors(new QuestionAnswerAdvisor(vectorStore, new SearchRequest())).defaultOptions(DashScopeChatOptions.builder().withModel("deepseek-r1").build()).build();
}
- 通过系统
Prompt来指定智能体的能力; - 通过
QuestionAnswerAdvisor绑定向量数据库。
4.3. 搜索接口
@GetMapping(value = "/search")
public List<SearchVo> search(@RequestParam String search, HttpServletResponse response) {response.setCharacterEncoding("UTF-8");PromptTemplate promptTemplate = new PromptTemplate("[search_content]: {search}");Prompt prompt = promptTemplate.create(Map.of("search", search));return chatClient.prompt(prompt).call().entity(new ParameterizedTypeReference<List<SearchVo>>() {});
}
这里通过 entity 方法来实现搜索结果以结构化的方式返回。
4.4. 测试接口
4.4.1. 搜索新能源

除了模糊匹配了新能源车之外,还匹配了和新能源相关的光伏数据。
4.4.21. 搜索收入

匹配同义词的收益数据。
五、总结
本文以智能搜索引擎场景,通过 RAG 技术,实现了全文搜索、模糊搜索、同义词推荐等功能,并以结构化的方式返回搜索结果。需要注意的是,在企业应用中,要把 SimpleVectorStore 改为成熟的第三方向量数据库,例如 milvus、elasticsearch、redis 等。
六、完整代码
- Gitee地址:
https://gitee.com/zlt2000/zlt-spring-ai-app
- Github地址:
https://github.com/zlt2000/zlt-spring-ai-app
Spring AI与DeepSeek实战:系统API调用

一、概述
在 AI 应用开发中,工具调用 Tool Calling 是增强大模型能力的核心技术。通过让模型与外部 API 或工具交互,可实现 实时信息检索(如天气查询、新闻获取)、系统操作(如创建任务、发送邮件)等功能。
Spring AI 作为企业级 AI 开发框架,在 1.0.0.M6 版本中进行了重要升级:废弃 Function Calling 引入 Tool Calling 以更贴合行业术语;本文结合 Spring AI 与大模型,演示如何通过 Tool Calling 实现系统 API 调用,同时处理多轮对话中的会话记忆。
二、函数调用原理
大模型仅负责 决定是否调用工具 和 提供参数,实际执行逻辑由客户端(Spring 应用)实现,确保工具调用的可控性与安全性。

2.1. 工具元数据注入
在发起Chat Request时,将工具描述(name/description)、参数结构(input schema)等元数据封装至请求体,建立大模型的工具调用能力基线。
2.2. 模型决策响应
大模型根据上下文推理生成工具调用指令(tool_calls字段),返回包含选定工具名称及结构化参数的中间响应。
2.3. 服务端路由执行
Spring AI模块解析工具调用指令,通过服务发现机制定位目标工具实例,注入参数并触发同步/异步执行。
2.4. 执行结果标准化
工具返回原始执行结果后,系统进行数据类型校验、异常捕获和JSON序列化处理,生成模型可解析的标准化数据结构。
2.5. 上下文增强推理
将标准化结果作为新增上下文(tool_outputs)回传大模型,触发基于增强上下文的二次推理流程。
2.6. 终端响应生成
模型综合初始请求与工具执行结果,生成最终自然语言响应,完成工具增强的对话闭环。
三、核心代码
3.1. 定义工具
创建类 TestTools 并用 @Tool 注解定义 tool 的描述
public static class TestTools {@Tool(description = "获取今天日期")String getCurrentDateTime() {System.out.println("======getCurrentDateTime");return LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));}@Tool(description = "获取当前温度")String getCurrentTemperature(MyToolReques toolReques) {System.out.println("======getCurrentTemperature: " + toolReques.localName + "__" + toolReques.date);return toolReques.date + toolReques.localName + "温度为20摄氏度";}public record MyToolReques(String localName, String date) {}
}
这里定义了两个方法,并通过注解的 description 参数告诉大模型方法的用途。
record 类型是 Java17 的新特性,可用于替代传统的 POJO 类。
3.2. 创建对话接口
private ChatMemory chatMemory = new InMemoryChatMemory();
private MessageChatMemoryAdvisor messageChatMemoryAdvisor = new MessageChatMemoryAdvisor(chatMemory);@GetMapping(value = "/chat")
public String chat(@RequestParam String input, String sessionId, HttpServletResponse response) {response.setCharacterEncoding("UTF-8");return chatClient.prompt().user(input).tools(new TestTools()).advisors(messageChatMemoryAdvisor).advisors(spec -> spec.param(MessageChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, sessionId)).call().content();
}
- tools 给大模型注册可以调用的方法。
- MessageChatMemoryAdvisor 实现聊天记忆,
InMemoryChatMemory为SpringAI自带的实现(基于内存)。 - 可以使用 CHAT_MEMORY_CONVERSATION_ID_KEY 参数指定对话ID,不同的会话ID用于隔离记忆。
3.3. 测试

通过后台打印信息可以看到大模型会自动识别,先调用 getCurrentDate 方法获取今天日期,再调用 getCurrentTemperature 方法获取天气。
======getCurrentDate
======getCurrentTemperature: 广州__2025年04月13日
加一个聊天框,测试多轮对话效果:

第二次会话直接输入 广州 大模型就知道我要问什么了,说明聊天记忆功能已生效。
四、总结
本文以问天气为场景,通过 Tool Calling 实现系统 API 调用,同时实现多轮对话中的会话记忆。需要注意的是 InMemoryChatMemory 只能作为测试使用,在企业应用中需要使用其他实现方式,把聊天记录存储在 Redis 或者 数据库中,并且需要考虑消息的保存时间、容量、如何清除等问题。
五、完整代码
- Gitee地址:
https://gitee.com/zlt2000/zlt-spring-ai-app
- Github地址:
https://github.com/zlt2000/zlt-spring-ai-app
