
使用Scala Play框架构建REST API
一句话总结:15 分钟,一杯咖啡,一条 Maven 依赖,把全球 92 种语言的翻译能力装进任何 Java 项目,成本低到让 CFO 笑出声。
场景 | 痛点 | 传统方案 | Qwen-MT 方案 |
---|---|---|---|
跨境电商客服 | 52 国用户咨询,人工翻译排队 2 小时 | 雇佣 20 人外包团队 | 1 台 2 vCPU 服务器 + 1 个 API |
全球化 APP 文案 | 每次发版 500 条新文案 | 翻译公司 3 天 | 3 分钟批量脚本 |
金融舆情监控 | 西班牙语负面新闻 10 分钟才被发现 | 人工刷 Twitter | 实时流式翻译 |
而 Qwen-MT 把这一切压缩成了 0.006 元/1000 字符,平均延迟 180 ms,支持 术语干预、记忆库、领域提示 三大高级功能。
sk-xxx
。 新用户赠送 100 万 token 免费额度,足够跑 2000 次中等长度翻译。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dashscope-sdk-java</artifactId>
<version>2.20.6</version>
</dependency>
新建 QuickStart.java
:
import com.alibaba.dashscope.aigc.generation.*;
import com.alibaba.dashscope.common.*;
import java.util.*;
public class QuickStart {
public static void main(String[] args) throws Exception {
Generation gen = new Generation();
Message userMsg = Message.builder()
.role(Role.USER.getValue())
.content("生活就像一盒巧克力,你永远不知道下一颗是什么味道。")
.build();
TranslationOptions options = TranslationOptions.builder()
.sourceLang("auto") // 自动检测中文
.targetLang("Spanish")
.build();
GenerationParam param = GenerationParam.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("qwen-mt-plus")
.messages(Collections.singletonList(userMsg))
.translationOptions(options)
.build();
GenerationResult res = gen.call(param);
System.out.println(res.getOutput().getChoices().get(0).getMessage().getContent());
}
}
运行:
export DASHSCOPE_API_KEY=sk-你的真实key
mvn compile exec:java
终端输出:
La vida es como una caja de chocolates, nunca sabes qué sabor tendrá el siguiente.
@RestController
@RequestMapping("/api")
public class TranslateController {
@Value("${dashscope.api.key}")
private String apiKey;
private final Generation gen = new Generation();
@PostMapping("/translate")
public TranslateResp translate(@RequestBody TranslateReq req) throws Exception {
TranslationOptions options = TranslationOptions.builder()
.sourceLang(req.getSourceLang())
.targetLang(req.getTargetLang())
.terms(req.getTerms()) // 可选术语干预
.build();
GenerationParam param = GenerationParam.builder()
.apiKey(apiKey)
.model("qwen-mt-plus")
.messages(List.of(Message.builder()
.role(Role.USER.getValue())
.content(req.getText())
.build()))
.translationOptions(options)
.build();
GenerationResult result = gen.call(param);
return new TranslateResp(result.getOutput().getChoices().get(0).getMessage().getContent());
}
}
前端调用:
curl -X POST http://localhost:8080/api/translate \
-H "Content-Type: application/json" \
-d '{"text":"你好世界","sourceLang":"auto","targetLang":"German"}'
List<TranslationOptions.Term> terms = List.of(
TranslationOptions.Term.builder()
.source("小米")
.target("Xiaomi")
.build(),
TranslationOptions.Term.builder()
.source("石墨烯")
.target("graphene")
.build()
);
翻译结果:
Xiaomi has adopted graphene to enhance battery efficiency.
TranslationOptions options = TranslationOptions.builder()
.sourceLang("Chinese")
.targetLang("English")
.memory(List.of(
"上一句把‘传感器’译为 sensor,下一句继续用 sensor"
))
.build();
ExecutorService pool = Executors.newFixedThreadPool(32);
List<CompletableFuture<TranslateResp>> futures = texts.stream()
.map(text -> CompletableFuture.supplyAsync(() -> {
try {
return translate(text, "Thai");
} catch (Exception e) {
return new TranslateResp("ERROR");
}
}, pool))
.toList();
并发 | 平均延迟 | 成功率 | 成本 (¥/1M 字符) |
---|---|---|---|
1 | 180 ms | 100 % | 6 |
10 | 220 ms | 100 % | 6 |
100 | 380 ms | 99.8 % | 6 |
测试环境:阿里云 ecs.c7.large,JDK 21,Spring Boot 3.2。
const source = new EventSource('/api/stream?text=你好&target=ar');
source.onmessage = (e) => setTranslated(prev => prev + e.data);
echo ${{ secrets.DASHSCOPE_API_KEY }} | base64 -d
kubectl create secret generic qwen-mt --from-literal=key=sk-xxx
qwen_mt_requests_total{status="200"} 1.2e+06
qwen_mt_latency_seconds_bucket{le="0.2"} 0.95
错误码 | 原因 | 解决 |
---|---|---|
401 Unauthorized | 密钥错误或已删除 | 重新生成并替换 |
429 Rate Limit | 并发超限 | 控制台升级套餐 |
400 context_length_exceeded | 单次 > 6000 字符 | 分段 |
git clone https://github.com/yourname/qwen-mt-java-demo.git
cd qwen-mt-java-demo
./mvnw spring-boot:run
仓库包含:
语言曾是人类最伟大的发明,也是最顽固的壁垒。
今天,Qwen-MT 把 92 种语言、3 项高级功能、1 个轻量接口打包成 6 元/百万字符,让“信、达、雅”第一次触手可及。
下一次,当你再面对「多语言部署」四个字,不妨先跑一遍脚本,把时间留给更有创造力的工作。