网站建设后怎么赚钱,扬中网站哪家做得好,有域名和服务器怎么建网站,义乌市建设银行网站概述
在与大型语言模型#xff08;如ChatGPT#xff09;交互的过程中#xff0c;我们常常体验到与智能助手进行连贯多轮对话的便利性。那么#xff0c;当我们开启一个新的聊天时#xff0c;系统是如何管理聊天上下文的呢#xff1f;
一、初始上下文的建立
1. 创建新会…概述
在与大型语言模型如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,levellogging.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_dtypetorch.bfloat16,attn_implementationsdpa,device_mapauto,cache_dircache_dir
)
logging.info(模型已加载到设备%s使用attn_implementationsdpa, model.device)# 设置视觉令牌范围以平衡性能和成本
min_pixels 256 * 28 * 28
max_pixels 1280 * 28 * 28# 加载处理器
processor AutoProcessor.from_pretrained(Qwen/Qwen2.5-VL-3B-Instruct,min_pixelsmin_pixels,max_pixelsmax_pixels,cache_dircache_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, tokenizeFalse, add_generation_promptTrue)image_inputs, video_inputs process_vision_info(messages)inputs processor(text[text],imagesimage_inputs,videosvideo_inputs,paddingTrue,return_tensorspt,)inputs inputs.to(model.device)logging.info(推理输入已准备完毕。)# 进行推理并生成输出logging.info(开始生成输出...)generated_ids model.generate(**inputs, max_new_tokens512)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_tokensTrue, clean_up_tokenization_spacesFalse)[0] # 取第一个元素print(助手 output_text.strip())# 将模型的回复添加到消息列表messages.append({role: assistant,content: [{type: text, text: output_text.strip()}]})# 为了防止超过上下文长度限制可以在这里检查并截断消息列表# 例如只保留最近的n轮对话max_history 5 # 保留最近5轮对话可根据需要调整# 保留系统提示加上最近的max_history*2条消息用户和助手各一条所以乘以2if 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: Im 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: Id 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_promptTrue
)
# 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\nIm 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\nId 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_promptTrue, add_vision_idTrue
)
# 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\nIm 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\nId 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内存。在实际应用中根据硬件条件选择合适的模型规模。