一、为什么 Java 开发者必须拥抱 AI?

2025年,AI 已从"选修课"变为"必修课"。作为一名 Java 开发者,你可能会问:

"AI 不是 Python 的天下吗?Java 能做什么?"

答案是:Java 不仅能用 AI,而且在企业级 AI 应用中具备天然优势。

对比维度 Python Java
模型训练 ⭐⭐⭐⭐⭐ ⭐⭐
企业级集成 ⭐⭐⭐ ⭐⭐⭐⭐⭐
高并发推理服务 ⭐⭐ ⭐⭐⭐⭐⭐
微服务生态 ⭐⭐ ⭐⭐⭐⭐⭐
类型安全 ⭐⭐ ⭐⭐⭐⭐⭐
现有系统改造 ⭐⭐⭐ ⭐⭐⭐⭐⭐

核心结论: Python 负责训练模型 → Java 负责将 AI 能力落地到企业业务中。

市场数据(2025年)

Java AI 相关岗位增长:       +287% (同比)
Spring AI GitHub Star:     18.6k → 45.2k
Java AI 教程搜索量:         增长 520%
企业 Java 系统 AI 化改造率: 63.7%

🔥 划重点: 未来3年,能写 AI 的 Java 开发者薪资溢价将达到 40%~80%


二、2025 Java AI 技术栈全景图

┌────────────────────────────────────────────────────────────┐
│                    应用层 (Application Layer)                │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐  │
│  │ 智能客服  │ │ AI编程助手│ │ 智能搜索  │ │ 文档智能分析   │  │
│  └──────────┘ └──────────┘ └──────────┘ └───────────────┘  │
├────────────────────────────────────────────────────────────┤
│                    框架层 (Framework Layer)                  │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐  │
│  │ Spring AI│ │ LangChain4j│ │  MyBatis  │ │ Apache Camel │  │
│  │  1.0.x   │ │  0.36.x   │ │ AI Plugin │ │   AI Route   │  │
│  └──────────┘ └──────────┘ └──────────┘ └───────────────┘  │
├────────────────────────────────────────────────────────────┤
│                    模型层 (Model Layer)                      │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐  │
│  │ OpenAI   │ │ 通义千问  │ │ 文心一言  │ │  Ollama(Local)│  │
│  │ GPT-4o   │ │ Qwen-Max │ │ ERNIE 4.0│ │  Llama3/Qwen2 │  │
│  └──────────┘ └──────────┘ └──────────┘ └───────────────┘  │
├────────────────────────────────────────────────────────────┤
│                    基础设施层 (Infrastructure)                │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐  │
│  │ Milvus   │ │ Chroma DB│ │  Elastic  │ │    Redis      │  │
│  │ 向量检索  │ │ 向量存储  │ │  Search   │ │  缓存/会话    │  │
│  └──────────┘ └──────────┘ └──────────┘ └───────────────┘  │
└────────────────────────────────────────────────────────────┘

核心框架选择

框架 定位 推荐场景
Spring AI Spring 官方 AI 框架 Spring 项目首选,与 Spring 生态无缝集成
LangChain4j Java 版 LangChain 需要复杂 AI 工作流编排
DJL (Deep Java Library) 深度学习推理引擎 本地模型推理、模型部署
Tribuo 传统机器学习 分类、回归、聚类等经典 ML 任务

三、Spring AI 快速上手(10 分钟跑通第一个 AI 应用)

3.1 环境准备

JDK 17+ | Spring Boot 3.3+ | Maven 3.8+ | IDEA 2024+

3.2 创建项目

<!-- pom.xml 核心依赖 -->
<properties>
    <spring-ai.version>1.0.0-M4</spring-ai.version>
</properties>
​
<dependencies>
    <!-- Spring AI OpenAI Starter -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
    </dependency>
    
    <!-- Spring Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
​
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>${spring-ai.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3.3 配置 API Key

# application.yml
spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}     # 环境变量注入,不要硬编码!
      base-url: https://api.openai.com
      chat:
        options:
          model: gpt-4o-mini
          temperature: 0.7

3.4 第一个 AI 对话接口

package com.example.ai.controller;
​
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.*;
​
@RestController
@RequestMapping("/api/ai")
public class ChatController {
​
    private final ChatClient chatClient;
​
    // 构造器注入(Spring AI 1.0 自动装配)
    public ChatController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }
​
    /**
     * 简单对话接口
     * POST /api/ai/chat
     * Body: { "message": "用Java写一个冒泡排序" }
     */
    @PostMapping("/chat")
    public Map<String, String> chat(@RequestBody ChatRequest request) {
        String response = chatClient.prompt()
                .user(request.getMessage())
                .call()
                .content();
        return Map.of("reply", response);
    }
​
    /**
     * 流式对话(SSE)- 打字机效果
     * POST /api/ai/chat/stream
     */
    @PostMapping(value = "/chat/stream", produces = "text/event-stream")
    public Flux<String> chatStream(@RequestBody ChatRequest request) {
        return chatClient.prompt()
                .user(request.getMessage())
                .stream()
                .content();
    }
​
    record ChatRequest(String message) {}
}

3.5 使用 System Prompt 定制 AI 角色

@RestController
@RequestMapping("/api/ai/assistant")
public class AssistantController {
​
    private final ChatClient codeAssistant;
    private final ChatClient sqlAssistant;
    private final ChatClient docAssistant;
​
    public AssistantController(ChatClient.Builder builder) {
        // 代码助手
        this.codeAssistant = builder
                .defaultSystem("""
                    你是一个资深的Java代码审查专家。
                    请遵循以下规则:
                    1. 检查代码规范、安全漏洞、性能问题
                    2. 使用阿里巴巴Java开发手册标准
                    3. 给出具体的修改建议和示例代码
                    4. 使用Markdown格式回复
                    """)
                .build();
​
        // SQL优化助手
        this.sqlAssistant = builder
                .defaultSystem("""
                    你是一个MySQL性能优化专家。
                    1. 分析SQL语句的执行计划问题
                    2. 给出索引优化建议
                    3. 提供优化后的SQL
                    4. 预估优化效果
                    """)
                .build();
​
        // 文档助手
        this.docAssistant = builder
                .defaultSystem("""
                    你是一个技术文档撰写专家。
                    1. 自动生成接口文档
                    2. 遵循OpenAPI 3.0规范
                    3. 包含请求示例和响应说明
                    """)
                .build();
    }
​
    @PostMapping("/code-review")
    public String reviewCode(@RequestBody String code) {
        return codeAssistant.prompt().user(code).call().content();
    }
​
    @PostMapping("/sql-optimize")
    public String optimizeSQL(@RequestBody String sql) {
        return sqlAssistant.prompt().user(sql).call().content();
    }
​
    @PostMapping("/gen-doc")
    public String generateDoc(@RequestBody String apiCode) {
        return docAssistant.prompt().user(apiCode).call().content();
    }
}

运行结果: 启动项目后访问 http://localhost:8080/api/ai/chat 即可体验 AI 对话,10 分钟跑通!


四、RAG 检索增强生成实战

RAG(Retrieval-Augmented Generation)是 2025 年企业 AI 应用最核心的模式,解决 LLM 的幻觉问题。

4.1 RAG 工作流程

用户提问 → 向量化 → 向量数据库检索 → 召回相关文档
                                            ↓
        最终回答 ← LLM 生成 ← 拼接 Prompt(用户提问 + 召回文档)

4.2 完整实战代码

package com.example.ai.rag;
​
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
​
import java.util.List;
import java.util.stream.Collectors;
​
@Service
public class RAGService {
​
    private final VectorStore vectorStore;
    private final EmbeddingModel embeddingModel;
    private final ChatClient chatClient;
​
    public RAGService(VectorStore vectorStore,
                      EmbeddingModel embeddingModel,
                      ChatClient.Builder chatClientBuilder) {
        this.vectorStore = vectorStore;
        this.embeddingModel = embeddingModel;
        this.chatClient = chatClientBuilder.build();
    }
​
    /**
     * 上传文档到知识库
     * 支持:PDF, Word, TXT, Markdown
     */
    public void uploadDocument(MultipartFile file) {
        // 1. 解析文档内容
        String content = parseDocument(file);
        
        // 2. 文本分割(按段落 + 重叠窗口)
        List<Document> chunks = splitText(content, 500, 50);
        
        // 3. 向量化并存入向量数据库
        vectorStore.add(chunks);
        
        log.info("文档上传成功: {}, 分块数: {}", 
                 file.getOriginalFilename(), chunks.size());
    }
​
    /**
     * RAG 问答:基于知识库的智能问答
     */
    public String askWithContext(String question) {
        // 1. 从向量数据库检索相关文档
        List<Document> relevantDocs = vectorStore.similaritySearch(
                SearchRequest.query(question)
                        .withTopK(5)          // 返回最相似的5个文档块
                        .withSimilarityThreshold(0.7)  // 相似度阈值
        );
​
        if (relevantDocs.isEmpty()) {
            return "抱歉,知识库中没有找到相关信息。";
        }
​
        // 2. 拼接上下文
        String context = relevantDocs.stream()
                .map(Document::getContent)
                .collect(Collectors.joining("\n\n---\n\n"));
​
        // 3. 构建带上下文的 Prompt
        String systemPrompt = """
            你是一个基于知识库的智能问答助手。
            
            规则:
            1. 仅根据提供的知识库内容回答问题
            2. 如果知识库中没有相关信息,请明确告知用户
            3. 引用知识库中的具体段落来支持你的回答
            4. 使用专业、准确的语言
            
            知识库内容:
            %s
            """.formatted(context);
​
        // 4. 调用 LLM 生成回答
        return chatClient.prompt()
                .system(systemPrompt)
                .user(question)
                .call()
                .content();
    }
​
    /**
     * 文本智能分割
     */
    private List<Document> splitText(String content, int chunkSize, int overlap) {
        List<Document> chunks = new ArrayList<>();
        int start = 0;
        
        while (start < content.length()) {
            int end = Math.min(start + chunkSize, content.length());
            
            // 尽量在句号、换行处分割
            if (end < content.length()) {
                int lastBreak = Math.max(
                    content.lastIndexOf('。', end),
                    content.lastIndexOf('\n', end)
                );
                if (lastBreak > start) {
                    end = lastBreak + 1;
                }
            }
            
            chunks.add(new Document(content.substring(start, end)));
            start = end - overlap;  // 重叠窗口
        }
        
        return chunks;
    }
​
    private String parseDocument(MultipartFile file) {
        // 使用 Apache Tika 或 POI 解析各种文档格式
        // 此处省略具体实现...
        return "";
    }
}

4.3 应用场景举例

// 场景1:企业内部制度问答
// Q: "年假怎么算?" → RAG 检索《员工手册》 → AI 精准回答
​
// 场景2:技术文档问答
// Q: "Redis 集群如何扩容?" → RAG 检索运维文档 → AI 给出步骤
​
// 场景3:客服知识库
// Q: "退货流程是什么?" → RAG 检索客服SOP → AI 给出指引

五、Function Calling:让 AI 调用你的业务 API

Function Calling 是 2025 年最🔥的 AI 集成模式,让 LLM 能够自动调用你的 Java 业务接口。

5.1 核心原理

用户说:"帮我查一下北京的天气"
​
LLM 推理 → 需要调用 getWeather(city="北京")
            ↓
Java 执行 getWeather 方法 → 返回 {"temp": 25, "weather": "晴"}
            ↓
LLM 整理回复 → "北京今天晴,气温25°C,适合出行!"

5.2 完整实战代码

package com.example.ai.function;
​
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.model.function.FunctionCallback;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;
​
import java.util.List;
import java.util.Map;
import java.util.function.Function;
​
// ===== 第一步:定义业务函数 =====
@Service
public class OrderQueryService {
​
    /**
     * 根据订单号查询订单状态
     */
    public OrderInfo getOrderStatus(String orderNo) {
        // 实际从数据库查询
        return new OrderInfo(orderNo, "SHIPPED", "顺丰快递", "SF1234567890");
    }
​
    /**
     * 查询用户最近的订单列表
     */
    public List<OrderSummary> getUserOrders(Long userId, Integer limit) {
        // 实际从数据库查询
        return List.of(
            new OrderSummary("ORD20250501001", "已签收", "2025-05-01"),
            new OrderSummary("ORD20250515002", "运输中", "2025-05-15")
        );
    }
​
    record OrderInfo(String orderNo, String status, String carrier, String trackingNo) {}
    record OrderSummary(String orderNo, String status, String createTime) {}
}
​
// ===== 第二步:注册为 FunctionCallback =====
@Configuration
public class FunctionCallbackConfig {
​
    @Bean
    public FunctionCallback orderStatusCallback(OrderQueryService service) {
        return FunctionCallback.builder()
                .function("getOrderStatus", 
                    (Function<Map<String, String>, OrderQueryService.OrderInfo>) 
                    params -> service.getOrderStatus(params.get("orderNo")))
                .description("查询指定订单号的订单状态和物流信息")
                .inputType(Map.class)
                .build();
    }
​
    @Bean
    public FunctionCallback userOrdersCallback(OrderQueryService service) {
        return FunctionCallback.builder()
                .function("getUserOrders",
                    (Function<Map<String, Object>, List<OrderQueryService.OrderSummary>>)
                    params -> service.getUserOrders(
                        ((Number) params.get("userId")).longValue(),
                        ((Number) params.get("limit")).intValue()
                    ))
                .description("查询指定用户的最近订单列表,limit为空时默认10条")
                .inputType(Map.class)
                .build();
    }
}
​
// ===== 第三步:在对话中使用 =====
@RestController
@RequestMapping("/api/ai/order-assistant")
public class OrderAIAssistant {
​
    private final ChatClient chatClient;
    private final List<FunctionCallback> functionCallbacks;
​
    public OrderAIAssistant(ChatClient.Builder builder,
                           List<FunctionCallback> functionCallbacks) {
        this.functionCallbacks = functionCallbacks;
        this.chatClient = builder
                .defaultSystem("""
                    你是一个订单查询助手,帮助用户查询订单状态和物流信息。
                    
                    规则:
                    1. 当用户查询具体订单时,使用 getOrderStatus 函数
                    2. 查询用户订单列表时,使用 getUserOrders 函数
                    3. 用友好的语言回复用户
                    4. 如果用户没有提供足够信息,主动询问
                    """)
                .defaultFunctions(functionCallbacks.toArray(new FunctionCallback[0]))
                .build();
    }
​
    @PostMapping("/chat")
    public String chat(@RequestBody String message) {
        return chatClient.prompt()
                .user(message)
                .call()
                .content();
    }
}

5.3 用户体验

👤 用户:"我的订单 ORD20250501001 到哪了?"
🤖 AI:"您的订单 ORD20250501001 已发货,由顺丰快递承运,
       快递单号 SF1234567890,预计明天送达。"
​
👤 用户:"我最近买了什么?"
🤖 AI:"您最近的订单有:
       1. ORD20250501001 - 已签收 (5月1日)
       2. ORD20250515002 - 运输中 (5月15日)
       需要我帮您查看某个订单的详细信息吗?"

六、向量数据库集成(Milvus / Chroma)

6.1 配置向量数据库

# application.yml - Chroma 配置(轻量级开发首选)
spring:
  ai:
    vectorstore:
      chroma:
        host: http://localhost:8000
        collection-name: my-knowledge-base
        initialize-schema: true
​
---
# application.yml - Milvus 配置(生产环境首选)
spring:
  ai:
    vectorstore:
      milvus:
        host: milvus-standalone
        port: 19530
        database: default
        collection-name: enterprise-knowledge
        embedding-dimension: 1536    # OpenAI embedding 维度
        index-type: IVF_FLAT
        metric-type: COSINE          # 余弦相似度

6.2 向量化不同内容

@Service
public class EmbeddingService {
​
    private final EmbeddingModel embeddingModel;
​
    /**
     * 将文本转为向量
     */
    public float[] embedText(String text) {
        return embeddingModel.embed(text);
    }
​
    /**
     * 计算两段文本的语义相似度
     */
    public double similarity(String text1, String text2) {
        float[] vec1 = embedText(text1);
        float[] vec2 = embedText(text2);
        return cosineSimilarity(vec1, vec2);
    }
​
    private double cosineSimilarity(float[] a, float[] b) {
        double dot = 0, normA = 0, normB = 0;
        for (int i = 0; i < a.length; i++) {
            dot += a[i] * b[i];
            normA += a[i] * a[i];
            normB += b[i] * b[i];
        }
        return dot / (Math.sqrt(normA) * Math.sqrt(normB));
    }
}

七、多模态 AI:图片、语音识别实战

7.1 图片理解(GPT-4o Vision)

@RestController
@RequestMapping("/api/ai/vision")
public class VisionController {
​
    private final ChatClient chatClient;
​
    public VisionController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }
​
    /**
     * 图片转文字描述
     * POST /api/ai/vision/describe
     * multipart/form-data: image=xxx.png
     */
    @PostMapping("/describe")
    public String describeImage(@RequestParam("image") MultipartFile image) throws IOException {
        // 读取图片并转为 Base64
        byte[] bytes = image.getBytes();
        String base64 = Base64.getEncoder().encodeToString(bytes);
        String dataUrl = "data:image/" + getExtension(image) + ";base64," + base64;
​
        return chatClient.prompt()
                .user(userSpec -> userSpec
                    .text("请详细描述这张图片的内容")
                    .media(Media.Format.IMAGE_PNG, new URL(dataUrl)))
                .call()
                .content();
    }
​
    /**
     * 发票 OCR 识别
     */
    @PostMapping("/invoice-ocr")
    public InvoiceInfo extractInvoice(@RequestParam("image") MultipartFile image) {
        String prompt = """
            请从发票图片中提取以下信息,以JSON格式返回:
            {
                "invoiceNo": "发票号码",
                "amount": "金额(数字)",
                "date": "开票日期",
                "seller": "销售方名称",
                "buyer": "购买方名称",
                "items": ["商品列表"]
            }
            """;
​
        String response = chatClient.prompt()
                .user(userSpec -> userSpec
                    .text(prompt)
                    .media(/* image */))
                .call()
                .content();
​
        // 解析 JSON 返回
        return objectMapper.readValue(response, InvoiceInfo.class);
    }
}

7.2 语音转文字(集成阿里云/讯飞)

@Service
public class SpeechService {
​
    /**
     * 语音转文字(阿里云 ASR)
     */
    public String speechToText(MultipartFile audioFile) {
        // 1. 上传音频到 OSS
        String ossUrl = ossService.upload(audioFile);
        
        // 2. 调用阿里云语音识别
        SpeechRecognizer recognizer = new SpeechRecognizer(client, 
            "https://nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/asr");
        
        // 3. 获取识别结果
        return recognizer.recognize(ossUrl);
    }
​
    /**
     * 文本转语音(TTS)
     */
    public byte[] textToSpeech(String text, String voice) {
        return ttsClient.synthesize(text, voice);  // 返回 MP3 字节流
    }
}

八、生产环境部署与性能优化

8.1 性能优化策略

@Configuration
public class AIOptimizationConfig {
​
    /**
     * 1. 连接池配置 - 复用 HTTP 连接
     */
    @Bean
    public HttpClient httpClient() {
        return HttpClient.create()
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000)
                .responseTimeout(Duration.ofSeconds(60))
                .poolResources(PoolResources.fixed("ai-pool", 50));
    }
​
    /**
     * 2. 响应缓存 - Redis 缓存常见问题
     */
    @Service
    public class CachedChatService {
        
        @Cacheable(value = "ai:chat", key = "#prompt.hashCode()")
        public String chat(String prompt) {
            return chatClient.prompt().user(prompt).call().content();
        }
    }
​
    /**
     * 3. 限流保护
     */
    @Bean
    public RateLimiter aiRateLimiter() {
        return RateLimiter.create(100.0);  // 每秒100个请求
    }
}

8.2 监控与告警

# Prometheus + Grafana 监控配置
management:
  endpoints:
    web:
      exposure:
        include: health,metrics,prometheus
  metrics:
    tags:
      application: ai-service
    export:
      prometheus:
        enabled: true
​
# 自定义指标
spring:
  ai:
    metrics:
      enabled: true            # Token 使用量、延迟、成功率

8.3 生产环境 Checklist

项目 说明 状态
API Key 安全 使用环境变量/密钥管理服务,不硬编码
请求限流 防止 API 超额调用
响应缓存 相同问题返回缓存结果
超时控制 设置合理的超时时间
降级策略 LLM 不可用时的兜底方案
内容审核 输入输出内容安全过滤
日志脱敏 敏感信息不打印到日志
成本监控 Token 用量统计与告警

九、完整项目源码

项目结构

java-ai-project/
├── pom.xml
├── src/main/java/com/example/ai/
│   ├── AiApplication.java
│   ├── config/
│   │   ├── AiConfig.java              # AI 模型配置
│   │   ├── VectorStoreConfig.java     # 向量数据库配置
│   │   └── FunctionCallbackConfig.java # Function Calling 注册
│   ├── controller/
│   │   ├── ChatController.java         # 对话接口
│   │   ├── RAGController.java          # RAG 问答接口
│   │   ├── VisionController.java       # 图片识别接口
│   │   └── AdminController.java        # 管理后台
│   ├── service/
│   │   ├── RAGService.java            # RAG 核心服务
│   │   ├── EmbeddingService.java      # 向量化服务
│   │   ├── DocumentParser.java        # 文档解析
│   │   ├── SafetyFilter.java          # 内容安全过滤
│   │   └── TokenMonitor.java          # Token 用量监控
│   └── model/
│       ├── ChatRequest.java
│       ├── ChatResponse.java
│       └── KnowledgeBase.java
├── src/main/resources/
│   ├── application.yml
│   ├── application-prod.yml
│   └── prompts/                       # Prompt 模板
│       ├── code-review.st
│       ├── sql-optimizer.st
│       └── customer-service.st
└── docker-compose.yml                 # Chroma + Redis + App

快速启动

# 1. 克隆项目
git clone https://github.com/xxxx/java-ai-project.git
cd java-ai-project
​
# 2. 启动向量数据库和 Redis
docker-compose up -d chroma redis
​
# 3. 设置 API Key
export OPENAI_API_KEY=sk-xxxxxxxxxxxxx
​
# 4. 启动项目
./mvnw spring-boot:run
​
# 5. 测试
curl -X POST http://localhost:8080/api/ai/chat \
  -H "Content-Type: application/json" \
  -d '{"message":"用Java写一个单例模式"}'

📦 源码获取方式: 评论区留言「Java AI 666」+ 邮箱,我会在 24 小时内发送完整源码。 或者直接关注公众号「全栈攻城狮」,回复 「JavaAI」 自动获取。


十、总结与展望

2025年 Java AI 开发关键 Takeaways

  1. Spring AI 已成熟可用 — 1.0 版本提供了完整的 AI 集成能力

  2. RAG 是企业 AI 落地的核心模式 — 解决幻觉、保护数据安全

  3. Function Calling 打通 AI 与业务系统 — 让 AI 能操作你的数据库和 API

  4. 向量数据库是必备基础设施 — Chroma 轻量上手,Milvus 生产部署

  5. 多模态能力快速增长 — 图片、语音、视频都能处理

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐