在Spring AI中接入阿里云百炼上的DeepSeek
阿里云百炼简介
阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。不论是开发者还是业务人员,都能深入参与大模型应用的设计和构建。您可以通过简单的界面操作,在5分钟内开发出一款大模型应用,或在几小时内训练出一个专属模型,从而将更多精力专注于应用创新。
– 百炼官网
开通百炼并创建API KEY
有阿里云账号的用户,打开这个链接:https://bailian.console.aliyun.com
,先开通百炼。
然后在右上角的账号图标处,点击选择下拉菜单里的API Key
,创建一个API Key。
建议每一种用途都创建一个单独的API KEY。
然后,就没了,不需要其他设置了,我一度以为还需要选择模型。
API调用示例
在“模型广场”上,用DeepSeek
筛选,每个模型都有“API调用示例”
比如DeepSeek-R1的http示例(重点是url地址和模型名称):
1 | curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \ |
用Postman测试
Authorization: Bearer $DASHSCOPE_API_KEY
Body: raw json
第一次非常慢,用时超过1分钟。笔者切换了一下模型,多次尝试,
deepseek-r1
耗时在30秒左右,deepseek-v3
耗时在5-10秒。
在Spring AI中调用百炼上的DeepSeek
初始化项目
可以在https://start.spring.io
上快速初始化一个Spring AI 项目,笔者撰写本文时,使用的Spring AI 1.0.0-M5
。
MyController.java
1 | package com.example.demo.controller; |
修改配置
把application.properties
改名为application.yml
,按兼容OpenAI的方式进行配置:
1 | server: |
OpenAI参数,参考:https://docs.spring.io/spring-ai/reference/1.0/api/chat/openai-chat.html
- 避坑指南一:
文档上所有的配置前缀都是spring.ai.openai.chat
,但实际测试api-key
和base-url
的前缀是spring.ai.openai
,没有chat
,而options.model
则跟文档是一致的。api-key
和base-url
配错路径的异常:java.lang.IllegalArgumentException: OpenAI API key must be set. Use the connection property: spring.ai.openai.api-key or spring.ai.openai.embedding.api-key property.
model
配置错误的异常:org.springframework.ai.retry.NonTransientAiException: 403 - {"error":{"code":"access_denied","message":"Access denied.","type":"access_denied"},"request_id":"ce3e85e8-b82c-9cff-87e5-42b6e85c2a4e"}
。
- 避坑指南二:
base-url
配置时,要把/v1
去掉,Spring AI的ChatClient会自动添加/v1/chat/completions
,添加了v1
的异常信息为java.io.FileNotFoundException: https://dashscope.aliyuncs.com/compatible-mode/v1/v1/chat/completions
用Postman测试
- 访问地址:http://localhost:8081/ai/hello
- 请求方式:POST
初试 Dify + DeepSeek
初试 Dify + DeepSeek
安装 Dify
GitHub: https://github.com/langgenius/dify
主机要求
CPU >= 2 Core
RAM >= 4 GiB
安装指令
1 | git clone https://github.com/langgenius/dify.git |
初始化
连接 DeepSeek
在 Dify 中,点击右上角账号,“设置”,“模型供应商”:
但是在配置API Key时,异常:redentials validation failed with status code 402
402 Payment Required
是一个被保留使用的非标准客户端错误状态响应码,表明客户端请求的内容只有付费之后才能获取。
DeepSeek的官方网站,也在顶部警示,暂时没法充值来解除402:
只能等一等,看什么时候恢复…
Kubernetes 磁盘清理
Kubernetes 磁盘清理
删除持久存储的孤立(Orphaned)数据
以Longhorn为例,在Dashbord的Setting中查看Orphaned Data,全选后点击Delete。
1 | kubectl port-forward svc/longhorn-frontend 30080:80 -n longhorn-system |
清理未使用的容器和镜像(Containerd)
1 | crictl rmi --prune |
(Ubuntu)清理过期的APT缓存
1 | sudo apt-get autoclean |
(Linux)清理Systemd journal(日志记录)
1 | # 查看日志占用 |
(Ubuntu)清理旧版本的Snap应用
1 | # 设置保留的版本数 |
Visual Studio Code
扩展插件
Remote-SSH
简单来说这个插件就是让VSCode打开远程主机上的某个文件夹,然后像打开本机文件夹一样进行编码操作。
配置主机及账号
使用快捷键Ctrl+Shift+p
打开命令面板,输入ssh,选择Remote-SSH: Open SSH Configuration File...
,格式示例:
1 | Host your-server-alias |
如果使用密钥文件登录(Public Key),则增加
IdentityFile
参数,指向密钥文件。
Remote Development
这是一个远程开发插件包,包含了Remote-SSH、Dev-Containers、WSL等插件,可以快速在远程服务器上进行开发。
设置
选择默认终端
- 在VSCODE中用快捷键
Ctrl + Shift + p
打开命令面板; - 输入 Terminal: Select Default Profile
- 选择使用的终端类型,Windows下一般是
PowerShell
,Linux 则是bash
Maven Tips
解决mvn编译输出乱码的问题
乱码及分析
最近的某个项目从jdk17升级到jdk21,mvn clean install
的时候,某些输出为中文的地方变成了乱码。搜索出的资料大多数都是IDEA相关,解决办法要么是设置IDEA的File encoding
,要么是在pom.xml
里设置编码,都与我的这个问题不符。
从现象来看应该是jdk版本导致的,因为我运行mvn
命令是在PowerShell下,不是IDEA。最先怀疑是不是jdk厂商的问题,不同厂商的实现有差异。后来都用Oracle提供的JDK进行测试,还是问题依旧,17中文不乱码,切换到21就乱码了。所以推测是JDK 21检测系统的local编码跟17不一样,尝试找了一下有没有设置JDK日志输出编码的参数,未果。
后来在这篇博文里找到了解决方案:关于使用gradle编译java导致中文乱码的分析以及解决(完美且分析了所有情况)
虽然该文是讲Gradle,但是这个问题的根本原因是在JDK上,仍然适合解决我遇到的问题。
解决方法
设置“使用Unicode UTF-8 提供全球语言支持”,操作路径为:控制面板
-时钟和区域
-区域(更改日期、时间或数字格式)
-管理(更改系统区域设置)
-勾选“Beta版:使用Unicode UTF-8 提供全球语言支持”
,设置之后重启生效。
dev-tips
Golang环境变量
1 | # 查看 |
初始化项目
1 | go help mod |
From Java to Go
package
Java的package是命名空间,用.
分隔,并且源代码的组织(文件路径)是跟package对应。
Go也是用package来组织源代码,是module+源代码路径+package这样一种组织方式。其中module是由go mod init
生成,记录在go.mod中。然后是源代码路径,顶层跟go.mod同级,最后在同一个路径下再用package来区分。