完整案例展示用 Multi-Agent 框架自动生成微调数据,72 小时运行产出超千条高质量样本。
内存泄漏修复与数据质量漂移
我需要高质量的指令数据集来微调本地 LLM,但商业方案贵得令人望而却步(质量尚可的数据集要价 500~2,000 美元)。
于是我问自己:能不能构建一个系统,让它在我睡觉时自动生成这些数据集?
结果:72 小时内生成了 1,065 组专业的指令/回答对,100% 在本地运行,API 成本为零。
下面就是我的完整实现过程。
当你想针对特定任务微调本地 LLM 时,通常有三种选择:
使用通用数据集 → 与你的领域不匹配
手动创建 → 费时费力、速度慢,而且无法规模化
购买商业数据集 → 昂贵(500~2,000 美元),定制空间有限
我想要的是包含以下特征的代码指令对:
Python、AI、ML、DevOps、数据库等主题
Chain-of-Thought 推理,而不只是答案
贴近真实世界的复杂度,而不是模板化回答
持续生成,最好能 24/7 不间断运行
现有方案没有一个能同时满足这四点。
我参考学术研究工作流,构建了一个由三个 Agent 组成的系统:
┌──────────────────┐
│ Curator │ ← Selects topics from knowledge base
│ (Qwen 7B) │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ Producer │ ← Generates instruction + response + CoT
│ (Qwen 7B) │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ Critic │ ← Validates logic, checks hallucinations
│ (DeepSeek 1.5B)│
└────────┬─────────┘
│
▼
[Accept/Reject]
读取包含候选主题的 ChromaDB 向量存储
根据多样性和优先级选择下一个主题
通过相似度搜索防止重复
可以把它理解为一名研究型图书管理员
生成实际的指令/回答对
包含 Chain-of-Thought 推理
利用领域知识构造真实场景
可以把它理解为一名专家作者
检查 Producer 的输出,包括:幻觉、逻辑错误、推理不完整、通用模板式回答
通用模板式回答
做出二元决策:接受或拒绝
可以把它理解为一名同行评审专家
# 1. Ollama (Local LLM Engine)
# Custom Modelfiles with 8k context:
qwen2.5-coder-8k:7b # 4.7GB, main generator
deepseek-r1-8k:1.5b # 1.1GB, validator
# 2. CrewAI (Agent Orchestration)
from crewai import Agent, Crew, Task
# 3. ChromaDB (Deduplication + Memory)
from chromadb import Client
# 4. Flask (Real-time Dashboard)
from flask import Flask, render_template
AMD Ryzen AI 9 HX 370(12 核,32GB RAM,与 VRAM 共享)
迷你主机(Geekom A9 Max,约 899 美元)
NVMe SSD(用于快速加载模型)
总投入:899 美元硬件成本,加上 72 小时约 3.60 美元的电费
问题:Agent 实例会不断累积状态。运行约 100 个周期后,性能开始下降,最终崩溃。
解决方案:每个周期都重新创建所有 Agent。
from crewai import Agent, Crew, Task
for cycle in range(1000):
# Recreate agents from scratch (prevents memory leaks)
curator = Agent(
role="Topic Curator",
goal="Select next topic to generate",
llm=ollama_qwen
)
producer = Agent(
role="Content Producer",
goal="Generate high-quality instruction pair",
llm=ollama_qwen
)
critic = Agent(
role="Quality Critic",
goal="Validate logic and catch hallucinations",
llm=ollama_deepseek
)
# Define sequential workflow
tasks = [
Task(description="Select topic", agent=curator),
Task(description="Generate content", agent=producer),
Task(description="Validate quality", agent=critic)
]
crew = Crew(agents=[curator, producer, critic], tasks=tasks)
result = crew.kickoff()
# Explicit cleanup
del crew, curator, producer, critic
结果:72 小时内零崩溃,RAM 使用量稳定在 24.2GB。
问题:CrewAI v1.12+ 要求响应只能是字符串,但 Ollama 默认返回对象。
解决方案:将配置嵌入 Modelfile,一劳永逸地解决问题。
# Modelfile for qwen2.5-coder-8k:7b
FROM qwen2.5-coder:7b
PARAMETER num_ctx 8192
PARAMETER temperature 0.7
PARAMETER top_p 0.9
SYSTEM """You are an expert programmer..."""
ollama create qwen2.5-coder-8k:7b -f Modelfile_qwen
ollama create deepseek-r1-8k:1.5b -f Modelfile_deepseek
这样会在模型层面永久设置 num_ctx: 8192,不再需要运行时配置。
问题:随机生成主题会产生重复内容。
解决方案:使用 ChromaDB 进行相似度搜索并拒绝重复项。
import chromadb
client = chromadb.Client()
collection = client.create_collection("generated_questions")
def is_duplicate(new_question, threshold=0.85):
"""Check if question already exists via embedding similarity"""
results = collection.query(
query_texts=[new_question],
n_results=1
)
if not results['ids']:
return False
similarity = results['distances'][0][0]
return similarity > threshold
# Before saving
if not is_duplicate(instruction):
save_to_dataset(entry)
collection.add(
documents=[instruction],
ids=[unique_id]
)
结果:1,065 条数据覆盖 452 个独立主题,重复数为零。
系统一直没有停止运行。
最初的 72 小时运行结束后,我继续让这个自治系统保持工作。六天后,它一共生成了 2,772 条数据,比原始数据集增长了 160%。
关键结论:这套自治架构证明了自身具备长期运行的可行性。系统零崩溃,质量始终稳定,接受率维持在约 50%;当我忙于其他项目时,它仍在 24/7 持续生成数据。
更新后的免费数据集:全部 5 个 HuggingFace LITE 仓库现在都包含扩充后的数据,分别有 462、362、155、148、112 条。可查看下方内容获取最新版本。
Python:346 条(33%)
AI/ML:287 条(27%)
Backend/API:126 条(12%)
数据库/SQL:99 条(9%)
DevOps/Cloud:99 条(9%)
其他:108 条(10%)
{
"instruction": "How to create a Dockerfile for a Python application?",
"input": "",
"output": "# Step-by-step guide to create a production-ready Dockerfile:\n\n1. **Choose Base Image**\n - Use official Python image: `python:3.11-slim`\n - For smaller size: `python:3.11-alpine`\n\n2. **Set Working Directory**\n ```
dockerfile\n WORKDIR /app\n
```\n\n3. **Copy Requirements First** (leverage Docker cache)\n ```
dockerfile\n COPY requirements.txt .\n RUN pip install --no-cache-dir -r requirements.txt\n
```\n\n4. **Copy Application Code**\n ```
dockerfile\n COPY . .\n
```\n\n5. **Set Environment Variables**\n ```
dockerfile\n ENV PYTHONUNBUFFERED=1\n ENV PORT=8000\n
```\n\n6. **Expose Port**\n ```
dockerfile\n EXPOSE $PORT\n
```\n\n7. **Define Entrypoint**\n ```
dockerfile\n CMD [\"python\", \"app.py\"]\n
```\n\n**Complete Example:**\n```
dockerfile\nFROM python:3.11-slim\nWORKDIR /app\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\nCOPY . .\nENV PYTHONUNBUFFERED=1\nEXPOSE 8000\nCMD [\"uvicorn\", \"main:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8000\"]\n
```\n\n**Best Practices:**\n- Use multi-stage builds for smaller images\n- Don't run as root (create user)\n- Use .dockerignore to exclude unnecessary files\n- Pin dependency versions in requirements.txt",
"thought": "User needs containerization setup. Key considerations: 1) Layer caching optimization (copy requirements first), 2) Security (non-root user), 3) Image size (slim vs alpine tradeoff), 4) Production readiness (health checks, signals). Template should be practical and immediately usable."
}
{
"instruction": "Explain the difference between EC2 instances and Lambda functions for ML model deployment",
"input": "",
"output": "**EC2 Instances vs Lambda for ML Deployment:**\n\n**EC2 Instances (Virtual Machines)**\n\n*Pros:*\n- Full control over environment (custom libraries, CUDA, etc.)\n- No execution time limits\n- Better for large models (multi-GB)\n- GPU support (P3, G4 instances)\n- Persistent connections (WebSockets, streaming)\n- Predictable latency\n\n*Cons:*\n- Always running = always paying ($50-500+/month)\n- Manual scaling configuration\n- Need to manage OS, security patches\n- Cold start when scaling from 0\n\n*Best for:*\n- Real-time inference with steady traffic\n- Models >1GB\n- GPU-intensive workloads\n- Long-running predictions (>15 min)\n\n**Lambda Functions (Serverless)**\n\n*Pros:*\n- Pay per invocation ($0.20 per 1M requests)\n- Auto-scaling (0 to thousands)\n- No server management\n- Built-in HA/fault tolerance\n\n*Cons:*\n- 15-minute timeout\n- Limited to 10GB RAM\n- No GPU support\n- Cold starts (1-5 seconds)\n- Package size limit (250MB unzipped)\n\n*Best for:*\n- Batch predictions\n- Small models (<100MB)\n- Sporadic/unpredictable traffic\n- Budget constraints\n\n**Hybrid Approach:**\nUse SageMaker Serverless Inference:\n- Lambda-like pricing\n- Support for larger models\n- Automatic scaling\n- GPU available\n\n**Decision Tree:**\n```
\nModel size >1GB? → EC2\nGPU required? → EC2\nConstant traffic? → EC2\nBudget <$50/mo? → Lambda\nUnpredictable spikes? → Lambda\n
```",
"thought": "User comparing infrastructure options for ML deployment. Critical factors: cost structure (fixed vs pay-per-use), model size constraints, GPU requirements, latency tolerance, traffic patterns. Should provide concrete decision criteria and mention SageMaker Serverless as middle ground. Real-world cost examples help contextualize."
}
硬件:一次性投入 899 美元,可永久重复使用
电费:72 小时 3.60 美元
每条数据:硬件摊销后为 0.85 美元,若只计算电费则为 0.003 美元
GPT-4 API:约 850 美元(平均 800 tokens × 0.001 美元/token × 1,065)
Claude API:约 1,200 美元(回答更长,价格更高)
OpenRouter DeepSeek:约 150 美元(最便宜的 API 方案)
节省:超过 99%(运行 2~3 次后,硬件成本即可回本)
50.9% 的拒绝率看起来很苛刻,但这是功能,不是 bug。
Critic Agent 能够发现:
❌ 捏造的事实(“Python 4.0 已经发布……”)
❌ 不完整的推理(只说“使用库 X”,却不解释原因)
❌ 通用模板(“下面是 5 个步骤……”)
❌ 逻辑错误(相互矛盾的陈述)
只有通过严格验证的数据才会被保留下来。
结果:每一条数据都达到了生产级质量。
一开始,我很怀疑 32GB RAM 能否同时运行两个 LLM。事实证明,AMD 的共享 VRAM 架构效果非常好:
生成过程中:占用 24.2GB RAM(利用率 87%)
CPU:平均利用率 31.1%(没有跑满,仍有优化空间)
周期耗时:每条数据约 6 分钟(两个模型依次运行)
稳定性:72 小时内零崩溃
相比之下,如果使用云端 GPU,每月需要花费 40~100 美元。
系统运行期间,我在:
睡觉(每晚 8 小时 × 3 晚,约生成 400 条)
工作(每天 8 小时 × 3 天,约生成 400 条)
为其他项目编写代码(每天 8 小时 × 3 天,约生成 265 条)
总计:生成 1,065 条数据,人工干预时间约 10 分钟,只需每天查看一次 Dashboard。
这就是自治系统的力量。
我刚刚向 HuggingFace 上传了 5 个 LITE 版本,其中包含 50% 的数据,完全免费:
包含 173 条数据,覆盖:
Docker/容器化
包含 143 条数据,覆盖:
模型部署(EC2、Lambda、SageMaker)
训练优化
Infrastructure as Code
身份认证模式
数据库优化
格式:JSONL,包含 instruction、input、output、thought 字段
许可证:MIT,可随意使用
适用于:HuggingFace Transformers、Axolotl、LLaMA Factory
多语言数据集(西班牙语、法语、德语)
难度级别(初级/中级/高级)
自定义领域(按需为特定细分领域生成)
视频教程(系统演示和配置指南)
如果大家有足够的兴趣,我会发布:
完整的 Agent 定义
Modelfile 配置
ChromaDB 配置脚本
Dashboard 代码(Flask + 实时指标)
整合脚本(JSONL → 分类产品)
更新:根据评论区的反馈,我会在本周结束前发布配置指南。
wget https://huggingface.co/datasets/bernabepuente/python-instruction-dataset/resolve/main/dataset.jsonl
import json
with open('dataset.jsonl', 'r') as f:
data = [json.loads(line) for line in f]
print(f"Loaded {len(data)} entries")
print(f"Sample: {data[0]}")
使用 Transformers 进行微调:
from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer
# Load your base model
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
# Prepare dataset
def format_prompt(entry):
return f"Instruction: {entry['instruction']}\n\nResponse: {entry['output']}"
# Train!
# (full training code in dataset README)
如果你想了解以下内容,欢迎留言:
如何优化 Ollama,使其适合长时间运行
用于生产环境的 CrewAI Agent 模式
ChromaDB 去重策略
数据集质量验证
本地 LLM 工作流的硬件建议
商业化实验(Scale AI、Gumroad、HF Premium)
构建一个能在你睡觉时继续工作的自治系统,是一件极具满足感的事。
这个项目让我明白:
只要 prompt 足够好,本地 LLM 也能达到商业级质量
多 Agent 验证可以捕获人类可能遗漏的错误
硬件投资很快就能回本
自动化会产生指数级的复利效应
总投入时间:约 20 小时(配置和监控)
总产出:1,065 组专业数据集
每条数据所需人工时间:1.1 分钟
试试这些数据集,然后告诉我你的看法!
🎁 免费数据集:https://huggingface.co/bernabepuente
📧 联系方式:(你的邮箱或 Twitter)
💬 参与讨论:在下方评论!
技术栈:Ollama • CrewAI • ChromaDB • Flask • Python 3.11 • AMD Ryzen AI 9
许可证:MIT(所有数据集)
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。