文章目录
-
- 第四阶段:模型微调与部署(3-4周)
-
- [4.1 微调技术原理](#4.1 微调技术原理)
-
- [LoRA(Low-Rank Adaptation)](#LoRA(Low-Rank Adaptation))
- [4.2 使用Java调用微调流程](#4.2 使用Java调用微调流程)
-
- [方案一:使用Python脚本 + Java调用](#方案一:使用Python脚本 + Java调用)
- Python微调脚本
- [4.3 模型部署方案](#4.3 模型部署方案)
- [4.4 量化与性能优化](#4.4 量化与性能优化)
- [4.5 实战项目:Java代码助手](#4.5 实战项目:Java代码助手)
- [4.6 阶段性任务清单](#4.6 阶段性任务清单)
- 第五阶段:Agent与高级应用(2-3周)
-
- [5.1 Agent框架核心概念](#5.1 Agent框架核心概念)
- [5.2 使用LangChain4j构建Agent](#5.2 使用LangChain4j构建Agent)
- [5.3 ReAct Agent实现](#5.3 ReAct Agent实现)
-
- [ReAct模式(Reasoning + Acting)](#ReAct模式(Reasoning + Acting))
- [5.4 多智能体协作(Multi-Agent)](#5.4 多智能体协作(Multi-Agent))
- [5.5 实战项目:智能DevOps助手](#5.5 实战项目:智能DevOps助手)
- [5.6 阶段性任务清单](#5.6 阶段性任务清单)
- 学习资源汇总
- 快速上手计划(12周达成)
- 关键建议与最佳实践
-
- [1. 学习方法论](#1. 学习方法论)
- [2. 成本控制策略](#2. 成本控制策略)
- [3. 技术选型建议](#3. 技术选型建议)
- [4. 常见错误与解决](#4. 常见错误与解决)
- [5. 社区参与与求职](#5. 社区参与与求职)
- [6. 进阶方向](#6. 进阶方向)
- 进阶方向
第四阶段:模型微调与部署(3-4周)
4.1 微调技术原理
LoRA(Low-Rank Adaptation)
python
# 原理解释(使用Python演示,Java在后面)
"""
LoRA原理:
不更新原模型权重 W,而是训练两个小矩阵 A 和 B
W_new = W_original + A * B
其中:
- W: d × d (如 4096 × 4096)
- A: d × r (如 4096 × 8)
- B: r × d (如 8 × 4096)
- r: rank(通常 4-64)
优势:
1. 只需训练 2*d*r 个参数,相比全量微调减少 99%+
2. 多个任务可共享基座模型,只需切换 LoRA 权重
3. 推理时可合并到原模型,无额外延迟
"""
import torch
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM
# 加载基座模型
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-7B")
# 配置LoRA
lora_config = LoraConfig(
r=8, # Rank
lora_alpha=32, # 缩放系数
target_modules=["q_proj", "v_proj"], # 对哪些层应用LoRA
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM"
)
# 应用LoRA
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 输出: trainable params: 4,194,304 || all params: 7,241,732,096 || trainable%: 0.0579
4.2 使用Java调用微调流程
方案一:使用Python脚本 + Java调用
java
// 1. Java控制微调流程
@Service
public class ModelFineTuneService {
/**
* 准备训练数据
*/
public void prepareTrainingData(List<TrainingExample> examples, String outputPath) {
// 转换为JSONL格式
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputPath))) {
for (TrainingExample example : examples) {
Map<String, Object> data = Map.of(
"instruction", example.getInstruction(),
"input", example.getInput(),
"output", example.getOutput()
);
writer.write(JSON.toJSONString(data));
writer.newLine();
}
}
}
/**
* 调用Python微调脚本
*/
public void startFineTuning(FineTuneConfig config) throws IOException {
ProcessBuilder pb = new ProcessBuilder(
"python", "scripts/finetune.py",
"--model_name", config.getBaseModel(),
"--data_path", config.getDataPath(),
"--output_dir", config.getOutputDir(),
"--lora_rank", String.valueOf(config.getLoraRank()),
"--num_epochs", String.valueOf(config.getEpochs()),
"--learning_rate", String.valueOf(config.getLearningRate())
);
pb.redirectErrorStream(true);
Process process = pb.start();
// 实时读取输出
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
log.info("Training log: {}", line);
// 可以解析进度、loss等信息
parseTrainingProgress(line);
}
}
int exitCode = process.waitFor();
if (exitCode != 0) {
throw new RuntimeException("微调失败");
}
}
}
@Data
class FineTuneConfig {
private String baseModel = "Qwen/Qwen-7B"; // 基座模型
private String dataPath; // 训练数据路径
private String outputDir; // 输出目录
private int loraRank = 8; // LoRA rank
private int epochs = 3; // 训练轮数
private double learningRate = 1e-4; // 学习率
}
Python微调脚本
python
# scripts/finetune.py
import argparse
import torch
from datasets import load_dataset
from transformers import (
AutoTokenizer,
AutoModelForCausalLM,
TrainingArguments,
Trainer
)
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--model_name", type=str, required=True)
parser.add_argument("--data_path", type=str, required=True)
parser.add_argument("--output_dir", type=str, required=True)
parser.add_argument("--lora_rank", type=int, default=8)
parser.add_argument("--num_epochs", type=int, default=3)
parser.add_argument("--learning_rate", type=float, default=1e-4)
args = parser.parse_args()
# 1. 加载模型和tokenizer
tokenizer = AutoTokenizer.from_pretrained(args.model_name)
model = AutoModelForCausalLM.from_pretrained(
args.model_name,
torch_dtype=torch.float16,
device_map="auto"
)
# 2. 配置LoRA
lora_config = LoraConfig(
r=args.lora_rank,
lora_alpha=32,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
# 3. 加载数据
dataset = load_dataset("json", data_files=args.data_path)
def format_prompt(example):
prompt = f"""### Instruction:
{example['instruction']}
### Input:
{example['input']}
### Response:
{example['output']}"""
return tokenizer(prompt, truncation=True, max_length=512)
tokenized_dataset = dataset.map(format_prompt, remove_columns=dataset["train"].column_names)
# 4. 训练参数
training_args = TrainingArguments(
output_dir=args.output_dir,
num_train_epochs=args.num_epochs,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=args.learning_rate,
logging_steps=10,
save_steps=100,
save_total_limit=3,
fp16=True,
)
# 5. 开始训练
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset["train"],
)
trainer.train()
# 6. 保存模型
model.save_pretrained(args.output_dir)
tokenizer.save_pretrained(args.output_dir)
print("Training completed!")
if __name__ == "__main__":
main()
4.3 模型部署方案
方案一:Ollama本地部署(推荐入门)
java
// 1. 安装Ollama(Windows)
// 下载: https://ollama.com/download
// 2. Java控制Ollama
@Service
public class OllamaService {
private static final String OLLAMA_API = "http://localhost:11434";
@Autowired
private RestTemplate restTemplate;
/**
* 拉取模型
*/
public void pullModel(String modelName) throws IOException {
ProcessBuilder pb = new ProcessBuilder("ollama", "pull", modelName);
pb.inheritIO();
Process process = pb.start();
process.waitFor();
}
/**
* 调用本地模型
*/
public String chat(String model, String prompt) {
Map<String, Object> request = Map.of(
"model", model,
"prompt", prompt,
"stream", false
);
ResponseEntity<Map> response = restTemplate.postForEntity(
OLLAMA_API + "/api/generate",
request,
Map.class
);
return (String) response.getBody().get("response");
}
/**
* 流式响应
*/
public void chatStream(String model, String prompt, Consumer<String> callback) {
// 使用OkHttp处理流式响应
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(
MediaType.parse("application/json"),
JSON.toJSONString(Map.of(
"model", model,
"prompt", prompt,
"stream", true
))
);
Request request = new Request.Builder()
.url(OLLAMA_API + "/api/generate")
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(response.body().byteStream())
);
String line;
while ((line = reader.readLine()) != null) {
Map<String, Object> json = JSON.parseObject(line, Map.class);
String chunk = (String) json.get("response");
if (chunk != null) {
callback.accept(chunk);
}
}
}
}
/**
* 导入自定义模型
*/
public void createCustomModel(String modelName, String modelPath) throws IOException {
// 1. 创建Modelfile
String modelfile = String.format("""
FROM %s
TEMPLATE \"\"\"{{ .System }}
### Instruction:
{{ .Prompt }}
### Response:
\"\"\"
PARAMETER temperature 0.7
PARAMETER top_p 0.9
""", modelPath);
Files.writeString(Paths.get("Modelfile"), modelfile);
// 2. 创建模型
ProcessBuilder pb = new ProcessBuilder(
"ollama", "create", modelName, "-f", "Modelfile"
);
pb.inheritIO();
pb.start().waitFor();
}
}
方案二:vLLM服务化部署(生产环境)
yaml
# docker-compose.yml
version: '3.8'
services:
vllm:
image: vllm/vllm-openai:latest
ports:
- "8000:8000"
volumes:
- ./models:/models
command: >
--model /models/Qwen-7B-Chat
--trust-remote-code
--tensor-parallel-size 1
--gpu-memory-utilization 0.9
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
java
// vLLM Java客户端
@Service
public class VllmService {
private static final String VLLM_API = "http://localhost:8000/v1";
@Autowired
private RestTemplate restTemplate;
/**
* 调用vLLM服务(兼容OpenAI API)
*/
public String chat(String message) {
Map<String, Object> request = Map.of(
"model", "Qwen-7B-Chat",
"messages", List.of(
Map.of("role", "user", "content", message)
),
"temperature", 0.7,
"max_tokens", 1000
);
ResponseEntity<Map> response = restTemplate.postForEntity(
VLLM_API + "/chat/completions",
request,
Map.class
);
Map<String, Object> body = response.getBody();
List<Map<String, Object>> choices = (List) body.get("choices");
Map<String, Object> message = (Map) choices.get(0).get("message");
return (String) message.get("content");
}
}
4.4 量化与性能优化
GPTQ量化(4bit)
python
# 量化脚本
from transformers import AutoTokenizer, GPTQConfig
from auto_gptq import AutoGPTQForCausalLM
model_name = "Qwen/Qwen-7B-Chat"
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 配置4bit量化
quantization_config = GPTQConfig(
bits=4,
group_size=128,
desc_act=False,
)
# 加载并量化
model = AutoGPTQForCausalLM.from_pretrained(
model_name,
quantization_config=quantization_config
)
# 保存量化后模型
model.save_pretrained("Qwen-7B-Chat-GPTQ-4bit")
tokenizer.save_pretrained("Qwen-7B-Chat-GPTQ-4bit")
# 效果:模型大小从14GB减少到4GB,精度损失<2%
java
// Java加载量化模型
@Service
public class QuantizedModelService {
/**
* 通过Ollama使用量化模型
*/
public void loadQuantizedModel() throws IOException {
// Ollama自动使用4-bit量化
ProcessBuilder pb = new ProcessBuilder(
"ollama", "run", "qwen:7b-chat-q4_0" // q4_0 = 4-bit量化
);
pb.start();
}
}
4.5 实战项目:Java代码助手
数据准备
java
@Service
public class CodeDatasetService {
/**
* 从GitHub收集Java代码
*/
public List<TrainingExample> collectJavaCode(String repoUrl) {
List<TrainingExample> examples = new ArrayList<>();
// 1. Clone仓库
Git git = Git.cloneRepository()
.setURI(repoUrl)
.setDirectory(new File("temp/repo"))
.call();
// 2. 遍历Java文件
Files.walk(Paths.get("temp/repo"))
.filter(p -> p.toString().endsWith(".java"))
.forEach(path -> {
try {
String code = Files.readString(path);
// 3. 提取方法级别的代码
List<MethodDeclaration> methods = parseJavaMethods(code);
for (MethodDeclaration method : methods) {
examples.add(new TrainingExample(
"实现一个Java方法",
extractMethodSignature(method),
method.toString()
));
}
} catch (IOException e) {
log.error("读取文件失败", e);
}
});
return examples;
}
/**
* 生成代码解释数据
*/
public List<TrainingExample> generateExplanations(List<String> codeSamples) {
LlmService gpt4 = new OpenAiService("gpt-4"); // 使用强模型生成训练数据
return codeSamples.stream()
.map(code -> {
String prompt = String.format("""
请解释以下Java代码的功能:
```java
%s
```
请给出详细的中文解释。
""", code);
String explanation = gpt4.chat(prompt);
return new TrainingExample(
"解释代码",
code,
explanation
);
})
.collect(Collectors.toList());
}
}
微调后的模型使用
java
@RestController
@RequestMapping("/api/code-assistant")
public class CodeAssistantController {
@Autowired
private OllamaService ollama;
/**
* 代码生成
*/
@PostMapping("/generate")
public ResponseEntity<String> generateCode(@RequestBody CodeRequest request) {
String prompt = String.format("""
### Instruction:
实现一个Java方法
### Input:
%s
### Response:
""", request.getDescription());
String code = ollama.chat("java-code-assistant", prompt);
return ResponseEntity.ok(code);
}
/**
* 代码解释
*/
@PostMapping("/explain")
public ResponseEntity<String> explainCode(@RequestBody CodeRequest request) {
String prompt = String.format("""
### Instruction:
解释代码
### Input:
```java
%s
```
### Response:
""", request.getCode());
String explanation = ollama.chat("java-code-assistant", prompt);
return ResponseEntity.ok(explanation);
}
/**
* Bug修复建议
*/
@PostMapping("/fix-bug")
public ResponseEntity<BugFixResponse> fixBug(@RequestBody BugRequest request) {
String prompt = String.format("""
### Instruction:
分析并修复以下Java代码的Bug
### Input:
代码:
```java
%s
```
错误信息:
%s
### Response:
""", request.getCode(), request.getErrorMessage());
String response = ollama.chat("java-code-assistant", prompt);
return ResponseEntity.ok(parseBugFixResponse(response));
}
}
4.6 阶段性任务清单
- 理解LoRA/QLoRA原理,计算参数量对比
- 准备垂直领域训练数据(1000+条)
- 搭建Python微调环境(transformers + peft)
- 完成一次完整的LoRA微调(记录loss变化)
- 部署Ollama并导入自定义模型
- 对比微调前后模型效果(准确率、响应质量)
- 尝试4bit量化,测试性能与精度
- 开发Java代码助手应用(生成、解释、修复)
第五阶段:Agent与高级应用(2-3周)
5.1 Agent框架核心概念
什么是Agent?
java
/**
* Agent = LLM + 工具调用 + 记忆 + 规划
*
* 传统对话:用户 -> LLM -> 响应
* Agent模式:用户 -> Agent(思考 -> 调用工具 -> 再思考) -> 响应
*
* 示例场景:
* 用户:"帮我查一下明天北京的天气,如果下雨就发邮件提醒我"
*
* Agent执行流程:
* 1. 理解意图:需要查天气、条件判断、发邮件
* 2. 调用天气API -> 获取:"明天小雨 15-20℃"
* 3. 判断:有雨,需要发邮件
* 4. 调用邮件API -> 发送成功
* 5. 回复用户:"明天北京小雨,已经发邮件提醒您"
*/
5.2 使用LangChain4j构建Agent
Maven依赖
xml
<dependencies>
<!-- LangChain4j 核心 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>0.27.0</version>
</dependency>
<!-- OpenAI集成 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>0.27.0</version>
</dependency>
<!-- 向量存储 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
<version>0.27.0</version>
</dependency>
</dependencies>
基础Agent实现
java
// 1. 定义工具
@Service
public class WeatherTool {
@Tool("查询指定城市的天气信息")
public String getWeather(
@P("城市名称,如北京、上海") String city) {
// 调用实际天气API
RestTemplate restTemplate = new RestTemplate();
String url = String.format("https://api.weather.com/v1?city=%s", city);
WeatherResponse response = restTemplate.getForObject(url, WeatherResponse.class);
return String.format("%s天气:%s,温度%d℃",
city, response.getCondition(), response.getTemperature());
}
}
@Service
public class EmailTool {
@Tool("发送邮件给指定收件人")
public String sendEmail(
@P("收件人邮箱") String to,
@P("邮件主题") String subject,
@P("邮件内容") String content) {
// 调用邮件服务
try {
emailService.send(to, subject, content);
return "邮件发送成功";
} catch (Exception e) {
return "邮件发送失败:" + e.getMessage();
}
}
}
@Service
public class DatabaseTool {
@Autowired
private JdbcTemplate jdbcTemplate;
@Tool("查询数据库中的数据")
public String queryDatabase(@P("SQL查询语句") String sql) {
try {
List<Map<String, Object>> results = jdbcTemplate.queryForList(sql);
return JSON.toJSONString(results);
} catch (Exception e) {
return "查询失败:" + e.getMessage();
}
}
}
// 2. 创建Agent
@Configuration
public class AgentConfig {
@Bean
public AiServices<AssistantAgent> createAgent(
WeatherTool weatherTool,
EmailTool emailTool,
DatabaseTool databaseTool) {
ChatLanguageModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4")
.temperature(0.0) // Agent需要精准,不需要创意
.build();
return AiServices.builder(AssistantAgent.class)
.chatLanguageModel(model)
.tools(weatherTool, emailTool, databaseTool)
.chatMemory(MessageWindowChatMemory.withMaxMessages(10))
.build();
}
}
// 3. 定义Agent接口
interface AssistantAgent {
String chat(String message);
}
// 4. 使用Agent
@RestController
@RequestMapping("/api/agent")
public class AgentController {
@Autowired
private AssistantAgent agent;
@PostMapping("/chat")
public ResponseEntity<String> chat(@RequestBody ChatRequest request) {
String response = agent.chat(request.getMessage());
return ResponseEntity.ok(response);
}
}
工具调用原理(Function Calling)
java
/**
* Function Calling流程:
*
* 1. 用户:"帮我查一下明天北京的天气"
*
* 2. LLM分析后返回:
* {
* "function_call": {
* "name": "getWeather",
* "arguments": {"city": "北京"}
* }
* }
*
* 3. Agent框架执行 getWeather("北京")
*
* 4. 得到结果:"北京天气:晴,温度25℃"
*
* 5. 将结果反馈给LLM,LLM生成最终回复:
* "明天北京天气晴朗,温度大约25℃,适合出行。"
*/
5.3 ReAct Agent实现
ReAct模式(Reasoning + Acting)
java
@Service
public class ReactAgentService {
@Autowired
private LlmService llm;
@Autowired
private Map<String, Tool> tools; // 所有可用工具
/**
* ReAct循环执行
*/
public String execute(String task) {
List<String> trajectory = new ArrayList<>(); // 记录执行轨迹
int maxIterations = 10;
for (int i = 0; i < maxIterations; i++) {
// Step 1: Thought (思考)
String prompt = buildReActPrompt(task, trajectory);
String response = llm.chat(prompt);
// Step 2: 解析响应
ReActStep step = parseReActResponse(response);
trajectory.add(response);
if (step.getAction().equals("Finish")) {
return step.getActionInput();
}
// Step 3: Action (行动)
Tool tool = tools.get(step.getAction());
if (tool == null) {
trajectory.add("Observation: 工具不存在");
continue;
}
String observation = tool.execute(step.getActionInput());
trajectory.add("Observation: " + observation);
}
return "超过最大迭代次数";
}
private String buildReActPrompt(String task, List<String> trajectory) {
StringBuilder prompt = new StringBuilder();
prompt.append("""
你是一个能够使用工具解决问题的AI Agent。
可用工具:
- getWeather(city): 查询天气
- sendEmail(to, subject, content): 发送邮件
- queryDatabase(sql): 查询数据库
- calculate(expression): 计算数学表达式
你应该按照以下格式回复:
Thought: 我需要做什么
Action: 工具名称
Action Input: 工具参数
如果已经得到最终答案:
Thought: 我现在知道答案了
Action: Finish
Action Input: 最终答案
任务:
""");
prompt.append(task).append("\n\n");
// 添加历史轨迹
trajectory.forEach(t -> prompt.append(t).append("\n"));
return prompt.toString();
}
private ReActStep parseReActResponse(String response) {
// 解析 Thought/Action/Action Input
Pattern pattern = Pattern.compile(
"Thought: (.+?)\nAction: (.+?)\nAction Input: (.+)",
Pattern.DOTALL
);
Matcher matcher = pattern.matcher(response);
if (matcher.find()) {
return new ReActStep(
matcher.group(1).trim(),
matcher.group(2).trim(),
matcher.group(3).trim()
);
}
throw new IllegalArgumentException("无法解析响应");
}
}
@Data
@AllArgsConstructor
class ReActStep {
private String thought;
private String action;
private String actionInput;
}
5.4 多智能体协作(Multi-Agent)
java
/**
* 多智能体协作场景:软件开发团队
*/
// 1. 产品经理Agent
@Service
public class ProductManagerAgent {
@Autowired
private LlmService llm;
public String writeRequirements(String userStory) {
String prompt = String.format("""
你是一个产品经理。请根据用户需求编写详细的PRD文档。
用户需求:%s
请包含:
1. 功能描述
2. 产品目标
3. 用户故事
4. 验收标准
""", userStory);
return llm.chat(prompt);
}
}
// 2. 架构师Agent
@Service
public class ArchitectAgent {
@Autowired
private LlmService llm;
public String designArchitecture(String requirements) {
String prompt = String.format("""
你是一个资深架构师。请根据需求设计技术架构。
需求文档:%s
请输出:
1. 技术选型
2. 系统架构图
3. 数据库设计
4. API设计
""", requirements);
return llm.chat(prompt);
}
}
// 3. 开发者Agent
@Service
public class DeveloperAgent {
@Autowired
private LlmService llm;
public String writeCode(String architecture, String task) {
String prompt = String.format("""
你是一个高级Java开发者。请根据架构设计实现代码。
架构设计:%s
当前任务:%s
请生成完整的Java代码,包括单元测试。
""", architecture, task);
return llm.chat(prompt);
}
}
// 4. 测试工程师Agent
@Service
public class TesterAgent {
@Autowired
private LlmService llm;
public String reviewCode(String code) {
String prompt = String.format("""
你是一个QA工程师。请审查代码并生成测试用例。
代码:
```java
%s
```
请输出:
1. 代码审查意见
2. 潜在问题
3. 测试用例(正常、异常、边界)
""", code);
return llm.chat(prompt);
}
}
// 5. 协调器
@Service
public class TeamCoordinator {
@Autowired
private ProductManagerAgent pmAgent;
@Autowired
private ArchitectAgent architectAgent;
@Autowired
private DeveloperAgent developerAgent;
@Autowired
private TesterAgent testerAgent;
/**
* 完整的开发流程
*/
public ProjectOutput developFeature(String userStory) {
ProjectOutput output = new ProjectOutput();
// Step 1: PM编写PRD
log.info("产品经理正在编写PRD...");
String prd = pmAgent.writeRequirements(userStory);
output.setPrd(prd);
// Step 2: 架构师设计架构
log.info("架构师正在设计架构...");
String architecture = architectAgent.designArchitecture(prd);
output.setArchitecture(architecture);
// Step 3: 开发者编写代码
log.info("开发者正在编写代码...");
String code = developerAgent.writeCode(architecture, prd);
output.setCode(code);
// Step 4: 测试工程师审查
log.info("测试工程师正在审查...");
String testReport = testerAgent.reviewCode(code);
output.setTestReport(testReport);
return output;
}
}
@Data
class ProjectOutput {
private String prd;
private String architecture;
private String code;
private String testReport;
}
5.5 实战项目:智能DevOps助手
java
@Service
public class DevOpsAgent {
@Autowired
private LlmService llm;
@Autowired
private GitTool gitTool;
@Autowired
private DockerTool dockerTool;
@Autowired
private KubernetesTool k8sTool;
/**
* 自动化部署流程
*/
public DeploymentResult autoDeploy(String projectName, String environment) {
DeploymentResult result = new DeploymentResult();
try {
// 1. 检查代码
log.info("正在从 Git 拉取最新代码...");
gitTool.pull(projectName);
// 2. 构建 Docker 镜像
log.info("正在构建 Docker 镜像...");
String imageTag = dockerTool.build(projectName);
result.setImageTag(imageTag);
// 3. 推送到镜像仓库
log.info("正在推送镜像...");
dockerTool.push(imageTag);
// 4. 更新 Kubernetes 部署
log.info("正在更新 K8s 部署...");
k8sTool.updateDeployment(projectName, imageTag, environment);
// 5. 检查健康状态
boolean healthy = k8sTool.checkHealth(projectName, environment);
result.setSuccess(healthy);
if (!healthy) {
// 使用LLM分析问题
String logs = k8sTool.getLogs(projectName, environment);
String analysis = analyzeError(logs);
result.setErrorAnalysis(analysis);
}
} catch (Exception e) {
result.setSuccess(false);
result.setError(e.getMessage());
// AI分析异常
String suggestion = suggestFix(e);
result.setSuggestion(suggestion);
}
return result;
}
private String analyzeError(String logs) {
String prompt = String.format("""
你是一个DevOps专家。请分析以下部署日志,找出问题原因。
日志:
%s
请给出:
1. 问题诊断
2. 可能的原因
3. 解决建议
""", logs);
return llm.chat(prompt);
}
}
5.6 阶段性任务清单
- 理解Agent核心概念和Function Calling原理
- 使用LangChain4j开发带工具调用的Agent
- 实现ReAct Agent(Thought-Action-Observation循环)
- 开发至少55个自定义工具(天气、邮件、数据库、计算器等)
- 实现多智能体协作系统(PM+架构师+开发+测试)
- 完成DevOps自动化助手项目
- 对比普通对话和Agent模式的任务完成质量
学习资源汇总
理论学习
1. 基础课程
-
《动手学深度学习》(李沐)
- 在线读:https://zh.d2l.ai/
- Jupyter Notebook交互式学习
- 包含Transformer章节
-
吴恩达《ChatGPT Prompt Engineering for Developers》
- 课程链接:https://www.deeplearning.ai/
- 1.5小时快速掌握Prompt技巧
- 附有Python代码示例
-
Hugging Face NLP Course
- 地址:https://huggingface.co/learn/nlp-course
- 全面讲解Transformer、微调、部署
- 配套代码和模型
2. 论文阅读(必读)
- Attention is All You Need (Transformer原始论文)
- BERT: Pre-training of Deep Bidirectional Transformers
- Language Models are Few-Shot Learners (GPT-3)
- LoRA: Low-Rank Adaptation of Large Language Models
- Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (RAG)
3. 视频资源
-
3Blue1Brown - Transformer可视化
- YouTube/Bilibili搜索
- 直观理解注意力机制
-
李沐老师课程
- Bilibili搜索"李沐动手学深度学习"
- 讲解清晰,适合入门
实践资源
1. Java生态框架
LangChain4j
xml
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>0.27.0</version>
</dependency>
- GitHub: https://github.com/langchain4j/langchain4j
- 文档: https://docs.langchain4j.dev/
- 特点:专为Java设计,Spring Boot集成方便
Spring AI
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>0.8.0</version>
</dependency>
- GitHub: https://github.com/spring-projects/spring-ai
- 文档: https://docs.spring.io/spring-ai/reference/
- 特点:Spring官方支持,生态成熟
Deep Java Library (DJL)
xml
<dependency>
<groupId>ai.djl</groupId>
<artifactId>api</artifactId>
<version>0.25.0</version>
</dependency>
- GitHub: https://github.com/deepjavalibrary/djl
- 文档: https://djl.ai/
- 特点:支持本地模型推理,多框架后端
2. 实战项目参考
ChatGPT-Java
- GitHub: https://github.com/PlexPt/chatgpt-java
- 简洁的OpenAI Java客户端
- 适合快速集成
LangChain4j Examples
- GitHub: https://github.com/langchain4j/langchain4j-examples
- 官方示例代码
- 涵盖RAG、Agent、工具调用等
Awesome LLM Apps
- GitHub: https://github.com/Shubhamsaboo/awesome-llm-apps
- 50+实战项目
- Python为主,可参考思路
3. 数据集资源
Hugging Face Datasets
python
from datasets import load_dataset
# 中文对话数据集
dataset = load_dataset("BelleGroup/train_2M_CN")
# Java代码数据集
code_dataset = load_dataset("codeparrot/github-code", "Java")
中文数据集推荐
- BELLE: https://github.com/LianjiaTech/BELLE
- COIG: https://huggingface.co/datasets/BAAI/COIG
- Firefly: https://github.com/yangjianxin1/Firefly
4. 模型资源
国内开源模型
-
Qwen-7B/14B: 阿里巴巴,中文表现优秀
- https://github.com/QwenLM/Qwen
- 支持Ollama一键部署
-
ChatGLM3-6B: 清华智谱AI
- https://github.com/THUDM/ChatGLM3
- 6B参数,消费级GPU可运行
-
Baichuan2-7B/13B: 百川智能
国际模型
- Llama 2: Meta开源,70B性能强
- Mistral-7B: 性价比高
- Phi-2: 微软小模型,2.7B
Kaggle竞赛与项目
- LLM Science Exam: https://www.kaggle.com/competitions/kaggle-llm-science-exam
- Feedback Prize: 文本评价任务
- 搜索"LLM"查看最新竮赛
社区与论坛
技术社区
- GitHub: 搜索"awesome-llm"、"awesome-langchain"
- Hugging Face: https://huggingface.co/
- 知乎: 搜索"大模型"、"LLM"话题
Discord/Slack
- LangChain Discord: https://discord.gg/langchain
- Hugging Face Discord: https://discord.gg/huggingface
工具与平台
1. 本地开发工具
Ollama
- 下载: https://ollama.com/
- 优势:一键部署本地模型,自动量化
bash
# Windows/Mac/Linux
ollama run qwen:7b
ollama run llama2:13b
LM Studio
- 下载: https://lmstudio.ai/
- 特点:GUI界面,方便模型管理
2. 向量数据库
Milvus
bash
# Docker部署
docker run -d --name milvus \
-p 19530:19530 \
milvusdb/milvus:latest
Chroma
python
import chromadb
client = chromadb.Client()
collection = client.create_collection("my_collection")
Pinecone (云服务)
- 官网: https://www.pinecone.io/
- 免费套餐:100MB存储
3. Prompt工程工具
PromptPerfect
- 网址: https://promptperfect.jina.ai/
- 功能:自动优化Prompt
LangSmith
- 网址: https://smith.langchain.com/
- 功能:Agent调试、链路追踪
博客与教程
中文博客推荐
- 大模型应用开发手册: https://datawhalechina.github.io/llm-cookbook/
- LangChain 中文网: https://www.langchain.com.cn/
- Hugging Face 课程中文版: https://huggingface.co/learn
英文资源
- Andrej Karpathy: https://karpathy.ai/
- Jay Alammar: https://jalammar.github.io/
- Sebastian Raschka: https://sebastianraschka.com/
课程与认证
免费课程
- DeepLearning.AI: 吴恩达系列课程
- Fast.ai: Practical Deep Learning for Coders
- Stanford CS224N: NLP with Deep Learning
付费课程
- Coursera: Natural Language Processing Specialization
- Udacity: AI Programming with Python
- 极客时间: 大模型应用开发实战
快速上手计划(12周达成)
| 周数 | 阶段 | 学习目标 | 实践项目 | 交付物 | 时间分配 |
|---|---|---|---|---|---|
| 1 | 理论基础 | Transformer原理 Prompt工程 | 阅读论文 手写Attention | 学习笔记 伪代码 | 20h |
| 2 | API集成 | OpenAI/Qwen API Token管理 | Spring Boot集成 流式对话 | 工作原Demo | 20h |
| 3-4 | 企业应用 | 多模型适配 上下文管理 | 智能客服系统 WebSocket实时通信 | 完整项目 | 40h |
| 5 | 向量技术 | Embedding原理 余弦相似度 | Milvus搭建 文档向量化 | 向量检索Demo | 20h |
| 6-7 | RAG应用 | RAG架构 混合检索 | 知识库问答 Rerank优化 | 企业知识库 | 40h |
| 8-9 | 模型微调 | LoRA原理 数据准备 | Java代码数据集 Qwen-7B微调 | 自定义模型 | 40h |
| 10 | 模型部署 | Ollama使用 vLLM部署 | Docker容器化 API服务化 | 部署文档 | 20h |
| 11 | Agent开发 | Function Calling ReAct模式 | LangChain4j Agent 工具调用 | Agent Demo | 20h |
| 12 | 综合项目 | 多智能体协作 系统集成 | Java代码助手 DevOps Agent | 完整产品 | 20h |
总计:260小时 ≈ 每天 3小时 × 12周
每周学习计划模板
工作日(周一至周五)
- 19:00-20:30: 理论学习(视频/论文)
- 20:30-22:00: 动手实践(代码编写)
周末(周六、周日)
- 上午 9:00-12:00: 项目开发
- 下午 14:00-17:00: 问题调试、总结复盘
关键里程碑
第1个月(第1-4周)
- ✅ 成功调用GPT API完成对话
- ✅ 开发一个可演示的智能客服系统
- ✅ 理解Prompt工程的核心技巧
第2个月(第5-8周)
- ✅ 掌握向量检索原理与实现
- ✅ 完成RAG知识库项目
- ✅ 对比传统检索和RAG的效果差异
第3个月(第9-12周)
- ✅ 完成一次完整的模型微调
- ✅ 部署自己的本地模型
- ✅ 开发带工具调用的Agent系统
- ✅ 交付一个完整的综合项目
学习评估标准
理论掌握程度
- 能解释Transformer的工作原理
- 理解预训练和微调的区别
- 掌握Prompt工程的最佳实践
- 理解RAG架构的核心流程
- 掌握LoRA微调的数学原理
实践能力
- 能快速集成主流LLM API
- 能设计并实现RAG系统
- 能完成模型微调并评估效果
- 能部署和服务化模型
- 能开发复杂的Agent应用
项目交付
- 至少完成3个完整项目(客服、知识库、Agent)
- 有可演示的前端界面
- 代码上GitHub并编写README
- 写技术博客记录学习过程
关键建议与最佳实践
1. 学习方法论
边学边做
java
// 错误做法:花一个月只学理论
// 正确做法:学完一个概念立即用Java实现
// 例子:学完注意力机制后
1. 阅读论文/视频 (1小时)
2. 立刻手写伪代码 (30分钟)
3. 用Java调用OpenAI API测试 (1小时)
项目驱动
java
// 不要为了学习而学习,要为了解决问题而学习
// 好的学习目标:
✅ "我要开发一个能回答公司技术文档的机器人"
✅ "我要实现一个能生成单元测试的工具"
// 糟糕的学习目标:
❌ "我要学习Transformer"
❌ "我要掌握RAG"
快速迭代
java
// 第一版:最简单的实现 (1天)
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return openAiService.chat(message);
}
// 第二版:添加上下文 (2天)
// 第三版:集成知识库 (3天)
// 第四版:添加流式响应 (2天)
// 每次只添加一个功能,保证可运行
2. 成本控制策略
API调用成本
java
// 优先级排序(从低到高)
// 1. 开源本地模型(推荐入门)
Ollama + Qwen-7B // 完全免费,需要16GB内存
// 2. 国内低成本商用API
通义千问: ¥0.0008/1K tokens // 约GPT-3.5的1/3
文心一言: ¥0.012/1K tokens
智谱GLM: ¥0.005/1K tokens
// 3. OpenAI API
GPT-3.5-Turbo: $0.002/1K tokens // 性价比高
GPT-4: $0.03/1K tokens // 用于复杂任务
// 成本估算例子
// 1万次对话,每次平均500 tokens
// GPT-3.5: $0.002 * 500 * 10000 / 1000 = $10
// 通义千问: ¥0.0008 * 500 * 10000 / 1000 = ¥4
节省策略
java
@Service
public class CostOptimizationService {
// 1. 缓存重复请求
@Cacheable("llm:cache")
public String chat(String message) {
return llmService.chat(message);
}
// 2. 使用更小的模型
public String smartRoute(String message) {
if (isSimpleQuery(message)) {
return qwen7B.chat(message); // 7B小模型
} else {
return gpt4.chat(message); // 复杂任务才用GPT-4
}
}
// 3. 控制Token数量
public String chat(String message) {
return llmService.chat(
message,
maxTokens: 500 // 限制输出长度
);
}
}
3. 技术选型建议
开发阶段
java
// 第1-2周:快速验证
OpenAI API + Spring Boot
// 优势:零配置,效果最好
// 劣势:有成本,需要翻墙
// 第3-4周:企业应用
通义千问 API + Spring Boot + Redis
// 优势:国内访问快,成本低
// 适用:生产环境
// 第5-8周:RAG应用
Milvus + LangChain4j + Qwen API
// 优势:开源方案,可控性强
// 适用:知识密集型任务
// 第9-12周:本地部署
Ollama + Qwen-7B + LoRA微调
// 优势:完全本地,无成本,数据安全
// 适用:垂直领域、隐私敏感场景
生产部署选择
yaml
# 小型项目(<1000 QPS)
vLLM + Qwen-7B + Docker
硬件:1张 RTX 4090 (24GB)
成本:¥15000
# 中型项目(1000-10000 QPS)
vLLM + Qwen-14B + K8s
硬件:2张 A100 (80GB)
成本:云服务器 ¥20/小时
# 大型项目(>10000 QPS)
商用API(阿里云/腾讯云)
成本:按量计费,无需维护
4. 常见错误与解决
错误1:Prompt设计不当
java
// ❌ 糟糕的Prompt
String prompt = "帮我写代码";
// ✅ 良好的Prompt
String prompt = """
你是一个高级Java工程师。请按照以下要求实现一个方法:
功能:计算两个日期之间的工作日天数
输入:LocalDate startDate, LocalDate endDate
输出:int 工作日天数
约束:
- 排除周末
- 排除法定节假日
- 使用Java 8 Date API
- 添加单元测试
""";
错误2:不处理异常
java
// ❌ 没有异常处理
public String chat(String message) {
return openAiService.chat(message); // 可能抛出RateLimitException
}
// ✅ 正确的做法
public String chat(String message) {
try {
return openAiService.chat(message);
} catch (RateLimitException e) {
// 限流后重试
Thread.sleep(1000);
return chat(message);
} catch (TimeoutException e) {
return "请求超时,请稍后再试";
} catch (Exception e) {
log.error("调用LLM失败", e);
return "服务异常,请联系管理员";
}
}
错误3:RAG检索精度低
java
// ❌ 简单的向量检索
List<Doc> docs = vectorStore.search(query, 3);
// ✅ 混合检索 + Rerank
// 1. 向量检索 + BM25检索
List<Doc> vectorDocs = vectorStore.search(query, 10);
List<Doc> bm25Docs = elasticsearchService.search(query, 10);
// 2. 融合结果
List<Doc> merged = mergeResults(vectorDocs, bm25Docs);
// 3. 使用LLM重排序
List<Doc> reranked = reranker.rerank(query, merged, 3);
错误4:微调数据质量差
python
# ❌ 糟糕的训练数据
{
"instruction": "写代码",
"output": "public void test() {}"
}
# ✅ 高质量的训练数据
{
"instruction": "实现一个线程安全的单例模式",
"input": "需要支持懒加载和双重检查锁定",
"output": """
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
"""
}
# 数据要求:
- 数量:至少1000条
- 多样性:覆盖各种场景
- 高质量:代码可运行,有注释
5. 社区参与与求职
GitHub贡献
bash
# 1. Fork一个开源项目
git clone https://github.com/langchain4j/langchain4j
# 2. 修复Bug或添加功能
# 3. 提交Pull Request
# 4. 积累贡献记录
技术博客
- 在CSDN/掌书/知乎发文
- 分享学习过程和踩坑经验
- 建立个人技术品牌
项目展示
markdown
# GitHub README 示例
## 智能客服系统
基于LangChain4j和Qwen-7B的企业级智能客服系统
### 技术栈
- Spring Boot 3.2
- LangChain4j 0.27
- Qwen-7B-Chat
- Milvus 2.3
- Redis 7.0
### 功能特性
- ✅ 多轮对话管理
- ✅ RAG知识库检索
- ✅ 意图识别与路由
- ✅ WebSocket实时通信
### 快速开始
\`\`\`bash
git clone ...
mvn spring-boot:run
\`\`\`
### Demo

简历亮点
项目经验:
• 基于LangChain4j开发企业知识库问答系统,支持10万+文档检索
• 使用LoRA微调Qwen-7B模型,在Java代码生成任务上准确率提升35%
• 开发多Agent协作系统,实现自动化代码审查和测试用例生成
技术栈:
Java 17 | Spring Boot | LangChain4j | Milvus | Qwen | LoRA
6. 进阶方向
模型训练方向
- 从零预训练小模型(<1B)
- RLHF对齐技术
- 模型压缩(剪枝、蒸馏)
多模态方向
- CLIP/BLIP:图像+文本
- Whisper:语音识别
- SAM:图像分割
工程化方向
- 模型监控与可观测性
- A/B测试与效果评估
- 成本优化与性能调优
领域专家
- 金融LLM:风控、报告生成
- 医疗LLM:诊断辅助、病历分析
- 法律LLM:合同审查、案例检索
进阶方向
- 模型训练:从零预训练小模型
- 多模态:图像+文本(CLIP、BLIP)
- 强化学习:RLHF对齐技术
- 推理优化:量化、剪枝、蒸馏