大模型应用:多轮对话(prompt工程)
概述
在与大型语言模型(如ChatGPT)交互的过程中,我们常常体验到与智能助手进行连贯多轮对话的便利性。那么,当我们开启一个新的聊天时,系统是如何管理聊天上下文的呢?
一、初始上下文的建立
1. 创建新会话
当用户开启一个新的聊天时,应用程序后端会为该对话创建一个独立的会话(session),并分配一个唯一的会话ID。这确保了每个对话都是独立的,防止不同对话之间的混淆。
2. 系统提示的引入
在新会话的开始,系统会向模型提供一段隐藏的系统提示(System Prompt)。这段提示用于设定模型在整个对话中的角色、语气和行为准则。例如:
- 角色设定:让模型扮演助理、教师、技术专家等特定身份。
- 语言风格:规定回复使用正式、友好、幽默等特定语气。
- 行为准则:避免生成不适当内容,遵守伦理规范。
系统提示对用户是不可见的,但对模型的回复有着深远影响,它确保了模型在整个对话过程中保持一致的行为。
二、上下文的积累与管理
1. 对话历史的记录
随着用户与模型的交互进行,系统会将每一次的用户输入和模型回复按照时间顺序累积,形成当前会话的消息队列。这使得模型在生成回复时,可以参考之前的对话内容,保持连贯性和一致性。
2. 上下文窗口的限制
大型语言模型在处理输入时,有一个固定的上下文窗口(Context Window),表示模型一次能处理的最大文本长度。例如,GPT-3的上下文窗口为4096个Token。
当对话长度超过上下文窗口时,系统需要对输入进行截断。为了确保模型继续遵循最初的系统提示,应用程序会:
- 优先保留系统提示:系统提示始终位于输入的开头,不被截断。
- 截断早期对话:从最早的用户和模型对话开始移除,保留最近的交互内容。
3. 上下文组装
在生成回复时,应用程序会将以下内容按顺序拼接,形成当前的输入上下文:
- 系统提示:设定模型行为的隐藏指令。
- 重要信息:用户提供的关键数据或参数(如果有)。
- 最近的对话历史:包括最近几轮的用户输入和模型回复。
通过这种方式,模型能够在一次交互中获得必要的上下文信息,生成符合预期的回复。
三、系统提示的重要作用
1. 保证模型行为一致性
由于模型在每次生成回复时,只能参考当前的输入文本,因此系统提示需要在每次输入中提供,确保模型始终按照设定的角色和风格进行回复。
2. 防止不当内容生成
系统提示中包含的行为准则和禁止事项,有助于模型避免生成不合规或不适当的内容,提升对话的安全性和可靠性。
3. 提高用户体验
通过精心设计的系统提示,模型能够更好地理解用户意图,提供高质量、个性化的回复,提升用户的交互体验。
四、技术实现细节
1. 会话管理
- 创建会话ID:为每个新对话分配唯一的会话ID,用于区分不同用户的会话。
- 状态跟踪:记录每个会话的状态信息,便于后续的上下文管理。
2. 消息队列维护
- 记录交互内容:保存当前会话中的所有用户输入和模型回复。
- 长度检查:在发送给模型之前,检查输入的总长度,确保不超过上下文窗口限制。
3. 上下文优化
- 截断策略:当超过上下文窗口限制时,从早期对话开始移除内容。
- 摘要处理:对于重要但较早的内容,通过生成摘要的方式保留关键信息。
五、模型与应用的职责划分
需要明确的是,大型语言模型本身并不具备会话管理、消息队列维护或上下文组装的能力。这些功能由应用程序在模型之上实现。具体来说:
- 模型的职责:根据输入生成下一段文本。
- 应用的职责:管理对话上下文、用户会话、内容过滤等。
通过合理的职责划分,应用程序能够充分发挥模型的能力,提供丰富多样的应用场景。
六、用户数据的安全与隐私
- 独立的会话:每个新对话都是独立的,模型不会记住之前会话中的信息,保护用户隐私。
- 数据限制:用户的输入和模型的回复都严格限定在当前会话内,不会跨会话传播。
七、总结
大型语言模型在新聊天中管理上下文,主要通过以下方式实现:
- 创建新会话,重置上下文:确保每个对话的独立性。
- 使用系统提示:设定模型的角色、风格和行为准则,确保模型行为一致。
- 维护消息队列:记录对话历史,供模型参考,提高回复的连贯性。
- 上下文管理:在上下文窗口限制内,优化输入内容,保证模型有效处理。
示例
使用多轮会话示例代码
下面的代码,演示如何在代码中实现与大型语言模型的多轮对话。我们将引入一个循环,允许用户多次输入,并维护会话的上下文,使模型的回复能够参考之前的对话内容。
代码
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)
代码说明
-
引入多轮会话循环:使用
while True
循环,不断读取用户输入,实现多轮对话。 -
管理消息列表:使用
messages
列表维护对话历史,在每一轮中将用户和助手的消息添加到列表中。 -
处理用户退出指令:如果用户输入
退出
、exit
或quit
,程序将结束对话循环。 -
准备推理输入:在每一轮对话中,使用
processor.apply_chat_template
方法将messages
列表转换为模型可接受的输入格式。 -
调用模型生成回复:使用
model.generate
方法生成模型的回复,并将其解码为文本。 -
显示模型回复并添加到对话历史:将模型的回复打印出来,并添加到
messages
列表中,以在后续对话中提供上下文。 -
管理上下文长度:为了防止超过模型的上下文窗口限制(即最大输入长度),在每轮对话后检查
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工程)
概述 在与大型语言模型(如ChatGPT)交互的过程中,我们常常体验到与智能助手进行连贯多轮对话的便利性。那么,当我们开启一个新的聊天时,系统是如何管理聊天上下文的呢? 一、初始上下文的建立 1. 创建新会…...
洛谷 P1601 A+B Problem(高精)详解c++
我们之前做题碰到的数据范围一般是10^9,多点会达到10^18级别,处理10^9用int就可以存下,10^18次方要用到long long,接着解决加减乘除的问题,但是当数据范围达到了10^10^6的时候,当数据的值特别⼤,…...
【云原生】Spring Cloud是什么?Spring Cloud版本介绍
什么是SpringCloud 上一章节介绍了总体的SpringCloud的总体学习章节,因为最近项目刚好需要用到SpringCloud来搭建微服务项目、所以就跟着大家一起来再学习巩固下SpringCloud的相关知识 SpringCloud是基于SpringBoot提供了一套微服务解决方案,包括服务注…...
最节省成本的架构方案:无服务器架构
无服务器架构(Serverless Architecture)是一种颠覆性的云计算执行模型,它允许开发者专注于编写和部署代码,而无需担心底层服务器基础设施的管理。这种架构以其按需付费、自动伸缩和简化部署等优势,在成本优化方面表现出…...
C++入门续集:
1. 缺省参数: 我们看我们的上图,我们可以看我们的函数Func,我们可以看到我们的函数里面的参数写的是int a 0;这个写法是我们没有见过的,我们之前在C语言里面只见到过说是函数里面会设置参数,但是参数是没有…...
线代[9]|线性代数主要内容及其发展简史(任广千《线性代数的几何意义》的附录1)
文章目录 向量行列式矩阵线性方程组二次型 向量 向量又称为矢量,最初应用与物理学。很多物理量如力、速度、位移以及电场强度、磁感应强度等等都是向量。大约公元前350年前,古希腊著名学者亚里士多德就知道了力可以表示成向量,两个力的组合作…...
C++ Primer 动态内存与智能指针
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
AI在原型设计中的革命性应用:效率与创新的双重突破
引言 在数字化转型加速的今天,产品开发周期被压缩至前所未有的程度。原型设计作为产品开发的核心环节,其效率和质量直接影响最终产品的市场竞争力。传统原型设计流程依赖人工绘制、反复修改和用户测试,耗时且成本高昂。而人工智能࿰…...
网络学习(四)HTTPS中,SSL的单向认证与双向认证
目录 一、什么是SSL?1.1 SSL 的主要功能1.2 SSL 的工作原理1.3 SSL 的核心组件1.4 SSL 的应用场景1.5 SSL 与 TLS 的区别 二、SSL 单向认证、双向认证2.1 SSL 单向认证2.2 SSL 双向认证2.3 总结:SSL 单向认证和双向认证的区别 一、什么是SSL?…...
分类任务和回归任务的区别
分类任务和回归任务是机器学习中两种常见的监督学习任务,尽管它们都属于预测性的分析,但它们的目标和应用场景存在显著的差异。 分类任务 定义:分类任务是指将输入样本映射到一个有限且离散的类别集合中的过程。目标是对数据进行分类&#…...
android接入rocketmq
一 前言 RocketMQ 作为一个功能强大的消息队列系统,不仅支持基本的消息发布与订阅,还提供了顺序消息、延时消息、事务消息等高级功能,适应了复杂的分布式系统需求。其高可用性架构、多副本机制、完善的运维管理工具,以及安全控制…...
V4L2框架基础
一、V4L2视频设备驱动基础 1.V4L2是专门为Linux设备设计的整合视频框架(其主要核心在Linux内核,相当于Linux操作系统上层的视频源捕获驱动框架)。为上层访问系统底层的视频设备提供一个统一的标准接口。V4L2驱动框架能够支持多种类型&#x…...
【微知】如何通过mlxlink查看Mellanox网卡和光模块相关的信息?( mlxlink -d 01:00.0 -m)
背景 通过mlxlink可以查看Mellanox网卡的一些链路信息和硬件信息,也可以查看所插入的光模块的一些信息。 兄弟篇通过ethtool查看的方法:如何查看Mellanox网卡上的光模块的信息? 命令 mlxlink -d 01:00.0 -mman手册介绍: 如果…...
使用pytorch和opencv根据颜色相似性提取图像
需求:将下图中的花朵提取出来。 代码: import cv2 import torch import numpy as np import timedef get_similar_colors(image, color_list, threshold):# 将图像和颜色列表转换为torch张量device torch.device(cuda if torch.cuda.is_available() el…...
HTML label 标签使用
点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签,可以使表单更加友好和易于使用,同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…...
SQL注入的分类靶场实践
前言 SQL 注入(SQL Injection)是一种常见且危险的 Web 安全漏洞,攻击者通过在输入字段中插入恶意 SQL 代码,能够绕过应用程序的验证机制,直接操纵数据库。本文将介绍 SQL 注入的分类,并通过 Pikachu 靶场进…...
用matplotlib构建BI看板:Superset插件开发实战
目录 前言:当经典可视化库遇见BI航母 一、Superset插件架构精要 1.1 核心模块解析 1.2 插件通信机制 二、开发环境准备 2.1 依赖矩阵 三、开发自定义可视化插件 3.1 插件脚手架 3.2 渲染引擎适配 四、Superset深度集成 4.1 控制面板配置 4.2 动态参数传递…...
【Linux】之【Bug】VMware 虚拟机开机 一直卡在黑屏左上角下划线闪烁界面
解决 参考: 解决Ubuntu20.04 开机黑屏光标闪烁进不去系统 Centos根目录100%解决思路 当前界面 ctrlaltf3-f6 暂时进入终端界面 df -h 查看发现根目录 磁盘空间已满 执行命令 查看当前目录占用内存明细 sudo du -h -x --max-depth1清理无用的大内存文件 或者安装…...
【练习】【链表】力扣热题100 19. 删除链表的倒数第 N 个结点
题目 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: 输入:head [1], n 1 输出&…...
SQL-labs13-16闯关记录
http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1,依然是一个登录框,POST型SQL注入 2,挂上burpsuite,然后抓取请求,构造请求判断漏洞类型和闭合条件 admin 发生了报错,根据提示闭合方式是(…...
【Linux】进程信号——信号保存和信号捕捉
文章目录 信号保存信号相关的概念信号是如何保存的呢?有关信号保存的系统调用sigprocmask信号的增删查改查看pending表验证接口 信号捕捉用户态与内核态信号捕捉流程 总结 信号保存 信号相关的概念 信号递达:指 操作系统 将一个信号(Signal…...
任务9:交换机基础及配置
CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog 一、交换机基础 交换机的概念:交换机是一种网络设备,用于连接多台计算机或网络设备,实现数据包在局域网内的快速交换。交换机基于MAC地址来转发数据包&#x…...
【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解
目录: 1.题目描述: 输入格式 输出格式 2.题解: 3.详细c代码 1.题目描述: 小明冒充 X 星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 nn 个方格。…...
深度学习R8周:RNN实现阿尔兹海默症(pytorch)
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 数据集包含2149名患者的广泛健康信息,每名患者的ID范围从4751到6900不等。该数据集包括人口统计详细信息、生活方式因素、病史、临床测量、认知和功…...
字节跳动发布 Trae AI IDE!支持 DeepSeek R1 V3,AI 编程新时代来了!
3 月 3 日,字节跳动重磅发布国内首款 AI 原生集成开发环境(AI IDE)——Trae 国内版! Trae 不只是一个传统的 IDE,它深度融合 AI,搭载 doubao-1.5-pro 大模型,同时支持DeepSeek R1 & V3&…...
智能合约安全指南 [特殊字符]️
智能合约安全指南 🛡️ 1. 安全基础 1.1 常见漏洞类型 重入攻击整数溢出权限控制缺陷随机数漏洞前后运行攻击签名重放 1.2 安全开发原则 最小权限原则检查-生效-交互模式状态机安全失败保护机制 2. 重入攻击防护 2.1 基本防护模式 contract ReentrancyGuarde…...
DeepSeek 全套资料pdf合集免费下载(持续更新)
有很多朋友都关注DeepSeek相关使用的教程资料,本站也一直持续分享DeepSeek 学习相关的pdf资料,由于比较零散,这篇文章主要就是做一个汇总,并且持续更新,让大家可以及时获取下载最新的相关DeepSeek的资料。 持续更新地…...
IDEA 接入 Deepseek
在本篇文章中,我们将详细介绍如何在 JetBrains IDEA 中使用 Continue 插件接入 DeepSeek,让你的 AI 编程助手更智能,提高开发效率。 一、前置准备 在开始之前,请确保你已经具备以下条件: 安装了 JetBrains IDEA&…...
将md格式转jupyter并运行
将md格式转jupyter并运行 有时候我们需要将这种文档以学习的形式记笔记到jupyter中(任务) 但是内容太多了,一个一个粘贴又不方便,怎么办呢? 发现直接粘贴到md中是带格式的!!! 那…...
SOUI基于Zint生成EAN码
EAN码广泛应用与欧洲的零售业。包括EAN-2、EAN-5、EAN-8和EAN-12码。分别编码 2、5、7 或 12 位数字。此外,可以使用 字符将 EAN-2 和 EAN-5 附加符号添加到 EAN-8 和 EAN-13 符号中,就像 UPC 符号一样。 EAN-8校验码计算: 从左往右奇数位的…...
StarRocks-fe工程在Cursor中不能识别为Java项目
SR简介 StarRocks 是一款高性能分析型数据库,支持实时、多维度、高并发的数据分析。本指南旨在解决在使用 VSCode 或 Cursor 开发 StarRocks 后端项目时遇到的模块识别问题。 问题描述 使用 Cursor 或 VSCode 打开 StarRocks 的后端工程 fe 时,spark-…...
AI是否能真正理解人类情感?从语音助手到情感机器人
引言:AI与情感的交集 在过去的几十年里,人工智能(AI)的发展速度令人惊叹,从简单的语音识别到如今的深度学习和情感计算,AI已经深入到我们生活的方方面面。尤其是在语音助手和情感机器人领域,AI不…...
【Linux】【网络】UDP打洞-->不同子网下的客户端和服务器通信(成功版)
【Linux】【网络】UDP打洞–>不同子网下的客户端和服务器通信(成功版) 根据上个文章的分析 问题可能出现在代码逻辑上面 我这里重新查找资料怀疑: 1 NAT映射可能需要多次数据包的发送才能建立。 2 NAT映射保存时间太短ÿ…...
【微知】如何查看Mellanox网卡上的光模块的信息?(ethtool -m enp1s0f0 看型号、厂商、生产日期等)
背景 服务器上插入的光模块经常被忽略,往往这里是定位问题最根本的地方。如何通过命令查看? 命令 ethtool提供了-m参数,m是module-info的意思,他是从光模块的eeprom中读取数据。(应该是用i2c协议读取的)…...
图论基础算法: 二分图的判定(C++)
二分图的基本概念 什么是二分图? 二分图(Bipartite Graph)是指一个图的顶点集可以被分割为两个互不相交的子集 U U U 和 V V V, 并且图中的每一条边都连接 U U U 中的一个顶点和 V V V 中的一个顶点. 换句话说, 二分图中的顶点可以被分成两组, 组内的顶点之间没有边相连…...
AI赋能校园安全:科技助力预防与应对校园霸凌
校园本应是学生快乐学习、健康成长的地方,然而,校园霸凌却成为威胁学生身心健康的隐形“毒瘤”。近年来,随着人工智能(AI)技术的快速发展,AI在校园安全领域的应用逐渐成为解决校园霸凌问题的新突破口。通过…...
PyTorch系列教程:评估和推理模式下模型预测
使用PyTorch时,将模型从训练阶段过渡到推理阶段是至关重要的一步。在推理过程中,该模型用于对以前从未见过的新数据进行预测。这种转换的一个重要方面是使用推理模式,它通过禁用仅在训练期间需要的操作来帮助优化模型的性能。 理解推理模式 …...
Linux注册进程终止处理函数
atexit() 是一个标准库函数,用于注册在进程正常终止时要调用的函数。通过 atexit(),你可以确保在程序结束时自动执行一些清理工作,比如释放资源、保存状态等。 函数原型如下: #include <stdlib.h> int atexit(void (*func…...
Lumerical INTERCONNECT 中的自相位调制 (SPM)
一、自相位调制的数学介绍 A.非线性薛定谔方程(NLSE): NLSE 是光学中的一个关键方程。它告诉我们光脉冲在具有非线性和色散特性的介质中的行为方式。该方程如下所示: i ∂A/∂z β2/2 ∂A/∂t γ|A|A 0 其中: - …...
DICOM服务中的C-STORE、 C-FIND、C-MOVE、C-GET、Worklist
DICOM服务说明 DICOM(Digital Imaging and Communications in Medicine)是一种用于处理、存储、打印和传输医学影像的标准。DICOM定义了多种服务类,其中C-STORE、C-FIND、C-MOVE和C-GET是与影像数据查询和检索相关的四个主要服务类ÿ…...
Python的pdf2image库将PDF文件转换为PNG图片
您可以使用Python的pdf2image库将PDF文件转换为PNG图片。以下是一个完整的示例,包含安装步骤、代码示例和注意事项。 安装依赖库 首先,您需要安装pdf2image库: pip install pdf2imagepdf2image依赖于poppler库来解析PDF文件。 Windows系统…...
在Blender中给SP分纹理组
在Blender中怎么分SP的纹理组/纹理集 其实纹理组就是材质 把同一组的材质分给同一组的模型 导入到sp里面自然就是同一个纹理组 把模型导入SP之后 就自动分好了...
import模块到另一个文件夹报错:ModuleNotFoundError: No module named xxx
1. 问题 打开项目文件夹my_code,将bb.py的函数或者类import到aa.py中,然后运行aa.py文件,可能会报错ModuleNotFoundError: No module named xxx。 E:\Desktop\my_code ├── a │ ├── train.sh │ └── aa.py └── b└── b…...
[SystemVerilog]例化
SystemVerilog 的例化方式和Verilog 类似 如果信号输入输出name一致 abc abc_inst( .a(a), .b(b), c(c) ); 使用SystemVerilog abc abc_inst( .a, .b, .c ); 或者 abc abc_inst( .* ); 在SystemVerilog中,可以简化例化方式。 可以使用…...
Java方法详解
Java方法详解 方法1.方法的概念(1).什么是方法(2).方法的定义(3).实参与形参的关系 2.方法重载(1).方法重载的概念 3.递归(C语言详细讲过) 方法 1.方法的概念 (1).什么是方法 方法类似于C语言中的函数,我们重在体会与理解,不必…...
springboot自动插入创建时间和更新时间到数据库
springboot自动插入创建时间和更新时间到数据库 1.添加TableField注解2.添加TimeMetaObjectHandler配置3.测试 1.添加TableField注解 /*** 创建时间*/TableField(fill FieldFill.INSERT) // 插入时生效private LocalDateTime createTime;/*** 修改时间*/TableField(fill Fiel…...
如何将JAR交由Systemctl管理?
AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站 废话不多说,进入正题。下面开始说如何使用 systemctl…...
VMware Workstation Pro安装openKylin 2.0全流程指南
原文链接:VMware Workstation Pro安装openKylin 2.0全流程指南 Hello,大家好啊!今天给大家带来一篇在VMware Workstation Pro 上安装 openKylin 2.0 SP1 的文章。openKylin 2.0 作为国产开源桌面操作系统,目前已经发布了最新版本&…...
网络安全检查漏洞内容回复 网络安全的漏洞
网络安全的核心目标是保障业务系统的可持续性和数据的安全性,而这两点的主要威胁来自于蠕虫的暴发、黑客的攻击、拒绝服务攻击、木马。蠕虫、黑客攻击问题都和漏洞紧密联系在一起,一旦有重大安全漏洞出现,整个互联网就会面临一次重大挑战。虽…...
数据仓库的特点
数据仓库的主要特点可以概括为:面向主题、集成性、非易失性、时变性、高性能和可扩展性、支持复杂查询和分析、分层架构以及数据质量管理。 1. 面向主题(Subject-Oriented) 数据仓库是面向主题的,而不是面向事务的。这意味着数据…...