Skip to content

环境准备:从零到第一次真实调用 ​

1. 本节产出 ​

本地机器上完成:JDK + Maven + IDE + Docker 就绪,申请到至少一个国内模型的 API Key,并用一条 curl 和一个最小 Java 工程,各跑通一次真实调用。

2. 前置依赖 ​

无额外技术前置。需要准备:

  • 一台内存 ≥ 16GB 的开发机(跑向量库和 Redis 会占内存;8GB 也能跑,但 Docker 会很吃紧)
  • 能正常访问公网的模型服务商(国内服务商即可)

3. 为什么这节不能跳过 ​

统计上新手卡住的位置,八成在这步,而不是代码:

卡点典型报错真实原因
依赖拉不下来Could not find artifact里程碑版本需要额外仓库,中央仓库没有
调用 401invalid api keyKey 复制时带了空格,或用了错环境的 Key
调用 404path not foundBase URL 重复拼接了 /v1
本地端口不通Connection refused / 超时Docker 没起、或被本机代理/安全软件拦截回环地址

先把环境做扎实,后面每一章才能只看增量。

4. 核心原理:一次调用到底经过什么 ​

你的 Java 代码
   → Spring AI 的 ChatModel(封装请求/解析响应)
      → HTTP POST {baseUrl}/chat/completions
         → 模型厂商的服务端
            → 返回 JSON(choices[0].message.content + usage)

你需要向模型厂商拿到三样东西,缺一不可:

项说明易错点
Base URL服务商的 API 地址有的厂商要求以 /v1 结尾,有的不需要。Spring AI 的 OpenAI 客户端通常会自己拼 /chat/completions,所以要确认完整拼起来对不对
API Key鉴权凭据环境变量注入,绝不进 Git
Model Name模型标识字符串deepseek-chat、glm-4 这类,写错会报模型不存在

为什么推荐 OpenAI 兼容协议的模型:国内多数厂商都提供 OpenAI 兼容端点,Spring AI 的 OpenAI starter 可以直接改 base-url 对接。这意味着一套代码切换厂商只需要改配置,不需要换依赖——这是后面「多模型切换」能力的基础。

提示:务必确认你选的模型是否支持工具调用(function calling)。不支持工具调用的模型,01-07 之后的章节都做不了。选型时把这当成硬门槛。

5. 操作步骤 ​

步骤 1:安装 JDK ​

推荐 JDK 21(LTS)。用 SDKMAN 或直接从发行版官网装均可:

bash
java -version
# 期望输出包含 21.x

如果公司老项目还在 17,也没问题,本新课程内容在 17 上可跑;差别只在极少数语法特性,遇到时在章节里会标注。

步骤 2:安装 Maven ​

bash
mvn -v
# 期望 Maven 3.9+

给 Maven 配好国内镜像源(很多公司网络拉境外仓库会超时),修改 ~/.m2/settings.xml 的 mirrors。

步骤 3:安装 IDE ​

IntelliJ IDEA 或 VS Code 均可。录屏演示用深色主题 + 等宽字体(JetBrains Mono / Fira Code),字号不小于 18pt——这是为了让录屏出来的视频在手机上也看得清。

步骤 4:安装 Docker Desktop ​

后面 PGVector、Redis、Milvus 全靠它起。

bash
docker version
docker compose version
docker run --rm hello-world

Windows 用户注意:Docker Desktop 依赖 WSL2,装完要确认 BIOS 虚拟化已开启。

步骤 5:申请模型 API Key ​

选一家国内服务商注册,在控制台创建 API Key。建议:

  • 演示用单独的 Key,并设置低额度上限,避免调试失控烧钱
  • 立刻充值一个小额(比如 20-50 元),避免演示到一半余额不足

步骤 6:用 curl 验证联通(先于 Java) ​

这一步是关键:先用最原始的方式确认 Key、URL、模型名三者都对,排除掉网络与鉴权问题,再写 Java。

bash
curl https://<厂商域名>/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $API_KEY" \
  -d '{
    "model": "<模型名>",
    "messages": [{"role":"user","content":"用一句话介绍 Spring Boot"}],
    "max_tokens": 100
  }'

期望返回(节选):

json
{
  "choices": [{"message": {"role": "assistant", "content": "..."}}],
  "usage": {"prompt_tokens": 15, "completion_tokens": 42, "total_tokens": 57}
}

拿到这段输出,记下 usage 字段——后面的成本章节要用到它。

步骤 7:最小 Java 工程 ​

不要手写 pom,用 Spring Initializr 生成骨架,选择 Spring Web + 对应的 Spring AI starter。或者在配套 demo 仓库检出:

bash
cd demos/spring-ai-basics
git checkout ch00-02-env-setup

配置 .env(仓库里只有 .env.example,复制后填自己的 Key):

properties
spring.ai.openai.api-key=${API_KEY}
spring.ai.openai.base-url=https://<厂商域名>
spring.ai.openai.chat.options.model=<模型名>

跑起来后调一次接口,确认 Java 侧也通了。

6. 验证清单 ​

逐条打勾,全绿再进下一章:

  • [ ] java -version 输出 17 或 21
  • [ ] mvn -v 输出 3.9+
  • [ ] docker ps 能正常返回
  • [ ] curl 调用返回了带 usage 的 JSON
  • [ ] Key 没有硬编码在代码里,且 .env 已被 .gitignore 忽略
  • [ ] Java 工程能启动并成功返回一次模型回答

7. 生产避坑 ​

  1. 别把 Base URL 的 /v1 拼两遍。最常见的情况:厂商文档给的域名已经带 /v1,配置文件里又写了一遍,结果请求打到 /v1/v1/chat/completions 报 404。做法:先在 curl 里试通,把 curl 里那串 URL 原样搬到配置里。
  2. Key 一旦进过 Git 历史就当它已泄露。立刻去控制台吊销重新生成,git rm 之后还要清理历史记录。演示时养成习惯:.gitignore 里预置 .env,仓库只放 .env.example。
  3. 本机代理/安全软件会拦截回环地址。表现是 Docker 容器映射的端口连不上、或 IDE 里调 localhost 超时,而关掉代理软件就正常。排查方法:telnet 127.0.0.1 <端口>,如果代理开着时不通、关掉就通,那就是它——去软件里把 127.0.0.1 加入排除列表,而不是关掉整个代理(公司准入软件通常关不掉)。
  4. 验证时不要偷懒跳过 curl 那一步。直接上 Java 的话,一次报错里同时混杂了依赖问题、配置问题、网络问题,排查时间通常是先 curl 的三倍。

8. 延伸与锚点 ​

  • 思考题:你的公司网络能直连模型厂商吗?如果不能,需要找谁申请放行?这个答案决定了后续能不能做内部推广。
  • 代码锚点:ch00-02-env-setup
  • 下一章:00-03 版本矩阵——把依赖版本一次定死,后面就不会再被环境问题打断。