以下是适合初学者理解的关于开源大模型(如 LLaMA、InternLM、Baichuan、DeepSeek、Qwen 等)二次开发或训练经验的关键点和概述,:
以下是关于开源大模型(如 LLaMA、InternLM、Baichuan、DeepSeek、Qwen 等)二次开发或训练经验的详细调研,旨在为研究者和开发者提供全面的参考,内容涵盖部署、微调、工具使用及相关挑战。
随着人工智能技术的发展,开源大模型如 LLaMA、InternLM、Baichuan、DeepSeek 和 Qwen 已成为自然语言处理领域的核心工具。二次开发或训练这些模型,旨在通过微调和定制化部署满足特定行业需求。本报告基于 2025 年 4 月 24 日的最新信息,总结了这些模型的实践经验。
LLaMA 和 Qwen 模型在二次开发中常用于私有化部署,特别适合代码生成和对话系统:
ollama run qwen2:7b
。这适合隐私敏感项目,如团队内部的 Code Copilot 开发。InternLM 系列(如 InternLM2-Chat-7B)在二次开发中表现出色,支持多种部署和微调方式:
deploy.sh
,参数包括 tensor_parallel_size、max_batch_size(例如 64)和 cache_max_entry_count(例如 0.1),默认端口为 8888。deepspeed --hostfile=$hostfile fine-tune.py --data_path "data/belle_chat_ramdon_10k.json" --model_name_or_path "internlm/internlm2-chat-7b" --output_dir "output" --num_train_epochs 4 --per_device_train_batch_size 16
多机训练需指定 hostfile,LoRA 微调可添加 --use_lora True
。Baichuan2(7B 和 13B 版本)在中文场景中表现优异,二次开发经验包括量化部署和细致微调:
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("baichuan-inc/Baichuan2-13B-Chat", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("baichuan-inc/Baichuan2-13B-Chat", device_map="auto", trust_remote_code=True)
精度 | Baichuan2-7B | Baichuan2-13B |
---|---|---|
bf16/fp16 | 15.3 | 27.5 |
8bits | 8.0 | 16.1 |
4bits | 5.1 | 8.6 |
deepspeed --hostfile=$hostfile fine-tune.py --data_path "data/belle_chat_ramdon_10k.json" --model_name_or_path "baichuan-inc/Baichuan2-7B-Base" --output_dir "output" --num_train_epochs 4 --per_device_train_batch_size 16
源代码解析见 CSDN 博客,涵盖命令行参数解析、数据预处理和 LoRA 优化。DeepSeek 系列(如 DeepSeek-R1 和 DeepSeek-V3)在开源模型中表现突出,但二次开发经验相对有限:
chat.deepseek-free.org
访问 DeepSeek-R1 和 V3 模型,快速稳定。原始数据集通常是未加工的文本、对话记录、日志或网页数据,需清洗和结构化。
[
{
"conversation_id": "001",
"dialogue": [
{"user": "我的订单还没到,怎么办?", "agent": "请提供订单号,我帮您查询。"},
{"user": "订单号是 XYZ123。", "agent": "已查到,预计明天送达。"}
]
}
]
import json
import re
def clean_text(text):
text = re.sub(r'<[^>]+>', '', text) # 去除 HTML
text = re.sub(r'http[s]?://\S+', '', text) # 去除 URL
text = re.sub(r'[^\w\s]', '', text) # 去除特殊字符
return text.strip()
with open('raw_data.json', 'r', encoding='utf-8') as f:
raw_data = json.load(f)
cleaned_data = []
for conv in rawFacets(raw_data):
cleaned_conv = {
"conversation_id": conv["conversation_id"],
"dialogue": [
{"user": clean_text(d["user"]), "agent": clean_text(d["agent"])}
for d in conv["dialogue"]
]
}
cleaned_data.append(cleaned_conv)
with open('cleaned_data.json', 'w', encoding='utf-8') as f:
json.dump(cleaned_data, f, ensure_ascii=False, indent=2)
from transformers import pipeline
classifier = pipeline("text-classification", model="distilbert-base-uncased-finetuned-sst-2-english")
for conv in cleaned_data:
for d in conv["dialogue"]:
d["intent"] = classifier(d["user"])[0]["label"]
语义重分段将长文本或对话按语义单元分割,使用大模型的结构化输出(如 JSON)确保分段准确。
你是一个语义分析助手。请将以下对话按语义单元分割,输出 JSON 格式,每个单元包含“theme”和“content”。对话:
用户:我的订单还没到,怎么办?客服:请提供订单号,我帮您查询。用户:订单号是 XYZ123。客服:已查到,预计明天送达。
输出格式:
```json
[
{"theme": "问题描述", "content": "..."},
{"theme": "信息提供", "content": "..."},
...
]
pip install transformers torch
from transformers import AutoModelForCausalLM, AutoTokenizer
import json
import torch
model_name = "Qwen/Qwen2-7B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
device_map="auto",
trust_remote_code=True
)
def semantic_chunking(dialogue):
prompt = f"""你是一个语义分析助手。请将以下对话按语义单元分割,输出 JSON 格式,每个单元包含“theme”和“content”。对话:
{dialogue}
输出格式:
```json
[
{{"theme": "主题", "content": "内容"}},
...
]
```"""
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_length=1000, temperature=0.7)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
json_start = response.find("```json")
json_end = response.rfind("```")
json_str = response[json_start+7:json_end].strip()
return json.loads(json_str)
dialogue = """
用户:我的订单还没到,怎么办?
客服:请提供订单号,我帮您查询。
用户:订单号是 XYZ123。
客服:已查到,预计明天送达。
"""
chunks = semantic_chunking(dialogue)
with open('semantic_chunks.json', 'w', encoding='utf-8') as f:
json.dump(chunks, f, ensure_ascii=False, indent=2)
[
{"theme": "问题描述", "content": "用户:我的订单还没到,怎么办?"},
{"theme": "信息请求", "content": "客服:请提供订单号,我帮您查询。"},
{"theme": "信息提供", "content": "用户:订单号是 XYZ123。"},
{"theme": "问题解决", "content": "客服:已查到,预计明天送达。"}
]
model = AutoModelForCausalLM.from_pretrained(model_name, load_in_4bit=True, device_map="auto", trust_remote_code=True)
基于语义分段结果,构造单轮和多轮对话数据集,用于微调。
{"prompt": "...", "response": "..."}
def build_single_turn_dataset(chunks):
single_turn_data = []
for i, chunk in enumerate(chunks):
if chunk["theme"] in ["问题描述", "信息提供"]:
if i + 1 < len(chunks) and chunks[i + 1]["theme"] in ["信息请求", "问题解决"]:
single_turn_data.append({
"prompt": chunk["content"],
"response": chunks[i + 1]["content"]
})
return single_turn_data
with open('semantic_chunks.json', 'r', encoding='utf-8') as f:
chunks = json.load(f)
single_turn_dataset = build_single_turn_dataset(chunks)
with open('single_turn_dataset.json', 'w', encoding='utf-8') as f:
json.dump(single_turn_dataset, f, ensure_ascii=False, indent=2)
[
{
"prompt": "用户:我的订单还没到,怎么办?",
"response": "客服:请提供订单号,我帮您查询。"
},
{
"prompt": "用户:订单号是 XYZ123。",
"response": "客服:已查到,预计明天送达。"
}
]
[{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]
def build_multi_turn_dataset(chunks):
multi_turn_data = []
current_conv = []
for chunk in chunks:
if "用户" in chunk["content"]:
current_conv.append({"role": "user", "content": chunk["content"].replace("用户:", "").strip()})
elif "客服" in chunk["content"]:
current_conv.append({"role": "assistant", "content": chunk["content"].replace("客服:", "").strip()})
multi_turn_data.append(current_conv)
return multi_turn_data
multi_turn_dataset = build_multi_turn_dataset(chunks)
with open('multi_turn_dataset.json', 'w', encoding='utf-8') as f:
json.dump(multi_turn_dataset, f, ensure_ascii=False, indent=2)
[
[
{"role": "user", "content": "我的订单还没到,怎么办?"},
{"role": "assistant", "content": "请提供订单号,我帮您查询。"},
{"role": "user", "content": "订单号是 XYZ123。"},
{"role": "assistant", "content": "已查到,预计明天送达。"}
]
]
GRPO 数据集用于偏好优化,包含用户输入、多个回答和偏好标签。
{"prompt": "...", "chosen": "...", "rejected": "..."}
{
"prompt": "用户:我的订单还没到,怎么办?",
"chosen": "请提供订单号,我帮您查询。",
"rejected": "抱歉,我无法帮您,请稍后再试。"
}
def generate_responses(prompt, model, tokenizer, num_responses=3):
responses = []
for _ in range(num_responses):
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_length=100, temperature=0.9, do_sample=True)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
responses.append(response)
return responses
prompt = "用户:我的订单还没到,怎么办?"
candidate_responses = generate_responses(prompt, model, tokenizer)
def build_grpo_dataset(prompts, model, tokenizer):
grpo_data = []
for prompt in prompts:
responses = generate_responses(prompt, model, tokenizer)
grpo_data.append({
"prompt": prompt,
"chosen": responses[0],
"rejected": responses[1]
})
return grpo_data
with open('single_turn_dataset.json', 'r', encoding='utf-8') as f:
single_turn_data = json.load(f)
prompts = [item["prompt"] for item in single_turn_data]
grpo_dataset = build_grpo_dataset(prompts[:10], model, tokenizer)
with open('grpo_dataset.json', 'w', encoding='utf-8') as f:
json.dump(grpo_dataset, f, ensure_ascii=False, indent=2)
deepspeed finetune.py --data_path "single_turn_dataset.json" --model_name_or_path "Qwen/Qwen2-7B-Instruct" --output_dir "output" --num_train_epochs 4 --per_device_train_batch_size 16 --use_lora True
from trl import PPOTrainer, PPOConfig
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Qwen/Qwen2-7B-Instruct"
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(model_name)
config = PPOConfig(model_name=model_name, learning_rate=1e-5)
ppo_trainer = PPOTrainer(config=config, model=model, tokenizer=tokenizer)
with open('grpo_dataset.json', 'r', encoding='utf-8') as f:
grpo_data = json.load(f)
for data in grpo_data:
prompt = data["prompt"]
chosen = data["chosen"]
rejected = data["rejected"]
rewards = [1.0 if resp == chosen else -1.0 for resp in [chosen, rejected]]
ppo_trainer.step([prompt], [chosen, rejected], rewards)
SELECT * FROM customer_support
)。PyPDF2
或 pdfplumber
)、Excel 读取(pandas
)。BeautifulSoup
或 Scrapy
)。import json
import re
import pandas as pd
from bs4 import BeautifulSoup
import pdfplumber
def clean_text(text):
text = re.sub(r'<[^>]+>', '', text)
text = re.sub(r'http[s]?://\S+', '', text)
text = re.sub(r'[^\w\s]', '', text)
return text.strip()
# 数据库(JSON)
with open('customer_support.json', 'r', encoding='utf-8') as f:
db_data = json.load(f)
db_cleaned = [{k: clean_text(v) if isinstance(v, str) else v for k, v in item.items()} for item in db_data]
# PDF
with pdfplumber.open('product_manual.pdf') as pdf:
pdf_text = ''.join(page.extract_text() for page in pdf.pages)
pdf_cleaned = clean_text(pdf_text)
# 网页
with open('faq.html', 'r', encoding='utf-8') as f:
soup = BeautifulSoup(f, 'html.parser')
web_text = soup.get_text()
web_cleaned = clean_text(web_text)
# 保存
cleaned_data = {"db": db_cleaned, "pdf": pdf_cleaned, "web": web_cleaned}
with open('cleaned_data.json', 'w', encoding='utf-8') as f:
json.dump(cleaned_data, f, ensure_ascii=False, indent=2)
利用低成本大模型 API(如 DeepSeek R1,免费 100K Token)进行语义分段,基于分段指令自动化生成结构化输出。
你是一个语义分析助手。请将以下文本按语义单元分割,输出 JSON 格式,每个单元包含“theme”和“content”。确保主题清晰(如“问题描述”“信息请求”)。文本:
{text}
输出:
```json
[
{"theme": "主题", "content": "内容"},
...
]
import json
import requests
def semantic_chunking(text, api_key):
prompt = f"""你是一个语义分析助手。请将以下文本按语义单元分割,输出 JSON 格式,每个单元包含“theme”和“content”。确保主题清晰(如“问题描述”“信息请求”)。文本:
{text}
输出:
```json
[
{{"theme": "主题", "content": "内容"}},
...
]
```"""
response = requests.post(
"https://api.deepseek.com/v1/chat/completions",
headers={"Authorization": f"Bearer {api_key}"},
json={
"model": "deepseek-r1",
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 1000
}
)
result = response.json()
json_str = result["choices"][0]["message"]["content"].split("```json")[1].split("```")[0].strip()
return json.loads(json_str)
# 示例
with open('cleaned_data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
text = data["db"][0]["dialogue"][0]["user"] + "\n" + data["db"][0]["dialogue"][0]["agent"]
api_key = "your_deepseek_api_key"
chunks = semantic_chunking(text, api_key)
with open('semantic_chunks.json', 'w', encoding='utf-8') as f:
json.dump(chunks, f, ensure_ascii=False, indent=2)
基于语义分段结果,使用问答生成指令,自动化构建单轮和多轮对话数据集。
你是一个对话生成助手。基于以下语义单元,生成单轮问答对,格式为 {"prompt": "用户输入", "response": "助手回复"}。单元:
{chunk}
输出:
```json
{"prompt": "用户输入", "response": "助手回复"}
你是一个对话生成助手。基于以下语义单元序列,生成多轮对话,格式为 [{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]。单元:
{chunks}
输出:
```json
[
{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."},
...
]
import json
import requests
def generate_single_turn(chunk, api_key):
prompt = f"""你是一个对话生成助手。基于以下语义单元,生成单轮问答对,格式为 {{"prompt": "用户输入", "response": "助手回复"}}。单元:
{json.dumps(chunk, ensure_ascii=False)}
输出:
```json
{{"prompt": "用户输入", "response": "助手回复"}}
```"""
response = requests.post(
"https://api.deepseek.com/v1/chat/completions",
headers={"Authorization": f"Bearer {api_key}"},
json={
"model": "deepseek-r1",
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 500
}
)
result = response.json()
json_str = result["choices"][0]["message"]["content"].split("```json")[1].split("```")[0].strip()
return json.loads(json_str)
def generate_multi_turn(chunks, api_key):
prompt = f"""你是一个对话生成助手。基于以下语义单元序列,生成多轮对话,格式为 [{{"role": "user", "content": "..."}}, {{"role": "assistant", "content": "..."}}]。单元:
{json.dumps(chunks, ensure_ascii=False)}
输出:
```json
[
{{"role": "user", "content": "..."}},
{{"role": "assistant", "content": "..."}},
...
]
```"""
response = requests.post(
"https://api.deepseek.com/v1/chat/completions",
headers={"Authorization": f"Bearer {api_key}"},
json={
"model": "deepseek-r1",
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 1000
}
)
result = response.json()
json_str = result["choices"][0]["message"]["content"].split("```json")[1].split("```")[0].strip()
return json.loads(json_str)
# 加载语义分段
with open('semantic_chunks.json', 'r', encoding='utf-8') as f:
chunks = json.load(f)
api_key = "your_deepseek_api_key"
single_turn_dataset = [generate_single_turn(chunk, api_key) for chunk in chunks if chunk["theme"] in ["问题描述", "信息提供"]]
multi_turn_dataset = [generate_multi_turn(chunks, api_key)]
# 保存
with open('single_turn_dataset.json', 'w', encoding='utf-8') as f:
json.dump(single_turn_dataset, f, ensure_ascii=False, indent=2)
with open('multi_turn_dataset.json', 'w', encoding='utf-8') as f:
json.dump(multi_turn_dataset, f, ensure_ascii=False, indent=2)
使用强化学习指令,生成带偏好标签的 GRPO 数据集。
你是一个偏好生成助手。基于以下用户输入,生成两个助手回复(一个优选,一个次选),输出格式为 {"prompt": "用户输入", "chosen": "优选回复", "rejected": "次选回复"}。优选回复需清晰、礼貌且解决问题;次选回复可模糊或无帮助。输入:
{prompt}
输出:
```json
{"prompt": "用户输入", "chosen": "优选回复", "rejected": "次选回复"}
import json
import requests
def generate_grpo(prompt, api_key):
prompt_text = f"""你是一个偏好生成助手。基于以下用户输入,生成两个助手回复(一个优选,一个次选),输出格式为 {{"prompt": "用户输入", "chosen": "优选回复", "rejected": "次选回复"}}。优选回复需清晰、礼貌且解决问题;次选回复可模糊或无帮助。输入:
{prompt}
输出:
```json
{{"prompt": "用户输入", "chosen": "优选回复", "rejected": "次选回复"}}
```"""
response = requests.post(
"https://api.deepseek.com/v1/chat/completions",
headers={"Authorization": f"Bearer {api_key}"},
json={
"model": "deepseek-r1",
"messages": [{"role": "user", "content": prompt_text}],
"max_tokens": 500
}
)
result = response.json()
json_str = result["choices"][0]["message"]["content"].split("```json")[1].split("```")[0].strip()
return json.loads(json_str)
# 加载单轮数据集
with open('single_turn_dataset.json', 'r', encoding='utf-8') as f:
single_turn_data = json.load(f)
prompts = [item["prompt"] for item in single_turn_data]
api_key = "your_deepseek_api_key"
grpo_dataset = [generate_grpo(prompt, api_key) for prompt in prompts[:1000]] # 1000 条
with open('grpo_dataset.json', 'w', encoding='utf-8') as f:
json.dump(grpo_dataset, f, ensure_ascii=False, indent=2)
import json
import random
with open('openorca.json', 'r') as f:
openorca = json.load(f)[:7000] # 7000 条
with open('single_turn_dataset.json', 'r') as f:
single_turn = json.load(f)
with open('multi_turn_dataset.json', 'r') as f:
multi_turn = json.load(f)
with open('grpo_dataset.json', 'r') as f:
grpo = json.load(f)
combined_dataset = openorca + single_turn + multi_turn + grpo
random.shuffle(combined_dataset)
with open('combined_dataset.json', 'w', encoding='utf-8') as f:
json.dump(combined_dataset, f, ensure_ascii=False, indent=2)
from transformers import AutoModelForCausalLM, AutoTokenizer, Trainer, TrainingArguments
from peft import LoraConfig, get_peft_model
from datasets import load_dataset
model_name = "Qwen/Qwen2-7B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16)
lora_config = LoraConfig(r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.1)
model = get_peft_model(model, lora_config)
dataset = load_dataset("json", data_files="combined_dataset.json")
training_args = TrainingArguments(
output_dir="./output",
num_train_epochs=3,
per_device_train_batch_size=8,
deepspeed="ds_config.json"
)
trainer = Trainer(model=model, args=training_args, train_dataset=dataset["train"], tokenizer=tokenizer)
trainer.train()
from trl import PPOTrainer, PPOConfig
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Qwen/Qwen2-7B-Instruct"
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained(model_name)
config = PPOConfig(model_name=model_name, learning_rate=1e-5)
ppo_trainer = PPOTrainer(config=config, model=model, tokenizer=tokenizer)
with open('grpo_dataset.json', 'r') as f:
grpo_data = json.load(f)
for data in grpo_data:
prompt = data["prompt"]
chosen = data["chosen"]
rejected = data["rejected"]
rewards = [1.0 if resp == chosen else -1.0 for resp in [chosen, rejected]]
ppo_trainer.step([prompt], [chosen, rejected], rewards)
从领域数据库(如 CRM 系统)、文件(如 PDF)和网页(如官网 FAQ)中提取数据,清洗后形成结构化格式(如 JSON)。这为后续生成奠定基础。
使用大模型 API 生成数据集:
将垂直领域数据集(30%)与开源数据集(如 OpenOrca,70%)结合,基于 LoRA 和 deepspeed 技术微调开源大模型。GRPO 可进一步优化模型偏好。
通过自动化指令模板和模块化设计,减少人工干预,动态调整指令以适应领域需求(如电商的“退货”“物流”术语)。
以下是关于利用低成本大模型商业化接口,基于领域数据库、文件、网页生成垂直领域数据集,并结合开源数据集微调开源大模型以提升垂直领域生成效果的详细调研,内容涵盖数据准备、数据集生成、微调流程及相关挑战,适合研究者和开发者参考。
随着大模型商业化接口(如 DeepSeek、Qwen API)的成本降低,利用这些接口生成垂直领域数据集成为可能。通过设计分段指令、单轮问答生成指令、多轮问答生成指令和 GRPO 强化学习生成指令,可以在几百元的预算内打造高质量数据集。结合开源数据集(如 OpenOrca、Alpaca),基于开源大模型(如 Qwen2-7B、InternLM2-Chat-7B)进行微调,可显著提升模型在垂直领域的生成效果。
PyPDF2
或 pdfplumber
解析 PDF,BeautifulSoup
爬取网页,pandas
处理 Excel。利用低成本大模型 API(如 DeepSeek R1,免费 100K Token,或 Qwen API,约 0.01 元/1K Token)生成数据集,基于不同阶段的指令实现自动化。
你是一个语义分析助手。请将以下文本按语义单元分割,输出 JSON 格式,每个单元包含“theme”和“content”。确保主题清晰(如“问题描述”“信息请求”)。文本:
{text}
输出:
```json
[
{"theme": "主题", "content": "内容"},
...
]
你是一个对话生成助手。基于以下语义单元,生成单轮问答对,格式为 {"prompt": "用户输入", "response": "助手回复"}。单元:
{chunk}
输出:
```json
{"prompt": "用户输入", "response": "助手回复"}
你是一个对话生成助手。基于以下语义单元序列,生成多轮对话,格式为 [{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]。单元:
{chunks}
输出:
```json
[
{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."},
...
]
你是一个偏好生成助手。基于以下用户输入,生成两个助手回复(一个优选,一个次选),输出格式为 {"prompt": "用户输入", "chosen": "优选回复", "rejected": "次选回复"}。优选回复需清晰、礼貌且解决问题;次选回复可模糊或无帮助。输入:
{prompt}
输出:
```json
{"prompt": "用户输入", "chosen": "优选回复", "rejected": "次选回复"}
combined_dataset.json
。from transformers import AutoModelForCausalLM, AutoTokenizer, Trainer, TrainingArguments
from peft import LoraConfig, get_peft_model
from datasets import load_dataset
model_name = "Qwen/Qwen2-7B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16)
lora_config = LoraConfig(r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.1)
model = get_peft_model(model, lora_config)
dataset = load_dataset("json", data_files="combined_dataset.json")
training_args = TrainingArguments(
output_dir="./output",
num_train_epochs=3,
per_device_train_batch_size=8,
deepspeed="ds_config.json"
)
trainer = Trainer(model=model, args=training_args, train_dataset=dataset["train"], tokenizer=tokenizer)
trainer.train()
利用低成本的大模型商业化接口(如 DeepSeek、Qwen),结合领域数据库、文件、网页等资源,可以在几百元的预算内,通过分段、单轮问答、多轮问答和 GRPO 指令生成高质量的垂直领域数据集。结合开源数据集(如 OpenOrca、Alpaca)进行配比,基于开源大模型(如 Qwen2-7B、InternLM2-Chat-7B)进行微调,可显著提升模型在垂直领域的生成效果。这种方法自动化程度高,模块化设计便于扩展,适合预算有限的团队。
从领域数据库、文件和网页中提取数据,清洗后形成结构化格式(如JSON),为后续生成奠定基础。
使用低成本大模型API(如DeepSeek R1,免费100K Token)按语义单元分割文本,输出JSON格式的“theme”和“content”,成本约100元。
基于语义单元生成单轮问答(1000条)和多轮对话(500条),成本约10元。
生成带偏好标签的GRPO数据集(1000条),成本约5元,总预算300-400元。
将垂直领域数据集(30%)与开源数据集(如OpenOrca,70%)结合,基于LoRA和deepspeed微调开源大模型(如Qwen2-7B),GRPO优化模型偏好。
随着生成式语言模型(LLM)在垂直领域的应用不断深化,其任务范畴从早期的对话(chat)逐渐转向更复杂的任务,如基于非结构化离散序列构建指令(response)。这一转变不仅体现在OpenAI从Chat API到Responses API的技术升级,也反映了行业整体对LLM能力的更高要求。以下是详细分析,涵盖任务演变、技术转变、垂直领域应用及未来趋势。
早期:对话(Chat)
后期:指令构建(Response)
Chat API
Responses API
previous_response_id
参数,模型可以维护对话状态,无需手动管理上下文。previous_response_id
管理聊天历史。previous_response_id
携带。truncation:auto
截断。迁移与现状
任务范畴的扩展
非结构化数据的处理
指令构建的意义
数据准备
PyPDF2
解析PDF,BeautifulSoup
爬取网页,pandas
处理Excel。数据集生成(使用大模型API)
数据集配比与微调
以下是Responses API在垂直领域的应用案例,基于DataCamp教程:
领域 | 任务 | 示例 | 相关工具 |
---|---|---|---|
电商 | 产品描述生成 | 为“NoiseGuard Pro Headphones”生成描述 | 文本生成 |
电商 | 图像分析 | 分析体育纪念品图像,识别类别和改进建议 | 多模态支持 |
客户反馈分析 | 实时分析客户反馈 | 分析SmartHome Hub评论,提取情感和问题 | 流式处理 |
金融分析 | 货币转换 | 将100欧元转换为日元,返回16,473.12日元 | 函数调用 |
文档分析 | 提取产品信息 | 从“Premium Laptop Backpack”描述中提取JSON数据 | 结构化输出 |
新闻聚合 | Web搜索实时股票新闻 | 搜索美中贸易紧张影响S&P 500的新闻 | Web Search工具 |
法律/研究 | 文件搜索 | 从法律合同中提取信息,支持PDF/Word | File Search工具 |
流程自动化 | 计算机使用 | 自动化表单填写或网站导航,如UI测试 | Computer Use工具 |
这些案例展示了Responses API如何处理非结构化数据并生成结构化指令,适合垂直领域需求。
行业趋势
未来发展
生成式语言模型从对话(chat)向指令构建(response)的转变,是技术进步和行业需求共同推动的结果。这一转变使得LLM在垂直领域的应用更加广泛和深入,能够处理从非结构化数据到指令生成的复杂任务。OpenAI的Responses API通过内置工具和状态管理能力,显著提升了模型的灵活性和实用性,为垂直领域的智能化应用提供了强大的支持。
但是中国的大模型接口对response的支持非常的少 也意味着中国的大模型只是被动复制类型的大模型,在大模型的系统性视角下观察中国并不注重大模型基础建设与行业通用协议的遵循。
中国的大模型接口对“response”功能(如工具调用和结构化输出)的支持相对有限,这可能导致它们在某些复杂任务上的表现不如 OpenAI 的 Responses API。然而,部分模型如 Qwen 已经具备这些能力,显示中国在基础建设上有所投入,但行业标准和接口设计的国际化程度仍有提升空间。
控制令牌)和结构化输出(如 ChatML 格式),这与 OpenAI 的 Responses API 类似。研究建议,随着中国大模型的快速发展,未来可能在接口标准化和功能支持上进一步与国际接轨,尤其是在垂直领域应用中。
随着生成式语言模型(LLM)在垂直领域的应用不断深化,其任务从对话(chat)转向更复杂的指令构建(response),如工具调用和结构化输出,这要求模型能够处理非结构化数据并生成具体操作指令。OpenAI 的 Responses API 提供了这一功能的典型示例,包括工具支持(如 Web Search、File Search)和状态管理。然而,中国的 LLM 接口对这些功能的支持相对较少,这可能反映出中国大模型在基础建设和行业通用协议遵循上的不足。以下是详细分析,涵盖支持情况、基础建设投入、行业标准遵循及未来趋势,基于 2025 年 4 月 25 日的最新信息。
“response”功能通常指类似 OpenAI Responses API 的能力,包括工具调用(如调用外部工具如搜索引擎、文件系统)和结构化输出(如 JSON 格式的响应),这对垂直领域(如电商、医疗)的复杂任务尤为重要。
Qwen(通义千问):
和
控制令牌来实现工具调用,允许模型调用外部工具(如 API、数据库)以完成任务 (Qwen 关键概念)。user
、assistant
和 system
,这为生成结构化响应提供了基础。DeepSeek:
其他模型:
总结:中国的大模型(如 Qwen)确实支持工具调用和结构化输出,但接口的标准化和易用性可能不如 OpenAI 的 Responses API。例如,Qwen 的工具调用需要通过特定控制令牌实现,而 DeepSeek 的文档中对类似功能的描述较少。这可能导致使用者觉得这些功能的支持“较少”,尤其是在接口设计和用户体验上。
基础建设:
行业通用协议:
总结:中国在大模型基础建设上的投入是显著的,体现在模型性能、开源程度和计算资源上的优化。但在行业通用协议的遵循上,中国的大模型开发可能尚未完全与国际标准同步,这可能导致其接口和功能在某些方面不如 OpenAI 的 Responses API 那样标准化和易用。
优势:
挑战:
以下是 Qwen 和 DeepSeek 在垂直领域的应用案例,基于公开信息:
领域 | 任务 | 示例 | 相关工具 |
---|---|---|---|
电商 | 产品描述生成 | 为“NoiseGuard Pro Headphones”生成描述 | 文本生成 |
医疗 | 症状提取与诊断建议 | 从患者描述中提取症状,生成初步诊断指令 | 工具调用 |
金融 | 合同条款提取 | 从财务合同中提取关键条款,生成 JSON 输出 | 结构化输出 |
这些案例显示,中国大模型在垂直领域的应用潜力巨大,但工具调用和结构化输出的支持可能因模型而异。
中国的大模型接口对“response”功能的支持存在一定局限性,但并非完全缺乏支持。例如,Qwen 已具备工具调用和结构化输出的能力,而 DeepSeek 在多模态和实时响应上表现优异。中国在大模型基础建设上的投入是显著的,体现在模型性能和开源程度上,但行业通用协议的遵循可能尚未完全与国际标准同步。这反映出中国大模型在快速发展中仍需在接口标准化和全球兼容性上进一步努力。