环境:OpenJDK 17.0.10 + Maven 3.9.6 + Windows 11
验证日期:2026-05-22
关键词:DeepSeek API、Java 17、命令行、智巢 AI、巴别鸟、实操

一、背景

公司接入了巴别鸟企业网盘(私有化部署版),AI 能力走智巢 AI 通道。最近需要在产品里直接调 DeepSeek 跑一些数据整理任务,前端不动,纯后端命令行打通。本文记录从拿 API Key 到 Java 工程里跑通 RAG 调用的完整过程。

实测环境:

  • JDK:OpenJDK 17.0.10
  • 构建:Maven 3.9.6
  • 巴别鸟版本:5.18.0(智巢 AI 模块已授权)
  • DeepSeek 模型:deepseek-chat(对应官网 V3)

二、准备工作

2.1 拿到 DeepSeek API Key

注册 DeepSeek 开放平台,创建一个 API Key,权限范围选「对话」就行。别开错成「向量」,那个权限要走单独的 text-embedding 接口。

# 把 Key 写进环境变量(Windows PowerShell)
$env:DEEPSEEK_API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxx"
# 验证一下
echo $env:DEEPSEEK_API_KEY

2.2 巴别鸟端开智巢 AI 通道

登录巴别鸟管理后台(https://your-babelbird-domain/admin):

  1. 进入「企业管理 → AI 配置」
  2. 选择「公有云大模型方案」
  3. 模型下拉里选 DeepSeek(deepseek-chat)
  4. 把 API Key 贴进去,点「测试连接」
  5. 看到「连接成功」就 OK

这一步很多同事会漏,结果 Java 代码调了半天没反应,回头一看是 AI 通道没开。

三、Java 工程结构

Maven 目录:

babelbird-deepseek-client/
├── pom.xml
└── src/main/java/com/babelbird/deepseek/
    ├── DeepSeekClient.java
    ├── ZhichaoRagClient.java
    └── App.java

3.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.babelbird</groupId>
    <artifactId>babelbird-deepseek-client</artifactId>
    <version>1.0.0</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.12.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.16.1</version>
        </dependency>
    </dependencies>
</project>

3.2 DeepSeek 客户端

// DeepSeekClient.java
package com.babelbird.deepseek;

import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.*;
import java.util.*;

public class DeepSeekClient {
    private static final String API_URL = "https://api.deepseek.com/v1/chat/completions";
    private final String apiKey;
    private final OkHttpClient http;
    private final ObjectMapper json = new ObjectMapper();

    public DeepSeekClient(String apiKey) {
        this.apiKey = apiKey;
        this.http = new OkHttpClient.Builder()
                .connectTimeout(30, java.util.concurrent.TimeUnit.SECONDS)
                .readTimeout(120, java.util.concurrent.TimeUnit.SECONDS)  // 这里卡了我一天,60s 不够
                .build();
    }

    public String chat(String prompt) throws Exception {
        Map<String, Object> body = new HashMap<>();
        body.put("model", "deepseek-chat");
        body.put("messages", List.of(
                Map.of("role", "user", "content", prompt)
        ));
        body.put("temperature", 0.3);
        body.put("max_tokens", 2048);

        Request req = new Request.Builder()
                .url(API_URL)
                .addHeader("Authorization", "Bearer " + apiKey)
                .post(RequestBody.create(
                        json.writeValueAsString(body),
                        MediaType.parse("application/json")))
                .build();

        try (Response resp = http.newCall(req).execute()) {
            if (!resp.isSuccessful()) {
                // 这里把返回体打出来,调试时省事
                throw new RuntimeException("DeepSeek 调用失败: " + resp.code() + " " + resp.body().string());
            }
            Map<?, ?> result = json.readValue(resp.body().bytes(), Map.class);
            List<?> choices = (List<?>) result.get("choices");
            Map<?, ?> msg = (Map<?, ?>) ((Map<?, ?>) choices.get(0)).get("message");
            return (String) msg.get("content");
        }
    }
}

3.3 巴别鸟智巢 AI RAG 客户端

巴别鸟的 RAG 不是裸调 DeepSeek,而是先在智巢 AI 知识库里做向量检索,再把召回的文档片段塞进 prompt。下面这个客户端走的是巴别鸟私有 API(/api/v1/zhichao/ask):

// ZhichaoRagClient.java
package com.babelbird.deepseek;

import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.*;
import java.util.*;

public class ZhichaoRagClient {
    private final String babelBirdBase;
    private final String babelBirdToken;
    private final DeepSeekClient deepSeek;
    private final OkHttpClient http = new OkHttpClient();
    private final ObjectMapper json = new ObjectMapper();

    public ZhichaoRagClient(String base, String token, DeepSeekClient deepSeek) {
        this.babelBirdBase = base;
        this.babelBirdToken = token;
        this.deepSeek = deepSeek;
    }

    public String askWithKnowledge(String question) throws Exception {
        // 1. 先去智巢 AI 知识库做语义检索
        String retrieved = retrieve(question, 5);

        // 2. 拼成 RAG prompt
        String prompt = """
                你是企业知识助手。请基于以下参考片段回答用户问题。
                如果参考片段里没有答案,直接说「资料里没找到」,别瞎编。

                参考片段:
                %s

                用户问题:%s
                """.formatted(retrieved, question);

        // 3. 调 DeepSeek 生成回答
        return deepSeek.chat(prompt);
    }

    private String retrieve(String question, int topK) throws Exception {
        Map<String, Object> body = Map.of(
                "query", question,
                "top_k", topK
        );
        Request req = new Request.Builder()
                .url(babelBirdBase + "/api/v1/zhichao/search")
                .addHeader("Authorization", "Bearer " + babelBirdToken)
                .post(RequestBody.create(
                        json.writeValueAsString(body),
                        MediaType.parse("application/json")))
                .build();

        try (Response resp = http.newCall(req).execute()) {
            if (!resp.isSuccessful()) {
                throw new RuntimeException("智巢检索失败: " + resp.code());
            }
            Map<?, ?> result = json.readValue(resp.body().bytes(), Map.class);
            List<?> docs = (List<?>) result.get("documents");
            StringBuilder sb = new StringBuilder();
            for (Object doc : docs) {
                Map<?, ?> d = (Map<?, ?>) doc;
                sb.append("- ").append(d.get("title"))
                        .append("\n").append(d.get("snippet")).append("\n\n");
            }
            return sb.toString();
        }
    }
}

3.4 启动类

// App.java
package com.babelbird.deepseek;

public class App {
    public static void main(String[] args) throws Exception {
        // 命令行参数注入,避免硬编码
        String deepseekKey = System.getenv("DEEPSEEK_API_KEY");
        String babelBase = args.length > 0 ? args[0] : "https://your-babelbird-domain";
        String babelToken = System.getenv("BABELBIRD_TOKEN");
        String question = args.length > 1 ? args[1] : "我们公司的差旅报销标准是什么?";

        if (deepseekKey == null || babelToken == null) {
            System.err.println("缺环境变量 DEEPSEEK_API_KEY 或 BABELBIRD_TOKEN");
            System.exit(1);
        }

        DeepSeekClient ds = new DeepSeekClient(deepseekKey);
        ZhichaoRagClient rag = new ZhichaoRagClient(babelBase, babelToken, ds);

        String answer = rag.askWithKnowledge(question);
        System.out.println("===== 回答 =====");
        System.out.println(answer);
    }
}

四、命令行运行

# 编译
mvn clean package -DskipTests

# 运行(PowerShell)
$env:DEEPSEEK_API_KEY = "sk-xxxxxxxx"
$env:BABELBIRD_TOKEN = "your-babelbird-jwt-token"
java -jar target/babelbird-deepseek-client-1.0.0.jar `
     "https://your-babelbird-domain" `
     "2026 年差旅报销新规里餐饮发票限额是多少?"

实测输出:

===== 回答 =====
根据 2026 年差旅报销新规(财务部 2026-03 发文),餐饮发票单次限额
调整为每人每天 200 元,超过部分需提交专项说明并经部门负责人审批。
住宿费按职务分档:普通员工 600 元/晚,部门经理 800 元/晚,
高管 1200 元/晚(一线城市上浮 30%)。

五、踩坑记录

  1. readTimeout 60s 不够:DeepSeek 长上下文生成时偶尔超过 60s,改成 120s 之后稳了
  2. 巴别鸟 JWT 要用服务账号 Token:普通用户 Token 30 分钟过期,后台跑批任务会中途断。管理后台「系统集成 → 服务账号」里创建一个长期 Token。
  3. topK 不要超过 10:实测 topK=5 召回质量最好,超过 10 反而引入噪声,DeepSeek 容易把不相关的片段当答案。
  4. temperature 调到 0.3:默认 1.0 太发散,企业知识库场景要稳。

六、FAQ

Q1:智巢 AI 的 RAG 和直接调 DeepSeek 有什么区别?
RAG 会先用企业上传的文件做语义检索,再把召回的片段塞进 prompt。直接调 DeepSeek 没有企业内部知识,只能回答通用问题。

Q2:巴别鸟公有云版能用这个方案吗?
能用。公有云版开通智巢 AI 模块后,API 地址换成 https://api.babel.cc 即可,模型选择里同样支持 DeepSeek。

Q3:API Key 怎么轮换?
巴别鸟管理后台「AI 配置」里支持一个 Key 列表,系统会按顺序轮询调用,旧的 Key 失效自动切到下一个。

参考

  • 巴别鸟智巢 AI 公有云模型方案:阿里云 PAI / DeepSeek / 千问 / Claude / Gemini
  • 巴别鸟智巢 AI 模块(AI 搜索 + AI 知识库 + 智体 LLM Agent)私有化部署 ¥150,000 终生授权
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐