巴别鸟智巢AI Java 17命令行调用DeepSeek完整实战:API Key到RAG打通
环境: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):
- 进入「企业管理 → AI 配置」
- 选择「公有云大模型方案」
- 模型下拉里选 DeepSeek(deepseek-chat)
- 把 API Key 贴进去,点「测试连接」
- 看到「连接成功」就 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%)。
五、踩坑记录
- readTimeout 60s 不够:DeepSeek 长上下文生成时偶尔超过 60s,改成 120s 之后稳了。
- 巴别鸟 JWT 要用服务账号 Token:普通用户 Token 30 分钟过期,后台跑批任务会中途断。管理后台「系统集成 → 服务账号」里创建一个长期 Token。
- topK 不要超过 10:实测 topK=5 召回质量最好,超过 10 反而引入噪声,DeepSeek 容易把不相关的片段当答案。
- 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 终生授权
更多推荐



所有评论(0)