Hello-Agents task2 大语言模型基础
参考链接:hello-agents/docs/chapter3 at main · datawhalechina/hello-agents
N-gram模型(马尔科夫假设)---词出现的概念与前面有关的n-1个词有关。
局限性:数据稀疏性---没出现就没没关系吗?,泛化能力---坤哥和太美
词向量化:一个语义空间,每个点就是一个词,这个点就是向量,该向量称为词向量(词嵌入)语义相关的词在空间上也挨着近。下个词出现的概率与前n-1个词向量有关。
局限性:上下问能力受限,受限于前n-1个词向量
RNN:通过记录隐藏状态向量,拥有短暂的记忆。
局限性:长时间向后传播时,就会梯度爆炸或消失。
LSTM:引入细胞状态和一些门控制机制,来顺畅传递信息与决定哪些输入或输出。
局限性:按顺序进行处理。
Transformer
编码器:理解句子,生成向量
解码器:参考前文生成句子,并咨询编码器理解句子
自注意力:提出权重的概念,QKV,在整个序列中动态聚合相关信息。前馈网络的作用从这些聚合后的信息中提取更高阶的特征
Decode-Only
GPT的核心,预测下一个最优可能出现的词。自回归的工作模式。掩码注意力确保不会先看后面的词。
优势:简单易用可扩展,适合生成式任务。
提示工程
可以通过零样本,单/少量样本让模型进行输出。(自学习,给一个例子自己扩展,多个几个例子自己举一反三)
指令调优也是一种微调的手段,目前是引导,规范,约束模型生成正常目标的方法,可以提示(nice to meet your,下一句你懂得);cosplay,cot(一步一步来)
分词器相关操作查看代码就可以,很详细。这里贴出自己的代码
改动点:1.下载改为https://hf-mirror.com/ 2.模型改为qwen3:0.6b
修改下载链接和生效参考
https://zhuanlan.zhihu.com/p/1940410590507037577
完整代码
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer# 指定模型ID
model_id = "Qwen/Qwen3-0.6B"# 设置设备,优先使用GPU
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using device: {device}")# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_id)# 加载模型,并将其移动到指定设备
model = AutoModelForCausalLM.from_pretrained(model_id).to(device)print("模型和分词器加载完成!")messages = [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "冰雪大世界在哪个城市"}
]# 使用分词器的模板格式化输入
text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)# 编码输入文本
model_inputs = tokenizer([text], return_tensors="pt").to(device)print("编码后的输入文本:")
print(model_inputs)# 使用模型生成回答
# max_new_tokens 控制了模型最多能生成多少个新的Token
generated_ids = model.generate(model_inputs.input_ids,max_new_tokens=512
)# 将生成的 Token ID 截取掉输入部分
# 这样我们只解码模型新生成的部分
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]# 解码生成的 Token ID
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]print("\n模型的回答:")
print(response)
输出
Using device: cuda
模型和分词器加载完成!
编码后的输入文本:
{'input_ids': tensor([[151644, 8948, 198, 2610, 525, 264, 10950, 17847, 13,151645, 198, 151644, 872, 198, 106957, 26288, 99489, 18493,104673, 99490, 151645, 198, 151644, 77091, 198]],device='cuda:0'), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1]], device='cuda:0')}
The attention mask is not set and cannot be inferred from input because pad token is same as eos token. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.模型的回答:
<think>
好的,用户问的是“冰雪大世界在哪个城市”。首先,我需要确定用户指的是哪个著名的冰雪大世界。在中国,最著名的冰雪大世界应该是在哈尔滨。不过,用户可能没有明确说出,所以需要确认是否还有其他可能。接下来,我应该考虑用户可能的背景。可能是游客、学生,或者对冰雪运动感兴趣的人。用户可能想知道具体的地点,或者有其他问题需要解答。需要确保回答准确,并且提供足够的信息帮助用户解决问题。此外,用户可能没有意识到冰雪大世界的存在,所以需要明确指出哈尔滨是正确的答案。同时,可以补充其他可能的地点,但保持回答简洁。要避免提供错误的信息,确保用户得到正确的答案。
</think>中国的著名冰雪大世界位于**哈尔滨市**。
最后说下模型的选择,一般是基于:成本,安全与隐私,能力,生态链,微调等这些考虑选择。
同时幻觉是模型自带的属性,模型一直都会自己以为自己行的。解决的话可以从数据层,推理层,模型架构方向考虑改进。
