大模型 多轮对话

大模型 多轮对话

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
相关推荐
西猫雷婶7 小时前
神经网络|(十六)概率论基础知识-伽马函数·中
人工智能·深度学习·神经网络·学习·机器学习·概率论
学编程的小虎10 小时前
ollama离线部署+大语言模型
人工智能·语言模型·自然语言处理
七牛云行业应用16 小时前
GPT-Realtime架构与Token成本控制深度解析
gpt·语言模型·架构
大千AI助手1 天前
InstructGPT:使用人类反馈训练语言模型以遵循指令
人工智能·gpt·语言模型·自然语言处理·rlhf·指令微调·模型对齐
躺柒1 天前
读大语言模型08计算基础设施
人工智能·ai·语言模型·自然语言处理·大语言模型·大语言
Jooou1 天前
机器学习:贝叶斯派和频率派
机器学习·概率论·贝叶斯派
蒋星熠2 天前
区块链技术探索与应用:从密码学奇迹到产业变革引擎
python·语言模型·web3·去中心化·区块链·密码学·智能合约
樱花的浪漫2 天前
CUDA的编译与调试
人工智能·深度学习·语言模型·自然语言处理
盼小辉丶2 天前
Transformer实战(13)——从零开始训练GPT-2语言模型
gpt·深度学习·语言模型·transformer