大模型 多轮对话
flyfish
多轮对话的价值在于保持上下文连贯性
理解依赖上下文的问题:比如例子中,单轮对话里 "为什么会是这种颜色?" 是孤立的,模型需要猜测 "这种颜色" 指什么(输出中模型确实询问了具体对象);而多轮对话中,模型明确知道是承接 "天空的颜色",因此直接针对天空颜色的成因展开,回答更精准。
支持复杂任务的逐步推进:比如 "先解释 A 概念,再基于 A 分析 B 现象",多轮对话能让模型记住前面的内容,避免重复解释或理解偏差。
模拟自然交互:更贴近人类对话习惯,比如可以追问 "再详细说一下瑞利散射",模型会基于之前的回答继续深入,而不是重新开始。
减少冗余信息:无需在每轮对话中重复前提(比如不用每次都说明 "我在问天空的颜色")。
python
import vllm
from transformers import AutoTokenizer
import torch
import math
# 第一步:指定模型路径
model_id = "Qwen/Qwen3-8B/"
# 第二步:加载 tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_id)
# 第三步:创建 vLLM 的 LLM 实例
llm = vllm.LLM(model=model_id, dtype="auto", gpu_memory_utilization=0.9)
def create_sampling_params(temperature=0.7, max_tokens=1024, logprobs=5):
"""创建采样参数"""
return vllm.SamplingParams(
temperature=temperature,
max_tokens=max_tokens,
logprobs=logprobs
)
def single_turn_chat(prompt, sampling_params):
"""单轮对话函数"""
# 处理prompt
prompt_tokenized = tokenizer.apply_chat_template(
[{"role": "user", "content": prompt}],
add_generation_prompt=True,
tokenize=False,
enable_thinking=False
)
# 生成输出
outputs = llm.generate([prompt_tokenized], sampling_params)
output = outputs[0]
generated_text = output.outputs[0].text
return generated_text
def multi_turn_chat(chat_history, sampling_params):
"""多轮对话函数,接收对话历史并生成新的响应"""
# 处理对话历史
prompt_tokenized = tokenizer.apply_chat_template(
chat_history,
add_generation_prompt=True,
tokenize=False,
enable_thinking=False
)
# 生成输出
outputs = llm.generate([prompt_tokenized], sampling_params)
output = outputs[0]
generated_text = output.outputs[0].text
return generated_text
def run_comparison(initial_prompt, follow_up_prompt):
"""运行单轮与多轮对话对比"""
sampling_params = create_sampling_params()
print("===== 单轮对话 1 =====")
single_response1 = single_turn_chat(initial_prompt, sampling_params)
print(f"用户: {initial_prompt}")
print(f"模型: {single_response1}\n")
print("===== 单轮对话 2 =====")
single_response2 = single_turn_chat(follow_up_prompt, sampling_params)
print(f"用户: {follow_up_prompt}")
print(f"模型: {single_response2}\n")
print("===== 多轮对话 =====")
# 初始化对话历史
chat_history = [{"role": "user", "content": initial_prompt}]
# 第一轮对话
multi_response1 = multi_turn_chat(chat_history, sampling_params)
print(f"用户: {initial_prompt}")
print(f"模型: {multi_response1}")
# 添加第一轮响应到对话历史
chat_history.append({"role": "assistant", "content": multi_response1})
# 添加第二轮用户输入
chat_history.append({"role": "user", "content": follow_up_prompt})
# 第二轮对话
multi_response2 = multi_turn_chat(chat_history, sampling_params)
print(f"\n用户: {follow_up_prompt}")
print(f"模型: {multi_response2}\n")
# 对比结果
print("===== 对比分析 =====")
print("单轮对话中,两个问题是独立处理的,模型没有上下文")
print("多轮对话中,模型会基于之前的对话历史生成响应")
print(f"相同的第二个问题,单轮回答与多轮回答是否相同: {single_response2 == multi_response2}")
if __name__ == "__main__":
# 示例问题
initial_prompt = "天空是什么颜色?"
follow_up_prompt = "为什么会是这种颜色?"
# 运行对比
run_comparison(initial_prompt, follow_up_prompt)
# 可以添加交互式对话
print("\n===== 开始交互式多轮对话 =====")
print("输入 'exit' 结束对话")
chat_history = []
sampling_params = create_sampling_params()
while True:
user_input = input("你: ")
if user_input.lower() == 'exit':
break
chat_history.append({"role": "user", "content": user_input})
response = multi_turn_chat(chat_history, sampling_params)
print(f"模型: {response}")
chat_history.append({"role": "assistant", "content": response})
输出
cpp
===== 单轮对话 1 =====
Processed prompts: 100%|█████████████████████████████████████████████████████████████████████████| 1/1 [00:10<00:00, 10.27s/it, est. speed input: 1.56 toks/s, output: 39.75 toks/s]
用户: 天空是什么颜色?
模型: 天空的颜色主要取决于光线在大气中的散射现象,具体如下:
### 1. **晴朗的白天(蓝色)**
- **原因**:太阳光由多种颜色的光组成,其中波长较短的**蓝光**和**紫光**在穿过大气层时,容易被空气中的分子(如氮气、氧气)散射,这种现象称为**瑞利散射**。
- **结果**:蓝光散射到各个方向,使得我们看到的天空呈现蓝色。
### 2. **日出/日落(红色、橙色)**
- **原因**:太阳接近地平线时,光线需要穿过更厚的大气层。蓝光被散射殆尽,而波长较长的**红光**和**橙光**散射较少,更容易到达观察者眼中。
- **结果**:天空呈现红色、橙色或粉红色。
### 3. **阴天(灰白色)**
- **原因**:云层中含有大量水滴,会散射所有波长的光(**米氏散射**),导致光线混合,天空呈现灰白色或乳白色。
### 4. **夜晚(黑色)**
- **原因**:太阳光无法到达地球,大气层没有光线散射,因此天空呈现黑色(或深蓝色,因少量散射)。
### 5. **特殊现象**
- **极光**:在极地地区,太阳风与地球磁场相互作用,激发大气中的气体发光,呈现绿色、红色等色彩。
- **彩虹**:水滴折射和反射太阳光,形成七种颜色的光弧。
### 总结
天空的颜色是光与大气相互作用的结果,不同条件下的散射和折射现象导致颜色变化。在无云晴朗的白天,天空通常呈现蓝色;而在其他条件下,颜色会随之改变。
===== 单轮对话 2 =====
Processed prompts: 100%|█████████████████████████████████████████████████████████████████████████| 1/1 [00:17<00:00, 17.06s/it, est. speed input: 1.00 toks/s, output: 39.86 toks/s]
用户: 为什么会是这种颜色?
模型: "为什么会是这种颜色?"这个问题的答案取决于你指的是什么颜色,以及你是在什么情境下看到这种颜色的。以下是一些可能的解释方向,你可以根据具体情况进行选择:
---
### 1. **自然现象中的颜色**(比如天空、树叶、花朵等)
- **天空是蓝色**:
天空呈现蓝色是因为阳光在穿过大气层时,与空气中的分子和微小颗粒发生散射。蓝光波长较短,更容易被散射,因此我们看到的天空是蓝色的。
- **树叶是绿色**:
叶子之所以是绿色,是因为叶绿素吸收了红光和蓝光,而反射了绿光。这是植物进行光合作用的关键。
- **彩虹的颜色**:
彩虹的形成是由于阳光进入水滴后发生折射、反射和再折射,不同颜色的光波长不同,因此被分开成七种颜色。
---
### 2. **物体的材料与光的反射**
- 颜色是由物体表面反射的光决定的。
例如:
- 白色物体反射所有颜色的光;
- 黑色物体几乎不反射任何光;
- 红色物体主要反射红光。
---
### 3. **人工制造的颜色**(如颜料、灯光、屏幕等)
- **颜料和染料**:
颜料通过吸收某些波长的光、反射其他波长的光来呈现颜色。例如,红色颜料会吸收绿色和蓝色的光,反射红色的光。
- **灯光颜色**:
不同颜色的灯光(如白光、红光、蓝光)是由光源的波长决定的。白光是多种颜色的混合。
- **电子屏幕**:
现代屏幕(如手机、电脑)通过红、绿、蓝三种颜色的像素组合来生成各种颜色。
---
### 4. **心理与文化因素**
- **颜色的心理象征**:
比如红色代表危险、热情,蓝色代表冷静、信任,这些是文化和心理上的联想。
- **文化差异**:
某些颜色在不同文化中有不同含义,例如白色在西方代表纯洁,在东方可能代表哀悼。
---
### 5. **物理或化学反应**
- 有些颜色是由化学反应产生的,例如:
- 铁锈是红色,是因为铁与氧气和水反应生成氧化铁;
- 火焰的颜色可以表明温度,如蓝色火焰温度高,红色火焰温度低。
---
### 6. **光学现象**
- **虹彩、干涉、衍射**:
一些物体表面(如肥皂泡、油膜)会因为光的干涉或衍射产生彩色条纹。
---
### 总结:
要回答"为什么会是这种颜色",需要明确:
- 你看到的是什么物体或现象?
- 它的环境和光照条件如何?
- 是否有特殊材料、光源或化学作用?
如果你能提供更具体的信息(比如你看到的是什么颜色、在什么情况下),我可以给出更准确的解释。欢迎补充!
===== 多轮对话 =====
Processed prompts: 100%|█████████████████████████████████████████████████████████████████████████| 1/1 [00:13<00:00, 13.40s/it, est. speed input: 1.19 toks/s, output: 39.77 toks/s]
用户: 天空是什么颜色?
模型: 天空的颜色主要取决于光线的散射方式和观察的时间、地点以及天气状况。以下是几种常见情况:
### 1. **晴朗的白天**
- **蓝色天空**:在晴朗的白天,天空通常呈现蓝色。这是由于**瑞利散射**(Rayleigh scattering)现象:太阳光中的短波长光(如蓝光和紫光)比长波长光(如红光和黄光)更容易被大气中的气体分子散射。虽然紫光散射更强,但人眼对紫光的敏感度较低,因此我们看到的是蓝色。
- **日出/日落时的红色或橙色**:当太阳接近地平线时,光线需要穿过更厚的大气层,蓝光被散射掉,剩下的红光和橙光更容易到达我们的眼睛,因此天空呈现红色或橙色。
### 2. **阴天或有云的天气**
- **灰色或白色**:云层会遮挡部分阳光,导致天空呈现灰色或白色。如果云层较厚且均匀,可能看起来像一块巨大的灰色幕布;如果云层较薄,可能会透出更多的蓝色或白色。
### 3. **夜晚**
- **黑色或深蓝色**:夜晚没有太阳光,大气中没有足够的光线散射,因此天空看起来是黑色或深蓝色的。有时由于星光或大气辉光,天空可能呈现深蓝色或暗紫色。
### 4. **特殊天气现象**
- **极光**:在高纬度地区,太阳风与地球磁场相互作用,可能产生绿色、红色或紫色的极光,天空因此呈现绚丽的色彩。
- **火山灰或污染**:火山喷发或空气污染可能导致天空呈现异常颜色,如橙色、红色或灰色。
### 5. **其他因素**
- **海拔高度**:在高海拔地区,空气稀薄,散射效应较弱,天空可能更接近白色或淡蓝色。
- **光线角度**:不同时间的太阳角度会影响光线的散射路径,从而改变天空的颜色。
### 总结
- **晴朗白天**:蓝色(日出/日落时为红色或橙色)
- **阴天/有云**:灰色或白色
- **夜晚**:黑色或深蓝色
- **特殊现象**:如极光、火山灰等可能导致其他颜色
天空的颜色是自然光与大气相互作用的结果,充满变化和美感。😊
Processed prompts: 100%|████████████████████████████████████████████████████████████████████████| 1/1 [00:26<00:00, 26.10s/it, est. speed input: 21.57 toks/s, output: 39.23 toks/s]
用户: 为什么会是这种颜色?
模型: 这是一个非常有趣且深入的问题!我们之所以看到天空是蓝色、红色、灰色或黑色,其实是因为**光在大气中传播时受到散射**,而这种散射方式取决于光的波长和大气中微粒的性质。下面我来详细解释一下为什么天空是蓝色,为什么日出日落是红色或橙色,以及为什么在阴天或夜晚天空会是其他颜色。
---
## 🌈 一、为什么晴朗的白天天空是蓝色的?
### 1. **太阳光的组成**
太阳光是由多种颜色的光组成的,这些颜色对应不同波长的电磁波。我们可以把它们简单地分为:
- **长波长**:红、橙、黄光(波长大约在 600~700nm)
- **短波长**:蓝、紫光(波长大约在 400~500nm)
### 2. **瑞利散射(Rayleigh Scattering)**
这是天空呈现蓝色的关键原因。
- 大气中的气体分子(如氮气、氧气)和微小的尘埃颗粒会**散射**光线。
- **短波长的光(蓝、紫光)比长波长的光更容易被散射**。
- 这种现象叫做**瑞利散射**。
### 3. **为什么是蓝色而不是紫色?**
- 虽然紫光的波长比蓝光更短,散射更强,但人眼对紫光的敏感度远低于蓝光。
- 此外,太阳光中紫光的比例本身就不如蓝光多。
- 因此,我们看到的是**蓝色天空**,而不是紫色。
---
## 🌅 二、为什么日出日落是红色或橙色?
### 1. **光线穿过更厚的大气层**
- 当太阳接近地平线时,光线需要穿过**更厚的大气层**才能到达我们的眼睛。
- 在这个过程中,**短波长的蓝光被散射得更多**,几乎全部被散射到其他方向,我们看不到。
- 剩下的主要是**长波长的红光、橙光、黄光**,这些光更容易穿透大气层。
### 2. **空气中的微小颗粒**
- 大气中还存在一些微小的尘埃、水蒸气等颗粒,它们也会对光产生散射效应。
- 这些颗粒在日出日落时更容易让红光和橙光"幸存"下来,从而让天空呈现出这些颜色。
---
## 🌤️ 三、为什么阴天或有云的时候天空是灰色或白色的?
### 1. **云层的反射和散射作用**
- 云是由水滴或冰晶组成的,它们的尺寸比气体分子大得多。
- 这些大颗粒对**所有波长的光**都有较强的散射和反射作用。
- 因此,云层会将阳光**均匀地散射**,导致天空看起来是**灰白色**的。
### 2. **光线被遮挡**
- 云层会挡住一部分阳光,使得光线变得**更暗**,所以天空看起来灰暗一些。
---
## 🌙 四、为什么夜晚天空是黑色或深蓝色?
### 1. **没有太阳光**
- 晚上太阳在地平线以下,没有阳光照射到大气中,因此没有光被散射。
- 因此,天空看起来是**黑色或深蓝色**。
### 2. **星光和大气辉光**
- 夜空中有时能看到星星的光,以及地球大气层中的辉光(如极光、城市光污染等),这些会改变天空的颜色。
- 但大多数时候,夜晚的天空是**深蓝色或黑色**。
---
## 🌬️ 五、其他颜色是怎么来的?
### 1. **极光(Aurora)**
- 极光出现在地球的极地地区,是太阳风与地球磁场相互作用的结果。
- 它会发出**绿色、红色、紫色**等颜色的光芒,使天空呈现绚丽的色彩。
### 2. **火山灰、沙尘暴**
- 火山喷发或沙尘暴会向大气中释放大量微小颗粒,这些颗粒也会散射光线。
- 这可能导致天空出现**橙色、红色、灰色**等异常颜色。
### 3. **空气污染**
- 工业排放、汽车尾气等污染物会在大气中形成颗粒物,也会改变天空的颜色。
- 污染严重的地区,天空可能呈现**灰蓝色、灰黄色**等。
---
## ✨ 总结:天空颜色的成因
| 天气/时间 | 天空颜色 |
===== 对比分析 =====
单轮对话中,两个问题是独立处理的,模型没有上下文
多轮对话中,模型会基于之前的对话历史生成响应
相同的第二个问题,单轮回答与多轮回答是否相同: False
===== 开始交互式多轮对话 =====
输入 'exit' 结束对话
你: exit