chemistry assistant(No in Kaggle,College work)
This commit is contained in:
@@ -0,0 +1,92 @@
|
|||||||
|
# 部署指南 —— Qwen2.5-1.5B 材料科学问答模型(bf16 全量微调)
|
||||||
|
|
||||||
|
本项目基于 `Qwen/Qwen2.5-1.5B-Instruct`,在 `样本收集.csv`(材料科学问答对)上做因果语言模型微调,单卡 16GB 显存可训练。
|
||||||
|
|
||||||
|
## 一、环境与依赖
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Python 3.10+
|
||||||
|
pip install torch torchvision torchaudio
|
||||||
|
pip install transformers>=4.44.0 accelerate
|
||||||
|
pip install pandas tqdm
|
||||||
|
```
|
||||||
|
|
||||||
|
验证 CUDA:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -c "import torch; print('CUDA:', torch.cuda.is_available(), torch.cuda.get_device_name(0))"
|
||||||
|
```
|
||||||
|
|
||||||
|
> 国内加速下载:在脚本顶部已设置 `os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"`,无需额外操作。
|
||||||
|
> 若想更快可安装 `hf_transfer` 并设 `HF_HUB_ENABLE_HF_TRANSFER=1`。
|
||||||
|
|
||||||
|
## 二、文件结构
|
||||||
|
|
||||||
|
```
|
||||||
|
gpt-chemistry/
|
||||||
|
├── 样本收集.csv # 训练数据(列:问题、回答)
|
||||||
|
├── main.py # 训练脚本(bf16 全量微调)
|
||||||
|
├── test.py # 推理回测脚本
|
||||||
|
├── download.py # 模型预热下载脚本
|
||||||
|
├── deploy.md # 本指南
|
||||||
|
└── output/ # 训练产物(自动生成)
|
||||||
|
├── model.pth # state_dict
|
||||||
|
└── best_model/ # 完整模型 + tokenizer(可直接 from_pretrained)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 三、方案说明
|
||||||
|
|
||||||
|
| 项目 | 配置 |
|
||||||
|
| ------------ | --------------------------------- |
|
||||||
|
| 基座模型 | Qwen/Qwen2.5-1.5B-Instruct |
|
||||||
|
| 精度 | bfloat16 |
|
||||||
|
| 微调方式 | 全量参数微调 |
|
||||||
|
| 梯度检查点 | 开启 |
|
||||||
|
| 显存占用 | 约 8~10GB(单卡 16GB 富余) |
|
||||||
|
| 训练参数量 | 1.5B 全部 |
|
||||||
|
|
||||||
|
> 1.5B 用 bf16 全量微调约需 8~10GB 显存,16GB 卡无需量化即可跑通。相比 QLoRA 全量微调收敛更稳、效果更好。
|
||||||
|
|
||||||
|
## 四、下载模型(可选预热)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python download.py
|
||||||
|
```
|
||||||
|
|
||||||
|
`download.py` 会带进度条把模型拉到本地缓存,之后 `main.py` / `test.py` 自动命中缓存,不再重复下载。
|
||||||
|
|
||||||
|
## 五、训练流程
|
||||||
|
|
||||||
|
1. 确认 `样本收集.csv` 与 `main.py` 同目录,列名为 `问题`、`回答`。
|
||||||
|
2. 启动训练:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python main.py
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 训练产物保存在 `./output/best_model/`,可直接 `from_pretrained` 加载。
|
||||||
|
4. 终端 `tqdm` 实时显示 `loss`、`avg_loss`、`lr`,每个 epoch 结束保存当前最优。
|
||||||
|
|
||||||
|
## 六、推理 / 测试
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python test.py
|
||||||
|
```
|
||||||
|
|
||||||
|
`test.py` 自动从 csv 取前 10 条问题回测,对比「标准答案」与「模型回答」。
|
||||||
|
|
||||||
|
交互式问答:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from test import chat
|
||||||
|
print(chat("MOF 是什么材料?"))
|
||||||
|
```
|
||||||
|
|
||||||
|
## 七、常见问题
|
||||||
|
|
||||||
|
- **OOM(显存不足)**:降低 `batch_size` 为 2 或 1 → 减小 `max_length` 至 384 → 换 Qwen2.5-0.5B。
|
||||||
|
- **下载慢**:确认已换源(脚本内已设 hf-mirror),或安装 `hf_transfer` 加速。
|
||||||
|
- **中文乱码**:确认 `样本收集.csv` 为 UTF-8 编码。
|
||||||
|
- **生成重复**:推理时提高 `repetition_penalty`(1.1~1.3) 或降低 `temperature`。
|
||||||
|
- **训练不收敛**:全量微调学习率建议 `1e-5 ~ 3e-5`,默认 `2e-5`。
|
||||||
|
- **想用 LoRA**:1.5B 全量微调显存足够,一般无需 LoRA;若要省显存可参考 PEFT 文档注入 LoRA。
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
# %%
|
||||||
|
import os
|
||||||
|
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
|
||||||
|
import torch
|
||||||
|
import torch.nn as nn
|
||||||
|
import pandas as pd
|
||||||
|
from torch.utils.data import Dataset, DataLoader
|
||||||
|
from transformers import (
|
||||||
|
AutoTokenizer,
|
||||||
|
AutoModelForCausalLM,
|
||||||
|
get_cosine_schedule_with_warmup,
|
||||||
|
)
|
||||||
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
||||||
|
|
||||||
|
# %%
|
||||||
|
# 读取同文件夹下的对话 csv(列:问题、回答)
|
||||||
|
df = pd.read_csv("样本收集.csv", encoding="utf-8")
|
||||||
|
df = df.dropna(subset=["问题", "回答"]).reset_index(drop=True)
|
||||||
|
# 清洗空白字符:去首尾空白、合并连续空白为单个空格、替换中文全角空格
|
||||||
|
df["问题"] = df["问题"].astype(str).str.replace("\u3000", " ").str.replace(r"\s+", " ", regex=True).str.strip()
|
||||||
|
df["回答"] = df["回答"].astype(str).str.replace("\u3000", " ").str.replace(r"\s+", " ", regex=True).str.strip()
|
||||||
|
print(f"共 {len(df)} 条对话样本")
|
||||||
|
print(df.head())
|
||||||
|
|
||||||
|
# %%
|
||||||
|
# 加载 Qwen2.5-1.5B-Instruct,bf16 全量微调(单卡 16GB 够用)
|
||||||
|
model_name = "Qwen/Qwen2.5-1.5B-Instruct"
|
||||||
|
|
||||||
|
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
|
||||||
|
if tokenizer.pad_token is None:
|
||||||
|
tokenizer.pad_token = tokenizer.eos_token
|
||||||
|
|
||||||
|
model = AutoModelForCausalLM.from_pretrained(
|
||||||
|
model_name,
|
||||||
|
torch_dtype=torch.bfloat16,
|
||||||
|
trust_remote_code=True,
|
||||||
|
)
|
||||||
|
model.gradient_checkpointing_enable()
|
||||||
|
model.config.use_cache = False
|
||||||
|
model.to(device)
|
||||||
|
|
||||||
|
# 冻结前两层 decoder,节省显存
|
||||||
|
for i in range(2):
|
||||||
|
for p in model.model.layers[i].parameters():
|
||||||
|
p.requires_grad = False
|
||||||
|
trainable = sum(p.numel() for p in model.parameters() if p.requires_grad)
|
||||||
|
total = sum(p.numel() for p in model.parameters())
|
||||||
|
print(f"可训练参数: {trainable}/{total} ({100*trainable/total:.2f}%)")
|
||||||
|
print(model)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
# 对话数据集:把 (问题, 回答) 拼成提示文本,做因果语言建模
|
||||||
|
PROMPT_TEMPLATE = (
|
||||||
|
"你是一名材料科学助手,请根据问题给出准确、专业的回答。\n"
|
||||||
|
"问题:{q}\n"
|
||||||
|
"回答:{a}{eos}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ChatDataset(Dataset):
|
||||||
|
def __init__(self, dataframe, tokenizer, max_length=512):
|
||||||
|
self.df = dataframe.reset_index(drop=True)
|
||||||
|
self.tokenizer = tokenizer
|
||||||
|
self.max_length = max_length
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.df)
|
||||||
|
|
||||||
|
def __getitem__(self, idx):
|
||||||
|
q = str(self.df.loc[idx, "问题"])
|
||||||
|
a = str(self.df.loc[idx, "回答"])
|
||||||
|
text = PROMPT_TEMPLATE.format(q=q, a=a, eos=self.tokenizer.eos_token)
|
||||||
|
tokens = self.tokenizer(
|
||||||
|
text,
|
||||||
|
truncation=True,
|
||||||
|
max_length=self.max_length,
|
||||||
|
padding="max_length",
|
||||||
|
return_tensors="pt",
|
||||||
|
)
|
||||||
|
input_ids = tokens["input_ids"].squeeze(0)
|
||||||
|
attention_mask = tokens["attention_mask"].squeeze(0)
|
||||||
|
# pad 位置用 -100 屏蔽损失
|
||||||
|
labels = input_ids.clone()
|
||||||
|
labels[labels == self.tokenizer.pad_token_id] = -100
|
||||||
|
return input_ids, attention_mask, labels
|
||||||
|
|
||||||
|
|
||||||
|
def collate_fn(batch):
|
||||||
|
input_ids = torch.stack([b[0] for b in batch])
|
||||||
|
attention_mask = torch.stack([b[1] for b in batch])
|
||||||
|
labels = torch.stack([b[2] for b in batch])
|
||||||
|
return input_ids, attention_mask, labels
|
||||||
|
|
||||||
|
|
||||||
|
dataset = ChatDataset(df, tokenizer, max_length=512)
|
||||||
|
train_dataloader = DataLoader(
|
||||||
|
dataset, batch_size=1, shuffle=True, num_workers=2, collate_fn=collate_fn
|
||||||
|
)
|
||||||
|
# 抽样查看一条
|
||||||
|
sample = dataset[0]
|
||||||
|
print("sample input_ids shape:", sample[0].shape)
|
||||||
|
print("decoded:", tokenizer.decode(sample[0], skip_special_tokens=True))
|
||||||
|
|
||||||
|
# %%
|
||||||
|
# 训练配置
|
||||||
|
epochs = 30
|
||||||
|
learning_rate = 2e-5
|
||||||
|
warmup_ratio = 0.05
|
||||||
|
|
||||||
|
optimizer = torch.optim.AdamW(
|
||||||
|
[p for p in model.parameters() if p.requires_grad],
|
||||||
|
lr=learning_rate,
|
||||||
|
weight_decay=0.01,
|
||||||
|
)
|
||||||
|
scheduler = get_cosine_schedule_with_warmup(
|
||||||
|
optimizer,
|
||||||
|
num_warmup_steps=int(warmup_ratio * epochs * len(train_dataloader)),
|
||||||
|
num_training_steps=epochs * len(train_dataloader),
|
||||||
|
)
|
||||||
|
|
||||||
|
best_loss = float("inf")
|
||||||
|
save_dir = "./output"
|
||||||
|
os.makedirs(save_dir, exist_ok=True)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
# 训练循环
|
||||||
|
for epoch in range(epochs):
|
||||||
|
model.train()
|
||||||
|
training_loss = 0.0
|
||||||
|
progress_bar = tqdm(train_dataloader, desc=f"Epoch {epoch+1}/{epochs}")
|
||||||
|
lens = 0
|
||||||
|
for input_ids, attention_mask, labels in progress_bar:
|
||||||
|
input_ids = input_ids.to(device)
|
||||||
|
attention_mask = attention_mask.to(device)
|
||||||
|
labels = labels.to(device)
|
||||||
|
|
||||||
|
optimizer.zero_grad()
|
||||||
|
outputs = model(input_ids=input_ids, attention_mask=attention_mask, labels=labels)
|
||||||
|
loss = outputs.loss
|
||||||
|
loss.backward()
|
||||||
|
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
|
||||||
|
optimizer.step()
|
||||||
|
|
||||||
|
training_loss += loss.item()
|
||||||
|
lens += 1
|
||||||
|
progress_bar.set_postfix({
|
||||||
|
"loss": f"{loss.item():.4f}",
|
||||||
|
"avg_loss": f"{training_loss / lens:.4f}",
|
||||||
|
"lr": f"{scheduler.get_last_lr()[0]:.2e}",
|
||||||
|
})
|
||||||
|
|
||||||
|
scheduler.step()
|
||||||
|
avg_train_loss = training_loss / lens
|
||||||
|
print(f"Epoch {epoch+1} train_loss: {avg_train_loss:.4f}")
|
||||||
|
|
||||||
|
# 仅记录最优 loss,不每个 epoch 保存(1.5B 整存太费时费空间)
|
||||||
|
if avg_train_loss < best_loss:
|
||||||
|
best_loss = avg_train_loss
|
||||||
|
print(f"新最优 loss: {best_loss:.4f}")
|
||||||
|
|
||||||
|
# 训练结束保存整个最终模型
|
||||||
|
final_dir = os.path.join(save_dir, "final_model")
|
||||||
|
model.save_pretrained(final_dir)
|
||||||
|
tokenizer.save_pretrained(final_dir)
|
||||||
|
print(f"训练完成,最佳 loss: {best_loss:.4f}")
|
||||||
|
print(f"最终模型已保存到: {final_dir}")
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
# %%
|
||||||
|
import os
|
||||||
|
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
|
||||||
|
import torch
|
||||||
|
import pandas as pd
|
||||||
|
from transformers import AutoTokenizer, AutoModelForCausalLM
|
||||||
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
||||||
|
|
||||||
|
# %%
|
||||||
|
# 加载微调后的完整模型(main.py 保存的 final_model 目录)
|
||||||
|
model_path = "./output/final_model"
|
||||||
|
|
||||||
|
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
|
||||||
|
if tokenizer.pad_token is None:
|
||||||
|
tokenizer.pad_token = tokenizer.eos_token
|
||||||
|
|
||||||
|
model = AutoModelForCausalLM.from_pretrained(
|
||||||
|
model_path,
|
||||||
|
torch_dtype=torch.bfloat16,
|
||||||
|
trust_remote_code=True,
|
||||||
|
)
|
||||||
|
model.to(device)
|
||||||
|
model.eval()
|
||||||
|
print("模型加载完成:", model_path)
|
||||||
|
|
||||||
|
# %%
|
||||||
|
PROMPT_PREFIX = (
|
||||||
|
"你是一名材料科学助手,请根据问题给出准确、专业的回答。\n"
|
||||||
|
"问题:{q}\n"
|
||||||
|
"回答:"
|
||||||
|
)
|
||||||
|
|
||||||
|
EOS_TOKEN = tokenizer.eos_token
|
||||||
|
|
||||||
|
|
||||||
|
def build_prompt(question):
|
||||||
|
return PROMPT_PREFIX.format(q=question)
|
||||||
|
|
||||||
|
|
||||||
|
@torch.no_grad()
|
||||||
|
def chat(
|
||||||
|
question,
|
||||||
|
max_new_tokens=256,
|
||||||
|
temperature=0.7,
|
||||||
|
top_p=0.9,
|
||||||
|
repetition_penalty=1.1,
|
||||||
|
system_prompt=None,
|
||||||
|
):
|
||||||
|
prefix = system_prompt if system_prompt else PROMPT_PREFIX
|
||||||
|
input_text = prefix.format(q=question)
|
||||||
|
inputs = tokenizer(input_text, return_tensors="pt").to(device)
|
||||||
|
output = model.generate(
|
||||||
|
**inputs,
|
||||||
|
max_new_tokens=max_new_tokens,
|
||||||
|
do_sample=True,
|
||||||
|
temperature=temperature,
|
||||||
|
top_p=top_p,
|
||||||
|
repetition_penalty=repetition_penalty,
|
||||||
|
pad_token_id=tokenizer.pad_token_id,
|
||||||
|
eos_token_id=tokenizer.eos_token_id,
|
||||||
|
)
|
||||||
|
response = tokenizer.decode(
|
||||||
|
output[0][inputs["input_ids"].shape[1]:],
|
||||||
|
skip_special_tokens=True,
|
||||||
|
)
|
||||||
|
return response.strip()
|
||||||
|
|
||||||
|
|
||||||
|
def interactive():
|
||||||
|
"""交互式问答(输入 quit/exit/q 退出)"""
|
||||||
|
print("=" * 60)
|
||||||
|
print("材料科学问答助手(输入 quit / exit / q 退出)")
|
||||||
|
print("=" * 60)
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
q = input("\n问题:").strip()
|
||||||
|
except (EOFError, KeyboardInterrupt):
|
||||||
|
break
|
||||||
|
if not q:
|
||||||
|
continue
|
||||||
|
if q.lower() in ("quit", "exit", "q"):
|
||||||
|
break
|
||||||
|
print("回答:", chat(q))
|
||||||
|
print("已退出。")
|
||||||
|
|
||||||
|
|
||||||
|
# %%
|
||||||
|
# 从原始 csv 取问题做批量回测,对比模型回答与标准答案
|
||||||
|
def batch_eval(sample_n=10):
|
||||||
|
df = pd.read_csv("样本收集.csv", encoding="utf-8").dropna(subset=["问题", "回答"]).reset_index(drop=True)
|
||||||
|
df["问题"] = df["问题"].astype(str).str.replace("\u3000", " ").str.replace(r"\s+", " ", regex=True).str.strip()
|
||||||
|
df["回答"] = df["回答"].astype(str).str.replace("\u3000", " ").str.replace(r"\s+", " ", regex=True).str.strip()
|
||||||
|
|
||||||
|
sample_n = min(sample_n, len(df))
|
||||||
|
for i in tqdm(range(sample_n), desc="回测中"):
|
||||||
|
q = str(df.loc[i, "问题"])
|
||||||
|
a = str(df.loc[i, "回答"])
|
||||||
|
pred = chat(q)
|
||||||
|
print(f"\n{'='*60}")
|
||||||
|
print(f"[{i+1}] Q: {q}")
|
||||||
|
print(f" 标准答案: {a}")
|
||||||
|
print(f" 模型回答: {pred}")
|
||||||
|
|
||||||
|
|
||||||
|
# %%
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# 用法:
|
||||||
|
# python test.py -> 默认进入交互式问答
|
||||||
|
# python test.py --eval -> 跑 csv 批量回测
|
||||||
|
# python test.py "你的问题" -> 单次问答
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
if sys.argv[1] == "--eval":
|
||||||
|
batch_eval(sample_n=10)
|
||||||
|
else:
|
||||||
|
q = " ".join(sys.argv[1:])
|
||||||
|
print("回答:", chat(q))
|
||||||
|
else:
|
||||||
|
interactive()
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
问题,回答
|
||||||
|
LiFePO4 是什么?,LiFePO4是一种磷酸铁锂正极材料。
|
||||||
|
LFP 指什么?,LFP 通常指 lithium iron phosphate。
|
||||||
|
"LiFePO4 常用于哪里?
|
||||||
|
",常用于动力电池和储能电池。
|
||||||
|
NCM是什么正极材料?,NCM是镍钴锰三元锂电池正极材料。
|
||||||
|
无机缓蚀剂包含哪些常见材料?,包含铬酸盐、亚硝酸盐、硅酸盐等无机化合物。
|
||||||
|
影响畴结构的因素有哪些?,烧结温度,冷却速率(马弗炉冷却,焦耳热快散),烧结方式
|
||||||
|
畴结构对热障性能有什么影响?,畴结构会影响声子,声子影响热导率等,进而调控热障性能
|
||||||
|
气凝胶是什么?,气凝胶是一类通过溶胶-凝胶法结合特殊干燥工艺制备的纳米级多孔固态材料。
|
||||||
|
气凝胶常用于哪里?,常用于航空航天、国防军工等尖端领域。
|
||||||
|
形状记忆合金是什么?,形状记忆合金是通过热弹性与马氏体相变及其逆变而具有形状记忆的由两种以上金属元素所构成的材料。
|
||||||
|
SMA指什么?,SMA通常指shape memory alloys。
|
||||||
|
形状记忆合金常用于哪里?,常用于航空航天、机械电子、生物医疗、桥梁建筑、汽车工业及日常生活等多个领域。
|
||||||
|
ABF积层胶膜是什么?,ABF积层胶膜是芯片封装基板中的绝缘材料,用于铺设高密度电路,保证高速信号传输。
|
||||||
|
MOF是什么材料?,MOF是金属有机框架多孔晶体功能材料。
|
||||||
|
ZIF是什么材料?,ZIF是沸石咪唑酯骨架材料,属于MOF分支。
|
||||||
|
石墨烯的结构维度与材料类别?,石墨烯是典型单原子层二维碳纳米功能材料。
|
||||||
|
二维光电器件常用TMDs材料属于哪一类前沿材料?,TMDs是层状过渡金属硫族化合物二维半导体材料。
|
||||||
|
受拓扑保护、无散射导电表面态的量子材料统称是什么?,拓扑绝缘体,一类特殊拓扑结构电子功能材料。
|
||||||
|
MOF材料最标志性的理化性能是什么?,MOF具有超高比表面积、可精准调控孔径、结构可设计、孔隙结构有序可调。
|
||||||
|
卤化钙钛矿材料存在哪些固有性能缺陷?,水氧稳定性差、易发生离子迁移、含铅体系存在毒性问题。
|
||||||
|
可降解PLA高分子的典型应用场景有哪些?,一次性环保塑料、医用可吸收缝合线、骨科植入支架、药物缓释载体。
|
||||||
|
光学超材料拥有哪些天然材料不存在的特殊性能?,可实现负折射率、完美吸波、超常透镜成像等违背常规材料物理规律的特性。
|
||||||
|
电磁超材料主要应用在哪些装备与器件?,雷达隐身涂层、超透镜光学器件、声学降噪设备、电磁波调控器件。
|
||||||
|
水凝胶泡沫是什么?,水凝胶泡沫是一种含有多孔结构的高分子水凝胶材料。
|
||||||
|
水凝胶泡沫有什么特点?,水凝胶泡沫具备多孔、高吸水、质轻以及良好生物相容性等特点。
|
||||||
|
水凝胶泡沫常用于哪里?,水凝胶泡沫常用于伤口敷料、水处理吸附、柔性传感、隔热缓冲等领域。
|
||||||
|
胶体金是什么?,胶体金是纳米级金颗粒均匀分散在水中形成的稳定胶体溶液。
|
||||||
|
胶体金有哪些用途?,胶体金可用于新冠、流感、甲流抗原检测,毒品检测、幽门螺杆菌、乙肝快速筛查等。
|
||||||
|
IIR指什么?,IIR通常指Isobutylene Isoprene Rubber
|
||||||
|
IIR有什么性质?,IIR具有极好的气密性和耐酸碱性
|
||||||
|
IIR常用于哪里?,常用于轮胎内胎和储气罐内衬
|
||||||
|
碳纳米管(CNTs)是什么材料?,一维纳米碳材料,由石墨烯片卷绕成中空管状结构,分为单壁、多壁碳纳米管。
|
||||||
|
什么是钙钛矿?,"""钙钛矿""原先是指一种天然的矿物,主要成分为“CaTiO3”,在光电器件领域用于指一类与该天然矿物晶体结构相似的材料。其通用分子式为ABX_3。B离子填充在六个X离子组成的八面体结构中,形成一种由 BX_6 八面体共享顶角构成的三维网络,A 位离子填充在由这些八面体组成的十二面体空腔中。"
|
||||||
|
钛合金TC4的主要合金元素及含量?,TC4含有6%的铝和4%的钒,属于α+β型两相钛合金。
|
||||||
|
什么是超材料?,超材料是一类不依赖化学成分,而通过人工设计的微观几何结构来获得自然界不存在超常物理性质的材料。
|
||||||
|
超材料的主要分类是什么?,电磁超材料、光学超材料、声学超材料、力学超材料、热超材料等
|
||||||
|
PLGA在材料领域中指什么?,"
|
||||||
|
PLGA是指聚乳酸-羟基乙酸共聚物的缩写,一种由乳酸与羟基乙酸通过开环聚合得到的脂肪族共聚酯"
|
||||||
|
PLGA载体作为长效药物控制剂的机制,纳米级PLGA载体可利用肿瘤EPR效应实现被动靶向富集,降低化疗药物的全身毒副作用。
|
||||||
|
什么是碳纤维复合材料?,由碳纤维与树脂基体复合而成的高强度轻质材料,常用于航空航天和体育器材。
|
||||||
|
什么是压电材料?,受机械应力能产生电荷的材料,常用于传感器、换能器和能量收集。
|
||||||
|
固态电解质是什么?,固态电解质是一种不含液态溶剂、以固体形态实现离子传导的电解质材料,常用于固态电池以提升安全性与能量密度。
|
||||||
|
钙钛矿太阳能电池的核心结构是什么?,钙钛矿太阳能电池的核心结构为“电子传输层/钙钛矿光吸收层/空穴传输层”,其中钙钛矿层(如CH₃NH₃PbI₃)负责吸收光子并产生载流子。
|
||||||
|
金属有机框架(MOF)的气体吸附原理是什么?,MOF通过其超高比表面积和可调控的孔道结构,利用物理吸附(范德华力)或化学吸附(配位作用)捕获气体分子,且孔径大小可精准匹配目标气体分子尺寸。
|
||||||
|
量子点(Quantum Dots)的光学特性由什么决定?,量子点的光学特性(如发光波长)主要由其尺寸决定——尺寸越小,量子限域效应越强,发光波长越短(蓝移);尺寸越大,发光波长越长(红移),同时受材料组分(如CdSe、InP)影响。
|
||||||
|
柔性电子器件中“基底材料”的关键要求是什么?,柔性电子器件的基底材料需具备高柔韧性(可弯曲、折叠)、良好的热稳定性(耐受加工温度)、低表面粗糙度(保证器件层间结合),以及绝缘性或特定电学性能(依器件功能而定)。
|
||||||
|
PVA是什么?,"全称聚乙烯醇,英文Polyvinyl Alcohol,简称PVA,是一种水溶性高分子塑料,白色粉末/颗粒,遇热水能溶解成透明粘稠液体。
|
||||||
|
原料是聚醋酸乙烯酯经过醇解反应制成。"
|
||||||
|
PVA如何按醇解度划分?,"1. 完全醇解型 PVA
|
||||||
|
醇解度 98%~99%,分子羟基少、耐水性好、水溶液黏度稳定。
|
||||||
|
用途:纺织上浆、粘合剂、薄膜、建筑胶水。
|
||||||
|
|
||||||
|
2. 中醇解型 PVA
|
||||||
|
醇解度 92%~95%,兼顾水溶性与粘结力。
|
||||||
|
用途:纸张涂布、普通水性胶、日化增稠。
|
||||||
|
|
||||||
|
3. 部分醇解型 PVA
|
||||||
|
醇解度 85%~88%,水溶性极佳,冷水可溶。
|
||||||
|
用途:纺织浆料、乳化剂、化妆品、分散剂。"
|
||||||
|
高熵合金(HEA)是什么?,高熵合金是由五种或五种以上主要金属元素(每种含量5%~35%)通过等摩尔比或近等摩尔比混合形成的多主元固溶体合金,又称多主元高熵合金。
|
||||||
|
高熵合金有哪些核心特性?,具有热力学上的高熵效应、动力学上的迟滞扩散效应、结构上的晶格畸变效应以及性能上的“鸡尾酒”效应,通常表现出优异的热稳定性、抗辐照和耐腐蚀性能。
|
||||||
|
请说明钢的淬火(Quenching)和回火(Tempering)工艺的目的及其微观组织转变,淬火: 将钢加热至奥氏体区保温,随后快速冷却(如水冷/油冷),目的是抑制奥氏体向珠光体的扩散型转变,使其发生非扩散型的马氏体相变,获得高硬度、高强度的马氏体组织,但材料此时脆性很大。
|
||||||
|
"什么是形状记忆合金(Shape Memory Alloys, SMAs)?其基本机理是什么?",形状记忆合金是一种在受到塑性变形后,通过加热能完全恢复其变形前原始形状的智能材料。其基本机理是热弹性马氏体相变。材料在高低温下分别对应奥氏体(高温母相)和马氏体(低温相)。在低温马氏体状态下受到外力发生非弹性变形(通过马氏体孪晶变体的重新排列),当加热到奥氏体转变温度以上时,组织逆转变为原始奥氏体点阵,微观结构的恢复在宏观上表现为恢复原状。
|
||||||
|
XRD(X射线衍射)测试的基本原理是什么?布拉格方程(Bragg's Law)的形式和各字母含义是什么?,XRD的基本原理是X射线作为电磁波照射到晶体材料上时,晶体中周期性排列的原子会对X射线产生散射,散射波在空间特定方向上相互叠加产生相长干涉(衍射),形成衍射峰。
|
||||||
|
请简述金属电化学腐蚀中“牺牲阳极的阴极保护法(Sacrificial Anode Cathodic Protection)”的原理。,这种方法利用了原电池原理。将电位更负(更活泼)的金属(如锌、镁、铝)作为阳极,与需要保护的金属结构(如钢质船体、管道,作为阴极)导线连接。在腐蚀介质(如海水、土壤)中,活泼金属作为阳极优先发生氧化反应而溶解(被“牺牲”),释放出的电子流向被保护的阴极,抑制了被保护金属的氧化溶解,从而达到防腐目的。
|
||||||
|
什么是高分子材料的应力松弛(Stress Relaxation)现象?其微观原因是什么?,"应力松弛是指高分子材料在恒定应变(形变)保持不变的情况下,材料内部的应力随着时间的推移而自动衰减的现象。
|
||||||
|
其微观原因在于:高分子材料具有粘弹性。当施加瞬间形变时,高分子链段来不及调整,产生了暂时的构象扭曲和高内应力;随着时间延长,高分子长链通过热运动逐步发生链段滑移、重排和构象调整(即分子松弛),释放了内部局部累积的弹性应变能,使得维持该形变所需的宏观外力逐渐减小。"
|
||||||
|
什么是孪晶(Twin Crystal)?它与普通晶界有何不同?,孪晶是指两个晶体(或同一晶体的两部分)沿一个公共晶面(孪晶面)构成镜面对称的晶体结构。与普通晶界(大角度晶界,能量较高,结构混乱)不同,孪晶界是一种特殊的相干面缺陷,其原子排列高度有序,界面能极低,且具有特定的几何晶系对应关系。
|
||||||
|
请解释固溶强化(Solid Solution Strengthening)的微观机理,固溶强化是指将溶质原子引入基体金属形成固溶体,从而提高材料强度的现象。其微观机理在于:溶质原子与基体原子的尺寸差异会引起晶格畸变,形成应力场。该应力场与材料内部位错运动的应力场发生相互作用,产生阻力,从而阻碍位错的滑移与运动,使材料变形困难,达到强化效果。
|
||||||
|
晶粒大小对材料力学性能有什么影响?,晶粒越细小,晶界越多,阻碍位错滑移能力越强,材料强度、硬度、韧性同时提升,遵循细晶强化原理。
|
||||||
|
根据第一性原理,Mg2SiO4的晶体结构,"Mg₂SiO₄ 晶体结构(橄榄石相,α-Mg₂SiO₄)
|
||||||
|
1. 晶系与空间群
|
||||||
|
晶系:正交晶系(Orthorhombic)
|
||||||
|
空间群:Pnma(No. 62)
|
||||||
|
晶胞参数:DFT-GGA 计算结果与实验值高度吻合,典型晶胞参数为 a ≈ 4.76 Å,b ≈ 10.22 Å,c ≈ 5.99 Å。
|
||||||
|
2. 晶胞内原子排布
|
||||||
|
Z值:每个晶胞包含 4 个 Mg₂SiO₄ 结构单元,即 4 个 Si 原子、8 个 Mg 原子和 16 个 O 原子,总计 28 个原子。
|
||||||
|
Wyckoff 位置:所有原子均占据 4c 非等效位置。
|
||||||
|
3. 配位多面体特征
|
||||||
|
硅氧四面体 ([SiO₄]):Si 原子处于 4 配位状态,与 4 个 O 原子形成强共价键的孤立四面体。Si-O 键长通常在 1.62–1.66 Å 之间。
|
||||||
|
镁氧八面体 ([MgO₆]):Mg 原子处于 6 配位状态,与 6 个 O 原子形成离子键八面体。Mg-O 键长通常在 2.05–2.20 Å 之间。
|
||||||
|
4. 结构连接方式
|
||||||
|
孤立岛状结构:[SiO₄] 四面体之间互不相连,呈孤立分布。
|
||||||
|
密堆积骨架:O 原子近似呈六方最密堆积(hcp),Mg 和 Si 阳离子填充在 O 原子的八面体和四面体空隙中,通过共边和共角连接形成三维骨架结构。
|
||||||
|
5. 高压相变行为
|
||||||
|
当外部压力超过约 12–14 GPa 时,该正交结构会发生一级相变,转变为尖晶石结构的 β-Mg₂SiO₄(空间群 Pbnm),Si 的配位数由 4 增加至 6。"
|
||||||
|
材料科学是什么学科?,1. 材料科学是衔接化学、物理、工程的交叉学科,核心研究物质成分、微观结构与性能的对应关系。
|
||||||
|
MOF是什么?,MOF(金属有机框架)是以金属离子/金属簇为节点、有机配体为桥连,经配位键自组装得到的、具备规整孔道与超高比表面积的可设计晶态多孔杂化材料 。
|
||||||
|
MOF有什么特点?,MOF拥有极高比表面积、可精准调控的有序孔道,结构易定制,但多数水热与热稳定性较差。
|
||||||
|
MOF有什么用?,气体分离储存、催化、电化学储能、生物药物递送、污染物吸附、传感检测。
|
||||||
|
MOF目前的前沿领域是什么?,当前MOF前沿以AI计算辅助定向设计、导电MOF电化学能源、缺陷/配体精准调控为核心,同步拓展碳捕集、海水资源提取、类脑器件等交叉应用。
|
||||||
|
Reference in New Issue
Block a user