增强检索知识库系统Day05

  • 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工具下载

  • 汉化
  • 连接数据库表
  • 创建数据库表结构

    复制代码
        -- 删除旧的表(如果存在)
        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

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

更改下面的代码