SQLAlchemy 是 Python 中最流行的 ORM 框架之一,提供了完整的 SQL 能力和企业级持久化模式。Alembic 是 SQLAlchemy 作者开发的数据库迁移工具,轻量级且功能强大,类似于 Django 的 migration 或 Ruby on Rails 的 migrations。
pip install sqlalchemy
# 或安装带异步支持的版本
pip install sqlalchemy[asyncio]
from sqlalchemy import create_engine
# SQLite
engine = create_engine('sqlite:///example.db')
# MySQL
engine = create_engine('mysql+pymysql://user:password@localhost:3306/dbname')
# PostgreSQL
engine = create_engine('postgresql://user:password@localhost:5432/dbname')
# 连接池配置
engine = create_engine(
'mysql+pymysql://user:password@localhost:3306/dbname',
pool_size=10, # 连接池大小
max_overflow=5, # 超过pool_size后允许的最大连接数
pool_timeout=30, # 获取连接超时时间
pool_recycle=3600, # 连接回收时间
echo=True # 打印SQL日志
)
from sqlalchemy import Column, Integer, String, DateTime, Text, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from datetime import datetime
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), unique=True, nullable=False, comment='用户名')
email = Column(String(100), unique=True, nullable=False, comment='邮箱')
password_hash = Column(String(255), nullable=False)
created_at = Column(DateTime, default=datetime.now, comment='创建时间')
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
# 关联关系
posts = relationship('Post', back_populates='author')
def __repr__(self):
return f"<User(id={self.id}, username='{self.username}')>"
class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
title = Column(String(200), nullable=False)
content = Column(Text)
user_id = Column(Integer, ForeignKey('users.id'), nullable=False)
created_at = Column(DateTime, default=datetime.now)
# 关联关系
author = relationship('User', back_populates='posts')
from sqlalchemy.orm import sessionmaker, Session
# 创建Session工厂
SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False)
# 使用上下文管理器
from contextlib import contextmanager
@contextmanager
def get_db():
db = SessionLocal()
try:
yield db
db.commit()
except Exception as e:
db.rollback()
raise e
finally:
db.close()
# CRUD 操作示例
def create_user(db: Session, username: str, email: str, password: str):
user = User(username=username, email=email, password_hash=password)
db.add(user)
db.commit()
db.refresh(user)
return user
def get_user_by_id(db: Session, user_id: int):
return db.query(User).filter(User.id == user_id).first()
def get_users(db: Session, skip: int = 0, limit: int = 100):
return db.query(User).offset(skip).limit(limit).all()
def update_user(db: Session, user_id: int, **kwargs):
user = db.query(User).filter(User.id == user_id).first()
if user:
for key, value in kwargs.items():
setattr(user, key, value)
db.commit()
db.refresh(user)
return user
def delete_user(db: Session, user_id: int):
user = db.query(User).filter(User.id == user_id).first()
if user:
db.delete(user)
db.commit()
return user
from sqlalchemy import or_, and_, func, desc
# 条件查询
users = db.query(User).filter(User.username.like('%test%')).all()
# 多条件组合
users = db.query(User).filter(
and_(
User.username.like('%test%'),
or_(User.email.endswith('@gmail.com'), User.email.endswith('@qq.com'))
)
).all()
# 排序和分页
users = db.query(User).order_by(desc(User.created_at)).offset(10).limit(10).all()
# 聚合查询
from sqlalchemy import func
result = db.query(
User.username,
func.count(Post.id).label('post_count')
).join(Post).group_by(User.id).all()
# 关联查询(JOIN)
posts = db.query(Post).join(User).filter(User.username == 'admin').all()
# 使用 outerjoin
posts = db.query(Post).outerjoin(User).all()
# 子查询
subq = db.query(Post.user_id, func.count('*').label('count')).group_by(Post.user_id).subquery()
result = db.query(User, subq.c.count).outerjoin(subq, User.id == subq.c.user_id).all()
pip install alembic
# 在项目根目录初始化
cd your_project
alembic init alembic
初始化后会生成以下结构:
your_project/
├── alembic/
│ ├── versions/ # 迁移脚本存放目录
│ ├── env.py # Alembic 环境配置
│ ├── script.py.mako # 迁移脚本模板
│ └── README
├── alembic.ini # Alembic 配置文件
└── your_models.py
修改 alembic.ini 文件中的数据库连接:
# alembic.ini
[alembic]
# 迁移脚本存放目录
script_location = alembic
# 数据库连接字符串
sqlalchemy.url = mysql+pymysql://user:password@localhost:3306/dbname
# 也可以使用环境变量
# sqlalchemy.url = driver://user:pass@localhost/dbname
[post_write_hooks]
# 迁移脚本生成后执行的钩子(如格式化代码)
# hooks = black
# black.type = console_scripts
# black.entrypoint = black
# black.options = -q
修改 alembic/env.py,导入你的模型:
# alembic/env.py
from logging.config import fileConfig
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from alembic import context
# 导入你的 Base 和模型
import sys
sys.path.insert(0, '.')
from models import Base # 替换为你的模型路径
# this is the Alembic Config object
config = context.config
# 设置 target_metadata 为你的 Base.metadata
target_metadata = Base.metadata
# 其他配置保持不变...
# 生成迁移脚本(自动检测模型变化)
alembic revision --autogenerate -m "initial tables"
# 手动创建空白迁移脚本
alembic revision -m "add user table"
# 查看当前数据库版本
alembic current
# 查看迁移历史
alembic history
# 升级到最新版本
alembic upgrade head
# 升级到指定版本
alembic upgrade <revision_id>
# 降级一个版本
alembic downgrade -1
# 降级到指定版本
alembic downgrade <revision_id>
# 降级到初始状态
alembic downgrade base
# 查看将要执行的SQL(不实际执行)
alembic upgrade head --sql
# 标记当前版本(不执行迁移)
alembic stamp head
自动生成的迁移脚本示例:
# alembic/versions/123456789abc_initial_tables.py
"""initial tables
Revision ID: 123456789abc
Revises:
Create Date: 2024-01-01 10:00:00.000000
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '123456789abc'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# 创建 users 表
op.create_table(
'users',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('username', sa.String(length=50), nullable=False),
sa.Column('email', sa.String(length=100), nullable=False),
sa.Column('password_hash', sa.String(length=255), nullable=False),
sa.Column('created_at', sa.DateTime(), nullable=True),
sa.Column('updated_at', sa.DateTime(), nullable=True),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('username'),
sa.UniqueConstraint('email')
)
# 创建索引
op.create_index(op.f('ix_users_username'), 'users', ['username'], unique=True)
def downgrade():
# 删除索引
op.drop_index(op.f('ix_users_username'), table_name='users')
# 删除表
op.drop_table('users')
# 添加列
def upgrade():
op.add_column('users', sa.Column('phone', sa.String(20), nullable=True))
def downgrade():
op.drop_column('users', 'phone')
# 删除列
def upgrade():
op.drop_column('users', 'phone')
# 修改列
def upgrade():
op.alter_column('users', 'username',
existing_type=sa.String(50),
type_=sa.String(100),
existing_nullable=False
)
# 添加外键
def upgrade():
op.create_foreign_key(
'fk_posts_user_id',
'posts', 'users',
['user_id'], ['id']
)
def downgrade():
op.drop_constraint('fk_posts_user_id', 'posts', type_='foreignkey')
# 执行原生SQL
def upgrade():
op.execute("UPDATE users SET status = 'active' WHERE status IS NULL")
# 批量操作(适合SQLite等不支持某些操作的数据库)
def upgrade():
with op.batch_alter_table('users') as batch_op:
batch_op.add_column(sa.Column('phone', sa.String(20)))
batch_op.alter_column('username', type_=sa.String(100))
project/
├── app/
│ ├── __init__.py
│ ├── database.py # 数据库连接和Session
│ ├── models/ # 模型定义
│ │ ├── __init__.py
│ │ ├── base.py # Base定义
│ │ ├── user.py
│ │ └── post.py
│ └── schemas/ # Pydantic 模型
├── alembic/
│ ├── versions/
│ ├── env.py
│ └── ...
├── alembic.ini
└── main.py
# database.py
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker
from sqlalchemy.orm import declarative_base
DATABASE_URL = "mysql+aiomysql://user:password@localhost/dbname"
engine = create_async_engine(DATABASE_URL, echo=True)
AsyncSessionLocal = async_sessionmaker(
engine, class_=AsyncSession, expire_on_commit=False
)
Base = declarative_base()
# 异步操作示例
async def get_users_async():
async with AsyncSessionLocal() as session:
result = await session.execute(select(User))
return result.scalars().all()
server_default 避免锁表# 安全添加非空列(大数据表)
def upgrade():
op.add_column('users', sa.Column('status', sa.String(20), server_default='active'))
# 后续再分批更新后移除默认值
当多人开发时可能出现版本冲突:
# 合并多个头版本
alembic merge -m "merge branches" head1 head2
确保 env.py 中正确导入所有模型:
# 方式1:显式导入每个模型
from models import Base, User, Post
# 方式2:在 Base 导入后,导入所有模型模块
from models.base import Base
import models.user # noqa
import models.post # noqa
SQLite 默认不启用外键约束,需要在 env.py 中配置:
def run_migrations_online():
connectable = engine_from_config(
config.get_section(config.config_ini_section),
prefix='sqlalchemy.',
poolclass=pool.NullPool
)
with connectable.connect() as connection:
# 启用外键约束(SQLite)
connection.execute(sa.text('PRAGMA foreign_keys=ON'))
context.configure(
connection=connection,
target_metadata=target_metadata
)
with context.begin_transaction():
context.run_migrations()
bi看板, Superset 4.0.2版本
本指南提供了一个系统性的AI大模型学习路径,从基础概念到高级应用,帮助学习者循序渐进地掌握大语言模型相关技术。
学习目标: 建立对AI和机器学习的基本认知
学习内容:
推荐资源:
时间安排: 2-3周 难度: 初级
学习目标: 掌握AI开发必需的编程技能
学习内容:
推荐资源:
时间安排: 3-4周 难度: 初级
学习目标: 巩固AI所需的数学基础
学习内容:
推荐资源:
时间安排: 2-3周 难度: 中级
学习目标: 理解神经网络和深度学习原理
学习内容:
推荐资源:
时间安排: 4-5周 难度: 中高级
学习目标: 掌握NLP核心概念和传统方法
学习内容:
推荐资源:
时间安排: 3-4周 难度: 中高级
学习目标: 深入理解Transformer模型架构
学习内容:
推荐资源:
时间安排: 3-4周 难度: 高级
学习目标: 学会使用现有的预训练大模型
学习内容:
推荐资源:
实践项目:
时间安排: 4-5周 难度: 中高级
学习目标: 掌握针对特定任务的模型微调方法
学习内容:
推荐资源:
实践项目:
时间安排: 5-6周 难度: 高级
学习目标: 了解大模型训练的基本流程和技术
学习内容:
推荐资源:
实践项目:
时间安排: 6-8周 难度: 高级
学习目标: 深入研究最新的模型架构和优化技术
学习内容:
推荐资源:
时间安排: 持续学习 难度: 专家级
学习目标: 掌握RLHF等高级训练技术
学习内容:
推荐资源:
时间安排: 持续学习 难度: 专家级
学习目标: 构建完整的AI应用系统
学习内容:
推荐资源:
实践项目:
时间安排: 持续学习 难度: 专家级
| 学习阶段 | 精力投入 | 时间分配 | 主要挑战 | 学习重点 |
|---|---|---|---|---|
| 基础入门 | ⭐⭐ | 1-2个月 | 概念理解 | 建立基础认知 |
| 核心理论 | ⭐⭐⭐⭐ | 2-3个月 | 数学原理 | 深入理解机制 |
| 实践应用 | ⭐⭐⭐⭐⭐ | 3-4个月 | 工程实现 | 动手能力培养 |
| 高级进阶 | ⭐⭐⭐⭐⭐ | 持续学习 | 前沿跟踪 | 创新和优化 |
高投入收益点 (⭐⭐⭐⭐⭐):
中等投入点 (⭐⭐⭐):
基础投入点 (⭐⭐):
最后更新: 2025年12月12日
本学习指南会根据AI技术发展持续更新,建议定期查看最新版本。
11434。ollama --version
ollama list
ollama run llama3 "你好,介绍下你自己"
ollama pull llama3
ollama pull qwen2
ollama pull mistral
ollama list
ollama rm llama3
ollama run qwen2
ollama run mistral -p "请用要点解释 Transformer 的注意力机制"
-p 传入 prompt;-m 指定模型;-t 模板相关(在 Modelfile 中更常见)。temperature、top_p、top_k、num_predict、repeat_penalty、mirostat。num_ctx(影响长文能力与内存占用)。POST /api/generate多轮对话:POST /api/chat
curl 示例:curl -X POST http://localhost:11434/api/generate \
-H "Content-Type: application/json" \
-d '{
"model": "llama3",
"prompt": "用三句话解释RAG",
"stream": false
}'
import requests
url = "http://localhost:11434/api/chat"
payload = {
"model": "llama3",
"messages": [
{"role": "user", "content": "给我一个Python生成示例"}
],
"stream": False
}
resp = requests.post(url, json=payload, timeout=60)
print(resp.json())
const fetch = require('node-fetch');
(async () => {
const res = await fetch('http://localhost:11434/api/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ model: 'qwen2', prompt: '列出三条LLM提示工程建议', stream: false })
});
const data = await res.json();
console.log(data);
})();
POST /api/embeddingscurl -X POST http://localhost:11434/api/embeddings \
-H "Content-Type: application/json" \
-d '{
"model": "llama3",
"prompt": "大语言模型是什么"
}'
faiss、pgvector、milvus 等库。Modelfile 在基础模型上添加系统提示、模板、参数等,生成自己的可复用模型。# 文件名: Modelfile
FROM llama3
PARAMETER temperature 0.7
PARAMETER num_ctx 4096
SYSTEM "你是一名资深中文助理,回答要简洁、有条理。"
TEMPLATE "用户:\n助理:"
ollama create my-llama -f Modelfile
ollama run my-llama -p "请用要点解释Attention"
keep_alive 设置为如 5m 可提高多次调用的响应速度(模型常驻内存)。Modelfile 配置系统提示、模板、参数,必要时引入 LoRA 适配器,创建个人化模型。Modelfile 是定义自定义模型的核心配置文件,支持以下指令:
FROM <模型名>:指定基础模型(必需)SYSTEM <提示词>:设置系统提示,定义模型角色和行为TEMPLATE <模板字符串>:定义对话模板格式PARAMETER <参数名> <值>:设置模型推理参数ADAPTER <路径>:引入 LoRA 适配器(可选)LICENSE <许可证>:声明模型许可证MESSAGE <角色> <内容>:添加示例对话消息语法:
FROM <模型名>[:<标签>]
说明:
llama3:8b)示例:
FROM llama3 # 使用默认版本
FROM llama3:8b # 使用 8b 版本
FROM qwen2:7b # 使用 qwen2 的 7b 版本
FROM myuser/mymodel # 使用自定义模型
FROM myuser/mymodel:1.0 # 使用自定义模型的特定版本
语法:
SYSTEM "<单行提示词>"
# 或
SYSTEM """多行提示词
可以包含换行
支持多行内容"""
说明:
" 或三引号 """ 包裹示例:
# 单行
SYSTEM "你是一名专业的AI助手。"
# 多行
SYSTEM """你是一名资深软件工程师。
你的职责包括:
1. 编写高质量代码
2. 进行代码审查
3. 提供技术建议"""
# 使用变量(在模板中)
SYSTEM "你是一个编程专家。"
语法:
TEMPLATE "<模板字符串>"
# 或
TEMPLATE """多行模板
支持换行"""
说明:
模板语法:
...:条件判断......:条件判断(带 else)\n:换行符\t:制表符示例:
# 简单模板
TEMPLATE "用户:\n助手:"
# 条件模板
TEMPLATE """系统:
用户:
助手:"""
# 复杂模板(多轮对话格式)
TEMPLATE """<|system|>
<|end|>
<|user|>
<|end|>
<|assistant|>
"""
常见模型模板格式:
# ChatML 格式(OpenAI 风格)
TEMPLATE """<|im_start|>system
<|im_end|>
<|im_start|>user
<|im_end|>
<|im_start|>assistant
"""
# Alpaca 格式
TEMPLATE """Below is an instruction that describes a task. Write a response that appropriately completes the request.
### Instruction:
### Response:
"""
# Vicuna 格式
TEMPLATE """USER:
ASSISTANT: """
语法:
PARAMETER <参数名> <值>
说明:
常用参数列表:
| 参数名 | 类型 | 默认值 | 说明 | 取值范围 |
|---|---|---|---|---|
temperature |
float | 0.8 | 采样温度,控制随机性 | 0.0-2.0 |
top_p |
float | 0.9 | 核采样参数 | 0.0-1.0 |
top_k |
int | 40 | Top-K 采样,限制候选词数 | 1-100 |
num_ctx |
int | 2048 | 上下文窗口大小(token数) | 512-32768 |
num_predict |
int | -1 | 最大生成 token 数(-1 表示无限制) | -1 或正整数 |
repeat_penalty |
float | 1.1 | 重复惩罚系数 | 0.0-2.0 |
repeat_last_n |
int | 64 | 考虑重复惩罚的最近 token 数 | 0-2048 |
seed |
int | -1 | 随机种子(-1 表示随机) | -1 或非负整数 |
numa |
bool | false | 是否使用 NUMA | true/false |
num_thread |
int | 自动 | CPU 线程数 | 正整数 |
num_gpu |
int | 自动 | GPU 层数 | 非负整数 |
main_gpu |
int | 0 | 主 GPU 索引 | 非负整数 |
low_vram |
bool | false | 低显存模式 | true/false |
f16_kv |
bool | true | 使用 FP16 存储 KV 缓存 | true/false |
logits_all |
bool | false | 返回所有 token 的 logits | true/false |
vocab_only |
bool | false | 仅加载词汇表 | true/false |
use_mmap |
bool | true | 使用内存映射 | true/false |
use_mlock |
bool | false | 锁定内存 | true/false |
embedding_only |
bool | false | 仅用于 embeddings | true/false |
mirostat |
int | 0 | Mirostat 采样算法(0=禁用,1=Mirostat,2=Mirostat 2.0) | 0/1/2 |
mirostat_lr |
float | 0.1 | Mirostat 学习率 | 0.0-1.0 |
mirostat_eta |
float | 0.1 | Mirostat eta 参数 | 0.0-1.0 |
penalize_newline |
bool | true | 惩罚换行符 | true/false |
stop |
string | - | 停止序列(可多次使用) | 字符串 |
示例:
# 基础参数
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER top_k 40
# 上下文和生成长度
PARAMETER num_ctx 4096
PARAMETER num_predict 2048
# 重复控制
PARAMETER repeat_penalty 1.1
PARAMETER repeat_last_n 64
# 随机种子(用于可复现性)
PARAMETER seed 42
# 停止序列(可多次使用)
PARAMETER stop "用户:"
PARAMETER stop "Human:"
PARAMETER stop "\n\n\n"
# GPU 配置
PARAMETER num_gpu 2
PARAMETER main_gpu 0
PARAMETER low_vram true
# 采样算法
PARAMETER mirostat 2
PARAMETER mirostat_lr 0.1
PARAMETER mirostat_eta 0.1
语法:
MESSAGE <角色> "<内容>"
# 或
MESSAGE <角色> """多行内容
支持换行"""
说明:
user 或 assistant示例:
# 单轮对话示例
MESSAGE user "什么是 Python?"
MESSAGE assistant "Python 是一种高级编程语言,以简洁和可读性著称。"
# 多轮对话示例
MESSAGE user "如何学习编程?"
MESSAGE assistant "学习编程可以从以下几个方面入手:\n1. 选择一门语言\n2. 练习基础语法\n3. 做项目实践"
MESSAGE user "推荐一些学习资源"
MESSAGE assistant "推荐资源:\n- 官方文档\n- 在线教程\n- 编程练习平台"
# 复杂格式示例
MESSAGE user """请帮我写一个 Python 函数,计算斐波那契数列的第 n 项。"""
MESSAGE assistant """```python
def fibonacci(n):
if n <= 1:
return n
a, b = 0, 1
for _ in range(2, n + 1):
a, b = b, a + b
return b
```"""
语法:
ADAPTER <路径>
说明:
示例:
# 相对路径
ADAPTER ./lora_adapter
ADAPTER ./adapters/code_assistant
# 绝对路径
ADAPTER /home/user/adapters/my_adapter
ADAPTER C:\Users\user\adapters\my_adapter
语法:
LICENSE "<许可证名称>"
# 或
LICENSE """多行许可证文本
可以包含完整的许可证内容"""
说明:
示例:
# 许可证名称
LICENSE "MIT"
LICENSE "Apache-2.0"
LICENSE "CC-BY-4.0"
# 完整许可证文本
LICENSE """MIT License
Copyright (c) 2024
Permission is hereby granted...
"""
语法:
# 单行注释
# 这是注释内容
说明:
# 开头表示注释示例:
# 这是一个代码助手模型
FROM llama3:8b
# 系统提示:定义模型角色
SYSTEM "你是一名专业的代码助手。"
# 推理参数:平衡创造性和准确性
PARAMETER temperature 0.7 # 适中的随机性
PARAMETER top_p 0.9 # 核采样
语法:
# 使用三引号
"""多行内容
可以包含换行
保留格式"""
说明:
""" 包裹多行内容示例:
SYSTEM """你是一名专业助手。
你的回答需要:
1. 准确
2. 详细
3. 有条理"""
TEMPLATE """系统:
用户:
助手:"""
推荐顺序:
FROM(必需,放在最前)ADAPTER(如果有)SYSTEMTEMPLATEPARAMETER(可以多个)MESSAGE(可以多个)LICENSE优先级规则:
PARAMETER 可以多次使用设置不同参数MESSAGE 按顺序累积,形成对话历史示例:
# 正确的顺序示例
FROM llama3:8b
ADAPTER ./my_adapter
SYSTEM "你是一名助手。"
TEMPLATE "用户:\n助手:"
PARAMETER temperature 0.7
PARAMETER num_ctx 4096
MESSAGE user "示例1"
MESSAGE assistant "回复1"
MESSAGE user "示例2"
MESSAGE assistant "回复2"
LICENSE "MIT"
常用转义字符:
\n:换行符\t:制表符\":双引号\\:反斜杠\r:回车符示例:
# 在单引号字符串中使用转义
TEMPLATE "用户:\n助手:"
# 在多行字符串中也可以使用
SYSTEM "第一行\n第二行\n第三行"
# 文件名: Modelfile
# 基于 llama3 创建专业代码助手
FROM llama3:8b
# 系统提示:定义模型角色
SYSTEM """你是一名资深的软件工程师和代码审查专家。
你的回答需要:
1. 代码示例清晰、可运行
2. 解释简洁、有条理
3. 提供最佳实践建议
4. 指出潜在问题和改进方向"""
# 对话模板:定义用户和助手的交互格式
TEMPLATE """系统:
用户:
助手:"""
# 推理参数配置
PARAMETER temperature 0.7 # 创造性(0-1,越高越随机)
PARAMETER top_p 0.9 # 核采样参数
PARAMETER top_k 40 # Top-K 采样
PARAMETER num_ctx 4096 # 上下文窗口大小
PARAMETER num_predict 2048 # 最大生成 token 数
PARAMETER repeat_penalty 1.1 # 重复惩罚(>1 减少重复)
PARAMETER seed 42 # 随机种子(固定可复现)
# 示例对话(few-shot learning)
MESSAGE user "如何优化 Python 列表查找性能?"
MESSAGE assistant """对于频繁查找,可以使用集合(set)替代列表:
```python
# 慢:O(n)
if item in my_list:
pass
# 快:O(1)
if item in my_set:
pass
对于有序数据,使用二分查找(bisect 模块)。”””
LICENSE “MIT”
#### 不同场景的 Modelfile 示例
**示例 1:中文对话助手**
```dockerfile
FROM qwen2:7b
SYSTEM "你是一个友好、专业的中文AI助手。回答要自然、易懂,适当使用表情符号。"
TEMPLATE "用户:\n\n助手:"
PARAMETER temperature 0.8
PARAMETER num_ctx 8192
示例 2:技术文档生成器
FROM mistral:7b
SYSTEM """你是一个技术文档编写专家。
输出格式要求:
- 使用 Markdown 格式
- 代码块包含语言标识
- 提供清晰的步骤说明
- 包含注意事项和最佳实践"""
TEMPLATE "\n\n请按照上述要求生成文档:\n\n"
PARAMETER temperature 0.3
PARAMETER num_predict 4096
示例 3:数据分析助手
FROM llama3:8b
SYSTEM "你擅长数据分析和统计。回答时提供具体的数据处理步骤、代码示例和可视化建议。"
PARAMETER temperature 0.5
PARAMETER num_ctx 16384
# 1. 准备 Modelfile(在当前目录创建 Modelfile 文件)
cat > Modelfile << 'EOF'
FROM llama3
SYSTEM "你是一名专业助理。"
PARAMETER temperature 0.7
EOF
# 2. 创建模型
ollama create mymodel -f Modelfile
# 3. 测试模型
ollama run mymodel -p "介绍一下你自己"
# 不同量化等级(从高到低质量,从大到小体积)
ollama create mymodel -f Modelfile --quantize q8_0 # 8位量化,质量最高
ollama create mymodel -f Modelfile --quantize q6_K # 6位量化,平衡选择
ollama create mymodel -f Modelfile --quantize q4_K_M # 4位量化,推荐
ollama create mymodel -f Modelfile --quantize q4_0 # 4位量化,最小体积
量化等级说明:
q8_0:8位量化,接近原始质量,体积较大q6_K:6位量化,质量与体积的平衡点q4_K_M:4位量化(中等),推荐用于大多数场景q4_0:4位量化(基础),体积最小但质量略低# 查看模型详细信息
ollama show mymodel
# 查看模型的 Modelfile 配置
ollama show mymodel --modelfile
# 列出所有模型
ollama list
# 复制模型(用于创建变体)
ollama cp mymodel mymodel-v2
# 删除模型
ollama rm mymodel
LoRA(Low-Rank Adaptation)是一种参数高效的微调方法,可以在不修改基础模型的情况下添加特定能力。
# LoRA 适配器通常是一个目录,包含适配器权重文件
# 目录结构示例:
# adapter_dir/
# ├── adapter_config.json
# └── adapter_model.bin
FROM llama3:8b
ADAPTER ./adapter_dir
SYSTEM "你是一名经过专业领域训练的AI助手。"
PARAMETER temperature 0.7
# 确保 adapter_dir 目录存在且包含适配器文件
ollama create mymodel-lora -f Modelfile
注意事项:
# 查看本机的公钥
ollama key
# 或查看公钥文件位置(通常在 ~/.ollama/id_ed25519.pub)
步骤 1:命名模型(使用命名空间)
模型名称必须遵循 <用户名>/<模型名> 的格式:
# 如果模型已存在,需要复制并重命名
ollama cp mymodel <你的用户名>/mymodel
# 或者创建时直接使用命名空间
ollama create <你的用户名>/mymodel -f Modelfile
示例(假设用户名为 john):
ollama cp mymodel john/code-assistant
步骤 2:验证模型
推送前建议先本地测试:
# 测试模型功能
ollama run <你的用户名>/mymodel -p "测试提示"
# 查看模型信息
ollama show <你的用户名>/mymodel
步骤 3:推送模型
# 推送模型到 Ollama 模型库
ollama push <你的用户名>/mymodel
推送过程会显示进度:
pushing manifest
pushing 2/2 layers (100%)
pushed successfully
步骤 4:验证推送结果
curl https://ollama.com/api/tags | grep "<你的用户名>/mymodel"
使用标签管理模型版本,便于迭代和回滚:
# 创建带版本标签的模型
ollama cp <你的用户名>/mymodel <你的用户名>/mymodel:1.0
ollama cp <你的用户名>/mymodel <你的用户名>/mymodel:latest
# 推送特定版本
ollama push <你的用户名>/mymodel:1.0
ollama push <你的用户名>/mymodel:latest
# 更新模型后创建新版本
ollama cp <你的用户名>/mymodel <你的用户名>/mymodel:2.0
ollama push <你的用户名>/mymodel:2.0
版本命名建议:
latest:最新稳定版1.0、1.1、2.0:语义化版本号dev、beta:开发/测试版本2024-12-01:日期版本推送成功后,其他人可以通过以下方式使用:
# 拉取模型
ollama pull <你的用户名>/mymodel
# 或拉取特定版本
ollama pull <你的用户名>/mymodel:1.0
# 运行模型
ollama run <你的用户名>/mymodel -p "你好"
症状:
Error: unauthorized
解决方案:
# 删除旧密钥(谨慎操作)
rm ~/.ollama/id_ed25519*
# Ollama 会在下次操作时自动生成新密钥
ollama key # 查看新公钥
症状:
Error: timeout
解决方案:
export HTTP_PROXY=http://proxy:port
export HTTPS_PROXY=http://proxy:port
ollama push <你的用户名>/mymodel
症状:
Error: invalid model name
解决方案:
<用户名>/<模型名>原因与优化:
# 1. 修改 Modelfile
vim Modelfile
# 2. 重新创建模型(使用相同名称)
ollama create <你的用户名>/mymodel -f Modelfile
# 3. 推送更新
ollama push <你的用户名>/mymodel
# 注意:删除操作需要谨慎,可能影响其他用户
# 在 Ollama 网站上进行删除操作更安全
在推送模型时,建议:
# 基于已有自定义模型创建新模型
FROM <你的用户名>/mymodel
SYSTEM "在原有基础上,你还需要擅长数据分析。"
PARAMETER temperature 0.6
TEMPLATE """系统指令:
用户:
助手:"""
MESSAGE user "什么是 RAG?"
MESSAGE assistant "RAG(Retrieval-Augmented Generation)是一种结合检索和生成的技术..."
MESSAGE user "它有什么优势?"
MESSAGE assistant "RAG 的主要优势包括:1. 可以访问最新信息 2. 减少幻觉..."
num_ctx:增大可处理更长文本,但显著提升内存与算力需求。num_predict:限制最大输出 token 数,避免响应过长。stream: true 可边生成边传输,提升交互体验。/api/embeddings)。/api/chat 作为系统/用户提示。llama3、qwen2、mistral、phi3 等。llava 需要额外输入;参考:https://ollama.com/docs/models11434 未被占用;或通过环境变量更改端口。q4);降低 num_ctx。# 拉取/运行
ollama pull llama3
ollama run llama3 -p "用5点说明提示工程"
# 查看模型
ollama list
# 删除模型
ollama rm llama3
# 创建自定义模型
ollama create my-llama -f Modelfile
ollama run my-llama -p "测试"
# 生成向量
curl -s http://localhost:11434/api/embeddings -d '{"model":"llama3","prompt":"示例"}'