-
0.8.1版本聊天接口
OpenAiChatClient openAiChatClient = new OpenAiChatClient(new OpenAiApi(baseUrl, apiKey));
Flux<ChatResponse> stream = openAiChatClient.stream(prompt); -
1.0.0版本聊天窗口
===流式接口===
StreamingChatModel chatModel = new OpenAiChatModel(new OpenAiApi(baseUrl, apiKey));
Flux<ChatResponse> stream = chatModel.stream(prompt);===非流式接口===
ChatModel chatModel = new OpenAiChatModel(new OpenAiApi(baseUrl, apiKey));
ChatResponse chatResponse = chatModel.call(prompt);
配置配置类
-
OllamaConfig,向量维度768
@Configuration
public class OllamaConfig {@Bean("ollamaSimpleVectorStore") public SimpleVectorStore vectorStore(OllamaApi ollamaApi) { OllamaEmbeddingModel embeddingModel=OllamaEmbeddingModel .builder() .ollamaApi(ollamaApi) .defaultOptions(OllamaOptions.builder().model("nomic-embed-text").build()) .build(); return SimpleVectorStore.builder(embeddingModel).build(); } @Bean("ollamaPgVectorStore") public PgVectorStore vectorStore(OllamaApi ollamaApi, JdbcTemplate jdbcTemplate) { OllamaEmbeddingModel embeddingModel=OllamaEmbeddingModel .builder() .ollamaApi(ollamaApi) .defaultOptions(OllamaOptions.builder().model("nomic-embed-text").build()) .build(); return PgVectorStore.builder(jdbcTemplate, embeddingModel) .vectorTableName("vector_store_ollama_deepseek") .build(); }
}
-
OpenAI,向量维度 1536
模型部署-GUP服务器
第一阶段我们将Ollama部署之后又部署DeepSeek,这样的响应速度就比较慢,现在使用GPU的部署方式
使用地点: 京东云控制台



配置大模型,在控制台中执行以下操作
ollama pull nomic-embed-text

安装软件
Pg工具下载
-
通过Docker安装PGAdmin(需要较长的初始化时间)
docker pull dpage/pgadmin4
docker run -p 80:80
-e "PGADMIN_DEFAULT_EMAIL=your_email@example.com"
-e "PGADMIN_DEFAULT_PASSWORD=your_password"
-d dpage/pgadmin4 -
本地安装,下载地址: PostgreSQL: File Browser

- 汉化

- 连接数据库表

-
创建数据库表结构
-- 删除旧的表(如果存在) DROP TABLE IF EXISTS public.vector_store_ollama_deepseek; -- 创建新的表,使用UUID作为主键 CREATE TABLE public.vector_store_ollama_deepseek ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), content TEXT NOT NULL, metadata JSONB, embedding VECTOR(768) ); SELECT * FROM vector_store_ollama_deepseek -- 删除旧的表(如果存在) DROP TABLE IF EXISTS public.vector_store_openai; -- 创建新的表,使用UUID作为主键 CREATE TABLE public.vector_store_openai ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), content TEXT NOT NULL, metadata JSONB, embedding VECTOR(1536) ); SELECT * FROM vector_store_openai
-
查看是否成功
//查询存在的数据库表
SELECT * FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE';//查询存在向量库里面的数据
select * from <改为自己的数据库名称>;


- 测试结果


第12节: MCP前置知识
RAG:静态知识库优化方案
作为静态知识库,RAG 可通过以下方式增强检索生成能力:支持文件上传后自动解析内容、生成标签,并对文件进行分片处理,最终将数据存储到向量库中。当发起提问时,系统能从知识库中提取对应标签文件的相关信息,结合检索结果辅助生成回答,提升响应的准确性与针对性。

MCP:动态知识库与上下文协议
作为动态知识库,MCP 基于上下文协议实现 AI 对代码的直接操作,大幅减少人工干预。其核心机制是让 AI 调用接口自动执行指定命令(例如 Linux 相关指令),实现流程自动化。
- 相关服务参考:
Smithery - Model Context Protocol Registry , MCP servers | Glama


第13节: 上手MCP工作流
-
引入MCP的maven依赖
===MCP服务===
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-client-webflux-spring-boot-starter</artifactId> </dependency>===MCP客户端对接===
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-client-webflux-spring-boot-starter</artifactId> </dependency>
配置自己的MCP服务
spring:
application:
name: server-computer
ai:
mcp:
server:
name: ${spring.application.name}
version: 1.0.0
main:
banner-mode: off
web-application-type: none
logging:
pattern:
console:
file:
name: ${spring.application.name}.log
server:
servlet:
encoding:
charset: UTF-8
force: true
enabled: true
@Slf4j
@SpringBootApplication
public class McpServerComputerApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(McpServerComputerApplication.class, args);
}
@Bean
public ToolCallbackProvider computerTools(ComputerService computerService) {
return MethodToolCallbackProvider.builder().toolObjects(computerService).build();
}
@Override
public void run(String... args) throws Exception {
log.info("mcp server computer success!");
}
}
@Slf4j
@Service
public class ComputerService {
@Tool(description = "获取电脑配置")
public ComputerFunctionResponse queryConfig(ComputerFunctionRequest request) {
log.info("获取电脑配置信息 {}", request.getComputer());
// 获取系统属性
Properties properties = System.getProperties();
// 操作系统名称
String osName = properties.getProperty("os.name");
// 操作系统版本
String osVersion = properties.getProperty("os.version");
// 操作系统架构
String osArch = properties.getProperty("os.arch");
// 用户的账户名称
String userName = properties.getProperty("user.name");
// 用户的主目录
String userHome = properties.getProperty("user.home");
// 用户的当前工作目录
String userDir = properties.getProperty("user.dir");
// Java 运行时环境版本
String javaVersion = properties.getProperty("java.version");
String osInfo = "";
// 根据操作系统执行特定的命令来获取更多信息
if (osName.toLowerCase().contains("win")) {
// Windows特定的代码
osInfo = getWindowsSpecificInfo();
} else if (osName.toLowerCase().contains("mac")) {
// macOS特定的代码
osInfo = getMacSpecificInfo();
} else if (osName.toLowerCase().contains("nix") || osName.toLowerCase().contains("nux")) {
// Linux特定的代码
osInfo = getLinuxSpecificInfo();
}
ComputerFunctionResponse response = new ComputerFunctionResponse();
response.setOsName(osName);
response.setOsVersion(osVersion);
response.setOsArch(osArch);
response.setUserName(userName);
response.setUserHome(userHome);
response.setUserDir(userDir);
response.setJavaVersion(javaVersion);
response.setOsInfo(osInfo);
return response;
}
private String getWindowsSpecificInfo() {
StringBuilder cache = new StringBuilder();
// Windows特定的系统信息获取
try {
Process process = Runtime.getRuntime().exec("systeminfo");
java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
cache.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}
return cache.toString();
}
private static String getMacSpecificInfo() {
StringBuilder cache = new StringBuilder();
// macOS特定的系统信息获取
try {
Process process = Runtime.getRuntime().exec("system_profiler SPHardwareDataType");
java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
cache.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}
return cache.toString();
}
private static String getLinuxSpecificInfo() {
StringBuilder cache = new StringBuilder();
// Linux特定的系统信息获取
try {
Process process = Runtime.getRuntime().exec("lshw -short");
java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
cache.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}
return cache.toString();
}
}
注意,你的服务方法必须配置 @Tool(description = "获取电脑配置")
你有多少个方法,就给方法配置这个注解。这个注解是可以被 Spring AI 识别。
最后执行maven install

{
"mcpServers": {
"filesystem": {
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"@modelcontextprotocol/server-filesystem",
"D:\\XM",
"D:\\XM"
]
},
"mcp-server-computer": {
"command": "java",
"args": [
"-Dspring.ai.mcp.server.stdio=true",
"-jar",
"D:\\XM\\ai-mcp\\server-computer\\target\\server-computer-1.0-SNAPSHOT.jar"
]
}
}
}
第14节: MCP自动发帖
查看csdn发帖的结构



发现apifox里面有些问题,没有加hearder参数
改为apipost,发布成功


自动发帖服务编写
csdn:
api:
categories: Java场景面试宝典
cookie: <自己账号的cookie>
spring:
application:
name: server-csdn
ai:
mcp:
server:
name: ${spring.application.name}
version: 1.0.0
main:
banner-mode: off
# stdio 模式打开,sse 模式,注释掉。
# web-application-type: none
logging:
# stdio 模式打开,sse 模式,注释掉。
# pattern:
# console:
file:
name: data/log/${spring.application.name}.log
server:
port: 8101
servlet:
encoding:
charset: UTF-8
force: true
enabled: true
在打包成java包时候打开下面这一块


配置mcp-server-config-3.json


chat:
options:
model: gpt-4o
embedding-model: text-embedding-ada-002
embedding:
options:
num-batch: 1536

访问阿里云仓库 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

更改下面的代码
