健康一贴灵,专注医药行业管理信息化

qwen3-0.6B初探

一个标准的 Hugging Face / ModelScope 模型文件夹通常包含以下几类文件,它们各自扮演着不同的角色:
  • 模型权重文件(大脑本体)
    • model.safetensors (1.39G):这是模型真正的“知识”所在。它是一个二进制文件,里面存储了模型训练好的所有参数(权重)。safetensors 是目前推荐的格式,因为它比传统的 .bin 格式加载速度更快,且更安全。
  • 模型架构与配置文件(说明书)
    • config.json:模型的“架构说明书”。它定义了模型长什么样、怎么运行,比如包含多少层、隐藏层维度、注意力头数等核心参数。没有它,代码就不知道如何搭建模型。
    • generation_config.json:模型生成文本时的“行为规则”。它包含了默认的生成参数,比如温度(temperature)、最大生成长度等,控制着模型回答时的风格。
  • 分词器文件(翻译官)
    • tokenizer.json / tokenizer_config.json:分词器的核心配置和词表。它们的作用是将你输入的自然语言(文字)转换成模型能懂的数字信号(Token ID),并在模型输出后将数字翻译回文字。
    • merges.txt:定义了分词的合并规则,配合词表实现 BPE(字节对编码)分词算法。
  • 辅助与元数据文件
    • README.md:模型的使用说明文档,通常包含模型的用途、限制、使用示例和版权信息。
    • LICENSE:许可证文件,说明该模型的使用条款(例如 Qwen3 系列通常遵循 Apache 2.0 协议,允许免费商用)。

为什么代码里没写路径,它还能找到模型?

在之前的代码中,我们写的是 model_name="Qwen/Qwen3-0.6B"
这就像你在网购平台搜索商品一样:
  • 如果你只输入商品名(Qwen/Qwen3-0.6B),系统会默认去网上的大仓库(ModelScope 或 Hugging Face)帮你下载。
  • 如果你把本地文件夹的绝对路径(比如 D:/my_models/Qwen3-0.6B)填进去,系统就会直接去你的电脑硬盘里找它,不再联网下载。

如何修改代码来使用你本地下载的模型?

非常简单!你只需要把 QwenChatbot 类初始化时的默认路径,改成你电脑上存放模型的真实文件夹路径就可以了。
假设你下载的模型文件夹叫 Qwen3-0.6B,放在桌面的 models 
 
# 修改前(去网上找):
# def __init__(self, model_name="Qwen/Qwen3-0.6B"):

# 修改后(去你电脑的本地找):
class QwenChatbot:
    def __init__(self, model_name=r"D:\models\Qwen3-0.6B"):  # ⬅️ 这里换成你电脑上的真实路径
        print("🤖 机器人正在加载大脑和翻译官,请稍等...")
        # ... 后面的代码保持不变

 

附:原

# 第一步:从工具箱里拿出我们需要的工具
# AutoModelForCausalLM:这是机器人的“大脑”
# AutoTokenizer:这是机器人的“翻译官”,负责把我们的话变成机器能懂的数字
from modelscope import AutoModelForCausalLM, AutoTokenizer
import torch  # 引入 torch 库,这是用来控制机器人运行速度的“加速器”

# 第二步:定义一个机器人的“图纸”(在编程里叫“类”)
class QwenChatbot:
    # 这是机器人的“出生说明书”(初始化方法)
    # 当你第一次启动它时,它就会按照这里的步骤准备自己
    def __init__(self, model_name="Qwen/Qwen3-0.6B"):
        print("🤖 机器人正在加载大脑和翻译官,请稍等...")
        
        # 1. 加载翻译官
        self.tokenizer = AutoTokenizer.from_pretrained(model_name)
        
        # 2. 加载大脑(⚠️ 重点优化:加了 device_map="auto" 和 torch_dtype)
        # device_map="auto":意思是“请自动帮我找一台合适的电脑(或显卡)来运行我”
        # torch_dtype=torch.bfloat16:意思是“请用省内存的模式加载大脑”,这样小电脑也能跑得动!
        self.model = AutoModelForCausalLM.from_pretrained(
            model_name, 
            device_map="auto", 
            torch_dtype=torch.bfloat16
        )
        
        # 3. 让大脑进入“考试模式”(⚠️ 重点优化:加了 eval())
        # eval() 的意思是告诉大脑:“现在是回答问题时间,不要做多余的动作(比如随机忘记东西)”
        self.model.eval() 
        
        # 4. 准备一个“小本本”(历史记录),用来记住我们之前聊过什么
        self.history = []
        print("✅ 机器人准备就绪!可以开始聊天啦!\n")

    # 这是机器人的“说话功能”
    def generate_response(self, user_input):
        # 1. 把新说的话和“小本本”上的旧话拼在一起
        messages = self.history + [{"role": "user", "content": user_input}]

        # 2. 让翻译官把拼好的话,变成机器人能看懂的格式
        text = self.tokenizer.apply_chat_template(
            messages,
            tokenize=False,
            add_generation_prompt=True
        )

        # 3. 把文本变成数字(⚠️ 重点优化:把数字放到和大脑相同的电脑设备上)
        # 如果不加 .to(self.model.device),大脑和数字不在同一个房间,机器人会报错罢工哦!
        inputs = self.tokenizer(text, return_tensors="pt").to(self.model.device)
        
        # 4. 大脑开始思考并回答问题(最多想 32768 个词)
        response_ids = self.model.generate(
            **inputs, 
            max_new_tokens=32768
        )[0][len(inputs.input_ids[0]):].tolist()
        
        # 5. 把机器人想出来的数字,翻译回我们能看懂的文字
        response = self.tokenizer.decode(response_ids, skip_special_tokens=True)

        # 6. 把刚才的对话记到“小本本”上(⚠️ 重点优化:防止小本本太厚被撑爆)
        # 如果聊得太久,小本本(历史记录)超过了 10 条,我们就把最旧的一条擦掉!
        self.history.append({"role": "user", "content": user_input})
        self.history.append({"role": "assistant", "content": response})
        
        # 如果历史记录超过 20 个(也就是 10 轮对话),就删掉最早的 2 个
        if len(self.history) > 20:
            self.history = self.history[2:] 

        # 7. 把机器人的回答交给你
        return response

# 第三步:启动机器人!(只有直接运行这个文件时,下面的代码才会执行)
if __name__ == "__main__":
    # 1. 制造一个机器人
    chatbot = QwenChatbot()

    # 2. 问它第一个问题(默认开启深度思考模式)
    user_input_1 = "How many r's in strawberries?"
    print(f"👦 你: {user_input_1}")
    response_1 = chatbot.generate_response(user_input_1)
    print(f"🤖 机器人: {response_1}")
    print("-" * 30)

    # 3. 问它第二个问题,并加上 /no_think 标签
    # 意思是:“这个问题很简单,你不用深度思考,直接回答我!”
    user_input_2 = "Then, how many r's in blueberries? /no_think"
    print(f"👦 你: {user_input_2}")
    response_2 = chatbot.generate_response(user_input_2)
    print(f"🤖 机器人: {response_2}") 
    print("-" * 30)

    # 4. 问它第三个问题,并加上 /think 标签
    # 意思是:“这个问题很难,请你开启深度思考模式,仔细想一想再回答!”
    user_input_3 = "Really? /think"
    print(f"👦 你: {user_input_3}")
    response_3 = chatbot.generate_response(user_input_3)
    print(f"🤖 机器人: {response_3}")

 

posted @ 2026-06-18 09:16  一贴灵  阅读(11)  评论(0)    收藏  举报
学以致用,效率第一