ai的奇幻漂流

写在前面

​ 在大学的时候,我一直对机器学习、人工智能之类的课程不怎么喜欢。一部分原因是授课老师讲的过于无聊,更重要的原因是ai存在明显的不确定性。当执行一段C语言代码时,再怎么样程序的功能都是可被理解的,你对于一行代码执行后会有什么样的表现拥有基本的预期,尽管存在多线程、内核抢占、编译优化、CPU乱序发射,底层硬件故障等一些不确定性,但你对它们的存在也是了解的,至少可以假装认为自己了解。但ai的执行结果就完全是个谜了,机器学习中的一系列参数的含义完全未知,为什么这个参数比较好,那个参数比较差,本身就很难彻底说明白,因此当时我们都叫搞ai的叫太白金星,整天炼丹调参。

​ 之前的程序都是从原理上,从逻辑上,从结构上仔细地拆分,解决问题;但ai看起来是直接从结果上来解决问题。从一个强大的模型、神经网络开始,尝试解决这个问题并计算结果的准确程度,然后一直往更加准确的方向前进。但这种方式的问题是:即使ai对一个问题的准确度一直是100%,也无法确保下一次同类型问题同样正确,虽然非ai方法也不一定真的能保证完全正确,但由于对“底层原理”的偏执, 我还是更加喜欢非ai的范式,猜字谜”的行为模式本身并不能说服我。

​ 但在2026年的这个时刻,不得不承认的事实就是:ai一定会改变世界!之前使用chatgpt、qwen等一些对话模型时,虽然能感觉到ai很强大,但没有那种惊叹的感觉(我好像非常喜欢用感觉这两个字)。直到我使用cursor生成前后端页面,我本来只是随便写一个简短的提示词试一试,后续再研究研究如何修改,毕竟在大学的时候我还是用过一段时间的vue,没想到它生成代码后就能执行运行,而且结果完全符合我的预期,这个时刻我就知道,我过几年就要被ai取代掉了,至少过几年后,我就完全不需要自己写代码了,是不是所有人到头来都是提示词工程师?最近的几个月, 我已经不怎么自己写代码了, 都是让ai生成后直接用(实际上没怎么review),这也带来很大的不确定性,但目前看起来没出什么问题,所以整个系统就是建立在不确定性之上的? 我从之前的如何写好一段代码变成了如何写好一段提示词,希望我后面能学会如何review一段ai代码,完全放飞也不太好(#^.^#)

​ 计算机领域好像只有ai可以称得上改变世界,如果说“SSD改变了世界!存储改变了世界!Linux改变了世界!”都有点违和,但ai

与一个伟大的技术挂钩

与改变世界的技术挂钩

黑客

伦理

与人类的区别

冯洛伊曼架构

绝对正确的无聊

ai味

推荐阅读/观看

莱姆狂想曲—泥人十四

时空奇旅

机器人之梦(封面)

ps:使用小写的ai感觉更加亲切,随和,大写的AI就更加刻板,严肃,官方。一个小发现~

初见

RAG、提示词工程、上下文工程、token、mcp、fuction call、skills、ai agent、agi、训练与推理、asi等一些花里胡哨的词汇

上下文压缩与遗忘

第一步:购买云服务器部署一个模型进行一次对话

购买 ecs.gn6v-c8g1.4xlarge实例,选择Alibaba Cloud Linux 3.2104 LTS 64位 预装NVIDIA GPU驱动和 CUDA,配置密钥对后通过vscode远程登录

安装依赖包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 升级python版本
[root@iZbp1bzvlb6th4j2vwt9taZ ~]# python --version
Python 3.11.13

# 创建虚拟环境(推荐)
python -m venv qwen-env
source qwen-env/bin/activate

# 升级 pip 并安装依赖
pip install --upgrade pip
# 安装 PyTorch(使用阿里云 PyTorch 镜像)
pip install torch torchvision torchaudio \
--index-url https://mirrors.aliyun.com/pytorch-wheels/cu121/ \
--extra-index-url https://mirrors.aliyun.com/pypi/simple/ \
--trusted-host mirrors.aliyun.com

# 安装其他包(使用阿里云 PyPI 镜像)
pip install transformers accelerate bitsandbytes sentencepiece \
--index-url https://mirrors.aliyun.com/pypi/simple/ \
--trusted-host mirrors.aliyun.com

运行demo

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# -*- coding: utf-8 -*-
"""
Qwen2.5-7B-Instruct 4-bit 量化推理示例(完整注释版)
功能:加载通义千问 7B 指令微调模型,进行一次对话生成
适用环境:Linux + CUDA + 双 Tesla V100(16GB×2)
"""

# ==============================
# 第一部分:导入必要库
# ==============================

# 从 Hugging Face Transformers 库导入核心组件
from transformers import (
AutoTokenizer, # 自动加载与模型匹配的分词器
AutoModelForCausalLM, # 自动加载因果语言模型(用于文本生成)
BitsAndBytesConfig # 配置 bitsandbytes 4-bit/8-bit 量化参数
)

# 导入 PyTorch 深度学习框架(用于张量计算和 GPU 加速)
import torch


# ==============================
# 第二部分:模型配置
# ==============================

# 指定 Hugging Face Hub 上的模型 ID(使用 Qwen 官方发布的指令微调版本)
model_id = "Qwen/Qwen2.5-7B-Instruct"

# 配置 4-bit 量化参数(显著降低显存占用,适合单卡 V100 运行 7B 模型)
quantization_config = BitsAndBytesConfig(
load_in_4bit=True, # 启用 4-bit 量化(权重压缩至 4 位)
bnb_4bit_compute_dtype=torch.bfloat16 # 计算时临时提升为 bfloat16 精度(V100 支持),平衡速度与精度
# 注:若 GPU 不支持 bfloat16(如 10 系列),可改为 torch.float16
)


# ==============================
# 第三部分:加载分词器与模型
# ==============================

# 加载分词器(tokenizer)
# - trust_remote_code=True:Qwen 使用了自定义 tokenizer 逻辑,需信任远程代码
tokenizer = AutoTokenizer.from_pretrained(
model_id,
trust_remote_code=True
)

# 加载语言模型(LLM)
# - quantization_config:应用 4-bit 量化配置
# - device_map="auto":自动将模型分配到可用 GPU(双 V100 会智能切分或单卡加载)
# - trust_remote_code=True:Qwen 模型结构有自定义实现,必须启用
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=quantization_config,
device_map="auto",
trust_remote_code=True
)

# ✅ 此时模型已加载到 GPU,显存占用约 6–8 GB(4-bit 量化后)


# ==============================
# 第四部分:构造对话输入
# ==============================

# 定义对话历史(采用 ChatML 格式,Qwen 官方推荐)
messages = [
{"role": "system", "content": "You are a helpful assistant."}, # 系统角色设定
{"role": "user", "content": "你好!请介绍一下你自己。"} # 用户提问
]

# 使用 tokenizer 的聊天模板将 messages 转换为模型可识别的字符串
# - tokenize=False:先返回原始字符串(便于调试)
# - add_generation_prompt=True:在末尾添加 "assistant\n" 提示,引导模型开始回答
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
# 示例输出(简化):
# "<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n<|im_start|>user\n你好!...<|im_end|>\n<|im_start|>assistant\n"


# ==============================
# 第五部分:分词并移至 GPU
# ==============================

# 将文本转换为 token ID 张量(PyTorch 格式)
# - return_tensors="pt":返回 PyTorch 张量(而非 list 或 TensorFlow)
inputs = tokenizer(text, return_tensors="pt")

# 将输入数据移动到模型所在的设备(通常是 GPU)
# - 避免 CPU 到 GPU 的数据传输延迟
inputs = inputs.to(model.device)


# ==============================
# 第六部分:生成模型回复
# ==============================

# 调用模型生成文本
outputs = model.generate(
**inputs, # 解包输入张量(input_ids, attention_mask)
max_new_tokens=512, # 最多生成 512 个新 token(防止无限生成)
do_sample=True, # 启用随机采样(而非贪心搜索),使输出更自然
temperature=0.7, # 控制生成随机性:值越高越 creative,越低越 deterministic
top_p=0.9 # nucleus sampling:仅从累积概率 90% 的 token 中采样,兼顾多样性与质量
# 可选:add_special_tokens=False, repetition_penalty=1.1 等
)


# ==============================
# 第七部分:后处理与输出
# ==============================

# 从完整输出中截取“新生成的部分”(去掉原始输入)
# - outputs[0]:取第一个样本(batch_size=1)
# - inputs.input_ids.shape[-1]:输入序列长度
# - [inputs.input_ids.shape[-1]:]:切片获取生成内容
response_ids = outputs[0][inputs.input_ids.shape[-1]:]

# 将 token ID 解码为人类可读文本
# - skip_special_tokens=True:过滤掉 <|im_end|> 等特殊符号,只保留干净文本
response_text = tokenizer.decode(response_ids, skip_special_tokens=True)

# 打印最终回复
print(response_text)

第一次运行需要下载模型

1
2
3
4
5
6
7
8
# 1. 安装 hf-transfer
pip install hf-transfer

# 2. 设置环境变量
export HF_ENDPOINT=https://hf-mirror.com
export HF_HUB_ENABLE_HF_TRANSFER=1

python hello.py