🤖 系列:Java工程师转AI Agent 3个月学习计划
👤 作者:宸丶一 | 28岁Java程序员,规划狂魔,周六加班还在学AI
🎯 今日目标: 用 FastAPI 把 Agent 包装成 HTTP 服务,了解 Docker 部署
💬 个人格言: 代码改不改变世界我不知道,但先让我准时下班。


前言

大家好,我是宸一,一个28岁的Java程序员。

今天是第7天,主题是:FastAPI + Docker 部署入门

先说结论:今天是学AI以来最轻松的一天。

为啥?因为 FastAPI 就是 Python 版的 Spring Boot,API 开发的思路和我日常工作一模一样。除了 Docker 那块稍微新一点,其他基本就是换个语法。

周六加班日,轻量完成,不硬卷。


一、今日学习路线

01_fastapi_basics.py
FastAPI 基础

02_fastapi_agent.py
Agent 包装成 API

test_api.py
接口测试

Dockerfile
容器化配置

核心转变:

Day 6(脚本):
  用户 → python xxx.py → input() → print() → 用户
  只有你自己能用

Day 7(服务):
  用户A ──→ HTTP 请求 ──→ FastAPI ──→ Agent ──→ 响应 ──→ 用户A
  用户B ──→ HTTP 请求 ──→     ↑     ──→       ──→       ──→ 用户B
  用户C ──→ HTTP 请求 ──→     │     ──→       ──→       ──→ 用户C
                          24小时运行

从"脚本"变成"服务",这是质的飞跃。


二、FastAPI = Python 的 Spring Boot

2.1 用后端思维理解

作为Java后端,看到 FastAPI 的第一反应是:这不就是 Spring Boot 吗?

功能 Spring Boot FastAPI
创建应用 @SpringBootApplication app = FastAPI()
定义接口 @GetMapping @app.get
请求参数 @RequestParam 函数参数
请求体 @RequestBody Pydantic Model
数据验证 Bean Validation Pydantic
启动服务 java -jar uvicorn
API 文档 Swagger(要配置) 自动生成 /docs(零配置)
配置文件 application.yml .env

一模一样,就是换了个语法。

2.2 核心代码

from fastapi import FastAPI
from pydantic import BaseModel

# 创建应用 = @SpringBootApplication
app = FastAPI()

# 数据模型 = DTO/VO
class ChatRequest(BaseModel):
    message: str
    history: list = []

# 定义接口 = @Controller + @PostMapping
@app.post("/chat")
async def chat(request: ChatRequest):
    # 处理逻辑...
    return {"reply": "你好!"}

@app.get("/health")
async def health():
    return {"status": "healthy"}

Java 程序员看这段代码,零障碍。

2.3 最香的一点:自动 API 文档

启动服务后访问 http://localhost:8000/docs

→ 自动生成 Swagger UI
→ 所有接口一目了然
→ 可以直接在页面上测试
→ 零配置,零代码

Spring Boot 要集成 Swagger 还得加依赖、写配置。FastAPI 开箱即用,这点真的香。


三、把 Agent 包装成 API

3.1 接口设计

POST /chat      → 聊天接口(核心)
GET  /health    → 健康检查
GET  /tools     → 查看可用工具
GET  /           → 服务信息

标准的 RESTful 设计,和 Java 项目一模一样。

3.2 聊天接口实现

@app.post("/chat")
async def chat(request: ChatRequest):
    # 1. 构建消息
    messages = build_messages(request.message, request.history)
    
    # 2. 调用 Agent
    response = await agent.chat(messages)
    
    # 3. 返回结果
    return {
        "reply": response,
        "timestamp": datetime.now().isoformat()
    }

这不就是 Controller 调 Service 吗? 换了个语法而已。

3.3 测试结果

📌 测试1:根路径         → 200 ✅
📌 测试2:健康检查       → 200 ✅
📌 测试3:工具列表       → 200 ✅
📌 测试4.1:打招呼       → 200 ✅ "你好!我是小助手"
📌 测试4.2:查天气       → 200 ✅ "北京今天晴天,25°C"
📌 测试4.3:算数学       → 200 ✅ "15+27×3 = 96"
📌 测试4.4:查时间       → 200 ✅ "2026年6月6日13点44分"
📌 测试4.5:搜索知识     → 200 ✅ "Python是一种高级编程语言"
📌 测试5:带历史的聊天   → 200 ✅ "是的,你叫老刘,我记得!"
📌 测试6:API 文档       → 200 ✅

✅ 所有测试通过!

6个测试全部一次通过,周六加班日的效率奇迹。


四、踩坑记录

4.1 GET 访问 POST 接口 → 405

在浏览器直接敲 http://localhost:8000/chat
返回:405 Method Not Allowed

原因: /chat@app.post 定义的,浏览器地址栏默认是 GET 请求。

解决:/docs 页面用 Swagger UI 测试,或者用 test_api.py 脚本。

Java 同学注意: 这和 Spring Boot 的行为完全一样,@PostMapping 的接口用 GET 访问也是 405。

4.2 uvicorn 热重载重复打印

INFO: Will watch for changes in these directories: [...]
✅ 1. FastAPI 应用创建成功!
✅ 2. 数据模型定义完成!
✅ 3. 路由定义完成!
✅ 1. FastAPI 应用创建成功!    ← 又打印了一遍
✅ 2. 数据模型定义完成!        ← 又打印了一遍

原因: uvicorn 的 StatReload 会监听文件变化,自动重启服务。启动时会加载两次。

影响: 不影响功能,只是日志看着多。生产环境用 --reload 关掉就行。


五、Docker = 标准化的部署方式

5.1 Dockerfile 长啥样

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "02_fastapi_agent:app", "--host", "0.0.0.0", "--port", "8000"]

就这几行,没了。

用 Java 思维理解:

  • FROM python:3.11-slim → 选择 JDK 版本
  • COPY requirements.txt + RUN pip installmvn dependency:resolve
  • COPY . . → 复制代码
  • CMD [...]java -jar app.jar

5.2 Docker 解决了什么问题

没有 Docker:
  "在我电脑上能跑啊!" ← 经典问题
  Python版本不一致 → 依赖冲突 → 路径不同 → 各种坑

有了 Docker:
  打包成镜像 → 任何地方都能跑
  环境一致 → 依赖固定 → 配置统一 → 省心

本质:Docker = 把"我电脑上能跑"变成"任何电脑上都能跑"。

5.3 常用命令(就这几个)

docker build -t agent-api .    # 构建镜像 = mvn package
docker run -p 8000:8000 agent-api  # 运行容器 = java -jar
docker ps                       # 查看运行中的容器
docker logs <container_id>      # 查看日志
docker stop <container_id>      # 停止容器

5个命令,覆盖90%的日常使用。 不复杂,就是得多练。


六、用后端思维总结

概念 Java 对应 本例实现
FastAPI Spring Boot 创建 Web 应用
@app.get @GetMapping 定义 GET 接口
@app.post @PostMapping 定义 POST 接口
Pydantic Model @RequestBody + Bean Validation 请求数据验证
uvicorn Tomcat ASGI 服务器
/docs Swagger UI 自动 API 文档
Dockerfile pom.xml + 启动脚本 容器化配置
docker build mvn package 构建镜像
docker run java -jar 运行容器

七、今日收获

7.1 核心公式

Day 7 = FastAPI + Docker

FastAPI:
  应用 = FastAPI()
  接口 = @app.get / @app.post
  数据 = Pydantic Model
  文档 = 自动生成 /docs

Docker:
  镜像 = docker build
  容器 = docker run
  部署 = 标准化 + 可移植

7.2 最大的感受

今天是"回家"的一天。

Day 1-3:Python 基础 → 换语法,有点陌生
Day 4:函数调用 → 新概念,需要理解
Day 5:手写 Agent → 踩坑,但学到最多
Day 6:LangChain → 框架,有 Breaking Change
Day 7:FastAPI + Docker → 回到 Web 开发,熟悉的感觉

作为Java后端,API开发是日常。FastAPI 让我感觉回到了舒适区。

但"舒适"不代表"没学到东西"。 今天学到的是:

  1. Python 的 Web 框架和 Java 思路一样,但更简洁
  2. Docker 不复杂,就是几条命令
  3. 从"脚本"到"服务"是质的飞跃

7.3 学习路线的节奏

前6天:新知识密集,每天都有新概念
第7天:回到熟悉的领域,巩固 + 部署

这种节奏很好:
  前面学新东西 → 后面用熟悉的方式落地
  不会一直高压,也不会一直舒适

八、明日计划(Day 8)

主题:真实 API 接入 + Prompt 工程基础

前面7天用的都是"假数据"(硬编码的天气、知识库)
是时候接真正的 AI 了

计划:
- 把 Agent 接入小米 MiMo API,变成真正能对话的 AI
- 学 Prompt 工程基础:system prompt 怎么写、temperature 参数是什么
- 动手写一个"角色扮演"Agent
- 对比不同 prompt 的效果

一句话总结

FastAPI 是 Python 的 Spring Boot,Docker 是标准化的部署方式。Day 7 是"回家"的一天——Java后端搞API,闭着眼都能写。但别因为熟悉就跳过,"从脚本到服务"这个转变,值得认真理解。


📊 系列进度:Day 7 / 90
📅 学习节奏: 周六加班日,轻量完成
🎯 下一阶段: 接入真实 API,告别硬编码假数据

Logo

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

更多推荐