思有所皈,绪有所依

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

https://liaoxuefeng.com/books/python/first-program/input-output/index.html

  1. windows下运行python需要在powershell中运行,不能在cmd中运行。
  2. 交换模式的退出是exit()。
  3. 字符串可以用单引号或者双引号括起来。
  4. 2的10次方: 2**10。
  5. 为了方便计数,Python的数字允许用_来隔开。比如1000000000000可以写成1_000_000_000_000。0x1020304写成0x1020_3040。
  6. list: l = [1, 2, 3, ‘a’], tuple: t = (1, 2, 3), tuple是不可变的list,1个元素的tuple要加逗号: t = (1,)。
  7. 条件判断:if … elif … else …
  8. 模式匹配: match … case …
  9. dict: d = {‘a’: 1, ‘b’: 2}, set: s = {1, 2, 3}

  1. 安装Miniconda
    官网 下载Miniconda,Windows安装包执行后是图形界面,这里就不赘述了。

  2. 配置环境变量
    将conda.exe所在目录添加到环境变量Path中。

  3. 创建虚拟环境

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    conda create -n main python=3.10 # 创建名为main的虚拟环境,并指定python版本为3.10
    conda activate main # 切换到main环境
    conda install pip
    pip install -r requirements.txt
    conda deactivate

    activate # 切换到base环境
    conda env list # 列出conda管理的所有环境
    conda list # 列出当前环境的所有包
    conda install requests # 安装requests包
    conda remove requests # 卸载requets包
    conda remove -n main --all # 删除main环境及下属所有包
    conda update requests # 更新requests包
    conda env export > environment.yaml # 导出当前环境的包信息
    conda env create -f environment.yaml # 用配置文件创建新的虚拟环境

Eureka Moment (源自阿基米德发现浮力定律时的经典感叹,常用来形容突然的灵感或领悟)

太初有为

《圣经·约翰福音》开篇的“太初有道”(拉丁语:In principio erat Verbum)强调世界的本源是理性、语言或神圣秩序。而歌德的《浮士德》一书中,浮士德在翻译《约翰福音》时进行了改动,将“太初有道”改为“太初有为”,表明他对抽象理论的不满,转而强调实践和行动的意义。

浮士德精神是一种对自我永不满足,不断进取的精神,正如同中国《易经》所说的“天行健,君子以自强不息”。

这最初是歌德的《浮士德》中的观点,后来因为维特根斯坦的不断引用,变得更加有名了。世界上的事,要做了才有结果。你看了再多养花的书,不去刨个坑,种上一株花,就永远不知道其中的艰难,当然也就闻不到花的芳香。
吴军来信2|第146封信|智能时代很多人的一个大问题:假努力

供给侧思维

建立供给侧思维,更多地输出,过更积极主动的人生。

万维钢.精英日课6|问答:怎么找到自己的天赋

阿里云百炼简介

阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。不论是开发者还是业务人员,都能深入参与大模型应用的设计和构建。您可以通过简单的界面操作,在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
0%