当前位置: 首页 > article >正文

大模型应用:多轮对话(prompt工程)

概述

在与大型语言模型(如ChatGPT)交互的过程中,我们常常体验到与智能助手进行连贯多轮对话的便利性。那么,当我们开启一个新的聊天时,系统是如何管理聊天上下文的呢?

一、初始上下文的建立

1. 创建新会话

当用户开启一个新的聊天时,应用程序后端会为该对话创建一个独立的会话(session),并分配一个唯一的会话ID。这确保了每个对话都是独立的,防止不同对话之间的混淆。

2. 系统提示的引入

在新会话的开始,系统会向模型提供一段隐藏的系统提示(System Prompt)。这段提示用于设定模型在整个对话中的角色、语气和行为准则。例如:

  • 角色设定:让模型扮演助理、教师、技术专家等特定身份。
  • 语言风格:规定回复使用正式、友好、幽默等特定语气。
  • 行为准则:避免生成不适当内容,遵守伦理规范。

系统提示对用户是不可见的,但对模型的回复有着深远影响,它确保了模型在整个对话过程中保持一致的行为。

二、上下文的积累与管理

1. 对话历史的记录

随着用户与模型的交互进行,系统会将每一次的用户输入和模型回复按照时间顺序累积,形成当前会话的消息队列。这使得模型在生成回复时,可以参考之前的对话内容,保持连贯性和一致性。

2. 上下文窗口的限制

大型语言模型在处理输入时,有一个固定的上下文窗口(Context Window),表示模型一次能处理的最大文本长度。例如,GPT-3的上下文窗口为4096个Token。

当对话长度超过上下文窗口时,系统需要对输入进行截断。为了确保模型继续遵循最初的系统提示,应用程序会:

  • 优先保留系统提示:系统提示始终位于输入的开头,不被截断。
  • 截断早期对话:从最早的用户和模型对话开始移除,保留最近的交互内容。

3. 上下文组装

在生成回复时,应用程序会将以下内容按顺序拼接,形成当前的输入上下文:

  1. 系统提示:设定模型行为的隐藏指令。
  2. 重要信息:用户提供的关键数据或参数(如果有)。
  3. 最近的对话历史:包括最近几轮的用户输入和模型回复。

通过这种方式,模型能够在一次交互中获得必要的上下文信息,生成符合预期的回复。

三、系统提示的重要作用

1. 保证模型行为一致性

由于模型在每次生成回复时,只能参考当前的输入文本,因此系统提示需要在每次输入中提供,确保模型始终按照设定的角色和风格进行回复。

2. 防止不当内容生成

系统提示中包含的行为准则和禁止事项,有助于模型避免生成不合规或不适当的内容,提升对话的安全性和可靠性。

3. 提高用户体验

通过精心设计的系统提示,模型能够更好地理解用户意图,提供高质量、个性化的回复,提升用户的交互体验。

四、技术实现细节

1. 会话管理

  • 创建会话ID:为每个新对话分配唯一的会话ID,用于区分不同用户的会话。
  • 状态跟踪:记录每个会话的状态信息,便于后续的上下文管理。

2. 消息队列维护

  • 记录交互内容:保存当前会话中的所有用户输入和模型回复。
  • 长度检查:在发送给模型之前,检查输入的总长度,确保不超过上下文窗口限制。

3. 上下文优化

  • 截断策略:当超过上下文窗口限制时,从早期对话开始移除内容。
  • 摘要处理:对于重要但较早的内容,通过生成摘要的方式保留关键信息。

五、模型与应用的职责划分

需要明确的是,大型语言模型本身并不具备会话管理、消息队列维护或上下文组装的能力。这些功能由应用程序在模型之上实现。具体来说:

  • 模型的职责:根据输入生成下一段文本。
  • 应用的职责:管理对话上下文、用户会话、内容过滤等。

通过合理的职责划分,应用程序能够充分发挥模型的能力,提供丰富多样的应用场景。

六、用户数据的安全与隐私

  • 独立的会话:每个新对话都是独立的,模型不会记住之前会话中的信息,保护用户隐私。
  • 数据限制:用户的输入和模型的回复都严格限定在当前会话内,不会跨会话传播。

七、总结

大型语言模型在新聊天中管理上下文,主要通过以下方式实现:

  1. 创建新会话,重置上下文:确保每个对话的独立性。
  2. 使用系统提示:设定模型的角色、风格和行为准则,确保模型行为一致。
  3. 维护消息队列:记录对话历史,供模型参考,提高回复的连贯性。
  4. 上下文管理:在上下文窗口限制内,优化输入内容,保证模型有效处理。

示例

使用多轮会话示例代码

下面的代码,演示如何在代码中实现与大型语言模型的多轮对话。我们将引入一个循环,允许用户多次输入,并维护会话的上下文,使模型的回复能够参考之前的对话内容。

代码

import torch
import logging
from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor
from qwen_vl_utils import process_vision_info# 设置日志配置,包含Transformers库的日志
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',level=logging.INFO  # 设置全局日志级别为INFO,避免过多日志输出
)
# 获取Transformers库的logger并设置级别为INFO
transformers_logger = logging.getLogger('transformers')
transformers_logger.setLevel(logging.INFO)# 设置模型缓存目录
cache_dir = '/data/model/'# 加载模型,启用GPU加速
model = Qwen2_5_VLForConditionalGeneration.from_pretrained("Qwen/Qwen2.5-VL-3B-Instruct",torch_dtype=torch.bfloat16,attn_implementation="sdpa",device_map="auto",cache_dir=cache_dir
)
logging.info("模型已加载到设备:%s,使用attn_implementation='sdpa'", model.device)# 设置视觉令牌范围以平衡性能和成本
min_pixels = 256 * 28 * 28
max_pixels = 1280 * 28 * 28# 加载处理器
processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-3B-Instruct",min_pixels=min_pixels,max_pixels=max_pixels,cache_dir=cache_dir
)
logging.info("处理器已加载,设置了自定义的视觉令牌范围。")# 初始化消息内容列表,包含系统提示(可选)
messages = [# 可以添加系统提示,设定模型的行为{"role": "system","content": [{"type": "text", "text": "你是一位友好的智能助手,乐于回答用户的问题并提供帮助。"},],}
]# 多轮会话循环
while True:user_input = input("用户:")if user_input.lower() in ['退出', 'exit', 'quit']:print("结束对话。")break# 将用户输入添加到消息列表messages.append({"role": "user","content": [{"type": "text", "text": user_input}]})# 准备推理输入logging.info("开始准备推理输入...")text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)image_inputs, video_inputs = process_vision_info(messages)inputs = processor(text=[text],images=image_inputs,videos=video_inputs,padding=True,return_tensors="pt",)inputs = inputs.to(model.device)logging.info("推理输入已准备完毕。")# 进行推理并生成输出logging.info("开始生成输出...")generated_ids = model.generate(**inputs, max_new_tokens=512)logging.info("输出生成完毕。")# 处理生成的输出generated_ids_trimmed = [out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)]output_text = processor.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]  # 取第一个元素print("助手:" + output_text.strip())# 将模型的回复添加到消息列表messages.append({"role": "assistant","content": [{"type": "text", "text": output_text.strip()}]})# 为了防止超过上下文长度限制,可以在这里检查并截断消息列表# 例如,只保留最近的n轮对话max_history = 5  # 保留最近5轮对话(可根据需要调整)# 保留系统提示加上最近的max_history*2条消息(用户和助手各一条,所以乘以2)if len(messages) > max_history * 2 + 1:  # +1是因为系统提示算一条messages = [messages[0]] + messages[-max_history*2:]logging.info("消息列表已截断,保留最近的 %d 轮对话。", max_history)

代码说明

  1. 引入多轮会话循环:使用while True循环,不断读取用户输入,实现多轮对话。

  2. 管理消息列表:使用messages列表维护对话历史,在每一轮中将用户和助手的消息添加到列表中。

  3. 处理用户退出指令:如果用户输入退出exitquit,程序将结束对话循环。

  4. 准备推理输入:在每一轮对话中,使用processor.apply_chat_template方法将messages列表转换为模型可接受的输入格式。

  5. 调用模型生成回复:使用model.generate方法生成模型的回复,并将其解码为文本。

  6. 显示模型回复并添加到对话历史:将模型的回复打印出来,并添加到messages列表中,以在后续对话中提供上下文。

  7. 管理上下文长度:为了防止超过模型的上下文窗口限制(即最大输入长度),在每轮对话后检查messages列表的长度,并截断早期的对话内容,只保留最近的max_history轮对话。

示例运行

拖到最右侧,重点看输入给大模型的messages在不断的累积

2025-02-27 04:00:07,656 - root - INFO - 处理器已加载,设置了自定义的视觉令牌范围。
用户:你好!
2025-02-27 04:00:49,596 - root - INFO - 开始准备推理输入...
2025-02-27 04:00:49,596 - root - INFO - [{'role': 'system', 'content': [{'type': 'text', 'text': '你是一位友好的智能助手,乐于回答用户的问题并提供帮助。'}]}, {'role': 'user', 'content': [{'type': 'text', 'text': '你好!'}]}]
2025-02-27 04:00:49,609 - root - INFO - 推理输入已准备完毕。
2025-02-27 04:00:49,609 - root - INFO - 开始生成输出...
2025-02-27 04:00:59,579 - root - INFO - 输出生成完毕。
助手:你好!有什么可以帮助你的吗?
用户:你能给我讲个笑话吗?
2025-02-27 04:01:11,942 - root - INFO - 开始准备推理输入...
2025-02-27 04:01:11,942 - root - INFO - [{'role': 'system', 'content': [{'type': 'text', 'text': '你是一位友好的智能助手,乐于回答用户的问题并提供帮助。'}]}, {'role': 'user', 'content': [{'type': 'text', 'text': '你好!'}]}, {'role': 'assistant', 'content': [{'type': 'text', 'text': '你好!有什么可以帮助你的吗?'}]}, {'role': 'user', 'content': [{'type': 'text', 'text': '你能给我讲个笑话吗?'}]}]
2025-02-27 04:01:11,943 - root - INFO - 推理输入已准备完毕。
2025-02-27 04:01:11,943 - root - INFO - 开始生成输出...
2025-02-27 04:01:32,729 - root - INFO - 输出生成完毕。
助手:当然可以!这是一个经典的笑话:为什么电脑经常生病?因为它的窗户(Windows)总是开着!
用户:哈哈,很有趣。再讲一个脑筋急转弯?
2025-02-27 04:02:08,591 - root - INFO - 开始准备推理输入...
2025-02-27 04:02:08,591 - root - INFO - [{'role': 'system', 'content': [{'type': 'text', 'text': '你是一位友好的智能助手,乐于回答用户的问题并提供帮助。'}]}, {'role': 'user', 'content': [{'type': 'text', 'text': '你好!'}]}, {'role': 'assistant', 'content': [{'type': 'text', 'text': '你好!有什么可以帮助你的吗?'}]}, {'role': 'user', 'content': [{'type': 'text', 'text': '你能给我讲个笑话吗?'}]}, {'role': 'assistant', 'content': [{'type': 'text', 'text': '当然可以!这是一个经典的笑话:为什么电脑经常生病?因为它的窗户(Windows)总是开着!'}]}, {'role': 'user', 'content': [{'type': 'text', 'text': '哈哈,很有趣。再讲一个脑筋急转弯?'}]}]
2025-02-27 04:02:08,592 - root - INFO - 推理输入已准备完毕。
2025-02-27 04:02:08,593 - root - INFO - 开始生成输出...
2025-02-27 04:02:34,326 - root - INFO - 输出生成完毕。
助手:好的,这个脑筋急转弯挺有趣的:什么东西越洗越脏?答案是水。
用户:谢谢你的回答
2025-02-27 04:03:03,807 - root - INFO - 开始准备推理输入...
2025-02-27 04:03:03,807 - root - INFO - [{'role': 'system', 'content': [{'type': 'text', 'text': '你是一位友好的智能助手,乐于回答用户的问题并提供帮助。'}]}, {'role': 'user', 'content': [{'type': 'text', 'text': '你好!'}]}, {'role': 'assistant', 'content': [{'type': 'text', 'text': '你好!有什么可以帮助你的吗?'}]}, {'role': 'user', 'content': [{'type': 'text', 'text': '你能给我讲个笑话吗?'}]}, {'role': 'assistant', 'content': [{'type': 'text', 'text': '当然可以!这是一个经典的笑话:为什么电脑经常生病?因为它的窗户(Windows)总是开着!'}]}, {'role': 'user', 'content': [{'type': 'text', 'text': '哈哈,很有趣。再讲一个脑筋急转弯?'}]}, {'role': 'assistant', 'content': [{'type': 'text', 'text': '好的,这个脑筋急转弯挺有趣的:什么东西越洗越脏?答案是水。'}]}, {'role': 'user', 'content': [{'type': 'text', 'text': '谢谢你的回答'}]}]
2025-02-27 04:03:03,809 - root - INFO - 推理输入已准备完毕。
2025-02-27 04:03:03,809 - root - INFO - 开始生成输出...
2025-02-27 04:03:27,048 - root - INFO - 输出生成完毕。
助手:不客气,随时欢迎你来提问!
用户:退出
结束对话。

另外多模态大模型可以支持复杂的会话messages,单次输入给大模型的输入可以如下:

conversation = [{"role": "user","content": [{"type": "image"}, {"type": "text", "text": "Hello, how are you?"}],},{"role": "assistant","content": "I'm doing well, thank you for asking. How can I assist you today?",},{"role": "user","content": [{"type": "text", "text": "Can you describe these images and video?"},{"type": "image"},{"type": "image"},{"type": "video"},{"type": "text", "text": "These are from my vacation."},],},{"role": "assistant","content": "I'd be happy to describe the images and video for you. Could you please provide more context about your vacation?",},{"role": "user","content": "It was a trip to the mountains. Can you see the details in the images and video?",},
]# default:
prompt_without_id = processor.apply_chat_template(conversation, add_generation_prompt=True
)
# Excepted output: '<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n<|im_start|>user\n<|vision_start|><|image_pad|><|vision_end|>Hello, how are you?<|im_end|>\n<|im_start|>assistant\nI'm doing well, thank you for asking. How can I assist you today?<|im_end|>\n<|im_start|>user\nCan you describe these images and video?<|vision_start|><|image_pad|><|vision_end|><|vision_start|><|image_pad|><|vision_end|><|vision_start|><|video_pad|><|vision_end|>These are from my vacation.<|im_end|>\n<|im_start|>assistant\nI'd be happy to describe the images and video for you. Could you please provide more context about your vacation?<|im_end|>\n<|im_start|>user\nIt was a trip to the mountains. Can you see the details in the images and video?<|im_end|>\n<|im_start|>assistant\n'# add ids
prompt_with_id = processor.apply_chat_template(conversation, add_generation_prompt=True, add_vision_id=True
)
# Excepted output: '<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n<|im_start|>user\nPicture 1: <|vision_start|><|image_pad|><|vision_end|>Hello, how are you?<|im_end|>\n<|im_start|>assistant\nI'm doing well, thank you for asking. How can I assist you today?<|im_end|>\n<|im_start|>user\nCan you describe these images and video?Picture 2: <|vision_start|><|image_pad|><|vision_end|>Picture 3: <|vision_start|><|image_pad|><|vision_end|>Video 1: <|vision_start|><|video_pad|><|vision_end|>These are from my vacation.<|im_end|>\n<|im_start|>assistant\nI'd be happy to describe the images and video for you. Could you please provide more context about your vacation?<|im_end|>\n<|im_start|>user\nIt was a trip to the mountains. Can you see the details in the images and video?<|im_end|>\n<|im_start|>assistant\n'

注意事项

  • 上下文长度限制:大型语言模型对输入文本的长度是有最大限制的(例如4096个Token)。在实际应用中,需要根据模型的实际限制,调整max_history的值,或者采用更加复杂的截断和摘要策略。

  • 视觉信息处理:示例代码中包含了对图像和视频输入的处理。如果当前对话不涉及图像或视频,可以简化相关处理,或者在需要时动态地添加图像或视频信息到messages中。

  • 系统提示的作用:在messages列表中添加"role": "system"的消息,可以设定模型的整体行为和风格。系统提示通常只需在对话开始时添加一次,后续对话中无需重复。

  • 日志级别设置:为了避免过多的日志输出,将全局日志级别从DEBUG调整为INFO。根据需要,可以进一步调整日志级别。

  • 模型性能与资源:运行此代码需要具备支持相应模型大小的计算资源(例如GPU内存)。在实际应用中,根据硬件条件选择合适的模型规模。

相关文章:

大模型应用:多轮对话(prompt工程)

概述 在与大型语言模型&#xff08;如ChatGPT&#xff09;交互的过程中&#xff0c;我们常常体验到与智能助手进行连贯多轮对话的便利性。那么&#xff0c;当我们开启一个新的聊天时&#xff0c;系统是如何管理聊天上下文的呢&#xff1f; 一、初始上下文的建立 1. 创建新会…...

4.3MISC流量分析练习-wireshark-https

流量分析题目的例题 1.了解wireshark的过滤方式 2.了解tls跟ssl协议基本还原 3.了解xor基本变换方式&#xff0c;获取flag 附件是一个流量包&#xff0c;打开之后有各种流量&#xff0c;但是分析无果&#xff0c;然后丢到kali中使用binwalk进行分析&#xff0c;发现有一个r…...

【AGI】DeepSeek开源周:The whale is making waves!

DeepSeek开源周&#xff1a;The whale is making waves&#xff01; 思维火花引言一、DeepSeek模型体系的技术演进1. 通用语言模型&#xff1a;DeepSeek-V3系列2. 推理优化模型&#xff1a;DeepSeek-R1系列3. 多模态模型&#xff1a;Janus系列 二、开源周三大工具库的技术解析1…...

CSS Selectors

当然&#xff0c;理解纯CSS选择器&#xff08;CSS Selectors&#xff09;对于进行UI自动化测试非常重要。CSS选择器允许您通过元素的属性、层级关系、类名、ID等来精准定位页面上的元素。下面我将详细讲解CSS选择器的常见用法&#xff0c;并结合您的需求提供具体的示例。 1. 基…...

Java Junit框架

JUnit 是一个广泛使用的 Java 单元测试框架&#xff0c;用于编写和运行可重复的测试。它是 xUnit 家族的一部分&#xff0c;专门为 Java 语言设计。JUnit 的主要目标是帮助开发者编写可维护的测试代码&#xff0c;确保代码的正确性和稳定性。 JUnit 的主要特点 注解驱动&…...

3-3 WPS JS宏 遍历文件名获取函数(遍历指定文件夹下的所有工作)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

STM32CubeMx DRV8833驱动

一、DRV8833驱动原理 ​ STBY口接单片机的IO口&#xff0c;STBY置0电机全部停止&#xff0c;置1才能工作。STBY置1后通过AIN1、AIN2、BIN1、BIN2 来控制正反转。 AIN1AIN2电机状态00停止1speed反转speed1正转11停止 其中A端&#xff08;AIN1与AIN2&#xff09;只能控制AO1与…...

用Python之requests库调用大型语言模型(LLM)API的流式输出与非流式输出比较

文章目录 1. 非流式输出与流式输出概述2. 非流式输出2.1 代码实例12.2 代码实例2 3. 流式输出3.1 流式输出的定义和作用3.2 流式输出适用的场景3.3 流式输出的实现方式与实现技术3.4 代码实例33.5 代码实例4 4. 小结 1. 非流式输出与流式输出概述 大模型收到输入后并不是一次性…...

【Qt】ffmpeg照片提取、视频播放▲

目录 一、图像的成像原理&#xff1a; RGB成像原理&#xff1a; YUV成像原理&#xff1a; 二、多线程 三、ffmpeg解码&#xff08;照片提取&#xff09; 1.准备工作 &#xff08;1&#xff09;在工程文件夹里面新建三个文件夹 &#xff08;2&#xff09;在main函数中加…...

Vue+Elementui 全局配置el-table表格列宽可拖拽

1、需求分析 如何让表格列宽可以拖动 elementui的el-table如果想要列宽可以拖动的话 有一个属性叫 border 在模板里添加这个属性即可实现 但是系统里面的表格我不可能一个一个去添加border太麻烦 如果能够全局配置岂不是非常省时间吗 我们在main.js里面通过全局混入的方式来…...

SQL命令详解之增删改数据

目录 简介 1 添加数据 1.1 基础语法 1.2 SQL 练习 2 修改数据 2.1 基础语法 2.2 SQL 练习 ​3 删除数据 3.1 基础语法 3.2 SQL 练习 总结 简介 在数据库操作中&#xff0c;增、删、改是最基础的操作&#xff0c;它们通常对应着SQL中的INSERT、DELETE和UPDATE命令。…...

鸿蒙开发第4篇__关于在鸿蒙应用中使用Java语言进行设计

本博文对于鸿蒙APP程序员来说&#xff0c;很重要 HarmonyOS从 API8 开始不再支持使用Java作为开发语言&#xff0c;未来的新功能将在ArkTS中实现. API 8对应的是HarmonyOS 3.0.0版本, 2022年7月27日&#xff0c; 华为发布了HarmonyOS 3.0。 请看下图&#xff1a; 因此&#…...

Linux三种网络方式

前言 发现运维啥都得会&#xff0c;这周就遇到了网络问题自己无法解决&#xff0c;因此痛定思痛学一下。 参考文献 你管这破玩意叫网络&#xff1f; 桥接模式、NAT模式、仅主机模式&#xff0c;原来是这样工作的 交换机 构成局域网&#xff0c;实现所有设备之间的通信。 …...

计算机网络之传输层(传输层提供的服务)

一、可靠的数据传输 传输层提供可靠的数据传输服务&#xff0c;确保数据在传输过程中不丢失、不重复、不乱序&#xff0c;并且能够被正确接收。这通常通过面向连接的协议&#xff08;如TCP&#xff09;来实现&#xff0c;TCP通过确认、重传、序号等机制来保证数据传输的可靠性…...

Ubuntu 防火墙iptables和 ufw

文章目录 iptables 和 ufw 的区别Ubuntu 上使用 ufw 配置 iptables 和 ufw 的区别 iptables 和 ufw 是 Linux 系统中用于管理防火墙的工具&#xff0c;但它们的设计目标和使用方式有所不同。 iptables&#xff1a;功能强大&#xff0c;适合高级用户和复杂场景&#xff0c;但配…...

11天 -- Redis 中跳表的实现原理是什么?Redis 的 hash 是什么?Redis Zset 的实现原理是什么?

Redis 中跳表的实现原理是什么&#xff1f; Redis 中的跳表&#xff08;Skip List&#xff09;是一种基于有序链表的高效数据结构&#xff0c;通过在链表上增加多级索引来提高数据的查找效率。以下是 Redis 中跳表的实现原理&#xff1a; 1. 基本概念 节点结构&#xff1a;跳…...

JavaWeb——HTML

一、什么是HTML HTML(HyperText Markup Language)&#xff1a;超文本标记语言 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息还可以定义图片&#xff0c;音频&#xff0c;视频等。标记语言&#xff1a;由标签构成的语言 HTML语言都是预定义好…...

Spring DIIoC

一.IoC 1.简介 什么是IoC&#xff1f;IoC&#xff0c;全称 Inversion of Control&#xff0c;控制反转。IoC是Spring的核心思想&#xff0c;Spring是⼀个“控制反转”的容器。 如果我们需要一个对象&#xff0c;正常来说我们是通过new一个对象&#xff0c;这个时候我们依赖的…...

【前端基础】Day 2 CSS层叠样式表

目录 1.CSS简历 2.CSS 基础选择器 2.1标签选择器 2.2类选择器 2.3 id选择器 2.4通配符选择器 2.5总结 3.CSS字体属性 字体属性总结 4.CSS文本属性 4.1颜色 4.2对齐文本 4.3装饰文本 4.4文本缩进 4.5行间距 4.6文本属性总结 5.CSS的引入方式 5.1内部样式表 …...

建易WordPress

建易WordPress是一家专业的WordPress建站服务提供商&#xff0c;专注于为企业和个人提供一站式的WordPress网站建设、维护、托管、运营推广以及搜索引擎优化(SEO)服务。 服务内容 1. 网站建设 提供模板建站和定制开发两种服务&#xff0c;满足不同客户的需求。模板建站价格为…...

计算机毕业设计SpringBoot+Vue.js汽车资讯网站(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

nuxt常用组件库html-validator、@nuxtjs/i18n、@nuxt/image、@unocss/nuxt使用解析

html-validator 主要用于自动验证nuxt服务器呈现的HTML(SSR和SSG)&#xff0c;以检测可能导致水合错误的HTML常见问题&#xff0c;有助于减少水合错误&#xff0c;检测常见的可访问性错误。 安装 npx nuxilatest module add html-validator配置 若自动更新nuxt.config.ts配置文…...

Leetcode-最大矩形(单调栈)

一、题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 输入&#xff1a;matrix [["1","0","1","0","0"],["1","0&…...

Vue核心知识:动态路由实现完整方案

在Vue中实现动态路由&#xff0c;并结合后端接口和数据库表设计&#xff0c;是一个复杂的项目&#xff0c;需要多个技术栈和步骤的配合。以下将详细描述整个实现过程&#xff0c;包括数据库设计、后端接口设计、前端路由配置以及如何实现动态路由的功能。 目录 一、需求分析二…...

【Docker】使用Docker搭建-MySQL数据库服务

零、更换Docker镜像源 因为国内现在封锁了Docker默认拉取镜像的站点&#xff08;DockerHub&#xff09;&#xff0c;而且国内大部分Docker镜像站已全部下线&#xff0c;导致现在很多朋友在拉取镜像的时候会出现无法拉取的现象&#xff0c;这时候就需要进行更换Docker镜像源。 可…...

DHCP配置和地址

DHCP&#xff1a;动态主机配置协议 DHCP系统组成 DHCP报文结构 DHCP报文类型 DHCP工作流程 DHCP租期更新 DHCP重绑定 自动保留IP 租期设置建议 IP地址释放 DHCP地址池 DHCP配置 DHCP接口地址池配置 DHCP全局地址池配置...

基于trl复现DeepSeek-R1的GRPO训练过程

1. 引入 huggingface开发了强化学习训练Transformer的库trl&#xff08;参考3&#xff09;&#xff0c;借助这个trl&#xff0c;可以用来做GRPO的强化学习训练。魔搭ModelScope社区的文章&#xff08;参考2&#xff09;给出了基于Qwen基座模型Qwen2.5-0.5B-Instruct&#xff0…...

常用的 pip 命令

pip 是 Python 的包管理工具&#xff0c;可用于安装、卸载、更新和管理 Python 包。以下是一些常用的 pip 命令&#xff1a; 1. 安装包 安装最新版本的包 pip install package_namepackage_name 是你要安装的 Python 包的名称&#xff0c;例如 pip install requests 可以安装…...

基于C#的CANoe CLR Adapter开发指南

一、引言 CANoe 是一款广泛应用于汽车电子开发和测试的工具&#xff0c;它支持多种编程接口&#xff0c;方便开发者进行自定义扩展。CANoe CLR Adapter 允许我们使用 C# 语言与 CANoe 进行交互&#xff0c;充分利用 C# 的强大功能和丰富的类库。本文将详细介绍如何基于 C# 进行…...

eMMC安全简介

1. 引言 术语“信息安全”涵盖多种不同的设计特性。一般而言&#xff0c; 信息安全是指通过实践防止信息遭受未经授权的访问、使用、披露、中断、篡改、检查、记录或销毁。 信息安全的三大核心目标为 机密性&#xff08;Confidentiality&#xff09;、完整性&#xff08;Integr…...