AI开发工具与平台生态系统

中等 🟡AI 学习
12 个标签
预计阅读时间:115 分钟
AI工具开发平台模型训练部署工具MLOpsLLMOps向量数据库推理服务RAGAgent框架模型微调可观测性

AI开发工具与平台生态系统

AI开发工具和平台构成了现代人工智能应用开发的基础设施。从数据处理到模型训练,从部署到监控,完整的工具链为AI工程师提供了端到端的解决方案。

🛠️ AI开发工具分类

1. 数据处理工具

数据是AI开发的基础,高质量的数据处理工具至关重要:

数据标注工具

Label Studio:通用数据标注平台
Prodigy:主动学习标注工具
SuperAnnotate:计算机视觉标注平台

数据预处理

Pandas:Python数据分析库
Polars:高性能数据处理
Apache Spark:大数据处理框架
pythonCode
import pandas as pd
from sklearn.preprocessing import StandardScaler

# 数据加载和预处理
def preprocess_data(file_path):
    # 读取数据
    df = pd.read_csv(file_path)
    
    # 数据清洗
    df = df.dropna()  # 删除缺失值
    df = df.drop_duplicates()  # 删除重复值
    
    # 特征工程
    scaler = StandardScaler()
    numerical_cols = df.select_dtypes(include=['number']).columns
    df[numerical_cols] = scaler.fit_transform(df[numerical_cols])
    
    return df

# 使用示例
processed_data = preprocess_data('dataset.csv')

2. 模型开发框架

深度学习框架

PyTorch:动态计算图,研究友好
TensorFlow:静态计算图,生产就绪
JAX:函数式编程,高性能计算

高级框架

Hugging Face Transformers:预训练模型库
FastAI:简化深度学习开发
Keras:高层神经网络API
pythonCode
import torch
import torch.nn as nn
from transformers import AutoTokenizer, AutoModel

class TextClassifier(nn.Module):
    def __init__(self, model_name, num_classes):
        super().__init__()
        self.tokenizer = AutoTokenizer.from_pretrained(model_name)
        self.model = AutoModel.from_pretrained(model_name)
        self.classifier = nn.Linear(self.model.config.hidden_size, num_classes)
        
    def forward(self, input_ids, attention_mask):
        outputs = self.model(input_ids=input_ids, attention_mask=attention_mask)
        pooled_output = outputs.last_hidden_state[:, 0]  # CLS token
        logits = self.classifier(pooled_output)
        return logits

# 模型实例化
model = TextClassifier('bert-base-uncased', num_classes=2)

3. 实验管理工具

实验跟踪

MLflow:实验跟踪和模型管理
Weights & Biases:可视化和实验管理
Comet:MLOps平台
pythonCode
import mlflow
import mlflow.pytorch

# MLflow实验跟踪
def train_with_tracking(model, train_loader, val_loader, epochs):
    with mlflow.start_run():
        # 记录参数
        mlflow.log_param("epochs", epochs)
        mlflow.log_param("learning_rate", 0.001)
        
        for epoch in range(epochs):
            # 训练循环
            train_loss = train_epoch(model, train_loader)
            val_acc = validate(model, val_loader)
            
            # 记录指标
            mlflow.log_metric("train_loss", train_loss, step=epoch)
            mlflow.log_metric("val_accuracy", val_acc, step=epoch)
        
        # 记录模型
        mlflow.pytorch.log_model(model, "model")

🚀 模型训练工具

1. 分布式训练

Horovod:跨多GPU/多节点训练

pythonCode
import horovod.torch as hvd

# 初始化Horovod
hvd.init()

# 设置GPU
torch.cuda.set_device(hvd.local_rank())

# 模型和优化器
model = MyModel()
optimizer = torch.optim.Adam(model.parameters())

# 分布式优化器
optimizer = hvd.DistributedOptimizer(optimizer)

# 广播参数
hvd.broadcast_parameters(model.state_dict(), root_rank=0)

DeepSpeed:微软的优化库

pythonCode
import deepspeed

# DeepSpeed配置
ds_config = {
    "train_batch_size": 32,
    "gradient_clipping": 1.0,
    "fp16": {
        "enabled": True
    },
    "zero_optimization": {
        "stage": 2
    }
}

# 初始化DeepSpeed
model, optimizer, _, _ = deepspeed.initialize(
    model=model,
    optimizer=optimizer,
    config=ds_config
)

2. 超参数优化

Optuna:自动化超参数优化

pythonCode
import optuna

def objective(trial):
    # 定义搜索空间
    lr = trial.suggest_float('lr', 1e-5, 1e-1, log=True)
    batch_size = trial.suggest_categorical('batch_size', [16, 32, 64])
    hidden_size = trial.suggest_int('hidden_size', 64, 512)
    
    # 训练模型
    model = SimpleModel(hidden_size)
    optimizer = torch.optim.Adam(model.parameters(), lr=lr)
    
    # 评估模型
    accuracy = train_and_evaluate(model, optimizer, batch_size)
    return accuracy

# 优化
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)

📦 模型部署工具

1. 模型服务化

TorchServe:PyTorch模型服务

bashCode
# 创建模型档案
torch-model-archiver --model-name my_model \
    --version 1.0 \
    --model-file model.py \
    --serialized-file model.pth \
    --handler handler.py

# 启动服务
torchserve --start --model-store model_store --models my_model=my_model.mar

TensorFlow Serving:TensorFlow模型服务

pythonCode
# TensorFlow Serving配置
model_config_file = """
model_config_list: {
  config: {
    name: "my_model",
    base_path: "/path/to/models",
    model_platform: "tensorflow"
  }
}
"""

# 启动服务
# tensorflow_model_server --model_config_file=/path/to/config

2. 容器化部署

Docker:容器化部署

dockerfileCode
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["python", "app.py"]

Kubernetes:容器编排

yamlCode
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ai-model-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ai-model
  template:
    metadata:
      labels:
        app: ai-model
    spec:
      containers:
      - name: model-container
        image: ai-model:latest
        ports:
        - containerPort: 8000
        resources:
          requests:
            memory: "1Gi"
            cpu: "500m"
          limits:
            memory: "2Gi"
            cpu: "1000m"

🧪 MLOps工具栈

1. 数据版本控制

DVC(Data Version Control)

bashCode
# 初始化DVC
dvc init

# 添加数据文件
dvc add data/training_dataset.csv

# 推送数据到远程存储
dvc push

# 拉取数据
dvc pull

Kedro:数据科学流水线

pythonCode
from kedro.pipeline import Pipeline, node
from kedro.runner import SequentialRunner

def load_data(filepath):
    return pd.read_csv(filepath)

def process_data(data):
    # 数据处理逻辑
    return processed_data

def train_model(data):
    # 模型训练逻辑
    return model

# 构建流水线
pipeline = Pipeline([
    node(load_data, "raw_data", "processed_data", name="load_raw_data"),
    node(process_data, "processed_data", "clean_data", name="process_data"),
    node(train_model, "clean_data", "model", name="train_model")
])

# 运行流水线
runner = SequentialRunner()
runner.run(pipeline)

2. CI/CD for ML

GitHub Actions for ML

yamlCode
name: ML Pipeline
on: [push, pull_request]

jobs:
  train:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Setup Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.9
    - name: Install dependencies
      run: |
        pip install -r requirements.txt
    - name: Run training
      run: |
        python train.py
    - name: Run tests
      run: |
        pytest tests/
    - name: Upload model
      uses: actions/upload-artifact@v2
      with:
        name: trained-model
        path: models/

🌐 云平台AI服务

1. AWS AI Services

SageMaker:端到端机器学习平台

Notebook实例
训练作业
模型部署
AutoML功能
pythonCode
import sagemaker
from sagemaker.huggingface import HuggingFace

# SageMaker训练
huggingface_estimator = HuggingFace(
    entry_point='train.py',
    source_dir='src',
    role=sagemaker.get_execution_role(),
    transformers_version='4.12',
    pytorch_version='1.9',
    py_version='py38',
    instance_type='ml.p3.2xlarge',
    instance_count=1,
    hyperparameters={
        'epochs': 3,
        'train_batch_size': 16,
        'model_name': 'bert-base-uncased'
    }
)

# 启动训练
huggingface_estimator.fit({'train': 's3://my-bucket/train/'})

2. Google Cloud AI Platform

Vertex AI:Google的AI平台

AutoML
Custom training
Model deployment
Feature store

3. Azure Machine Learning

Azure ML:微软的AI平台

ML Studio
Automated ML
Model management
MLOps capabilities

🤖 特定领域工具

1. 计算机视觉

OpenCV:计算机视觉库

pythonCode
import cv2
import numpy as np

# 图像预处理
def preprocess_image(image_path):
    img = cv2.imread(image_path)
    img = cv2.resize(img, (224, 224))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = img.astype(np.float32) / 255.0
    return img

# 目标检测
def detect_objects(model, image):
    predictions = model.predict(image)
    return predictions

Detectron2:Facebook的目标检测框架

pythonCode
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
from detectron2 import model_zoo

cfg = get_cfg()
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml")
predictor = DefaultPredictor(cfg)

# 预测
outputs = predictor(image)

2. 自然语言处理

spaCy:工业级NLP库

pythonCode
import spacy

# 加载模型
nlp = spacy.load("en_core_web_sm")

# 文本处理
def process_text(text):
    doc = nlp(text)
    
    # 命名实体识别
    entities = [(ent.text, ent.label_) for ent in doc.ents]
    
    # 词性标注
    pos_tags = [(token.text, token.pos_) for token in doc]
    
    # 依存句法分析
    dependencies = [(token.text, token.dep_, token.head.text) for token in doc]
    
    return {
        'entities': entities,
        'pos_tags': pos_tags,
        'dependencies': dependencies
    }

3. 时间序列分析

Prophet:Facebook的时间序列预测

pythonCode
from fbprophet import Prophet

# 创建模型
model = Prophet(
    growth='linear',
    seasonality_mode='multiplicative',
    yearly_seasonality=True,
    weekly_seasonality=True
)

# 训练模型
model.fit(df)  # df需要有'ds'和'y'列

# 预测
future = model.make_future_dataframe(periods=365)
forecast = model.predict(future)

🔧 模型优化工具

1. 模型压缩

TensorRT:NVIDIA的推理优化

pythonCode
import tensorrt as trt
import numpy as np

def optimize_with_tensorrt(engine_path):
    # 创建TensorRT运行时
    runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING))
    
    # 加载优化后的引擎
    with open(engine_path, 'rb') as f:
        engine = runtime.deserialize_cuda_engine(f.read())
    
    return engine

ONNX:开放神经网络交换格式

pythonCode
import onnx
import onnxruntime as ort

# 转换模型到ONNX
torch.onnx.export(
    model,
    dummy_input,
    "model.onnx",
    export_params=True,
    opset_version=11
)

# 使用ONNX Runtime推理
session = ort.InferenceSession("model.onnx")
output = session.run(None, {'input': input_data})

2. 量化工具

PyTorch Quantization

pythonCode
import torch.quantization as quant

# 准备量化
model.qconfig = torch.quantization.get_default_qconfig('fbgemm')
model_prepared = torch.quantization.prepare(model, inplace=False)

# 校准
with torch.no_grad():
    for data, target in calibration_loader:
        model_prepared(data)

# 转换为量化模型
model_quantized = torch.quantization.convert(model_prepared, inplace=False)

📊 监控和可观测性

1. 模型监控

Prometheus + Grafana

pythonCode
from prometheus_client import Counter, Histogram, start_http_server

# 定义指标
request_counter = Counter('model_requests_total', 'Total model requests')
prediction_histogram = Histogram('prediction_time_seconds', 'Prediction time')

def predict_with_monitoring(model, input_data):
    request_counter.inc()
    
    with prediction_histogram.time():
        result = model.predict(input_data)
    
    return result

# 启动监控服务器
start_http_server(8000)

2. 数据漂移检测

Alibi Detect

pythonCode
from alibi_detect.cd import MMDDrift

# 训练时数据分布
reference_data = X_train

# 创建漂移检测器
cd = MMDDrift(
    x_ref=reference_data,
    p_val=0.05,
    backend='pytorch'
)

# 检测漂移
preds = cd.predict(X_current)
if preds['data']['is_drift']:
    print("检测到数据漂移!")

🚀 最佳实践

1. 工具选择指南

项目规模:小项目用简单工具,大项目用完整栈
团队技能:选择团队熟悉的工具
预算考虑:开源vs商业解决方案
合规要求:数据安全和隐私

2. 工作流程

1.数据准备:清洗、标注、验证
2.模型开发:实验、训练、验证
3.模型优化:压缩、量化、加速
4.部署上线:服务化、监控、维护
5.持续改进:反馈收集、模型更新

3. 安全考虑

模型安全:对抗攻击防护
数据安全:隐私保护、访问控制
部署安全:API安全、身份验证

🌟 未来发展趋势

1. 低代码/无代码平台

AutoML:自动化机器学习
可视化建模:拖拽式建模
预构建解决方案:行业特定模板

2. 边缘AI工具

边缘推理:本地模型部署
联邦学习:分布式训练
模型压缩:移动端优化

3. 协作工具

团队协作:多人同时开发
知识管理:经验分享平台
自动化测试:CI/CD集成

🚀 LLM应用开发框架深入对比

随着大语言模型(LLM)成为应用开发的核心,围绕它们诞生了一批专门的应用开发框架。它们解决了「如何把 LLM 接入真实业务系统」这一工程难题:管理提示词、编排多步骤调用、连接外部数据、集成工具与记忆等。

为什么需要 LLM 应用框架

直接调用大模型 API 只能得到「一问一答」,但真实应用需要:

上下文管理:把用户历史对话、检索到的文档、系统指令拼装成合理的提示词。
链式编排:一次任务往往需要多次模型调用(先分解问题、再检索、再总结)。
外部数据接入:让模型「读到」私有知识库、数据库、API。
工具调用:让模型能执行搜索、计算、写数据库等真实动作。
可观测性:记录每一步的输入输出、耗时、token 消耗,方便排查与优化。

如果每个团队都自己造这些轮子,成本极高且容易出错。框架把这些通用能力沉淀下来,让开发者聚焦业务逻辑。

四大主流框架总览

| 框架 | 主导语言 | 定位 | 学习曲线 | 适合场景 |

| --- | --- | --- | --- | --- |

| LangChain | Python / JS | 全能型编排框架,生态最大 | 中等偏陡 | 复杂 Agent、多步骤链路 |

| LlamaIndex | Python / TS | 专注 RAG 与数据索引 | 平缓 | 知识库问答、文档检索 |

| Semantic Kernel | C# / Python / Java | 微软出品,企业级插件体系 | 中等 | .NET 技术栈、企业集成 |

| Haystack | Python | 生产级 NLP 管线,模块化 | 中等 | 搜索系统、可组合管线 |

LangChain:全能型编排框架

LangChain 是目前生态最大的 LLM 应用框架,提供了从提示词模板、链(Chain)、Agent、到记忆(Memory)的完整抽象。

pythonCode
# 安装:pip install langchain langchain-openai langchain-community
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 1. 定义模型
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.2)

# 2. 定义提示词模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个资深的{domain}专家,回答要简洁准确。"),
    ("human", "{question}"),
])

# 3. 用 LCEL(LangChain 表达式语言)把组件用管道符串起来
chain = prompt | llm | StrOutputParser()

# 4. 调用
result = chain.invoke({
    "domain": "后端架构",
    "question": "微服务拆分的核心原则是什么?"
})
print(result)

LCEL 的强大之处在于可组合与可流式:

pythonCode
# 流式输出:适合聊天界面逐字显示
for chunk in chain.stream({"domain": "前端", "question": "什么是虚拟DOM?"}):
    print(chunk, end="", flush=True)

# 批量处理:一次并发跑多个输入
results = chain.batch([
    {"domain": "数据库", "question": "什么是索引下推?"},
    {"domain": "网络", "question": "TCP三次握手为什么是三次?"},
])

LangChain 构建带工具的 Agent

pythonCode
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.tools import tool

@tool
def get_weather(city: str) -> str:
    """查询指定城市的天气。参数 city 为城市名。"""
    # 真实项目中这里会调用天气 API
    fake_db = {"北京": "晴 26℃", "上海": "多云 28℃"}
    return fake_db.get(city, "暂无数据")

@tool
def calculate(expression: str) -> str:
    """执行数学计算,参数为合法的 Python 算术表达式。"""
    try:
        return str(eval(expression, {"__builtins__": {}}, {}))
    except Exception as e:
        return f"计算错误: {e}"

tools = [get_weather, calculate]

agent_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个能调用工具的助手。"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

agent = create_tool_calling_agent(llm, tools, agent_prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

executor.invoke({"input": "北京今天天气怎么样?顺便算一下 128 * 56"})

LlamaIndex:专注 RAG 与数据索引

LlamaIndex(原名 GPT Index)专注于「把数据喂给 LLM」这件事,对文档加载、切分、索引、检索做了深度优化,是构建 RAG 系统的首选之一。

pythonCode
# 安装:pip install llama-index llama-index-llms-openai
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core import Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding

# 全局配置模型
Settings.llm = OpenAI(model="gpt-4o-mini")
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")

# 1. 加载文档目录(自动处理 pdf/txt/md 等)
documents = SimpleDirectoryReader("./docs").load_data()

# 2. 构建向量索引(自动切分 + 向量化)
index = VectorStoreIndex.from_documents(documents)

# 3. 创建查询引擎
query_engine = index.as_query_engine(similarity_top_k=3)

# 4. 提问,框架自动检索相关片段并生成答案
response = query_engine.query("这份文档的核心结论是什么?")
print(response)
print("引用来源:", [n.metadata for n in response.source_nodes])

LlamaIndex 的高级检索能力(比如混合检索、重排序):

pythonCode
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.postprocessor import SimilarityPostprocessor

# 自定义切分策略:每块 512 token,重叠 50
splitter = SentenceSplitter(chunk_size=512, chunk_overlap=50)
nodes = splitter.get_nodes_from_documents(documents)

index = VectorStoreIndex(nodes)
query_engine = index.as_query_engine(
    similarity_top_k=5,
    node_postprocessors=[SimilarityPostprocessor(similarity_cutoff=0.7)],
)

Semantic Kernel:微软企业级方案

Semantic Kernel 面向企业级 .NET / Python 技术栈,核心概念是「插件(Plugin)」与「规划器(Planner)」。

pythonCode
# 安装:pip install semantic-kernel
import asyncio
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
from semantic_kernel.functions import kernel_function

class TimePlugin:
    @kernel_function(description="获取当前日期")
    def today(self) -> str:
        from datetime import date
        return str(date.today())

async def main():
    kernel = sk.Kernel()
    kernel.add_service(OpenAIChatCompletion(
        service_id="chat",
        ai_model_id="gpt-4o-mini",
        api_key="YOUR_KEY",
    ))
    kernel.add_plugin(TimePlugin(), plugin_name="time")

    result = await kernel.invoke_prompt(
        "今天是{{time.today}},请用一句话总结这一天适合做什么。"
    )
    print(result)

asyncio.run(main())

Haystack:生产级模块化管线

Haystack 由 deepset 出品,强调「管线(Pipeline)」这一概念,把每个处理步骤当作可插拔的组件,适合搭建可维护的搜索与问答系统。

pythonCode
# 安装:pip install haystack-ai
from haystack import Pipeline, Document
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.components.generators import OpenAIGenerator
from haystack.components.builders import PromptBuilder

# 文档存储
store = InMemoryDocumentStore()
store.write_documents([
    Document(content="LangChain 是一个 LLM 应用开发框架。"),
    Document(content="Haystack 由 deepset 公司维护。"),
])

# 构建 RAG 管线
prompt_template = """
根据以下上下文回答问题:
{% for doc in documents %}{{ doc.content }}{% endfor %}
问题:{{ question }}
"""

pipe = Pipeline()
pipe.add_component("retriever", InMemoryBM25Retriever(document_store=store))
pipe.add_component("prompt", PromptBuilder(template=prompt_template))
pipe.add_component("llm", OpenAIGenerator(model="gpt-4o-mini"))
pipe.connect("retriever", "prompt.documents")
pipe.connect("prompt", "llm")

result = pipe.run({
    "retriever": {"query": "Haystack 是谁维护的?"},
    "prompt": {"question": "Haystack 是谁维护的?"},
})
print(result["llm"]["replies"][0])

框架选型建议

要做复杂 Agent、多工具编排 → LangChain / LangGraph。
核心诉求是知识库问答(RAG) → LlamaIndex。
企业已在 .NET 生态、需要强类型与插件治理 → Semantic Kernel。
需要生产级、可维护、模块清晰的 NLP 管线 → Haystack。

常见坑

过度依赖框架抽象:调试时链路层层封装,难以定位问题。建议开启 verbose / 回调追踪。
提示词被框架「悄悄」改写:很多框架有隐藏的默认提示词,务必打印最终发送给模型的完整提示。
版本迭代快:LangChain 尤其如此,锁定版本号,避免生产环境被破坏性更新拖垮。

🗄️ 向量数据库工具接入与选型

RAG、语义搜索、推荐系统都离不开向量数据库。它们把文本、图片等转换成的高维向量高效存储,并支持「最近邻检索」(找出与查询向量最相似的内容)。

为什么需要专门的向量数据库

传统数据库擅长精确匹配(WHERE id = 5),但不擅长「找最相似的 10 条」。向量检索需要专门的索引结构(如 HNSW、IVF)才能在亿级向量中做到毫秒级响应。

主流向量数据库选型对比

| 产品 | 部署方式 | 索引算法 | 是否开源 | 突出特点 | 适合规模 |

| --- | --- | --- | --- | --- | --- |

| Pinecone | 全托管 SaaS | 专有 | 否 | 免运维、弹性伸缩 | 中大型、快速上线 |

| Weaviate | 自建 / 云 | HNSW | 是 | 内置向量化、混合检索 | 中大型 |

| Milvus | 自建 / 云 | IVF/HNSW/DiskANN | 是 | 超大规模、GPU加速 | 十亿级 |

| Qdrant | 自建 / 云 | HNSW | 是 | Rust编写、性能高、过滤强 | 中大型 |

| pgvector | Postgres扩展 | IVFFlat/HNSW | 是 | 复用现有PG、事务一致 | 中小型 |

Pinecone 接入示例

pythonCode
# 安装:pip install pinecone-client
from pinecone import Pinecone, ServerlessSpec

pc = Pinecone(api_key="YOUR_KEY")

# 创建索引(1536 维对应 OpenAI text-embedding-3-small)
pc.create_index(
    name="docs",
    dimension=1536,
    metric="cosine",
    spec=ServerlessSpec(cloud="aws", region="us-east-1"),
)
index = pc.Index("docs")

# 写入向量(upsert)
index.upsert(vectors=[
    {"id": "doc1", "values": [0.1] * 1536, "metadata": {"topic": "AI"}},
    {"id": "doc2", "values": [0.2] * 1536, "metadata": {"topic": "DB"}},
])

# 查询:找出与查询向量最相似的 3 条,并按 metadata 过滤
res = index.query(
    vector=[0.1] * 1536,
    top_k=3,
    filter={"topic": {"$eq": "AI"}},
    include_metadata=True,
)
print(res)

Weaviate 接入示例

pythonCode
# 安装:pip install weaviate-client
import weaviate
from weaviate.classes.config import Property, DataType, Configure

client = weaviate.connect_to_local()

# 定义集合(schema),启用自动向量化
client.collections.create(
    name="Article",
    vectorizer_config=Configure.Vectorizer.text2vec_openai(),
    properties=[
        Property(name="title", data_type=DataType.TEXT),
        Property(name="body", data_type=DataType.TEXT),
    ],
)

articles = client.collections.get("Article")
articles.data.insert({"title": "向量检索入门", "body": "介绍 HNSW 算法..."})

# 混合检索:结合关键词 + 向量
results = articles.query.hybrid(query="HNSW 是什么", alpha=0.5, limit=3)
for obj in results.objects:
    print(obj.properties)

client.close()

Milvus 接入示例

pythonCode
# 安装:pip install pymilvus
from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530")

client.create_collection(collection_name="demo", dimension=768)

# 插入
data = [{"id": i, "vector": [0.05 * i] * 768, "text": f"文档{i}"} for i in range(100)]
client.insert(collection_name="demo", data=data)

# 检索
res = client.search(
    collection_name="demo",
    data=[[0.1] * 768],
    limit=5,
    output_fields=["text"],
)
print(res)

Qdrant 接入示例

pythonCode
# 安装:pip install qdrant-client
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct

client = QdrantClient(url="http://localhost:6333")

client.recreate_collection(
    collection_name="docs",
    vectors_config=VectorParams(size=384, distance=Distance.COSINE),
)

client.upsert(collection_name="docs", points=[
    PointStruct(id=1, vector=[0.1] * 384, payload={"lang": "zh"}),
    PointStruct(id=2, vector=[0.2] * 384, payload={"lang": "en"}),
])

hits = client.search(
    collection_name="docs",
    query_vector=[0.1] * 384,
    limit=3,
)
print(hits)

pgvector 接入示例

如果你已经在用 PostgreSQL,pgvector 让你无需引入新组件即可获得向量检索能力,还能享受事务一致性。

sqlCode
-- 启用扩展
CREATE EXTENSION IF NOT EXISTS vector;

-- 建表:embedding 为 1536 维
CREATE TABLE documents (
    id bigserial PRIMARY KEY,
    content text,
    embedding vector(1536)
);

-- 建 HNSW 索引加速检索
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);

-- 检索:<=> 是余弦距离运算符
SELECT id, content
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 5;
pythonCode
# Python 侧配合 psycopg 使用
import psycopg
from pgvector.psycopg import register_vector

conn = psycopg.connect("dbname=mydb")
register_vector(conn)
conn.execute(
    "INSERT INTO documents (content, embedding) VALUES (%s, %s)",
    ("一段文本", [0.1] * 1536),
)

向量数据库常见坑

维度不匹配:写入向量维度必须与索引定义完全一致,否则报错。
距离度量选错:cosine / L2 / 内积要与 embedding 模型训练目标一致,否则召回质量下降。
忽略元数据过滤性能:高基数过滤字段要建独立索引,否则先过滤后检索会拖慢查询。
索引参数默认值:HNSW 的 ef_construction / M 参数直接影响召回率与内存,需按数据规模调优。

⚡ 大模型推理服务框架

训练好的模型要对外提供服务,就需要高性能的推理服务框架。它们通过批处理、KV 缓存、张量并行等技术,把 GPU 利用率和吞吐量拉满。

核心优化技术

Continuous Batching(连续批处理):动态把不同请求拼成一个批次,GPU 不空转。
PagedAttention:像操作系统分页一样管理 KV 缓存,显存利用率提升数倍。
量化推理:用 INT8/INT4 降低显存占用与延迟。
张量并行 / 流水线并行:把超大模型切到多张卡上。

推理框架对比

| 框架 | 出品方 | 突出优势 | 易用性 | 适合场景 |

| --- | --- | --- | --- | --- |

| vLLM | UC Berkeley | PagedAttention、吞吐极高 | 中 | 高并发在线服务 |

| TGI | HuggingFace | 生态好、开箱即用 | 高 | HF模型快速上线 |

| Ollama | Ollama | 本地一键运行 | 极高 | 本地开发、原型 |

| SGLang | LMSYS | 结构化生成、RadixAttention | 中 | 复杂多轮/Agent |

| TensorRT-LLM | NVIDIA | 极致延迟优化 | 低 | 追求最低延迟 |

vLLM 部署示例

bashCode
# 安装
pip install vllm

# 启动一个兼容 OpenAI API 的服务
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3.1-8B-Instruct \
    --tensor-parallel-size 1 \
    --max-model-len 8192 \
    --gpu-memory-utilization 0.9
pythonCode
# 客户端直接用 openai SDK 调用
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
resp = client.chat.completions.create(
    model="meta-llama/Llama-3.1-8B-Instruct",
    messages=[{"role": "user", "content": "解释一下 PagedAttention"}],
)
print(resp.choices[0].message.content)
pythonCode
# 离线批量推理
from vllm import LLM, SamplingParams

llm = LLM(model="meta-llama/Llama-3.1-8B-Instruct")
params = SamplingParams(temperature=0.7, max_tokens=256)
outputs = llm.generate(["你好", "介绍下向量数据库"], params)
for o in outputs:
    print(o.outputs[0].text)

TGI(Text Generation Inference)部署

bashCode
# 用官方 Docker 镜像一键启动
docker run --gpus all -p 8080:80 \
    -v $PWD/data:/data \
    ghcr.io/huggingface/text-generation-inference:latest \
    --model-id meta-llama/Llama-3.1-8B-Instruct \
    --max-input-length 4096 \
    --max-total-tokens 8192
pythonCode
import requests
r = requests.post("http://localhost:8080/generate", json={
    "inputs": "写一句关于秋天的诗",
    "parameters": {"max_new_tokens": 64, "temperature": 0.8},
})
print(r.json())

Ollama 本地运行

bashCode
# 安装后一行命令即可跑起本地模型
ollama run llama3.1

# 拉取并作为服务运行
ollama pull qwen2.5:7b
ollama serve
pythonCode
import ollama
resp = ollama.chat(model="qwen2.5:7b", messages=[
    {"role": "user", "content": "用一句话解释什么是量化"}
])
print(resp["message"]["content"])

SGLang 与 TensorRT-LLM

bashCode
# SGLang 启动服务
python -m sglang.launch_server \
    --model-path meta-llama/Llama-3.1-8B-Instruct \
    --port 30000
pythonCode
# SGLang 结构化生成:强制模型按 JSON schema 输出
import sglang as sgl

@sgl.function
def extract(s, text):
    s += "从文本中抽取信息:" + text + "\n"
    s += sgl.gen("name", regex=r"[\u4e00-\u9fa5]+")

TensorRT-LLM 需要先把模型编译成引擎,换取极致低延迟:

bashCode
# 大致流程:转换权重 -> 构建引擎 -> 用 Triton 部署
trtllm-build --checkpoint_dir ./ckpt \
    --output_dir ./engine \
    --gemm_plugin float16 \
    --max_batch_size 32

吞吐 / 延迟对比(参考量级)

以下为 Llama-3.1-8B 在单张 A100-80G 上的典型量级(实际因配置差异较大,仅供选型参考):

| 框架 | 首 token 延迟 | 吞吐(tokens/s) | 并发能力 | 部署复杂度 |

| --- | --- | --- | --- | --- |

| vLLM | 中(~80ms) | 高(~2500+) | 极强 | 中 |

| TGI | 中(~90ms) | 高(~2200) | 强 | 低 |

| Ollama | 高(~200ms) | 低(~120) | 弱 | 极低 |

| SGLang | 低(~70ms) | 高(~2600) | 强 | 中 |

| TensorRT-LLM | 极低(~40ms) | 极高(~3000+) | 强 | 高 |

推理服务常见坑

max-model-len 设太大:直接吃掉大量显存,导致可用批次变小、吞吐下降。
忽略 KV 缓存显存:长上下文场景 KV 缓存占用极高,需预留。
量化盲目求快:INT4 量化可能显著降低复杂推理任务质量,需评估。
本地模型上生产:Ollama 适合开发原型,高并发生产请用 vLLM/TGI。

🔧 模型微调工具

预训练大模型很强,但要适配特定业务(客服话术、行业术语、特定格式),往往需要微调。全参数微调成本高昂,因此参数高效微调(PEFT)成为主流。

核心概念:为什么用 LoRA / QLoRA

LoRA(Low-Rank Adaptation):冻结原模型权重,只训练插入的低秩矩阵,可训练参数量降到原来的千分之一,显存与存储大幅下降。
QLoRA:在 LoRA 基础上把基座模型量化到 4bit,让单张消费级显卡也能微调 7B~13B 模型。

微调工具对比

| 工具 | 定位 | 上手难度 | 突出特点 |

| --- | --- | --- | --- |

| PEFT | HF官方参数高效微调库 | 中 | 与transformers无缝集成 |

| TRL | HF强化学习/对齐库 | 中 | 支持SFT/DPO/PPO |

| Axolotl | 配置驱动微调框架 | 低 | YAML即可跑,社区活跃 |

| Unsloth | 极速低显存微调 | 低 | 提速2倍、省显存70% |

PEFT + LoRA 训练示例

pythonCode
# 安装:pip install peft transformers datasets accelerate bitsandbytes
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from peft import LoraConfig, get_peft_model, TaskType
from datasets import load_dataset
from trl import SFTTrainer

model_name = "meta-llama/Llama-3.1-8B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")

# LoRA 配置:只训练注意力层的投影矩阵
lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=16,               # 低秩维度
    lora_alpha=32,      # 缩放系数
    lora_dropout=0.05,
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()  # 会看到可训练参数占比极低

dataset = load_dataset("json", data_files="train.jsonl", split="train")

trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    args=TrainingArguments(
        output_dir="./out",
        per_device_train_batch_size=4,
        gradient_accumulation_steps=4,
        num_train_epochs=3,
        learning_rate=2e-4,
        fp16=True,
        logging_steps=10,
    ),
)
trainer.train()
model.save_pretrained("./lora-adapter")  # 只保存几十MB的适配器

QLoRA:4bit 量化微调

pythonCode
from transformers import BitsAndBytesConfig
import torch

# 4bit 量化配置
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_use_double_quant=True,
)

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto",
)
# 之后接 LoRA 配置即可,单卡 24G 也能微调

Axolotl:配置驱动

Axolotl 让你几乎不写代码,用一份 YAML 描述整个训练任务:

yamlCode
# config.yml
base_model: meta-llama/Llama-3.1-8B
load_in_4bit: true
adapter: qlora
datasets:
  - path: ./data.jsonl
    type: alpaca
sequence_len: 2048
lora_r: 32
lora_alpha: 16
lora_target_modules:
  - q_proj
  - v_proj
gradient_accumulation_steps: 4
micro_batch_size: 2
num_epochs: 3
learning_rate: 0.0002
output_dir: ./output
bashCode
# 一行命令启动训练
accelerate launch -m axolotl.cli.train config.yml

Unsloth:极速微调

pythonCode
# 安装:pip install unsloth
from unsloth import FastLanguageModel

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="unsloth/llama-3.1-8b-bnb-4bit",
    max_seq_length=2048,
    load_in_4bit=True,
)

# 一行加上 LoRA
model = FastLanguageModel.get_peft_model(
    model, r=16,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_alpha=16,
)
# 后续用 TRL 的 SFTTrainer 训练,速度约为原生 2 倍

TRL:对齐训练(DPO 示例)

除了监督微调(SFT),让模型「更符合人类偏好」需要对齐训练。DPO(Direct Preference Optimization)比 PPO 更简单稳定。

pythonCode
from trl import DPOTrainer, DPOConfig

# 数据格式:每条包含 prompt、chosen(更好的回答)、rejected(较差的回答)
dpo_trainer = DPOTrainer(
    model=model,
    args=DPOConfig(output_dir="./dpo-out", beta=0.1),
    train_dataset=preference_dataset,
    tokenizer=tokenizer,
)
dpo_trainer.train()

微调常见坑

数据质量>数据数量:几百条高质量样本往往胜过几万条噪声数据。
学习率过高:LoRA 常用 1e-4~3e-4,全参微调低一到两个数量级。
过拟合小数据集:epoch 别太多,配合验证集早停。
遗忘通用能力:微调后模型可能「变笨」,可混入部分通用数据缓解。

📊 Prompt工程与评估工具

「写好提示词」和「知道提示词/系统好不好」是两回事。评估工具把 LLM 应用质量从「凭感觉」变成「有数据」。

为什么评估很重要

LLM 输出不确定,改一个字提示词都可能让效果波动。没有评估体系,你无法回答:新版本比旧版本好还是坏?某类问题的准确率是多少?上线后质量是否退化?

评估工具对比

| 工具 | 类型 | 核心能力 |

| --- | --- | --- |

| LangSmith | 追踪+评估平台 | 与LangChain深度集成、可视化调试 |

| PromptLayer | 提示词管理 | 版本管理、请求日志 |

| Ragas | RAG评估库 | 忠实度/相关性等RAG指标 |

| DeepEval | 单测式评估 | 像pytest一样测LLM |

| promptfoo | 提示词对比测试 | 矩阵式对比多提示词/模型 |

LangSmith 追踪与评估

pythonCode
# 设置环境变量即自动追踪所有 LangChain 调用
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "YOUR_KEY"

from langsmith import Client
from langsmith.evaluation import evaluate

client = Client()

# 定义一个评估器:判断输出是否包含关键词
def contains_answer(run, example):
    prediction = run.outputs["output"]
    expected = example.outputs["answer"]
    return {"key": "correct", "score": expected in prediction}

# 在数据集上批量评估
evaluate(
    lambda x: my_chain.invoke(x),
    data="my-dataset",
    evaluators=[contains_answer],
)

Ragas:RAG 专用评估

Ragas 提供了针对 RAG 系统的核心指标,帮你分辨到底是「检索不准」还是「生成瞎编」。

pythonCode
# 安装:pip install ragas
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision
from datasets import Dataset

data = {
    "question": ["向量数据库是什么?"],
    "answer": ["向量数据库用于存储和检索高维向量。"],
    "contexts": [["向量数据库是存储embedding的专用数据库。"]],
    "ground_truth": ["向量数据库存储并检索向量。"],
}
dataset = Dataset.from_dict(data)

result = evaluate(dataset, metrics=[
    faithfulness,       # 忠实度:答案是否基于上下文,不瞎编
    answer_relevancy,   # 答案相关性
    context_precision,  # 检索到的上下文精确度
])
print(result)

DeepEval:像写单测一样评估

pythonCode
# 安装:pip install deepeval
from deepeval import assert_test
from deepeval.test_case import LLMTestCase
from deepeval.metrics import AnswerRelevancyMetric, HallucinationMetric

def test_answer_quality():
    test_case = LLMTestCase(
        input="法国的首都是哪里?",
        actual_output="法国的首都是巴黎。",
        context=["巴黎是法国的首都和最大城市。"],
    )
    assert_test(test_case, [
        AnswerRelevancyMetric(threshold=0.7),
        HallucinationMetric(threshold=0.3),
    ])
bashCode
# 用 deepeval 的 CLI 跑,就像跑 pytest
deepeval test run test_app.py

promptfoo:矩阵式对比

promptfoo 让你用配置文件同时测试多个提示词 × 多个模型,输出对比矩阵。

yamlCode
# promptfooconfig.yaml
prompts:
  - "简洁回答:{{question}}"
  - "详细解释并举例:{{question}}"
providers:
  - openai:gpt-4o-mini
  - openai:gpt-4o
tests:
  - vars:
      question: "什么是闭包?"
    assert:
      - type: contains
        value: "函数"
      - type: llm-rubric
        value: "回答准确且易懂"
bashCode
npx promptfoo eval   # 生成对比报告
npx promptfoo view   # 打开可视化界面

评估常见坑

只看单条样例:必须建立有代表性的评估集,覆盖各类边界情况。
用模型评模型的偏差:LLM 作为裁判(LLM-as-judge)有偏好,需校准或人工抽检。
指标不落地:评估要接入 CI,每次改动自动跑,防止质量回退。

🏷️ 数据标注与合成数据工具

「模型好不好,数据说了算」。高质量标注数据成本高,合成数据成为补充手段。

Argilla:现代数据标注平台

pythonCode
# 安装:pip install argilla
import argilla as rg

client = rg.Argilla(api_url="http://localhost:6900", api_key="admin.apikey")

# 定义标注任务:文本分类
settings = rg.Settings(
    fields=[rg.TextField(name="text")],
    questions=[rg.LabelQuestion(name="sentiment", labels=["正面", "负面", "中性"])],
)
dataset = rg.Dataset(name="reviews", settings=settings, client=client)
dataset.create()

# 推送待标注数据
records = [rg.Record(fields={"text": "这个产品真好用"}) for _ in range(10)]
dataset.records.log(records)

Distilabel:合成数据管线

Distilabel 用 LLM 批量生成、评判、优化数据,构建可复现的合成数据管线。

pythonCode
# 安装:pip install distilabel
from distilabel.pipeline import Pipeline
from distilabel.steps import LoadDataFromDicts
from distilabel.steps.tasks import TextGeneration
from distilabel.llms import OpenAILLM

with Pipeline(name="synthetic-qa") as pipeline:
    load = LoadDataFromDicts(data=[{"instruction": "写一个关于AI的问答"}])
    generate = TextGeneration(llm=OpenAILLM(model="gpt-4o-mini"))
    load >> generate

distiset = pipeline.run()
print(distiset["default"]["train"][0])

合成数据自建管线示例

pythonCode
from openai import OpenAI
import json

client = OpenAI()

def generate_training_samples(topic, n=5):
    """基于主题批量生成问答对"""
    prompt = f"""生成{n}个关于「{topic}」的高质量问答对,
    以 JSON 数组返回,每项含 question 和 answer 字段。"""
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        response_format={"type": "json_object"},
    )
    return json.loads(resp.choices[0].message.content)

samples = generate_training_samples("向量数据库")
with open("synthetic.jsonl", "w", encoding="utf-8") as f:
    for s in samples.get("data", []):
        f.write(json.dumps(s, ensure_ascii=False) + "\n")

合成数据常见坑

同质化严重:单一提示词生成的数据缺乏多样性,需引入随机种子/多角色。
错误被放大:生成器的偏见会传染到下游模型,需加质检环节。
版权与合规:注意生成数据是否触及来源模型的使用条款。

🗃️ 特征平台(Feature Store)

特征平台解决「训练用的特征」和「线上推理用的特征」不一致的问题(训练-服务偏斜),并让特征在团队间复用。

Feast 代码示例

pythonCode
# 安装:pip install feast
# feature_repo/example.py
from feast import Entity, FeatureView, Field, FileSource
from feast.types import Float32, Int64
from datetime import timedelta

driver = Entity(name="driver", join_keys=["driver_id"])

source = FileSource(
    path="driver_stats.parquet",
    timestamp_field="event_timestamp",
)

driver_stats_fv = FeatureView(
    name="driver_hourly_stats",
    entities=[driver],
    ttl=timedelta(days=1),
    schema=[
        Field(name="conv_rate", dtype=Float32),
        Field(name="acc_rate", dtype=Float32),
        Field(name="avg_daily_trips", dtype=Int64),
    ],
    source=source,
)
pythonCode
# 获取在线特征用于实时推理
from feast import FeatureStore

store = FeatureStore(repo_path="feature_repo")
features = store.get_online_features(
    features=[
        "driver_hourly_stats:conv_rate",
        "driver_hourly_stats:avg_daily_trips",
    ],
    entity_rows=[{"driver_id": 1001}],
).to_dict()
print(features)
bashCode
# 常用 CLI
feast apply          # 应用特征定义
feast materialize-incremental $(date +%Y-%m-%d)T00:00:00  # 物化到在线库

🔀 工作流编排工具

数据管线、训练管线、批量推理都需要编排器来调度任务依赖、重试、监控。

编排器对比

| 工具 | 定位 | 编程模型 | 适合场景 |

| --- | --- | --- | --- |

| Airflow | 老牌通用调度 | DAG(Python) | 传统ETL、定时批处理 |

| Prefect | 现代化、动态流 | 装饰器函数 | 动态、Python原生 |

| Dagster | 数据资产为中心 | 软件定义资产 | 强类型、数据血缘 |

| Kubeflow Pipelines | K8s上的ML管线 | 组件+DSL | 云原生ML训练 |

Airflow DAG 示例

pythonCode
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime

def extract():
    print("抽取数据")

def transform():
    print("转换数据")

def load():
    print("加载数据")

with DAG(
    dag_id="etl_pipeline",
    start_date=datetime(2026, 1, 1),
    schedule="@daily",
    catchup=False,
) as dag:
    t1 = PythonOperator(task_id="extract", python_callable=extract)
    t2 = PythonOperator(task_id="transform", python_callable=transform)
    t3 = PythonOperator(task_id="load", python_callable=load)
    t1 >> t2 >> t3   # 定义依赖顺序

Prefect:Python 原生

pythonCode
# 安装:pip install prefect
from prefect import flow, task

@task(retries=3, retry_delay_seconds=5)
def fetch_data(url: str):
    return f"data from {url}"

@task
def process(data: str):
    return data.upper()

@flow(name="my-etl")
def etl(url: str):
    raw = fetch_data(url)
    return process(raw)

if __name__ == "__main__":
    print(etl("http://example.com"))

Dagster:数据资产为中心

pythonCode
# 安装:pip install dagster
from dagster import asset, materialize

@asset
def raw_users():
    return [{"id": 1, "name": "Alice"}]

@asset
def cleaned_users(raw_users):
    return [{**u, "name": u["name"].strip()} for u in raw_users]

# cleaned_users 依赖 raw_users,Dagster 自动追踪血缘
materialize([raw_users, cleaned_users])

Kubeflow Pipelines 组件

pythonCode
# 安装:pip install kfp
from kfp import dsl

@dsl.component
def train_op(epochs: int) -> str:
    return f"trained {epochs} epochs"

@dsl.pipeline(name="training-pipeline")
def pipeline(epochs: int = 10):
    train_op(epochs=epochs)

编排器常见坑

把重逻辑写进 DAG 定义:DAG 文件应轻量,重活放进 task 内部,否则调度器解析慢。
幂等性缺失:任务重试要保证幂等,否则重复执行产生脏数据。
资源隔离:训练任务与轻量任务混跑,会互相拖累,需按队列/资源池隔离。

📈 实验管理与模型注册

训练模型会跑成百上千次实验,没有工具记录,很快就会陷入「哪个参数跑出了最好结果」的混乱。

MLflow:实验追踪 + 模型注册

pythonCode
# 安装:pip install mlflow
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier

mlflow.set_experiment("churn-prediction")

with mlflow.start_run():
    n_estimators = 100
    model = RandomForestClassifier(n_estimators=n_estimators)
    model.fit(X_train, y_train)
    acc = model.score(X_test, y_test)

    # 记录参数、指标、模型
    mlflow.log_param("n_estimators", n_estimators)
    mlflow.log_metric("accuracy", acc)
    mlflow.sklearn.log_model(model, "model")
pythonCode
# 模型注册表:把模型提升到 Staging / Production
from mlflow import MlflowClient

client = MlflowClient()
client.create_registered_model("churn-model")
mv = client.create_model_version(
    name="churn-model",
    source="runs:/<run_id>/model",
    run_id="<run_id>",
)
client.transition_model_version_stage(
    name="churn-model", version=mv.version, stage="Production"
)

Weights & Biases 进阶

pythonCode
# 安装:pip install wandb
import wandb

wandb.init(project="llm-finetune", config={"lr": 2e-4, "epochs": 3})

for epoch in range(3):
    loss = train_one_epoch()
    # 记录指标,自动生成可视化曲线
    wandb.log({"epoch": epoch, "loss": loss})

# 记录数据集/模型为 Artifact,实现版本化与血缘
artifact = wandb.Artifact("model", type="model")
artifact.add_file("model.pt")
wandb.log_artifact(artifact)
wandb.finish()
pythonCode
# 超参数扫描(Sweep)
sweep_config = {
    "method": "bayes",
    "metric": {"name": "loss", "goal": "minimize"},
    "parameters": {
        "lr": {"min": 1e-5, "max": 1e-3},
        "batch_size": {"values": [8, 16, 32]},
    },
}
sweep_id = wandb.sweep(sweep_config, project="llm-finetune")
wandb.agent(sweep_id, function=train, count=20)

DVC 进阶:数据版本控制

bashCode
# DVC 让大数据/模型文件像代码一样版本化
dvc init
dvc add data/train.parquet     # 生成 .dvc 指针文件,纳入 git
dvc remote add -d storage s3://my-bucket/dvcstore
dvc push                        # 推送真实数据到远端

# 定义可复现的管线
dvc stage add -n train \
    -d train.py -d data/train.parquet \
    -o model.pkl \
    python train.py
dvc repro                       # 只在依赖变化时重跑

🔍 LLM可观测性与追踪

LLM 应用是「黑盒套黑盒」,链路长、成本高。可观测性工具让你看清每一步的输入输出、耗时、token 与费用。

可观测性工具对比

| 工具 | 特点 | 集成方式 |

| --- | --- | --- |

| Langfuse | 开源、可自建、功能全 | SDK装饰器/回调 |

| Phoenix (Arize) | 开源、强调评估与漂移 | OpenTelemetry |

| OpenTelemetry | 标准协议、厂商中立 | 语义约定 |

Langfuse 追踪

pythonCode
# 安装:pip install langfuse
from langfuse.decorators import observe
from langfuse.openai import openai  # 包装过的 openai 自动上报

@observe()  # 自动追踪这个函数为一个 trace
def rag_pipeline(question: str):
    context = retrieve(question)       # 会成为子 span
    answer = openai.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": f"{context}\n{question}"}],
    )
    return answer.choices[0].message.content

rag_pipeline("向量数据库怎么选?")

Phoenix(Arize)+ OpenTelemetry

pythonCode
# 安装:pip install arize-phoenix openinference-instrumentation-openai
import phoenix as px
from openinference.instrumentation.openai import OpenAIInstrumentor
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter

session = px.launch_app()  # 启动本地可视化界面

tracer_provider = TracerProvider()
tracer_provider.add_span_processor(
    SimpleSpanProcessor(OTLPSpanExporter("http://localhost:6006/v1/traces"))
)
OpenAIInstrumentor().instrument(tracer_provider=tracer_provider)
# 之后所有 OpenAI 调用会自动出现在 Phoenix 界面里

OpenTelemetry for LLM 手动埋点

pythonCode
from opentelemetry import trace

tracer = trace.get_tracer("llm-app")

def chat(prompt):
    with tracer.start_as_current_span("llm-call") as span:
        span.set_attribute("llm.model", "gpt-4o-mini")
        span.set_attribute("llm.prompt_tokens", count_tokens(prompt))
        result = call_model(prompt)
        span.set_attribute("llm.completion_tokens", count_tokens(result))
        return result

可观测性常见坑

只记成功、不记失败:错误链路才是排查重点,务必捕获异常并上报。
忽略成本维度:token 消耗要按 trace 聚合,否则费用失控难溯源。
敏感信息入库:追踪会记录完整提示词,注意 PII 脱敏。

💰 GPU资源与成本管理

GPU 又贵又稀缺,资源调度与成本管理直接决定项目能否持续。

Ray:分布式计算底座

pythonCode
# 安装:pip install "ray[default]"
import ray

ray.init()

@ray.remote(num_gpus=1)   # 声明需要 1 张 GPU
def train_shard(shard_id):
    return f"shard {shard_id} done"

# 并行调度到集群多张卡
futures = [train_shard.remote(i) for i in range(4)]
print(ray.get(futures))

Ray Serve:模型服务

pythonCode
from ray import serve
from starlette.requests import Request

@serve.deployment(num_replicas=2, ray_actor_options={"num_gpus": 0.5})
class Model:
    def __init__(self):
        self.model = load_model()

    async def __call__(self, request: Request):
        data = await request.json()
        return {"result": self.model.predict(data["input"])}

serve.run(Model.bind())

KServe:K8s 上的标准化推理

yamlCode
# kserve-inference.yaml
apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: llama-service
spec:
  predictor:
    model:
      modelFormat:
        name: huggingface
      storageUri: "s3://models/llama-3.1-8b"
      resources:
        limits:
          nvidia.com/gpu: "1"

GPU 成本对比(参考量级)

| 方案 | 单卡成本 | 弹性 | 运维负担 | 适合场景 |

| --- | --- | --- | --- | --- |

| 云按需实例 | 高 | 极强 | 低 | 短期实验、突发 |

| 云预留/包年 | 中 | 中 | 低 | 稳定长期负载 |

| Serverless GPU | 按秒计费 | 极强 | 极低 | 间歇性推理 |

| 自建机房 | 前期高、长期低 | 弱 | 高 | 超大规模、长期 |

成本优化实践

混合精度 + 量化:显著降低单请求显存与算力开销。
动态扩缩容:按 QPS 自动增减副本,闲时缩到 0。
抢占式/竞价实例:训练任务用竞价实例可省 60%~80%,配合 checkpoint 容错。
请求批处理:小请求聚合成批,提高 GPU 利用率。

🤖 Agent开发框架

Agent 让 LLM 从「回答问题」进化到「自主完成任务」:规划、调用工具、观察结果、迭代。

Agent 框架对比

| 框架 | 出品方 | 核心抽象 | 特点 |

| --- | --- | --- | --- |

| LangGraph | LangChain | 状态图 | 可控、可循环、可持久化 |

| AutoGen | 微软 | 多智能体对话 | 智能体协作、代码执行 |

| CrewAI | CrewAI | 角色+任务 | 拟人化团队协作 |

| OpenAI Agents SDK | OpenAI | Agent+Handoff | 官方、轻量、原生工具 |

LangGraph:状态图编排

pythonCode
# 安装:pip install langgraph
from langgraph.graph import StateGraph, END
from typing import TypedDict

class State(TypedDict):
    question: str
    answer: str
    retries: int

def think(state: State):
    return {"answer": f"思考:{state['question']}", "retries": state["retries"] + 1}

def should_continue(state: State):
    return "end" if state["retries"] >= 2 else "think"

graph = StateGraph(State)
graph.add_node("think", think)
graph.set_entry_point("think")
graph.add_conditional_edges("think", should_continue, {"think": "think", "end": END})
app = graph.compile()

print(app.invoke({"question": "什么是Agent", "answer": "", "retries": 0}))

AutoGen:多智能体协作

pythonCode
# 安装:pip install pyautogen
import autogen

config_list = [{"model": "gpt-4o-mini", "api_key": "YOUR_KEY"}]

assistant = autogen.AssistantAgent(
    name="assistant",
    llm_config={"config_list": config_list},
)
user_proxy = autogen.UserProxyAgent(
    name="user_proxy",
    human_input_mode="NEVER",
    code_execution_config={"work_dir": "coding", "use_docker": False},
)

# 两个智能体自动对话协作完成任务
user_proxy.initiate_chat(assistant, message="写一个计算斐波那契数列的Python函数并运行")

CrewAI:角色化团队

pythonCode
# 安装:pip install crewai
from crewai import Agent, Task, Crew

researcher = Agent(
    role="研究员",
    goal="收集关于{topic}的资料",
    backstory="你是资深行业分析师。",
)
writer = Agent(
    role="撰稿人",
    goal="根据资料写一篇报告",
    backstory="你是专业的技术作者。",
)

research_task = Task(description="研究{topic}的现状", agent=researcher)
write_task = Task(description="撰写报告", agent=writer)

crew = Crew(agents=[researcher, writer], tasks=[research_task, write_task])
result = crew.kickoff(inputs={"topic": "向量数据库"})
print(result)

OpenAI Agents SDK

pythonCode
# 安装:pip install openai-agents
from agents import Agent, Runner, function_tool

@function_tool
def get_price(product: str) -> str:
    return f"{product} 的价格是 99 元"

agent = Agent(
    name="导购助手",
    instructions="你是一个帮助用户查询商品价格的助手。",
    tools=[get_price],
)

result = Runner.run_sync(agent, "iPhone 多少钱?")
print(result.final_output)

Agent 常见坑

无限循环:Agent 可能反复调用同一工具,务必设置最大步数与超时。
工具描述不清:模型靠工具的 docstring 决定何时调用,描述要精确。
成本失控:每步都是一次 LLM 调用,复杂任务费用高,需监控与限额。
缺乏可观测性:Agent 决策路径不透明,务必接入追踪工具。

🔗 RAG全链路工具组合案例

RAG(检索增强生成)是当前企业落地 LLM 最主流的方案。下面用一套完整工具链演示从文档到答案的全过程。

典型 RAG 架构分层

数据接入层:文档加载、清洗、切分。
向量化层:embedding 模型把文本转向量。
存储层:向量数据库存储与检索。
检索层:向量检索 + 关键词检索 + 重排序。
生成层:LLM 基于检索结果生成答案。
观测层:追踪、评估、监控。

端到端可运行示例

pythonCode
# 工具组合:LlamaIndex + Qdrant + OpenAI + Langfuse
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.vector_stores.qdrant import QdrantVectorStore
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI
from llama_index.core import StorageContext
import qdrant_client

# 1. 配置模型
Settings.llm = OpenAI(model="gpt-4o-mini")
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")

# 2. 连接向量库
client = qdrant_client.QdrantClient(url="http://localhost:6333")
vector_store = QdrantVectorStore(client=client, collection_name="kb")
storage_context = StorageContext.from_defaults(vector_store=vector_store)

# 3. 加载并索引文档
docs = SimpleDirectoryReader("./knowledge").load_data()
index = VectorStoreIndex.from_documents(docs, storage_context=storage_context)

# 4. 带重排序的查询引擎
from llama_index.core.postprocessor import SentenceTransformerRerank
reranker = SentenceTransformerRerank(model="BAAI/bge-reranker-base", top_n=3)

query_engine = index.as_query_engine(
    similarity_top_k=10,           # 先粗召回 10 条
    node_postprocessors=[reranker], # 再精排到 3 条
)

# 5. 提问
response = query_engine.query("公司的退货政策是什么?")
print("答案:", response)
print("引用:", [n.node.metadata.get("file_name") for n in response.source_nodes])

混合检索:向量 + 关键词

pythonCode
# BM25(关键词)擅长精确术语,向量擅长语义,二者融合召回更全
from llama_index.retrievers.bm25 import BM25Retriever
from llama_index.core.retrievers import QueryFusionRetriever

vector_retriever = index.as_retriever(similarity_top_k=5)
bm25_retriever = BM25Retriever.from_defaults(index=index, similarity_top_k=5)

fusion = QueryFusionRetriever(
    [vector_retriever, bm25_retriever],
    similarity_top_k=5,
    mode="reciprocal_rerank",   # RRF 融合排序
)
nodes = fusion.retrieve("SLA 是多少")

RAG 质量优化清单

切分策略:按语义/标题切分优于机械定长切分。
元数据增强:给每块加标题、来源、时间等,支持过滤与引用。
查询改写:把用户口语问题改写为更利于检索的查询。
重排序:粗召回 + 精排是提升准确率的性价比之王。
答案引用:让模型标注来源,可溯源、可信任。

💻 本地开发与端侧部署

不是所有场景都能上云。隐私、成本、离线需求推动了端侧与本地部署工具的繁荣。

量化格式对比

| 格式 | 生态 | 适用硬件 | 特点 |

| --- | --- | --- | --- |

| GGUF | llama.cpp | CPU/Apple/GPU | 跨平台、量化档位丰富 |

| GPTQ | AutoGPTQ | NVIDIA GPU | 后训练量化、精度好 |

| AWQ | vLLM等 | NVIDIA GPU | 激活感知、速度快 |

| MLX | Apple | Apple Silicon | 苹果原生、内存统一 |

| ONNX | ONNX Runtime | 全平台 | 跨框架、跨硬件 |

llama.cpp + GGUF

bashCode
# 编译
git clone https://github.com/ggerganov/llama.cpp && cd llama.cpp
make

# 把 HF 模型转成 GGUF 并量化到 4bit
python convert_hf_to_gguf.py ./Llama-3.1-8B --outfile model.gguf
./llama-quantize model.gguf model-q4.gguf Q4_K_M

# 本地交互
./llama-cli -m model-q4.gguf -p "你好,介绍下自己" -n 128
pythonCode
# Python 绑定:pip install llama-cpp-python
from llama_cpp import Llama

llm = Llama(model_path="model-q4.gguf", n_ctx=4096, n_gpu_layers=20)
out = llm("解释什么是量化:", max_tokens=128)
print(out["choices"][0]["text"])

MLX:Apple Silicon 原生

pythonCode
# 安装:pip install mlx-lm
from mlx_lm import load, generate

model, tokenizer = load("mlx-community/Llama-3.1-8B-Instruct-4bit")
text = generate(model, tokenizer, prompt="用一句话解释RAG", max_tokens=64)
print(text)

ONNX Runtime

pythonCode
# 安装:pip install onnxruntime optimum
from optimum.onnxruntime import ORTModelForCausalLM
from transformers import AutoTokenizer

model = ORTModelForCausalLM.from_pretrained("model-onnx")
tokenizer = AutoTokenizer.from_pretrained("model-onnx")
inputs = tokenizer("你好", return_tensors="pt")
out = model.generate(**inputs, max_new_tokens=64)
print(tokenizer.decode(out[0]))

端侧部署常见坑

量化档位选太低:Q2/Q3 会明显掉智商,日常用 Q4_K_M 或以上更稳。
上下文过长爆内存:端侧内存有限,n_ctx 要量力而行。
首次加载慢:模型加载耗时长,服务化时预热常驻。

🛡️ 安全与合规工具

LLM 应用面临提示注入、越狱、隐私泄露、有害内容等风险,安全护栏必不可少。

Guardrails:结构化输出与校验

pythonCode
# 安装:pip install guardrails-ai
from guardrails import Guard
from guardrails.hub import RegexMatch

# 保证输出是合法邮箱格式,否则自动重试/纠正
guard = Guard().use(RegexMatch, regex=r"[^@]+@[^@]+\.[^@]+")
result = guard(
    llm_api=my_llm_call,
    prompt="生成一个示例邮箱地址",
)
print(result.validated_output)

NeMo Guardrails:对话护栏

NVIDIA NeMo Guardrails 用 Colang 语言定义对话边界,拦截越界话题。

pythonCode
# 安装:pip install nemoguardrails
from nemoguardrails import RailsConfig, LLMRails

# config 里用 Colang 定义:拒答政治/医疗建议等
config = RailsConfig.from_path("./config")
rails = LLMRails(config)

response = rails.generate(messages=[
    {"role": "user", "content": "教我怎么黑进别人电脑"}
])
print(response)  # 会被护栏拦截并给出安全回复
yamlCode
# config/rails.co (Colang 示例)
define user ask illegal
  "怎么黑进别人电脑"
  "如何制作危险物品"

define bot refuse illegal
  "抱歉,我无法协助这类请求。"

define flow
  user ask illegal
  bot refuse illegal

PII 检测:Presidio

pythonCode
# 安装:pip install presidio-analyzer presidio-anonymizer
from presidio_analyzer import AnalyzerEngine
from presidio_anonymizer import AnonymizerEngine

analyzer = AnalyzerEngine()
anonymizer = AnonymizerEngine()

text = "我的邮箱是 test@example.com,电话 13800138000"
results = analyzer.analyze(text=text, language="en")
anonymized = anonymizer.anonymize(text=text, analyzer_results=results)
print(anonymized.text)  # 敏感信息被替换为占位符

安全常见坑

只防输入不防输出:模型输出也可能含敏感/有害内容,双向都要过滤。
护栏拖慢延迟:多层校验会增加延迟,需权衡强度与体验。
提示注入防不胜防:外部内容进入提示前要隔离与标注,避免指令被劫持。

🏢 企业级落地案例

以下为综合多类工具的典型落地形态与量化收益(数字为行业参考区间)。

案例一:智能客服 RAG 系统

工具链:LlamaIndex + Qdrant + vLLM(Qwen2.5-14B)+ Langfuse。
场景:替代人工客服回答产品咨询,接入 20 万篇知识文档。
成效:首次响应时间从平均 45 秒降到 2 秒;人工转接率下降 62%;单次问答成本比调用闭源 API 低约 75%。
关键动作:混合检索 + 重排序把答案准确率从 71% 提升到 89%。

案例二:代码助手内网部署

工具链:Ollama + llama.cpp(GGUF Q4)+ 本地向量库。
场景:金融企业代码不能出网,需本地代码补全与问答。
成效:在纯 CPU 服务器上实现可用补全;开发者接受率约 34%;相比公有云方案,三年 TCO 下降约 40%。

案例三:批量文档处理管线

工具链:Prefect(编排)+ vLLM(批量推理)+ MLflow(版本)。
场景:每日处理 50 万份合同的关键条款抽取。
成效:连续批处理把 GPU 利用率从 35% 提升到 82%;单份处理成本下降 58%;管线失败自动重试,成功率 99.7%。

案例四:模型微调平台

工具链:Axolotl + Unsloth(QLoRA)+ W&B(实验)+ KServe(服务)。
场景:为多个业务线定制垂直模型。
成效:单张 A100 即可微调 13B 模型;训练迭代周期从 3 天缩短到 8 小时;相比全参微调显存占用下降约 70%。

📚 常见坑与最佳实践总清单

通用常见坑

| 坑 | 后果 | 规避方式 |

| --- | --- | --- |

| 不锁工具版本 | 生产被破坏性更新拖垮 | 固定版本、灰度升级 |

| 无评估体系 | 改动好坏全凭感觉 | 建评估集接入CI |

| 忽视成本监控 | token费用失控 | 按trace聚合成本 |

| 敏感数据入库 | 合规风险 | PII脱敏、访问控制 |

| 过度依赖单一厂商 | 迁移成本高 | 抽象接口、多供应商 |

最佳实践清单

从简单开始:先用托管服务跑通闭环,再逐步替换为自建以降本。
可观测优先:上线第一天就接入追踪,别等出问题才补。
评估驱动迭代:每次改提示词/模型/检索,都跑评估集对比。
成本与质量平衡:不同场景用不同档位模型,简单任务用小模型。
安全内建:护栏、PII 检测、限流从设计阶段就纳入。
数据是护城河:投入建设高质量私有数据与评估集。

🧭 总结对照表:不同阶段该用什么工具

下表按 AI 应用的完整生命周期,汇总各阶段的代表工具与选型要点,作为全文速查。

| 阶段 | 目标 | 代表工具 | 选型要点 |

| --- | --- | --- | --- |

| 数据准备 | 采集/清洗/标注 | Pandas、Polars、Argilla、Distilabel | 优先保证数据质量与多样性 |

| 特征管理 | 特征复用与一致 | Feast | 解决训练服务偏斜 |

| 应用编排 | 链路/Agent编排 | LangChain、LlamaIndex、LangGraph | 复杂Agent选LangGraph,RAG选LlamaIndex |

| 向量存储 | 语义检索 | Pinecone、Qdrant、Milvus、pgvector | 有PG选pgvector,超大规模选Milvus |

| 模型微调 | 定制模型 | PEFT、QLoRA、Axolotl、Unsloth | 显存有限用QLoRA,追速度用Unsloth |

| 对齐训练 | 符合人类偏好 | TRL(DPO/PPO) | DPO更简单稳定 |

| 推理服务 | 高性能上线 | vLLM、TGI、SGLang、TensorRT-LLM | 高并发选vLLM,极致延迟选TensorRT-LLM |

| 本地端侧 | 离线/隐私 | Ollama、llama.cpp、MLX、ONNX | Apple选MLX,跨平台选GGUF |

| 工作流编排 | 任务调度 | Airflow、Prefect、Dagster、Kubeflow | Python原生选Prefect,数据血缘选Dagster |

| 实验管理 | 追踪与注册 | MLflow、W&B、DVC | 开源自建选MLflow,数据版本选DVC |

| 提示与评估 | 质量度量 | LangSmith、Ragas、DeepEval、promptfoo | RAG评估选Ragas,单测式选DeepEval |

| 可观测性 | 链路追踪 | Langfuse、Phoenix、OpenTelemetry | 开源自建选Langfuse |

| 资源与成本 | GPU调度 | Ray、Ray Serve、KServe | 云原生选KServe |

| 安全合规 | 护栏与脱敏 | Guardrails、NeMo Guardrails、Presidio | 对话护栏选NeMo,PII选Presidio |

掌握这张全景图,就能在项目的每个阶段快速定位「该用什么工具、为什么用、怎么用」,从而搭建出高效、可控、可持续的 AI 应用工程体系。

🌐 模型网关与统一接入

企业往往同时使用多家模型供应商(OpenAI、Anthropic、开源自建)。模型网关提供统一接口、路由、限流、成本核算,避免代码被单一厂商绑死。

LiteLLM:统一 100+ 模型接口

pythonCode
# 安装:pip install litellm
from litellm import completion

# 用同一套代码调用不同厂商,只改 model 名
for model in ["gpt-4o-mini", "claude-3-5-sonnet-20241022", "ollama/llama3.1"]:
    resp = completion(
        model=model,
        messages=[{"role": "user", "content": "用一句话解释RAG"}],
    )
    print(model, "->", resp.choices[0].message.content)
yamlCode
# 作为代理网关运行:config.yaml
model_list:
  - model_name: gpt-4o
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_KEY
  - model_name: claude
    litellm_params:
      model: anthropic/claude-3-5-sonnet-20241022
      api_key: os.environ/ANTHROPIC_KEY
router_settings:
  routing_strategy: least-busy   # 负载均衡策略
bashCode
# 启动统一网关,业务侧只对接一个 endpoint
litellm --config config.yaml --port 4000

网关的核心价值

| 能力 | 说明 |

| --- | --- |

| 统一接口 | 一套代码切换多厂商 |

| 智能路由 | 按负载/成本/延迟选模型 |

| 故障转移 | 主模型挂了自动切备用 |

| 成本核算 | 按团队/项目统计token花费 |

| 限流配额 | 防止单个业务打爆额度 |

⚡ 语义缓存与降本

大量重复或相似的查询会浪费 token。语义缓存把「意思相近」的问题命中同一份缓存答案。

GPTCache 示例

pythonCode
# 安装:pip install gptcache
from gptcache import cache
from gptcache.adapter import openai
from gptcache.embedding import Onnx
from gptcache.manager import CacheBase, VectorBase, get_data_manager
from gptcache.similarity_evaluation.distance import SearchDistanceEvaluation

embedding = Onnx()
data_manager = get_data_manager(
    CacheBase("sqlite"),
    VectorBase("faiss", dimension=embedding.dimension),
)
cache.init(
    embedding_func=embedding.to_embeddings,
    data_manager=data_manager,
    similarity_evaluation=SearchDistanceEvaluation(),
)

# 语义相近的问题会命中缓存,直接返回,不再调用模型
resp = openai.ChatCompletion.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "什么是向量数据库?"}],
)

缓存策略对比

| 策略 | 命中条件 | 适合场景 |

| --- | --- | --- |

| 精确缓存 | 字符串完全相同 | FAQ、固定查询 |

| 语义缓存 | 语义相似度超阈值 | 用户自由提问 |

| 前缀缓存 | 共享提示词前缀 | 长系统提示复用 |

降本效果参考

高重复场景(客服 FAQ)语义缓存命中率可达 40%~60%,直接省下对应比例的推理成本。
前缀缓存(如 vLLM 的 prefix caching)对长系统提示场景可降低首 token 延迟 30% 以上。

🧪 Embedding模型选型

Embedding 质量直接决定 RAG 召回上限。选型要平衡效果、维度、语言、成本。

| 模型 | 维度 | 语言 | 部署 | 特点 |

| --- | --- | --- | --- | --- |

| text-embedding-3-small | 1536 | 多语言 | API | 便宜、够用 |

| text-embedding-3-large | 3072 | 多语言 | API | 效果更好、更贵 |

| bge-m3 | 1024 | 多语言 | 自建 | 开源、支持稠密+稀疏 |

| gte-large | 1024 | 中英 | 自建 | 中文表现好 |

| jina-embeddings-v3 | 1024 | 多语言 | API/自建 | 长文本友好 |

pythonCode
# 自建开源 embedding:pip install sentence-transformers
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("BAAI/bge-m3")
vectors = model.encode(["第一段文本", "第二段文本"], normalize_embeddings=True)
print(vectors.shape)   # (2, 1024)

Embedding 常见坑

维度越高不一定越好:大维度增加存储与检索成本,需按效果权衡。
归一化不一致:训练与检索时的归一化方式要一致,否则相似度失真。
中英混排:中文场景务必选中文表现好的模型,通用英文模型召回差。

📎 补充案例:多模型混合路由

某 SaaS 平台通过 LiteLLM 网关 + 语义缓存实现降本:

策略:简单意图分类用小模型(gpt-4o-mini),复杂推理才路由到大模型;相似查询走语义缓存。
成效:整体 LLM 成本下降约 55%;平均延迟下降 28%;因故障转移,可用性从 99.5% 提升到 99.95%。
经验:路由与缓存要配合评估体系,避免为省钱牺牲质量。

🗺️ 工具链落地路线图

从零搭建一套 AI 应用工程体系,建议分阶段推进,避免一次性引入过多组件导致复杂度失控。

阶段一:跑通闭环(第 1~2 周)

用托管 API(如 OpenAI)+ 一个应用框架(LangChain/LlamaIndex)快速做出原型。
用最简单的向量库(pgvector 或内存索引)验证 RAG 效果。
目标:先证明业务价值,不追求性能与成本。
pythonCode
# 最小可用 RAG:几十行跑通
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
docs = SimpleDirectoryReader("./docs").load_data()
index = VectorStoreIndex.from_documents(docs)
print(index.as_query_engine().query("核心问题是什么?"))

阶段二:建立度量(第 3~4 周)

接入可观测性(Langfuse)与评估(Ragas/DeepEval)。
构建有代表性的评估集,把「好不好」量化。
目标:每次改动都能对比,杜绝凭感觉迭代。

阶段三:优化性能与成本(第 2~3 月)

自建推理服务(vLLM/TGI)替换部分闭源调用。
引入语义缓存、模型网关、混合检索与重排序。
目标:在保证质量前提下大幅降本增效。

阶段四:规模化与治理(长期)

用编排器(Prefect/Dagster)管理数据与训练管线。
用实验管理(MLflow/W&B)与模型注册规范模型生命周期。
用安全护栏(NeMo Guardrails/Presidio)保障合规。
目标:从「能用」走向「可持续、可治理、可扩展」。

路线图速查表

| 阶段 | 周期 | 核心目标 | 关键工具 |

| --- | --- | --- | --- |

| 跑通闭环 | 1~2周 | 验证价值 | 托管API、LlamaIndex、pgvector |

| 建立度量 | 3~4周 | 质量量化 | Langfuse、Ragas、DeepEval |

| 优化降本 | 2~3月 | 性能成本 | vLLM、语义缓存、LiteLLM |

| 规模治理 | 长期 | 可持续 | Prefect、MLflow、NeMo Guardrails |

按此路线循序渐进,既能快速见效,又能稳步沉淀出成熟的 AI 工程能力,避免陷入「工具堆砌但落不了地」的常见困境。

AI开发工具生态系统正在快速发展,新的工具和技术不断涌现。选择合适的工具组合,建立高效的开发流程,是成功构建AI应用的关键。随着技术的进步,AI开发将变得更加便捷和高效。