1 line
11 KiB
JSON
1 line
11 KiB
JSON
{"repo": "5lulin/rag-knowledge-base", "files": {"rag-knowledge-base/src/main/resources/application.yml": {"0f2ac34fdaf5f5b17561d839598999ad0a043d15": {"t": 1785745254.4931893, "n": 988, "h": "ac419eba3defb22c", "c": "server:\n port: 8081\n\nspring:\n datasource:\n url: jdbc:postgresql://localhost:5432/rag_kb\n username: postgres\n password: postgres\n driver-class-name: org.postgresql.Driver\n\n servlet:\n multipart:\n max-file-size: 50MB\n max-request-size: 100MB\n\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: Asia/Shanghai\n default-property-inclusion: non_null\n\nmybatis-plus:\n mapper-locations: classpath*:/mapper/**/*.xml\n type-aliases-package: com.rag.entity\n configuration:\n map-underscore-to-camel-case: true\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n global-config:\n db-config:\n id-type: auto\n\n# DeepSeek Chat API (仅用于对话生成,Embedding 使用本地 BGE-Small-ZH)\ndeepseek:\n api-key: ${DEEPSEEK_API_KEY}\n base-url: https://api.deepseek.com/v1\n chat-model: deepseek-v4-pro\n\npgvector:\n host: localhost\n port: 5432\n database: rag_kb\n user: postgres\n password: postgres\n\nlogging:\n level:\n com.rag: DEBUG\n dev.langchain4j: DEBUG\n"}, "f90895d8e48615c7093182d03bbad9eaa6075fbb": {"t": 1785749284.1171982, "n": 988, "h": "ac419eba3defb22c", "c": "server:\n port: 8081\n\nspring:\n datasource:\n url: jdbc:postgresql://localhost:5432/rag_kb\n username: postgres\n password: postgres\n driver-class-name: org.postgresql.Driver\n\n servlet:\n multipart:\n max-file-size: 50MB\n max-request-size: 100MB\n\n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n time-zone: Asia/Shanghai\n default-property-inclusion: non_null\n\nmybatis-plus:\n mapper-locations: classpath*:/mapper/**/*.xml\n type-aliases-package: com.rag.entity\n configuration:\n map-underscore-to-camel-case: true\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n global-config:\n db-config:\n id-type: auto\n\n# DeepSeek Chat API (仅用于对话生成,Embedding 使用本地 BGE-Small-ZH)\ndeepseek:\n api-key: ${DEEPSEEK_API_KEY}\n base-url: https://api.deepseek.com/v1\n chat-model: deepseek-v4-pro\n\npgvector:\n host: localhost\n port: 5432\n database: rag_kb\n user: postgres\n password: postgres\n\nlogging:\n level:\n com.rag: DEBUG\n dev.langchain4j: DEBUG\n"}}, "rag-knowledge-base/src/main/java/com/rag/config/LangChain4jConfig.java": {"0f2ac34fdaf5f5b17561d839598999ad0a043d15": {"t": 1785745679.1991816, "n": 3829, "h": "0339164590fcb455", "c": "package com.rag.config;\n\nimport dev.langchain4j.data.segment.TextSegment;\nimport dev.langchain4j.model.chat.ChatLanguageModel;\nimport dev.langchain4j.model.chat.StreamingChatLanguageModel;\nimport dev.langchain4j.model.embedding.EmbeddingModel;\nimport dev.langchain4j.model.embedding.onnx.bgesmallzhq.BgeSmallZhQuantizedEmbeddingModel;\nimport dev.langchain4j.model.openai.OpenAiChatModel;\nimport dev.langchain4j.model.openai.OpenAiStreamingChatModel;\nimport dev.langchain4j.store.embedding.EmbeddingStore;\nimport dev.langchain4j.store.embedding.pgvector.PgVectorEmbeddingStore;\nimport jakarta.annotation.PostConstruct;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.time.Duration;\n\n@Slf4j\n@Configuration\npublic class LangChain4jConfig {\n\n @Value(\"${deepseek.api-key}\")\n private String apiKey;\n\n @Value(\"${deepseek.base-url}\")\n private String baseUrl;\n\n @Value(\"${deepseek.chat-model}\")\n private String chatModelName;\n\n @Value(\"${pgvector.host}\")\n private String pgHost;\n\n @Value(\"${pgvector.port}\")\n private int pgPort;\n\n @Value(\"${pgvector.database}\")\n private String pgDatabase;\n\n @Value(\"${pgvector.user}\")\n private String pgUser;\n\n @Value(\"${pgvector.password}\")\n private String pgPassword;\n\n @PostConstruct\n public void validateApiKey() {\n if (apiKey == null || apiKey.isBlank()) {\n log.error(\"============================================\");\n log.error(\" DeepSeek API Key 未配置!\");\n log.error(\" 请设置环境变量: export DEEPSEEK_API_KEY=sk-xxxx\");\n log.error(\" 或直接修改 application.yml 中的 deepseek.api-key\");\n log.error(\"============================================\");\n } else if (apiKey.length() < 20) {\n log.warn(\"DeepSeek API Key 似乎太短 ({} 字符),可能无效\", apiKey.length());\n } else {\n String masked = apiKey.substring(0, 8) + \"****\" + apiKey.substring(Math.max(8, apiKey.length() - 4));\n log.info(\"DeepSeek API Key loaded: {} ({} chars)\", masked, apiKey.length());\n log.info(\" Chat model: {} @ {}\", chatModelName, baseUrl);\n log.info(\" Embedding model: BGE-Small-ZH (in-process, 512-dim)\");\n }\n }\n\n @Bean\n public EmbeddingModel embeddingModel() {\n return new BgeSmallZhQuantizedEmbeddingModel();\n }\n\n @Bean\n public ChatLanguageModel chatLanguageModel() {\n return OpenAiChatModel.builder()\n .apiKey(apiKey)\n .baseUrl(baseUrl)\n .modelName(chatModelName)\n .temperature(0.7)\n .maxTokens(2048)\n .maxRetries(3)\n .timeout(Duration.ofSeconds(120))\n .logRequests(true)\n .logResponses(true)\n .build();\n }\n\n @Bean\n public StreamingChatLanguageModel streamingChatModel() {\n return OpenAiStreamingChatModel.builder()\n .apiKey(apiKey)\n .baseUrl(baseUrl)\n .modelName(chatModelName)\n .temperature(0.7)\n .maxTokens(2048)\n .timeout(Duration.ofSeconds(120))\n .build();\n }\n\n public EmbeddingStore<TextSegment> createEmbeddingStore(Long kbId) {\n return PgVectorEmbeddingStore.builder()\n .host(pgHost)\n .port(pgPort)\n .database(pgDatabase)\n .user(pgUser)\n .password(pgPassword)\n .table(\"kb_\" + kbId + \"_embeddings\")\n .dimension(512)\n .useIndex(false)\n .createTable(true)\n .dropTableFirst(false)\n .build();\n }\n}\n"}, "f90895d8e48615c7093182d03bbad9eaa6075fbb": {"t": 1785749284.9528244, "n": 3829, "h": "0339164590fcb455", "c": "package com.rag.config;\n\nimport dev.langchain4j.data.segment.TextSegment;\nimport dev.langchain4j.model.chat.ChatLanguageModel;\nimport dev.langchain4j.model.chat.StreamingChatLanguageModel;\nimport dev.langchain4j.model.embedding.EmbeddingModel;\nimport dev.langchain4j.model.embedding.onnx.bgesmallzhq.BgeSmallZhQuantizedEmbeddingModel;\nimport dev.langchain4j.model.openai.OpenAiChatModel;\nimport dev.langchain4j.model.openai.OpenAiStreamingChatModel;\nimport dev.langchain4j.store.embedding.EmbeddingStore;\nimport dev.langchain4j.store.embedding.pgvector.PgVectorEmbeddingStore;\nimport jakarta.annotation.PostConstruct;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.time.Duration;\n\n@Slf4j\n@Configuration\npublic class LangChain4jConfig {\n\n @Value(\"${deepseek.api-key}\")\n private String apiKey;\n\n @Value(\"${deepseek.base-url}\")\n private String baseUrl;\n\n @Value(\"${deepseek.chat-model}\")\n private String chatModelName;\n\n @Value(\"${pgvector.host}\")\n private String pgHost;\n\n @Value(\"${pgvector.port}\")\n private int pgPort;\n\n @Value(\"${pgvector.database}\")\n private String pgDatabase;\n\n @Value(\"${pgvector.user}\")\n private String pgUser;\n\n @Value(\"${pgvector.password}\")\n private String pgPassword;\n\n @PostConstruct\n public void validateApiKey() {\n if (apiKey == null || apiKey.isBlank()) {\n log.error(\"============================================\");\n log.error(\" DeepSeek API Key 未配置!\");\n log.error(\" 请设置环境变量: export DEEPSEEK_API_KEY=sk-xxxx\");\n log.error(\" 或直接修改 application.yml 中的 deepseek.api-key\");\n log.error(\"============================================\");\n } else if (apiKey.length() < 20) {\n log.warn(\"DeepSeek API Key 似乎太短 ({} 字符),可能无效\", apiKey.length());\n } else {\n String masked = apiKey.substring(0, 8) + \"****\" + apiKey.substring(Math.max(8, apiKey.length() - 4));\n log.info(\"DeepSeek API Key loaded: {} ({} chars)\", masked, apiKey.length());\n log.info(\" Chat model: {} @ {}\", chatModelName, baseUrl);\n log.info(\" Embedding model: BGE-Small-ZH (in-process, 512-dim)\");\n }\n }\n\n @Bean\n public EmbeddingModel embeddingModel() {\n return new BgeSmallZhQuantizedEmbeddingModel();\n }\n\n @Bean\n public ChatLanguageModel chatLanguageModel() {\n return OpenAiChatModel.builder()\n .apiKey(apiKey)\n .baseUrl(baseUrl)\n .modelName(chatModelName)\n .temperature(0.7)\n .maxTokens(2048)\n .maxRetries(3)\n .timeout(Duration.ofSeconds(120))\n .logRequests(true)\n .logResponses(true)\n .build();\n }\n\n @Bean\n public StreamingChatLanguageModel streamingChatModel() {\n return OpenAiStreamingChatModel.builder()\n .apiKey(apiKey)\n .baseUrl(baseUrl)\n .modelName(chatModelName)\n .temperature(0.7)\n .maxTokens(2048)\n .timeout(Duration.ofSeconds(120))\n .build();\n }\n\n public EmbeddingStore<TextSegment> createEmbeddingStore(Long kbId) {\n return PgVectorEmbeddingStore.builder()\n .host(pgHost)\n .port(pgPort)\n .database(pgDatabase)\n .user(pgUser)\n .password(pgPassword)\n .table(\"kb_\" + kbId + \"_embeddings\")\n .dimension(512)\n .useIndex(false)\n .createTable(true)\n .dropTableFirst(false)\n .build();\n }\n}\n"}}}} |