
使用Scala Play框架構建REST API
場景 | 痛點 | 傳統方案 | 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 元/百萬字符,讓“信、達、雅”第一次觸手可及。
下一次,當你再面對「多語言部署」四個字,不妨先跑一遍腳本,把時間留給更有創造力的工作。