思有所皈,绪有所依

给万千思绪,寻一寄存之所

阿里云百炼简介

阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。不论是开发者还是业务人员,都能深入参与大模型应用的设计和构建。您可以通过简单的界面操作,在5分钟内开发出一款大模型应用,或在几小时内训练出一个专属模型,从而将更多精力专注于应用创新。
– 百炼官网

开通百炼并创建API KEY

有阿里云账号的用户,打开这个链接:https://bailian.console.aliyun.com,先开通百炼。
然后在右上角的账号图标处,点击选择下拉菜单里的API Key,创建一个API Key。

建议每一种用途都创建一个单独的API KEY。

创建API KEY

然后,就没了,不需要其他设置了,我一度以为还需要选择模型。

API调用示例

在“模型广场”上,用DeepSeek筛选,每个模型都有“API调用示例”
筛选DeepSeek模型

比如DeepSeek-R1的http示例(重点是url地址和模型名称):

1
2
3
4
5
6
7
8
9
10
11
12
curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-r1",
"messages": [
{
"role": "user",
"content": "9.9和9.11谁大"
}
]
}'

用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

初始化Spring AI项目

MyController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.example.demo.controller;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/ai")
public class MyController {
private final ChatClient chatClient;

public MyController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}

@GetMapping("/hello")
public String hello(@RequestParam String userInput) {
return this.chatClient.prompt()
.user(userInput)
.call()
.content();
}
}

修改配置

application.properties改名为application.yml,按兼容OpenAI的方式进行配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server:
port: 8081
shutdown: graceful
servlet:
context-path: /

spring.application:
name: demo
spring.ai.openai:
api-key: sk-***
base-url: https://dashscope.aliyuncs.com/compatible-mode
chat.options:
model: deepseek-r1
log:
level:
root: debug

OpenAI参数,参考:https://docs.spring.io/spring-ai/reference/1.0/api/chat/openai-chat.html

  • 避坑指南一:
    文档上所有的配置前缀都是spring.ai.openai.chat,但实际测试api-keybase-url的前缀是spring.ai.openai,没有chat,而options.model则跟文档是一致的。
    api-keybase-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"}

OpenAI配置参数的文档

  • 避坑指南二:
    base-url配置时,要把/v1去掉,Spring AI的ChatClient会自动添加/v1/chat/completions,添加了v1的异常信息为java.io.FileNotFoundException: https://dashscope.aliyuncs.com/compatible-mode/v1/v1/chat/completions

用Postman测试

初试 Dify + DeepSeek

安装 Dify

GitHub: https://github.com/langgenius/dify

主机要求

CPU >= 2 Core
RAM >= 4 GiB

安装指令
1
2
3
4
5
git clone https://github.com/langgenius/dify.git
cd dify
cd docker
cp .env.example .env
docker compose up -d
初始化

访问:http://localhost/install

连接 DeepSeek

在 Dify 中,点击右上角账号,“设置”,“模型供应商”:

但是在配置API Key时,异常:redentials validation failed with status code 402

402 Payment Required 是一个被保留使用的非标准客户端错误状态响应码,表明客户端请求的内容只有付费之后才能获取。

DeepSeek的官方网站,也在顶部警示,暂时没法充值来解除402:

只能等一等,看什么时候恢复…

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
2
3
4
5
# 查看日志占用
sudo journalctl --disk-usage

# 清理超过7天的日志
sudo journalctl --vacuum-time=7d

(Ubuntu)清理旧版本的Snap应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 设置保留的版本数
sudo snap set system refresh.retain=2

# 更新Snap应用
sudo snap refresh

#查看snap占用的空间
du -h /var/lib/snapd/snaps

#查看Snap应用
snap list

#删除Snap应用
sudo snap remove --purge <snap-name>

查看JVM的所有参数及其默认值

1
2
3
4
5
6
# 查看所有参数
java -XX:+PrintFlagsFinal -version

# 查看某个参数
java -XX:+PrintFlagsFinal -version | grep MaxMetaspaceSize
java -XX:+PrintFlagsFinal -version | grep UseG1GC

查看某个进程当前的配置

1
2
3
4
5
6
# 查看所有参数
jinfo -flags <pid>
jcmd <pid> VM.flags

# 查看某个参数
jinfo -flag MaxMetaspaceSize <pid>

扩展插件

Remote-SSH

简单来说这个插件就是让VSCode打开远程主机上的某个文件夹,然后像打开本机文件夹一样进行编码操作。

配置主机及账号

使用快捷键Ctrl+Shift+p打开命令面板,输入ssh,选择Remote-SSH: Open SSH Configuration File...,格式示例:

1
2
3
Host your-server-alias
HostName 192.168.1.1
User root

如果使用密钥文件登录(Public Key),则增加 IdentityFile 参数,指向密钥文件。

Remote Development

这是一个远程开发插件包,包含了Remote-SSH、Dev-Containers、WSL等插件,可以快速在远程服务器上进行开发。

设置

选择默认终端

  1. 在VSCODE中用快捷键 Ctrl + Shift + p 打开命令面板;
  2. 输入 Terminal: Select Default Profile
  3. 选择使用的终端类型,Windows下一般是 PowerShell,Linux 则是 bash

解决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 提供全球语言支持”,设置之后重启生效。

git tips

分支操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看分支
git branch

# 查看所有分支
git branch -a

# 拉取远程的最新数据
git fetch

# 切换分支
git checkout [分支名]

# 删除分支
git branch -d [分支名]

Golang环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看
go env

# 帮助
go help env
go env -h


# 变更的值
go env -changed

# 设置
go env -w GOOS=linux

# 恢复默认值
go env -u GOOS

初始化项目

1
2
go help mod
go mod init <module-name>

From Java to Go

package

Java的package是命名空间,用.分隔,并且源代码的组织(文件路径)是跟package对应。

Go也是用package来组织源代码,是module+源代码路径+package这样一种组织方式。其中module是由go mod init生成,记录在go.mod中。然后是源代码路径,顶层跟go.mod同级,最后在同一个路径下再用package来区分。

0%